Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 7ae70d0a736..88310668540 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -57,7 +57,8 @@ struct gstdemux struct strmbase_sink sink; IAsyncReader *reader; IMemAllocator *alloc; - struct gstdemux_source **ppPins; + + struct gstdemux_source **sources; LONG cStreams;
LONGLONG filesize; @@ -842,7 +843,7 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) TRACE("%p %p %p\n", This, bin, pad);
for (x = 0; x < This->cStreams; ++x) { - if (This->ppPins[x]->their_src == pad) + if (This->sources[x]->their_src == pad) break; } if (x == This->cStreams) @@ -853,7 +854,7 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) return; }
- pin = This->ppPins[x]; + pin = This->sources[x];
if(pin->flipfilter) gst_pad_unlink(pin->their_src, pin->flip_sink); @@ -994,7 +995,7 @@ static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) }
for (x = 0; x < This->cStreams; ++x) { - struct gstdemux_source *pin = This->ppPins[x]; + struct gstdemux_source *pin = This->sources[x]; if (!pin->their_src) { gst_segment_init(pin->segment, GST_FORMAT_TIME);
@@ -1215,7 +1216,7 @@ static struct strmbase_pin *gstdemux_get_pin(struct strmbase_filter *base, unsig if (!index) return &filter->sink.pin; else if (index <= filter->cStreams) - return &filter->ppPins[index - 1]->pin.pin; + return &filter->sources[index - 1]->pin.pin; return NULL; }
@@ -1280,7 +1281,7 @@ static HRESULT gstdemux_init_stream(struct strmbase_filter *iface)
for (i = 0; i < filter->cStreams; ++i) { - if (SUCCEEDED(pin_hr = BaseOutputPinImpl_Active(&filter->ppPins[i]->pin))) + if (SUCCEEDED(pin_hr = BaseOutputPinImpl_Active(&filter->sources[i]->pin))) hr = pin_hr; } return hr; @@ -1496,10 +1497,10 @@ static BOOL gstdecoder_init_gst(struct gstdemux *filter)
WaitForSingleObject(filter->no_more_pads_event, INFINITE);
- gst_pad_query_duration(filter->ppPins[0]->their_src, GST_FORMAT_TIME, &duration); + gst_pad_query_duration(filter->sources[0]->their_src, GST_FORMAT_TIME, &duration); for (i = 0; i < filter->cStreams; ++i) { - struct gstdemux_source *pin = filter->ppPins[i]; + struct gstdemux_source *pin = filter->sources[i]; const HANDLE events[2] = {pin->caps_event, filter->error_event};
pin->seek.llDuration = pin->seek.llStop = duration / 100; @@ -1947,9 +1948,9 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR * struct gstdemux_source *pin, **new_array; char pad_name[19];
- if (!(new_array = heap_realloc(filter->ppPins, (filter->cStreams + 1) * sizeof(*new_array)))) + if (!(new_array = heap_realloc(filter->sources, (filter->cStreams + 1) * sizeof(*new_array)))) return NULL; - filter->ppPins = new_array; + filter->sources = new_array;
if (!(pin = heap_alloc_zero(sizeof(*pin)))) return NULL; @@ -1970,7 +1971,7 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR * gst_pad_set_event_function(pin->my_sink, event_sink_wrapper); gst_pad_set_query_function(pin->my_sink, query_sink_wrapper);
- filter->ppPins[filter->cStreams++] = pin; + filter->sources[filter->cStreams++] = pin; return pin; }
@@ -1990,11 +1991,11 @@ static HRESULT GST_RemoveOutputPins(struct gstdemux *This) This->my_src = This->their_sink = NULL;
for (i = 0; i < This->cStreams; ++i) - free_source_pin(This->ppPins[i]); + free_source_pin(This->sources[i]);
This->cStreams = 0; - heap_free(This->ppPins); - This->ppPins = NULL; + heap_free(This->sources); + This->sources = NULL; gst_element_set_bus(This->container, NULL); gst_object_unref(This->container); This->container = NULL; @@ -2317,10 +2318,10 @@ static BOOL avi_splitter_init_gst(struct gstdemux *filter)
WaitForSingleObject(filter->no_more_pads_event, INFINITE);
- gst_pad_query_duration(filter->ppPins[0]->their_src, GST_FORMAT_TIME, &duration); + gst_pad_query_duration(filter->sources[0]->their_src, GST_FORMAT_TIME, &duration); for (i = 0; i < filter->cStreams; ++i) { - struct gstdemux_source *pin = filter->ppPins[i]; + struct gstdemux_source *pin = filter->sources[i]; const HANDLE events[2] = {pin->caps_event, filter->error_event};
pin->seek.llDuration = pin->seek.llStop = duration / 100;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 73 ++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 36 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 88310668540..350e50e359e 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -59,7 +59,7 @@ struct gstdemux IMemAllocator *alloc;
struct gstdemux_source **sources; - LONG cStreams; + unsigned int source_count;
LONGLONG filesize;
@@ -836,33 +836,32 @@ static DWORD CALLBACK push_data_init(LPVOID iface)
static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) { - struct gstdemux *This = user; - int x; - struct gstdemux_source *pin; + struct gstdemux *filter = user; + unsigned int i; + char *name;
- TRACE("%p %p %p\n", This, bin, pad); + TRACE("filter %p, bin %p, pad %p.\n", filter, bin, pad);
- for (x = 0; x < This->cStreams; ++x) { - if (This->sources[x]->their_src == pad) - break; - } - if (x == This->cStreams) + for (i = 0; i < filter->source_count; ++i) { - char *name = gst_pad_get_name(pad); - WARN("No pin matching pad %s found.\n", debugstr_a(name)); - g_free(name); - return; - } + struct gstdemux_source *pin = filter->sources[i];
- pin = This->sources[x]; + if (pin->their_src == pad) + { + if(pin->flipfilter) + gst_pad_unlink(pin->their_src, pin->flip_sink); + else + gst_pad_unlink(pin->their_src, pin->my_sink);
- if(pin->flipfilter) - gst_pad_unlink(pin->their_src, pin->flip_sink); - else - gst_pad_unlink(pin->their_src, pin->my_sink); + gst_object_unref(pin->their_src); + pin->their_src = NULL; + return; + } + }
- gst_object_unref(pin->their_src); - pin->their_src = NULL; + name = gst_pad_get_name(pad); + WARN("No pin matching pad %s found.\n", debugstr_a(name)); + g_free(name); }
static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct gstdemux *This) @@ -878,7 +877,7 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct gstdemux *
TRACE("%p %p %p\n", This, bin, pad);
- sprintfW(nameW, formatW, This->cStreams); + sprintfW(nameW, formatW, This->source_count);
name = gst_pad_get_name(pad); TRACE("Name: %s\n", name); @@ -981,7 +980,8 @@ exit: static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) { struct gstdemux *This = user; - int x, ret; + unsigned int i; + int ret;
TRACE("%p %p %p\n", This, bin, pad);
@@ -994,8 +994,9 @@ static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) return; }
- for (x = 0; x < This->cStreams; ++x) { - struct gstdemux_source *pin = This->sources[x]; + for (i = 0; i < This->source_count; ++i) + { + struct gstdemux_source *pin = This->sources[i]; if (!pin->their_src) { gst_segment_init(pin->segment, GST_FORMAT_TIME);
@@ -1215,7 +1216,7 @@ static struct strmbase_pin *gstdemux_get_pin(struct strmbase_filter *base, unsig
if (!index) return &filter->sink.pin; - else if (index <= filter->cStreams) + else if (index <= filter->source_count) return &filter->sources[index - 1]->pin.pin; return NULL; } @@ -1279,7 +1280,7 @@ static HRESULT gstdemux_init_stream(struct strmbase_filter *iface) if (filter->no_more_pads_event) WaitForSingleObject(filter->no_more_pads_event, INFINITE);
- for (i = 0; i < filter->cStreams; ++i) + for (i = 0; i < filter->source_count; ++i) { if (SUCCEEDED(pin_hr = BaseOutputPinImpl_Active(&filter->sources[i]->pin))) hr = pin_hr; @@ -1498,7 +1499,7 @@ static BOOL gstdecoder_init_gst(struct gstdemux *filter) WaitForSingleObject(filter->no_more_pads_event, INFINITE);
gst_pad_query_duration(filter->sources[0]->their_src, GST_FORMAT_TIME, &duration); - for (i = 0; i < filter->cStreams; ++i) + for (i = 0; i < filter->source_count; ++i) { struct gstdemux_source *pin = filter->sources[i]; const HANDLE events[2] = {pin->caps_event, filter->error_event}; @@ -1948,7 +1949,7 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR * struct gstdemux_source *pin, **new_array; char pad_name[19];
- if (!(new_array = heap_realloc(filter->sources, (filter->cStreams + 1) * sizeof(*new_array)))) + if (!(new_array = heap_realloc(filter->sources, (filter->source_count + 1) * sizeof(*new_array)))) return NULL; filter->sources = new_array;
@@ -1964,20 +1965,20 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR * GST_ChangeCurrent, GST_ChangeRate); BaseFilterImpl_IncrementPinVersion(&filter->filter);
- sprintf(pad_name, "qz_sink_%u", filter->cStreams); + sprintf(pad_name, "qz_sink_%u", filter->source_count); pin->my_sink = gst_pad_new(pad_name, GST_PAD_SINK); gst_pad_set_element_private(pin->my_sink, pin); gst_pad_set_chain_function(pin->my_sink, got_data_sink_wrapper); gst_pad_set_event_function(pin->my_sink, event_sink_wrapper); gst_pad_set_query_function(pin->my_sink, query_sink_wrapper);
- filter->sources[filter->cStreams++] = pin; + filter->sources[filter->source_count++] = pin; return pin; }
static HRESULT GST_RemoveOutputPins(struct gstdemux *This) { - ULONG i; + unsigned int i;
TRACE("(%p)\n", This); mark_wine_thread(); @@ -1990,10 +1991,10 @@ static HRESULT GST_RemoveOutputPins(struct gstdemux *This) gst_object_unref(This->their_sink); This->my_src = This->their_sink = NULL;
- for (i = 0; i < This->cStreams; ++i) + for (i = 0; i < This->source_count; ++i) free_source_pin(This->sources[i]);
- This->cStreams = 0; + This->source_count = 0; heap_free(This->sources); This->sources = NULL; gst_element_set_bus(This->container, NULL); @@ -2319,7 +2320,7 @@ static BOOL avi_splitter_init_gst(struct gstdemux *filter) WaitForSingleObject(filter->no_more_pads_event, INFINITE);
gst_pad_query_duration(filter->sources[0]->their_src, GST_FORMAT_TIME, &duration); - for (i = 0; i < filter->cStreams; ++i) + for (i = 0; i < filter->source_count; ++i) { struct gstdemux_source *pin = filter->sources[i]; const HANDLE events[2] = {pin->caps_event, filter->error_event};
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/avisplit.c | 2 -- dlls/quartz/tests/waveparser.c | 2 -- dlls/winegstreamer/gstdemux.c | 20 ++++++++++++++++---- 3 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c index 91f43e9790c..0f5302c7d3c 100644 --- a/dlls/quartz/tests/avisplit.c +++ b/dlls/quartz/tests/avisplit.c @@ -427,7 +427,6 @@ static void test_find_pin(void)
hr = IBaseFilter_FindPin(filter, L"Stream 00", &pin); ok(hr == S_OK, "Got hr %#x.\n", hr); -todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); @@ -437,7 +436,6 @@ todo_wine
hr = IBaseFilter_FindPin(filter, L"input pin", &pin); ok(hr == S_OK, "Got hr %#x.\n", hr); -todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index 39e0b52d4b7..b1980c5ea50 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -421,7 +421,6 @@ static void test_find_pin(void)
hr = IBaseFilter_FindPin(filter, L"output", &pin); ok(hr == S_OK, "Got hr %#x.\n", hr); -todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); @@ -431,7 +430,6 @@ todo_wine
hr = IBaseFilter_FindPin(filter, L"input pin", &pin); ok(hr == S_OK, "Got hr %#x.\n", hr); -todo_wine ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 350e50e359e..901ed80dfeb 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -60,6 +60,7 @@ struct gstdemux
struct gstdemux_source **sources; unsigned int source_count; + BOOL enum_sink_first;
LONGLONG filesize;
@@ -1214,10 +1215,20 @@ static struct strmbase_pin *gstdemux_get_pin(struct strmbase_filter *base, unsig { struct gstdemux *filter = impl_from_strmbase_filter(base);
- if (!index) - return &filter->sink.pin; - else if (index <= filter->source_count) - return &filter->sources[index - 1]->pin.pin; + if (filter->enum_sink_first) + { + if (!index) + return &filter->sink.pin; + else if (index <= filter->source_count) + return &filter->sources[index - 1]->pin.pin; + } + else + { + if (index < filter->source_count) + return &filter->sources[index]->pin.pin; + else if (index == filter->source_count) + return &filter->sink.pin; + } return NULL; }
@@ -2510,6 +2521,7 @@ IUnknown * CALLBACK mpeg_splitter_create(IUnknown *outer, HRESULT *phr) object->duration_event = CreateEventW(NULL, FALSE, FALSE, NULL); object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL); object->init_gst = mpeg_splitter_init_gst; + object->enum_sink_first = TRUE; *phr = S_OK;
TRACE("Created MPEG-1 splitter %p.\n", object);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/avisplit.c | 33 +++++++++++++++++++-- dlls/quartz/tests/mpegsplit.c | 53 ++++++++++++++++++++++++++++------ dlls/quartz/tests/waveparser.c | 16 ++++++++++ 3 files changed, 91 insertions(+), 11 deletions(-)
diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c index 0f5302c7d3c..befcac404c9 100644 --- a/dlls/quartz/tests/avisplit.c +++ b/dlls/quartz/tests/avisplit.c @@ -526,14 +526,21 @@ static void test_media_types(void) { static const VIDEOINFOHEADER expect_vih = { - {0}, {0}, 0, 0, 1000 * 10000, - {sizeof(BITMAPINFOHEADER), 32, 24, 1, 12, mmioFOURCC('I','4','2','0'), 32*24*12/8} + .AvgTimePerFrame = 1000 * 10000, + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biWidth = 32, + .bmiHeader.biHeight = 24, + .bmiHeader.biPlanes = 1, + .bmiHeader.biBitCount = 12, + .bmiHeader.biCompression = mmioFOURCC('I','4','2','0'), + .bmiHeader.biSizeImage = 32 * 24 * 12 / 8, };
const WCHAR *filename = load_resource(L"test.avi"); IBaseFilter *filter = create_avi_splitter(); AM_MEDIA_TYPE mt = {{0}}, *pmt; IEnumMediaTypes *enummt; + VIDEOINFOHEADER *vih; IFilterGraph2 *graph; HRESULT hr; ULONG ref; @@ -630,6 +637,28 @@ static void test_media_types(void) todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_VideoInfo;
+ vih = (VIDEOINFOHEADER *)pmt->pbFormat; + + vih->AvgTimePerFrame = 10000; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + vih->AvgTimePerFrame = 1000 * 10000; + + vih->dwBitRate = 1000000; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + vih->dwBitRate = 0; + + SetRect(&vih->rcSource, 0, 0, 32, 24); + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + SetRect(&vih->rcSource, 0, 0, 0, 0); + + vih->bmiHeader.biCompression = BI_RGB; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + vih->bmiHeader.biCompression = mmioFOURCC('I','4','2','0'); + CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt);
diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 06c8cdaeb6f..627f4f21efd 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -529,7 +529,9 @@ static void test_media_types(void) const WCHAR *filename = load_resource(L"test.mp3"); AM_MEDIA_TYPE mt = {{0}}, *pmt, expect_mt = {{0}}; IBaseFilter *filter = create_mpeg_splitter(); + MPEGLAYER3WAVEFORMAT *mp3wfx; IEnumMediaTypes *enummt; + MPEG1WAVEFORMAT *wfx; IFilterGraph2 *graph; HRESULT hr; ULONG ref; @@ -595,41 +597,47 @@ static void test_media_types(void) mt.subtype = MEDIASUBTYPE_MPEG1Video; hr = IPin_QueryAccept(pin, &mt); todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - mt.subtype = MEDIASUBTYPE_MPEG1VideoCD; hr = IPin_QueryAccept(pin, &mt); todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - mt.subtype = MEDIASUBTYPE_MPEG1System; hr = IPin_QueryAccept(pin, &mt); todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_FALSE, "Got hr %#x.\n", hr); - mt.subtype = MEDIASUBTYPE_MPEG1Payload; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_FALSE, "Got hr %#x.\n", hr); - mt.subtype = MEDIASUBTYPE_MPEG1Packet; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_FALSE, "Got hr %#x.\n", hr); - mt.subtype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mt.subtype = MEDIASUBTYPE_MPEG1Audio;
mt.majortype = MEDIATYPE_Audio; - mt.subtype = MEDIASUBTYPE_MPEG1Audio; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_FALSE, "Got hr %#x.\n", hr); - + mt.majortype = GUID_NULL; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; + + mt.formattype = FORMAT_None; + hr = IPin_QueryAccept(pin, &mt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mt.formattype = FORMAT_VideoInfo; + hr = IPin_QueryAccept(pin, &mt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mt.formattype = FORMAT_WaveFormatEx; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; - mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(pin, &mt); ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -688,6 +696,9 @@ static void test_media_types(void) pmt->majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, pmt); todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + pmt->majortype = GUID_NULL; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Audio;
pmt->subtype = MEDIASUBTYPE_MPEG1Audio; @@ -709,6 +720,18 @@ static void test_media_types(void) todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_WaveFormatEx;
+ wfx = (MPEG1WAVEFORMAT *)pmt->pbFormat; + + wfx->fwHeadLayer = ACM_MPEG_LAYER2; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + wfx->fwHeadLayer = ACM_MPEG_LAYER3; + + wfx->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + wfx->wfx.wFormatTag = WAVE_FORMAT_MPEG; + CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt);
@@ -786,6 +809,18 @@ static void test_media_types(void) ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_WaveFormatEx;
+ mp3wfx = (MPEGLAYER3WAVEFORMAT *)pmt->pbFormat; + + mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF; + hr = IPin_QueryAccept(pin, pmt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; + + mp3wfx->wfx.wFormatTag = WAVE_FORMAT_MPEG; + hr = IPin_QueryAccept(pin, pmt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + mp3wfx->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt);
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index b1980c5ea50..5c09f6d1219 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -20,6 +20,7 @@
#define COBJMACROS #include "dshow.h" +#include "mmreg.h" #include "wine/test.h"
static IBaseFilter *create_wave_parser(void) @@ -525,6 +526,7 @@ static void test_media_types(void) AM_MEDIA_TYPE mt = {{0}}, *pmt; IEnumMediaTypes *enummt; IFilterGraph2 *graph; + WAVEFORMATEX *wfx; HRESULT hr; ULONG ref; IPin *pin; @@ -619,6 +621,20 @@ static void test_media_types(void) hr = IPin_QueryAccept(pin, pmt); todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ wfx = (WAVEFORMATEX *)pmt->pbFormat; + + wfx->nChannels = wfx->nBlockAlign = 2; + wfx->nAvgBytesPerSec = 44100 * 2; + wfx->nBlockAlign = 2; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + *wfx = expect_wfx; + + wfx->wFormatTag = WAVE_FORMAT_IMA_ADPCM; + hr = IPin_QueryAccept(pin, pmt); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + *wfx = expect_wfx; + CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/waveparser.c | 12 +++++----- dlls/winegstreamer/gstdemux.c | 41 +++++++++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index 5c09f6d1219..61ba2018e4e 100644 --- a/dlls/quartz/tests/waveparser.c +++ b/dlls/quartz/tests/waveparser.c @@ -606,20 +606,20 @@ static void test_media_types(void)
pmt->majortype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Audio;
pmt->subtype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_WAVE;
pmt->formattype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_None; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr);
wfx = (WAVEFORMATEX *)pmt->pbFormat;
@@ -627,12 +627,12 @@ static void test_media_types(void) wfx->nAvgBytesPerSec = 44100 * 2; wfx->nBlockAlign = 2; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); *wfx = expect_wfx;
wfx->wFormatTag = WAVE_FORMAT_IMA_ADPCM; hr = IPin_QueryAccept(pin, pmt); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); *wfx = expect_wfx;
CoTaskMemFree(pmt->pbFormat); diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 901ed80dfeb..dadad69beb7 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -75,6 +75,7 @@ struct gstdemux HANDLE push_thread;
BOOL (*init_gst)(struct gstdemux *filter); + HRESULT (*source_query_accept)(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt); };
struct gstdemux_source @@ -1531,6 +1532,11 @@ static BOOL gstdecoder_init_gst(struct gstdemux *filter) return TRUE; }
+static HRESULT gstdecoder_source_query_accept(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt) +{ + return S_OK; +} + IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr) { struct gstdemux *object; @@ -1555,6 +1561,7 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr) object->no_more_pads_event = CreateEventW(NULL, FALSE, FALSE, NULL); object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL); object->init_gst = gstdecoder_init_gst; + object->source_query_accept = gstdecoder_source_query_accept; *phr = S_OK;
TRACE("Created GStreamer demuxer %p.\n", object); @@ -1859,10 +1866,11 @@ static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, vo return S_OK; }
-static HRESULT source_query_accept(struct strmbase_pin *base, const AM_MEDIA_TYPE *amt) +static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) { - FIXME("(%p) stub\n", base); - return S_OK; + struct gstdemux_source *pin = impl_source_from_IPin(&iface->IPin_iface); + struct gstdemux *filter = impl_from_strmbase_filter(iface->filter); + return filter->source_query_accept(pin, mt); }
static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int iPosition, AM_MEDIA_TYPE *pmt) @@ -2164,6 +2172,15 @@ void start_dispatch_thread(void) CloseHandle(CreateThread(NULL, 0, &dispatch_thread, NULL, 0, NULL)); }
+static BOOL compare_media_types(const AM_MEDIA_TYPE *a, const AM_MEDIA_TYPE *b) +{ + return IsEqualGUID(&a->majortype, &b->majortype) + && IsEqualGUID(&a->subtype, &b->subtype) + && IsEqualGUID(&a->formattype, &b->formattype) + && a->cbFormat == b->cbFormat + && !memcmp(a->pbFormat, b->pbFormat, a->cbFormat); +} + static HRESULT wave_parser_sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) { if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream)) @@ -2246,6 +2263,11 @@ static BOOL wave_parser_init_gst(struct gstdemux *filter) return TRUE; }
+static HRESULT wave_parser_source_query_accept(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt) +{ + return compare_media_types(mt, &pin->mt) ? S_OK : S_FALSE; +} + IUnknown * CALLBACK wave_parser_create(IUnknown *outer, HRESULT *phr) { static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0}; @@ -2269,6 +2291,7 @@ IUnknown * CALLBACK wave_parser_create(IUnknown *outer, HRESULT *phr) strmbase_sink_init(&object->sink, &object->filter, sink_name, &wave_parser_sink_ops, NULL); object->init_gst = wave_parser_init_gst; object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL); + object->source_query_accept = wave_parser_source_query_accept; *phr = S_OK;
TRACE("Created WAVE parser %p.\n", object); @@ -2352,6 +2375,11 @@ static BOOL avi_splitter_init_gst(struct gstdemux *filter) return TRUE; }
+static HRESULT avi_splitter_source_query_accept(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt) +{ + return S_OK; +} + IUnknown * CALLBACK avi_splitter_create(IUnknown *outer, HRESULT *phr) { static const WCHAR sink_name[] = {'i','n','p','u','t',' ','p','i','n',0}; @@ -2376,6 +2404,7 @@ IUnknown * CALLBACK avi_splitter_create(IUnknown *outer, HRESULT *phr) object->no_more_pads_event = CreateEventW(NULL, FALSE, FALSE, NULL); object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL); object->init_gst = avi_splitter_init_gst; + object->source_query_accept = avi_splitter_source_query_accept; *phr = S_OK;
TRACE("Created AVI splitter %p.\n", object); @@ -2469,6 +2498,11 @@ static BOOL mpeg_splitter_init_gst(struct gstdemux *filter) return TRUE; }
+static HRESULT mpeg_splitter_source_query_accept(struct gstdemux_source *pin, const AM_MEDIA_TYPE *mt) +{ + return S_OK; +} + static HRESULT mpeg_splitter_query_interface(struct strmbase_filter *iface, REFIID iid, void **out) { struct gstdemux *filter = impl_from_strmbase_filter(iface); @@ -2521,6 +2555,7 @@ IUnknown * CALLBACK mpeg_splitter_create(IUnknown *outer, HRESULT *phr) object->duration_event = CreateEventW(NULL, FALSE, FALSE, NULL); object->error_event = CreateEventW(NULL, TRUE, FALSE, NULL); object->init_gst = mpeg_splitter_init_gst; + object->source_query_accept = mpeg_splitter_source_query_accept; object->enum_sink_first = TRUE; *phr = S_OK;