From: Zebediah Figura Subject: [PATCH 5/8] strmbase/renderer: Use base sink streaming methods. Message-Id: <20191212033040.2228-5-z.figura12@gmail.com> Date: Wed, 11 Dec 2019 21:30:37 -0600 In-Reply-To: <20191212033040.2228-1-z.figura12@gmail.com> References: <20191212033040.2228-1-z.figura12@gmail.com> Signed-off-by: Zebediah Figura --- dlls/strmbase/renderer.c | 142 +++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 74 deletions(-) diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index 7b9736ccfb2..3c9692029dd 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -40,77 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface) return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface); } -static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface) -{ - struct strmbase_renderer *filter = impl_from_IPin(iface); - IFilterGraph *graph = filter->filter.filterInfo.pGraph; - IMediaEventSink *event_sink; - HRESULT hr = S_OK; - - TRACE("iface %p.\n", iface); - - EnterCriticalSection(&filter->csRenderLock); - filter->eos = TRUE; - - if (graph && SUCCEEDED(IFilterGraph_QueryInterface(graph, - &IID_IMediaEventSink, (void **)&event_sink))) - { - IMediaEventSink_Notify(event_sink, EC_COMPLETE, S_OK, - (LONG_PTR)&filter->filter.IBaseFilter_iface); - IMediaEventSink_Release(event_sink); - } - RendererPosPassThru_EOS(filter->pPosition); - SetEvent(filter->state_event); - - if (filter->pFuncsTable->pfnEndOfStream) - hr = filter->pFuncsTable->pfnEndOfStream(filter); - LeaveCriticalSection(&filter->csRenderLock); - return hr; -} - -static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin * iface) -{ - struct strmbase_renderer *pFilter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p.\n", iface); - - EnterCriticalSection(&pFilter->filter.csFilter); - hr = BaseInputPinImpl_BeginFlush(iface); - if (SUCCEEDED(hr)) - { - BaseRendererImpl_ClearPendingSample(pFilter); - SetEvent(pFilter->flush_event); - } - LeaveCriticalSection(&pFilter->filter.csFilter); - return hr; -} - -static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface) -{ - struct strmbase_renderer *pFilter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p.\n", iface); - - EnterCriticalSection(&pFilter->filter.csFilter); - EnterCriticalSection(&pFilter->csRenderLock); - pFilter->eos = FALSE; - hr = BaseInputPinImpl_EndFlush(iface); - if (SUCCEEDED(hr)) - { - QualityControlRender_Start(pFilter->qcimpl, pFilter->stream_start); - RendererPosPassThru_ResetMediaTime(pFilter->pPosition); - ResetEvent(pFilter->flush_event); - - if (pFilter->pFuncsTable->pfnEndFlush) - hr = pFilter->pFuncsTable->pfnEndFlush(pFilter); - } - LeaveCriticalSection(&pFilter->csRenderLock); - LeaveCriticalSection(&pFilter->filter.csFilter); - return hr; -} - static const IPinVtbl BaseRenderer_InputPin_Vtbl = { BasePinImpl_QueryInterface, @@ -127,9 +56,9 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl = BasePinImpl_QueryAccept, BasePinImpl_EnumMediaTypes, BasePinImpl_QueryInternalConnections, - BaseRenderer_InputPin_EndOfStream, - BaseRenderer_InputPin_BeginFlush, - BaseRenderer_InputPin_EndFlush, + BaseInputPinImpl_EndOfStream, + BaseInputPinImpl_BeginFlush, + BaseInputPinImpl_EndFlush, BaseInputPinImpl_NewSegment }; @@ -289,6 +218,68 @@ static void sink_disconnect(struct strmbase_sink *iface) filter->pFuncsTable->pfnBreakConnect(filter); } +static HRESULT sink_eos(struct strmbase_sink *iface) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + IFilterGraph *graph = filter->filter.filterInfo.pGraph; + IMediaEventSink *event_sink; + HRESULT hr; + + EnterCriticalSection(&filter->csRenderLock); + + filter->eos = TRUE; + + if (graph && SUCCEEDED(IFilterGraph_QueryInterface(graph, + &IID_IMediaEventSink, (void **)&event_sink))) + { + IMediaEventSink_Notify(event_sink, EC_COMPLETE, S_OK, + (LONG_PTR)&filter->filter.IBaseFilter_iface); + IMediaEventSink_Release(event_sink); + } + RendererPosPassThru_EOS(filter->pPosition); + SetEvent(filter->state_event); + + if (filter->pFuncsTable->pfnEndOfStream) + hr = filter->pFuncsTable->pfnEndOfStream(filter); + + LeaveCriticalSection(&filter->csRenderLock); + return hr; +} + +static HRESULT sink_begin_flush(struct strmbase_sink *iface) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + + EnterCriticalSection(&filter->filter.csFilter); + + BaseRendererImpl_ClearPendingSample(filter); + SetEvent(filter->flush_event); + + LeaveCriticalSection(&filter->filter.csFilter); + return S_OK; +} + +static HRESULT sink_end_flush(struct strmbase_sink *iface) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + HRESULT hr = S_OK; + + EnterCriticalSection(&filter->filter.csFilter); + EnterCriticalSection(&filter->csRenderLock); + + filter->eos = FALSE; + QualityControlRender_Start(filter->qcimpl, filter->stream_start); + RendererPosPassThru_ResetMediaTime(filter->pPosition); + ResetEvent(filter->flush_event); + + if (filter->pFuncsTable->pfnEndFlush) + hr = filter->pFuncsTable->pfnEndFlush(filter); + + LeaveCriticalSection(&filter->csRenderLock); + LeaveCriticalSection(&filter->filter.csFilter); + return hr; +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, @@ -297,6 +288,9 @@ static const struct strmbase_sink_ops sink_ops = .pfnReceive = BaseRenderer_Receive, .sink_connect = sink_connect, .sink_disconnect = sink_disconnect, + .sink_eos = sink_eos, + .sink_begin_flush = sink_begin_flush, + .sink_end_flush = sink_end_flush, }; void strmbase_renderer_cleanup(struct strmbase_renderer *filter) -- 2.24.0