[PATCH 7/7] quartz: Add support for MediaSeekingPassThru to transform filter
Maarten Lankhorst
m.b.lankhorst at gmail.com
Sat May 22 10:00:43 CDT 2010
---
dlls/quartz/acmwrapper.c | 2 +-
dlls/quartz/avidec.c | 2 +-
dlls/quartz/transform.c | 93 ++++------------------------------------------
dlls/quartz/transform.h | 4 +-
4 files changed, 12 insertions(+), 89 deletions(-)
diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index a032391..05863b3 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -326,7 +326,7 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv)
This = CoTaskMemAlloc(sizeof(ACMWrapperImpl));
ZeroMemory(This, sizeof(ACMWrapperImpl));
- hr = TransformFilter_Create(&(This->tf), &CLSID_ACMWrapper, &ACMWrapper_FuncsTable, NULL, NULL, NULL);
+ hr = TransformFilter_Create(&(This->tf), &CLSID_ACMWrapper, &ACMWrapper_FuncsTable);
if (FAILED(hr))
return hr;
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index b7d45e9..605bc5c 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -331,7 +331,7 @@ HRESULT AVIDec_create(IUnknown * pUnkOuter, LPVOID * ppv)
This->pBihIn = NULL;
This->pBihOut = NULL;
- hr = TransformFilter_Create(&(This->tf), &CLSID_AVIDec, &AVIDec_FuncsTable, NULL, NULL, NULL);
+ hr = TransformFilter_Create(&(This->tf), &CLSID_AVIDec, &AVIDec_FuncsTable);
if (FAILED(hr))
return hr;
diff --git a/dlls/quartz/transform.c b/dlls/quartz/transform.c
index adb753d..b6ec768 100644
--- a/dlls/quartz/transform.c
+++ b/dlls/quartz/transform.c
@@ -73,80 +73,7 @@ static HRESULT TransformFilter_Output_QueryAccept(LPVOID iface, const AM_MEDIA_T
return S_FALSE;
}
-
-static inline TransformFilterImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
-{
- return (TransformFilterImpl *)((char*)iface - FIELD_OFFSET(TransformFilterImpl, mediaSeeking.lpVtbl));
-}
-
-static HRESULT WINAPI TransformFilter_Seeking_QueryInterface(IMediaSeeking * iface, REFIID riid, LPVOID * ppv)
-{
- TransformFilterImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_QueryInterface((IUnknown *)This, riid, ppv);
-}
-
-static ULONG WINAPI TransformFilter_Seeking_AddRef(IMediaSeeking * iface)
-{
- TransformFilterImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_AddRef((IUnknown *)This);
-}
-
-static ULONG WINAPI TransformFilter_Seeking_Release(IMediaSeeking * iface)
-{
- TransformFilterImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_Release((IUnknown *)This);
-}
-
-static const IMediaSeekingVtbl TransformFilter_Seeking_Vtbl =
-{
- TransformFilter_Seeking_QueryInterface,
- TransformFilter_Seeking_AddRef,
- TransformFilter_Seeking_Release,
- MediaSeekingImpl_GetCapabilities,
- MediaSeekingImpl_CheckCapabilities,
- MediaSeekingImpl_IsFormatSupported,
- MediaSeekingImpl_QueryPreferredFormat,
- MediaSeekingImpl_GetTimeFormat,
- MediaSeekingImpl_IsUsingTimeFormat,
- MediaSeekingImpl_SetTimeFormat,
- MediaSeekingImpl_GetDuration,
- MediaSeekingImpl_GetStopPosition,
- MediaSeekingImpl_GetCurrentPosition,
- MediaSeekingImpl_ConvertTimeFormat,
- MediaSeekingImpl_SetPositions,
- MediaSeekingImpl_GetPositions,
- MediaSeekingImpl_GetAvailable,
- MediaSeekingImpl_SetRate,
- MediaSeekingImpl_GetRate,
- MediaSeekingImpl_GetPreroll
-};
-
-/* These shouldn't be implemented by default.
- * Usually only source filters should implement these
- * and even it's not needed all of the time
- */
-static HRESULT TransformFilter_ChangeCurrent(IBaseFilter *iface)
-{
- TRACE("(%p) filter hasn't implemented current position change!\n", iface);
- return S_OK;
-}
-
-static HRESULT TransformFilter_ChangeStop(IBaseFilter *iface)
-{
- TRACE("(%p) filter hasn't implemented stop position change!\n", iface);
- return S_OK;
-}
-
-static HRESULT TransformFilter_ChangeRate(IBaseFilter *iface)
-{
- TRACE("(%p) filter hasn't implemented rate change!\n", iface);
- return S_OK;
-}
-
-HRESULT TransformFilter_Create(TransformFilterImpl* pTransformFilter, const CLSID* pClsid, const TransformFuncsTable* pFuncsTable, CHANGEPROC stop, CHANGEPROC current, CHANGEPROC rate)
+HRESULT TransformFilter_Create(TransformFilterImpl* pTransformFilter, const CLSID* pClsid, const TransformFuncsTable* pFuncsTable)
{
HRESULT hr;
PIN_INFO piInput;
@@ -195,18 +122,14 @@ HRESULT TransformFilter_Create(TransformFilterImpl* pTransformFilter, const CLSI
ERR("Cannot create output pin (%x)\n", hr);
else
{
- if (!stop)
- stop = TransformFilter_ChangeStop;
- if (!current)
- current = TransformFilter_ChangeCurrent;
- if (!rate)
- rate = TransformFilter_ChangeRate;
-
- MediaSeekingImpl_Init((IBaseFilter*)pTransformFilter, stop, current, rate, &pTransformFilter->mediaSeeking, &pTransformFilter->csFilter);
- pTransformFilter->mediaSeeking.lpVtbl = &TransformFilter_Seeking_Vtbl;
+ ISeekingPassThru *passthru;
+ hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pTransformFilter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pTransformFilter->seekthru_unk);
+ IUnknown_QueryInterface(pTransformFilter->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+ ISeekingPassThru_Init(passthru, FALSE, (IPin*)pTransformFilter->ppPins[0]);
+ ISeekingPassThru_Release(passthru);
}
}
- else
+ if (FAILED(hr))
{
CoTaskMemFree(pTransformFilter->ppPins);
pTransformFilter->csFilter.DebugInfo->Spare[0] = 0;
@@ -233,7 +156,7 @@ static HRESULT WINAPI TransformFilter_QueryInterface(IBaseFilter * iface, REFIID
else if (IsEqualIID(riid, &IID_IBaseFilter))
*ppv = This;
else if (IsEqualIID(riid, &IID_IMediaSeeking))
- *ppv = &This->mediaSeeking;
+ return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
if (*ppv)
{
diff --git a/dlls/quartz/transform.h b/dlls/quartz/transform.h
index f39ff47..8d3a3a0 100644
--- a/dlls/quartz/transform.h
+++ b/dlls/quartz/transform.h
@@ -34,6 +34,7 @@ typedef struct TransformFuncsTable {
struct TransformFilterImpl
{
const IBaseFilterVtbl * lpVtbl;
+ IUnknown *seekthru_unk;
LONG refCount;
CRITICAL_SECTION csFilter;
@@ -42,7 +43,6 @@ struct TransformFilterImpl
IReferenceClock * pClock;
FILTER_INFO filterInfo;
CLSID clsid;
- struct MediaSeekingImpl mediaSeeking;
IPin **ppPins;
ULONG npins;
@@ -51,4 +51,4 @@ struct TransformFilterImpl
const TransformFuncsTable * pFuncsTable;
};
-HRESULT TransformFilter_Create(TransformFilterImpl*, const CLSID*, const TransformFuncsTable* pFuncsTable, CHANGEPROC stop, CHANGEPROC current, CHANGEPROC rate);
+HRESULT TransformFilter_Create(TransformFilterImpl*, const CLSID*, const TransformFuncsTable* pFuncsTable);
--
1.7.0.4
More information about the wine-patches
mailing list