[PATCH 15/32] quartz: Add support for MediaSeekingPassThru to null renderer
Maarten Lankhorst
m.b.lankhorst at gmail.com
Sat May 22 09:06:00 CDT 2010
---
dlls/quartz/nullrenderer.c | 99 ++++++++++++++++----------------------------
1 files changed, 36 insertions(+), 63 deletions(-)
diff --git a/dlls/quartz/nullrenderer.c b/dlls/quartz/nullrenderer.c
index d2aedfa..3d27587 100644
--- a/dlls/quartz/nullrenderer.c
+++ b/dlls/quartz/nullrenderer.c
@@ -53,6 +53,7 @@ typedef struct NullRendererImpl
{
const IBaseFilterVtbl * lpVtbl;
const IUnknownVtbl * IInner_vtbl;
+ IUnknown *seekthru_unk;
LONG refCount;
CRITICAL_SECTION csFilter;
@@ -65,16 +66,18 @@ typedef struct NullRendererImpl
IUnknown * pUnkOuter;
BOOL bUnkOuterValid;
BOOL bAggregatable;
- MediaSeekingImpl mediaSeeking;
} NullRendererImpl;
static HRESULT NullRenderer_Sample(LPVOID iface, IMediaSample * pSample)
{
NullRendererImpl *This = iface;
HRESULT hr = S_OK;
+ REFERENCE_TIME start, stop;
TRACE("%p %p\n", iface, pSample);
+ if (SUCCEEDED(IMediaSample_GetTime(pSample, &start, &stop)))
+ MediaSeekingPassThru_RegisterMediaTime(This->seekthru_unk, start);
EnterCriticalSection(&This->csFilter);
if (This->pInputPin->flushing || This->pInputPin->end_of_stream)
hr = S_FALSE;
@@ -89,62 +92,6 @@ static HRESULT NullRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt)
return S_OK;
}
-static inline NullRendererImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
-{
- return (NullRendererImpl *)((char*)iface - FIELD_OFFSET(NullRendererImpl, mediaSeeking.lpVtbl));
-}
-
-static HRESULT WINAPI NullRendererImpl_Seeking_QueryInterface(IMediaSeeking * iface, REFIID riid, LPVOID * ppv)
-{
- NullRendererImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_QueryInterface((IUnknown *)This, riid, ppv);
-}
-
-static ULONG WINAPI NullRendererImpl_Seeking_AddRef(IMediaSeeking * iface)
-{
- NullRendererImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_AddRef((IUnknown *)This);
-}
-
-static ULONG WINAPI NullRendererImpl_Seeking_Release(IMediaSeeking * iface)
-{
- NullRendererImpl *This = impl_from_IMediaSeeking(iface);
-
- return IUnknown_Release((IUnknown *)This);
-}
-
-static const IMediaSeekingVtbl TransformFilter_Seeking_Vtbl =
-{
- NullRendererImpl_Seeking_QueryInterface,
- NullRendererImpl_Seeking_AddRef,
- NullRendererImpl_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 NullRendererImpl_Change(IBaseFilter *iface)
-{
- TRACE("(%p)\n", iface);
- return S_OK;
-}
-
HRESULT NullRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
{
HRESULT hr;
@@ -178,9 +125,15 @@ HRESULT NullRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
if (SUCCEEDED(hr))
{
- MediaSeekingImpl_Init((IBaseFilter*)pNullRenderer, NullRendererImpl_Change, NullRendererImpl_Change, NullRendererImpl_Change, &pNullRenderer->mediaSeeking, &pNullRenderer->csFilter);
- pNullRenderer->mediaSeeking.lpVtbl = &TransformFilter_Seeking_Vtbl;
-
+ ISeekingPassThru *passthru;
+ hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter ? pUnkOuter : (IUnknown*)&pNullRenderer->IInner_vtbl, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pNullRenderer->seekthru_unk);
+ if (FAILED(hr)) {
+ IUnknown_Release((IUnknown*)pNullRenderer);
+ return hr;
+ }
+ IUnknown_QueryInterface(pNullRenderer->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+ ISeekingPassThru_Init(passthru, TRUE, (IPin*)pNullRenderer->pInputPin);
+ ISeekingPassThru_Release(passthru);
*ppv = pNullRenderer;
}
else
@@ -212,7 +165,7 @@ static HRESULT WINAPI NullRendererInner_QueryInterface(IUnknown * 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)
{
@@ -259,6 +212,8 @@ static ULONG WINAPI NullRendererInner_Release(IUnknown * iface)
IPin_Release((IPin *)This->pInputPin);
This->lpVtbl = NULL;
+ if (This->seekthru_unk)
+ IUnknown_Release(This->seekthru_unk);
This->csFilter.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->csFilter);
@@ -350,6 +305,7 @@ static HRESULT WINAPI NullRenderer_Stop(IBaseFilter * iface)
EnterCriticalSection(&This->csFilter);
{
This->state = State_Stopped;
+ MediaSeekingPassThru_ResetMediaTime(This->seekthru_unk);
}
LeaveCriticalSection(&This->csFilter);
@@ -550,13 +506,15 @@ static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface)
{
InputPin* This = (InputPin*)iface;
IMediaEventSink* pEventSink;
+ NullRendererImpl *pNull;
IFilterGraph *graph;
HRESULT hr = S_OK;
TRACE("(%p/%p)->()\n", This, iface);
InputPin_EndOfStream(iface);
- graph = ((NullRendererImpl*)This->pin.pinInfo.pFilter)->filterInfo.pGraph;
+ pNull = (NullRendererImpl*)This->pin.pinInfo.pFilter;
+ graph = pNull->filterInfo.pGraph;
if (graph)
{
hr = IFilterGraph_QueryInterface(((NullRendererImpl*)This->pin.pinInfo.pFilter)->filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
@@ -566,7 +524,22 @@ static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface)
IMediaEventSink_Release(pEventSink);
}
}
+ MediaSeekingPassThru_EOS(pNull->seekthru_unk);
+
+ return hr;
+}
+
+static HRESULT WINAPI NullRenderer_InputPin_EndFlush(IPin * iface)
+{
+ InputPin* This = (InputPin*)iface;
+ NullRendererImpl *pNull;
+ HRESULT hr = S_OK;
+
+ TRACE("(%p/%p)->()\n", This, iface);
+ hr = InputPin_EndOfStream(iface);
+ pNull = (NullRendererImpl*)This->pin.pinInfo.pFilter;
+ MediaSeekingPassThru_ResetMediaTime(pNull->seekthru_unk);
return hr;
}
@@ -588,6 +561,6 @@ static const IPinVtbl NullRenderer_InputPin_Vtbl =
IPinImpl_QueryInternalConnections,
NullRenderer_InputPin_EndOfStream,
InputPin_BeginFlush,
- InputPin_EndFlush,
+ NullRenderer_InputPin_EndFlush,
InputPin_NewSegment
};
--
1.7.0.4
--------------070607070807030907070206--
More information about the wine-patches
mailing list