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