[PATCH 3/5] strmbase: Determine the pin count using the GetPin() callback.

Zebediah Figura z.figura12 at gmail.com
Mon May 13 22:17:56 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/strmbase/enumpins.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/dlls/strmbase/enumpins.c b/dlls/strmbase/enumpins.c
index 7aa66112c4..15d6cab8df 100644
--- a/dlls/strmbase/enumpins.c
+++ b/dlls/strmbase/enumpins.c
@@ -27,7 +27,7 @@ typedef struct IEnumPinsImpl
 {
     IEnumPins IEnumPins_iface;
     LONG refCount;
-    ULONG uIndex;
+    unsigned int uIndex, count;
     BaseFilter *base;
     DWORD Version;
 } IEnumPinsImpl;
@@ -42,6 +42,7 @@ static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl;
 HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum)
 {
     IEnumPinsImpl * pEnumPins;
+    IPin *pin;
 
     if (!ppEnum)
         return E_POINTER;
@@ -59,6 +60,13 @@ HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum)
     IBaseFilter_AddRef(&base->IBaseFilter_iface);
     *ppEnum = &pEnumPins->IEnumPins_iface;
     pEnumPins->Version = base->pin_version;
+    pEnumPins->count = 0;
+
+    while ((pin = base->pFuncsTable->pfnGetPin(base, pEnumPins->count)))
+    {
+        IPin_Release(pin);
+        ++pEnumPins->count;
+    }
 
     TRACE("Created new enumerator (%p)\n", *ppEnum);
     return S_OK;
@@ -161,7 +169,7 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG count)
     if (enum_pins->Version != enum_pins->base->pin_version)
         return VFW_E_ENUM_OUT_OF_SYNC;
 
-    if (enum_pins->uIndex + count > enum_pins->base->pFuncsTable->pfnGetPinCount(enum_pins->base))
+    if (enum_pins->uIndex + count > enum_pins->count)
         return S_FALSE;
 
     enum_pins->uIndex += count;
@@ -171,9 +179,20 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG count)
 static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins *iface)
 {
     IEnumPinsImpl *enum_pins = impl_from_IEnumPins(iface);
+    IPin *pin;
 
     TRACE("iface %p.\n", iface);
 
+    if (enum_pins->Version != enum_pins->base->pin_version)
+    {
+        enum_pins->count = 0;
+        while ((pin = enum_pins->base->pFuncsTable->pfnGetPin(enum_pins->base, enum_pins->count)))
+        {
+            IPin_Release(pin);
+            ++enum_pins->count;
+        }
+    }
+
     enum_pins->Version = enum_pins->base->pin_version;
     enum_pins->uIndex = 0;
 
-- 
2.21.0




More information about the wine-devel mailing list