strmbase: Move the IEnumMediaTypes implementation to pin.c.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Zebediah Figura 2020-01-28 23:36:55 -06:00 committed by Alexandre Julliard
parent 0820b125e2
commit 85d411aa24
3 changed files with 176 additions and 172 deletions

View File

@ -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
};

View File

@ -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);

View File

@ -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);