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 | 35 ++++++++++++++++++++ dlls/winegstreamer/main.c | 32 ++---------------- dlls/winegstreamer/winegstreamer_classes.idl | 5 ++- 7 files changed, 67 insertions(+), 33 deletions(-)
diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index 6564fb043e9..2a14bf375ed 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -173,6 +173,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return IClassFactory_QueryInterface(&avi_splitter_factory, riid, ppv); if (IsEqualGUID(rclsid, &CLSID_MPEG1Splitter)) return IClassFactory_QueryInterface(&mpeg1_splitter_factory, riid, ppv); + if (IsEqualGUID(rclsid, &CLSID_WAVEParser)) + return IClassFactory_QueryInterface(&wave_parser_factory, riid, ppv);
if (IsEqualGUID( &IID_IClassFactory, riid ) || IsEqualGUID( &IID_IUnknown, riid)) { diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index ad5a4843584..f515ddfa35b 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -53,3 +53,21 @@ static const IClassFactoryVtbl mpeg1_splitter_factory_vtbl = };
IClassFactory mpeg1_splitter_factory = {&mpeg1_splitter_factory_vtbl}; + +static HRESULT WINAPI wave_parser_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **out) +{ + static const GUID CLSID_wg_wave_parser = {0x3f839ec7,0x5ea6,0x49e1,{0x80,0xc2,0x1e,0xa3,0x00,0xf8,0xb0,0xe0}}; + return CoCreateInstance(&CLSID_wg_wave_parser, outer, CLSCTX_INPROC_SERVER, riid, out); +} + +static const IClassFactoryVtbl wave_parser_factory_vtbl = +{ + class_factory_QueryInterface, + class_factory_AddRef, + class_factory_Release, + wave_parser_factory_CreateInstance, + class_factory_LockServer, +}; + +IClassFactory wave_parser_factory = {&wave_parser_factory_vtbl}; diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index 38b72495ec2..f460b2d1132 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -50,6 +50,7 @@
extern IClassFactory avi_splitter_factory; extern IClassFactory mpeg1_splitter_factory; +extern IClassFactory wave_parser_factory;
HRESULT acm_wrapper_create(IUnknown *outer, IUnknown **out); HRESULT avi_dec_create(IUnknown *outer, IUnknown **out); diff --git a/dlls/quartz/quartz_strmif.idl b/dlls/quartz/quartz_strmif.idl index 74158a7fe90..4ea198c5ea0 100644 --- a/dlls/quartz/quartz_strmif.idl +++ b/dlls/quartz/quartz_strmif.idl @@ -159,3 +159,10 @@ coclass MPEG1Splitter {} uuid(1b544c20-fd0b-11ce-8c63-00aa0044b51e) ] coclass AviSplitter {} + +[ + helpstring("Wave Parser"), + threading(both), + uuid(d51bd5a1-7548-11cf-a520-0080c77ef58a) +] +coclass WAVEParser {} diff --git a/dlls/quartz/regsvr.c b/dlls/quartz/regsvr.c index 9cd2e18ff7b..6f354404adc 100644 --- a/dlls/quartz/regsvr.c +++ b/dlls/quartz/regsvr.c @@ -238,6 +238,36 @@ HRESULT WINAPI DllRegisterServer(void) .rgPins2 = avi_splitter_pins, };
+ static const REGPINTYPES wave_parser_inputs[] = + { + {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE}, + {&MEDIATYPE_Stream, &MEDIASUBTYPE_AU}, + {&MEDIATYPE_Stream, &MEDIASUBTYPE_AIFF}, + }; + static const REGPINTYPES wave_parser_outputs[] = + { + {&MEDIATYPE_Audio, &GUID_NULL}, + }; + static const REGFILTERPINS2 wave_parser_pins[] = + { + { + .nMediaTypes = ARRAY_SIZE(wave_parser_inputs), + .lpMediaType = wave_parser_inputs, + }, + { + .dwFlags = REG_PINFLAG_B_OUTPUT, + .nMediaTypes = ARRAY_SIZE(wave_parser_outputs), + .lpMediaType = wave_parser_outputs, + }, + }; + static const REGFILTER2 wave_parser_reg = + { + .dwVersion = 2, + .dwMerit = MERIT_UNLIKELY, + .cPins2 = ARRAY_SIZE(wave_parser_pins), + .rgPins2 = wave_parser_pins, + }; + IFilterMapper2 *mapper; HRESULT hr;
@@ -274,6 +304,9 @@ HRESULT WINAPI DllRegisterServer(void) if (FAILED(hr = IFilterMapper2_RegisterFilter(mapper, &CLSID_MPEG1Splitter, L"MPEG-I Stream Splitter", NULL, NULL, NULL, &mpeg_splitter_reg))) goto done; + if (FAILED(hr = IFilterMapper2_RegisterFilter(mapper, &CLSID_WAVEParser, L"Wave Parser", NULL, + NULL, NULL, &wave_parser_reg))) + goto done;
done: IFilterMapper2_Release(mapper); @@ -313,6 +346,8 @@ HRESULT WINAPI DllUnregisterServer(void) goto done; if (FAILED(hr = IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_MPEG1Splitter))) goto done; + if (FAILED(hr = IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_WAVEParser))) + goto done;
done: IFilterMapper2_Release(mapper); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index c95927cefb4..33cd3439f62 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -999,6 +999,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) static const GUID CLSID_wg_wma_decoder = {0x5b4d4e54,0x0620,0x4cf9,{0x94,0xae,0x78,0x23,0x96,0x5c,0x28,0xb6}}; static const GUID CLSID_wg_wmv_decoder = {0x62ee5ddb,0x4f52,0x48e2,{0x89,0x28,0x78,0x7b,0x02,0x53,0xa0,0xbc}}; static const GUID CLSID_wg_mpeg1_splitter = {0xa8edbf98,0x2442,0x42c5,{0x85,0xa1,0xab,0x05,0xa5,0x80,0xdf,0x53}}; + static const GUID CLSID_wg_wave_parser = {0x3f839ec7,0x5ea6,0x49e1,{0x80,0xc2,0x1e,0xa3,0x00,0xf8,0xb0,0xe0}}; struct class_factory *factory; HRESULT hr;
@@ -1022,7 +1023,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, void **out) factory = &mpeg_layer3_decoder_cf; else if (IsEqualGUID(clsid, &CLSID_wg_mpeg1_splitter)) factory = &mpeg_splitter_cf; - else if (IsEqualGUID(clsid, &CLSID_WAVEParser)) + else if (IsEqualGUID(clsid, &CLSID_wg_wave_parser)) factory = &wave_parser_cf; else if (IsEqualGUID(clsid, &CLSID_wg_wma_decoder)) factory = &wma_decoder_cf; @@ -1177,33 +1178,6 @@ static const REGFILTER2 reg_mpeg_layer3_decoder = .u.s2.rgPins2 = reg_mpeg_layer3_decoder_pins, };
-static const REGPINTYPES reg_wave_parser_sink_mts[3] = -{ - {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE}, - {&MEDIATYPE_Stream, &MEDIASUBTYPE_AU}, - {&MEDIATYPE_Stream, &MEDIASUBTYPE_AIFF}, -}; - -static const REGFILTERPINS2 reg_wave_parser_pins[2] = -{ - { - .nMediaTypes = 3, - .lpMediaType = reg_wave_parser_sink_mts, - }, - { - .dwFlags = REG_PINFLAG_B_OUTPUT, - .nMediaTypes = 1, - .lpMediaType = ®_audio_mt, - }, -}; - -static const REGFILTER2 reg_wave_parser = -{ - .dwVersion = 2, - .dwMerit = MERIT_UNLIKELY, - .u.s2.cPins2 = 2, - .u.s2.rgPins2 = reg_wave_parser_pins, -};
static const REGFILTERPINS2 reg_decodebin_parser_pins[3] = { @@ -1253,7 +1227,6 @@ HRESULT WINAPI DllRegisterServer(void) L"MPEG Video Decoder", NULL, NULL, NULL, ®_mpeg_video_codec); IFilterMapper2_RegisterFilter(mapper, &CLSID_mpeg_layer3_decoder, L"MPEG Layer-3 Decoder", NULL, NULL, NULL, ®_mpeg_layer3_decoder); - IFilterMapper2_RegisterFilter(mapper, &CLSID_WAVEParser, L"Wave Parser", NULL, NULL, NULL, ®_wave_parser);
IFilterMapper2_Release(mapper);
@@ -1278,7 +1251,6 @@ HRESULT WINAPI DllUnregisterServer(void) IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_CMpegAudioCodec); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_CMpegVideoCodec); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_mpeg_layer3_decoder); - IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_WAVEParser);
IFilterMapper2_Release(mapper);
diff --git a/dlls/winegstreamer/winegstreamer_classes.idl b/dlls/winegstreamer/winegstreamer_classes.idl index 665cb9826c4..f34cf998288 100644 --- a/dlls/winegstreamer/winegstreamer_classes.idl +++ b/dlls/winegstreamer/winegstreamer_classes.idl @@ -55,11 +55,10 @@ coclass mpeg_layer3_decoder {} coclass wg_mpeg1_splitter {}
[ - helpstring("Wave Parser"), threading(both), - uuid(d51bd5a1-7548-11cf-a520-0080c77ef58a) + uuid(3f839ec7-5ea6-49e1-80c2-1ea300f8b0e0) ] -coclass WAVEParser {} +coclass wg_wave_parser {}
[ helpstring("GStreamer parser using decodebin"),