[PATCH 4/5] quartz/vmr9: Use strmbase filter aggregation support.

Zebediah Figura zfigura at codeweavers.com
Tue Jun 4 10:01:19 CDT 2019


From: Zebediah Figura <z.figura12 at gmail.com>

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/vmr9.c | 347 ++++++++++++++++-------------------------------------
 1 file changed, 104 insertions(+), 243 deletions(-)

diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index e53b19d..d208b1c 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -49,7 +49,6 @@ struct quartz_vmr
     BaseControlWindow baseControlWindow;
     BaseControlVideo baseControlVideo;
 
-    IUnknown IUnknown_inner;
     IAMCertifiedOutputProtection IAMCertifiedOutputProtection_iface;
     IAMFilterMiscFlags IAMFilterMiscFlags_iface;
     IVMRFilterConfig IVMRFilterConfig_iface;
@@ -72,9 +71,6 @@ struct quartz_vmr
      */
     VMR9Mode mode;
     BITMAPINFOHEADER bmiheader;
-    IUnknown * outer_unk;
-    BOOL bUnkOuterValid;
-    BOOL bAggregatable;
 
     HMODULE hD3d9;
 
@@ -94,11 +90,6 @@ struct quartz_vmr
     LONG VideoHeight;
 };
 
-static inline struct quartz_vmr *impl_from_inner_IUnknown(IUnknown *iface)
-{
-    return CONTAINING_RECORD(iface, struct quartz_vmr, IUnknown_inner);
-}
-
 static inline struct quartz_vmr *impl_from_BaseWindow(BaseWindow *wnd)
 {
     return CONTAINING_RECORD(wnd, struct quartz_vmr, baseControlWindow.baseWindow);
@@ -519,6 +510,64 @@ static HRESULT WINAPI VMR9_BreakConnect(BaseRenderer *This)
     return hr;
 }
 
