[PATCH 4/4] winegstreamer: Mark winegstreamer.so as NODELETE instead of pinning winegstreamer.dll.
Zebediah Figura
zfigura at codeweavers.com
Mon Oct 4 19:20:52 CDT 2021
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/winegstreamer/Makefile.in | 4 +++-
dlls/winegstreamer/gst_private.h | 2 --
dlls/winegstreamer/main.c | 26 --------------------------
dlls/winegstreamer/quartz_parser.c | 19 -------------------
4 files changed, 3 insertions(+), 48 deletions(-)
diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in
index e35df3cf3f9..95c2d885482 100644
--- a/dlls/winegstreamer/Makefile.in
+++ b/dlls/winegstreamer/Makefile.in
@@ -3,7 +3,9 @@ UNIXLIB = winegstreamer.so
IMPORTS = strmbase strmiids uuid ole32 mfuuid
DELAYIMPORTS = mfplat
EXTRAINCL = $(GSTREAMER_CFLAGS)
-EXTRALIBS = $(GSTREAMER_LIBS) $(PTHREAD_LIBS)
+# GLib pins some of its own libraries, and breaks if libraries that import it
+# try to initialize themselves after being unloaded.
+EXTRALIBS = $(GSTREAMER_LIBS) $(PTHREAD_LIBS) -Wl,-z,nodelete
C_SRCS = \
audioconvert.c \
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index ebe0bf6f50d..c141dd44921 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -98,8 +98,6 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN
HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
-BOOL init_gstreamer(void) DECLSPEC_HIDDEN;
-
extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN;
extern HRESULT mfplat_DllRegisterServer(void) DECLSPEC_HIDDEN;
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
index c799aa06d1b..6b2b70f9c60 100644
--- a/dlls/winegstreamer/main.c
+++ b/dlls/winegstreamer/main.c
@@ -318,9 +318,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
TRACE("clsid %s, iid %s, out %p.\n", debugstr_guid(clsid), debugstr_guid(iid), out);
- if (!init_gstreamer())
- return CLASS_E_CLASSNOTAVAILABLE;
-
if (SUCCEEDED(hr = mfplat_get_class_object(clsid, iid, out)))
return hr;
@@ -341,29 +338,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out)
return IClassFactory_QueryInterface(&factory->IClassFactory_iface, iid, out);
}
-static BOOL CALLBACK init_gstreamer_proc(INIT_ONCE *once, void *param, void **ctx)
-{
- HINSTANCE handle;
-
- /* Unloading glib is a bad idea.. it installs atexit handlers,
- * so never unload the dll after loading */
- GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN,
- (LPCWSTR)init_gstreamer_proc, &handle);
- if (!handle)
- ERR("Failed to pin module.\n");
-
- return TRUE;
-}
-
-BOOL init_gstreamer(void)
-{
- static INIT_ONCE once = INIT_ONCE_STATIC_INIT;
-
- InitOnceExecuteOnce(&once, init_gstreamer_proc, NULL, NULL);
-
- return TRUE;
-}
-
static const REGPINTYPES reg_audio_mt = {&MEDIATYPE_Audio, &GUID_NULL};
static const REGPINTYPES reg_stream_mt = {&MEDIATYPE_Stream, &GUID_NULL};
static const REGPINTYPES reg_video_mt = {&MEDIATYPE_Video, &GUID_NULL};
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 6ae1a99a14a..d6a58801f51 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -1098,20 +1098,10 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin,
return VFW_S_NO_MORE_ITEMS;
}
-static BOOL parser_init_gstreamer(void)
-{
- if (!init_gstreamer())
- return FALSE;
- return TRUE;
-}
-
HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
{
struct parser *object;
- if (!parser_init_gstreamer())
- return E_FAIL;
-
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1634,9 +1624,6 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
{
struct parser *object;
- if (!parser_init_gstreamer())
- return E_FAIL;
-
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1720,9 +1707,6 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
{
struct parser *object;
- if (!parser_init_gstreamer())
- return E_FAIL;
-
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1827,9 +1811,6 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
{
struct parser *object;
- if (!parser_init_gstreamer())
- return E_FAIL;
-
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
--
2.33.0
More information about the wine-devel
mailing list