From 5a461804b08e6664c4621a13a7907e4606c4b990 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Thu, 23 Dec 2021 00:35:14 -0600 Subject: [PATCH] quartz/tests: Test that sink pins are enumerated first. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/quartz/tests/avidec.c | 22 +++++++++++++--------- dlls/quartz/tests/avisplit.c | 16 +++++++--------- dlls/quartz/tests/mpegsplit.c | 24 ++++++++++++++---------- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index 71f974806ea..10aa9711982 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -854,14 +854,6 @@ static HRESULT testsink_query_interface(struct strmbase_pin *iface, REFIID iid, return S_OK; } -static HRESULT testsink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) -{ - struct testfilter *filter = impl_from_strmbase_filter(iface->filter); - if (filter->mt && !compare_media_types(mt, filter->mt)) - return S_FALSE; - return S_OK; -} - static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) { struct testfilter *filter = impl_from_strmbase_filter(iface->filter); @@ -873,6 +865,14 @@ static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int return VFW_S_NO_MORE_ITEMS; } +static HRESULT testsink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); + if (filter->mt && !IsEqualGUID(&mt->majortype, &filter->mt->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; + return S_OK; +} + static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample *sample) { struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); @@ -958,8 +958,8 @@ static HRESULT testsink_end_flush(struct strmbase_sink *iface) static const struct strmbase_sink_ops testsink_ops = { .base.pin_query_interface = testsink_query_interface, - .base.pin_query_accept = testsink_query_accept, .base.pin_get_media_type = testsink_get_media_type, + .sink_connect = testsink_connect, .pfnReceive = testsink_Receive, .sink_new_segment = testsink_new_segment, .sink_eos = testsink_eos, @@ -1501,6 +1501,8 @@ static void test_connect_pin(void) hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + /* Test enumeration of sink media types. */ + /* Our sink's proposed media type is sort of broken, but Windows 8+ returns * VFW_E_INVALIDMEDIATYPE for even perfectly reasonable ones. */ testsink.mt = &req_mt; @@ -1511,8 +1513,10 @@ static void test_connect_pin(void) req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = FORMAT_VideoInfo; + req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IFilterGraph2_Disconnect(graph, sink); ok(hr == S_OK, "Got hr %#x.\n", hr); diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c index 80ee6607279..47f20b70d61 100644 --- a/dlls/quartz/tests/avisplit.c +++ b/dlls/quartz/tests/avisplit.c @@ -894,14 +894,6 @@ static HRESULT testsink_query_interface(struct strmbase_pin *iface, REFIID iid, return S_OK; } -static HRESULT testsink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) -{ - struct testfilter *filter = impl_from_strmbase_filter(iface->filter); - if (filter->mt && !compare_media_types(mt, filter->mt)) - return S_FALSE; - return S_OK; -} - static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) { struct testfilter *filter = impl_from_strmbase_filter(iface->filter); @@ -915,6 +907,7 @@ static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int static HRESULT testsink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) { + struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); AM_MEDIA_TYPE mt2; IPin *peer2; HRESULT hr; @@ -929,6 +922,8 @@ static HRESULT testsink_connect(struct strmbase_sink *iface, IPin *peer, const A ok(compare_media_types(mt, &mt2), "Media types didn't match.\n"); FreeMediaType(&mt2); + if (filter->mt && !IsEqualGUID(&mt->majortype, &filter->mt->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; return S_OK; } @@ -993,7 +988,6 @@ static HRESULT testsink_new_segment(struct strmbase_sink *iface, static const struct strmbase_sink_ops testsink_ops = { .base.pin_query_interface = testsink_query_interface, - .base.pin_query_accept = testsink_query_accept, .base.pin_get_media_type = testsink_get_media_type, .sink_connect = testsink_connect, .pfnReceive = testsink_Receive, @@ -1359,6 +1353,8 @@ static void test_connect_pin(void) hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + /* Test enumeration of sink media types. */ + testsink.mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); @@ -1366,8 +1362,10 @@ static void test_connect_pin(void) req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = FORMAT_VideoInfo; + req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IPin_Release(source); hr = IFilterGraph2_Disconnect(graph, sink); diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index 9c0c34d6c9c..0809c5f861f 100644 --- a/dlls/quartz/tests/mpegsplit.c +++ b/dlls/quartz/tests/mpegsplit.c @@ -1183,14 +1183,6 @@ static HRESULT testsink_query_interface(struct strmbase_pin *iface, REFIID iid, return S_OK; } -static HRESULT testsink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) -{ - struct testfilter *filter = impl_from_strmbase_filter(iface->filter); - if (filter->mt && !compare_media_types(mt, filter->mt)) - return S_FALSE; - return S_OK; -} - static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) { struct testfilter *filter = impl_from_strmbase_filter(iface->filter); @@ -1202,6 +1194,14 @@ static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int return VFW_S_NO_MORE_ITEMS; } +static HRESULT testsink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); + if (filter->mt && !IsEqualGUID(&mt->majortype, &filter->mt->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; + return S_OK; +} + static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample *sample) { struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); @@ -1263,8 +1263,8 @@ static HRESULT testsink_new_segment(struct strmbase_sink *iface, static const struct strmbase_sink_ops testsink_ops = { .base.pin_query_interface = testsink_query_interface, - .base.pin_query_accept = testsink_query_accept, .base.pin_get_media_type = testsink_get_media_type, + .sink_connect = testsink_connect, .pfnReceive = testsink_Receive, .sink_eos = testsink_eos, .sink_new_segment = testsink_new_segment, @@ -1576,6 +1576,8 @@ static void test_connect_pin(void) hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + /* Test enumeration of sink media types. */ + testsink.mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); @@ -1583,8 +1585,10 @@ static void test_connect_pin(void) req_mt.majortype = MEDIATYPE_Audio; req_mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; req_mt.formattype = FORMAT_WaveFormatEx; + req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IPin_Release(source); hr = IFilterGraph2_Disconnect(graph, sink);