Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/enumpins.c | 39 +++++++++++++------------------- dlls/strmbase/filter.c | 21 ++++++----------- dlls/strmbase/strmbase_private.h | 4 +--- include/wine/strmbase.h | 4 +--- 4 files changed, 25 insertions(+), 43 deletions(-)
diff --git a/dlls/strmbase/enumpins.c b/dlls/strmbase/enumpins.c index 65a11bd34e..7aa66112c4 100644 --- a/dlls/strmbase/enumpins.c +++ b/dlls/strmbase/enumpins.c @@ -29,9 +29,6 @@ typedef struct IEnumPinsImpl LONG refCount; ULONG uIndex; BaseFilter *base; - BaseFilter_GetPin receive_pin; - BaseFilter_GetPinCount receive_pincount; - BaseFilter_GetPinVersion receive_version; DWORD Version; } IEnumPinsImpl;
@@ -42,7 +39,7 @@ static inline IEnumPinsImpl *impl_from_IEnumPins(IEnumPins *iface)
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;
@@ -58,13 +55,10 @@ HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin receive_p pEnumPins->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl; pEnumPins->refCount = 1; pEnumPins->uIndex = 0; - pEnumPins->receive_pin = receive_pin; - pEnumPins->receive_pincount = receive_pincount; - pEnumPins->receive_version = receive_version; pEnumPins->base = base; IBaseFilter_AddRef(&base->IBaseFilter_iface); *ppEnum = &pEnumPins->IEnumPins_iface; - pEnumPins->Version = receive_version(base); + pEnumPins->Version = base->pin_version;
TRACE("Created new enumerator (%p)\n", *ppEnum); return S_OK; @@ -134,13 +128,13 @@ static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin ** if (pcFetched) *pcFetched = 0;
- if (This->Version != This->receive_version(This->base)) + if (This->Version != This->base->pin_version) return VFW_E_ENUM_OUT_OF_SYNC;
while (i < cPins) { IPin *pin; - pin = This->receive_pin(This->base, This->uIndex + i); + pin = This->base->pFuncsTable->pfnGetPin(This->base, This->uIndex + i);
if (!pin) break; @@ -164,39 +158,38 @@ static HRESULT WINAPI IEnumPinsImpl_Skip(IEnumPins *iface, ULONG 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;
- 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;
enum_pins->uIndex += count; 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; }
-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; - 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)) + if (FAILED(hr = enum_pins_create(enum_pins->base, out))) return hr; - return IEnumPins_Skip(*ppEnum, This->uIndex); + return IEnumPins_Skip(*out, enum_pins->uIndex); }
static const IEnumPinsVtbl IEnumPinsImpl_Vtbl = diff --git a/dlls/strmbase/filter.c b/dlls/strmbase/filter.c index 50340cd9b5..ed0039f2ea 100644 --- a/dlls/strmbase/filter.c +++ b/dlls/strmbase/filter.c @@ -125,13 +125,13 @@ HRESULT WINAPI BaseFilterImpl_GetSyncSource(IBaseFilter * iface, IReferenceClock 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) @@ -206,16 +206,9 @@ HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVend return E_NOTIMPL; }
-LONG WINAPI BaseFilterImpl_GetPinVersion(BaseFilter * This) -{ - TRACE("(%p)\n", This); - return This->pinVersion; -} - -VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter * This) +VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter *filter) { - InterlockedIncrement(&This->pinVersion); - TRACE("(%p) -> New pinVersion %i\n", This,This->pinVersion); + InterlockedIncrement(&filter->pin_version); }
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)); This->clsid = *pClsid; This->csFilter.DebugInfo->Spare[0] = DebugInfo; - This->pinVersion = 1; + This->pin_version = 1;
This->pFuncsTable = pBaseFuncsTable;
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h index f3367f88c5..de13a530c6 100644 --- a/dlls/strmbase/strmbase_private.h +++ b/dlls/strmbase/strmbase_private.h @@ -63,9 +63,7 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv); void QualityControlRender_BeginRender(QualityControlImpl *This); void QualityControlRender_EndRender(QualityControlImpl *This);
-HRESULT WINAPI EnumPins_Construct(BaseFilter *base, BaseFilter_GetPin pfn_get_pin, - BaseFilter_GetPinCount pfn_get_pin_count, BaseFilter_GetPinVersion pfn_get_pin_version, - IEnumPins **enum_pins); +HRESULT enum_pins_create(BaseFilter *base, IEnumPins **enum_pins);
HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start); HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface); diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 120642c101..477f162120 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -163,14 +163,13 @@ typedef struct BaseFilter IReferenceClock * pClock; FILTER_INFO filterInfo; CLSID clsid; - LONG pinVersion; + LONG pin_version;
const struct BaseFilterFuncTable* pFuncsTable; } BaseFilter;
typedef IPin* (WINAPI *BaseFilter_GetPin)(BaseFilter* iface, int iPosition); typedef LONG (WINAPI *BaseFilter_GetPinCount)(BaseFilter* iface); -typedef LONG (WINAPI *BaseFilter_GetPinVersion)(BaseFilter* iface);
typedef struct BaseFilterFuncTable { /* 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_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVendorInfo);
-LONG WINAPI BaseFilterImpl_GetPinVersion(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);
strmbase assumes that pins are consecutive.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wineqtdecoder/qtsplitter.c | 44 +++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-)
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c index 4855069c31..614b8913b4 100644 --- a/dlls/wineqtdecoder/qtsplitter.c +++ b/dlls/wineqtdecoder/qtsplitter.c @@ -202,29 +202,35 @@ static inline QTSplitter *impl_from_IBaseFilter( IBaseFilter *iface ) * Base Filter */
-static IPin* WINAPI QT_GetPin(BaseFilter *iface, int pos) +static IPin * WINAPI QT_GetPin(BaseFilter *base, int index) { - QTSplitter *This = impl_from_BaseFilter(iface); - TRACE("Asking for pos %x\n", pos); + QTSplitter *filter = impl_from_BaseFilter(base);
- if (pos > 2 || pos < 0) - return NULL; - switch (pos) + if (index == 0) { - case 0: - IPin_AddRef(&This->pInputPin.pin.IPin_iface); - return &This->pInputPin.pin.IPin_iface; - case 1: - if (This->pVideo_Pin) - IPin_AddRef(&This->pVideo_Pin->pin.pin.IPin_iface); - return &This->pVideo_Pin->pin.pin.IPin_iface; - case 2: - if (This->pAudio_Pin) - IPin_AddRef(&This->pAudio_Pin->pin.pin.IPin_iface); - return &This->pAudio_Pin->pin.pin.IPin_iface; - default: - return NULL; + IPin_AddRef(&filter->pInputPin.pin.IPin_iface); + return &filter->pInputPin.pin.IPin_iface; } + else if (index == 1) + { + if (filter->pVideo_Pin) + { + IPin_AddRef(&filter->pVideo_Pin->pin.pin.IPin_iface); + return &filter->pVideo_Pin->pin.pin.IPin_iface; + } + else if (filter->pAudio_Pin) + { + IPin_AddRef(&filter->pAudio_Pin->pin.pin.IPin_iface); + return &filter->pAudio_Pin->pin.pin.IPin_iface; + } + } + else if (index == 2 && filter->pVideo_Pin && filter->pAudio_Pin) + { + IPin_AddRef(&filter->pAudio_Pin->pin.pin.IPin_iface); + return &filter->pAudio_Pin->pin.pin.IPin_iface; + } + + return NULL; }
static LONG WINAPI QT_GetPinCount(BaseFilter *iface)
Signed-off-by: Zebediah Figura z.figura12@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;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/amstream/mediastreamfilter.c | 8 -------- dlls/evr/evr.c | 7 ------- dlls/qcap/audiorecord.c | 8 -------- dlls/qcap/avico.c | 6 ------ dlls/qcap/avimux.c | 8 -------- dlls/qcap/smartteefilter.c | 5 ----- dlls/qcap/vfwcapture.c | 6 ------ dlls/qedit/samplegrabber.c | 6 ------ dlls/quartz/filesource.c | 13 ------------- dlls/quartz/parser.c | 10 ---------- dlls/strmbase/filter.c | 3 +-- dlls/strmbase/renderer.c | 6 ------ dlls/strmbase/transform.c | 6 ------ dlls/winegstreamer/gstdemux.c | 8 -------- dlls/wineqtdecoder/qtsplitter.c | 10 ---------- include/wine/strmbase.h | 2 -- 16 files changed, 1 insertion(+), 111 deletions(-)
diff --git a/dlls/amstream/mediastreamfilter.c b/dlls/amstream/mediastreamfilter.c index 8636718273..a61d1e767c 100644 --- a/dlls/amstream/mediastreamfilter.c +++ b/dlls/amstream/mediastreamfilter.c @@ -321,16 +321,8 @@ static IPin* WINAPI MediaStreamFilterImpl_GetPin(BaseFilter *iface, int pos) return NULL; }
-static LONG WINAPI MediaStreamFilterImpl_GetPinCount(BaseFilter *iface) -{ - IMediaStreamFilterImpl* This = (IMediaStreamFilterImpl*)iface; - - return This->nb_streams; -} - static const BaseFilterFuncTable BaseFuncTable = { MediaStreamFilterImpl_GetPin, - MediaStreamFilterImpl_GetPinCount };
HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, void **ppObj) diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c index ba5b5442bd..5ab6572e50 100644 --- a/dlls/evr/evr.c +++ b/dlls/evr/evr.c @@ -194,16 +194,9 @@ static IPin* WINAPI filter_GetPin(BaseFilter *iface, int position) return NULL; }
-static LONG WINAPI filter_GetPinCount(BaseFilter *iface) -{ - FIXME("(%p): stub!\n", iface); - return 0; -} - static const BaseFilterFuncTable basefilter_functable = { filter_GetPin, - filter_GetPinCount, };
HRESULT evr_filter_create(IUnknown *outer_unk, void **ppv) diff --git a/dlls/qcap/audiorecord.c b/dlls/qcap/audiorecord.c index 3674bbb95e..8fad7f75a8 100644 --- a/dlls/qcap/audiorecord.c +++ b/dlls/qcap/audiorecord.c @@ -177,16 +177,8 @@ static IPin* WINAPI AudioRecord_GetPin(BaseFilter *iface, int pos) return NULL; }
-static LONG WINAPI AudioRecord_GetPinCount(BaseFilter *iface) -{ - AudioRecord *This = impl_from_BaseFilter(iface); - FIXME("(%p): stub\n", This); - return 0; -} - static const BaseFilterFuncTable AudioRecordFuncs = { AudioRecord_GetPin, - AudioRecord_GetPinCount };
static HRESULT WINAPI PPB_QueryInterface(IPersistPropertyBag *iface, REFIID riid, LPVOID *ppv) diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index f8eade9eff..83a7804801 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -266,14 +266,8 @@ static IPin* WINAPI AVICompressor_GetPin(BaseFilter *iface, int pos) return ret; }
-static LONG WINAPI AVICompressor_GetPinCount(BaseFilter *iface) -{ - return 2; -} - static const BaseFilterFuncTable filter_func_table = { AVICompressor_GetPin, - AVICompressor_GetPinCount };
static AVICompressor *impl_from_IPersistPropertyBag(IPersistPropertyBag *iface) diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c index dd78d71a69..3a269a3259 100644 --- a/dlls/qcap/avimux.c +++ b/dlls/qcap/avimux.c @@ -133,16 +133,8 @@ static IPin* WINAPI AviMux_GetPin(BaseFilter *iface, int pos) return NULL; }
-static LONG WINAPI AviMux_GetPinCount(BaseFilter *iface) -{ - AviMux *This = impl_from_BaseFilter(iface); - TRACE("(%p)\n", This); - return This->input_pin_no+1; -} - static const BaseFilterFuncTable filter_func_table = { AviMux_GetPin, - AviMux_GetPinCount };
static inline AviMux* impl_from_IBaseFilter(IBaseFilter *iface) diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c index 4e22b95474..268e7a2209 100644 --- a/dlls/qcap/smartteefilter.c +++ b/dlls/qcap/smartteefilter.c @@ -224,13 +224,8 @@ static IPin* WINAPI SmartTeeFilter_GetPin(BaseFilter *iface, int pos) return ret; }
-static LONG WINAPI SmartTeeFilter_GetPinCount(BaseFilter *iface) -{ - return 3; -} static const BaseFilterFuncTable SmartTeeFilterFuncs = { SmartTeeFilter_GetPin, - SmartTeeFilter_GetPinCount };
static ULONG WINAPI SmartTeeFilterInput_AddRef(IPin *iface) diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c index 178609a200..0139dbca88 100644 --- a/dlls/qcap/vfwcapture.c +++ b/dlls/qcap/vfwcapture.c @@ -203,14 +203,8 @@ static IPin* WINAPI VfwCapture_GetPin(BaseFilter *iface, int pos) return This->pOutputPin; }
-static LONG WINAPI VfwCapture_GetPinCount(BaseFilter *iface) -{ - return 1; -} - static const BaseFilterFuncTable BaseFuncTable = { VfwCapture_GetPin, - VfwCapture_GetPinCount };
IUnknown * WINAPI QCAP_createVFWCaptureFilter(IUnknown *pUnkOuter, HRESULT *phr) diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c index e66a000af4..9474a5826c 100644 --- a/dlls/qedit/samplegrabber.c +++ b/dlls/qedit/samplegrabber.c @@ -354,14 +354,8 @@ static IPin *WINAPI SampleGrabber_GetPin(BaseFilter *iface, int pos) return pin; }
-static LONG WINAPI SampleGrabber_GetPinCount(BaseFilter *iface) -{ - return 2; -} - static const BaseFilterFuncTable basefunc_vtbl = { SampleGrabber_GetPin, - SampleGrabber_GetPinCount };
/* Helper that buffers data and/or calls installed sample callbacks */ diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index a54e9482e4..b4afae92ed 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -405,21 +405,8 @@ static IPin* WINAPI AsyncReader_GetPin(BaseFilter *iface, int pos) return This->pOutputPin; }
-static LONG WINAPI AsyncReader_GetPinCount(BaseFilter *iface) -{ - AsyncReader *This = impl_from_BaseFilter(iface); - - TRACE("%p->()\n", This); - - if (!This->pOutputPin) - return 0; - else - return 1; -} - static const BaseFilterFuncTable BaseFuncTable = { AsyncReader_GetPin, - AsyncReader_GetPinCount };
HRESULT AsyncReader_create(IUnknown * pUnkOuter, LPVOID * ppv) diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index c3b69cd30a..a8917d99ec 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -77,18 +77,8 @@ static IPin* WINAPI Parser_GetPin(BaseFilter *iface, int pos) return This->ppPins[pos]; }
-static LONG WINAPI Parser_GetPinCount(BaseFilter *iface) -{ - ParserImpl *This = impl_from_BaseFilter(iface); - - TRACE("%p->()\n", This); - - return This->cStreams + 1; -} - static const BaseFilterFuncTable BaseFuncTable = { Parser_GetPin, - Parser_GetPinCount };
HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *Parser_Vtbl, diff --git a/dlls/strmbase/filter.c b/dlls/strmbase/filter.c index ed0039f2ea..44e0188ce0 100644 --- a/dlls/strmbase/filter.c +++ b/dlls/strmbase/filter.c @@ -144,9 +144,8 @@ HRESULT WINAPI BaseFilterImpl_FindPin(IBaseFilter *iface, const WCHAR *id, IPin
TRACE("(%p)->(%s, %p)\n", This, debugstr_w(id), ret);
- for (i = 0; i < This->pFuncsTable->pfnGetPinCount(This); ++i) + for (i = 0; (pin = This->pFuncsTable->pfnGetPin(This, i)); ++i) { - pin = This->pFuncsTable->pfnGetPin(This, i); hr = IPin_QueryPinInfo(pin, &info); if (FAILED(hr)) { diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index 52e753fb97..c3571029d4 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -194,11 +194,6 @@ static IPin* WINAPI BaseRenderer_GetPin(BaseFilter *iface, int pos) return &This->pInputPin->pin.IPin_iface; }
-static LONG WINAPI BaseRenderer_GetPinCount(BaseFilter *iface) -{ - return 1; -} - static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE * pmt) { BaseRenderer *This = impl_from_IBaseFilter(pin->pinInfo.pFilter); @@ -213,7 +208,6 @@ static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample * pSa
static const BaseFilterFuncTable RendererBaseFilterFuncTable = { BaseRenderer_GetPin, - BaseRenderer_GetPinCount };
static const BaseInputPinFuncTable input_BaseInputFuncTable = { diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 544b77a66d..78796cc54b 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -139,14 +139,8 @@ static IPin *WINAPI TransformFilter_GetPin(BaseFilter *iface, int index) return filter->ppPins[index]; }
-static LONG WINAPI TransformFilter_GetPinCount(BaseFilter *iface) -{ - return 2; -} - static const BaseFilterFuncTable tfBaseFuncTable = { TransformFilter_GetPin, - TransformFilter_GetPinCount };
static const BaseInputPinFuncTable tf_input_BaseInputFuncTable = { diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index fd4bb4824e..e6c7da8b15 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1206,16 +1206,8 @@ static IPin* WINAPI GST_GetPin(BaseFilter *iface, int pos) return pin; }
-static LONG WINAPI GST_GetPinCount(BaseFilter *iface) -{ - GSTImpl *This = (GSTImpl *)iface; - TRACE("%p -> %u\n", This, This->cStreams + 1); - return (This->cStreams + 1); -} - static const BaseFilterFuncTable BaseFuncTable = { GST_GetPin, - GST_GetPinCount };
IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *pUnkOuter, HRESULT *phr) diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c index 614b8913b4..19042ed5d1 100644 --- a/dlls/wineqtdecoder/qtsplitter.c +++ b/dlls/wineqtdecoder/qtsplitter.c @@ -233,18 +233,8 @@ static IPin * WINAPI QT_GetPin(BaseFilter *base, int index) return NULL; }
-static LONG WINAPI QT_GetPinCount(BaseFilter *iface) -{ - QTSplitter *This = impl_from_BaseFilter(iface); - int c = 1; - if (This->pAudio_Pin) c++; - if (This->pVideo_Pin) c++; - return c; -} - static const BaseFilterFuncTable BaseFuncTable = { QT_GetPin, - QT_GetPinCount };
IUnknown * CALLBACK QTSplitter_create(IUnknown *punkout, HRESULT *phr) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 477f162120..4e0d190332 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -169,12 +169,10 @@ typedef struct BaseFilter } BaseFilter;
typedef IPin* (WINAPI *BaseFilter_GetPin)(BaseFilter* iface, int iPosition); -typedef LONG (WINAPI *BaseFilter_GetPinCount)(BaseFilter* iface);
typedef struct BaseFilterFuncTable { /* Required */ BaseFilter_GetPin pfnGetPin; - BaseFilter_GetPinCount pfnGetPinCount; } BaseFilterFuncTable;
HRESULT WINAPI BaseFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 98 +++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 46 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index e6c7da8b15..8e9278dca9 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -90,6 +90,11 @@ struct GSTOutPin { SourceSeeking seek; };
+static inline GSTImpl *impl_from_IBaseFilter(IBaseFilter *iface) +{ + return CONTAINING_RECORD(iface, GSTImpl, filter.IBaseFilter_iface); +} + const char* media_quark_string = "media-sample";
static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0}; @@ -288,7 +293,7 @@ static gboolean accept_caps_sink(GstPad *pad, GstCaps *caps) static gboolean setcaps_sink(GstPad *pad, GstCaps *caps) { GSTOutPin *pin = gst_pad_get_element_private(pad); - GSTImpl *This = (GSTImpl *)pin->pin.pin.pinInfo.pFilter; + GSTImpl *This = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter); AM_MEDIA_TYPE amt; GstStructure *arg; const char *typename; @@ -466,7 +471,7 @@ static gboolean event_sink(GstPad *pad, GstObject *parent, GstEvent *event) IPin_EndOfStream(pin->pin.pin.pConnectedTo); return TRUE; case GST_EVENT_FLUSH_START: - if (((GSTImpl *)pin->pin.pin.pinInfo.pFilter)->ignore_flush) { + if (impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter)->ignore_flush) { /* gst-plugins-base prior to 1.7 contains a bug which causes * our sink pins to receive a flush-start event when the * decodebin changes from PAUSED to READY (including @@ -601,7 +606,7 @@ static DWORD CALLBACK push_data(LPVOID iface) static GstFlowReturn got_data_sink(GstPad *pad, GstObject *parent, GstBuffer *buf) { GSTOutPin *pin = gst_pad_get_element_private(pad); - GSTImpl *This = (GSTImpl *)pin->pin.pin.pinInfo.pFilter; + GSTImpl *This = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter); HRESULT hr; BYTE *ptr = NULL; IMediaSample *sample; @@ -1093,7 +1098,7 @@ static void unknown_type(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer u
static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props) { - GSTImpl *This = (GSTImpl*)pPin->pin.pinInfo.pFilter; + GSTImpl *This = impl_from_IBaseFilter(pPin->pin.pinInfo.pFilter); int ret, i; LONGLONG avail, duration; GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE( @@ -1187,9 +1192,9 @@ static inline GSTOutPin *impl_from_IMediaSeeking( IMediaSeeking *iface ) return CONTAINING_RECORD(iface, GSTOutPin, seek.IMediaSeeking_iface); }
-static IPin* WINAPI GST_GetPin(BaseFilter *iface, int pos) +static IPin* WINAPI GST_GetPin(BaseFilter *base, int pos) { - GSTImpl *This = (GSTImpl *)iface; + GSTImpl *This = impl_from_IBaseFilter(&base->IBaseFilter_iface); IPin *pin;
TRACE("%p: Asking for pos %x\n", This, pos); @@ -1299,7 +1304,7 @@ static void GST_Destroy(GSTImpl *This)
static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv) { - GSTImpl *This = (GSTImpl *)iface; + GSTImpl *This = impl_from_IBaseFilter(iface);
TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
@@ -1327,7 +1332,7 @@ static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID
static ULONG WINAPI GST_Release(IBaseFilter *iface) { - GSTImpl *This = (GSTImpl *)iface; + GSTImpl *This = impl_from_IBaseFilter(iface); ULONG refCount = InterlockedDecrement(&This->filter.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1); @@ -1340,7 +1345,7 @@ static ULONG WINAPI GST_Release(IBaseFilter *iface)
static HRESULT WINAPI GST_Stop(IBaseFilter *iface) { - GSTImpl *This = (GSTImpl *)iface; + GSTImpl *This = impl_from_IBaseFilter(iface);
TRACE("(%p)\n", This);
@@ -1357,8 +1362,8 @@ static HRESULT WINAPI GST_Stop(IBaseFilter *iface)
static HRESULT WINAPI GST_Pause(IBaseFilter *iface) { + GSTImpl *This = impl_from_IBaseFilter(iface); HRESULT hr = S_OK; - GSTImpl *This = (GSTImpl *)iface; GstState now; GstStateChangeReturn ret;
@@ -1384,8 +1389,8 @@ static HRESULT WINAPI GST_Pause(IBaseFilter *iface)
static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart) { + GSTImpl *This = impl_from_IBaseFilter(iface); HRESULT hr = S_OK; - GSTImpl *This = (GSTImpl *)iface; ULONG i; GstState now; HRESULT hr_any = VFW_E_NOT_CONNECTED; @@ -1430,7 +1435,7 @@ static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
static HRESULT WINAPI GST_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState) { - GSTImpl *This = (GSTImpl *)iface; + GSTImpl *This = impl_from_IBaseFilter(iface); HRESULT hr = S_OK; GstState now, pending; GstStateChangeReturn ret; @@ -1700,9 +1705,14 @@ static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl = { GST_QualityControl_SetSink };
+static inline GSTOutPin *impl_source_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, GSTOutPin, pin.pin.IPin_iface); +} + static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **ppv) { - GSTOutPin *This = (GSTOutPin *)iface; + GSTOutPin *This = impl_source_from_IPin(iface);
TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
@@ -1727,7 +1737,7 @@ static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **
static ULONG WINAPI GSTOutPin_Release(IPin *iface) { - GSTOutPin *This = (GSTOutPin *)iface; + GSTOutPin *This = impl_source_from_IPin(iface); ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1); @@ -1770,7 +1780,7 @@ static HRESULT WINAPI GSTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYP
static HRESULT WINAPI GSTOutPin_GetMediaType(BasePin *iface, int iPosition, AM_MEDIA_TYPE *pmt) { - GSTOutPin *This = (GSTOutPin *)iface; + GSTOutPin *This = impl_source_from_IPin(&iface->IPin_iface);
TRACE("(%p)->(%i, %p)\n", This, iPosition, pmt);
@@ -1787,19 +1797,19 @@ static HRESULT WINAPI GSTOutPin_GetMediaType(BasePin *iface, int iPosition, AM_M
static HRESULT WINAPI GSTOutPin_DecideBufferSize(BaseOutputPin *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest) { - GSTOutPin *This = (GSTOutPin *)iface; + GSTOutPin *This = impl_source_from_IPin(&iface->pin.IPin_iface); TRACE("(%p)->(%p, %p)\n", This, pAlloc, ppropInputRequest); /* Unused */ return S_OK; }
-static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *iface, IMemInputPin *pPin, IMemAllocator **pAlloc) +static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *base, IMemInputPin *pPin, IMemAllocator **pAlloc) { + GSTOutPin *pin = impl_source_from_IPin(&base->pin.IPin_iface); + GSTImpl *GSTfilter = impl_from_IBaseFilter(pin->pin.pin.pinInfo.pFilter); HRESULT hr; - GSTOutPin *This = (GSTOutPin *)iface; - GSTImpl *GSTfilter = (GSTImpl*)This->pin.pin.pinInfo.pFilter;
- TRACE("(%p)->(%p, %p)\n", This, pPin, pAlloc); + TRACE("pin %p, peer %p, allocator %p.\n", pin, pPin, pAlloc);
*pAlloc = NULL; if (GSTfilter->pInputPin.pAlloc) @@ -1923,9 +1933,14 @@ static HRESULT GST_RemoveOutputPins(GSTImpl *This) return S_OK; }
+static inline GSTInPin *impl_sink_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, GSTInPin, pin.IPin_iface); +} + static ULONG WINAPI GSTInPin_Release(IPin *iface) { - GSTInPin *This = (GSTInPin*)iface; + GSTInPin *This = impl_sink_from_IPin(iface); ULONG refCount = InterlockedDecrement(&This->pin.refCount);
TRACE("(%p)->() Release from %d\n", iface, refCount + 1); @@ -1945,9 +1960,9 @@ static ULONG WINAPI GSTInPin_Release(IPin *iface)
static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { + GSTInPin *This = impl_sink_from_IPin(iface); PIN_DIRECTION pindirReceive; HRESULT hr = S_OK; - GSTInPin *This = (GSTInPin*)iface;
TRACE("(%p/%p)->(%p, %p)\n", This, iface, pReceivePin, pmt); dump_AM_MEDIA_TYPE(pmt); @@ -1977,7 +1992,7 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
This->pReader = NULL; This->pAlloc = NULL; - ResetEvent(((GSTImpl *)This->pin.pinInfo.pFilter)->push_event); + ResetEvent(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->push_event); if (SUCCEEDED(hr)) hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader); if (SUCCEEDED(hr)) @@ -2000,9 +2015,9 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, This->pin.pConnectedTo = pReceivePin; IPin_AddRef(pReceivePin); hr = IMemAllocator_Commit(This->pAlloc); - SetEvent(((GSTImpl*)This->pin.pinInfo.pFilter)->push_event); + SetEvent(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->push_event); } else { - GST_RemoveOutputPins((GSTImpl *)This->pin.pinInfo.pFilter); + GST_RemoveOutputPins(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)); if (This->pReader) IAsyncReader_Release(This->pReader); This->pReader = NULL; @@ -2019,8 +2034,8 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface) { + GSTInPin *This = impl_sink_from_IPin(iface); HRESULT hr; - GSTInPin *This = (GSTInPin*)iface; FILTER_STATE state;
TRACE("(%p)\n", This); @@ -2030,7 +2045,7 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface) hr = IBaseFilter_GetState(This->pin.pinInfo.pFilter, INFINITE, &state); EnterCriticalSection(This->pin.pCritSec); if (This->pin.pConnectedTo) { - GSTImpl *Parser = (GSTImpl *)This->pin.pinInfo.pFilter; + GSTImpl *Parser = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
if (SUCCEEDED(hr) && state == State_Stopped) { IMemAllocator_Decommit(This->pAlloc); @@ -2048,7 +2063,7 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
static HRESULT WINAPI GSTInPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt) { - GSTInPin *This = (GSTInPin*)iface; + GSTInPin *This = impl_sink_from_IPin(iface);
TRACE("(%p)->(%p)\n", This, pmt); dump_AM_MEDIA_TYPE(pmt); @@ -2060,44 +2075,35 @@ static HRESULT WINAPI GSTInPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt
static HRESULT WINAPI GSTInPin_EndOfStream(IPin *iface) { - GSTInPin *pin = (GSTInPin*)iface; - GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter; - - FIXME("Propagate message on %p\n", This); + FIXME("iface %p, stub!\n", iface); return S_OK; }
static HRESULT WINAPI GSTInPin_BeginFlush(IPin *iface) { - GSTInPin *pin = (GSTInPin*)iface; - GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter; - - FIXME("Propagate message on %p\n", This); + FIXME("iface %p, stub!\n", iface); return S_OK; }
static HRESULT WINAPI GSTInPin_EndFlush(IPin *iface) { - GSTInPin *pin = (GSTInPin*)iface; - GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter; - - FIXME("Propagate message on %p\n", This); + FIXME("iface %p, stub!\n", iface); return S_OK; }
-static HRESULT WINAPI GSTInPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) +static HRESULT WINAPI GSTInPin_NewSegment(IPin *iface, REFERENCE_TIME start, + REFERENCE_TIME stop, double rate) { - GSTInPin *pin = (GSTInPin*)iface; - GSTImpl *This = (GSTImpl*)pin->pin.pinInfo.pFilter; + FIXME("iface %p, start %s, stop %s, rate %.16e, stub!\n", + iface, wine_dbgstr_longlong(start), wine_dbgstr_longlong(stop), rate);
- BasePinImpl_NewSegment(iface, tStart, tStop, dRate); - FIXME("Propagate message on %p\n", This); + BasePinImpl_NewSegment(iface, start, stop, rate); return S_OK; }
static HRESULT WINAPI GSTInPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv) { - GSTInPin *This = (GSTInPin*)iface; + GSTInPin *This = impl_sink_from_IPin(iface);
TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);