[PATCH 2/5] qedit/samplegrabber: Implement sample_grabber_source_query_accept().

Zebediah Figura z.figura12 at gmail.com
Fri Feb 7 23:51:53 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/qedit/samplegrabber.c       |  38 ++++----
 dlls/qedit/tests/samplegrabber.c | 154 +++++++++++++------------------
 2 files changed, 85 insertions(+), 107 deletions(-)

diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 322cbf04001..696053b1d58 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -547,6 +547,28 @@ static HRESULT sample_grabber_source_query_interface(struct strmbase_pin *iface,
 
 static HRESULT sample_grabber_source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
 {
+    SG_Impl *filter = impl_from_source_pin(iface);
+
+    if (filter->sink.pin.peer && IPin_QueryAccept(filter->sink.pin.peer, mt) != S_OK)
+        return S_FALSE;
+
+    strmbase_dump_media_type(&filter->filter_mt);
+
+    if (IsEqualGUID(&filter->filter_mt.majortype, &GUID_NULL))
+        return S_OK;
+    if (!IsEqualGUID(&filter->filter_mt.majortype, &mt->majortype))
+        return S_FALSE;
+
+    if (IsEqualGUID(&filter->filter_mt.subtype, &GUID_NULL))
+        return S_OK;
+    if (!IsEqualGUID(&filter->filter_mt.subtype, &mt->subtype))
+        return S_FALSE;
+
+    if (IsEqualGUID(&filter->filter_mt.formattype, &GUID_NULL))
+        return S_OK;
+    if (!IsEqualGUID(&filter->filter_mt.formattype, &mt->formattype))
+        return S_FALSE;
+
     return S_OK;
 }
 
@@ -566,22 +588,6 @@ static HRESULT sample_grabber_source_get_media_type(struct strmbase_pin *iface,
 static HRESULT WINAPI sample_grabber_source_DecideAllocator(struct strmbase_source *iface,
         IMemInputPin *peer, IMemAllocator **allocator)
 {
-    SG_Impl *filter = impl_from_source_pin(&iface->pin);
-    const AM_MEDIA_TYPE *mt = &iface->pin.mt;
-
-    if (!IsEqualGUID(&mt->majortype, &filter->filter_mt.majortype))
-        return VFW_E_TYPE_NOT_ACCEPTED;
-    if (!IsEqualGUID(&mt->subtype, &filter->filter_mt.subtype))
-        return VFW_E_TYPE_NOT_ACCEPTED;
-    if (!IsEqualGUID(&mt->formattype, &FORMAT_None)
-            && !IsEqualGUID(&mt->formattype, &GUID_NULL)
-            && !IsEqualGUID(&mt->formattype, &filter->filter_mt.formattype))
-        return VFW_E_TYPE_NOT_ACCEPTED;
-    if (!IsEqualGUID(&mt->formattype, &FORMAT_None)
-            && !IsEqualGUID(&mt->formattype, &GUID_NULL)
-            && !mt->pbFormat)
-        return VFW_E_TYPE_NOT_ACCEPTED;
-
     return S_OK;
 }
 
diff --git a/dlls/qedit/tests/samplegrabber.c b/dlls/qedit/tests/samplegrabber.c
index 6404e053886..e8ab1073fb0 100644
--- a/dlls/qedit/tests/samplegrabber.c
+++ b/dlls/qedit/tests/samplegrabber.c
@@ -517,13 +517,13 @@ static void test_media_types(void)
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
     mt.majortype = GUID_NULL;
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     mt.majortype = match_mt.majortype;
     hr = IPin_QueryAccept(sink, &mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -537,13 +537,13 @@ static void test_media_types(void)
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
     mt.subtype = GUID_NULL;
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     mt.subtype = match_mt.subtype;
     hr = IPin_QueryAccept(sink, &mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -556,13 +556,13 @@ static void test_media_types(void)
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
     mt.formattype = GUID_NULL;
     hr = IPin_QueryAccept(sink, &mt);
     todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     mt.formattype = match_mt.formattype;
     hr = IPin_QueryAccept(sink, &mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -841,7 +841,7 @@ static void test_connect_pin(void)
     hr = IPin_QueryAccept(sink, &req_mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     hr = IPin_QueryAccept(source, &req_mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     req_mt.bTemporalCompression = TRUE;
     hr = IPin_QueryAccept(source, &req_mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -852,12 +852,12 @@ static void test_connect_pin(void)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
     hr = IPin_QueryAccept(source, &req_mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
     req_mt.majortype = MEDIATYPE_Midi;
     req_mt.bTemporalCompression = FALSE;
     hr = IPin_QueryAccept(source, &req_mt);
-    todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
 
     req_mt.bTemporalCompression = TRUE;
     hr = IPin_QueryAccept(source, &req_mt);
@@ -885,81 +885,72 @@ static void test_connect_pin(void)
 
     req_mt.bTemporalCompression = TRUE;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
 
-    if (hr == S_OK)
-    {
-        hr = IPin_ConnectedTo(source, &peer);
-        ok(hr == S_OK, "Got hr %#x.\n", hr);
-        ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer);
-        IPin_Release(peer);
+    hr = IPin_ConnectedTo(source, &peer);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer);
+    IPin_Release(peer);
 
-        hr = IPin_ConnectionMediaType(source, &mt);
-        ok(hr == S_OK, "Got hr %#x.\n", hr);
-        ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n");
-        ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n");
-        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    hr = IPin_ConnectionMediaType(source, &mt);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n");
+    ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n");
+    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
 
-        hr = IFilterGraph2_Disconnect(graph, source);
-        ok(hr == S_OK, "Got hr %#x.\n", hr);
-        hr = IFilterGraph2_Disconnect(graph, source);
-        ok(hr == S_FALSE, "Got hr %#x.\n", hr);
-        ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    hr = IFilterGraph2_Disconnect(graph, source);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    hr = IFilterGraph2_Disconnect(graph, source);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer);
+    IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     /* Connection with wildcards. */
 
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
 
     testsource.source_mt.bTemporalCompression = TRUE;
     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, &testsource.source_mt), "Media types didn't match.\n");
-    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (hr == S_OK)
+    {
+        ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
+        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    }
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     req_mt.majortype = GUID_NULL;
     req_mt.bTemporalCompression = FALSE;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
-    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (hr == S_OK)
+    {
+        ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
+        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    }
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     req_mt.subtype = MEDIASUBTYPE_RGB32;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
 
     req_mt.subtype = GUID_NULL;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
-    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (hr == S_OK)
+    {
+        ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
+        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    }
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     req_mt.formattype = FORMAT_None;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
 
     req_mt.majortype = MEDIATYPE_Video;
     req_mt.subtype = MEDIASUBTYPE_RGB8;
@@ -980,68 +971,49 @@ static void test_connect_pin(void)
 
     req_mt.subtype = GUID_NULL;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
-    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (hr == S_OK)
+    {
+        ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
+        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    }
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     req_mt.majortype = MEDIATYPE_Audio;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
 
     testsource.source_mt.majortype = testsource.source_mt.subtype = testsource.source_mt.formattype = GUID_NULL;
     req_mt.majortype = req_mt.subtype = req_mt.formattype = GUID_NULL;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    ok(hr == S_OK, "Got hr %#x.\n", hr);
-    todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
-    todo_wine ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    if (hr == S_OK)
+    {
+        ok(compare_media_types(&testsink.sink.pin.mt, &testsource.source_mt), "Media types didn't match.\n");
+        ok(compare_media_types(&testsource.source.pin.mt, &testsink.sink.pin.mt), "Media types didn't match.\n");
+    }
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
 
     req_mt.majortype = MEDIATYPE_Video;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
     req_mt.majortype = GUID_NULL;
 
     req_mt.subtype = MEDIASUBTYPE_RGB8;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
     req_mt.subtype = GUID_NULL;
 
     req_mt.formattype = FORMAT_None;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
     req_mt.formattype = GUID_NULL;
 
     testsink.sink_mt = &req_mt;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL);
-    todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        IFilterGraph2_Disconnect(graph, source);
-        IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface);
-    }
+    ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr);
 
     req_mt.bTemporalCompression = TRUE;
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL);
-- 
2.25.0




More information about the wine-devel mailing list