Module: wine Branch: master Commit: 5955a349c6c3196374fd118eb6ccb7a5d63b12a3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5955a349c6c3196374fd118eb6...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Fri Nov 5 23:19:14 2010 +0100
strmbase: Add support for IQualityControl to transform filter.
---
dlls/strmbase/transform.c | 28 ++++++++++++++++++++++++++++ include/wine/strmbase.h | 3 +++ 2 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index e17620c..029d289 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -44,6 +44,7 @@ static const WCHAR wcsOutputPinName[] = {'o','u','t','p','u','t',' ','p','i','n' static const IBaseFilterVtbl TransformFilter_Vtbl; static const IPinVtbl TransformFilter_InputPin_Vtbl; static const IPinVtbl TransformFilter_OutputPin_Vtbl; +static const IQualityControlVtbl TransformFilter_QualityControl_Vtbl;
static HRESULT WINAPI TransformFilter_Input_CheckMediaType(BasePin *iface, const AM_MEDIA_TYPE * pmt) { @@ -198,6 +199,10 @@ static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* p
if (FAILED(hr)) ERR("Cannot create output pin (%x)\n", hr); + else { + QualityControlImpl_init(&pTransformFilter->qcimpl, (IPin*)pTransformFilter->ppPins[0], (IBaseFilter*)pTransformFilter); + pTransformFilter->qcimpl.lpVtbl = &TransformFilter_QualityControl_Vtbl; + } } if (FAILED(hr)) { @@ -238,6 +243,11 @@ HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID ri TransformFilter *This = (TransformFilter *)iface; TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
+ if (IsEqualIID(riid, &IID_IQualityControl)) { + *ppv = (IQualityControl*)&This->qcimpl; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } hr = BaseFilterImpl_QueryInterface(iface, riid, ppv);
if (FAILED(hr) && (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IVideoWindow))) @@ -547,3 +557,21 @@ static const IPinVtbl TransformFilter_OutputPin_Vtbl = BaseOutputPinImpl_EndFlush, BasePinImpl_NewSegment }; + +HRESULT WINAPI TransformFilter_QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) { + QualityControlImpl *qc = (QualityControlImpl*)iface; + TransformFilter *This = (TransformFilter *)qc->self; + + if (This->pFuncsTable->pfnNotify) + return This->pFuncsTable->pfnNotify(This, sender, qm); + else + return QualityControlImpl_Notify(iface, sender, qm); +} + +static const IQualityControlVtbl TransformFilter_QualityControl_Vtbl = { + QualityControlImpl_QueryInterface, + QualityControlImpl_AddRef, + QualityControlImpl_Release, + TransformFilter_QualityControlImpl_Notify, + QualityControlImpl_SetSink +}; diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index b748930..bbb1363 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -219,6 +219,7 @@ typedef struct TransformFilter AM_MEDIA_TYPE pmt;
const struct TransformFilterFuncTable * pFuncsTable; + QualityControlImpl qcimpl; } TransformFilter;
typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest); @@ -234,6 +235,7 @@ typedef HRESULT (WINAPI *TransformFilter_BeginFlush) (TransformFilter *iface); typedef HRESULT (WINAPI *TransformFilter_EndFlush) (TransformFilter *iface); typedef HRESULT (WINAPI *TransformFilter_NewSegment) (TransformFilter *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); +typedef HRESULT (WINAPI *TransformFilter_Notify) (TransformFilter *iface, IBaseFilter *sender, Quality qm);
typedef struct TransformFilterFuncTable { /* Required */ @@ -250,6 +252,7 @@ typedef struct TransformFilterFuncTable { TransformFilter_BeginFlush pfnBeginFlush; TransformFilter_EndFlush pfnEndFlush; TransformFilter_NewSegment pfnNewSegment; + TransformFilter_Notify pfnNotify; } TransformFilterFuncTable;
HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv);