[PATCH 6/6] strmbase: Try sink types before source types.

Zebediah Figura zfigura at codeweavers.com
Thu Dec 23 00:35:17 CST 2021


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50668
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/qcap/tests/smartteefilter.c |  2 +-
 dlls/qedit/tests/samplegrabber.c |  4 ++--
 dlls/quartz/tests/avidec.c       |  2 +-
 dlls/quartz/tests/avisplit.c     |  2 +-
 libs/strmbase/pin.c              | 32 ++++++++++++++++----------------
 5 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/dlls/qcap/tests/smartteefilter.c b/dlls/qcap/tests/smartteefilter.c
index c8a66f1370a..b6ba3ca75c9 100644
--- a/dlls/qcap/tests/smartteefilter.c
+++ b/dlls/qcap/tests/smartteefilter.c
@@ -1095,7 +1095,7 @@ static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph,
     req_mt.lSampleSize = 3;
     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");
+    ok(compare_media_types(&testsink->sink.pin.mt, &req_mt), "Media types didn't match.\n");
     IFilterGraph2_Disconnect(graph, source);
     IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface);
 
diff --git a/dlls/qedit/tests/samplegrabber.c b/dlls/qedit/tests/samplegrabber.c
index 4c930e0c87a..13ec04cdc1c 100644
--- a/dlls/qedit/tests/samplegrabber.c
+++ b/dlls/qedit/tests/samplegrabber.c
@@ -1260,8 +1260,8 @@ static void test_connect_pin(void)
     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");
-    ok(compare_media_types(&testsource.source.pin.mt, &testsource.source_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_EnumMediaTypes(sink, &enummt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 10aa9711982..ac1078bf59b 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -1516,7 +1516,7 @@ static void test_connect_pin(void)
     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");
+    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 47f20b70d61..06c2f5fed3c 100644
--- a/dlls/quartz/tests/avisplit.c
+++ b/dlls/quartz/tests/avisplit.c
@@ -1365,7 +1365,7 @@ static void test_connect_pin(void)
     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");
+    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/libs/strmbase/pin.c b/libs/strmbase/pin.c
index efce0155a9e..36b3fdf1425 100644
--- a/libs/strmbase/pin.c
+++ b/libs/strmbase/pin.c
@@ -516,22 +516,6 @@ static HRESULT WINAPI source_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYP
         return hr;
     }
 
-    if (pin->pFuncsTable->base.pin_get_media_type)
-    {
-        for (i = 0; pin->pFuncsTable->base.pin_get_media_type(&pin->pin, i, &candidate) == S_OK; ++i)
-        {
-            strmbase_dump_media_type(&candidate);
-            if (compare_media_types(mt, &candidate)
-                    && pin->pFuncsTable->pfnAttemptConnection(pin, peer, &candidate) == S_OK)
-            {
-                LeaveCriticalSection(&pin->pin.filter->filter_cs);
-                FreeMediaType(&candidate);
-                return S_OK;
-            }
-            FreeMediaType(&candidate);
-        }
-    }
-
     if (SUCCEEDED(IPin_EnumMediaTypes(peer, &enummt)))
     {
         while (IEnumMediaTypes_Next(enummt, 1, &candidate_ptr, &count) == S_OK)
@@ -550,6 +534,22 @@ static HRESULT WINAPI source_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYP
         IEnumMediaTypes_Release(enummt);
     }
 
+    if (pin->pFuncsTable->base.pin_get_media_type)
+    {
+        for (i = 0; pin->pFuncsTable->base.pin_get_media_type(&pin->pin, i, &candidate) == S_OK; ++i)
+        {
+            strmbase_dump_media_type(&candidate);
+            if (compare_media_types(mt, &candidate)
+                    && pin->pFuncsTable->pfnAttemptConnection(pin, peer, &candidate) == S_OK)
+            {
+                LeaveCriticalSection(&pin->pin.filter->filter_cs);
+                FreeMediaType(&candidate);
+                return S_OK;
+            }
+            FreeMediaType(&candidate);
+        }
+    }
+
     LeaveCriticalSection(&pin->pin.filter->filter_cs);
 
     return VFW_E_NO_ACCEPTABLE_TYPES;
-- 
2.34.1




More information about the wine-devel mailing list