From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- 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;
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/vfwcapture.c | 197 +++++++++++++++---------------------------------- 1 file changed, 58 insertions(+), 139 deletions(-)
diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c index 7c25900..d9d937a 100644 --- a/dlls/qcap/vfwcapture.c +++ b/dlls/qcap/vfwcapture.c @@ -54,23 +54,16 @@ static HRESULT VfwPin_Construct( IBaseFilter *, LPCRITICAL_SECTION, IPin ** );
typedef struct VfwCapture { - IUnknown IUnknown_inner; BaseFilter filter; IAMStreamConfig IAMStreamConfig_iface; IAMVideoProcAmp IAMVideoProcAmp_iface; IPersistPropertyBag IPersistPropertyBag_iface; - IUnknown *outer_unk; BOOL init; Capture *driver_info;
IPin * pOutputPin; } VfwCapture;
-static inline VfwCapture *impl_from_IUnknown(IUnknown *iface) -{ - return CONTAINING_RECORD(iface, VfwCapture, IUnknown_inner); -} - static inline VfwCapture *impl_from_BaseFilter(BaseFilter *iface) { return CONTAINING_RECORD(iface, VfwCapture, filter); @@ -104,94 +97,6 @@ typedef struct VfwPinImpl VfwCapture *parent; } VfwPinImpl;
- -/* VfwCapture inner IUnknown */ -static HRESULT WINAPI unknown_inner_QueryInterface(IUnknown *iface, REFIID riid, void **ret_iface) -{ - VfwCapture *This = impl_from_IUnknown(iface); - - TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ret_iface); - - *ret_iface = NULL; - - if (IsEqualIID(riid, &IID_IUnknown)) - *ret_iface = &This->IUnknown_inner; - else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IMediaFilter) || - IsEqualIID(riid, &IID_IBaseFilter)) - *ret_iface = &This->filter.IBaseFilter_iface; - else if (IsEqualIID(riid, &IID_IPersistPropertyBag)) - *ret_iface = &This->IPersistPropertyBag_iface; - else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags)) - FIXME("IAMFilterMiscFlags not supported yet!\n"); - else if (IsEqualIID(riid, &IID_ISpecifyPropertyPages)) - FIXME("ISpecifyPropertyPages not supported yet!\n"); - else if (IsEqualIID(riid, &IID_IAMVfwCaptureDialogs)) - FIXME("IAMVfwCaptureDialogs not supported yet!\n"); - else if (IsEqualIID(riid, &IID_IAMStreamConfig)) - *ret_iface = &This->IAMStreamConfig_iface; - else if (IsEqualIID(riid, &IID_IAMVideoProcAmp)) - *ret_iface = &This->IAMVideoProcAmp_iface; - else - WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ret_iface); - - if (!*ret_iface) - return E_NOINTERFACE; - - IUnknown_AddRef((IUnknown*)*ret_iface); - return S_OK; -} - -static ULONG WINAPI unknown_inner_AddRef(IUnknown *iface) -{ - VfwCapture *This = impl_from_IUnknown(iface); - ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; -} - -static ULONG WINAPI unknown_inner_Release(IUnknown *iface) -{ - VfwCapture *This = impl_from_IUnknown(iface); - ULONG ref = InterlockedDecrement(&This->filter.refcount); - - TRACE("(%p) ref=%d\n", This, ref); - - if (!ref) - { - IPin *conn = NULL; - - TRACE("destroying everything\n"); - if (This->init) - { - if (This->filter.state != State_Stopped) - qcap_driver_stop(This->driver_info, &This->filter.state); - qcap_driver_destroy(This->driver_info); - } - IPin_ConnectedTo(This->pOutputPin, &conn); - if (conn) - { - IPin_Disconnect(conn); - IPin_Disconnect(This->pOutputPin); - IPin_Release(conn); - } - IPin_Release(This->pOutputPin); - strmbase_filter_cleanup(&This->filter); - CoTaskMemFree(This); - ObjectRefCount(FALSE); - } - - return ref; -} - -static const IUnknownVtbl unknown_inner_vtbl = -{ - unknown_inner_QueryInterface, - unknown_inner_AddRef, - unknown_inner_Release, -}; - static IPin *vfw_capture_get_pin(BaseFilter *iface, unsigned int index) { VfwCapture *This = impl_from_BaseFilter(iface); @@ -203,36 +108,71 @@ static IPin *vfw_capture_get_pin(BaseFilter *iface, unsigned int index) return This->pOutputPin; }
+static void vfw_capture_destroy(BaseFilter *iface) +{ + VfwCapture *filter = impl_from_BaseFilter(iface); + IPin *peer = NULL; + + if (filter->init) + { + if (filter->filter.state != State_Stopped) + qcap_driver_stop(filter->driver_info, &filter->filter.state); + qcap_driver_destroy(filter->driver_info); + } + IPin_ConnectedTo(filter->pOutputPin, &peer); + if (peer) + { + IPin_Disconnect(peer); + IPin_Disconnect(filter->pOutputPin); + IPin_Release(peer); + } + IPin_Release(filter->pOutputPin); + strmbase_filter_cleanup(&filter->filter); + CoTaskMemFree(filter); + ObjectRefCount(FALSE); +} + +static HRESULT vfw_capture_query_interface(BaseFilter *iface, REFIID iid, void **out) +{ + VfwCapture *filter = impl_from_BaseFilter(iface); + + if (IsEqualGUID(iid, &IID_IPersistPropertyBag)) + *out = &filter->IPersistPropertyBag_iface; + else if (IsEqualGUID(iid, &IID_IAMStreamConfig)) + *out = &filter->IAMStreamConfig_iface; + else if (IsEqualGUID(iid, &IID_IAMVideoProcAmp)) + *out = &filter->IAMVideoProcAmp_iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + static const BaseFilterFuncTable BaseFuncTable = { .filter_get_pin = vfw_capture_get_pin, + .filter_destroy = vfw_capture_destroy, + .filter_query_interface = vfw_capture_query_interface, };
-IUnknown * WINAPI QCAP_createVFWCaptureFilter(IUnknown *pUnkOuter, HRESULT *phr) +IUnknown * WINAPI QCAP_createVFWCaptureFilter(IUnknown *outer, HRESULT *phr) { VfwCapture *pVfwCapture; HRESULT hr;
- TRACE("%p - %p\n", pUnkOuter, phr); - *phr = E_OUTOFMEMORY; pVfwCapture = CoTaskMemAlloc( sizeof(VfwCapture) ); if (!pVfwCapture) return NULL;
- strmbase_filter_init(&pVfwCapture->filter, &VfwCapture_Vtbl, NULL, &CLSID_VfwCapture, + strmbase_filter_init(&pVfwCapture->filter, &VfwCapture_Vtbl, outer, &CLSID_VfwCapture, (DWORD_PTR)(__FILE__ ": VfwCapture.csFilter"), &BaseFuncTable);
- pVfwCapture->IUnknown_inner.lpVtbl = &unknown_inner_vtbl; pVfwCapture->IAMStreamConfig_iface.lpVtbl = &IAMStreamConfig_VTable; pVfwCapture->IAMVideoProcAmp_iface.lpVtbl = &IAMVideoProcAmp_VTable; pVfwCapture->IPersistPropertyBag_iface.lpVtbl = &IPersistPropertyBag_VTable; pVfwCapture->init = FALSE;
- if (pUnkOuter) - pVfwCapture->outer_unk = pUnkOuter; - else - pVfwCapture->outer_unk = &pVfwCapture->IUnknown_inner; - hr = VfwPin_Construct(&pVfwCapture->filter.IBaseFilter_iface, &pVfwCapture->filter.csFilter, &pVfwCapture->pOutputPin); if (FAILED(hr)) @@ -244,28 +184,7 @@ IUnknown * WINAPI QCAP_createVFWCaptureFilter(IUnknown *pUnkOuter, HRESULT *phr)
ObjectRefCount(TRUE); *phr = S_OK; - return &pVfwCapture->IUnknown_inner; -} - -static HRESULT WINAPI VfwCapture_QueryInterface(IBaseFilter *iface, REFIID riid, void **ret_iface) -{ - VfwCapture *This = impl_from_IBaseFilter(iface); - - return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); -} - -static ULONG WINAPI VfwCapture_AddRef(IBaseFilter *iface) -{ - VfwCapture *This = impl_from_IBaseFilter(iface); - - return IUnknown_AddRef(This->outer_unk); -} - -static ULONG WINAPI VfwCapture_Release(IBaseFilter * iface) -{ - VfwCapture *This = impl_from_IBaseFilter(iface); - - return IUnknown_Release(This->outer_unk); + return &pVfwCapture->filter.IUnknown_inner; }
/** IMediaFilter methods **/ @@ -295,9 +214,9 @@ static HRESULT WINAPI VfwCapture_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
static const IBaseFilterVtbl VfwCapture_Vtbl = { - VfwCapture_QueryInterface, - VfwCapture_AddRef, - VfwCapture_Release, + BaseFilterImpl_QueryInterface, + BaseFilterImpl_AddRef, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, VfwCapture_Stop, VfwCapture_Pause, @@ -318,21 +237,21 @@ static HRESULT WINAPI AMStreamConfig_QueryInterface(IAMStreamConfig *iface, REFI { VfwCapture *This = impl_from_IAMStreamConfig(iface);
- return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); + return IUnknown_QueryInterface(This->filter.outer_unk, riid, ret_iface); }
static ULONG WINAPI AMStreamConfig_AddRef( IAMStreamConfig * iface ) { VfwCapture *This = impl_from_IAMStreamConfig(iface);
- return IUnknown_AddRef(This->outer_unk); + return IUnknown_AddRef(This->filter.outer_unk); }
static ULONG WINAPI AMStreamConfig_Release( IAMStreamConfig * iface ) { VfwCapture *This = impl_from_IAMStreamConfig(iface);
- return IUnknown_Release(This->outer_unk); + return IUnknown_Release(This->filter.outer_unk); }
static HRESULT WINAPI @@ -420,21 +339,21 @@ static HRESULT WINAPI AMVideoProcAmp_QueryInterface(IAMVideoProcAmp *iface, REFI { VfwCapture *This = impl_from_IAMVideoProcAmp(iface);
- return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); + return IUnknown_QueryInterface(This->filter.outer_unk, riid, ret_iface); }
static ULONG WINAPI AMVideoProcAmp_AddRef(IAMVideoProcAmp * iface) { VfwCapture *This = impl_from_IAMVideoProcAmp(iface);
- return IUnknown_AddRef(This->outer_unk); + return IUnknown_AddRef(This->filter.outer_unk); }
static ULONG WINAPI AMVideoProcAmp_Release(IAMVideoProcAmp * iface) { VfwCapture *This = impl_from_IAMVideoProcAmp(iface);
- return IUnknown_Release(This->outer_unk); + return IUnknown_Release(This->filter.outer_unk); }
static HRESULT WINAPI @@ -479,21 +398,21 @@ static HRESULT WINAPI PPB_QueryInterface(IPersistPropertyBag *iface, REFIID riid { VfwCapture *This = impl_from_IPersistPropertyBag(iface);
- return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); + return IUnknown_QueryInterface(This->filter.outer_unk, riid, ret_iface); }
static ULONG WINAPI PPB_AddRef(IPersistPropertyBag * iface) { VfwCapture *This = impl_from_IPersistPropertyBag(iface);
- return IUnknown_AddRef(This->outer_unk); + return IUnknown_AddRef(This->filter.outer_unk); }
static ULONG WINAPI PPB_Release(IPersistPropertyBag * iface) { VfwCapture *This = impl_from_IPersistPropertyBag(iface);
- return IUnknown_Release(This->outer_unk); + return IUnknown_Release(This->filter.outer_unk); }
static HRESULT WINAPI
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qedit/nullrenderer.c | 124 ++++++++-------------------------------------- 1 file changed, 21 insertions(+), 103 deletions(-)
diff --git a/dlls/qedit/nullrenderer.c b/dlls/qedit/nullrenderer.c index b2bfb22..74055d7 100644 --- a/dlls/qedit/nullrenderer.c +++ b/dlls/qedit/nullrenderer.c @@ -29,10 +29,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(qedit); typedef struct NullRendererImpl { BaseRenderer renderer; - IUnknown IUnknown_inner; - IUnknown *outer_unk; } NullRendererImpl;
+static inline NullRendererImpl *impl_from_BaseRenderer(BaseRenderer *iface) +{ + return CONTAINING_RECORD(iface, NullRendererImpl, renderer); +} + static HRESULT WINAPI NullRenderer_DoRenderSample(BaseRenderer *iface, IMediaSample *pMediaSample) { return S_OK; @@ -44,6 +47,14 @@ static HRESULT WINAPI NullRenderer_CheckMediaType(BaseRenderer *iface, const AM_ return S_OK; }
+static void null_renderer_destroy(BaseRenderer *iface) +{ + NullRendererImpl *filter = impl_from_BaseRenderer(iface); + + strmbase_renderer_cleanup(&filter->renderer); + CoTaskMemFree(filter); +} + static const BaseRendererFuncTable RendererFuncTable = { NullRenderer_CheckMediaType, NullRenderer_DoRenderSample, @@ -64,99 +75,14 @@ static const BaseRendererFuncTable RendererFuncTable = { NULL, NULL, NULL, + null_renderer_destroy, };
-static inline NullRendererImpl *impl_from_IUnknown(IUnknown *iface) -{ - return CONTAINING_RECORD(iface, NullRendererImpl, IUnknown_inner); -} - -static HRESULT WINAPI NullRendererInner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) -{ - NullRendererImpl *This = impl_from_IUnknown(iface); - - TRACE("filter %p, iid %s, out %p.\n", This, debugstr_guid(riid), ppv); - - *ppv = NULL; - - if (IsEqualIID(riid, &IID_IUnknown)) - *ppv = &This->IUnknown_inner; - else - { - HRESULT hr; - hr = BaseRendererImpl_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv); - if (SUCCEEDED(hr)) - return hr; - } - - if (*ppv) - { - IUnknown_AddRef((IUnknown *)*ppv); - return S_OK; - } - - if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IVideoWindow)) - FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - - return E_NOINTERFACE; -} - -static ULONG WINAPI NullRendererInner_AddRef(IUnknown *iface) -{ - NullRendererImpl *This = impl_from_IUnknown(iface); - return BaseFilterImpl_AddRef(&This->renderer.filter.IBaseFilter_iface); -} - -static ULONG WINAPI NullRendererInner_Release(IUnknown *iface) -{ - NullRendererImpl *This = impl_from_IUnknown(iface); - ULONG refCount = InterlockedDecrement(&This->renderer.filter.refcount); - - if (!refCount) - { - TRACE("Destroying Null Renderer\n"); - strmbase_renderer_cleanup(&This->renderer); - CoTaskMemFree(This); - } - - return refCount; -} - -static const IUnknownVtbl IInner_VTable = -{ - NullRendererInner_QueryInterface, - NullRendererInner_AddRef, - NullRendererInner_Release -}; - -static inline NullRendererImpl *impl_from_IBaseFilter(IBaseFilter *iface) -{ - return CONTAINING_RECORD(iface, NullRendererImpl, renderer.filter.IBaseFilter_iface); -} - -static HRESULT WINAPI NullRenderer_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv) -{ - NullRendererImpl *This = impl_from_IBaseFilter(iface); - return IUnknown_QueryInterface(This->outer_unk, riid, ppv); -} - -static ULONG WINAPI NullRenderer_AddRef(IBaseFilter * iface) -{ - NullRendererImpl *This = impl_from_IBaseFilter(iface); - return IUnknown_AddRef(This->outer_unk); -} - -static ULONG WINAPI NullRenderer_Release(IBaseFilter * iface) -{ - NullRendererImpl *This = impl_from_IBaseFilter(iface); - return IUnknown_Release(This->outer_unk); -} - static const IBaseFilterVtbl NullRenderer_Vtbl = { - NullRenderer_QueryInterface, - NullRenderer_AddRef, - NullRenderer_Release, + BaseFilterImpl_QueryInterface, + BaseFilterImpl_AddRef, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, BaseRendererImpl_Stop, BaseRendererImpl_Pause, @@ -171,33 +97,25 @@ static const IBaseFilterVtbl NullRenderer_Vtbl = BaseFilterImpl_QueryVendorInfo };
-HRESULT NullRenderer_create(IUnknown *pUnkOuter, void **ppv) +HRESULT NullRenderer_create(IUnknown *outer, void **out) { static const WCHAR sink_name[] = {'I','n',0};
HRESULT hr; NullRendererImpl *pNullRenderer;
- TRACE("(%p, %p)\n", pUnkOuter, ppv); - - *ppv = NULL; + *out = NULL;
pNullRenderer = CoTaskMemAlloc(sizeof(NullRendererImpl)); - pNullRenderer->IUnknown_inner.lpVtbl = &IInner_VTable;
- if (pUnkOuter) - pNullRenderer->outer_unk = pUnkOuter; - else - pNullRenderer->outer_unk = &pNullRenderer->IUnknown_inner; - - hr = strmbase_renderer_init(&pNullRenderer->renderer, &NullRenderer_Vtbl, NULL, + hr = strmbase_renderer_init(&pNullRenderer->renderer, &NullRenderer_Vtbl, outer, &CLSID_NullRenderer, sink_name, (DWORD_PTR)(__FILE__ ": NullRendererImpl.csFilter"), &RendererFuncTable);
if (FAILED(hr)) CoTaskMemFree(pNullRenderer); else - *ppv = &pNullRenderer->IUnknown_inner; + *out = &pNullRenderer->renderer.filter.IUnknown_inner;
return S_OK; }
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qedit/samplegrabber.c | 148 +++++++++++---------------------------------- 1 file changed, 36 insertions(+), 112 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c index 27e08c4..0385ebb 100644 --- a/dlls/qedit/samplegrabber.c +++ b/dlls/qedit/samplegrabber.c @@ -212,12 +212,10 @@ static inline SG_Pin *impl_from_IPin(IPin *iface)
/* Sample Grabber filter implementation */ typedef struct _SG_Impl { - IUnknown IUnknown_inner; BaseFilter filter; ISampleGrabber ISampleGrabber_iface; /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */ IUnknown* seekthru_unk; - IUnknown *outer_unk; AM_MEDIA_TYPE mtype; SG_Pin pin_in; SG_Pin pin_out; @@ -237,11 +235,6 @@ enum { OneShot_Past, };
-static inline SG_Impl *impl_from_IUnknown(IUnknown *iface) -{ - return CONTAINING_RECORD(iface, SG_Impl, IUnknown_inner); -} - static inline SG_Impl *impl_from_BaseFilter(BaseFilter *iface) { return CONTAINING_RECORD(iface, SG_Impl, filter); @@ -281,64 +274,6 @@ static void SampleGrabber_cleanup(SG_Impl *This) IUnknown_Release(This->seekthru_unk); }
-/* SampleGrabber inner IUnknown */ -static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) -{ - SG_Impl *This = impl_from_IUnknown(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - - *ppv = NULL; - if (IsEqualIID(riid, &IID_IUnknown)) - *ppv = &This->IUnknown_inner; - else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IMediaFilter) || - IsEqualIID(riid, &IID_IBaseFilter)) - *ppv = &This->filter.IBaseFilter_iface; - else if (IsEqualIID(riid, &IID_ISampleGrabber)) - *ppv = &This->ISampleGrabber_iface; - else - WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv); - - if (!*ppv) - return E_NOINTERFACE; - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI SampleGrabber_AddRef(IUnknown *iface) -{ - SG_Impl *This = impl_from_IUnknown(iface); - ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; -} - -static ULONG WINAPI SampleGrabber_Release(IUnknown *iface) -{ - SG_Impl *This = impl_from_IUnknown(iface); - ULONG ref = InterlockedDecrement(&This->filter.refcount); - - TRACE("(%p) ref=%d\n", This, ref); - - if (ref == 0) - { - SampleGrabber_cleanup(This); - strmbase_filter_cleanup(&This->filter); - CoTaskMemFree(This); - } - return ref; -} - -static const IUnknownVtbl samplegrabber_vtbl = -{ - SampleGrabber_QueryInterface, - SampleGrabber_AddRef, - SampleGrabber_Release, -}; - static IPin *sample_grabber_get_pin(BaseFilter *iface, unsigned int index) { SG_Impl *This = impl_from_BaseFilter(iface); @@ -355,8 +290,32 @@ static IPin *sample_grabber_get_pin(BaseFilter *iface, unsigned int index) return pin; }
+static void sample_grabber_destroy(BaseFilter *iface) +{ + SG_Impl *filter = impl_from_BaseFilter(iface); + + SampleGrabber_cleanup(filter); + strmbase_filter_cleanup(&filter->filter); + CoTaskMemFree(filter); +} + +static HRESULT sample_grabber_query_interface(BaseFilter *iface, REFIID iid, void **out) +{ + SG_Impl *filter = impl_from_BaseFilter(iface); + + if (IsEqualGUID(iid, &IID_ISampleGrabber)) + *out = &filter->ISampleGrabber_iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + static const BaseFilterFuncTable basefunc_vtbl = { .filter_get_pin = sample_grabber_get_pin, + .filter_destroy = sample_grabber_destroy, + .filter_query_interface = sample_grabber_query_interface, };
/* Helper that buffers data and/or calls installed sample callbacks */ @@ -417,33 +376,6 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample) } }
- -/* SampleGrabber implementation of IBaseFilter interface */ - -/* IUnknown */ -static HRESULT WINAPI -SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv) -{ - SG_Impl *This = impl_from_IBaseFilter(iface); - return IUnknown_QueryInterface(This->outer_unk, riid, ppv); -} - -/* IUnknown */ -static ULONG WINAPI -SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface) -{ - SG_Impl *This = impl_from_IBaseFilter(iface); - return IUnknown_AddRef(This->outer_unk); -} - -/* IUnknown */ -static ULONG WINAPI -SampleGrabber_IBaseFilter_Release(IBaseFilter *iface) -{ - SG_Impl *This = impl_from_IBaseFilter(iface); - return IUnknown_Release(This->outer_unk); -} - /* IMediaFilter */ static HRESULT WINAPI SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface) @@ -532,7 +464,7 @@ static HRESULT WINAPI SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppv) { SG_Impl *This = impl_from_ISampleGrabber(iface); - return IUnknown_QueryInterface(This->outer_unk, riid, ppv); + return IUnknown_QueryInterface(This->filter.outer_unk, riid, ppv); }
/* IUnknown */ @@ -540,7 +472,7 @@ static ULONG WINAPI SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface) { SG_Impl *This = impl_from_ISampleGrabber(iface); - return IUnknown_AddRef(This->outer_unk); + return IUnknown_AddRef(This->filter.outer_unk); }
/* IUnknown */ @@ -548,7 +480,7 @@ static ULONG WINAPI SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface) { SG_Impl *This = impl_from_ISampleGrabber(iface); - return IUnknown_Release(This->outer_unk); + return IUnknown_Release(This->filter.outer_unk); }
/* ISampleGrabber */ @@ -1139,9 +1071,9 @@ SampleGrabber_IPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME
static const IBaseFilterVtbl IBaseFilter_VTable = { - SampleGrabber_IBaseFilter_QueryInterface, - SampleGrabber_IBaseFilter_AddRef, - SampleGrabber_IBaseFilter_Release, + BaseFilterImpl_QueryInterface, + BaseFilterImpl_AddRef, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, SampleGrabber_IBaseFilter_Stop, SampleGrabber_IBaseFilter_Pause, @@ -1252,24 +1184,21 @@ static const IPinVtbl IPin_Out_VTable = SampleGrabber_IPin_NewSegment, };
-HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv) +HRESULT SampleGrabber_create(IUnknown *outer, void **out) { SG_Impl* obj = NULL; ISeekingPassThru *passthru; HRESULT hr;
- TRACE("(%p,%p)\n", pUnkOuter, ppv); - obj = CoTaskMemAlloc(sizeof(SG_Impl)); if (NULL == obj) { - *ppv = NULL; + *out = NULL; return E_OUTOFMEMORY; } ZeroMemory(obj, sizeof(SG_Impl));
- strmbase_filter_init(&obj->filter, &IBaseFilter_VTable, NULL, &CLSID_SampleGrabber, + strmbase_filter_init(&obj->filter, &IBaseFilter_VTable, outer, &CLSID_SampleGrabber, (DWORD_PTR)(__FILE__ ": SG_Impl.csFilter"), &basefunc_vtbl); - obj->IUnknown_inner.lpVtbl = &samplegrabber_vtbl; obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable; obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable; obj->pin_in.IPin_iface.lpVtbl = &IPin_In_VTable; @@ -1293,19 +1222,14 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv) obj->bufferLen = -1; obj->bufferData = NULL;
- if (pUnkOuter) - obj->outer_unk = pUnkOuter; - else - obj->outer_unk = &obj->IUnknown_inner; - - hr = CoCreateInstance(&CLSID_SeekingPassThru, &obj->IUnknown_inner, CLSCTX_INPROC_SERVER, - &IID_IUnknown, (void**)&obj->seekthru_unk); + 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->pin_in.IPin_iface); ISeekingPassThru_Release(passthru);
- *ppv = &obj->IUnknown_inner; + *out = &obj->filter.IUnknown_inner; return S_OK; }
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/evr/main.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/evr/main.c b/dlls/evr/main.c index 313d518..ba48207 100644 --- a/dlls/evr/main.c +++ b/dlls/evr/main.c @@ -118,6 +118,10 @@ static HRESULT WINAPI classfactory_CreateInstance(IClassFactory *iface, IUnknown TRACE("(%p)->(%p,%s,%p)\n", This, outer_unk, debugstr_guid(riid), ppobj);
*ppobj = NULL; + + if (outer_unk && !IsEqualGUID(riid, &IID_IUnknown)) + return E_NOINTERFACE; + hres = This->pfnCreateInstance(outer_unk, (void **) &unk); if (SUCCEEDED(hres)) {
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/evr/evr.c | 173 +++++++-------------------------------------------- dlls/evr/tests/evr.c | 3 +- 2 files changed, 22 insertions(+), 154 deletions(-)
diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c index 21a4af0..b64b046 100644 --- a/dlls/evr/evr.c +++ b/dlls/evr/evr.c @@ -35,148 +35,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(evr); typedef struct { BaseFilter filter; - - IUnknown IUnknown_inner; } evr_filter;
-static inline evr_filter *impl_from_inner_IUnknown(IUnknown *iface) -{ - return CONTAINING_RECORD(iface, evr_filter, IUnknown_inner); -} - -static HRESULT WINAPI inner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) -{ - evr_filter *This = impl_from_inner_IUnknown(iface); - TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv); - - *ppv = NULL; - - if (IsEqualIID(riid, &IID_IUnknown)) - *ppv = &This->IUnknown_inner; - - else if (IsEqualIID(riid, &IID_IAMCertifiedOutputProtection)) - FIXME("No interface for IID_IAMCertifiedOutputProtection\n"); - else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags)) - FIXME("No interface for IID_IAMFilterMiscFlags\n"); - else if (IsEqualIID(riid, &IID_IBaseFilter)) - *ppv =&This->filter.IBaseFilter_iface; - else if (IsEqualIID(riid, &IID_IMediaFilter)) - *ppv =&This->filter.IBaseFilter_iface; - else if (IsEqualIID(riid, &IID_IPersist)) - *ppv =&This->filter.IBaseFilter_iface; - else if (IsEqualIID(riid, &IID_IKsPropertySet)) - FIXME("No interface for IID_IKsPropertySet\n"); - else if (IsEqualIID(riid, &IID_IMediaEventSink)) - FIXME("No interface for IID_IMediaEventSink\n"); - else if (IsEqualIID(riid, &IID_IMediaSeeking)) - FIXME("No interface for IID_IMediaSeeking\n"); - else if (IsEqualIID(riid, &IID_IQualityControl)) - FIXME("No interface for IID_IQualityControl\n"); - else if (IsEqualIID(riid, &IID_IQualProp)) - FIXME("No interface for IID_IQualProp\n"); - - else if (IsEqualIID(riid, &IID_IEVRFilterConfig)) - FIXME("No interface for IID_IEVRFilterConfig\n"); - else if (IsEqualIID(riid, &IID_IMFGetService)) - FIXME("No interface for IID_IMFGetService\n"); - else if (IsEqualIID(riid, &IID_IMFVideoPositionMapper)) - FIXME("No interface for IID_IMFVideoPositionMapper\n"); - else if (IsEqualIID(riid, &IID_IMFVideoRenderer)) - FIXME("No interface for IID_IMFVideoRenderer\n"); - - else if (IsEqualIID(riid, &IID_IMemInputPin)) - FIXME("No interface for IID_IMemInputPin\n"); - else if (IsEqualIID(riid, &IID_IPin)) - FIXME("No interface for IID_IPin\n"); - else if (IsEqualIID(riid, &IID_IQualityControl)) - FIXME("No interface for IID_IQualityControl\n"); - - else if (IsEqualIID(riid, &IID_IDirectXVideoMemoryConfiguration)) - FIXME("No interface for IID_IDirectXVideoMemoryConfiguration\n"); - - if (*ppv) - { - IUnknown_AddRef((IUnknown *)(*ppv)); - return S_OK; - } - - FIXME("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv); - return E_NOINTERFACE; -} - -static ULONG WINAPI inner_AddRef(IUnknown *iface) -{ - evr_filter *This = impl_from_inner_IUnknown(iface); - ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface); - - TRACE("(%p, %p)->(): new ref %d\n", iface, This, ref); - - return ref; -} - -static ULONG WINAPI inner_Release(IUnknown *iface) -{ - evr_filter *This = impl_from_inner_IUnknown(iface); - ULONG ref = InterlockedDecrement(&This->filter.refcount); - - TRACE("(%p, %p)->(): new ref %d\n", iface, This, ref); - - if (!ref) - { - strmbase_filter_cleanup(&This->filter); - CoTaskMemFree(This); - } - - return ref; -} - -static const IUnknownVtbl evr_inner_vtbl = -{ - inner_QueryInterface, - inner_AddRef, - inner_Release -}; - -static inline evr_filter *impl_from_IBaseFilter(IBaseFilter *iface) -{ - return CONTAINING_RECORD(iface, evr_filter, filter); -} - -static HRESULT WINAPI filter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv) -{ - evr_filter *This = impl_from_IBaseFilter(iface); - return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv); -} - -static ULONG WINAPI filter_AddRef(IBaseFilter *iface) -{ - evr_filter *This = impl_from_IBaseFilter(iface); - LONG ret; - - ret = IUnknown_AddRef(&This->IUnknown_inner); - - TRACE("(%p)->AddRef from %d\n", iface, ret - 1); - - return ret; -} - -static ULONG WINAPI filter_Release(IBaseFilter *iface) -{ - evr_filter *This = impl_from_IBaseFilter(iface); - LONG ret; - - ret = IUnknown_Release(&This->IUnknown_inner); - - TRACE("(%p)->Release from %d\n", iface, ret + 1); - - return ret; -} - static const IBaseFilterVtbl basefilter_vtbl = { - filter_QueryInterface, - filter_AddRef, - filter_Release, + BaseFilterImpl_QueryInterface, + BaseFilterImpl_AddRef, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, BaseRendererImpl_Stop, BaseRendererImpl_Pause, @@ -191,41 +56,45 @@ static const IBaseFilterVtbl basefilter_vtbl = BaseFilterImpl_QueryVendorInfo };
+static inline evr_filter *impl_from_BaseFilter(BaseFilter *iface) +{ + return CONTAINING_RECORD(iface, evr_filter, filter); +} + static IPin *evr_get_pin(BaseFilter *iface, unsigned int index) { FIXME("iface %p, index %u, stub!\n", iface, index); return NULL; }
+static void evr_destroy(BaseFilter *iface) +{ + evr_filter *filter = impl_from_BaseFilter(iface); + + strmbase_filter_cleanup(&filter->filter); + CoTaskMemFree(filter); +} + static const BaseFilterFuncTable basefilter_functable = { .filter_get_pin = evr_get_pin, + .filter_destroy = evr_destroy, };
-HRESULT evr_filter_create(IUnknown *outer_unk, void **ppv) +HRESULT evr_filter_create(IUnknown *outer, void **out) { evr_filter *object;
- TRACE("(%p, %p)\n", outer_unk, ppv); - - *ppv = NULL; - - if(outer_unk != NULL) - { - FIXME("Aggregation yet unsupported!\n"); - return E_NOINTERFACE; - } + *out = NULL;
object = CoTaskMemAlloc(sizeof(evr_filter)); if (!object) return E_OUTOFMEMORY;
- strmbase_filter_init(&object->filter, &basefilter_vtbl, NULL, &CLSID_EnhancedVideoRenderer, + strmbase_filter_init(&object->filter, &basefilter_vtbl, outer, &CLSID_EnhancedVideoRenderer, (DWORD_PTR)(__FILE__ ": EVR.csFilter"), &basefilter_functable);
- object->IUnknown_inner.lpVtbl = &evr_inner_vtbl; - - *ppv = &object->IUnknown_inner; + *out = &object->filter.IUnknown_inner;
return S_OK; } diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 34db51c..cd88ec1 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -91,8 +91,7 @@ static void test_aggregation(void)
hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk);