[PATCH 12/13] quartz: Standardize COM aggregation for VideoRenderer.
Michael Stefaniuc
mstefani at redhat.de
Sun Jul 1 18:06:01 CDT 2012
---
dlls/quartz/quartz_private.h | 2 -
dlls/quartz/videorenderer.c | 101 +++++++++++++++--------------------------
2 files changed, 37 insertions(+), 66 deletions(-)
diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h
index 35cd52b..43e679d 100644
--- a/dlls/quartz/quartz_private.h
+++ b/dlls/quartz/quartz_private.h
@@ -38,8 +38,6 @@
#define BYTES_FROM_MEDIATIME(time) SEC_FROM_MEDIATIME(time)
#define MSEC_FROM_MEDIATIME(time) ((time) / 10000)
-#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
-
HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
HRESULT FilterGraphNoThread_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
HRESULT FilterMapper2_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN;
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 0edf406..69437a1 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -54,8 +54,9 @@ typedef struct VideoRendererImpl
BaseControlWindow baseControlWindow;
BaseControlVideo baseControlVideo;
- const IUnknownVtbl * IInner_vtbl;
+ IUnknown IUnknown_inner;
IAMFilterMiscFlags IAMFilterMiscFlags_iface;
+ IUnknown *outer_unk;
BOOL init;
HANDLE hThread;
@@ -69,9 +70,6 @@ typedef struct VideoRendererImpl
RECT WindowPos;
LONG VideoWidth;
LONG VideoHeight;
- IUnknown * pUnkOuter;
- BOOL bUnkOuterValid;
- BOOL bAggregatable;
} VideoRendererImpl;
static inline VideoRendererImpl *impl_from_BaseWindow(BaseWindow *iface)
@@ -652,10 +650,7 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
*ppv = NULL;
pVideoRenderer = CoTaskMemAlloc(sizeof(VideoRendererImpl));
- pVideoRenderer->pUnkOuter = pUnkOuter;
- pVideoRenderer->bUnkOuterValid = FALSE;
- pVideoRenderer->bAggregatable = FALSE;
- pVideoRenderer->IInner_vtbl = &IInner_VTable;
+ pVideoRenderer->IUnknown_inner.lpVtbl = &IInner_VTable;
pVideoRenderer->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
pVideoRenderer->init = 0;
@@ -663,6 +658,11 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
ZeroMemory(&pVideoRenderer->DestRect, sizeof(RECT));
ZeroMemory(&pVideoRenderer->WindowPos, sizeof(RECT));
+ if (pUnkOuter)
+ pVideoRenderer->outer_unk = pUnkOuter;
+ else
+ pVideoRenderer->outer_unk = &pVideoRenderer->IUnknown_inner;
+
hr = BaseRenderer_Init(&pVideoRenderer->renderer, &VideoRenderer_Vtbl, pUnkOuter, &CLSID_VideoRenderer, (DWORD_PTR)(__FILE__ ": VideoRendererImpl.csFilter"), &BaseFuncTable);
if (FAILED(hr))
@@ -681,7 +681,7 @@ HRESULT VideoRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
goto fail;
}
- *ppv = pVideoRenderer;
+ *ppv = &pVideoRenderer->IUnknown_inner;
return S_OK;
fail:
@@ -696,18 +696,21 @@ HRESULT VideoRendererDefault_create(IUnknown * pUnkOuter, LPVOID * ppv)
return VideoRenderer_create(pUnkOuter, ppv);
}
-static HRESULT WINAPI VideoRendererInner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID * ppv)
+static inline VideoRendererImpl *impl_from_IUnknown(IUnknown *iface)
{
- ICOM_THIS_MULTI(VideoRendererImpl, IInner_vtbl, iface);
- TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
+ return CONTAINING_RECORD(iface, VideoRendererImpl, IUnknown_inner);
+}
+
+static HRESULT WINAPI VideoRendererInner_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
+{
+ VideoRendererImpl *This = impl_from_IUnknown(iface);
- if (This->bAggregatable)
- This->bUnkOuterValid = TRUE;
+ TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = &This->IInner_vtbl;
+ *ppv = &This->IUnknown_inner;
else if (IsEqualIID(riid, &IID_IBasicVideo))
*ppv = &This->baseControlVideo.IBasicVideo_iface;
else if (IsEqualIID(riid, &IID_IVideoWindow))
@@ -724,7 +727,7 @@ static HRESULT WINAPI VideoRendererInner_QueryInterface(IUnknown * iface, REFIID
if (*ppv)
{
- IUnknown_AddRef((IUnknown *)(*ppv));
+ IUnknown_AddRef((IUnknown *)*ppv);
return S_OK;
}
@@ -734,22 +737,22 @@ static HRESULT WINAPI VideoRendererInner_QueryInterface(IUnknown * iface, REFIID
return E_NOINTERFACE;
}
-static ULONG WINAPI VideoRendererInner_AddRef(IUnknown * iface)
+static ULONG WINAPI VideoRendererInner_AddRef(IUnknown *iface)
{
- ICOM_THIS_MULTI(VideoRendererImpl, IInner_vtbl, iface);
+ VideoRendererImpl *This = impl_from_IUnknown(iface);
ULONG refCount = BaseFilterImpl_AddRef(&This->renderer.filter.IBaseFilter_iface);
- TRACE("(%p/%p)->() AddRef from %d\n", This, iface, refCount - 1);
+ TRACE("(%p)->(): new ref = %d\n", This, refCount);
return refCount;
}
-static ULONG WINAPI VideoRendererInner_Release(IUnknown * iface)
+static ULONG WINAPI VideoRendererInner_Release(IUnknown *iface)
{
- ICOM_THIS_MULTI(VideoRendererImpl, IInner_vtbl, iface);
+ VideoRendererImpl *This = impl_from_IUnknown(iface);
ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface);
- TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1);
+ TRACE("(%p)->(): new ref = %d\n", This, refCount);
if (!refCount)
{
@@ -779,49 +782,19 @@ static const IUnknownVtbl IInner_VTable =
static HRESULT WINAPI VideoRenderer_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
{
VideoRendererImpl *This = impl_from_IBaseFilter(iface);
-
- if (This->bAggregatable)
- This->bUnkOuterValid = TRUE;
-
- if (This->pUnkOuter)
- {
- if (This->bAggregatable)
- return IUnknown_QueryInterface(This->pUnkOuter, riid, ppv);
-
- if (IsEqualIID(riid, &IID_IUnknown))
- {
- HRESULT hr;
-
- IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
- hr = IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
- IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
- This->bAggregatable = TRUE;
- return hr;
- }
-
- *ppv = NULL;
- return E_NOINTERFACE;
- }
-
- return IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI VideoRenderer_AddRef(IBaseFilter * iface)
{
VideoRendererImpl *This = impl_from_IBaseFilter(iface);
-
- if (This->pUnkOuter && This->bUnkOuterValid)
- return IUnknown_AddRef(This->pUnkOuter);
- return IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI VideoRenderer_Release(IBaseFilter * iface)
{
VideoRendererImpl *This = impl_from_IBaseFilter(iface);
-
- if (This->pUnkOuter && This->bUnkOuterValid)
- return IUnknown_Release(This->pUnkOuter);
- return IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
+ return IUnknown_Release(This->outer_unk);
}
/** IMediaFilter methods **/
@@ -877,7 +850,7 @@ static HRESULT WINAPI Basicvideo_QueryInterface(IBasicVideo *iface,
TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
- return VideoRenderer_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppvObj);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppvObj);
}
static ULONG WINAPI Basicvideo_AddRef(IBasicVideo *iface) {
@@ -885,7 +858,7 @@ static ULONG WINAPI Basicvideo_AddRef(IBasicVideo *iface) {
TRACE("(%p/%p)->()\n", This, iface);
- return VideoRenderer_AddRef(&This->renderer.filter.IBaseFilter_iface);
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI Basicvideo_Release(IBasicVideo *iface) {
@@ -893,7 +866,7 @@ static ULONG WINAPI Basicvideo_Release(IBasicVideo *iface) {
TRACE("(%p/%p)->()\n", This, iface);
- return VideoRenderer_Release(&This->renderer.filter.IBaseFilter_iface);
+ return IUnknown_Release(This->outer_unk);
}
static const IBasicVideoVtbl IBasicVideo_VTable =
@@ -948,7 +921,7 @@ static HRESULT WINAPI Videowindow_QueryInterface(IVideoWindow *iface,
TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj);
- return VideoRenderer_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppvObj);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppvObj);
}
static ULONG WINAPI Videowindow_AddRef(IVideoWindow *iface) {
@@ -956,7 +929,7 @@ static ULONG WINAPI Videowindow_AddRef(IVideoWindow *iface) {
TRACE("(%p/%p)->()\n", This, iface);
- return VideoRenderer_AddRef(&This->renderer.filter.IBaseFilter_iface);
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI Videowindow_Release(IVideoWindow *iface) {
@@ -964,7 +937,7 @@ static ULONG WINAPI Videowindow_Release(IVideoWindow *iface) {
TRACE("(%p/%p)->()\n", This, iface);
- return VideoRenderer_Release(&This->renderer.filter.IBaseFilter_iface);
+ return IUnknown_Release(This->outer_unk);
}
static HRESULT WINAPI Videowindow_get_FullScreenMode(IVideoWindow *iface,
@@ -1061,19 +1034,19 @@ static HRESULT WINAPI AMFilterMiscFlags_QueryInterface(IAMFilterMiscFlags *iface
void **ppv)
{
VideoRendererImpl *This = impl_from_IAMFilterMiscFlags(iface);
- return IUnknown_QueryInterface((IUnknown*)This, riid, ppv);
+ return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI AMFilterMiscFlags_AddRef(IAMFilterMiscFlags *iface)
{
VideoRendererImpl *This = impl_from_IAMFilterMiscFlags(iface);
- return IUnknown_AddRef((IUnknown*)This);
+ return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI AMFilterMiscFlags_Release(IAMFilterMiscFlags *iface)
{
VideoRendererImpl *This = impl_from_IAMFilterMiscFlags(iface);
- return IUnknown_Release((IUnknown*)This);
+ return IUnknown_Release(This->outer_unk);
}
static ULONG WINAPI AMFilterMiscFlags_GetMiscFlags(IAMFilterMiscFlags *iface)
--
1.7.6.5
More information about the wine-patches
mailing list