Zebediah Figura : strmbase: Wait for the presentation time in BaseRendererImpl_Receive().
Alexandre Julliard
julliard at winehq.org
Tue Jul 2 15:32:01 CDT 2019
Module: wine
Branch: master
Commit: c0712a97a684ef23bbdfb6c1353c4220094e78a8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c0712a97a684ef23bbdfb6c1353c4220094e78a8
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon Jul 1 22:49:46 2019 -0500
strmbase: Wait for the presentation time in BaseRendererImpl_Receive().
Try to make the quality control object more clearly responsible for
calculating quality after the fact, and only that.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/strmbase/qualitycontrol.c | 65 ++++++++++++++--------------------------
dlls/strmbase/renderer.c | 26 ++++++++++++----
dlls/strmbase/strmbase_private.h | 3 +-
3 files changed, 44 insertions(+), 50 deletions(-)
diff --git a/dlls/strmbase/qualitycontrol.c b/dlls/strmbase/qualitycontrol.c
index d6a91a7..139c4df 100644
--- a/dlls/strmbase/qualitycontrol.c
+++ b/dlls/strmbase/qualitycontrol.c
@@ -171,46 +171,6 @@ static BOOL QualityControlRender_IsLate(QualityControlImpl *This, REFERENCE_TIME
return FALSE;
}
-HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev)
-{
- REFERENCE_TIME start = -1, stop = -1, jitter = 0;
-
- TRACE("%p %p %p\n", This, sample, ev);
-
- This->current_rstart = This->current_rstop = -1;
- This->current_jitter = 0;
- if (!This->clock || FAILED(IMediaSample_GetTime(sample, &start, &stop)))
- return S_OK;
-
- if (start >= 0) {
- REFERENCE_TIME now;
- IReferenceClock_GetTime(This->clock, &now);
- now -= This->clockstart;
-
- jitter = now - start;
- if (jitter <= -10000) {
- DWORD_PTR cookie;
- IReferenceClock_AdviseTime(This->clock, This->clockstart, start, (HEVENT)ev, &cookie);
- WaitForSingleObject(ev, INFINITE);
- IReferenceClock_Unadvise(This->clock, cookie);
- }
- }
- else
- start = stop = -1;
- This->current_rstart = start;
- This->current_rstop = stop > start ? stop : start;
- This->current_jitter = jitter;
- This->is_dropped = QualityControlRender_IsLate(This, jitter, start, stop);
- TRACE("Dropped: %i %i %i %i\n", This->is_dropped, (int)(start/10000), (int)(stop/10000), (int)(jitter / 10000));
- if (This->is_dropped) {
- This->dropped++;
- if (!This->qos_handled)
- return S_FALSE;
- } else
- This->rendered++;
- return S_OK;
-}
-
void QualityControlRender_DoQOS(QualityControlImpl *priv)
{
REFERENCE_TIME start, stop, jitter, pt, entered, left, duration;
@@ -324,12 +284,31 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv)
}
-void QualityControlRender_BeginRender(QualityControlImpl *This)
+void QualityControlRender_BeginRender(QualityControlImpl *This, REFERENCE_TIME start, REFERENCE_TIME stop)
{
- TRACE("%p\n", This);
-
This->start = -1;
+ This->current_rstart = start;
+ This->current_rstop = max(stop, start);
+
+ if (start >= 0)
+ {
+ REFERENCE_TIME now;
+ IReferenceClock_GetTime(This->clock, &now);
+ This->current_jitter = (now - This->clockstart) - start;
+ }
+ else
+ This->current_jitter = 0;
+
+ /* FIXME: This isn't correct; we don't drop samples, nor should. */
+ This->is_dropped = QualityControlRender_IsLate(This, This->current_jitter, start, stop);
+ TRACE("Dropped: %i %i %i %i\n", This->is_dropped, (int)(start/10000),
+ (int)(stop/10000), (int)(This->current_jitter / 10000));
+ if (This->is_dropped)
+ This->dropped++;
+ else
+ This->rendered++;
+
if (!This->clock)
return;
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 1af601a..2c71024 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -345,7 +345,7 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
}
/* Wait for render Time */
- if (SUCCEEDED(IMediaSample_GetTime(pSample, &start, &stop)))
+ if (This->filter.pClock && SUCCEEDED(IMediaSample_GetTime(pSample, &start, &stop)))
{
hr = S_FALSE;
RendererPosPassThru_RegisterMediaTime(This->pPosition, start);
@@ -356,12 +356,26 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
;/* Do not wait: drop through */
else if (hr == S_FALSE)
{
+ REFERENCE_TIME now;
+ DWORD_PTR cookie;
+
if (This->pFuncsTable->pfnOnWaitStart)
This->pFuncsTable->pfnOnWaitStart(This);
- LeaveCriticalSection(&This->csRenderLock);
- hr = QualityControlRender_WaitFor(This->qcimpl, pSample, This->RenderEvent);
- EnterCriticalSection(&This->csRenderLock);
+ IReferenceClock_GetTime(This->filter.pClock, &now);
+
+ if (now - This->filter.rtStreamStart - start <= -10000)
+ {
+ IReferenceClock_AdviseTime(This->filter.pClock, This->filter.rtStreamStart,
+ start, (HEVENT)This->RenderEvent, &cookie);
+
+ LeaveCriticalSection(&This->csRenderLock);
+
+ WaitForSingleObject(This->RenderEvent, INFINITE);
+ IReferenceClock_Unadvise(This->filter.pClock, cookie);
+
+ EnterCriticalSection(&This->csRenderLock);
+ }
if (This->pFuncsTable->pfnOnWaitEnd)
This->pFuncsTable->pfnOnWaitEnd(This);
@@ -373,10 +387,12 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
return S_OK;
}
}
+ else
+ start = stop = -1;
if (SUCCEEDED(hr))
{
- QualityControlRender_BeginRender(This->qcimpl);
+ QualityControlRender_BeginRender(This->qcimpl, start, stop);
hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
QualityControlRender_EndRender(This->qcimpl);
}
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h
index 769c8f2..439ab9a 100644
--- a/dlls/strmbase/strmbase_private.h
+++ b/dlls/strmbase/strmbase_private.h
@@ -59,9 +59,8 @@ HRESULT WINAPI QualityControlImpl_SetSink(IQualityControl *iface, IQualityContro
void QualityControlRender_Start(QualityControlImpl *This, REFERENCE_TIME tStart);
void QualityControlRender_SetClock(QualityControlImpl *This, IReferenceClock *clock);
-HRESULT QualityControlRender_WaitFor(QualityControlImpl *This, IMediaSample *sample, HANDLE ev);
void QualityControlRender_DoQOS(QualityControlImpl *priv);
-void QualityControlRender_BeginRender(QualityControlImpl *This);
+void QualityControlRender_BeginRender(QualityControlImpl *This, REFERENCE_TIME start, REFERENCE_TIME stop);
void QualityControlRender_EndRender(QualityControlImpl *This);
HRESULT enum_pins_create(BaseFilter *base, IEnumPins **enum_pins);
More information about the wine-cvs
mailing list