[PATCH 5/5] strmbase: Move the IEnumMediaTypes implementation to pin.c.

Zebediah Figura z.figura12 at gmail.com
Tue Jan 28 23:36:55 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/strmbase/mediatype.c        | 170 -----------------------------
 dlls/strmbase/pin.c              | 176 +++++++++++++++++++++++++++++++
 dlls/strmbase/strmbase_private.h |   2 -
 3 files changed, 176 insertions(+), 172 deletions(-)

diff --git a/dlls/strmbase/mediatype.c b/dlls/strmbase/mediatype.c
index 7ab8b6e7083..64035b5e6b1 100644
--- a/dlls/strmbase/mediatype.c
+++ b/dlls/strmbase/mediatype.c
@@ -168,173 +168,3 @@ void WINAPI DeleteMediaType(AM_MEDIA_TYPE * pMediaType)
     FreeMediaType(pMediaType);
     CoTaskMemFree(pMediaType);
 }
-
-typedef struct IEnumMediaTypesImpl
-{
-    IEnumMediaTypes IEnumMediaTypes_iface;
-    LONG refCount;
-    struct strmbase_pin *basePin;
-    ULONG count;
-    ULONG uIndex;
-} IEnumMediaTypesImpl;
-
-static inline IEnumMediaTypesImpl *impl_from_IEnumMediaTypes(IEnumMediaTypes *iface)
-{
-    return CONTAINING_RECORD(iface, IEnumMediaTypesImpl, IEnumMediaTypes_iface);
-}
-
-static const struct IEnumMediaTypesVtbl IEnumMediaTypesImpl_Vtbl;
-
-HRESULT enum_media_types_create(struct strmbase_pin *basePin, IEnumMediaTypes **ppEnum)
-{
-    IEnumMediaTypesImpl * pEnumMediaTypes = CoTaskMemAlloc(sizeof(IEnumMediaTypesImpl));
-
-    *ppEnum = NULL;
-
-    if (!pEnumMediaTypes)
-        return E_OUTOFMEMORY;
-
-    pEnumMediaTypes->IEnumMediaTypes_iface.lpVtbl = &IEnumMediaTypesImpl_Vtbl;
-    pEnumMediaTypes->refCount = 1;
-    pEnumMediaTypes->uIndex = 0;
-    IPin_AddRef(&basePin->IPin_iface);
-    pEnumMediaTypes->basePin = basePin;
-
-    IEnumMediaTypes_Reset(&pEnumMediaTypes->IEnumMediaTypes_iface);
-
-    *ppEnum = &pEnumMediaTypes->IEnumMediaTypes_iface;
-    return S_OK;
-}
-
-static HRESULT WINAPI IEnumMediaTypesImpl_QueryInterface(IEnumMediaTypes * iface, REFIID riid, void ** ret_iface)
-{
-    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface);
-
-    if (IsEqualIID(riid, &IID_IUnknown) ||
-        IsEqualIID(riid, &IID_IEnumMediaTypes))
-    {
-        IEnumMediaTypes_AddRef(iface);
-        *ret_iface = iface;
-        return S_OK;
-    }
-
-    *ret_iface = NULL;
-
-    WARN("No interface for %s\n", debugstr_guid(riid));
-
-    return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface)
-{
-    IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface);
-    ULONG ref = InterlockedIncrement(&This->refCount);
-
-    TRACE("(%p)->(): new ref = %u\n", iface, ref);
-
-    return ref;
-}
-
-static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
-{
-    IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface);
-    ULONG ref = InterlockedDecrement(&This->refCount);
-
-    TRACE("(%p)->(): new ref = %u\n", iface, ref);
-
-    if (!ref)
-    {
-        IPin_Release(&This->basePin->IPin_iface);
-        CoTaskMemFree(This);
-    }
-    return ref;
-}
-
-static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes *iface,
-        ULONG count, AM_MEDIA_TYPE **mts, ULONG *ret_count)
-{
-    IEnumMediaTypesImpl *enummt = impl_from_IEnumMediaTypes(iface);
-    ULONG i;
-
-    TRACE("iface %p, count %u, mts %p, ret_count %p.\n", iface, count, mts, ret_count);
-
-    for (i = 0; i < count && enummt->uIndex + i < enummt->count; i++)
-    {
-        if (!(mts[i] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)))
-                || FAILED(enummt->basePin->pFuncsTable->pin_get_media_type(enummt->basePin, enummt->uIndex + i, mts[i])))
-        {
-            while (i--)
-                DeleteMediaType(mts[i]);
-            *ret_count = 0;
-            return E_OUTOFMEMORY;
-        }
-
-        if (TRACE_ON(strmbase))
-        {
-            TRACE("Returning media type %u:\n", enummt->uIndex + i);
-            strmbase_dump_media_type(mts[i]);
-        }
-    }
-
-    if ((count != 1) || ret_count)
-        *ret_count = i;
-
-    enummt->uIndex += i;
-
-    return i == count ? S_OK : S_FALSE;
-}
-
-static HRESULT WINAPI IEnumMediaTypesImpl_Skip(IEnumMediaTypes *iface, ULONG count)
-{
-    IEnumMediaTypesImpl *enummt = impl_from_IEnumMediaTypes(iface);
-
-    TRACE("iface %p, count %u.\n", iface, count);
-
-    enummt->uIndex += count;
-
-    return enummt->uIndex > enummt->count ? S_FALSE : S_OK;
-}
-
-static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface)
-{
-    ULONG i;
-    AM_MEDIA_TYPE amt;
-    IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface);
-
-    TRACE("(%p)->()\n", iface);
-
-    i = 0;
-    while (This->basePin->pFuncsTable->pin_get_media_type(This->basePin, i, &amt) == S_OK)
-    {
-        FreeMediaType(&amt);
-        i++;
-    }
-    This->count = i;
-    This->uIndex = 0;
-
-    return S_OK;
-}
-
-static HRESULT WINAPI IEnumMediaTypesImpl_Clone(IEnumMediaTypes * iface, IEnumMediaTypes ** ppEnum)
-{
-    HRESULT hr;
-    IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface);
-
-    TRACE("(%p)->(%p)\n", iface, ppEnum);
-
-    hr = enum_media_types_create(This->basePin, ppEnum);
-    if (FAILED(hr))
-        return hr;
-    return IEnumMediaTypes_Skip(*ppEnum, This->uIndex);
-}
-
-static const IEnumMediaTypesVtbl IEnumMediaTypesImpl_Vtbl =
-{
-    IEnumMediaTypesImpl_QueryInterface,
-    IEnumMediaTypesImpl_AddRef,
-    IEnumMediaTypesImpl_Release,
-    IEnumMediaTypesImpl_Next,
-    IEnumMediaTypesImpl_Skip,
-    IEnumMediaTypesImpl_Reset,
-    IEnumMediaTypesImpl_Clone
-};
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index 6f22f249766..fd74a409556 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -27,6 +27,182 @@ static const IMemInputPinVtbl MemInputPin_Vtbl;
 
 typedef HRESULT (*SendPinFunc)( IPin *to, LPVOID arg );
 
