strmbase: Remove function pointers from the IEnumPinsImpl structure.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2019-05-13 22:17:54 -05:00 committed by Alexandre Julliard
parent 40fef0fb71
commit a95c1f300e
4 changed files with 25 additions and 43 deletions

View File

@ -29,9 +29,6 @@ typedef struct IEnumPinsImpl
LONG refCount; LONG refCount;
ULONG uIndex; ULONG uIndex;
BaseFilter *base; BaseFilter *base;
BaseFilter_GetPin receive_pin;
BaseFilter_GetPinCount receive_pincount;
BaseFilter_GetPinVersion receive_version;
DWORD Version; DWORD Version;
} IEnumPinsImpl; } IEnumPinsImpl;
@ -42,7 +39,7 @@ static inline IEnumPinsImpl *impl_from_IEnumPins(IEnumPins *iface)
static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl; static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl;
HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_pin, BaseFilter_GetPinCount receive_pincount, BaseFilter_GetPinVersion receive_version, IEnumPins ** ppEnum) HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum)
{ {
IEnumPinsImpl * pEnumPins; IEnumPinsImpl * pEnumPins;
@ -58,13 +55,10 @@ HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_p
pEnumPins->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl; pEnumPins->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl;
pEnumPins->refCount = 1; pEnumPins->refCount = 1;
pEnumPins->uIndex = 0; pEnumPins->uIndex = 0;
pEnumPins->receive_pin = receive_pin;
pEnumPins->receive_pincount = receive_pincount;
pEnumPins->receive_version = receive_version;
pEnumPins->base = base; pEnumPins->base = base;
IBaseFilter_AddRef(&base->IBaseFilter_iface); IBaseFilter_AddRef(&base->IBaseFilter_iface);
*ppEnum = &pEnumPins->IEnumPins_iface; *ppEnum = &pEnumPins->IEnumPins_iface;
pEnumPins->Version = receive_version(base); pEnumPins->Version = base->pin_version;
TRACE("Created new enumerator (%p)\n", *ppEnum); TRACE("Created new enumerator (%p)\n", *ppEnum);
return S_OK; return S_OK;
@ -134,13 +128,13 @@ static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin **
if (pcFetched) if (pcFetched)
*pcFetched = 0; *pcFetched = 0;
if (This->Version != This->receive_version(This->base)) if (This->Version != This->base->pin_version)
return VFW_E_ENUM_OUT_OF_SYNC; return VFW_E_ENUM_OUT_OF_SYNC;
while (i < cPins) while (i < cPins)
{ {
IPin *pin; IPin *pin;
pin = This->receive_pin(This->base, This->uIndex + i); pin = This->base->pFuncsTable->pfnGetPin(This->base, This->uIndex + i);
if (!pin) if (!pin)
break; break;
@ -164,39 +158,38 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG count)
TRACE("enum_pins %p, count %u.\n", enum_pins, count); TRACE("enum_pins %p, count %u.\n", enum_pins, count);
if (enum_pins->Version != enum_pins->receive_version(enum_pins->base)) if (enum_pins->Version != enum_pins->base->pin_version)
return VFW_E_ENUM_OUT_OF_SYNC; return VFW_E_ENUM_OUT_OF_SYNC;
if (enum_pins->uIndex + count > enum_pins->receive_pincount(enum_pins->base)) if (enum_pins->uIndex + count > enum_pins->base->pFuncsTable->pfnGetPinCount(enum_pins->base))
return S_FALSE; return S_FALSE;
enum_pins->uIndex += count; enum_pins->uIndex += count;
return S_OK; return S_OK;
} }
static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins * iface) static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins *iface)
{ {
IEnumPinsImpl *This = impl_from_IEnumPins(iface); IEnumPinsImpl *enum_pins = impl_from_IEnumPins(iface);
TRACE("(%p)->()\n", iface); TRACE("iface %p.\n", iface);
This->Version = This->receive_version(This->base); enum_pins->Version = enum_pins->base->pin_version;
enum_pins->uIndex = 0;
This->uIndex = 0;
return S_OK; return S_OK;
} }
static HRESULT WINAPI IEnumPinsImpl_Clone(IEnumPins * iface, IEnumPins ** ppEnum) static HRESULT WINAPI IEnumPinsImpl_Clone(IEnumPins *iface, IEnumPins **out)
{ {
IEnumPinsImpl *enum_pins = impl_from_IEnumPins(iface);
HRESULT hr; HRESULT hr;
IEnumPinsImpl *This = impl_from_IEnumPins(iface);
TRACE("(%p)->(%p)\n", iface, ppEnum); TRACE("iface %p, out %p.\n", iface, out);
hr = EnumPins_Construct(This->base, This->receive_pin, This->receive_pincount, This->receive_version, ppEnum); if (FAILED(hr = enum_pins_create(enum_pins->base, out)))
if (FAILED(hr))
return hr; return hr;
return IEnumPins_Skip(*ppEnum, This->uIndex); return IEnumPins_Skip(*out, enum_pins->uIndex);
} }
static const IEnumPinsVtbl IEnumPinsImpl_Vtbl = static const IEnumPinsVtbl IEnumPinsImpl_Vtbl =

