Maarten Lankhorst : qcap: Add better findpin stub for CaptureGraphBuilder.

Alexandre Julliard julliard at winehq.org
Fri Mar 14 08:29:26 CDT 2008


Module: wine
Branch: master
Commit: 7e32b11ab6ec2a53f70e6bf19144c04680011f1a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7e32b11ab6ec2a53f70e6bf19144c04680011f1a

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Tue Mar 11 16:24:54 2008 -0700

qcap: Add better findpin stub for CaptureGraphBuilder.

ICaptureGraphBuilder::RenderStream needs to enumerate pins, and to
prevent duplication I implemented a bit of findpin first.

---

 dlls/qcap/capturegraph.c |   89 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 85 insertions(+), 4 deletions(-)

diff --git a/dlls/qcap/capturegraph.c b/dlls/qcap/capturegraph.c
index c5631b1..6dec92a 100644
--- a/dlls/qcap/capturegraph.c
+++ b/dlls/qcap/capturegraph.c
@@ -34,10 +34,10 @@
 #include "evcode.h"
 #include "strmif.h"
 #include "control.h"
+#include "vfwmsgs.h"
 /*
  *#include "amvideo.h"
  *#include "mmreg.h"
- *#include "vfwmsgs.h"
  *#include "dshow.h"
  *#include "ddraw.h"
  */
@@ -326,6 +326,27 @@ fnCaptureGraphBuilder2_CopyCaptureFile(ICaptureGraphBuilder2 * iface,
     return E_NOTIMPL;
 }
 
+static BOOL pin_matches(IPin *pin, PIN_DIRECTION direction, const GUID *cat, const GUID *type, BOOL unconnected)
+{
+    IPin *partner;
+    PIN_DIRECTION pindir;
+
+    IPin_QueryDirection(pin, &pindir);
+    if (pindir != direction)
+        return FALSE;
+
+    if (unconnected && IPin_ConnectedTo(pin, &partner) == S_OK)
+    {
+        IPin_Release(partner);
+        return FALSE;
+    }
+
+    if (cat || type)
+        FIXME("Ignoring category/type\n");
+
+    return TRUE;
+}
+
 static HRESULT WINAPI
 fnCaptureGraphBuilder2_FindPin(ICaptureGraphBuilder2 * iface,
                                IUnknown *pSource,
@@ -333,16 +354,76 @@ fnCaptureGraphBuilder2_FindPin(ICaptureGraphBuilder2 * iface,
                                const GUID *pCategory,
                                const GUID *pType,
                                BOOL fUnconnected,
-                               int num,
+                               INT num,
                                IPin **ppPin)
 {
+    HRESULT hr;
+    IEnumPins *enumpins = NULL;
+    IPin *pin;
     CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface);
 
-    FIXME("(%p/%p)->(%p, %x, %s, %s, %d, %i, %p) Stub!\n", This, iface,
+    TRACE("(%p/%p)->(%p, %x, %s, %s, %d, %i, %p)\n", This, iface,
           pSource, pindir, debugstr_guid(pCategory), debugstr_guid(pType),
           fUnconnected, num, ppPin);
 
-    return E_NOTIMPL;
+    pin = NULL;
+
+    hr = IUnknown_QueryInterface(pSource, &IID_IPin, (void**)&pin);
+    if (hr == E_NOINTERFACE)
+    {
+        IBaseFilter *filter = NULL;
+        int numcurrent = 0;
+
+        hr = IUnknown_QueryInterface(pSource, &IID_IBaseFilter, (void**)&filter);
+        if (hr == E_NOINTERFACE)
+        {
+            WARN("Input not filter or pin?!\n");
+            return E_FAIL;
+        }
+
+        hr = IBaseFilter_EnumPins(filter, &enumpins);
+        if (FAILED(hr))
+        {
+            WARN("Could not enumerate\n");
+            return hr;
+        }
+
+        IEnumPins_Reset(enumpins);
+
+        while (1)
+        {
+            hr = IEnumPins_Next(enumpins, 1, &pin, NULL);
+            if (hr == VFW_E_ENUM_OUT_OF_SYNC)
+            {
+                numcurrent = 0;
+                IEnumPins_Reset(enumpins);
+                pin = NULL;
+                continue;
+            }
+
+            if (hr != S_OK)
+                break;
+            if (pin_matches(pin, pindir, pCategory, pType, fUnconnected) && numcurrent++ == num)
+                break;
+            IPin_Release(pin);
+            pin = NULL;
+        }
+        IEnumPins_Release(enumpins);
+
+        if (hr != S_OK)
+        {
+            WARN("Could not find pin # %d\n", numcurrent);
+            return E_FAIL;
+        }
+    }
+    else if (!pin_matches(pin, pindir, pCategory, pType, fUnconnected))
+    {
+        IPin_Release(pin);
+        return E_FAIL;
+    }
+
+    *ppPin = pin;
+    return S_OK;
 }
 
 static const ICaptureGraphBuilder2Vtbl builder2_Vtbl =




More information about the wine-cvs mailing list