quartz: Fix EC_COMPLETE handling on null renderer.

This commit is contained in:
Maarten Lankhorst 2010-11-04 17:02:25 +01:00 committed by Alexandre Julliard
parent 822c3fe9ea
commit 79f717bb91
1 changed files with 21 additions and 4 deletions

View File

@ -334,19 +334,36 @@ static HRESULT WINAPI NullRenderer_Pause(IBaseFilter * iface)
static HRESULT WINAPI NullRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tStart) static HRESULT WINAPI NullRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
{ {
HRESULT hr = S_OK;
NullRendererImpl *This = (NullRendererImpl *)iface; NullRendererImpl *This = (NullRendererImpl *)iface;
TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart)); TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->filter.csFilter); EnterCriticalSection(&This->filter.csFilter);
if (This->filter.state == State_Running)
goto out;
if (This->pInputPin->pin.pConnectedTo)
{ {
This->filter.rtStreamStart = tStart; This->filter.rtStreamStart = tStart;
This->filter.state = State_Running;
This->pInputPin->end_of_stream = 0; 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); LeaveCriticalSection(&This->filter.csFilter);
return S_OK; return hr;
} }
/** IBaseFilter implementation **/ /** IBaseFilter implementation **/
@ -404,10 +421,10 @@ static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface)
graph = pNull->filter.filterInfo.pGraph; graph = pNull->filter.filterInfo.pGraph;
if (graph) 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)) 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); IMediaEventSink_Release(pEventSink);
} }
} }