From: Rémi Bernon rbernon@codeweavers.com
--- dlls/quartz/main.c | 34 ++++++++++++++++++++ dlls/quartz/parser.c | 6 ++++ dlls/quartz/quartz_private.h | 3 +- dlls/quartz/quartz_strmif.idl | 7 ++++ dlls/winegstreamer/main.c | 28 ++-------------- dlls/winegstreamer/winegstreamer_classes.idl | 5 ++- 6 files changed, 53 insertions(+), 30 deletions(-)
diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index c05b849835e..747c80378e9 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -65,6 +65,7 @@ static const struct object_creation_info object_creation[] = { &CLSID_AsyncReader, async_reader_create }, { &CLSID_AudioRender, dsound_render_create }, { &CLSID_AVIDec, avi_dec_create }, + { &CLSID_AviSplitter, avi_splitter_create }, { &CLSID_DSoundRender, dsound_render_create }, { &CLSID_FilterGraph, filter_graph_create }, { &CLSID_FilterGraphNoThread, filter_graph_no_thread_create }, @@ -364,6 +365,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;
@@ -394,6 +423,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; @@ -432,6 +464,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/quartz/parser.c b/dlls/quartz/parser.c index b4ef9e00c01..32ba5d0041a 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -18,6 +18,12 @@
#include "quartz_private.h"
+HRESULT avi_splitter_create(IUnknown *outer, IUnknown **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, &IID_IUnknown, (void **)out); +} + HRESULT mpeg1_splitter_create(IUnknown *outer, IUnknown **out) { static const GUID CLSID_wg_mpeg1_splitter = {0xa8edbf98,0x2442,0x42c5,{0x85,0xa1,0xab,0x05,0xa5,0x80,0xdf,0x53}}; diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index c307b493fc0..449db400131 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -49,8 +49,9 @@ #define BYTES_FROM_MEDIATIME(time) ((time) / 10000000)
HRESULT acm_wrapper_create(IUnknown *outer, IUnknown **out); -HRESULT avi_dec_create(IUnknown *outer, IUnknown **out); HRESULT async_reader_create(IUnknown *outer, IUnknown **out); +HRESULT avi_dec_create(IUnknown *outer, IUnknown **out); +HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out); HRESULT dsound_render_create(IUnknown *outer, IUnknown **out); HRESULT filter_graph_create(IUnknown *outer, IUnknown **out); HRESULT filter_graph_no_thread_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/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"),