Zebediah Figura : strmbase: Wait for presentation time after rendering the first sample.
Alexandre Julliard
julliard at winehq.org
Tue Jul 21 15:40:20 CDT 2020
Module: wine
Branch: master
Commit: 8803a81b33e0f17833226464b47ed13276b0a70b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8803a81b33e0f17833226464b47ed13276b0a70b
Author: Zebediah Figura <z.figura12 at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list