[PATCH 03/30] quartz: Add MediaSeekingPassThru to video renderer

Maarten Lankhorst m.b.lankhorst at gmail.com
Sat May 22 08:58:15 CDT 2010


---
 dlls/quartz/videorenderer.c |   97 ++++++++++++------------------------------
 1 files changed, 28 insertions(+), 69 deletions(-)

diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 9469427..b4b0547 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -59,6 +59,7 @@ typedef struct VideoRendererImpl
     const IBasicVideoVtbl * IBasicVideo_vtbl;
     const IVideoWindowVtbl * IVideoWindow_vtbl;
     const IUnknownVtbl * IInner_vtbl;
+    IUnknown *seekthru_unk;
 
     LONG refCount;
     CRITICAL_SECTION csFilter;
@@ -380,6 +381,8 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample)
     hr = IMediaSample_GetTime(pSample, &tStart, &tStop);
     if (FAILED(hr))
         ERR("Cannot get sample time (%x)\n", hr);
+    else
+        MediaSeekingPassThru_RegisterMediaTime(This->seekthru_unk, tStart);
 
     if (This->rtLastStop != tStart && This->state == State_Running)
     {
@@ -536,67 +539,12 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
     return S_FALSE;
 }
 
-static inline VideoRendererImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
-{
-    return (VideoRendererImpl *)((char*)iface - FIELD_OFFSET(VideoRendererImpl, mediaSeeking.lpVtbl));
-}
-
-static HRESULT WINAPI VideoRendererImpl_Seeking_QueryInterface(IMediaSeeking * iface, REFIID riid, LPVOID * ppv)
-{
-    VideoRendererImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_QueryInterface((IUnknown *)This, riid, ppv);
-}
-
-static ULONG WINAPI VideoRendererImpl_Seeking_AddRef(IMediaSeeking * iface)
-{
-    VideoRendererImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_AddRef((IUnknown *)This);
-}
-
-static ULONG WINAPI VideoRendererImpl_Seeking_Release(IMediaSeeking * iface)
-{
-    VideoRendererImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_Release((IUnknown *)This);
-}
-
-static const IMediaSeekingVtbl VideoRendererImpl_Seeking_Vtbl =
-{
-    VideoRendererImpl_Seeking_QueryInterface,
-    VideoRendererImpl_Seeking_AddRef,
-    VideoRendererImpl_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
-};
-
-static HRESULT VideoRendererImpl_Change(IBaseFilter *iface)
-{
-    TRACE("(%p)->()\n", iface);
-    return S_OK;
-}
-
 HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
 {
     HRESULT hr;
     PIN_INFO piInput;
     VideoRendererImpl * pVideoRenderer;
+    ISeekingPassThru *passthru;
 
     TRACE("(%p, %p)\n", pUnkOuter, ppv);
 
@@ -636,18 +584,19 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
 
     if (SUCCEEDED(hr))
     {
-        MediaSeekingImpl_Init((IBaseFilter*)pVideoRenderer, VideoRendererImpl_Change, VideoRendererImpl_Change, VideoRendererImpl_Change, &pVideoRenderer->mediaSeeking, &pVideoRenderer->csFilter);
-        pVideoRenderer->mediaSeeking.lpVtbl = &VideoRendererImpl_Seeking_Vtbl;
-
+        hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter ? pUnkOuter : (IUnknown*)&pVideoRenderer->IInner_vtbl, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pVideoRenderer->seekthru_unk);
+        if (FAILED(hr)) {
+            IPin_Release((IPin*)pVideoRenderer->pInputPin);
+            goto fail;
+        }
+        IUnknown_QueryInterface(pVideoRenderer->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+        ISeekingPassThru_Init(passthru, TRUE, (IPin*)pVideoRenderer->pInputPin);
+        ISeekingPassThru_Release(passthru);
         pVideoRenderer->sample_held = NULL;
         *ppv = pVideoRenderer;
     }
-    else
-    {
-        pVideoRenderer->csFilter.DebugInfo->Spare[0] = 0;
-        DeleteCriticalSection(&pVideoRenderer->csFilter);
-        CoTaskMemFree(pVideoRenderer);
-    }
+    if (FAILED(hr))
+        goto fail;
 
     if (!CreateRenderingSubsystem(pVideoRenderer))
         return E_FAIL;
@@ -660,6 +609,11 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
     }
 
     return hr;
+fail:
+    pVideoRenderer->csFilter.DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(&pVideoRenderer->csFilter);
+    CoTaskMemFree(pVideoRenderer);
+    return hr;
 }
 
 HRESULT VideoRendererDefault_create(IUnknown * pUnkOuter, LPVOID * ppv)
@@ -691,7 +645,7 @@ static HRESULT WINAPI VideoRendererInner_QueryInterface(IUnknown * iface, REFIID
     else if (IsEqualIID(riid, &IID_IVideoWindow))
         *ppv = &This->IVideoWindow_vtbl;
     else if (IsEqualIID(riid, &IID_IMediaSeeking))
-        *ppv = &This->mediaSeeking;
+        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
 
     if (*ppv)
     {
@@ -734,7 +688,7 @@ static ULONG WINAPI VideoRendererInner_Release(IUnknown * iface)
 
         if (This->pClock)
             IReferenceClock_Release(This->pClock);
-        
+
         if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo)))
         {
             IPin_Disconnect(pConnectedTo);
@@ -745,7 +699,7 @@ static ULONG WINAPI VideoRendererInner_Release(IUnknown * iface)
         IPin_Release((IPin *)This->pInputPin);
 
         This->lpVtbl = NULL;
-        
+        IUnknown_Release(This->seekthru_unk);
         This->csFilter.DebugInfo->Spare[0] = 0;
         DeleteCriticalSection(&This->csFilter);
 
@@ -839,6 +793,7 @@ static HRESULT WINAPI VideoRenderer_Stop(IBaseFilter * iface)
         This->state = State_Stopped;
         SetEvent(This->hEvent);
         SetEvent(This->blocked);
+        MediaSeekingPassThru_ResetMediaTime(This->seekthru_unk);
     }
     LeaveCriticalSection(&This->csFilter);
 
@@ -1049,17 +1004,20 @@ static const IBaseFilterVtbl VideoRenderer_Vtbl =
 static HRESULT WINAPI VideoRenderer_InputPin_EndOfStream(IPin * iface)
 {
     InputPin* This = (InputPin*)iface;
+    VideoRendererImpl *pFilter;
     IMediaEventSink* pEventSink;
     HRESULT hr;
 
     TRACE("(%p/%p)->()\n", This, iface);
 
-    hr = IFilterGraph_QueryInterface(((VideoRendererImpl*)This->pin.pinInfo.pFilter)->filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
+    pFilter = (VideoRendererImpl*)This->pin.pinInfo.pFilter;
+    hr = IFilterGraph_QueryInterface(pFilter->filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
     if (SUCCEEDED(hr))
     {
         hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0);
         IMediaEventSink_Release(pEventSink);
     }
+    MediaSeekingPassThru_EOS(pFilter->seekthru_unk);
 
     return hr;
 }
@@ -1096,6 +1054,7 @@ static HRESULT WINAPI VideoRenderer_InputPin_EndFlush(IPin * iface)
 
     hr = InputPin_EndFlush(iface);
     LeaveCriticalSection(This->pin.pCritSec);
+    MediaSeekingPassThru_ResetMediaTime(pVideoRenderer->seekthru_unk);
 
     return hr;
 }
-- 
1.7.1


--------------040101050004050802090900--



More information about the wine-patches mailing list