Zebediah Figura : qedit/samplegrabber: Use the strmbase_passthrough object directly.

Alexandre Julliard julliard at winehq.org
Mon Mar 30 16:24:25 CDT 2020


Module: wine
Branch: master
Commit: 9829385c3881b67bc2eb1ac32afa56c8d532b07e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9829385c3881b67bc2eb1ac32afa56c8d532b07e

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sat Mar 28 12:02:06 2020 -0500

qedit/samplegrabber: Use the strmbase_passthrough object directly.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/qedit/samplegrabber.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 7e29154762..afb48bf84d 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -39,8 +39,7 @@ typedef struct _SG_Impl {
     ISampleGrabber ISampleGrabber_iface;
 
     struct strmbase_source source;
-    /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
-    IUnknown *seekthru_unk;
+    struct strmbase_passthrough passthrough;
 
     struct strmbase_sink sink;
     AM_MEDIA_TYPE filter_mt;
@@ -86,8 +85,6 @@ static void SampleGrabber_cleanup(SG_Impl *This)
         ISampleGrabberCB_Release(This->grabberIface);
     FreeMediaType(&This->filter_mt);
     CoTaskMemFree(This->bufferData);
-    if(This->seekthru_unk)
-        IUnknown_Release(This->seekthru_unk);
 }
 
 static struct strmbase_pin *sample_grabber_get_pin(struct strmbase_filter *iface, unsigned int index)
@@ -108,6 +105,7 @@ static void sample_grabber_destroy(struct strmbase_filter *iface)
     SampleGrabber_cleanup(filter);
     strmbase_sink_cleanup(&filter->sink);
     strmbase_source_cleanup(&filter->source);
+    strmbase_passthrough_cleanup(&filter->passthrough);
     strmbase_filter_cleanup(&filter->filter);
     CoTaskMemFree(filter);
 }
@@ -550,10 +548,15 @@ static HRESULT sample_grabber_source_query_interface(struct strmbase_pin *iface,
 {
     SG_Impl *filter = impl_from_source_pin(iface);
 
-    if (IsEqualGUID(iid, &IID_IMediaPosition) || IsEqualGUID(iid, &IID_IMediaSeeking))
-        return IUnknown_QueryInterface(filter->seekthru_unk, iid, out);
+    if (IsEqualGUID(iid, &IID_IMediaPosition))
+        *out = &filter->passthrough.IMediaPosition_iface;
+    else if (IsEqualGUID(iid, &IID_IMediaSeeking))
+        *out = &filter->passthrough.IMediaSeeking_iface;
     else
         return E_NOINTERFACE;
+
+    IUnknown_AddRef((IUnknown *)*out);
+    return S_OK;
 }
 
 static HRESULT sample_grabber_source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
@@ -637,8 +640,6 @@ static const struct strmbase_source_ops source_ops =
 HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
 {
     SG_Impl* obj = NULL;
-    ISeekingPassThru *passthru;
-    HRESULT hr;
 
     obj = CoTaskMemAlloc(sizeof(SG_Impl));
     if (NULL == obj) {
@@ -652,7 +653,10 @@ HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
     obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
 
     strmbase_sink_init(&obj->sink, &obj->filter, L"In", &sink_ops, NULL);
+
     strmbase_source_init(&obj->source, &obj->filter, L"Out", &source_ops);
+    strmbase_passthrough_init(&obj->passthrough, (IUnknown *)&obj->source.pin.IPin_iface);
+    ISeekingPassThru_Init(&obj->passthrough.ISeekingPassThru_iface, FALSE, &obj->sink.pin.IPin_iface);
 
     obj->allocator = NULL;
     obj->grabberIface = NULL;
@@ -661,14 +665,6 @@ HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
     obj->bufferLen = -1;
     obj->bufferData = NULL;
 
-    hr = CoCreateInstance(&CLSID_SeekingPassThru, &obj->filter.IUnknown_inner,
-            CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&obj->seekthru_unk);
-    if(hr)
-        return hr;
-    IUnknown_QueryInterface(obj->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
-    ISeekingPassThru_Init(passthru, FALSE, &obj->sink.pin.IPin_iface);
-    ISeekingPassThru_Release(passthru);
-
     *out = &obj->filter.IUnknown_inner;
     return S_OK;
 }




More information about the wine-cvs mailing list