[PATCH v2 5/5] strmbase: Store the quality control object directly in strmbase_renderer.

Zebediah Figura z.figura12 at gmail.com
Fri Jul 17 14:51:24 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/strmbase/qualitycontrol.c   | 22 +++++-----------------
 dlls/strmbase/renderer.c         | 16 +++++++---------
 dlls/strmbase/strmbase_private.h | 18 ------------------
 include/wine/strmbase.h          | 20 +++++++++++++++++---
 4 files changed, 29 insertions(+), 47 deletions(-)

diff --git a/dlls/strmbase/qualitycontrol.c b/dlls/strmbase/qualitycontrol.c
index c4e055858ef..d0bd070d447 100644
--- a/dlls/strmbase/qualitycontrol.c
+++ b/dlls/strmbase/qualitycontrol.c
@@ -27,11 +27,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(strmbase_qc);
 
-void QualityControlImpl_Destroy(struct strmbase_qc *This)
-{
-    HeapFree(GetProcessHeap(),0,This);
-}
-
 static inline struct strmbase_qc *impl_from_IQualityControl(IQualityControl *iface)
 {
     return CONTAINING_RECORD(iface, struct strmbase_qc, IQualityControl_iface);
@@ -313,17 +308,10 @@ void QualityControlRender_EndRender(struct strmbase_qc *This)
         This->avg_render = UPDATE_RUNNING_AVG (This->avg_render, elapsed);
 }
 
