[PATCH 5/5] strmbase: Move tracking of EOS state to the base renderer.

Zebediah Figura z.figura12 at gmail.com
Tue Nov 26 17:39:20 CST 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
Brief manual testing suggests that our filters which use the base transform
don't actually care whether an EOS has been received.

 dlls/strmbase/pin.c       |  4 +---
 dlls/strmbase/renderer.c  | 20 +++++++++-----------
 dlls/strmbase/transform.c |  4 +---
 include/wine/strmbase.h   |  4 +++-
 4 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index 755dd0928a..bdc827c6f6 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -690,8 +690,6 @@ HRESULT WINAPI BaseInputPinImpl_EndOfStream(IPin * iface)
     EnterCriticalSection(&This->pin.filter->csFilter);
     if (This->flushing)
         hr = S_FALSE;
-    else
-        This->end_of_stream = TRUE;
     LeaveCriticalSection(&This->pin.filter->csFilter);
 
     if (hr == S_OK)
@@ -731,7 +729,7 @@ HRESULT WINAPI BaseInputPinImpl_EndFlush(IPin * iface)
     TRACE("(%p)->()\n", This);
 
     EnterCriticalSection(&This->pin.filter->csFilter);
-    This->flushing = This->end_of_stream = FALSE;
+    This->flushing = FALSE;
 
     hr = SendFurther(This, deliver_endflush, NULL);
     LeaveCriticalSection(&This->pin.filter->csFilter);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index add999b4ec..dbb677e9ad 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -89,14 +89,11 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
 
     EnterCriticalSection(&pFilter->csRenderLock);
     EnterCriticalSection(&pFilter->filter.csFilter);
-    hr = BaseInputPinImpl_EndOfStream(iface);
-    if (SUCCEEDED(hr))
-    {
-        if (pFilter->pFuncsTable->pfnEndOfStream)
-            hr = pFilter->pFuncsTable->pfnEndOfStream(pFilter);
-        else
-            hr = BaseRendererImpl_EndOfStream(pFilter);
-    }
+    pFilter->eos = TRUE;
+    if (pFilter->pFuncsTable->pfnEndOfStream)
+        hr = pFilter->pFuncsTable->pfnEndOfStream(pFilter);
+    else
+        hr = BaseRendererImpl_EndOfStream(pFilter);
     LeaveCriticalSection(&pFilter->filter.csFilter);
     LeaveCriticalSection(&pFilter->csRenderLock);
     return hr;
@@ -128,6 +125,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface)
 
     EnterCriticalSection(&pFilter->csRenderLock);
     EnterCriticalSection(&pFilter->filter.csFilter);
+    pFilter->eos = FALSE;
     hr = BaseInputPinImpl_EndFlush(iface);
     if (SUCCEEDED(hr))
     {
@@ -206,7 +204,7 @@ static HRESULT renderer_init_stream(struct strmbase_filter *iface)
 
     if (filter->sink.pin.peer)
         ResetEvent(filter->state_event);
-    filter->sink.end_of_stream = FALSE;
+    filter->eos = FALSE;
     BaseRendererImpl_ClearPendingSample(filter);
     ResetEvent(filter->flush_event);
     if (filter->pFuncsTable->renderer_init_stream)
@@ -222,7 +220,7 @@ static HRESULT renderer_start_stream(struct strmbase_filter *iface, REFERENCE_TI
     filter->stream_start = start;
     SetEvent(filter->state_event);
     if (filter->sink.pin.peer)
-        filter->sink.end_of_stream = FALSE;
+        filter->eos = FALSE;
     QualityControlRender_Start(filter->qcimpl, filter->stream_start);
     if (filter->sink.pin.peer && filter->pFuncsTable->renderer_start_stream)
         filter->pFuncsTable->renderer_start_stream(filter);
@@ -339,7 +337,7 @@ HRESULT WINAPI BaseRendererImpl_Receive(struct strmbase_renderer *This, IMediaSa
 
     TRACE("(%p)->%p\n", This, pSample);
 
-    if (This->sink.end_of_stream || This->sink.flushing)
+    if (This->eos || This->sink.flushing)
         return S_FALSE;
 
     if (This->filter.state == State_Stopped)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 29c385793a..d39dbbd3ab 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -76,7 +76,7 @@ static HRESULT WINAPI TransformFilter_Input_Receive(struct strmbase_sink *This,
         return VFW_E_WRONG_STATE;
     }
 
-    if (This->end_of_stream || This->flushing)
+    if (This->flushing)
     {
         LeaveCriticalSection(&pTransform->csReceive);
         return S_FALSE;
@@ -165,7 +165,6 @@ static HRESULT transform_init_stream(struct strmbase_filter *iface)
 
     EnterCriticalSection(&filter->csReceive);
 
-    filter->sink.end_of_stream = FALSE;
     if (filter->pFuncsTable->pfnStartStreaming)
         hr = filter->pFuncsTable->pfnStartStreaming(filter);
     if (SUCCEEDED(hr))
@@ -183,7 +182,6 @@ static HRESULT transform_cleanup_stream(struct strmbase_filter *iface)
 
     EnterCriticalSection(&filter->csReceive);
 
-    filter->sink.end_of_stream = FALSE;
     if (filter->pFuncsTable->pfnStopStreaming)
         hr = filter->pFuncsTable->pfnStopStreaming(filter);
     if (SUCCEEDED(hr))
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index eace7c1e3b..d0a0da1b10 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -81,7 +81,7 @@ struct strmbase_sink
 
     IMemInputPin IMemInputPin_iface;
     IMemAllocator *pAllocator;
-    BOOL flushing, end_of_stream;
+    BOOL flushing;
     IMemAllocator *preferred_allocator;
 
     const struct strmbase_sink_ops *pFuncsTable;
@@ -534,6 +534,8 @@ struct strmbase_renderer
     struct QualityControlImpl *qcimpl;
 
     const struct strmbase_renderer_ops *pFuncsTable;
+
+    BOOL eos;
 };
 
 typedef HRESULT (WINAPI *BaseRenderer_CheckMediaType)(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt);
-- 
2.24.0




More information about the wine-devel mailing list