[PATCH 5/7] strmbase: Use strmbase_passthrough directly in strmbase_renderer.

Zebediah Figura z.figura12 at gmail.com
Thu Mar 12 21:34:10 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/strmbase/pospass.c          | 102 ++++++++++---------------------
 dlls/strmbase/renderer.c         |  42 ++++++-------
 dlls/strmbase/strmbase_private.h |   6 +-
 include/wine/strmbase.h          |  22 ++++++-
 4 files changed, 72 insertions(+), 100 deletions(-)

diff --git a/dlls/strmbase/pospass.c b/dlls/strmbase/pospass.c
index 086e3e6aeb5..3b4560d35eb 100644
--- a/dlls/strmbase/pospass.c
+++ b/dlls/strmbase/pospass.c
@@ -24,20 +24,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
 
-struct strmbase_passthrough
-{
-    ISeekingPassThru ISeekingPassThru_iface;
-    IMediaSeeking IMediaSeeking_iface;
-    IMediaPosition IMediaPosition_iface;
-
-    IUnknown * outer_unk;
-    IPin * pin;
-    BOOL renderer;
-    CRITICAL_SECTION time_cs;
-    BOOL timevalid;
-    REFERENCE_TIME time_earliest;
-};
-
 static struct strmbase_passthrough *impl_from_ISeekingPassThru(ISeekingPassThru *iface)
 {
     return CONTAINING_RECORD(iface, struct strmbase_passthrough, ISeekingPassThru_iface);
@@ -97,22 +83,6 @@ static const ISeekingPassThruVtbl ISeekingPassThru_Vtbl =
     SeekingPassThru_Init
 };
 
-HRESULT WINAPI CreatePosPassThru(IUnknown* pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru)
-{
-    HRESULT hr;
-    ISeekingPassThru *passthru;
-
-    hr = CoCreateInstance(&CLSID_SeekingPassThru, pUnkOuter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)ppPassThru);
-    if (FAILED(hr))
-        return hr;
-
-    IUnknown_QueryInterface(*ppPassThru, &IID_ISeekingPassThru, (void**)&passthru);
-    hr = ISeekingPassThru_Init(passthru, bRenderer, pPin);
-    ISeekingPassThru_Release(passthru);
-
-    return hr;
-}
-
 static HRESULT WINAPI MediaSeekingPassThru_QueryInterface(IMediaSeeking *iface, REFIID iid, void **out)
 {
     struct strmbase_passthrough *passthrough = impl_from_IMediaSeeking(iface);
@@ -763,6 +733,38 @@ void strmbase_passthrough_cleanup(struct strmbase_passthrough *passthrough)
     DeleteCriticalSection(&passthrough->time_cs);
 }
 
+void strmbase_passthrough_update_time(struct strmbase_passthrough *passthrough, REFERENCE_TIME time)
+{
+    EnterCriticalSection(&passthrough->time_cs);
+    passthrough->time_earliest = time;
+    passthrough->timevalid = TRUE;
+    LeaveCriticalSection(&passthrough->time_cs);
+}
+
+void strmbase_passthrough_invalidate_time(struct strmbase_passthrough *passthrough)
+{
+    EnterCriticalSection(&passthrough->time_cs);
+    passthrough->timevalid = FALSE;
+    LeaveCriticalSection(&passthrough->time_cs);
+}
+
+void strmbase_passthrough_eos(struct strmbase_passthrough *passthrough)
+{
+    REFERENCE_TIME time;
+    HRESULT hr;
+
+    hr = IMediaSeeking_GetStopPosition(&passthrough->IMediaSeeking_iface, &time);
+    EnterCriticalSection(&passthrough->time_cs);
+    if (SUCCEEDED(hr))
+    {
+        passthrough->timevalid = TRUE;
+        passthrough->time_earliest = time;
+    }
+    else
+        passthrough->timevalid = FALSE;
+    LeaveCriticalSection(&passthrough->time_cs);
+}
+
 struct seeking_passthrough
 {
     struct strmbase_passthrough passthrough;
@@ -851,43 +853,3 @@ HRESULT WINAPI PosPassThru_Construct(IUnknown *outer, void **out)
     *out = &object->IUnknown_inner;
     return S_OK;
 }
