Module: wine Branch: master Commit: 6072a3b5ac86e983a14e5656c5be8a26c72495f6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6072a3b5ac86e983a14e5656c5...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Thu Nov 4 17:02:23 2010 +0100
quartz: Fix EC_COMPLETE handling on video renderer.
---
dlls/quartz/videorenderer.c | 21 ++++++++++++++++++--- 1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 11e6099..c30ce06 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -829,12 +829,15 @@ static HRESULT WINAPI VideoRenderer_Pause(IBaseFilter * iface)
static HRESULT WINAPI VideoRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tStart) { + HRESULT hr = S_OK; VideoRendererImpl *This = (VideoRendererImpl *)iface;
TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->filter.csFilter); - if (This->filter.state != State_Running) + if (This->filter.state == State_Running) + goto out; + if (This->pInputPin->pin.pConnectedTo) { if (This->filter.state == State_Stopped) { @@ -845,10 +848,22 @@ static HRESULT WINAPI VideoRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tSta
This->filter.rtStreamStart = tStart; This->filter.state = State_Running; + } else if (This->filter.filterInfo.pGraph) { + IMediaEventSink *pEventSink; + hr = IFilterGraph_QueryInterface(This->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); + if (SUCCEEDED(hr)) + { + hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)This); + IMediaEventSink_Release(pEventSink); + } + hr = S_OK; } + if (SUCCEEDED(hr)) + This->filter.state = State_Running; +out: LeaveCriticalSection(&This->filter.csFilter);
- return S_OK; + return hr; }
static HRESULT WINAPI VideoRenderer_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState) @@ -913,7 +928,7 @@ static HRESULT WINAPI VideoRenderer_InputPin_EndOfStream(IPin * iface) hr = IFilterGraph_QueryInterface(pFilter->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); if (SUCCEEDED(hr)) { - hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0); + hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)pFilter); IMediaEventSink_Release(pEventSink); } MediaSeekingPassThru_EOS(pFilter->seekthru_unk);