Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/enumpins.c | 33 ++++++++++++++++---------------- dlls/strmbase/strmbase_private.h | 1 + 2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/dlls/strmbase/enumpins.c b/dlls/strmbase/enumpins.c index 15d6cab8df..4503a4705e 100644 --- a/dlls/strmbase/enumpins.c +++ b/dlls/strmbase/enumpins.c @@ -39,36 +39,35 @@ static inline IEnumPinsImpl *impl_from_IEnumPins(IEnumPins *iface)
static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl;
-HRESULT enum_pins_create(BaseFilter *base, IEnumPins **ppEnum) +HRESULT enum_pins_create(BaseFilter *base, IEnumPins **out) { - IEnumPinsImpl * pEnumPins; + IEnumPinsImpl *object; IPin *pin;
- if (!ppEnum) + if (!out) return E_POINTER;
- pEnumPins = CoTaskMemAlloc(sizeof(IEnumPinsImpl)); - if (!pEnumPins) + if (!(object = heap_alloc_zero(sizeof(*object)))) { - *ppEnum = NULL; + *out = NULL; return E_OUTOFMEMORY; } - pEnumPins->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl; - pEnumPins->refCount = 1; - pEnumPins->uIndex = 0; - pEnumPins->base = base; + + object->IEnumPins_iface.lpVtbl = &IEnumPinsImpl_Vtbl; + object->refCount = 1; + object->base = base; IBaseFilter_AddRef(&base->IBaseFilter_iface); - *ppEnum = &pEnumPins->IEnumPins_iface; - pEnumPins->Version = base->pin_version; - pEnumPins->count = 0; + object->Version = base->pin_version;
- while ((pin = base->pFuncsTable->pfnGetPin(base, pEnumPins->count))) + while ((pin = base->pFuncsTable->pfnGetPin(base, object->count))) { IPin_Release(pin); - ++pEnumPins->count; + ++object->count; }
- TRACE("Created new enumerator (%p)\n", *ppEnum); + TRACE("Created enumerator %p.\n", object); + *out = &object->IEnumPins_iface; + return S_OK; }
@@ -114,7 +113,7 @@ static ULONG WINAPI IEnumPinsImpl_Release(IEnumPins * iface) if (!ref) { IBaseFilter_Release(&This->base->IBaseFilter_iface); - CoTaskMemFree(This); + heap_free(This); }
return ref; diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h index de13a530c6..fc1e27dd72 100644 --- a/dlls/strmbase/strmbase_private.h +++ b/dlls/strmbase/strmbase_private.h @@ -28,6 +28,7 @@ #include "dshow.h" #include "uuids.h" #include "wine/debug.h" +#include "wine/heap.h" #include "wine/list.h" #include "wine/strmbase.h" #include "wine/unicode.h"
It's just entirely unnecessary.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/mediatype.c | 39 ++++----------------------------------- 1 file changed, 4 insertions(+), 35 deletions(-)
diff --git a/dlls/strmbase/mediatype.c b/dlls/strmbase/mediatype.c index cd8e909b47..743936ff39 100644 --- a/dlls/strmbase/mediatype.c +++ b/dlls/strmbase/mediatype.c @@ -80,7 +80,6 @@ void WINAPI DeleteMediaType(AM_MEDIA_TYPE * pMediaType) typedef struct tagENUMEDIADETAILS { ULONG cMediaTypes; - AM_MEDIA_TYPE * pMediaTypes; } ENUMMEDIADETAILS;
typedef struct IEnumMediaTypesImpl @@ -129,18 +128,6 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType e }
pEnumMediaTypes->enumMediaDetails.cMediaTypes = i; - pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i); - memset(pEnumMediaTypes->enumMediaDetails.pMediaTypes, 0, sizeof(AM_MEDIA_TYPE) * i); - for (i = 0; i < pEnumMediaTypes->enumMediaDetails.cMediaTypes; i++) - { - HRESULT hr; - - if (FAILED(hr = enumFunc(basePin, i, &pEnumMediaTypes->enumMediaDetails.pMediaTypes[i]))) - { - IEnumMediaTypes_Release(&pEnumMediaTypes->IEnumMediaTypes_iface); - return hr; - } - } *ppEnum = &pEnumMediaTypes->IEnumMediaTypes_iface; pEnumMediaTypes->currentVersion = versionFunc(basePin); return S_OK; @@ -184,10 +171,6 @@ static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
if (!ref) { - ULONG i; - for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) - FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); - CoTaskMemFree(This->enumMediaDetails.pMediaTypes); IPin_Release(&This->basePin->IPin_iface); CoTaskMemFree(This); } @@ -212,13 +195,16 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cM { ULONG i; for (i = 0; i < cFetched; i++) - if (!(ppMediaTypes[i] = CreateMediaType(&This->enumMediaDetails.pMediaTypes[This->uIndex + i]))) + { + if (!(ppMediaTypes[i] = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE))) + || FAILED(This->enumMediaFunction(This->basePin, This->uIndex + i, ppMediaTypes[i]))) { while (i--) DeleteMediaType(ppMediaTypes[i]); *pcFetched = 0; return E_OUTOFMEMORY; } + } }
if ((cMediaTypes != 1) || pcFetched) @@ -256,30 +242,13 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface)
TRACE("(%p)->()\n", iface);
- for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) - FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); - CoTaskMemFree(This->enumMediaDetails.pMediaTypes); - i = 0; while (This->enumMediaFunction(This->basePin, i, &amt) == S_OK) { FreeMediaType(&amt); i++; } - This->enumMediaDetails.cMediaTypes = i; - This->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i); - for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) - { - if (FAILED(This->enumMediaFunction(This->basePin, i, &This->enumMediaDetails.pMediaTypes[i]))) - { - while (i--) - FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); - CoTaskMemFree(This->enumMediaDetails.pMediaTypes); - return E_OUTOFMEMORY; - } - } - This->currentVersion = This->mediaVersionFunction(This->basePin); This->uIndex = 0;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52234
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/mediatype.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/dlls/strmbase/mediatype.c b/dlls/strmbase/mediatype.c index 743936ff39..8ad2e22efc 100644 --- a/dlls/strmbase/mediatype.c +++ b/dlls/strmbase/mediatype.c @@ -77,11 +77,6 @@ void WINAPI DeleteMediaType(AM_MEDIA_TYPE * pMediaType) CoTaskMemFree(pMediaType); }
-typedef struct tagENUMEDIADETAILS -{ - ULONG cMediaTypes; -} ENUMMEDIADETAILS; - typedef struct IEnumMediaTypesImpl { IEnumMediaTypes IEnumMediaTypes_iface; @@ -90,7 +85,7 @@ typedef struct IEnumMediaTypesImpl BasePin_GetMediaType enumMediaFunction; BasePin_GetMediaTypeVersion mediaVersionFunction; LONG currentVersion; - ENUMMEDIADETAILS enumMediaDetails; + ULONG count; ULONG uIndex; } IEnumMediaTypesImpl;
@@ -127,7 +122,7 @@ HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType e i++; }
- pEnumMediaTypes->enumMediaDetails.cMediaTypes = i; + pEnumMediaTypes->count = i; *ppEnum = &pEnumMediaTypes->IEnumMediaTypes_iface; pEnumMediaTypes->currentVersion = versionFunc(basePin); return S_OK; @@ -184,7 +179,7 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cM
TRACE("(%p)->(%u, %p, %p)\n", iface, cMediaTypes, ppMediaTypes, pcFetched);
- cFetched = min(This->enumMediaDetails.cMediaTypes, This->uIndex + cMediaTypes) - This->uIndex; + cFetched = min(This->count, This->uIndex + cMediaTypes) - This->uIndex;
if (This->currentVersion != This->mediaVersionFunction(This->basePin)) return VFW_E_ENUM_OUT_OF_SYNC; @@ -226,7 +221,7 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Skip(IEnumMediaTypes * iface, ULONG cM if (This->currentVersion != This->mediaVersionFunction(This->basePin)) return VFW_E_ENUM_OUT_OF_SYNC;
- if (This->uIndex + cMediaTypes < This->enumMediaDetails.cMediaTypes) + if (This->uIndex + cMediaTypes < This->count) { This->uIndex += cMediaTypes; return S_OK; @@ -248,7 +243,7 @@ static HRESULT WINAPI IEnumMediaTypesImpl_Reset(IEnumMediaTypes * iface) FreeMediaType(&amt); i++; } - This->enumMediaDetails.cMediaTypes = i; + This->count = i; This->currentVersion = This->mediaVersionFunction(This->basePin); This->uIndex = 0;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52235
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/audiorecord.c | 18 +++++------------- dlls/strmbase/filter.c | 5 ++--- include/wine/strmbase.h | 3 ++- 3 files changed, 9 insertions(+), 17 deletions(-)
diff --git a/dlls/qcap/audiorecord.c b/dlls/qcap/audiorecord.c index 8fad7f75a8..12b62a4a81 100644 --- a/dlls/qcap/audiorecord.c +++ b/dlls/qcap/audiorecord.c @@ -254,15 +254,14 @@ static const IPersistPropertyBagVtbl PersistPropertyBagVtbl =
IUnknown* WINAPI QCAP_createAudioCaptureFilter(IUnknown *outer, HRESULT *phr) { - HRESULT hr; AudioRecord *This = NULL;
FIXME("(%p, %p): the entire CLSID_AudioRecord implementation is just stubs\n", outer, phr);
This = CoTaskMemAlloc(sizeof(*This)); if (This == NULL) { - hr = E_OUTOFMEMORY; - goto end; + *phr = E_OUTOFMEMORY; + return NULL; } memset(This, 0, sizeof(*This)); This->IUnknown_iface.lpVtbl = &UnknownVtbl; @@ -272,16 +271,9 @@ IUnknown* WINAPI QCAP_createAudioCaptureFilter(IUnknown *outer, HRESULT *phr) else This->outerUnknown = &This->IUnknown_iface;
- hr = BaseFilter_Init(&This->filter, &AudioRecordVtbl, &CLSID_AudioRecord, + BaseFilter_Init(&This->filter, &AudioRecordVtbl, &CLSID_AudioRecord, (DWORD_PTR)(__FILE__ ": AudioRecord.csFilter"), &AudioRecordFuncs);
-end: - *phr = hr; - if (SUCCEEDED(hr)) { - return (IUnknown*)&This->filter.IBaseFilter_iface; - } else { - if (This) - IBaseFilter_Release(&This->filter.IBaseFilter_iface); - return NULL; - } + *phr = S_OK; + return (IUnknown*)&This->filter.IBaseFilter_iface; } diff --git a/dlls/strmbase/filter.c b/dlls/strmbase/filter.c index 44e0188ce0..3a39ec4e06 100644 --- a/dlls/strmbase/filter.c +++ b/dlls/strmbase/filter.c @@ -210,7 +210,8 @@ VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter *filter) InterlockedIncrement(&filter->pin_version); }
-HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable) +void BaseFilter_Init(BaseFilter *This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, + DWORD_PTR DebugInfo, const BaseFilterFuncTable *pBaseFuncsTable) { This->IBaseFilter_iface.lpVtbl = Vtbl; This->refCount = 1; @@ -224,8 +225,6 @@ HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, c This->pin_version = 1;
This->pFuncsTable = pBaseFuncsTable; - - return S_OK; }
HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 4e0d190332..eb0bfbfb79 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -190,7 +190,8 @@ HRESULT WINAPI BaseFilterImpl_QueryVendorInfo(IBaseFilter * iface, LPWSTR *pVend
VOID WINAPI BaseFilterImpl_IncrementPinVersion(BaseFilter* This);
-HRESULT WINAPI BaseFilter_Init(BaseFilter * This, const IBaseFilterVtbl *Vtbl, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseFilterFuncTable* pBaseFuncsTable); +void BaseFilter_Init(BaseFilter *filter, const IBaseFilterVtbl *vtbl, + const CLSID *clsid, DWORD_PTR debug_info, const BaseFilterFuncTable *func_table); HRESULT WINAPI BaseFilter_Destroy(BaseFilter * This);
/* Enums */
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52236
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 error: patch failed: dlls/strmbase/filter.c:210 error: patch failed: include/wine/strmbase.h:190 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 error: patch failed: dlls/strmbase/filter.c:210 error: patch failed: include/wine/strmbase.h:190 Task: Patch failed to apply
Reordering some functions to avoid forward declarations.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/acmwrapper.c | 24 +--- dlls/quartz/avidec.c | 24 +--- dlls/strmbase/transform.c | 213 +++++++++++++++++-------------- dlls/winegstreamer/gsttffilter.c | 23 +--- dlls/wineqtdecoder/qtvdecoder.c | 24 +--- include/wine/strmbase.h | 8 +- 6 files changed, 127 insertions(+), 189 deletions(-)
diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c index 77256b7acb..b38f435931 100644 --- a/dlls/quartz/acmwrapper.c +++ b/dlls/quartz/acmwrapper.c @@ -51,8 +51,6 @@ typedef struct ACMWrapperImpl LONGLONG lasttime_sent; } ACMWrapperImpl;
-static const IBaseFilterVtbl ACMWrapper_Vtbl; - static inline ACMWrapperImpl *impl_from_TransformFilter( TransformFilter *iface ) { return CONTAINING_RECORD(iface, ACMWrapperImpl, tf); @@ -389,7 +387,8 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv) if (pUnkOuter) return CLASS_E_NOAGGREGATION;
- hr = TransformFilter_Construct(&ACMWrapper_Vtbl, sizeof(ACMWrapperImpl), &CLSID_ACMWrapper, &ACMWrapper_FuncsTable, (IBaseFilter**)&This); + hr = strmbase_transform_create(sizeof(ACMWrapperImpl), &CLSID_ACMWrapper, + &ACMWrapper_FuncsTable, (IBaseFilter **)&This);
if (FAILED(hr)) return hr; @@ -399,22 +398,3 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv)
return hr; } - -static const IBaseFilterVtbl ACMWrapper_Vtbl = -{ - TransformFilterImpl_QueryInterface, - BaseFilterImpl_AddRef, - TransformFilterImpl_Release, - BaseFilterImpl_GetClassID, - TransformFilterImpl_Stop, - TransformFilterImpl_Pause, - TransformFilterImpl_Run, - BaseFilterImpl_GetState, - BaseFilterImpl_SetSyncSource, - BaseFilterImpl_GetSyncSource, - BaseFilterImpl_EnumPins, - BaseFilterImpl_FindPin, - BaseFilterImpl_QueryFilterInfo, - BaseFilterImpl_JoinFilterGraph, - BaseFilterImpl_QueryVendorInfo -}; diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index f8e4a9c137..a12cad12b5 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -50,8 +50,6 @@ typedef struct AVIDecImpl REFERENCE_TIME late; } AVIDecImpl;
-static const IBaseFilterVtbl AVIDec_Vtbl; - static inline AVIDecImpl *impl_from_TransformFilter( TransformFilter *iface ) { return CONTAINING_RECORD(iface, AVIDecImpl, tf); @@ -404,7 +402,8 @@ HRESULT AVIDec_create(IUnknown * pUnkOuter, LPVOID * ppv) if (pUnkOuter) return CLASS_E_NOAGGREGATION;
- hr = TransformFilter_Construct(&AVIDec_Vtbl, sizeof(AVIDecImpl), &CLSID_AVIDec, &AVIDec_FuncsTable, (IBaseFilter**)&This); + hr = strmbase_transform_create(sizeof(AVIDecImpl), &CLSID_AVIDec, + &AVIDec_FuncsTable, (IBaseFilter **)&This);
if (FAILED(hr)) return hr; @@ -417,22 +416,3 @@ HRESULT AVIDec_create(IUnknown * pUnkOuter, LPVOID * ppv)
return hr; } - -static const IBaseFilterVtbl AVIDec_Vtbl = -{ - TransformFilterImpl_QueryInterface, - BaseFilterImpl_AddRef, - TransformFilterImpl_Release, - BaseFilterImpl_GetClassID, - TransformFilterImpl_Stop, - TransformFilterImpl_Pause, - TransformFilterImpl_Run, - BaseFilterImpl_GetState, - BaseFilterImpl_SetSyncSource, - BaseFilterImpl_GetSyncSource, - BaseFilterImpl_EnumPins, - BaseFilterImpl_FindPin, - BaseFilterImpl_QueryFilterInfo, - BaseFilterImpl_JoinFilterGraph, - BaseFilterImpl_QueryVendorInfo -}; diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 78796cc54b..df16b67cb3 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -161,95 +161,7 @@ static const BaseOutputPinFuncTable tf_output_BaseOutputFuncTable = { BaseOutputPinImpl_DecideAllocator, };
-static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, TransformFilter* pTransformFilter) -{ - HRESULT hr; - PIN_INFO piInput; - PIN_INFO piOutput; - - BaseFilter_Init(&pTransformFilter->filter, pVtbl, pClsid, (DWORD_PTR)(__FILE__ ": TransformFilter.csFilter"), &tfBaseFuncTable); - - InitializeCriticalSection(&pTransformFilter->csReceive); - pTransformFilter->csReceive.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": TransformFilter.csReceive"); - - /* pTransformFilter is already allocated */ - pTransformFilter->pFuncsTable = pFuncsTable; - ZeroMemory(&pTransformFilter->pmt, sizeof(pTransformFilter->pmt)); - - pTransformFilter->ppPins = CoTaskMemAlloc(2 * sizeof(IPin *)); - - /* construct input pin */ - piInput.dir = PINDIR_INPUT; - piInput.pFilter = &pTransformFilter->filter.IBaseFilter_iface; - lstrcpynW(piInput.achName, wcsInputPinName, ARRAY_SIZE(piInput.achName)); - piOutput.dir = PINDIR_OUTPUT; - piOutput.pFilter = &pTransformFilter->filter.IBaseFilter_iface; - lstrcpynW(piOutput.achName, wcsOutputPinName, ARRAY_SIZE(piOutput.achName)); - - hr = BaseInputPin_Construct(&TransformFilter_InputPin_Vtbl, sizeof(BaseInputPin), &piInput, - &tf_input_BaseInputFuncTable, &pTransformFilter->filter.csFilter, NULL, &pTransformFilter->ppPins[0]); - - if (SUCCEEDED(hr)) - { - hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), &piOutput, &tf_output_BaseOutputFuncTable, &pTransformFilter->filter.csFilter, &pTransformFilter->ppPins[1]); - - if (FAILED(hr)) - ERR("Cannot create output pin (%x)\n", hr); - else { - QualityControlImpl_Create( pTransformFilter->ppPins[0], &pTransformFilter->filter.IBaseFilter_iface, &pTransformFilter->qcimpl); - pTransformFilter->qcimpl->IQualityControl_iface.lpVtbl = &TransformFilter_QualityControl_Vtbl; - } - } - - if (SUCCEEDED(hr)) - { - ISeekingPassThru *passthru; - pTransformFilter->seekthru_unk = NULL; - hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown *)&pTransformFilter->filter.IBaseFilter_iface, CLSCTX_INPROC_SERVER, - &IID_IUnknown, (void **)&pTransformFilter->seekthru_unk); - if (SUCCEEDED(hr)) - { - IUnknown_QueryInterface(pTransformFilter->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); - ISeekingPassThru_Init(passthru, FALSE, pTransformFilter->ppPins[0]); - ISeekingPassThru_Release(passthru); - } - } - - if (FAILED(hr)) - { - CoTaskMemFree(pTransformFilter->ppPins); - BaseFilterImpl_Release(&pTransformFilter->filter.IBaseFilter_iface); - } - - return hr; -} - -HRESULT TransformFilter_Construct(const IBaseFilterVtbl *pVtbl, LONG filter_size, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, IBaseFilter ** ppTransformFilter) -{ - TransformFilter* pTf; - - *ppTransformFilter = NULL; - - assert(filter_size >= sizeof(TransformFilter)); - - pTf = CoTaskMemAlloc(filter_size); - - if (!pTf) - return E_OUTOFMEMORY; - - ZeroMemory(pTf, filter_size); - - if (SUCCEEDED(TransformFilter_Init(pVtbl, pClsid, pFuncsTable, pTf))) - { - *ppTransformFilter = &pTf->filter.IBaseFilter_iface; - return S_OK; - } - - CoTaskMemFree(pTf); - return E_FAIL; -} - -HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv) +static HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv) { HRESULT hr; TransformFilter *This = impl_from_IBaseFilter(iface); @@ -274,7 +186,7 @@ HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID ri return hr; }
-ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) +static ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) { TransformFilter *This = impl_from_IBaseFilter(iface); ULONG refCount = InterlockedDecrement(&This->filter.refCount); @@ -313,9 +225,7 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) return refCount; }
-/** IMediaFilter methods **/ - -HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter * iface) +static HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter *iface) { TransformFilter *This = impl_from_IBaseFilter(iface); HRESULT hr = S_OK; @@ -335,7 +245,7 @@ HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter * iface) return hr; }
-HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter * iface) +static HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter *iface) { TransformFilter *This = impl_from_IBaseFilter(iface); HRESULT hr; @@ -357,7 +267,7 @@ HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter * iface) return hr; }
-HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart) +static HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter *iface, REFERENCE_TIME tStart) { HRESULT hr = S_OK; TransformFilter *This = impl_from_IBaseFilter(iface); @@ -386,6 +296,119 @@ HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStar return hr; }
+static const IBaseFilterVtbl transform_vtbl = +{ + TransformFilterImpl_QueryInterface, + BaseFilterImpl_AddRef, + TransformFilterImpl_Release, + BaseFilterImpl_GetClassID, + TransformFilterImpl_Stop, + TransformFilterImpl_Pause, + TransformFilterImpl_Run, + BaseFilterImpl_GetState, + BaseFilterImpl_SetSyncSource, + BaseFilterImpl_GetSyncSource, + BaseFilterImpl_EnumPins, + BaseFilterImpl_FindPin, + BaseFilterImpl_QueryFilterInfo, + BaseFilterImpl_JoinFilterGraph, + BaseFilterImpl_QueryVendorInfo +}; + +static HRESULT strmbase_transform_init(const CLSID *clsid, + const TransformFilterFuncTable *func_table, TransformFilter *filter) +{ + HRESULT hr; + PIN_INFO piInput; + PIN_INFO piOutput; + + BaseFilter_Init(&filter->filter, &transform_vtbl, clsid, + (DWORD_PTR)(__FILE__ ": TransformFilter.csFilter"), &tfBaseFuncTable); + + InitializeCriticalSection(&filter->csReceive); + filter->csReceive.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": TransformFilter.csReceive"); + + /* pTransformFilter is already allocated */ + filter->pFuncsTable = func_table; + ZeroMemory(&filter->pmt, sizeof(filter->pmt)); + + filter->ppPins = CoTaskMemAlloc(2 * sizeof(IPin *)); + + /* construct input pin */ + piInput.dir = PINDIR_INPUT; + piInput.pFilter = &filter->filter.IBaseFilter_iface; + lstrcpynW(piInput.achName, wcsInputPinName, ARRAY_SIZE(piInput.achName)); + piOutput.dir = PINDIR_OUTPUT; + piOutput.pFilter = &filter->filter.IBaseFilter_iface; + lstrcpynW(piOutput.achName, wcsOutputPinName, ARRAY_SIZE(piOutput.achName)); + + hr = BaseInputPin_Construct(&TransformFilter_InputPin_Vtbl, sizeof(BaseInputPin), &piInput, + &tf_input_BaseInputFuncTable, &filter->filter.csFilter, NULL, &filter->ppPins[0]); + + if (SUCCEEDED(hr)) + { + hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), + &piOutput, &tf_output_BaseOutputFuncTable, &filter->filter.csFilter, + &filter->ppPins[1]); + + if (FAILED(hr)) + ERR("Cannot create output pin (%x)\n", hr); + else { + QualityControlImpl_Create(filter->ppPins[0], + &filter->filter.IBaseFilter_iface, &filter->qcimpl); + filter->qcimpl->IQualityControl_iface.lpVtbl = &TransformFilter_QualityControl_Vtbl; + } + } + + if (SUCCEEDED(hr)) + { + ISeekingPassThru *passthru; + filter->seekthru_unk = NULL; + hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown *)&filter->filter.IBaseFilter_iface, + CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&filter->seekthru_unk); + if (SUCCEEDED(hr)) + { + IUnknown_QueryInterface(filter->seekthru_unk, &IID_ISeekingPassThru, (void **)&passthru); + ISeekingPassThru_Init(passthru, FALSE, filter->ppPins[0]); + ISeekingPassThru_Release(passthru); + } + } + + if (FAILED(hr)) + { + CoTaskMemFree(filter->ppPins); + BaseFilterImpl_Release(&filter->filter.IBaseFilter_iface); + } + + return hr; +} + +HRESULT strmbase_transform_create(LONG filter_size, const CLSID *pClsid, + const TransformFilterFuncTable *pFuncsTable, IBaseFilter **ppTransformFilter) +{ + TransformFilter* pTf; + + *ppTransformFilter = NULL; + + assert(filter_size >= sizeof(TransformFilter)); + + pTf = CoTaskMemAlloc(filter_size); + + if (!pTf) + return E_OUTOFMEMORY; + + ZeroMemory(pTf, filter_size); + + if (SUCCEEDED(strmbase_transform_init(pClsid, pFuncsTable, pTf))) + { + *ppTransformFilter = &pTf->filter.IBaseFilter_iface; + return S_OK; + } + + CoTaskMemFree(pTf); + return E_FAIL; +} + HRESULT WINAPI TransformFilterImpl_Notify(TransformFilter *iface, IBaseFilter *sender, Quality qm) { return QualityControlImpl_Notify((IQualityControl*)iface->qcimpl, sender, qm); diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c index 7a1d4930fc..b45d844877 100644 --- a/dlls/winegstreamer/gsttffilter.c +++ b/dlls/winegstreamer/gsttffilter.c @@ -57,8 +57,6 @@ struct typeinfo { const char *type; };
-static const IBaseFilterVtbl GSTTf_Vtbl; - static gboolean match_element(GstPluginFeature *feature, gpointer gdata) { struct typeinfo *data = (struct typeinfo*)gdata; @@ -497,7 +495,7 @@ static HRESULT Gstreamer_transform_create(IUnknown *punkouter, const CLSID *clsi
TRACE("%p, %p, %p, %p, %p\n", punkouter, clsid, name, vtbl, obj);
- if (FAILED(TransformFilter_Construct(&GSTTf_Vtbl, sizeof(GstTfImpl), clsid, vtbl, (IBaseFilter**)&This))) + if (FAILED(strmbase_transform_create(sizeof(GstTfImpl), clsid, vtbl, (IBaseFilter **)&This))) return E_OUTOFMEMORY;
This->gstreamer_name = name; @@ -1016,22 +1014,3 @@ IUnknown * CALLBACK Gstreamer_AudioConvert_create(IUnknown *punkouter, HRESULT *
return obj; } - -static const IBaseFilterVtbl GSTTf_Vtbl = -{ - TransformFilterImpl_QueryInterface, - BaseFilterImpl_AddRef, - TransformFilterImpl_Release, - BaseFilterImpl_GetClassID, - TransformFilterImpl_Stop, - TransformFilterImpl_Pause, - TransformFilterImpl_Run, - BaseFilterImpl_GetState, - BaseFilterImpl_SetSyncSource, - BaseFilterImpl_GetSyncSource, - BaseFilterImpl_EnumPins, - BaseFilterImpl_FindPin, - BaseFilterImpl_QueryFilterInfo, - BaseFilterImpl_JoinFilterGraph, - BaseFilterImpl_QueryVendorInfo -}; diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c index 46a8ac06dd..4e8278b773 100644 --- a/dlls/wineqtdecoder/qtvdecoder.c +++ b/dlls/wineqtdecoder/qtvdecoder.c @@ -154,8 +154,6 @@ static inline QTVDecoderImpl *impl_from_TransformFilter( TransformFilter *iface return CONTAINING_RECORD(iface, QTVDecoderImpl, tf.filter); }
-static const IBaseFilterVtbl QTVDecoder_Vtbl; - static void trackingCallback( void *decompressionTrackingRefCon, OSStatus result, @@ -535,7 +533,8 @@ IUnknown * CALLBACK QTVDecoder_create(IUnknown * pUnkOuter, HRESULT* phr) return NULL; }
- hr = TransformFilter_Construct(&QTVDecoder_Vtbl, sizeof(QTVDecoderImpl), &CLSID_QTVDecoder, &QTVDecoder_FuncsTable, (IBaseFilter**)&This); + hr = TransformFilter_Construct(sizeof(QTVDecoderImpl), &CLSID_QTVDecoder, + &QTVDecoder_FuncsTable, (IBaseFilter **)&This);
if (FAILED(hr)) { @@ -546,22 +545,3 @@ IUnknown * CALLBACK QTVDecoder_create(IUnknown * pUnkOuter, HRESULT* phr) *phr = hr; return (IUnknown*)This; } - -static const IBaseFilterVtbl QTVDecoder_Vtbl = -{ - TransformFilterImpl_QueryInterface, - BaseFilterImpl_AddRef, - TransformFilterImpl_Release, - BaseFilterImpl_GetClassID, - TransformFilterImpl_Stop, - TransformFilterImpl_Pause, - TransformFilterImpl_Run, - BaseFilterImpl_GetState, - BaseFilterImpl_SetSyncSource, - BaseFilterImpl_GetSyncSource, - BaseFilterImpl_EnumPins, - BaseFilterImpl_FindPin, - BaseFilterImpl_QueryFilterInfo, - BaseFilterImpl_JoinFilterGraph, - BaseFilterImpl_QueryVendorInfo -}; diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index eb0bfbfb79..1cd002890e 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -245,14 +245,10 @@ typedef struct TransformFilterFuncTable { TransformFilter_Notify pfnNotify; } TransformFilterFuncTable;
-HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv); -ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface); -HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter * iface); -HRESULT WINAPI TransformFilterImpl_Pause(IBaseFilter * iface); -HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart); HRESULT WINAPI TransformFilterImpl_Notify(TransformFilter *iface, IBaseFilter *sender, Quality qm);
-HRESULT TransformFilter_Construct( const IBaseFilterVtbl *filterVtbl, LONG filter_size, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, IBaseFilter ** ppTransformFilter); +HRESULT strmbase_transform_create(LONG filter_size, const CLSID *clsid, + const TransformFilterFuncTable *func_table, IBaseFilter **filter);
/* Source Seeking */ typedef HRESULT (WINAPI *SourceSeeking_ChangeRate)(IMediaSeeking *iface);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52237
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 error: patch failed: dlls/strmbase/filter.c:210 error: patch failed: include/wine/strmbase.h:190 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 error: patch failed: dlls/strmbase/filter.c:210 error: patch failed: include/wine/strmbase.h:190 Task: Patch failed to apply
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52233
Your paranoid android.
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply
=== debian9 (build log) ===
error: patch failed: dlls/strmbase/enumpins.c:39 Task: Patch failed to apply