Aric Stewart : strmbase: More additions to BaseRenderer for video renderers .
Alexandre Julliard
julliard at winehq.org
Mon Apr 2 13:14:51 CDT 2012
Module: wine
Branch: master
Commit: e1a72011e52d6a76ee3824adb61066da89475940
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e1a72011e52d6a76ee3824adb61066da89475940
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri Mar 30 20:08:25 2012 -0500
strmbase: More additions to BaseRenderer for video renderers.
---
dlls/strmbase/renderer.c | 39 +++++++++++++++++++++++++++++++++++++++
include/wine/strmbase.h | 4 ++++
2 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 1d3f3b5..3f665f7 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -82,6 +82,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
if (renderer->pFuncsTable->pfnBreakConnect)
hr = renderer->pFuncsTable->pfnBreakConnect(renderer);
}
+ BaseRendererImpl_ClearPendingSample(renderer);
LeaveCriticalSection(This->pin.pCritSec);
return hr;
@@ -254,6 +255,9 @@ HRESULT WINAPI BaseRenderer_Init(BaseRenderer * This, const IBaseFilterVtbl *Vtb
InitializeCriticalSection(&This->csRenderLock);
This->csRenderLock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": BaseRenderer.csRenderLock");
This->evComplete = CreateEventW(NULL, TRUE, TRUE, NULL);
+ This->ThreadSignal = CreateEventW(NULL, TRUE, TRUE, NULL);
+ This->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+ This->pMediaSample = NULL;
}
return hr;
@@ -291,7 +295,11 @@ ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface)
This->csRenderLock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->csRenderLock);
+
+ BaseRendererImpl_ClearPendingSample(This);
CloseHandle(This->evComplete);
+ CloseHandle(This->ThreadSignal);
+ CloseHandle(This->RenderEvent);
}
return refCount;
}
@@ -318,6 +326,9 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
}
}
+ This->pMediaSample = pSample;
+ IMediaSample_AddRef(pSample);
+
if (This->pFuncsTable->pfnPrepareReceive)
hr = This->pFuncsTable->pfnPrepareReceive(This, pSample);
if (FAILED(hr))
@@ -368,6 +379,8 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
if (SUCCEEDED(hr))
hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
+
+ BaseRendererImpl_ClearPendingSample(This);
LeaveCriticalSection(&This->csRenderLock);
return hr;
@@ -405,6 +418,8 @@ HRESULT WINAPI BaseRendererImpl_Stop(IBaseFilter * iface)
This->pFuncsTable->pfnOnStopStreaming(This);
This->filter.state = State_Stopped;
SetEvent(This->evComplete);
+ SetEvent(This->ThreadSignal);
+ SetEvent(This->RenderEvent);
}
LeaveCriticalSection(&This->csRenderLock);
@@ -423,6 +438,7 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
goto out;
SetEvent(This->evComplete);
+ ResetEvent(This->ThreadSignal);
if (This->pInputPin->pin.pConnectedTo)
{
@@ -443,6 +459,9 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
{
if (This->pFuncsTable->pfnOnStartStreaming)
This->pFuncsTable->pfnOnStartStreaming(This);
+ if (This->filter.state == State_Stopped)
+ BaseRendererImpl_ClearPendingSample(This);
+ SetEvent(This->RenderEvent);
This->filter.state = State_Running;
}
out:
@@ -469,9 +488,14 @@ HRESULT WINAPI BaseRendererImpl_Pause(IBaseFilter * iface)
}
else if (This->pFuncsTable->pfnOnStopStreaming)
This->pFuncsTable->pfnOnStopStreaming(This);
+
+ if (This->filter.state == State_Stopped)
+ BaseRendererImpl_ClearPendingSample(This);
+ ResetEvent(This->RenderEvent);
This->filter.state = State_Paused;
}
}
+ ResetEvent(This->ThreadSignal);
LeaveCriticalSection(&This->csRenderLock);
return S_OK;
@@ -520,6 +544,9 @@ HRESULT WINAPI BaseRendererImpl_EndOfStream(BaseRenderer* iface)
HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer* iface)
{
TRACE("(%p)\n", iface);
+ BaseRendererImpl_ClearPendingSample(iface);
+ SetEvent(iface->ThreadSignal);
+ SetEvent(iface->RenderEvent);
return S_OK;
}
@@ -527,5 +554,17 @@ HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer* iface)
{
TRACE("(%p)\n", iface);
RendererPosPassThru_ResetMediaTime(iface->pPosition);
+ ResetEvent(iface->ThreadSignal);
+ ResetEvent(iface->RenderEvent);
+ return S_OK;
+}
+
+HRESULT WINAPI BaseRendererImpl_ClearPendingSample(BaseRenderer *iface)
+{
+ if (iface->pMediaSample)
+ {
+ IMediaSample_Release(iface->pMediaSample);
+ iface->pMediaSample = NULL;
+ }
return S_OK;
}
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 46544ba..7e25c04 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -583,6 +583,9 @@ typedef struct BaseRendererTag
IUnknown *pPosition;
CRITICAL_SECTION csRenderLock;
HANDLE evComplete;
+ HANDLE ThreadSignal;
+ HANDLE RenderEvent;
+ IMediaSample *pMediaSample;
const struct BaseRendererFuncTable * pFuncsTable;
} BaseRenderer;
@@ -639,6 +642,7 @@ HRESULT WINAPI BaseRendererImpl_GetState(IBaseFilter * iface, DWORD dwMilliSecsT
HRESULT WINAPI BaseRendererImpl_EndOfStream(BaseRenderer* iface);
HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer* iface);
HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer* iface);
+HRESULT WINAPI BaseRendererImpl_ClearPendingSample(BaseRenderer *iface);
HRESULT WINAPI BaseRenderer_Init(BaseRenderer *This, const IBaseFilterVtbl *Vtbl, IUnknown *pUnkOuter, const CLSID *pClsid, DWORD_PTR DebugInfo, const BaseRendererFuncTable* pBaseFuncsTable);
More information about the wine-cvs
mailing list