Zebediah Figura : strmbase: Wait for presentation time after rendering the first sample.
Module: wine Branch: master Commit: 8803a81b33e0f17833226464b47ed13276b0a70b URL: https://source.winehq.org/git/wine.git/?a=commit;h=8803a81b33e0f17833226464b... Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Mon Jul 20 17:49:07 2020 -0500 strmbase: Wait for presentation time after rendering the first sample. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/strmbase/renderer.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index bc2d0551fe..b6d552b3b0 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -170,13 +170,16 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp { struct strmbase_renderer *filter = impl_from_IPin(&pin->pin.IPin_iface); REFERENCE_TIME start, stop; + BOOL need_wait = FALSE; + FILTER_STATE state; + HRESULT hr = S_OK; AM_MEDIA_TYPE *mt; - HRESULT hr; if (filter->eos || filter->sink.flushing) return S_FALSE; - if (filter->filter.state == State_Stopped) + state = filter->filter.state; + if (state == State_Stopped) return VFW_E_WRONG_STATE; if (IMediaSample_GetMediaType(sample, &mt) == S_OK) @@ -194,12 +197,25 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp SetEvent(filter->state_event); if (filter->filter.clock && SUCCEEDED(IMediaSample_GetTime(sample, &start, &stop))) + { + strmbase_passthrough_update_time(&filter->passthrough, start); + need_wait = TRUE; + } + else + start = stop = -1; + + if (state == State_Paused) + { + QualityControlRender_BeginRender(&filter->qc, start, stop); + hr = filter->pFuncsTable->pfnDoRenderSample(filter, sample); + QualityControlRender_EndRender(&filter->qc); + } + + if (need_wait) { REFERENCE_TIME now; DWORD_PTR cookie; - strmbase_passthrough_update_time(&filter->passthrough, start); - IReferenceClock_GetTime(filter->filter.clock, &now); if (now - filter->stream_start - start <= -10000) @@ -224,12 +240,14 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp EnterCriticalSection(&filter->csRenderLock); } } - else - start = stop = -1; - QualityControlRender_BeginRender(&filter->qc, start, stop); - hr = filter->pFuncsTable->pfnDoRenderSample(filter, sample); - QualityControlRender_EndRender(&filter->qc); + if (state == State_Running) + { + QualityControlRender_BeginRender(&filter->qc, start, stop); + hr = filter->pFuncsTable->pfnDoRenderSample(filter, sample); + QualityControlRender_EndRender(&filter->qc); + } + QualityControlRender_DoQOS(&filter->qc); LeaveCriticalSection(&filter->csRenderLock);
participants (1)
-
Alexandre Julliard