[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