+static void vmr_destroy(BaseRenderer *iface)
+{
+    struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
+
+    BaseControlWindow_Destroy(&filter->baseControlWindow);
+
+    if (filter->allocator)
+        IVMRSurfaceAllocatorEx9_Release(filter->allocator);
+    if (filter->presenter)
+        IVMRImagePresenter9_Release(filter->presenter);
+
+    filter->num_surfaces = 0;
+    if (filter->allocator_d3d9_dev)
+    {
+        IDirect3DDevice9_Release(filter->allocator_d3d9_dev);
+        filter->allocator_d3d9_dev = NULL;
+    }
+
+    FreeLibrary(filter->hD3d9);
+    strmbase_renderer_cleanup(&filter->renderer);
+    CoTaskMemFree(filter);
+}
+
+static HRESULT vmr_query_interface(BaseRenderer *iface, REFIID iid, void **out)
+{
+    struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
+
+    if (IsEqualGUID(iid, &IID_IVideoWindow))
+        *out = &filter->baseControlWindow.IVideoWindow_iface;
+    else if (IsEqualGUID(iid, &IID_IBasicVideo))
+        *out = &filter->baseControlVideo.IBasicVideo_iface;
+    else if (IsEqualGUID(iid, &IID_IAMCertifiedOutputProtection))
+        *out = &filter->IAMCertifiedOutputProtection_iface;
+    else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags))
+        *out = &filter->IAMFilterMiscFlags_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRFilterConfig))
+        *out = &filter->IVMRFilterConfig_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRFilterConfig9))
+        *out = &filter->IVMRFilterConfig9_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRMonitorConfig))
+        *out = &filter->IVMRMonitorConfig_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRMonitorConfig9))
+        *out = &filter->IVMRMonitorConfig9_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRSurfaceAllocatorNotify) && filter->mode == (VMR9Mode)VMRMode_Renderless)
+        *out = &filter->IVMRSurfaceAllocatorNotify_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRSurfaceAllocatorNotify9) && filter->mode == VMR9Mode_Renderless)
+        *out = &filter->IVMRSurfaceAllocatorNotify9_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRWindowlessControl) && filter->mode == (VMR9Mode)VMRMode_Windowless)
+        *out = &filter->IVMRWindowlessControl_iface;
+    else if (IsEqualGUID(iid, &IID_IVMRWindowlessControl9) && filter->mode == VMR9Mode_Windowless)
+        *out = &filter->IVMRWindowlessControl9_iface;
+    else
+        return E_NOINTERFACE;
+
+    IUnknown_AddRef((IUnknown *)*out);
+    return S_OK;
+}
+
 static const BaseRendererFuncTable BaseFuncTable = {
     VMR9_CheckMediaType,
     VMR9_DoRenderSample,
@@ -539,6 +588,8 @@ static const BaseRendererFuncTable BaseFuncTable = {
     NULL,
     NULL,
     NULL,
+    vmr_destroy,
+    vmr_query_interface,
 };
 
 static LPWSTR WINAPI VMR9_GetClassWindowStyles(BaseWindow *This, DWORD *pClassStyles, DWORD *pWindowStyles, DWORD *pWindowStylesEx)
@@ -744,195 +795,11 @@ static const BaseControlVideoFuncTable renderer_BaseControlVideoFuncTable = {
     VMR9_SetTargetRect
 };
 
-static HRESULT WINAPI VMR9Inner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID * ppv)
-{
-    struct quartz_vmr *This = impl_from_inner_IUnknown(iface);
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
-
-    if (This->bAggregatable)
-        This->bUnkOuterValid = TRUE;
-
-    *ppv = NULL;
-
-    if (IsEqualIID(riid, &IID_IUnknown))
-        *ppv = &This->IUnknown_inner;
-    else if (IsEqualIID(riid, &IID_IVideoWindow))
-        *ppv = &This->baseControlWindow.IVideoWindow_iface;
-    else if (IsEqualIID(riid, &IID_IBasicVideo))
-        *ppv = &This->baseControlVideo.IBasicVideo_iface;
-    else if (IsEqualIID(riid, &IID_IAMCertifiedOutputProtection))
-        *ppv = &This->IAMCertifiedOutputProtection_iface;
-    else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags))
-        *ppv = &This->IAMFilterMiscFlags_iface;
-    else if (IsEqualIID(riid, &IID_IVMRFilterConfig))
-        *ppv = &This->IVMRFilterConfig_iface;
-    else if (IsEqualIID(riid, &IID_IVMRFilterConfig9))
-        *ppv = &This->IVMRFilterConfig9_iface;
-    else if (IsEqualIID(riid, &IID_IVMRMonitorConfig))
-        *ppv = &This->IVMRMonitorConfig_iface;
-    else if (IsEqualIID(riid, &IID_IVMRMonitorConfig9))
-        *ppv = &This->IVMRMonitorConfig9_iface;
-    else if (IsEqualIID(riid, &IID_IVMRSurfaceAllocatorNotify) && This->mode == (VMR9Mode)VMRMode_Renderless)
-        *ppv = &This->IVMRSurfaceAllocatorNotify_iface;
-    else if (IsEqualIID(riid, &IID_IVMRSurfaceAllocatorNotify9) && This->mode == VMR9Mode_Renderless)
-        *ppv = &This->IVMRSurfaceAllocatorNotify9_iface;
-    else if (IsEqualIID(riid, &IID_IVMRWindowlessControl) && This->mode == (VMR9Mode)VMRMode_Windowless)
-        *ppv = &This->IVMRWindowlessControl_iface;
-    else if (IsEqualIID(riid, &IID_IVMRWindowlessControl9) && This->mode == VMR9Mode_Windowless)
-        *ppv = &This->IVMRWindowlessControl9_iface;
-    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;
-    }
-
-    else if (IsEqualIID(riid, &IID_IBasicVideo2))
-        FIXME("No interface for IID_IBasicVideo2\n");
-    else if (IsEqualIID(riid, &IID_IVMRWindowlessControl9))
-        ;
-    else if (IsEqualIID(riid, &IID_IVMRSurfaceAllocatorNotify9))
-        ;
-    else if (IsEqualIID(riid, &IID_IMediaPosition))
-        FIXME("No interface for IID_IMediaPosition\n");
-    else if (IsEqualIID(riid, &IID_IQualProp))
-        FIXME("No interface for IID_IQualProp\n");
-    else if (IsEqualIID(riid, &IID_IVMRAspectRatioControl9))
-        FIXME("No interface for IID_IVMRAspectRatioControl9\n");
-    else if (IsEqualIID(riid, &IID_IVMRDeinterlaceControl9))
-        FIXME("No interface for IID_IVMRDeinterlaceControl9\n");
-    else if (IsEqualIID(riid, &IID_IVMRMixerBitmap9))
-        FIXME("No interface for IID_IVMRMixerBitmap9\n");
-    else if (IsEqualIID(riid, &IID_IVMRMixerControl9))
-        FIXME("No interface for IID_IVMRMixerControl9\n");
-    else
-        FIXME("No interface for %s\n", debugstr_guid(riid));
-
-    return E_NOINTERFACE;
-}
-
-static ULONG WINAPI VMR9Inner_AddRef(IUnknown * iface)
-{
-    struct quartz_vmr *This = impl_from_inner_IUnknown(iface);
-    ULONG refCount = BaseFilterImpl_AddRef(&This->renderer.filter.IBaseFilter_iface);
-
-    TRACE("(%p/%p)->() AddRef from %d\n", This, iface, refCount - 1);
-
-    return refCount;
-}
-
-static ULONG WINAPI VMR9Inner_Release(IUnknown * iface)
-{
-    struct quartz_vmr *This = impl_from_inner_IUnknown(iface);
-    ULONG refCount = InterlockedDecrement(&This->renderer.filter.refcount);
-
-    TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
-
-    if (!refCount)
-    {
-        TRACE("Destroying\n");
-        BaseControlWindow_Destroy(&This->baseControlWindow);
-
-        if (This->allocator)
-            IVMRSurfaceAllocatorEx9_Release(This->allocator);
-        if (This->presenter)
-            IVMRImagePresenter9_Release(This->presenter);
-
-        This->num_surfaces = 0;
-        if (This->allocator_d3d9_dev)
-        {
-            IDirect3DDevice9_Release(This->allocator_d3d9_dev);
-            This->allocator_d3d9_dev = NULL;
-        }
-
-        FreeLibrary(This->hD3d9);
-        strmbase_renderer_cleanup(&This->renderer);
-        CoTaskMemFree(This);
-    }
-    return refCount;
-}
-
-static const IUnknownVtbl IInner_VTable =
-{
-    VMR9Inner_QueryInterface,
-    VMR9Inner_AddRef,
-    VMR9Inner_Release
-};
-
-static HRESULT WINAPI VMR9_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
-{
-    struct quartz_vmr *This = impl_from_IBaseFilter(iface);
-
-    if (This->bAggregatable)
-        This->bUnkOuterValid = TRUE;
-
-    if (This->outer_unk)
-    {
-        if (This->bAggregatable)
-            return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
-
-        if (IsEqualIID(riid, &IID_IUnknown))
-        {
-            HRESULT hr;
-
-            IUnknown_AddRef(&This->IUnknown_inner);
-            hr = IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
-            IUnknown_Release(&This->IUnknown_inner);
-            This->bAggregatable = TRUE;
-            return hr;
-        }
-
-        *ppv = NULL;
-        return E_NOINTERFACE;
-    }
-
-    return IUnknown_QueryInterface(&This->IUnknown_inner, riid, ppv);
-}
-
-static ULONG WINAPI VMR9_AddRef(IBaseFilter * iface)
-{
-    struct quartz_vmr *This = impl_from_IBaseFilter(iface);
-    LONG ret;
-
-    if (This->outer_unk && This->bUnkOuterValid)
-        ret = IUnknown_AddRef(This->outer_unk);
-    else
-        ret = IUnknown_AddRef(&This->IUnknown_inner);
-
-    TRACE("(%p)->AddRef from %d\n", iface, ret - 1);
-
-    return ret;
-}
-
-static ULONG WINAPI VMR9_Release(IBaseFilter * iface)
-{
-    struct quartz_vmr *This = impl_from_IBaseFilter(iface);
-    LONG ret;
-
-    if (This->outer_unk && This->bUnkOuterValid)
-        ret = IUnknown_Release(This->outer_unk);
-    else
-        ret = IUnknown_Release(&This->IUnknown_inner);
-
-    TRACE("(%p)->Release from %d\n", iface, ret + 1);
-
-    if (ret)
-        return ret;
-    return 0;
-}
-
 static const IBaseFilterVtbl VMR_Vtbl =
 {
-    VMR9_QueryInterface,
-    VMR9_AddRef,
-    VMR9_Release,
+    BaseFilterImpl_QueryInterface,
+    BaseFilterImpl_AddRef,
+    BaseFilterImpl_Release,
     BaseFilterImpl_GetClassID,
     BaseRendererImpl_Stop,
     BaseRendererImpl_Pause,
@@ -954,7 +821,7 @@ static HRESULT WINAPI Videowindow_QueryInterface(IVideoWindow *iface, REFIID rii
 
     TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
 
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppvObj);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppvObj);
 }
 
 static ULONG WINAPI Videowindow_AddRef(IVideoWindow *iface)