-HRESULT QualityControlImpl_Create(struct strmbase_pin *pin, struct strmbase_qc **ppv)
+void strmbase_qc_init(struct strmbase_qc *qc, struct strmbase_pin *pin)
 {
-    struct strmbase_qc *This;
-    *ppv = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(struct strmbase_qc));
-    if (!*ppv)
-        return E_OUTOFMEMORY;
-    This = *ppv;
-    This->pin = pin;
-    This->tonotify = NULL;
-    This->current_rstart = This->current_rstop = -1;
-    This->IQualityControl_iface.lpVtbl = &quality_control_vtbl;
-    TRACE("-> %p\n", This);
-    return S_OK;
+    memset(qc, 0, sizeof(*qc));
+    qc->pin = pin;
+    qc->current_rstart = qc->current_rstop = -1;
+    qc->IQualityControl_iface.lpVtbl = &quality_control_vtbl;
 }
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 3895cb31194..939811bfa90 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -63,7 +63,7 @@ static HRESULT renderer_query_interface(struct strmbase_filter *iface, REFIID ii
     else if (IsEqualGUID(iid, &IID_IMediaSeeking))
         *out = &filter->passthrough.IMediaSeeking_iface;
     else if (IsEqualGUID(iid, &IID_IQualityControl))
-        *out = &filter->qcimpl->IQualityControl_iface;
+        *out = &filter->qc.IQualityControl_iface;
     else
         return E_NOINTERFACE;
 
@@ -93,7 +93,7 @@ static HRESULT renderer_start_stream(struct strmbase_filter *iface, REFERENCE_TI
     SetEvent(filter->state_event);
     if (filter->sink.pin.peer)
         filter->eos = FALSE;
-    QualityControlRender_Start(filter->qcimpl, filter->stream_start);
+    QualityControlRender_Start(&filter->qc, filter->stream_start);
     if (filter->sink.pin.peer && filter->pFuncsTable->renderer_start_stream)
         filter->pFuncsTable->renderer_start_stream(filter);
 
@@ -234,7 +234,7 @@ static HRESULT sink_end_flush(struct strmbase_sink *iface)
     EnterCriticalSection(&filter->csRenderLock);
 
     filter->eos = FALSE;
-    QualityControlRender_Start(filter->qcimpl, filter->stream_start);
+    QualityControlRender_Start(&filter->qc, filter->stream_start);
     strmbase_passthrough_invalidate_time(&filter->passthrough);
     ResetEvent(filter->flush_event);
 
@@ -272,7 +272,6 @@ void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
     CloseHandle(filter->state_event);
     CloseHandle(filter->advise_event);
     CloseHandle(filter->flush_event);
-    QualityControlImpl_Destroy(filter->qcimpl);
     strmbase_filter_cleanup(&filter->filter);
 }
 
@@ -367,12 +366,12 @@ HRESULT WINAPI BaseRendererImpl_Receive(struct strmbase_renderer *This, IMediaSa
 
     if (SUCCEEDED(hr))
     {
-        QualityControlRender_BeginRender(This->qcimpl, start, stop);
+        QualityControlRender_BeginRender(&This->qc, start, stop);
         hr = This->pFuncsTable->pfnDoRenderSample(This, pSample);
-        QualityControlRender_EndRender(This->qcimpl);
+        QualityControlRender_EndRender(&This->qc);
     }
 
-    QualityControlRender_DoQOS(This->qcimpl);
+    QualityControlRender_DoQOS(&This->qc);
 
     LeaveCriticalSection(&This->csRenderLock);
 
@@ -386,6 +385,7 @@ void strmbase_renderer_init(struct strmbase_renderer *filter, IUnknown *outer,
     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);
+    strmbase_qc_init(&filter->qc, &filter->sink.pin);
 
     filter->pFuncsTable = ops;
 
@@ -396,6 +396,4 @@ void strmbase_renderer_init(struct strmbase_renderer *filter, IUnknown *outer,
     filter->state_event = CreateEventW(NULL, TRUE, TRUE, NULL);
     filter->advise_event = CreateEventW(NULL, FALSE, FALSE, NULL);
     filter->flush_event = CreateEventW(NULL, TRUE, TRUE, NULL);
-
-    QualityControlImpl_Create(&filter->sink.pin, &filter->qcimpl);
 }
diff --git a/dlls/strmbase/strmbase_private.h b/dlls/strmbase/strmbase_private.h
index 15be9498e7d..d589213b713 100644
--- a/dlls/strmbase/strmbase_private.h
+++ b/dlls/strmbase/strmbase_private.h
@@ -53,24 +53,6 @@ static inline const char *debugstr_time(REFERENCE_TIME time)
     return wine_dbg_sprintf("%s", rev);
 }
 
-/* Quality Control */
-struct strmbase_qc
-{
-    IQualityControl IQualityControl_iface;
-    struct strmbase_pin *pin;
-    IQualityControl *tonotify;
-
-    /* Render stuff */
-    REFERENCE_TIME last_in_time, last_left, avg_duration, avg_pt, avg_render, start, stop;
-    REFERENCE_TIME current_jitter, current_rstart, current_rstop, clockstart;
-    double avg_rate;
-    LONG64 rendered, dropped;
-    BOOL qos_handled, is_dropped;
-};
-
-HRESULT QualityControlImpl_Create(struct strmbase_pin *pin, struct strmbase_qc **out);
-void QualityControlImpl_Destroy(struct strmbase_qc *qc);
-
 void QualityControlRender_Start(struct strmbase_qc *This, REFERENCE_TIME tStart);
 void QualityControlRender_DoQOS(struct strmbase_qc *priv);
 void QualityControlRender_BeginRender(struct strmbase_qc *This, REFERENCE_TIME start, REFERENCE_TIME stop);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index b0fa68ecf10..2e84edb7cdd 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -271,10 +271,27 @@ struct strmbase_passthrough
 void strmbase_passthrough_init(struct strmbase_passthrough *passthrough, IUnknown *outer);
 void strmbase_passthrough_cleanup(struct strmbase_passthrough *passthrough);
 
+struct strmbase_qc
+{
+    IQualityControl IQualityControl_iface;
+    struct strmbase_pin *pin;
+    IQualityControl *tonotify;
+
+    /* Render stuff */
+    REFERENCE_TIME last_in_time, last_left, avg_duration, avg_pt, avg_render, start, stop;
+    REFERENCE_TIME current_jitter, current_rstart, current_rstop, clockstart;
+    double avg_rate;
+    LONG64 rendered, dropped;
+    BOOL qos_handled, is_dropped;
+};
+
+void strmbase_qc_init(struct strmbase_qc *qc, struct strmbase_pin *pin);
+
 struct strmbase_renderer
 {
     struct strmbase_filter filter;
     struct strmbase_passthrough passthrough;
+    struct strmbase_qc qc;
 
     struct strmbase_sink sink;
 
@@ -290,9 +307,6 @@ struct strmbase_renderer
     HANDLE flush_event;
     REFERENCE_TIME stream_start;
 
-    IQualityControl *pQSink;
-    struct strmbase_qc *qcimpl;
-
     const struct strmbase_renderer_ops *pFuncsTable;
 
     BOOL eos;
-- 
2.27.0




More information about the wine-devel mailing list