-
-HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start)
-{
-    struct seeking_passthrough *passthrough = impl_from_IUnknown(iface);
-
-    EnterCriticalSection(&passthrough->passthrough.time_cs);
-    passthrough->passthrough.time_earliest = start;
-    passthrough->passthrough.timevalid = TRUE;
-    LeaveCriticalSection(&passthrough->passthrough.time_cs);
-    return S_OK;
-}
-
-HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface)
-{
-    struct seeking_passthrough *passthrough = impl_from_IUnknown(iface);
-
-    EnterCriticalSection(&passthrough->passthrough.time_cs);
-    passthrough->passthrough.timevalid = FALSE;
-    LeaveCriticalSection(&passthrough->passthrough.time_cs);
-    return S_OK;
-}
-
-HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface)
-{
-    struct seeking_passthrough *passthrough = impl_from_IUnknown(iface);
-    REFERENCE_TIME time;
-    HRESULT hr;
-
-    hr = IMediaSeeking_GetStopPosition(&passthrough->passthrough.IMediaSeeking_iface, &time);
-    EnterCriticalSection(&passthrough->passthrough.time_cs);
-    if (SUCCEEDED(hr))
-    {
-        passthrough->passthrough.timevalid = TRUE;
-        passthrough->passthrough.time_earliest = time;
-    }
-    else
-        passthrough->passthrough.timevalid = FALSE;
-    LeaveCriticalSection(&passthrough->passthrough.time_cs);
-    return hr;
-}
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 6b5a5e80e3e..57e0d2041ca 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -66,15 +66,17 @@ static HRESULT renderer_query_interface(struct strmbase_filter *iface, REFIID ii
         return hr;
     }
 
-    if (IsEqualIID(iid, &IID_IMediaSeeking) || IsEqualIID(iid, &IID_IMediaPosition))
-        return IUnknown_QueryInterface(filter->pPosition, iid, out);
-    else if (IsEqualIID(iid, &IID_IQualityControl))
-    {
+    if (IsEqualGUID(iid, &IID_IMediaPosition))
+        *out = &filter->passthrough.IMediaPosition_iface;
+    else if (IsEqualGUID(iid, &IID_IMediaSeeking))
+        *out = &filter->passthrough.IMediaSeeking_iface;
+    else if (IsEqualGUID(iid, &IID_IQualityControl))
         *out = &filter->qcimpl->IQualityControl_iface;
-        IUnknown_AddRef((IUnknown *)*out);
-        return S_OK;
-    }
-    return E_NOINTERFACE;
+    else
+        return E_NOINTERFACE;
+
+    IUnknown_AddRef((IUnknown *)*out);
+    return S_OK;
 }
 
 static HRESULT renderer_init_stream(struct strmbase_filter *iface)
@@ -120,7 +122,7 @@ static HRESULT renderer_cleanup_stream(struct strmbase_filter *iface)
 {
     struct strmbase_renderer *filter = impl_from_strmbase_filter(iface);
 
-    RendererPosPassThru_ResetMediaTime(filter->pPosition);
+    strmbase_passthrough_invalidate_time(&filter->passthrough);
     SetEvent(filter->state_event);
     SetEvent(filter->flush_event);
 
@@ -213,7 +215,7 @@ static HRESULT sink_eos(struct strmbase_sink *iface)
                 (LONG_PTR)&filter->filter.IBaseFilter_iface);
         IMediaEventSink_Release(event_sink);
     }
-    RendererPosPassThru_EOS(filter->pPosition);
+    strmbase_passthrough_eos(&filter->passthrough);
     SetEvent(filter->state_event);
 
     if (filter->pFuncsTable->pfnEndOfStream)
@@ -241,7 +243,7 @@ static HRESULT sink_end_flush(struct strmbase_sink *iface)
 
     filter->eos = FALSE;
     QualityControlRender_Start(filter->qcimpl, filter->stream_start);
-    RendererPosPassThru_ResetMediaTime(filter->pPosition);
+    strmbase_passthrough_invalidate_time(&filter->passthrough);
     ResetEvent(filter->flush_event);
 
     if (filter->pFuncsTable->pfnEndFlush)
@@ -271,8 +273,7 @@ void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
     IPin_Disconnect(&filter->sink.pin.IPin_iface);
     strmbase_sink_cleanup(&filter->sink);
 
-    if (filter->pPosition)
-        IUnknown_Release(filter->pPosition);
+    strmbase_passthrough_cleanup(&filter->passthrough);
 
     filter->csRenderLock.DebugInfo->Spare[0] = 0;
     DeleteCriticalSection(&filter->csRenderLock);
