Aric Stewart : quartz: Add VMRWindowlessControl9 to VMR9.
Alexandre Julliard
julliard at winehq.org
Thu Apr 5 12:31:46 CDT 2012
Module: wine
Branch: master
Commit: e4656ebc886ac7f06e7559a933a4473c95ab3910
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4656ebc886ac7f06e7559a933a4473c95ab3910
Author: Aric Stewart <aric at codeweavers.com>
Date: Tue Apr 3 14:38:10 2012 -0500
quartz: Add VMRWindowlessControl9 to VMR9.
---
dlls/quartz/vmr9.c | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 196 insertions(+), 0 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index b8b81c2..b92cc19 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -54,6 +54,7 @@ typedef struct
IUnknown IUnknown_inner;
IAMFilterMiscFlags IAMFilterMiscFlags_iface;
IVMRFilterConfig9 IVMRFilterConfig9_iface;
+ IVMRWindowlessControl9 IVMRWindowlessControl9_iface;
IVMRSurfaceAllocatorEx9 *allocator;
IVMRImagePresenter9 *presenter;
@@ -67,6 +68,9 @@ typedef struct
DWORD_PTR cookie;
+ /* for Windowless Mode */
+ HWND hWndClippingWindow;
+
RECT source_rect;
RECT target_rect;
LONG VideoWidth;
@@ -108,6 +112,11 @@ static inline VMR9Impl *impl_from_IVMRFilterConfig9( IVMRFilterConfig9 *iface)
return CONTAINING_RECORD(iface, VMR9Impl, IVMRFilterConfig9_iface);
}
+static inline VMR9Impl *impl_from_IVMRWindowlessControl9( IVMRWindowlessControl9 *iface)
+{
+ return CONTAINING_RECORD(iface, VMR9Impl, IVMRWindowlessControl9_iface);
+}
+
static HRESULT WINAPI VMR9_DoRenderSample(BaseRenderer *iface, IMediaSample * pSample)
{
VMR9Impl *This = (VMR9Impl *)iface;
@@ -448,6 +457,8 @@ static HRESULT WINAPI VMR9Inner_QueryInterface(IUnknown * iface, REFIID riid, LP
*ppv = &This->IAMFilterMiscFlags_iface;
else if (IsEqualIID(riid, &IID_IVMRFilterConfig9))
*ppv = &This->IVMRFilterConfig9_iface;
+ else if (IsEqualIID(riid, &IID_IVMRWindowlessControl9) && This->mode == VMR9Mode_Windowless)
+ *ppv = &This->IVMRWindowlessControl9_iface;
else
{
HRESULT hr;
@@ -913,6 +924,189 @@ static const IVMRFilterConfig9Vtbl VMR9_FilterConfig_Vtbl =
VMR9FilterConfig_GetRenderingMode
};
+static HRESULT WINAPI VMR9WindowlessControl_QueryInterface(IVMRWindowlessControl9 *iface, REFIID riid, LPVOID * ppv)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+ return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
+}
+
+static ULONG WINAPI VMR9WindowlessControl_AddRef(IVMRWindowlessControl9 *iface)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+ return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface);
+}
+
+static ULONG WINAPI VMR9WindowlessControl_Release(IVMRWindowlessControl9 *iface)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+ return VMR9_Release(&This->renderer.filter.IBaseFilter_iface);
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetNativeVideoSize(IVMRWindowlessControl9 *iface, LONG *width, LONG *height, LONG *arwidth, LONG *arheight)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+ TRACE("(%p/%p)->(%p, %p, %p, %p)\n", iface, This, width, height, arwidth, arheight);
+
+ if (!width || !height || !arwidth || !arheight)
+ {
+ ERR("Got no pointer\n");
+ return E_POINTER;
+ }
+
+ *width = This->bmiheader.biWidth;
+ *height = This->bmiheader.biHeight;
+ *arwidth = This->bmiheader.biWidth;
+ *arheight = This->bmiheader.biHeight;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetMinIdealVideoSize(IVMRWindowlessControl9 *iface, LONG *width, LONG *height)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetMaxIdealVideoSize(IVMRWindowlessControl9 *iface, LONG *width, LONG *height)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_SetVideoPosition(IVMRWindowlessControl9 *iface, const RECT *source, const RECT *dest)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ TRACE("(%p/%p)->(%p, %p)\n", iface, This, source, dest);
+
+ EnterCriticalSection(&This->renderer.filter.csFilter);
+
+ if (source)
+ This->source_rect = *source;
+ if (dest)
+ {
+ This->target_rect = *dest;
+ if (This->baseControlWindow.baseWindow.hWnd)
+ {
+ FIXME("Output rectangle: starting at %dx%d, up to point %dx%d\n", dest->left, dest->top, dest->right, dest->bottom);
+ SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, dest->left, dest->top, dest->right - dest->left,
+ dest->bottom-dest->top, SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOOWNERZORDER|SWP_NOREDRAW);
+ }
+ }
+
+ LeaveCriticalSection(&This->renderer.filter.csFilter);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetVideoPosition(IVMRWindowlessControl9 *iface, RECT *source, RECT *dest)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ if (source)
+ *source = This->source_rect;
+
+ if (dest)
+ *dest = This->target_rect;
+
+ FIXME("(%p/%p)->(%p/%p) stub\n", iface, This, source, dest);
+ return S_OK;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetAspectRatioMode(IVMRWindowlessControl9 *iface, DWORD *mode)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_SetAspectRatioMode(IVMRWindowlessControl9 *iface, DWORD mode)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowlessControl9 *iface, HWND hwnd)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ TRACE("(%p/%p)->(%p)\n", iface, This, hwnd);
+
+ EnterCriticalSection(&This->renderer.filter.csFilter);
+ This->hWndClippingWindow = hwnd;
+ if (!hwnd)
+ IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie);
+ LeaveCriticalSection(&This->renderer.filter.csFilter);
+ return S_OK;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_RepaintVideo(IVMRWindowlessControl9 *iface, HWND hwnd, HDC hdc)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_DisplayModeChanged(IVMRWindowlessControl9 *iface)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetCurrentImage(IVMRWindowlessControl9 *iface, BYTE **dib)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_SetBorderColor(IVMRWindowlessControl9 *iface, COLORREF color)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI VMR9WindowlessControl_GetBorderColor(IVMRWindowlessControl9 *iface, COLORREF *color)
+{
+ VMR9Impl *This = impl_from_IVMRWindowlessControl9(iface);
+
+ FIXME("(%p/%p)->(...) stub\n", iface, This);
+ return E_NOTIMPL;
+}
+
+static const IVMRWindowlessControl9Vtbl VMR9_WindowlessControl_Vtbl =
+{
+ VMR9WindowlessControl_QueryInterface,
+ VMR9WindowlessControl_AddRef,
+ VMR9WindowlessControl_Release,
+ VMR9WindowlessControl_GetNativeVideoSize,
+ VMR9WindowlessControl_GetMinIdealVideoSize,
+ VMR9WindowlessControl_GetMaxIdealVideoSize,
+ VMR9WindowlessControl_SetVideoPosition,
+ VMR9WindowlessControl_GetVideoPosition,
+ VMR9WindowlessControl_GetAspectRatioMode,
+ VMR9WindowlessControl_SetAspectRatioMode,
+ VMR9WindowlessControl_SetVideoClippingWindow,
+ VMR9WindowlessControl_RepaintVideo,
+ VMR9WindowlessControl_DisplayModeChanged,
+ VMR9WindowlessControl_GetCurrentImage,
+ VMR9WindowlessControl_SetBorderColor,
+ VMR9WindowlessControl_GetBorderColor
+};
+
HRESULT VMR9Impl_create(IUnknown * outer_unk, LPVOID * ppv)
{
HRESULT hr;
@@ -933,7 +1127,9 @@ HRESULT VMR9Impl_create(IUnknown * outer_unk, LPVOID * ppv)
pVMR9->mode = 0;
pVMR9->allocator = NULL;
pVMR9->presenter = NULL;
+ pVMR9->hWndClippingWindow = NULL;
pVMR9->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl;
+ pVMR9->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl;
hr = BaseRenderer_Init(&pVMR9->renderer, &VMR9_Vtbl, outer_unk, &CLSID_VideoMixingRenderer9, (DWORD_PTR)(__FILE__ ": VMR9Impl.csFilter"), &BaseFuncTable);
if (FAILED(hr))
More information about the wine-cvs
mailing list