[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