From: Rémi Bernon rbernon@codeweavers.com
--- dlls/quartz/main.c | 2 ++ dlls/quartz/parser.c | 18 +++++++++++ dlls/quartz/quartz_private.h | 1 + dlls/quartz/quartz_strmif.idl | 7 +++++ dlls/quartz/regsvr.c | 33 ++++++++++++++++++++ dlls/winegstreamer/main.c | 28 ++--------------- dlls/winegstreamer/winegstreamer_classes.idl | 5 ++- 7 files changed, 65 insertions(+), 29 deletions(-)
diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index a6932d3210c..6564fb043e9 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -169,6 +169,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+ if (IsEqualGUID(rclsid, &CLSID_AviSplitter)) + return IClassFactory_QueryInterface(&avi_splitter_factory, riid, ppv); if (IsEqualGUID(rclsid, &CLSID_MPEG1Splitter)) return IClassFactory_QueryInterface(&mpeg1_splitter_factory, riid, ppv);
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index 3acb7e4e0ab..ad5a4843584 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -18,6 +18,24 @@
#include "quartz_private.h"
+static HRESULT WINAPI avi_splitter_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **out) +{ + static const GUID CLSID_wg_avi_splitter = {0x272bfbfb,0x50d0,0x4078,{0xb6,0x00,0x1e,0x95,0x9c,0x30,0x13,0x37}}; + return CoCreateInstance(&CLSID_wg_avi_splitter, outer, CLSCTX_INPROC_SERVER, riid, out); +} + +static const IClassFactoryVtbl avi_splitter_factory_vtbl = +{ + class_factory_QueryInterface, + class_factory_AddRef, + class_factory_Release, + avi_splitter_factory_CreateInstance, + class_factory_LockServer, +}; + +IClassFactory avi_splitter_factory = {&avi_splitter_factory_vtbl}; + static HRESULT WINAPI mpeg1_splitter_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **out) { diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index bc3204ed64f..38b72495ec2 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -48,6 +48,7 @@ #define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000) #define BYTES_FROM_MEDIATIME(time) ((time) / 10000000)
+extern IClassFactory avi_splitter_factory; extern IClassFactory mpeg1_splitter_factory;
HRESULT acm_wrapper_create(IUnknown *outer, IUnknown **out); diff --git a/dlls/quartz/quartz_strmif.idl b/dlls/quartz/quartz_strmif.idl index bca51a59b31..74158a7fe90 100644 --- a/dlls/quartz/quartz_strmif.idl +++ b/dlls/quartz/quartz_strmif.idl @@ -152,3 +152,10 @@ coclass AllocPresenter {} uuid(336475d0-942a-11ce-a870-00aa002feab5) ] coclass MPEG1Splitter {} + +[ + helpstring("AVI Splitter"), + threading(both), + uuid(1b544c20-fd0b-11ce-8c63-00aa0044b51e) +] +coclass AviSplitter {} diff --git a/dlls/quartz/regsvr.c b/dlls/quartz/regsvr.c index 3a27c83418e..9cd2e18ff7b 100644 --- a/dlls/quartz/regsvr.c +++ b/dlls/quartz/regsvr.c @@ -210,6 +210,34 @@ HRESULT WINAPI DllRegisterServer(void) .rgPins2 = mpeg_splitter_pins, };
+ static const REGPINTYPES avi_splitter_inputs[] = + { + {&MEDIATYPE_Stream, &MEDIASUBTYPE_Avi}, + }; + static const REGPINTYPES avi_splitter_outputs[] = + { + {&MEDIATYPE_Video, &GUID_NULL}, + }; + static const REGFILTERPINS2 avi_splitter_pins[] = + { + { + .nMediaTypes = ARRAY_SIZE(avi_splitter_inputs), + .lpMediaType = avi_splitter_inputs, + }, + { + .dwFlags = REG_PINFLAG_B_OUTPUT, + .nMediaTypes = ARRAY_SIZE(avi_splitter_outputs), + .lpMediaType = avi_splitter_outputs, + }, + }; + static const REGFILTER2 avi_splitter_reg = + { + .dwVersion = 2, + .dwMerit = MERIT_NORMAL, + .cPins2 = ARRAY_SIZE(avi_splitter_pins), + .rgPins2 = avi_splitter_pins, + }; + IFilterMapper2 *mapper; HRESULT hr;
@@ -240,6 +268,9 @@ HRESULT WINAPI DllRegisterServer(void) if (FAILED(hr = IFilterMapper2_RegisterFilter(mapper, &CLSID_ACMWrapper, L"ACM Wrapper", NULL, &CLSID_LegacyAmFilterCategory, NULL, &acm_wrapper_reg))) goto done; + if (FAILED(hr = IFilterMapper2_RegisterFilter(mapper, &CLSID_AviSplitter, L"AVI Splitter", NULL, + NULL, NULL, &avi_splitter_reg))) + goto done; if (FAILED(hr = IFilterMapper2_RegisterFilter(mapper, &CLSID_MPEG1Splitter, L"MPEG-I Stream Splitter", NULL, NULL, NULL, &mpeg_splitter_reg))) goto done; @@ -278,6 +309,8 @@ HRESULT WINAPI DllUnregisterServer(void) goto done; if (FAILED(hr = IFilterMapper2_UnregisterFilter(mapper, &CLSID_LegacyAmFilterCategory, NULL, &CLSID_ACMWrapper))) goto done; + if (FAILED(hr = IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_AviSplitter))) + goto done; if (FAILED(hr = IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_MPEG1Splitter))) goto done;
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index 6bc37e7e024..c95927cefb4 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -991,6 +991,7 @@ static struct class_factory mpeg4_sink_class_factory_cf = {{&class_factory_vtbl}
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) { + static const GUID CLSID_wg_avi_splitter = {0x272bfbfb,0x50d0,0x4078,{0xb6,0x00,0x1e,0x95,0x9c,0x30,0x13,0x37}}; static const GUID CLSID_wg_color_converter = {0xf47e2da5,0xe370,0x47b7,{0x90,0x3a,0x07,0x8d,0xdd,0x45,0xa5,0xcc}}; static const GUID CLSID_wg_mp3_sink_factory = {0x1f302877,0xaaab,0x40a3,{0xb9,0xe0,0x9f,0x48,0xda,0xf3,0x5b,0xc8}}; static const GUID CLSID_wg_mpeg4_sink_factory = {0x5d5407d9,0xc6ca,0x4770,{0xa7,0xcc,0x27,0xc0,0xcb,0x8a,0x76,0x27}}; @@ -1009,7 +1010,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) if (SUCCEEDED(hr = mfplat_get_class_object(clsid, iid, out))) return hr;
- if (IsEqualGUID(clsid, &CLSID_AviSplitter)) + if (IsEqualGUID(clsid, &CLSID_wg_avi_splitter)) factory = &avi_splitter_cf; else if (IsEqualGUID(clsid, &CLSID_decodebin_parser)) factory = &decodebin_parser_cf; @@ -1080,29 +1081,6 @@ 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};
-static const REGPINTYPES reg_avi_splitter_sink_mt = {&MEDIATYPE_Stream, &MEDIASUBTYPE_Avi}; - -static const REGFILTERPINS2 reg_avi_splitter_pins[2] = -{ - { - .nMediaTypes = 1, - .lpMediaType = ®_avi_splitter_sink_mt, - }, - { - .dwFlags = REG_PINFLAG_B_OUTPUT, - .nMediaTypes = 1, - .lpMediaType = ®_video_mt, - }, -}; - -static const REGFILTER2 reg_avi_splitter = -{ - .dwVersion = 2, - .dwMerit = MERIT_NORMAL, - .u.s2.cPins2 = 2, - .u.s2.rgPins2 = reg_avi_splitter_pins, -}; - static const REGPINTYPES reg_mpeg_audio_codec_sink_mts[3] = { {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Packet}, @@ -1267,7 +1245,6 @@ HRESULT WINAPI DllRegisterServer(void) &IID_IFilterMapper2, (void **)&mapper))) return hr;
- IFilterMapper2_RegisterFilter(mapper, &CLSID_AviSplitter, L"AVI Splitter", NULL, NULL, NULL, ®_avi_splitter); IFilterMapper2_RegisterFilter(mapper, &CLSID_decodebin_parser, L"GStreamer splitter filter", NULL, NULL, NULL, ®_decodebin_parser); IFilterMapper2_RegisterFilter(mapper, &CLSID_CMpegAudioCodec, @@ -1297,7 +1274,6 @@ HRESULT WINAPI DllUnregisterServer(void) &IID_IFilterMapper2, (void **)&mapper))) return hr;
- IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_AviSplitter); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_decodebin_parser); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_CMpegAudioCodec); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_CMpegVideoCodec); diff --git a/dlls/winegstreamer/winegstreamer_classes.idl b/dlls/winegstreamer/winegstreamer_classes.idl index 34170690de9..665cb9826c4 100644 --- a/dlls/winegstreamer/winegstreamer_classes.idl +++ b/dlls/winegstreamer/winegstreamer_classes.idl @@ -22,11 +22,10 @@ #pragma makedep register
[ - helpstring("AVI Splitter"), threading(both), - uuid(1b544c20-fd0b-11ce-8c63-00aa0044b51e) + uuid(272bfbfb-50d0-4078-b600-1e959c301337) ] -coclass AviSplitter {} +coclass wg_avi_splitter {}
[ helpstring("MPEG Audio Decoder"),