@@ -328,7 +329,7 @@ HRESULT WINAPI BaseRendererImpl_Receive(struct strmbase_renderer *This, IMediaSa
     if (This->filter.clock && SUCCEEDED(IMediaSample_GetTime(pSample, &start, &stop)))
     {
         hr = S_FALSE;
-        RendererPosPassThru_RegisterMediaTime(This->pPosition, start);
+        strmbase_passthrough_update_time(&This->passthrough, start);
         if (This->pFuncsTable->pfnShouldDrawSampleNow)
             hr = This->pFuncsTable->pfnShouldDrawSampleNow(This, pSample, &start, &stop);
 
@@ -390,24 +391,15 @@ HRESULT WINAPI BaseRendererImpl_Receive(struct strmbase_renderer *This, IMediaSa
 HRESULT WINAPI strmbase_renderer_init(struct strmbase_renderer *filter, IUnknown *outer,
         const CLSID *clsid, const WCHAR *sink_name, const struct strmbase_renderer_ops *ops)
 {
-    HRESULT hr;
-
     memset(filter, 0, sizeof(*filter));
     strmbase_filter_init(&filter->filter, outer, clsid, &filter_ops);
+    strmbase_passthrough_init(&filter->passthrough, (IUnknown *)&filter->filter.IBaseFilter_iface);
+    ISeekingPassThru_Init(&filter->passthrough.ISeekingPassThru_iface, TRUE, &filter->sink.pin.IPin_iface);
 
     filter->pFuncsTable = ops;
 
     strmbase_sink_init(&filter->sink, &filter->filter, sink_name, &sink_ops, NULL);
 
-    hr = CreatePosPassThru(outer ? outer : (IUnknown *)&filter->filter.IBaseFilter_iface,
-            TRUE, &filter->sink.pin.IPin_iface, &filter->pPosition);
-    if (FAILED(hr))
-    {
-        strmbase_sink_cleanup(&filter->sink);
-        strmbase_filter_cleanup(&filter->filter);
-        return hr;
-    }
-
     InitializeCriticalSection(&filter->csRenderLock);
     filter->csRenderLock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": strmbase_renderer.csRenderLock");
     filter->state_event = CreateEventW(NULL, TRUE, TRUE, NULL);
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h
index f9ddcad9a6e..e0628c13a1e 100644
--- a/dlls/strmbase/strmbase_private.h
+++ b/dlls/strmbase/strmbase_private.h
@@ -79,8 +79,8 @@ void QualityControlRender_DoQOS(QualityControlImpl *priv);
 void QualityControlRender_BeginRender(QualityControlImpl *This, REFERENCE_TIME start, REFERENCE_TIME stop);
 void QualityControlRender_EndRender(QualityControlImpl *This);
 
-HRESULT WINAPI RendererPosPassThru_RegisterMediaTime(IUnknown *iface, REFERENCE_TIME start);
-HRESULT WINAPI RendererPosPassThru_ResetMediaTime(IUnknown *iface);
-HRESULT WINAPI RendererPosPassThru_EOS(IUnknown *iface);
+void strmbase_passthrough_update_time(struct strmbase_passthrough *passthrough, REFERENCE_TIME time);
+void strmbase_passthrough_invalidate_time(struct strmbase_passthrough *passthrough);
+void strmbase_passthrough_eos(struct strmbase_passthrough *passthrough);
 
 #endif /* __WINE_STRMBASE_PRIVATE_H */
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 0bcac13ebbc..6d620c79337 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "dshow.h"
 #include "wine/list.h"
 
 HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE * pDest, const AM_MEDIA_TYPE *pSrc);
@@ -203,7 +204,6 @@ HRESULT WINAPI SourceSeekingImpl_SetRate(IMediaSeeking * iface, double dRate);
 HRESULT WINAPI SourceSeekingImpl_GetRate(IMediaSeeking * iface, double * dRate);
 HRESULT WINAPI SourceSeekingImpl_GetPreroll(IMediaSeeking * iface, LONGLONG * pPreroll);
 
-HRESULT WINAPI CreatePosPassThru(IUnknown* pUnkOuter, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru);
 HRESULT WINAPI PosPassThru_Construct(IUnknown* pUnkOuter, LPVOID *ppPassThru);
 
 /* Output Queue */
@@ -255,12 +255,30 @@ enum strmbase_type_id
 
 HRESULT strmbase_get_typeinfo(enum strmbase_type_id tid, ITypeInfo **typeinfo);
 
+struct strmbase_passthrough
+{
+    ISeekingPassThru ISeekingPassThru_iface;
+    IMediaSeeking IMediaSeeking_iface;
+    IMediaPosition IMediaPosition_iface;
+
+    IUnknown *outer_unk;
+    IPin *pin;
+    BOOL renderer;
+    BOOL timevalid;
+    CRITICAL_SECTION time_cs;
+    REFERENCE_TIME time_earliest;
+};
+
+void strmbase_passthrough_init(struct strmbase_passthrough *passthrough, IUnknown *outer);
+void strmbase_passthrough_cleanup(struct strmbase_passthrough *passthrough);
+
 struct strmbase_renderer
 {
     struct strmbase_filter filter;
+    struct strmbase_passthrough passthrough;
 
     struct strmbase_sink sink;
-    IUnknown *pPosition;
+
     CRITICAL_SECTION csRenderLock;
     /* Signaled when the filter has completed a state change. The filter waits
      * for this event in IBaseFilter::GetState(). */
-- 
2.25.1




More information about the wine-devel mailing list