[PATCH 5/5] quartz: Merge the BaseControlVideo object into the video_window object.
Zebediah Figura
z.figura12 at gmail.com
Wed May 6 19:28:52 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/quartz/Makefile.in | 1 -
dlls/quartz/quartz_private.h | 33 +-
dlls/quartz/video.c | 581 -----------------------------------
dlls/quartz/videorenderer.c | 59 ++--
dlls/quartz/vmr9.c | 94 +++---
dlls/quartz/window.c | 545 ++++++++++++++++++++++++++++++++
6 files changed, 615 insertions(+), 698 deletions(-)
delete mode 100644 dlls/quartz/video.c
diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in
index ec29ef53c6b..14ba932a312 100644
--- a/dlls/quartz/Makefile.in
+++ b/dlls/quartz/Makefile.in
@@ -18,7 +18,6 @@ C_SRCS = \
passthrough.c \
regsvr.c \
systemclock.c \
- video.c \
videorenderer.c \
vmr9.c \
window.c
diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h
index 2bbebd48b3a..7e49367a932 100644
--- a/dlls/quartz/quartz_private.h
+++ b/dlls/quartz/quartz_private.h
@@ -91,6 +91,9 @@ BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID
struct video_window
{
IVideoWindow IVideoWindow_iface;
+ IBasicVideo IBasicVideo_iface;
+
+ RECT src, dst;
HWND hwnd;
BOOL AutoShow;
@@ -107,6 +110,10 @@ struct video_window_ops
RECT (*get_default_rect)(struct video_window *window);
/* Optional, WinProc Related */
BOOL (*resize)(struct video_window *window, LONG height, LONG width);
+
+ HRESULT (*get_current_image)(struct video_window *window, LONG *size, LONG *image);
+ HRESULT (WINAPI *pfnSetDefaultSourceRect)(struct video_window *window);
+ HRESULT (WINAPI *pfnSetDefaultTargetRect)(struct video_window *window);
};
void video_window_cleanup(struct video_window *window) DECLSPEC_HIDDEN;
@@ -162,30 +169,4 @@ HRESULT WINAPI BaseControlWindowImpl_GetRestorePosition(IVideoWindow *iface, LON
HRESULT WINAPI BaseControlWindowImpl_HideCursor(IVideoWindow *iface, LONG HideCursor) DECLSPEC_HIDDEN;
HRESULT WINAPI BaseControlWindowImpl_IsCursorHidden(IVideoWindow *iface, LONG *CursorHidden) DECLSPEC_HIDDEN;
-typedef struct tagBaseControlVideo
-{
- IBasicVideo IBasicVideo_iface;
-
- RECT src, dst;
-
- struct strmbase_filter *pFilter;
- struct strmbase_pin *pPin;
-
- const struct BaseControlVideoFuncTable *pFuncsTable;
-} BaseControlVideo;
-
-typedef HRESULT (WINAPI *BaseControlVideo_GetStaticImage)(BaseControlVideo* This, LONG *pBufferSize, LONG *pDIBImage);
-typedef HRESULT (WINAPI *BaseControlVideo_SetDefaultSourceRect)(BaseControlVideo* This);
-typedef HRESULT (WINAPI *BaseControlVideo_SetDefaultTargetRect)(BaseControlVideo* This);
-
-typedef struct BaseControlVideoFuncTable
-{
- BaseControlVideo_GetStaticImage pfnGetStaticImage;
- BaseControlVideo_SetDefaultSourceRect pfnSetDefaultSourceRect;
- BaseControlVideo_SetDefaultTargetRect pfnSetDefaultTargetRect;
-} BaseControlVideoFuncTable;
-
-void basic_video_init(BaseControlVideo *video, struct strmbase_filter *filter,
- struct strmbase_pin *pin, const BaseControlVideoFuncTable *func_table) DECLSPEC_HIDDEN;
-
#endif /* __QUARTZ_PRIVATE_INCLUDED__ */
diff --git a/dlls/quartz/video.c b/dlls/quartz/video.c
deleted file mode 100644
index ace83664898..00000000000
--- a/dlls/quartz/video.c
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Common implementation of IBasicVideo
- *
- * Copyright 2012 Aric Stewart, CodeWeavers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "quartz_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(quartz);
-
-static inline BaseControlVideo *impl_from_IBasicVideo(IBasicVideo *iface)
-{
- return CONTAINING_RECORD(iface, BaseControlVideo, IBasicVideo_iface);
-}
-
-static HRESULT BaseControlVideoImpl_CheckSourceRect(BaseControlVideo *This, RECT *pSourceRect)
-{
- LONG VideoWidth, VideoHeight;
- HRESULT hr;
-
- if (IsRectEmpty(pSourceRect))
- return E_INVALIDARG;
-
- hr = IBasicVideo_GetVideoSize(&This->IBasicVideo_iface, &VideoWidth, &VideoHeight);
- if (FAILED(hr))
- return hr;
-
- if (pSourceRect->top < 0 || pSourceRect->left < 0 ||
- pSourceRect->bottom > VideoHeight || pSourceRect->right > VideoWidth)
- return E_INVALIDARG;
-
- return S_OK;
-}
-
-static HRESULT BaseControlVideoImpl_CheckTargetRect(BaseControlVideo *This, RECT *pTargetRect)
-{
- if (IsRectEmpty(pTargetRect))
- return E_INVALIDARG;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_QueryInterface(IBasicVideo *iface, REFIID iid, void **out)
-{
- BaseControlVideo *video = impl_from_IBasicVideo(iface);
- return IUnknown_QueryInterface(video->pFilter->outer_unk, iid, out);
-}
-
-static ULONG WINAPI basic_video_AddRef(IBasicVideo *iface)
-{
- BaseControlVideo *video = impl_from_IBasicVideo(iface);
- return IUnknown_AddRef(video->pFilter->outer_unk);
-}
-
-static ULONG WINAPI basic_video_Release(IBasicVideo *iface)
-{
- BaseControlVideo *video = impl_from_IBasicVideo(iface);
- return IUnknown_Release(video->pFilter->outer_unk);
-}
-
-static HRESULT WINAPI basic_video_GetTypeInfoCount(IBasicVideo *iface, UINT *count)
-{
- TRACE("iface %p, count %p.\n", iface, count);
- *count = 1;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_GetTypeInfo(IBasicVideo *iface, UINT index,
- LCID lcid, ITypeInfo **typeinfo)
-{
- TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo);
- return strmbase_get_typeinfo(IBasicVideo_tid, typeinfo);
-}
-
-static HRESULT WINAPI basic_video_GetIDsOfNames(IBasicVideo *iface, REFIID iid,
- LPOLESTR *names, UINT count, LCID lcid, DISPID *ids)
-{
- ITypeInfo *typeinfo;
- HRESULT hr;
-
- TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n",
- iface, debugstr_guid(iid), names, count, lcid, ids);
-
- if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo)))
- {
- hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, ids);
- ITypeInfo_Release(typeinfo);
- }
- return hr;
-}
-
-static HRESULT WINAPI basic_video_Invoke(IBasicVideo *iface, DISPID id, REFIID iid, LCID lcid,
- WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *error_arg)
-{
- ITypeInfo *typeinfo;
- HRESULT hr;
-
- TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n",
- iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg);
-
- if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo)))
- {
- hr = ITypeInfo_Invoke(typeinfo, iface, id, flags, params, result, excepinfo, error_arg);
- ITypeInfo_Release(typeinfo);
- }
- return hr;
-}
-
-static const VIDEOINFOHEADER *get_video_format(BaseControlVideo *video)
-{
- /* Members of VIDEOINFOHEADER up to bmiHeader are identical to those of
- * VIDEOINFOHEADER2. */
- return (const VIDEOINFOHEADER *)video->pPin->mt.pbFormat;
-}
-
-static const BITMAPINFOHEADER *get_bitmap_header(BaseControlVideo *video)
-{
- const AM_MEDIA_TYPE *mt = &video->pPin->mt;
- if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
- return &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader;
- else
- return &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader;
-}
-
-static HRESULT WINAPI basic_video_get_AvgTimePerFrame(IBasicVideo *iface, REFTIME *pAvgTimePerFrame)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- if (!pAvgTimePerFrame)
- return E_POINTER;
- if (!This->pPin->peer)
- return VFW_E_NOT_CONNECTED;
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pAvgTimePerFrame);
-
- *pAvgTimePerFrame = get_video_format(This)->AvgTimePerFrame;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_BitRate(IBasicVideo *iface, LONG *pBitRate)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pBitRate);
-
- if (!pBitRate)
- return E_POINTER;
- if (!This->pPin->peer)
- return VFW_E_NOT_CONNECTED;
-
- *pBitRate = get_video_format(This)->dwBitRate;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_BitErrorRate(IBasicVideo *iface, LONG *pBitErrorRate)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pBitErrorRate);
-
- if (!pBitErrorRate)
- return E_POINTER;
- if (!This->pPin->peer)
- return VFW_E_NOT_CONNECTED;
-
- *pBitErrorRate = get_video_format(This)->dwBitErrorRate;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_VideoWidth(IBasicVideo *iface, LONG *pVideoWidth)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pVideoWidth);
- if (!pVideoWidth)
- return E_POINTER;
-
- *pVideoWidth = get_bitmap_header(This)->biWidth;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_VideoHeight(IBasicVideo *iface, LONG *pVideoHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pVideoHeight);
- if (!pVideoHeight)
- return E_POINTER;
-
- *pVideoHeight = abs(get_bitmap_header(This)->biHeight);
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_SourceLeft(IBasicVideo *iface, LONG left)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, left %d.\n", iface, left);
-
- if (left < 0 || This->src.right + left - This->src.left > get_bitmap_header(This)->biWidth)
- return E_INVALIDARG;
-
- OffsetRect(&This->src, left - This->src.left, 0);
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_SourceLeft(IBasicVideo *iface, LONG *pSourceLeft)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pSourceLeft);
- if (!pSourceLeft)
- return E_POINTER;
- *pSourceLeft = This->src.left;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_SourceWidth(IBasicVideo *iface, LONG width)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, width %d.\n", iface, width);
-
- if (width <= 0 || This->src.left + width > get_bitmap_header(This)->biWidth)
- return E_INVALIDARG;
-
- This->src.right = This->src.left + width;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_SourceWidth(IBasicVideo *iface, LONG *pSourceWidth)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pSourceWidth);
- if (!pSourceWidth)
- return E_POINTER;
- *pSourceWidth = This->src.right - This->src.left;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_SourceTop(IBasicVideo *iface, LONG top)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, top %d.\n", iface, top);
-
- if (top < 0 || This->src.bottom + top - This->src.top > get_bitmap_header(This)->biHeight)
- return E_INVALIDARG;
-
- OffsetRect(&This->src, 0, top - This->src.top);
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_SourceTop(IBasicVideo *iface, LONG *pSourceTop)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pSourceTop);
- if (!pSourceTop)
- return E_POINTER;
- *pSourceTop = This->src.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_SourceHeight(IBasicVideo *iface, LONG height)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, height %d.\n", iface, height);
-
- if (height <= 0 || This->src.top + height > get_bitmap_header(This)->biHeight)
- return E_INVALIDARG;
-
- This->src.bottom = This->src.top + height;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_SourceHeight(IBasicVideo *iface, LONG *pSourceHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pSourceHeight);
- if (!pSourceHeight)
- return E_POINTER;
-
- *pSourceHeight = This->src.bottom - This->src.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_DestinationLeft(IBasicVideo *iface, LONG left)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, left %d.\n", iface, left);
-
- OffsetRect(&This->dst, left - This->dst.left, 0);
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_DestinationLeft(IBasicVideo *iface, LONG *pDestinationLeft)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationLeft);
- if (!pDestinationLeft)
- return E_POINTER;
- *pDestinationLeft = This->dst.left;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_DestinationWidth(IBasicVideo *iface, LONG width)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, width %d.\n", iface, width);
-
- if (width <= 0)
- return E_INVALIDARG;
-
- This->dst.right = This->dst.left + width;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_DestinationWidth(IBasicVideo *iface, LONG *pDestinationWidth)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationWidth);
- if (!pDestinationWidth)
- return E_POINTER;
- *pDestinationWidth = This->dst.right - This->dst.left;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_DestinationTop(IBasicVideo *iface, LONG top)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, top %d.\n", iface, top);
-
- OffsetRect(&This->dst, 0, top - This->dst.top);
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_DestinationTop(IBasicVideo *iface, LONG *pDestinationTop)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationTop);
- if (!pDestinationTop)
- return E_POINTER;
- *pDestinationTop = This->dst.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_put_DestinationHeight(IBasicVideo *iface, LONG height)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("iface %p, height %d.\n", iface, height);
-
- if (height <= 0)
- return E_INVALIDARG;
-
- This->dst.bottom = This->dst.top + height;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_get_DestinationHeight(IBasicVideo *iface, LONG *pDestinationHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pDestinationHeight);
- if (!pDestinationHeight)
- return E_POINTER;
- *pDestinationHeight = This->dst.bottom - This->dst.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_SetSourcePosition(IBasicVideo *iface, LONG Left, LONG Top, LONG Width, LONG Height)
-{
- RECT SourceRect;
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
-
- SetRect(&SourceRect, Left, Top, Left + Width, Top + Height);
- if (FAILED(BaseControlVideoImpl_CheckSourceRect(This, &SourceRect)))
- return E_INVALIDARG;
- This->src = SourceRect;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_GetSourcePosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
- if (!pLeft || !pTop || !pWidth || !pHeight)
- return E_POINTER;
-
- *pLeft = This->src.left;
- *pTop = This->src.top;
- *pWidth = This->src.right - This->src.left;
- *pHeight = This->src.bottom - This->src.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_SetDefaultSourcePosition(IBasicVideo *iface)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->()\n", This, iface);
- return This->pFuncsTable->pfnSetDefaultSourceRect(This);
-}
-
-static HRESULT WINAPI basic_video_SetDestinationPosition(IBasicVideo *iface, LONG Left, LONG Top, LONG Width, LONG Height)
-{
- RECT DestRect;
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height);
-
- SetRect(&DestRect, Left, Top, Left + Width, Top + Height);
- if (FAILED(BaseControlVideoImpl_CheckTargetRect(This, &DestRect)))
- return E_INVALIDARG;
- This->dst = DestRect;
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_GetDestinationPosition(IBasicVideo *iface, LONG *pLeft, LONG *pTop, LONG *pWidth, LONG *pHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%p, %p, %p, %p)\n", This, iface, pLeft, pTop, pWidth, pHeight);
- if (!pLeft || !pTop || !pWidth || !pHeight)
- return E_POINTER;
-
- *pLeft = This->dst.left;
- *pTop = This->dst.top;
- *pWidth = This->dst.right - This->dst.left;
- *pHeight = This->dst.bottom - This->dst.top;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_SetDefaultDestinationPosition(IBasicVideo *iface)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->()\n", This, iface);
- return This->pFuncsTable->pfnSetDefaultTargetRect(This);
-}
-
-static HRESULT WINAPI basic_video_GetVideoSize(IBasicVideo *iface, LONG *pWidth, LONG *pHeight)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
- const BITMAPINFOHEADER *bitmap_header = get_bitmap_header(This);
-
- TRACE("(%p/%p)->(%p, %p)\n", This, iface, pWidth, pHeight);
- if (!pWidth || !pHeight)
- return E_POINTER;
-
- *pHeight = bitmap_header->biHeight;
- *pWidth = bitmap_header->biWidth;
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_GetVideoPaletteEntries(IBasicVideo *iface, LONG StartIndex, LONG Entries, LONG *pRetrieved, LONG *pPalette)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
-
- TRACE("(%p/%p)->(%d, %d, %p, %p)\n", This, iface, StartIndex, Entries, pRetrieved, pPalette);
- if (!pRetrieved || !pPalette)
- return E_POINTER;
-
- *pRetrieved = 0;
- return VFW_E_NO_PALETTE_AVAILABLE;
-}
-
-static HRESULT WINAPI basic_video_GetCurrentImage(IBasicVideo *iface, LONG *pBufferSize, LONG *pDIBImage)
-{
- BaseControlVideo *This = impl_from_IBasicVideo(iface);
- if (!pBufferSize || !pDIBImage)
- return E_POINTER;
-
- return This->pFuncsTable->pfnGetStaticImage(This, pBufferSize, pDIBImage);
-}
-
-static HRESULT WINAPI basic_video_IsUsingDefaultSource(IBasicVideo *iface)
-{
- FIXME("iface %p, stub!\n", iface);
-
- return S_OK;
-}
-
-static HRESULT WINAPI basic_video_IsUsingDefaultDestination(IBasicVideo *iface)
-{
- FIXME("iface %p, stub!\n", iface);
-
- return S_OK;
-}
-
-static const IBasicVideoVtbl basic_video_vtbl =
-{
- basic_video_QueryInterface,
- basic_video_AddRef,
- basic_video_Release,
- basic_video_GetTypeInfoCount,
- basic_video_GetTypeInfo,
- basic_video_GetIDsOfNames,
- basic_video_Invoke,
- basic_video_get_AvgTimePerFrame,
- basic_video_get_BitRate,
- basic_video_get_BitErrorRate,
- basic_video_get_VideoWidth,
- basic_video_get_VideoHeight,
- basic_video_put_SourceLeft,
- basic_video_get_SourceLeft,
- basic_video_put_SourceWidth,
- basic_video_get_SourceWidth,
- basic_video_put_SourceTop,
- basic_video_get_SourceTop,
- basic_video_put_SourceHeight,
- basic_video_get_SourceHeight,
- basic_video_put_DestinationLeft,
- basic_video_get_DestinationLeft,
- basic_video_put_DestinationWidth,
- basic_video_get_DestinationWidth,
- basic_video_put_DestinationTop,
- basic_video_get_DestinationTop,
- basic_video_put_DestinationHeight,
- basic_video_get_DestinationHeight,
- basic_video_SetSourcePosition,
- basic_video_GetSourcePosition,
- basic_video_SetDefaultSourcePosition,
- basic_video_SetDestinationPosition,
- basic_video_GetDestinationPosition,
- basic_video_SetDefaultDestinationPosition,
- basic_video_GetVideoSize,
- basic_video_GetVideoPaletteEntries,
- basic_video_GetCurrentImage,
- basic_video_IsUsingDefaultSource,
- basic_video_IsUsingDefaultDestination
-};
-
-void basic_video_init(BaseControlVideo *video, struct strmbase_filter *filter,
- struct strmbase_pin *pin, const BaseControlVideoFuncTable *func_table)
-{
- video->IBasicVideo_iface.lpVtbl = &basic_video_vtbl;
- video->pFilter = filter;
- video->pPin = pin;
- video->pFuncsTable = func_table;
-}
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 9a79ad4581c..ea5142e3213 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -40,7 +40,6 @@ struct video_renderer
{
struct strmbase_renderer renderer;
struct video_window window;
- BaseControlVideo baseControlVideo;
IOverlay IOverlay_iface;
@@ -69,11 +68,6 @@ static inline struct video_renderer *impl_from_IVideoWindow(IVideoWindow *iface)
return CONTAINING_RECORD(iface, struct video_renderer, window.IVideoWindow_iface);
}
-static inline struct video_renderer *impl_from_BaseControlVideo(BaseControlVideo *iface)
-{
- return CONTAINING_RECORD(iface, struct video_renderer, baseControlVideo);
-}
-
static const BITMAPINFOHEADER *get_bitmap_header(const AM_MEDIA_TYPE *mt)
{
if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
@@ -100,7 +94,7 @@ static HRESULT WINAPI VideoRenderer_ShouldDrawSampleNow(struct strmbase_renderer
static HRESULT WINAPI VideoRenderer_DoRenderSample(struct strmbase_renderer *iface, IMediaSample *pSample)
{
struct video_renderer *filter = impl_from_strmbase_renderer(iface);
- RECT src = filter->baseControlVideo.src, dst = filter->baseControlVideo.dst;
+ RECT src = filter->window.src, dst = filter->window.dst;
LPBYTE pbSrcStream = NULL;
HRESULT hr;
HDC dc;
@@ -171,7 +165,7 @@ static HRESULT video_renderer_query_interface(struct strmbase_renderer *iface, R
struct video_renderer *filter = impl_from_strmbase_renderer(iface);
if (IsEqualGUID(iid, &IID_IBasicVideo))
- *out = &filter->baseControlVideo.IBasicVideo_iface;
+ *out = &filter->window.IBasicVideo_iface;
else if (IsEqualGUID(iid, &IID_IVideoWindow))
*out = &filter->window.IVideoWindow_iface;
else
@@ -231,7 +225,7 @@ static HRESULT video_renderer_connect(struct strmbase_renderer *iface, const AM_
filter->VideoWidth = bitmap_header->biWidth;
filter->VideoHeight = abs(bitmap_header->biHeight);
SetRect(&rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
- filter->baseControlVideo.src = filter->baseControlVideo.dst = rect;
+ filter->window.src = filter->window.dst = rect;
AdjustWindowRectEx(&rect, GetWindowLongW(window, GWL_STYLE), FALSE,
GetWindowLongW(window, GWL_EXSTYLE));
@@ -256,7 +250,7 @@ static BOOL video_renderer_resize(struct video_window *iface, LONG Width, LONG H
struct video_renderer *filter = impl_from_video_window(iface);
TRACE("WM_SIZE %d %d\n", Width, Height);
- GetClientRect(iface->hwnd, &filter->baseControlVideo.dst);
+ GetClientRect(iface->hwnd, &filter->window.dst);
return TRUE;
}
@@ -275,21 +269,13 @@ static const struct strmbase_renderer_ops renderer_ops =
.renderer_connect = video_renderer_connect,
};
-static const struct video_window_ops window_ops =
-{
- .get_default_rect = video_renderer_get_default_rect,
- .resize = video_renderer_resize,
-};
-
-static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG *size, LONG *image)
+static HRESULT video_renderer_get_current_image(struct video_window *iface, LONG *size, LONG *image)
{
- struct video_renderer *filter = impl_from_BaseControlVideo(iface);
+ struct video_renderer *filter = impl_from_video_window(iface);
const BITMAPINFOHEADER *bih;
size_t image_size;
BYTE *sample_data;
- TRACE("filter %p, size %p, image %p.\n", filter, size, image);
-
EnterCriticalSection(&filter->renderer.csRenderLock);
bih = get_bitmap_header(&filter->renderer.sink.pin.mt);
@@ -328,32 +314,35 @@ static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo *iface, LONG
return S_OK;
}
-static HRESULT WINAPI VideoRenderer_SetDefaultSourceRect(BaseControlVideo* iface)
+static HRESULT WINAPI VideoRenderer_SetDefaultSourceRect(struct video_window *iface)
{
- struct video_renderer *This = impl_from_BaseControlVideo(iface);
+ struct video_renderer *This = impl_from_video_window(iface);
- SetRect(&This->baseControlVideo.src, 0, 0, This->VideoWidth, This->VideoHeight);
+ SetRect(&This->window.src, 0, 0, This->VideoWidth, This->VideoHeight);
return S_OK;
}
-static HRESULT WINAPI VideoRenderer_SetDefaultTargetRect(BaseControlVideo* iface)
+static HRESULT WINAPI VideoRenderer_SetDefaultTargetRect(struct video_window *iface)
{
- struct video_renderer *This = impl_from_BaseControlVideo(iface);
+ struct video_renderer *This = impl_from_video_window(iface);
RECT rect;
if (!GetClientRect(This->window.hwnd, &rect))
return E_FAIL;
- SetRect(&This->baseControlVideo.dst, 0, 0, rect.right, rect.bottom);
+ SetRect(&This->window.dst, 0, 0, rect.right, rect.bottom);
return S_OK;
}
-static const BaseControlVideoFuncTable renderer_BaseControlVideoFuncTable = {
- VideoRenderer_GetStaticImage,
- VideoRenderer_SetDefaultSourceRect,
- VideoRenderer_SetDefaultTargetRect,
+static const struct video_window_ops window_ops =
+{
+ .get_default_rect = video_renderer_get_default_rect,
+ .resize = video_renderer_resize,
+ .get_current_image = video_renderer_get_current_image,
+ .pfnSetDefaultSourceRect = VideoRenderer_SetDefaultSourceRect,
+ .pfnSetDefaultTargetRect = VideoRenderer_SetDefaultTargetRect,
};
static HRESULT WINAPI VideoWindow_get_FullScreenMode(IVideoWindow *iface,
@@ -386,16 +375,16 @@ static HRESULT WINAPI VideoWindow_put_FullScreenMode(IVideoWindow *iface, LONG f
SetWindowLongW(window, GWL_STYLE, WS_POPUP);
SetWindowPos(window, HWND_TOP, 0, 0,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_SHOWWINDOW);
- GetWindowRect(window, &filter->baseControlVideo.dst);
+ GetWindowRect(window, &filter->window.dst);
}
else
{
ShowWindow(window, SW_HIDE);
SetParent(window, filter->window.hwndOwner);
SetWindowLongW(window, GWL_STYLE, filter->saved_style);
- GetClientRect(window, &filter->baseControlVideo.dst);
- SetWindowPos(window, 0, filter->baseControlVideo.dst.left, filter->baseControlVideo.dst.top,
- filter->baseControlVideo.dst.right, filter->baseControlVideo.dst.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
+ GetClientRect(window, &filter->window.dst);
+ SetWindowPos(window, 0, filter->window.dst.left, filter->window.dst.top,
+ filter->window.dst.right, filter->window.dst.bottom, SWP_NOZORDER | SWP_SHOWWINDOW);
}
filter->FullScreenMode = fullscreen;
@@ -569,8 +558,6 @@ HRESULT video_renderer_create(IUnknown *outer, IUnknown **out)
video_window_init(&object->window, &IVideoWindow_VTable,
&object->renderer.filter, &object->renderer.sink.pin, &window_ops);
- basic_video_init(&object->baseControlVideo, &object->renderer.filter,
- &object->renderer.sink.pin, &renderer_BaseControlVideoFuncTable);
if (FAILED(hr = video_window_create_window(&object->window)))
{
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 4e535629cce..4fb8ddc32f4 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -57,7 +57,6 @@ struct quartz_vmr
{
struct strmbase_renderer renderer;
struct video_window window;
- BaseControlVideo baseControlVideo;
IAMCertifiedOutputProtection IAMCertifiedOutputProtection_iface;
IAMFilterMiscFlags IAMFilterMiscFlags_iface;
@@ -120,11 +119,6 @@ static inline struct quartz_vmr *impl_from_video_window(struct video_window *ifa
return CONTAINING_RECORD(iface, struct quartz_vmr, window);
}
-static inline struct quartz_vmr *impl_from_BaseControlVideo(BaseControlVideo *cvid)
-{
- return CONTAINING_RECORD(cvid, struct quartz_vmr, baseControlVideo);
-}
-
static inline struct quartz_vmr *impl_from_IAMCertifiedOutputProtection(IAMCertifiedOutputProtection *iface)
{
return CONTAINING_RECORD(iface, struct quartz_vmr, IAMCertifiedOutputProtection_iface);
@@ -415,8 +409,8 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE
if (filter->mode == VMR9Mode_Windowless && !filter->hWndClippingWindow)
return S_OK;
- info.dwWidth = filter->baseControlVideo.src.right;
- info.dwHeight = filter->baseControlVideo.src.bottom;
+ info.dwWidth = filter->window.src.right;
+ info.dwHeight = filter->window.src.bottom;
info.Pool = D3DPOOL_DEFAULT;
info.MinBuffers = 1;
info.szAspectRatio.cx = info.dwWidth;
@@ -512,7 +506,7 @@ static HRESULT vmr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE
filter->VideoWidth = bitmap_header->biWidth;
filter->VideoHeight = bitmap_header->biHeight;
SetRect(&rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
- filter->baseControlVideo.src = filter->baseControlVideo.dst = rect;
+ filter->window.src = filter->window.dst = rect;
AdjustWindowRectEx(&rect, GetWindowLongW(window, GWL_STYLE), FALSE,
GetWindowLongW(window, GWL_EXSTYLE));
@@ -598,7 +592,7 @@ static HRESULT vmr_query_interface(struct strmbase_renderer *iface, REFIID iid,
if (IsEqualGUID(iid, &IID_IVideoWindow))
*out = &filter->window.IVideoWindow_iface;
else if (IsEqualGUID(iid, &IID_IBasicVideo))
- *out = &filter->baseControlVideo.IBasicVideo_iface;
+ *out = &filter->window.IBasicVideo_iface;
else if (IsEqualGUID(iid, &IID_IAMCertifiedOutputProtection))
*out = &filter->IAMCertifiedOutputProtection_iface;
else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags))
@@ -674,20 +668,14 @@ static BOOL vmr_resize(struct video_window *This, LONG Width, LONG Height)
struct quartz_vmr *pVMR9 = impl_from_video_window(This);
TRACE("WM_SIZE %d %d\n", Width, Height);
- GetClientRect(This->hwnd, &pVMR9->baseControlVideo.dst);
+ GetClientRect(This->hwnd, &pVMR9->window.dst);
return TRUE;
}
-static const struct video_window_ops window_ops =
+static HRESULT vmr_get_current_image(struct video_window *iface, LONG *size, LONG *image)
{
- .get_default_rect = vmr_get_default_rect,
- .resize = vmr_resize,
-};
-
-static HRESULT WINAPI VMR9_GetStaticImage(BaseControlVideo *iface, LONG *size, LONG *image)
-{
- struct quartz_vmr *filter = impl_from_BaseControlVideo(iface);
+ struct quartz_vmr *filter = impl_from_video_window(iface);
IDirect3DSurface9 *rt = NULL, *surface = NULL;
D3DLOCKED_RECT locked_rect;
IDirect3DDevice9 *device;
@@ -697,8 +685,6 @@ static HRESULT WINAPI VMR9_GetStaticImage(BaseControlVideo *iface, LONG *size, L
char *dst;
HRESULT hr;
- TRACE("filter %p, size %d, image %p.\n", filter, *size, image);
-
EnterCriticalSection(&filter->renderer.csRenderLock);
device = filter->allocator_d3d9_dev;
@@ -748,32 +734,35 @@ out:
return hr;
}
-static HRESULT WINAPI VMR9_SetDefaultSourceRect(BaseControlVideo* This)
+static HRESULT WINAPI VMR9_SetDefaultSourceRect(struct video_window *iface)
{
- struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This);
+ struct quartz_vmr *filter = impl_from_video_window(iface);
- SetRect(&pVMR9->baseControlVideo.src, 0, 0, pVMR9->VideoWidth, pVMR9->VideoHeight);
+ SetRect(&filter->window.src, 0, 0, filter->VideoWidth, filter->VideoHeight);
return S_OK;
}
-static HRESULT WINAPI VMR9_SetDefaultTargetRect(BaseControlVideo* This)
+static HRESULT WINAPI VMR9_SetDefaultTargetRect(struct video_window *iface)
{
RECT rect;
- struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This);
+ struct quartz_vmr *filter = impl_from_video_window(iface);
- if (!GetClientRect(pVMR9->window.hwnd, &rect))
+ if (!GetClientRect(filter->window.hwnd, &rect))
return E_FAIL;
- SetRect(&pVMR9->baseControlVideo.dst, 0, 0, rect.right, rect.bottom);
+ SetRect(&filter->window.dst, 0, 0, rect.right, rect.bottom);
return S_OK;
}
-static const BaseControlVideoFuncTable renderer_BaseControlVideoFuncTable = {
- VMR9_GetStaticImage,
- VMR9_SetDefaultSourceRect,
- VMR9_SetDefaultTargetRect,
+static const struct video_window_ops window_ops =
+{
+ .get_default_rect = vmr_get_default_rect,
+ .resize = vmr_resize,
+ .get_current_image = vmr_get_current_image,
+ .pfnSetDefaultSourceRect = VMR9_SetDefaultSourceRect,
+ .pfnSetDefaultTargetRect = VMR9_SetDefaultTargetRect,
};
static const IVideoWindowVtbl IVideoWindow_VTable =
@@ -1510,10 +1499,10 @@ static HRESULT WINAPI VMR7WindowlessControl_SetVideoPosition(IVMRWindowlessContr
EnterCriticalSection(&This->renderer.filter.csFilter);
if (source)
- This->baseControlVideo.src = *source;
+ This->window.src = *source;
if (dest)
{
- This->baseControlVideo.dst = *dest;
+ This->window.dst = *dest;
FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest));
SetWindowPos(This->window.hwnd, NULL,
dest->left, dest->top, dest->right - dest->left, dest->bottom-dest->top,
@@ -1531,10 +1520,10 @@ static HRESULT WINAPI VMR7WindowlessControl_GetVideoPosition(IVMRWindowlessContr
struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface);
if (source)
- *source = This->baseControlVideo.src;
+ *source = This->window.src;
if (dest)
- *dest = This->baseControlVideo.dst;
+ *dest = This->window.dst;
FIXME("(%p/%p)->(%p/%p) stub\n", iface, This, source, dest);
return S_OK;
@@ -1711,10 +1700,10 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoPosition(IVMRWindowlessContr
EnterCriticalSection(&This->renderer.filter.csFilter);
if (source)
- This->baseControlVideo.src = *source;
+ This->window.src = *source;
if (dest)
{
- This->baseControlVideo.dst = *dest;
+ This->window.dst = *dest;
FIXME("Output rectangle: %s.\n", wine_dbgstr_rect(dest));
SetWindowPos(This->window.hwnd, NULL,
dest->left, dest->top, dest->right - dest->left, dest->bottom - dest->top,
@@ -1731,10 +1720,10 @@ static HRESULT WINAPI VMR9WindowlessControl_GetVideoPosition(IVMRWindowlessContr
struct quartz_vmr *This = impl_from_IVMRWindowlessControl9(iface);
if (source)
- *source = This->baseControlVideo.src;
+ *source = This->window.src;
if (dest)
- *dest = This->baseControlVideo.dst;
+ *dest = This->window.dst;
FIXME("(%p/%p)->(%p/%p) stub\n", iface, This, source, dest);
return S_OK;
@@ -2352,9 +2341,6 @@ static HRESULT vmr_create(IUnknown *outer, IUnknown **out, const CLSID *clsid)
return hr;
}
- basic_video_init(&object->baseControlVideo, &object->renderer.filter,
- &object->renderer.sink.pin, &renderer_BaseControlVideoFuncTable);
-
object->run_event = CreateEventW(NULL, TRUE, FALSE, NULL);
TRACE("Created VMR %p.\n", object);
@@ -2519,11 +2505,11 @@ static HRESULT VMR9_ImagePresenter_PresentOffscreenSurface(struct default_presen
}
/* Move rect to origin and flip it */
- SetRect(&target_rect, 0, This->pVMR9->baseControlVideo.dst.bottom - This->pVMR9->baseControlVideo.dst.top,
- This->pVMR9->baseControlVideo.dst.right - This->pVMR9->baseControlVideo.dst.left, 0);
+ SetRect(&target_rect, 0, This->pVMR9->window.dst.bottom - This->pVMR9->window.dst.top,
+ This->pVMR9->window.dst.right - This->pVMR9->window.dst.left, 0);
hr = IDirect3DDevice9_StretchRect(This->d3d9_dev, surface,
- &This->pVMR9->baseControlVideo.src, target, &target_rect, D3DTEXF_LINEAR);
+ &This->pVMR9->window.src, target, &target_rect, D3DTEXF_LINEAR);
if (FAILED(hr))
ERR("IDirect3DDevice9_StretchRect -- %08x\n", hr);
IDirect3DSurface9_Release(target);
@@ -2695,8 +2681,8 @@ static BOOL CreateRenderingWindow(struct default_presenter *This, VMR9Allocation
d3dpp.Windowed = TRUE;
d3dpp.hDeviceWindow = This->pVMR9->window.hwnd;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferHeight = This->pVMR9->baseControlVideo.dst.bottom - This->pVMR9->baseControlVideo.dst.top;
- d3dpp.BackBufferWidth = This->pVMR9->baseControlVideo.dst.right - This->pVMR9->baseControlVideo.dst.left;
+ d3dpp.BackBufferHeight = This->pVMR9->window.dst.bottom - This->pVMR9->window.dst.top;
+ d3dpp.BackBufferWidth = This->pVMR9->window.dst.right - This->pVMR9->window.dst.left;
hr = IDirect3D9_CreateDevice(This->d3d9_ptr, d3d9_adapter, D3DDEVTYPE_HAL, NULL, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &This->d3d9_dev);
if (FAILED(hr))
@@ -2831,24 +2817,24 @@ static HRESULT VMR9_SurfaceAllocator_UpdateDeviceReset(struct default_presenter
{
if (i % 2)
{
- t_vert[i].x = (float)This->pVMR9->baseControlVideo.dst.right - (float)This->pVMR9->baseControlVideo.dst.left - 0.5f;
- t_vert[i].u = (float)This->pVMR9->baseControlVideo.src.right / (float)width;
+ t_vert[i].x = (float)This->pVMR9->window.dst.right - (float)This->pVMR9->window.dst.left - 0.5f;
+ t_vert[i].u = (float)This->pVMR9->window.src.right / (float)width;
}
else
{
t_vert[i].x = -0.5f;
- t_vert[i].u = (float)This->pVMR9->baseControlVideo.src.left / (float)width;
+ t_vert[i].u = (float)This->pVMR9->window.src.left / (float)width;
}
if (i % 4 < 2)
{
t_vert[i].y = -0.5f;
- t_vert[i].v = (float)This->pVMR9->baseControlVideo.src.bottom / (float)height;
+ t_vert[i].v = (float)This->pVMR9->window.src.bottom / (float)height;
}
else
{
- t_vert[i].y = (float)This->pVMR9->baseControlVideo.dst.bottom - (float)This->pVMR9->baseControlVideo.dst.top - 0.5f;
- t_vert[i].v = (float)This->pVMR9->baseControlVideo.src.top / (float)height;
+ t_vert[i].y = (float)This->pVMR9->window.dst.bottom - (float)This->pVMR9->window.dst.top - 0.5f;
+ t_vert[i].v = (float)This->pVMR9->window.src.top / (float)height;
}
t_vert[i].z = 0.0f;
t_vert[i].rhw = 1.0f;
diff --git a/dlls/quartz/window.c b/dlls/quartz/window.c
index b8fbd2694ca..ebd3ffe3024 100644
--- a/dlls/quartz/window.c
+++ b/dlls/quartz/window.c
@@ -656,6 +656,550 @@ HRESULT WINAPI BaseControlWindowImpl_IsCursorHidden(IVideoWindow *iface, LONG *C
return S_OK;
}
+static inline struct video_window *impl_from_IBasicVideo(IBasicVideo *iface)
+{
+ return CONTAINING_RECORD(iface, struct video_window, IBasicVideo_iface);
+}
+
+static HRESULT WINAPI basic_video_QueryInterface(IBasicVideo *iface, REFIID iid, void **out)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+ return IUnknown_QueryInterface(window->pFilter->outer_unk, iid, out);
+}
+
+static ULONG WINAPI basic_video_AddRef(IBasicVideo *iface)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+ return IUnknown_AddRef(window->pFilter->outer_unk);
+}
+
+static ULONG WINAPI basic_video_Release(IBasicVideo *iface)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+ return IUnknown_Release(window->pFilter->outer_unk);
+}
+
+static HRESULT WINAPI basic_video_GetTypeInfoCount(IBasicVideo *iface, UINT *count)
+{
+ TRACE("iface %p, count %p.\n", iface, count);
+ *count = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_GetTypeInfo(IBasicVideo *iface, UINT index,
+ LCID lcid, ITypeInfo **typeinfo)
+{
+ TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo);
+ return strmbase_get_typeinfo(IBasicVideo_tid, typeinfo);
+}
+
+static HRESULT WINAPI basic_video_GetIDsOfNames(IBasicVideo *iface, REFIID iid,
+ LPOLESTR *names, UINT count, LCID lcid, DISPID *ids)
+{
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n",
+ iface, debugstr_guid(iid), names, count, lcid, ids);
+
+ if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo)))
+ {
+ hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, ids);
+ ITypeInfo_Release(typeinfo);
+ }
+ return hr;
+}
+
+static HRESULT WINAPI basic_video_Invoke(IBasicVideo *iface, DISPID id, REFIID iid, LCID lcid,
+ WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *error_arg)
+{
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n",
+ iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg);
+
+ if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo)))
+ {
+ hr = ITypeInfo_Invoke(typeinfo, iface, id, flags, params, result, excepinfo, error_arg);
+ ITypeInfo_Release(typeinfo);
+ }
+ return hr;
+}
+
+static const VIDEOINFOHEADER *get_video_format(struct video_window *window)
+{
+ /* Members of VIDEOINFOHEADER up to bmiHeader are identical to those of
+ * VIDEOINFOHEADER2. */
+ return (const VIDEOINFOHEADER *)window->pPin->mt.pbFormat;
+}
+
+static const BITMAPINFOHEADER *get_bitmap_header(struct video_window *window)
+{
+ const AM_MEDIA_TYPE *mt = &window->pPin->mt;
+ if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
+ return &((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader;
+ else
+ return &((VIDEOINFOHEADER2 *)mt->pbFormat)->bmiHeader;
+}
+
+static HRESULT WINAPI basic_video_get_AvgTimePerFrame(IBasicVideo *iface, REFTIME *reftime)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ if (!reftime)
+ return E_POINTER;
+ if (!window->pPin->peer)
+ return VFW_E_NOT_CONNECTED;
+
+ TRACE("window %p, reftime %p.\n", window, reftime);
+
+ *reftime = get_video_format(window)->AvgTimePerFrame;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_BitRate(IBasicVideo *iface, LONG *rate)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, rate %p.\n", window, rate);
+
+ if (!rate)
+ return E_POINTER;
+ if (!window->pPin->peer)
+ return VFW_E_NOT_CONNECTED;
+
+ *rate = get_video_format(window)->dwBitRate;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_BitErrorRate(IBasicVideo *iface, LONG *rate)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, rate %p.\n", window, rate);
+
+ if (!rate)
+ return E_POINTER;
+ if (!window->pPin->peer)
+ return VFW_E_NOT_CONNECTED;
+
+ *rate = get_video_format(window)->dwBitErrorRate;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_VideoWidth(IBasicVideo *iface, LONG *width)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, width %p.\n", window, width);
+
+ if (!width)
+ return E_POINTER;
+
+ *width = get_bitmap_header(window)->biWidth;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_VideoHeight(IBasicVideo *iface, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, height %p.\n", window, height);
+
+ if (!height)
+ return E_POINTER;
+
+ *height = abs(get_bitmap_header(window)->biHeight);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_SourceLeft(IBasicVideo *iface, LONG left)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %d.\n", window, left);
+
+ if (left < 0 || window->src.right + left - window->src.left > get_bitmap_header(window)->biWidth)
+ return E_INVALIDARG;
+
+ OffsetRect(&window->src, left - window->src.left, 0);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_SourceLeft(IBasicVideo *iface, LONG *left)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %p.\n", window, left);
+
+ if (!left)
+ return E_POINTER;
+
+ *left = window->src.left;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_SourceWidth(IBasicVideo *iface, LONG width)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, width %d.\n", window, width);
+
+ if (width <= 0 || window->src.left + width > get_bitmap_header(window)->biWidth)
+ return E_INVALIDARG;
+
+ window->src.right = window->src.left + width;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_SourceWidth(IBasicVideo *iface, LONG *width)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, width %p.\n", window, width);
+
+ if (!width)
+ return E_POINTER;
+
+ *width = window->src.right - window->src.left;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_SourceTop(IBasicVideo *iface, LONG top)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, top %d.\n", window, top);
+
+ if (top < 0 || window->src.bottom + top - window->src.top > get_bitmap_header(window)->biHeight)
+ return E_INVALIDARG;
+
+ OffsetRect(&window->src, 0, top - window->src.top);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_SourceTop(IBasicVideo *iface, LONG *top)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, top %p.\n", window, top);
+
+ if (!top)
+ return E_POINTER;
+
+ *top = window->src.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_SourceHeight(IBasicVideo *iface, LONG height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, height %d.\n", window, height);
+
+ if (height <= 0 || window->src.top + height > get_bitmap_header(window)->biHeight)
+ return E_INVALIDARG;
+
+ window->src.bottom = window->src.top + height;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_SourceHeight(IBasicVideo *iface, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, height %p\n", window, height);
+
+ if (!height)
+ return E_POINTER;
+
+ *height = window->src.bottom - window->src.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_DestinationLeft(IBasicVideo *iface, LONG left)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %d.\n", window, left);
+
+ OffsetRect(&window->dst, left - window->dst.left, 0);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_DestinationLeft(IBasicVideo *iface, LONG *left)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %p.\n", window, left);
+
+ if (!left)
+ return E_POINTER;
+
+ *left = window->dst.left;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_DestinationWidth(IBasicVideo *iface, LONG width)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, width %d.\n", window, width);
+
+ if (width <= 0)
+ return E_INVALIDARG;
+
+ window->dst.right = window->dst.left + width;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_DestinationWidth(IBasicVideo *iface, LONG *width)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, width %p.\n", window, width);
+
+ if (!width)
+ return E_POINTER;
+
+ *width = window->dst.right - window->dst.left;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_DestinationTop(IBasicVideo *iface, LONG top)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, top %d.\n", window, top);
+
+ OffsetRect(&window->dst, 0, top - window->dst.top);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_DestinationTop(IBasicVideo *iface, LONG *top)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, top %p.\n", window, top);
+
+ if (!top)
+ return E_POINTER;
+
+ *top = window->dst.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_put_DestinationHeight(IBasicVideo *iface, LONG height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, height %d.\n", window, height);
+
+ if (height <= 0)
+ return E_INVALIDARG;
+
+ window->dst.bottom = window->dst.top + height;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_get_DestinationHeight(IBasicVideo *iface, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, height %p.\n", window, height);
+
+ if (!height)
+ return E_POINTER;
+
+ *height = window->dst.bottom - window->dst.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_SetSourcePosition(IBasicVideo *iface,
+ LONG left, LONG top, LONG width, LONG height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+ const BITMAPINFOHEADER *bitmap_header = get_bitmap_header(window);
+
+ TRACE("window %p, left %d, top %d, width %d, height %d.\n", window, left, top, width, height);
+
+ if (left < 0 || left + width > bitmap_header->biWidth || width <= 0)
+ return E_INVALIDARG;
+ if (top < 0 || top + height > bitmap_header->biHeight || height <= 0)
+ return E_INVALIDARG;
+
+ SetRect(&window->src, left, top, left + width, top + height);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_GetSourcePosition(IBasicVideo *iface,
+ LONG *left, LONG *top, LONG *width, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %p, top %p, width %p, height %p.\n", window, left, top, width, height);
+
+ if (!left || !top || !width || !height)
+ return E_POINTER;
+
+ *left = window->src.left;
+ *top = window->src.top;
+ *width = window->src.right - window->src.left;
+ *height = window->src.bottom - window->src.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_SetDefaultSourcePosition(IBasicVideo *iface)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p.\n", window);
+
+ return window->ops->pfnSetDefaultSourceRect(window);
+}
+
+static HRESULT WINAPI basic_video_SetDestinationPosition(IBasicVideo *iface,
+ LONG left, LONG top, LONG width, LONG height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %d, top %d, width %d, height %d.\n", window, left, top, width, height);
+
+ if (width <= 0 || height <= 0)
+ return E_INVALIDARG;
+
+ SetRect(&window->dst, left, top, left + width, top + height);
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_GetDestinationPosition(IBasicVideo *iface,
+ LONG *left, LONG *top, LONG *width, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, left %p, top %p, width %p, height %p.\n", window, left, top, width, height);
+
+ if (!left || !top || !width || !height)
+ return E_POINTER;
+
+ *left = window->dst.left;
+ *top = window->dst.top;
+ *width = window->dst.right - window->dst.left;
+ *height = window->dst.bottom - window->dst.top;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_SetDefaultDestinationPosition(IBasicVideo *iface)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p.\n", window);
+
+ return window->ops->pfnSetDefaultTargetRect(window);
+}
+
+static HRESULT WINAPI basic_video_GetVideoSize(IBasicVideo *iface, LONG *width, LONG *height)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+ const BITMAPINFOHEADER *bitmap_header = get_bitmap_header(window);
+
+ TRACE("window %p, width %p, height %p.\n", window, width, height);
+
+ if (!width || !height)
+ return E_POINTER;
+
+ *width = bitmap_header->biWidth;
+ *height = bitmap_header->biHeight;
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_GetVideoPaletteEntries(IBasicVideo *iface,
+ LONG start, LONG count, LONG *ret_count, LONG *palette)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ FIXME("window %p, start %d, count %d, ret_count %p, palette %p, stub!\n",
+ window, start, count, ret_count, palette);
+
+ if (!ret_count || !palette)
+ return E_POINTER;
+
+ *ret_count = 0;
+ return VFW_E_NO_PALETTE_AVAILABLE;
+}
+
+static HRESULT WINAPI basic_video_GetCurrentImage(IBasicVideo *iface, LONG *size, LONG *image)
+{
+ struct video_window *window = impl_from_IBasicVideo(iface);
+
+ TRACE("window %p, size %p, image %p.\n", window, size, image);
+
+ if (!size || !image)
+ return E_POINTER;
+
+ return window->ops->get_current_image(window, size, image);
+}
+
+static HRESULT WINAPI basic_video_IsUsingDefaultSource(IBasicVideo *iface)
+{
+ FIXME("iface %p, stub!\n", iface);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI basic_video_IsUsingDefaultDestination(IBasicVideo *iface)
+{
+ FIXME("iface %p, stub!\n", iface);
+
+ return S_OK;
+}
+
+static const IBasicVideoVtbl basic_video_vtbl =
+{
+ basic_video_QueryInterface,
+ basic_video_AddRef,
+ basic_video_Release,
+ basic_video_GetTypeInfoCount,
+ basic_video_GetTypeInfo,
+ basic_video_GetIDsOfNames,
+ basic_video_Invoke,
+ basic_video_get_AvgTimePerFrame,
+ basic_video_get_BitRate,
+ basic_video_get_BitErrorRate,
+ basic_video_get_VideoWidth,
+ basic_video_get_VideoHeight,
+ basic_video_put_SourceLeft,
+ basic_video_get_SourceLeft,
+ basic_video_put_SourceWidth,
+ basic_video_get_SourceWidth,
+ basic_video_put_SourceTop,
+ basic_video_get_SourceTop,
+ basic_video_put_SourceHeight,
+ basic_video_get_SourceHeight,
+ basic_video_put_DestinationLeft,
+ basic_video_get_DestinationLeft,
+ basic_video_put_DestinationWidth,
+ basic_video_get_DestinationWidth,
+ basic_video_put_DestinationTop,
+ basic_video_get_DestinationTop,
+ basic_video_put_DestinationHeight,
+ basic_video_get_DestinationHeight,
+ basic_video_SetSourcePosition,
+ basic_video_GetSourcePosition,
+ basic_video_SetDefaultSourcePosition,
+ basic_video_SetDestinationPosition,
+ basic_video_GetDestinationPosition,
+ basic_video_SetDefaultDestinationPosition,
+ basic_video_GetVideoSize,
+ basic_video_GetVideoPaletteEntries,
+ basic_video_GetCurrentImage,
+ basic_video_IsUsingDefaultSource,
+ basic_video_IsUsingDefaultDestination
+};
+
void video_window_unregister_class(void)
{
if (!UnregisterClassW(class_name, NULL) && GetLastError() != ERROR_CLASS_DOES_NOT_EXIST)
@@ -668,6 +1212,7 @@ void video_window_init(struct video_window *window, const IVideoWindowVtbl *vtbl
memset(window, 0, sizeof(*window));
window->ops = ops;
window->IVideoWindow_iface.lpVtbl = vtbl;
+ window->IBasicVideo_iface.lpVtbl = &basic_video_vtbl;
window->AutoShow = OATRUE;
window->pFilter = owner;
window->pPin = pin;
--
2.26.2
More information about the wine-devel
mailing list