+struct enum_media_types
+{
+    IEnumMediaTypes IEnumMediaTypes_iface;
+    LONG refcount;
+
+    unsigned int index, count;
+    struct strmbase_pin *pin;
+};
+
+static const IEnumMediaTypesVtbl enum_media_types_vtbl;
+
+static HRESULT enum_media_types_create(struct strmbase_pin *pin, IEnumMediaTypes **out)
+{
+    struct enum_media_types *object;
+    AM_MEDIA_TYPE mt;
+
+    if (!out)
+        return E_POINTER;
+
+    if (!(object = heap_alloc_zero(sizeof(*object))))
+    {
+        *out = NULL;
+        return E_OUTOFMEMORY;
+    }
+
+    object->IEnumMediaTypes_iface.lpVtbl = &enum_media_types_vtbl;
+    object->refcount = 1;
+    object->pin = pin;
+    IPin_AddRef(&pin->IPin_iface);
+
+    while (pin->pFuncsTable->pin_get_media_type(pin, object->count, &mt) == S_OK)
+    {
+        FreeMediaType(&mt);
+        ++object->count;
+    }
+
+    TRACE("Created enumerator %p.\n", object);
+    *out = &object->IEnumMediaTypes_iface;
+
+    return S_OK;
+}
+
+static struct enum_media_types *impl_from_IEnumMediaTypes(IEnumMediaTypes *iface)
+{
+    return CONTAINING_RECORD(iface, struct enum_media_types, IEnumMediaTypes_iface);
+}
+
+static HRESULT WINAPI enum_media_types_QueryInterface(IEnumMediaTypes *iface, REFIID iid, void **out)
+{
+    TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+    if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IEnumMediaTypes))
+    {
+        IEnumMediaTypes_AddRef(iface);
+        *out = iface;
+        return S_OK;
+    }
+
+    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+    *out = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI enum_media_types_AddRef(IEnumMediaTypes *iface)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+    ULONG refcount = InterlockedIncrement(&enummt->refcount);
+    TRACE("%p increasing refcount to %u.\n", enummt, refcount);
+    return refcount;
+}
+
+static ULONG WINAPI enum_media_types_Release(IEnumMediaTypes *iface)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+    ULONG refcount = InterlockedDecrement(&enummt->refcount);
+
+    TRACE("%p decreasing refcount to %u.\n", enummt, refcount);
+    if (!refcount)
+    {
+        IPin_Release(&enummt->pin->IPin_iface);
+        heap_free(enummt);
+    }
+    return refcount;
+}
+
+static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count,
+        AM_MEDIA_TYPE **mts, ULONG *ret_count)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+    unsigned int i;
+    HRESULT hr;
+
+    TRACE("enummt %p, count %u, mts %p, ret_count %p.\n", enummt, count, mts, ret_count);
+
+    for (i = 0; i < count; ++i)
+    {
+        if ((mts[i] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE))))
+            hr = enummt->pin->pFuncsTable->pin_get_media_type(enummt->pin, enummt->index + i, mts[i]);
+        else
+            hr = E_OUTOFMEMORY;
+        if (FAILED(hr))
+        {
+            while (i--)
+                DeleteMediaType(mts[i]);
+            *ret_count = 0;
+            return E_OUTOFMEMORY;
+        }
+        else if (hr != S_OK)
+            break;
+
+        if (TRACE_ON(strmbase))
+        {
+            TRACE("Returning media type %u:\n", enummt->index + i);
+            strmbase_dump_media_type(mts[i]);
+        }
+    }
+
+    if (count != 1 || ret_count)
+        *ret_count = i;
+    enummt->index += i;
+    return i == count ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI enum_media_types_Skip(IEnumMediaTypes *iface, ULONG count)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+
+    TRACE("enummt %p, count %u.\n", enummt, count);
+
+    enummt->index += count;
+
+    return enummt->index > enummt->count ? S_FALSE : S_OK;
+}
+
+static HRESULT WINAPI enum_media_types_Reset(IEnumMediaTypes *iface)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+    AM_MEDIA_TYPE mt;
+
+    TRACE("enummt %p.\n", enummt);
+
+    enummt->count = 0;
+    while (enummt->pin->pFuncsTable->pin_get_media_type(enummt->pin, enummt->count, &mt) == S_OK)
+    {
+        FreeMediaType(&mt);
+        ++enummt->count;
+    }
+
+    enummt->index = 0;
+
+    return S_OK;
+}
+
+static HRESULT WINAPI enum_media_types_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **out)
+{
+    struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface);
+    HRESULT hr;
+
+    TRACE("enummt %p, out %p.\n", enummt, out);
+
+    if (FAILED(hr = enum_media_types_create(enummt->pin, out)))
+        return hr;
+    return IEnumMediaTypes_Skip(*out, enummt->index);
+}
+
+static const IEnumMediaTypesVtbl enum_media_types_vtbl =
+{
+    enum_media_types_QueryInterface,
+    enum_media_types_AddRef,
+    enum_media_types_Release,
+    enum_media_types_Next,
+    enum_media_types_Skip,
+    enum_media_types_Reset,
+    enum_media_types_Clone,
+};
+
 static inline struct strmbase_pin *impl_from_IPin(IPin *iface)
 {
     return CONTAINING_RECORD(iface, struct strmbase_pin, IPin_iface);
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h
index 7b471515b63..b03258bc416 100644
--- a/dlls/strmbase/strmbase_private.h
+++ b/dlls/strmbase/strmbase_private.h
@@ -77,8 +77,6 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv);
 void QualityControlRender_BeginRender(QualityControlImpl *This, REFERENCE_TIME start, REFERENCE_TIME stop);
 void QualityControlRender_EndRender(QualityControlImpl *This);
 
-HRESULT enum_media_types_create(struct strmbase_pin *pin, IEnumMediaTypes **enum_media_types) DECLSPEC_HIDDEN;
-
 HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start);
 HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface);
 HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface);
-- 
2.25.0




More information about the wine-devel mailing list