View File

@ -125,13 +125,13 @@ HRESULT WINAPI BaseFilterImpl_GetSyncSource(IBaseFilter * iface, IReferenceClock
return S_OK; return S_OK;
} }
HRESULT WINAPI BaseFilterImpl_EnumPins(IBaseFilter * iface, IEnumPins **ppEnum) HRESULT WINAPI BaseFilterImpl_EnumPins(IBaseFilter *iface, IEnumPins **enum_pins)
{ {
BaseFilter *This = impl_from_IBaseFilter(iface); BaseFilter *filter = impl_from_IBaseFilter(iface);
TRACE("(%p)->(%p)\n", iface, ppEnum); TRACE("iface %p, enum_pins %p.\n", iface, enum_pins);
return EnumPins_Construct(This, This->pFuncsTable->pfnGetPin, This->pFuncsTable->pfnGetPinCount, BaseFilterImpl_GetPinVersion, ppEnum); return enum_pins_create(filter, enum_pins);
} }
HRESULT WINAPI BaseFilterImpl_FindPin(IBaseFilter *iface, const WCHAR *id, IPin **ret) HRESULT WINAPI BaseFilterImpl_FindPin(IBaseFilter *iface, const WCHAR *id, IPin **ret)
@ -206,16 +206,9 @@ HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVend
return E_NOTIMPL; return E_NOTIMPL;
} }
LONG WINAPI BaseFilterImpl_GetPinVersion(BaseFilter * This) VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter *filter)
{ {
TRACE("(%p)\n", This); InterlockedIncrement(&filter->pin_version);
return This->pinVersion;
}
VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter * This)
{
InterlockedIncrement(&This->pinVersion);
TRACE("(%p) -> New pinVersion %i\n", This,This->pinVersion);
} }
HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable) HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable)
@ -229,7 +222,7 @@ HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, c
ZeroMemory(&This->filterInfo, sizeof(FILTER_INFO)); ZeroMemory(&This->filterInfo, sizeof(FILTER_INFO));
This->clsid = *pClsid; This->clsid = *pClsid;
This->csFilter.DebugInfo->Spare[0] = DebugInfo; This->csFilter.DebugInfo->Spare[0] = DebugInfo;
This->pinVersion = 1; This->pin_version = 1;
This->pFuncsTable = pBaseFuncsTable; This->pFuncsTable = pBaseFuncsTable;

View File

@ -63,9 +63,7 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv);
void QualityControlRender_BeginRender(QualityControlImpl *This); void QualityControlRender_BeginRender(QualityControlImpl *This);
void QualityControlRender_EndRender(QualityControlImpl *This); void QualityControlRender_EndRender(QualityControlImpl *This);
HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin pfn_get_pin, HRESULT enum_pins_create(BaseFilter *base, IEnumPins **enum_pins);
BaseFilter_GetPinCount pfn_get_pin_count, BaseFilter_GetPinVersion pfn_get_pin_version,
IEnumPins **enum_pins);
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start); HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start);
HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface); HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface);

View File

@ -163,14 +163,13 @@ typedef struct BaseFilter
IReferenceClock * pClock; IReferenceClock * pClock;
FILTER_INFO filterInfo; FILTER_INFO filterInfo;
CLSID clsid; CLSID clsid;
LONG pinVersion; LONG pin_version;
const struct BaseFilterFuncTable* pFuncsTable; const struct BaseFilterFuncTable* pFuncsTable;
} BaseFilter; } BaseFilter;
typedef IPin* (WINAPI *BaseFilter_GetPin)(BaseFilter* iface, int iPosition); typedef IPin* (WINAPI *BaseFilter_GetPin)(BaseFilter* iface, int iPosition);
typedef LONG (WINAPI *BaseFilter_GetPinCount)(BaseFilter* iface); typedef LONG (WINAPI *BaseFilter_GetPinCount)(BaseFilter* iface);
typedef LONG (WINAPI *BaseFilter_GetPinVersion)(BaseFilter* iface);
typedef struct BaseFilterFuncTable { typedef struct BaseFilterFuncTable {
/* Required */ /* Required */
@ -191,7 +190,6 @@ HRESULT WINAPI BaseFilterImpl_QueryFilterInfo(IBaseFilter * iface, FILTER_INFO *
HRESULT WINAPI BaseFilterImpl_JoinFilterGraph(IBaseFilter * iface, IFilterGraph *pGraph, LPCWSTR pName ); HRESULT WINAPI BaseFilterImpl_JoinFilterGraph(IBaseFilter * iface, IFilterGraph *pGraph, LPCWSTR pName );
HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVendorInfo); HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVendorInfo);
LONG WINAPI BaseFilterImpl_GetPinVersion(BaseFilter* This);
VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter* This); VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter* This);
HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable); HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable);