Zebediah Figura : qcap/smartteefilter: Use strmbase filter aggregation support.

Alexandre Julliard julliard at winehq.org
Wed Jun 5 16:12:39 CDT 2019


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jun  4 17:54:23 2019 -0500

qcap/smartteefilter: Use strmbase filter aggregation support.

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

---

 dlls/qcap/smartteefilter.c | 116 ++++++++-------------------------------------
 1 file changed, 20 insertions(+), 96 deletions(-)

diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index a79e4bb..4095d95 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -36,19 +36,12 @@
 WINE_DEFAULT_DEBUG_CHANNEL(qcap);
 
 typedef struct {
-    IUnknown IUnknown_iface;
-    IUnknown *outerUnknown;
     BaseFilter filter;
     BaseInputPin *input;
     BaseOutputPin *capture;
     BaseOutputPin *preview;
 } SmartTeeFilter;
 
-static inline SmartTeeFilter *impl_from_IUnknown(IUnknown *iface)
-{
-    return CONTAINING_RECORD(iface, SmartTeeFilter, IUnknown_iface);
-}
-
 static inline SmartTeeFilter *impl_from_BaseFilter(BaseFilter *filter)
 {
     return CONTAINING_RECORD(filter, SmartTeeFilter, filter);
@@ -71,80 +64,6 @@ static inline SmartTeeFilter *impl_from_IPin(IPin *iface)
     return impl_from_IBaseFilter(bp->pinInfo.pFilter);
 }
 
-static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
-{
-    SmartTeeFilter *This = impl_from_IUnknown(iface);
-    if (IsEqualIID(riid, &IID_IUnknown)) {
-        TRACE("(%p)->(IID_IUnknown, %p)\n", This, ppv);
-        *ppv = &This->IUnknown_iface;
-    } else if (IsEqualIID(riid, &IID_IPersist)) {
-        TRACE("(%p)->(IID_IPersist, %p)\n", This, ppv);
-        *ppv = &This->filter.IBaseFilter_iface;
-    } else if (IsEqualIID(riid, &IID_IMediaFilter)) {
-        TRACE("(%p)->(IID_IMediaFilter, %p)\n", This, ppv);
-        *ppv = &This->filter.IBaseFilter_iface;
-    } else if (IsEqualIID(riid, &IID_IBaseFilter)) {
-        TRACE("(%p)->(IID_IBaseFilter, %p)\n", This, ppv);
-        *ppv = &This->filter.IBaseFilter_iface;
-    } else {
-        FIXME("(%p): no interface for %s\n", This, debugstr_guid(riid));
-        *ppv = NULL;
-        return E_NOINTERFACE;
-    }
-    IUnknown_AddRef((IUnknown*)*ppv);
-    return S_OK;
-}
-
-static ULONG WINAPI Unknown_AddRef(IUnknown *iface)
-{
-    SmartTeeFilter *This = impl_from_IUnknown(iface);
-    return BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface);
-}
-
-static ULONG WINAPI Unknown_Release(IUnknown *iface)
-{
-    SmartTeeFilter *This = impl_from_IUnknown(iface);
-    ULONG ref = InterlockedDecrement(&This->filter.refcount);
-
-    TRACE("(%p)->() ref=%d\n", This, ref);
-
-    if (!ref) {
-        if(This->input)
-            BaseInputPinImpl_Release(&This->input->pin.IPin_iface);
-        if(This->capture)
-            BaseOutputPinImpl_Release(&This->capture->pin.IPin_iface);
-        if(This->preview)
-            BaseOutputPinImpl_Release(&This->preview->pin.IPin_iface);
-        strmbase_filter_cleanup(&This->filter);
-        CoTaskMemFree(This);
-    }
-    return ref;
-}
-
-static const IUnknownVtbl UnknownVtbl = {
-    Unknown_QueryInterface,
-    Unknown_AddRef,
-    Unknown_Release
-};
-
-static HRESULT WINAPI SmartTeeFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)
-{
-    SmartTeeFilter *This = impl_from_IBaseFilter(iface);
-    return IUnknown_QueryInterface(This->outerUnknown, riid, ppv);
-}
-
-static ULONG WINAPI SmartTeeFilter_AddRef(IBaseFilter *iface)
-{
-    SmartTeeFilter *This = impl_from_IBaseFilter(iface);
-    return IUnknown_AddRef(This->outerUnknown);
-}
-
-static ULONG WINAPI SmartTeeFilter_Release(IBaseFilter *iface)
-{
-    SmartTeeFilter *This = impl_from_IBaseFilter(iface);
-    return IUnknown_Release(This->outerUnknown);
-}
-
 static HRESULT WINAPI SmartTeeFilter_Stop(IBaseFilter *iface)
 {
     SmartTeeFilter *This = impl_from_IBaseFilter(iface);
@@ -182,9 +101,9 @@ static HRESULT WINAPI SmartTeeFilter_Run(IBaseFilter *iface, REFERENCE_TIME tSta
 }
 
 static const IBaseFilterVtbl SmartTeeFilterVtbl = {
-    SmartTeeFilter_QueryInterface,
-    SmartTeeFilter_AddRef,
-    SmartTeeFilter_Release,
+    BaseFilterImpl_QueryInterface,
+    BaseFilterImpl_AddRef,
+    BaseFilterImpl_Release,
     BaseFilterImpl_GetClassID,
     SmartTeeFilter_Stop,
     SmartTeeFilter_Pause,
@@ -217,8 +136,23 @@ static IPin *smart_tee_get_pin(BaseFilter *iface, unsigned int index)
     return ret;
 }
 
+static void smart_tee_destroy(BaseFilter *iface)
+{
+    SmartTeeFilter *filter = impl_from_BaseFilter(iface);
+
+    if (filter->input)
+        BaseInputPinImpl_Release(&filter->input->pin.IPin_iface);
+    if (filter->capture)
+        BaseOutputPinImpl_Release(&filter->capture->pin.IPin_iface);
+    if (filter->preview)
+        BaseOutputPinImpl_Release(&filter->preview->pin.IPin_iface);
+    strmbase_filter_cleanup(&filter->filter);
+    CoTaskMemFree(filter);
+}
+
 static const BaseFilterFuncTable SmartTeeFilterFuncs = {
     .filter_get_pin = smart_tee_get_pin,
+    .filter_destroy = smart_tee_destroy,
 };
 
 static ULONG WINAPI SmartTeeFilterInput_AddRef(IPin *iface)
@@ -586,21 +520,14 @@ IUnknown* WINAPI QCAP_createSmartTeeFilter(IUnknown *outer, HRESULT *phr)
     HRESULT hr;
     SmartTeeFilter *This = NULL;
 
-    TRACE("(%p, %p)\n", outer, phr);
-
     This = CoTaskMemAlloc(sizeof(*This));
     if (This == NULL) {
         *phr = E_OUTOFMEMORY;
         return NULL;
     }
     memset(This, 0, sizeof(*This));
-    This->IUnknown_iface.lpVtbl = &UnknownVtbl;
-    if (outer)
-        This->outerUnknown = outer;
-    else
-        This->outerUnknown = &This->IUnknown_iface;
 
-    strmbase_filter_init(&This->filter, &SmartTeeFilterVtbl, NULL, &CLSID_SmartTee,
+    strmbase_filter_init(&This->filter, &SmartTeeFilterVtbl, outer, &CLSID_SmartTee,
             (DWORD_PTR)(__FILE__ ": SmartTeeFilter.csFilter"), &SmartTeeFilterFuncs);
 
     inputPinInfo.pFilter = &This->filter.IBaseFilter_iface;
@@ -626,10 +553,7 @@ IUnknown* WINAPI QCAP_createSmartTeeFilter(IUnknown *outer, HRESULT *phr)
 end:
     *phr = hr;
     if (SUCCEEDED(hr)) {
-        if (outer)
-            return &This->IUnknown_iface;
-        else
-            return (IUnknown*)&This->filter.IBaseFilter_iface;
+        return &This->filter.IUnknown_inner;
     } else {
         strmbase_filter_cleanup(&This->filter);
         return NULL;




More information about the wine-cvs mailing list