[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