@@ -963,7 +830,7 @@ static ULONG WINAPI Videowindow_AddRef(IVideoWindow *iface)
 
     TRACE("(%p/%p)->()\n", This, iface);
 
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI Videowindow_Release(IVideoWindow *iface)
@@ -972,7 +839,7 @@ static ULONG WINAPI Videowindow_Release(IVideoWindow *iface)
 
     TRACE("(%p/%p)->()\n", This, iface);
 
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static const IVideoWindowVtbl IVideoWindow_VTable =
@@ -1032,7 +899,7 @@ static HRESULT WINAPI Basicvideo_QueryInterface(IBasicVideo *iface, REFIID riid,
 
     TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppvObj);
 
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppvObj);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppvObj);
 }
 
 static ULONG WINAPI Basicvideo_AddRef(IBasicVideo *iface)
@@ -1041,7 +908,7 @@ static ULONG WINAPI Basicvideo_AddRef(IBasicVideo *iface)
 
     TRACE("(%p/%p)->()\n", This, iface);
 
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI Basicvideo_Release(IBasicVideo *iface)
@@ -1050,7 +917,7 @@ static ULONG WINAPI Basicvideo_Release(IBasicVideo *iface)
 
     TRACE("(%p/%p)->()\n", This, iface);
 
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static const IBasicVideoVtbl IBasicVideo_VTable =
@@ -1100,19 +967,19 @@ static HRESULT WINAPI AMCertifiedOutputProtection_QueryInterface(IAMCertifiedOut
                                                                  REFIID riid, void **ppv)
 {
     struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI AMCertifiedOutputProtection_AddRef(IAMCertifiedOutputProtection *iface)
 {
     struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI AMCertifiedOutputProtection_Release(IAMCertifiedOutputProtection *iface)
 {
     struct quartz_vmr *This = impl_from_IAMCertifiedOutputProtection(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI AMCertifiedOutputProtection_KeyExchange(IAMCertifiedOutputProtection *iface,
@@ -1166,17 +1033,17 @@ static const IAMCertifiedOutputProtectionVtbl IAMCertifiedOutputProtection_Vtbl
 
 static HRESULT WINAPI AMFilterMiscFlags_QueryInterface(IAMFilterMiscFlags *iface, REFIID riid, void **ppv) {
     struct quartz_vmr *This = impl_from_IAMFilterMiscFlags(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI AMFilterMiscFlags_AddRef(IAMFilterMiscFlags *iface) {
     struct quartz_vmr *This = impl_from_IAMFilterMiscFlags(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI AMFilterMiscFlags_Release(IAMFilterMiscFlags *iface) {
     struct quartz_vmr *This = impl_from_IAMFilterMiscFlags(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI AMFilterMiscFlags_GetMiscFlags(IAMFilterMiscFlags *iface) {
@@ -1194,19 +1061,19 @@ static HRESULT WINAPI VMR7FilterConfig_QueryInterface(IVMRFilterConfig *iface, R
                                                       void** ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR7FilterConfig_AddRef(IVMRFilterConfig *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR7FilterConfig_Release(IVMRFilterConfig *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR7FilterConfig_SetImageCompositor(IVMRFilterConfig *iface,
@@ -1367,19 +1234,19 @@ static HRESULT WINAPI VMR7MonitorConfig_QueryInterface(IVMRMonitorConfig *iface,
                                                        LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR7MonitorConfig_AddRef(IVMRMonitorConfig *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR7MonitorConfig_Release(IVMRMonitorConfig *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR7MonitorConfig_SetMonitor(IVMRMonitorConfig *iface, const VMRGUID *pGUID)
@@ -1474,19 +1341,19 @@ static HRESULT WINAPI VMR9MonitorConfig_QueryInterface(IVMRMonitorConfig9 *iface
                                                        LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig9(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR9MonitorConfig_AddRef(IVMRMonitorConfig9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig9(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR9MonitorConfig_Release(IVMRMonitorConfig9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRMonitorConfig9(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR9MonitorConfig_SetMonitor(IVMRMonitorConfig9 *iface, UINT uDev)
@@ -1573,19 +1440,19 @@ static const IVMRMonitorConfig9Vtbl VMR9_MonitorConfig_Vtbl =
 static HRESULT WINAPI VMR9FilterConfig_QueryInterface(IVMRFilterConfig9 *iface, REFIID riid, LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR9FilterConfig_AddRef(IVMRFilterConfig9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR9FilterConfig_Release(IVMRFilterConfig9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR9FilterConfig_SetImageCompositor(IVMRFilterConfig9 *iface, IVMRImageCompositor9 *compositor)
@@ -1716,19 +1583,19 @@ static HRESULT WINAPI VMR7WindowlessControl_QueryInterface(IVMRWindowlessControl
                                                            LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR7WindowlessControl_AddRef(IVMRWindowlessControl *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR7WindowlessControl_Release(IVMRWindowlessControl *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR7WindowlessControl_GetNativeVideoSize(IVMRWindowlessControl *iface,
@@ -1925,19 +1792,19 @@ static const IVMRWindowlessControlVtbl VMR7_WindowlessControl_Vtbl =
 static HRESULT WINAPI VMR9WindowlessControl_QueryInterface(IVMRWindowlessControl9 *iface, REFIID riid, LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl9(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR9WindowlessControl_AddRef(IVMRWindowlessControl9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl9(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR9WindowlessControl_Release(IVMRWindowlessControl9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRWindowlessControl9(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR9WindowlessControl_GetNativeVideoSize(IVMRWindowlessControl9 *iface, LONG *width, LONG *height, LONG *arwidth, LONG *arheight)
@@ -2131,19 +1998,19 @@ static HRESULT WINAPI VMR7SurfaceAllocatorNotify_QueryInterface(IVMRSurfaceAlloc
                                                                 REFIID riid, LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR7SurfaceAllocatorNotify_AddRef(IVMRSurfaceAllocatorNotify *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR7SurfaceAllocatorNotify_Release(IVMRSurfaceAllocatorNotify *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR7SurfaceAllocatorNotify_AdviseSurfaceAllocator(IVMRSurfaceAllocatorNotify *iface,
@@ -2216,19 +2083,19 @@ static const IVMRSurfaceAllocatorNotifyVtbl VMR7_SurfaceAllocatorNotify_Vtbl =
 static HRESULT WINAPI VMR9SurfaceAllocatorNotify_QueryInterface(IVMRSurfaceAllocatorNotify9 *iface, REFIID riid, LPVOID * ppv)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify9(iface);
-    return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+    return IUnknown_QueryInterface(This->renderer.filter.outer_unk, riid, ppv);
 }
 
 static ULONG WINAPI VMR9SurfaceAllocatorNotify_AddRef(IVMRSurfaceAllocatorNotify9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify9(iface);
-    return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_AddRef(This->renderer.filter.outer_unk);
 }
 
 static ULONG WINAPI VMR9SurfaceAllocatorNotify_Release(IVMRSurfaceAllocatorNotify9 *iface)
 {
     struct quartz_vmr *This = impl_from_IVMRSurfaceAllocatorNotify9(iface);
-    return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+    return IUnknown_Release(This->renderer.filter.outer_unk);
 }
 
 static HRESULT WINAPI VMR9SurfaceAllocatorNotify_AdviseSurfaceAllocator(IVMRSurfaceAllocatorNotify9 *iface, DWORD_PTR id, IVMRSurfaceAllocator9 *alloc)
@@ -2373,16 +2240,14 @@ static const IVMRSurfaceAllocatorNotify9Vtbl VMR9_SurfaceAllocatorNotify_Vtbl =
     VMR9SurfaceAllocatorNotify_NotifyEvent
 };
 
-static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid)
+static HRESULT vmr_create(IUnknown *outer, void **out, const CLSID *clsid)
 {
     static const WCHAR sink_name[] = {'V','M','R',' ','I','n','p','u','t','0',0};
 
     HRESULT hr;
     struct quartz_vmr* pVMR;
 
-    TRACE("(%p, %p)\n", outer_unk, ppv);
-
-    *ppv = NULL;
+    *out = NULL;
 
     pVMR = CoTaskMemAlloc(sizeof(struct quartz_vmr));
 
@@ -2394,10 +2259,6 @@ static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid)
         return VFW_E_DDRAW_CAPS_NOT_SUITABLE;
     }
 
-    pVMR->outer_unk = outer_unk;
-    pVMR->bUnkOuterValid = FALSE;
-    pVMR->bAggregatable = FALSE;
-    pVMR->IUnknown_inner.lpVtbl = &IInner_VTable;
     pVMR->IAMCertifiedOutputProtection_iface.lpVtbl = &IAMCertifiedOutputProtection_Vtbl;
     pVMR->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
 
@@ -2418,11 +2279,11 @@ static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid)
     pVMR->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl;
 
     if (IsEqualGUID(clsid, &CLSID_VideoMixingRenderer))
-        hr = strmbase_renderer_init(&pVMR->renderer, &VMR_Vtbl, NULL,
+        hr = strmbase_renderer_init(&pVMR->renderer, &VMR_Vtbl, outer,
                 &CLSID_VideoMixingRenderer, sink_name,
                 (DWORD_PTR)(__FILE__ ": VMR7Impl.csFilter"), &BaseFuncTable);
     else
-        hr = strmbase_renderer_init(&pVMR->renderer, &VMR_Vtbl, NULL,
+        hr = strmbase_renderer_init(&pVMR->renderer, &VMR_Vtbl, outer,
                 &CLSID_VideoMixingRenderer9, sink_name,
                 (DWORD_PTR)(__FILE__ ": VMR9Impl.csFilter"), &BaseFuncTable);
 
@@ -2441,7 +2302,7 @@ static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid)
     if (FAILED(hr))
         goto fail;
 
-    *ppv = (LPVOID)pVMR;
+    *out = &pVMR->renderer.filter.IUnknown_inner;
     ZeroMemory(&pVMR->source_rect, sizeof(RECT));
     ZeroMemory(&pVMR->target_rect, sizeof(RECT));
     TRACE("Created at %p\n", pVMR);
-- 
2.7.4




More information about the wine-devel mailing list