Module: wine Branch: master Commit: 79f717bb91e5ffca95413e8d80e84a6a0bcf91fc URL: http://source.winehq.org/git/wine.git/?a=commit;h=79f717bb91e5ffca95413e8d80...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Thu Nov 4 17:02:25 2010 +0100
quartz: Fix EC_COMPLETE handling on null renderer.
---
dlls/quartz/nullrenderer.c | 25 +++++++++++++++++++++---- 1 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/nullrenderer.c b/dlls/quartz/nullrenderer.c index 1764e23..cab2090 100644 --- a/dlls/quartz/nullrenderer.c +++ b/dlls/quartz/nullrenderer.c @@ -334,19 +334,36 @@ static HRESULT WINAPI NullRenderer_Pause(IBaseFilter * iface)
static HRESULT WINAPI NullRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tStart) { + HRESULT hr = S_OK; NullRendererImpl *This = (NullRendererImpl *)iface;
TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->filter.csFilter); + if (This->filter.state == State_Running) + goto out; + if (This->pInputPin->pin.pConnectedTo) { This->filter.rtStreamStart = tStart; - This->filter.state = State_Running; This->pInputPin->end_of_stream = 0; } + 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; }
/** IBaseFilter implementation **/ @@ -404,10 +421,10 @@ static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface) graph = pNull->filter.filterInfo.pGraph; if (graph) { - hr = IFilterGraph_QueryInterface(((NullRendererImpl*)This->pin.pinInfo.pFilter)->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); + hr = IFilterGraph_QueryInterface(pNull->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)pNull); IMediaEventSink_Release(pEventSink); } }