[PATCH 24/32] mciqtz32: Remove individual queryinterfaces
Maarten Lankhorst
m.b.lankhorst at gmail.com
Thu Jun 3 14:08:15 CDT 2010
---
dlls/mciqtz32/mciqtz.c | 233 +++++++++++++++------------------------
dlls/mciqtz32/mciqtz_private.h | 3 +
2 files changed, 93 insertions(+), 143 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index a42529b..6dabaa5 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -145,8 +145,8 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
{
WINE_MCIQTZ* wma;
HRESULT hr;
- IBasicVideo *vidbasic;
- IVideoWindow *vidwin;
+ DWORD style = 0;
+ RECT rc = { 0, 0, 0, 0 };
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpOpenParms);
@@ -174,6 +174,24 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
goto err;
}
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaSeeking, (void**)&wma->seek);
+ if (FAILED(hr)) {
+ TRACE("Cannot get IMediaSeeking interface (hr = %x)\n", hr);
+ goto err;
+ }
+
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&wma->vidwin);
+ if (FAILED(hr)) {
+ TRACE("Cannot get IVideoWindow interface (hr = %x)\n", hr);
+ goto err;
+ }
+
+ hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IBasicVideo, (void**)&wma->vidbasic);
+ if (FAILED(hr)) {
+ TRACE("Cannot get IBasicVideo interface (hr = %x)\n", hr);
+ goto err;
+ }
+
if (!(dwFlags & MCI_OPEN_ELEMENT) || (dwFlags & MCI_OPEN_ELEMENT_ID)) {
TRACE("Wrong dwFlags %x\n", dwFlags);
goto err;
@@ -192,33 +210,21 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
goto err;
}
- hr = IFilterGraph2_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&vidwin);
- if (SUCCEEDED(hr))
- hr = IFilterGraph2_QueryInterface(wma->pgraph, &IID_IBasicVideo, (void**)&vidbasic);
- if (SUCCEEDED(hr)) {
- DWORD style;
- RECT rc = { 0, 0, 0, 0 };
- IVideoWindow_put_AutoShow(vidwin, OAFALSE);
- IVideoWindow_put_Visible(vidwin, OAFALSE);
- style = 0;
- if (dwFlags & MCI_DGV_OPEN_WS)
- style |= lpOpenParms->dwStyle;
- if (dwFlags & MCI_DGV_OPEN_PARENT) {
- IVideoWindow_put_MessageDrain(vidwin, (OAHWND)lpOpenParms->hWndParent);
- IVideoWindow_put_WindowState(vidwin, SW_HIDE);
- IVideoWindow_put_WindowStyle(vidwin, WS_CHILD);
- IVideoWindow_put_Owner(vidwin, (OAHWND)lpOpenParms->hWndParent);
- wma->parent = (HWND)lpOpenParms->hWndParent;
- }
- else if (style)
- IVideoWindow_put_WindowStyle(vidwin, style);
- IBasicVideo_GetVideoSize(vidbasic, &rc.right, &rc.bottom);
- IVideoWindow_SetWindowPosition(vidwin, rc.left, rc.top, rc.right, rc.bottom);
- IBasicVideo_Release(vidbasic);
- }
- if (vidwin)
- IVideoWindow_Release(vidwin);
-
+ IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE);
+ IVideoWindow_put_Visible(wma->vidwin, OAFALSE);
+ if (dwFlags & MCI_DGV_OPEN_WS)
+ style = lpOpenParms->dwStyle;
+ if (dwFlags & MCI_DGV_OPEN_PARENT) {
+ IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpOpenParms->hWndParent);
+ IVideoWindow_put_WindowState(wma->vidwin, SW_HIDE);
+ IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD);
+ IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpOpenParms->hWndParent);
+ GetClientRect(lpOpenParms->hWndParent, &rc);
+ IVideoWindow_SetWindowPosition(wma->vidwin, rc.left, rc.top, rc.right - rc.top, rc.bottom - rc.top);
+ wma->parent = (HWND)lpOpenParms->hWndParent;
+ }
+ else if (style)
+ IVideoWindow_put_WindowStyle(wma->vidwin, style);
wma->opened = TRUE;
if (dwFlags & MCI_NOTIFY)
@@ -227,6 +233,15 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags,
return 0;
err:
+ if (wma->vidbasic)
+ IUnknown_Release(wma->vidbasic);
+ wma->vidbasic = NULL;
+ if (wma->seek)
+ IUnknown_Release(wma->seek);
+ wma->seek = NULL;
+ if (wma->vidwin)
+ IUnknown_Release(wma->vidwin);
+ wma->vidwin = NULL;
if (wma->pgraph)
IGraphBuilder_Release(wma->pgraph);
wma->pgraph = NULL;
@@ -256,6 +271,9 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
if (wma->opened) {
+ IUnknown_Release(wma->vidwin);
+ IUnknown_Release(wma->vidbasic);
+ IUnknown_Release(wma->seek);
IGraphBuilder_Release(wma->pgraph);
IMediaControl_Release(wma->pmctrl);
if (wma->uninit)
@@ -289,14 +307,8 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
return MCIERR_INTERNAL;
}
- if (!wma->parent) {
- IVideoWindow *vidwin;
- IFilterGraph2_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&vidwin);
- if (vidwin) {
- IVideoWindow_put_Visible(vidwin, OATRUE);
- IVideoWindow_Release(vidwin);
- }
- }
+ if (!wma->parent)
+ IVideoWindow_put_Visible(wma->vidwin, OATRUE);
return 0;
}
@@ -308,7 +320,6 @@ static DWORD MCIQTZ_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms
{
WINE_MCIQTZ* wma;
HRESULT hr;
- IMediaPosition* pmpos;
LONGLONG newpos;
TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
@@ -335,21 +346,12 @@ static DWORD MCIQTZ_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms
return MCIERR_MISSING_PARAMETER;
}
- hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition, (LPVOID*)&pmpos);
- if (FAILED(hr)) {
- FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
- return MCIERR_INTERNAL;
- }
-
- hr = IMediaPosition_put_CurrentPosition(pmpos, newpos);
+ hr = IMediaSeeking_SetPositions(wma->seek, &newpos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning);
if (FAILED(hr)) {
FIXME("Cannot set position (hr = %x)\n", hr);
- IMediaPosition_Release(pmpos);
return MCIERR_INTERNAL;
}
- IMediaPosition_Release(pmpos);
-
if (dwFlags & MCI_NOTIFY)
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID, MCI_NOTIFY_SUCCESSFUL);
@@ -379,14 +381,8 @@ static DWORD MCIQTZ_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
return MCIERR_INTERNAL;
}
- if (!wma->parent) {
- IVideoWindow *vidwin;
- IFilterGraph2_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&vidwin);
- if (vidwin) {
- IVideoWindow_put_Visible(vidwin, OAFALSE);
- IVideoWindow_Release(vidwin);
- }
- }
+ if (!wma->parent)
+ IVideoWindow_put_Visible(wma->vidwin, OAFALSE);
return 0;
}
@@ -592,7 +588,6 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS
switch (lpParms->dwItem) {
case MCI_STATUS_LENGTH: {
- IMediaSeeking *seek;
LONGLONG duration = -1;
GUID format;
switch (wma->time_format) {
@@ -600,20 +595,13 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS
case MCI_FORMAT_FRAMES: format = TIME_FORMAT_FRAME; break;
default: ERR("Unhandled format %x\n", wma->time_format); break;
}
- hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaSeeking, (void**)&seek);
- if (FAILED(hr)) {
- FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
- return MCIERR_INTERNAL;
- }
- hr = IMediaSeeking_SetTimeFormat(seek, &format);
+ hr = IMediaSeeking_SetTimeFormat(wma->seek, &format);
if (FAILED(hr)) {
- IMediaSeeking_Release(seek);
FIXME("Cannot set time format (hr = %x)\n", hr);
lpParms->dwReturn = 0;
break;
}
- hr = IMediaSeeking_GetDuration(seek, &duration);
- IMediaSeeking_Release(seek);
+ hr = IMediaSeeking_GetDuration(wma->seek, &duration);
if (FAILED(hr) || duration < 0) {
FIXME("Cannot read duration (hr = %x)\n", hr);
lpParms->dwReturn = 0;
@@ -624,25 +612,14 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS
break;
}
case MCI_STATUS_POSITION: {
- IMediaPosition* pmpos;
- REFTIME curpos;
+ REFERENCE_TIME curpos;
- hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition, (LPVOID*)&pmpos);
- if (FAILED(hr)) {
- FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
- return MCIERR_INTERNAL;
- }
-
- hr = IMediaPosition_get_CurrentPosition(pmpos, &curpos);
+ hr = IMediaSeeking_GetCurrentPosition(wma->seek, &curpos);
if (FAILED(hr)) {
FIXME("Cannot get position (hr = %x)\n", hr);
- IMediaPosition_Release(pmpos);
return MCIERR_INTERNAL;
}
-
- IMediaPosition_Release(pmpos);
lpParms->dwReturn = curpos / 10000;
-
break;
}
case MCI_STATUS_NUMBER_OF_TRACKS:
@@ -680,8 +657,6 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS
static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
{
WINE_MCIQTZ* wma;
- IVideoWindow* pVideoWindow;
- IBasicVideo *pBasicVideo;
HRESULT hr;
HWND hWnd;
RECT rc;
@@ -696,34 +671,19 @@ static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lp
if (!wma)
return MCIERR_INVALID_DEVICE_ID;
- /* Find if there is a video stream and get the display window */
- hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IVideoWindow, (LPVOID*)&pVideoWindow);
- if (FAILED(hr)) {
- ERR("Cannot get IVideoWindow interface (hr = %x)\n", hr);
- return MCIERR_INTERNAL;
- }
-
- hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IBasicVideo, (LPVOID*)&pBasicVideo);
- if (FAILED(hr)) {
- ERR("Cannot get IBasicVideo interface (hr = %x)\n", hr);
- IUnknown_Release(pVideoWindow);
- return MCIERR_INTERNAL;
- }
-
- hr = IVideoWindow_get_Owner(pVideoWindow, (OAHWND*)&hWnd);
+ hr = IVideoWindow_get_Owner(wma->vidwin, (OAHWND*)&hWnd);
if (FAILED(hr)) {
TRACE("No video stream, returning no window error\n");
- IUnknown_Release(pVideoWindow);
return MCIERR_NO_WINDOW;
}
if (dwFlags & MCI_DGV_WHERE_SOURCE) {
if (dwFlags & MCI_DGV_WHERE_MAX)
FIXME("MCI_DGV_WHERE_SOURCE_MAX stub %s\n", wine_dbgstr_rect(&rc));
- IBasicVideo_get_SourceLeft(pBasicVideo, &rc.left);
- IBasicVideo_get_SourceTop(pBasicVideo, &rc.top);
- IBasicVideo_get_SourceWidth(pBasicVideo, &rc.right);
- IBasicVideo_get_SourceHeight(pBasicVideo, &rc.bottom);
+ IBasicVideo_get_SourceLeft(wma->vidbasic, &rc.left);
+ IBasicVideo_get_SourceTop(wma->vidbasic, &rc.top);
+ IBasicVideo_get_SourceWidth(wma->vidbasic, &rc.right);
+ IBasicVideo_get_SourceHeight(wma->vidbasic, &rc.bottom);
/* Undo conversion done below */
rc.right += rc.left;
rc.bottom += rc.top;
@@ -766,8 +726,6 @@ static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lp
out:
/* In MCI, RECT structure is used differently: rc.right = width & rc.bottom = height
* So convert the normal RECT into a MCI RECT before returning */
- IVideoWindow_Release(pVideoWindow);
- IBasicVideo_Release(pBasicVideo);
lpParms->rc.left = rc.left;
lpParms->rc.top = rc.top;
lpParms->rc.right = rc.right - rc.left;
@@ -794,51 +752,40 @@ static DWORD MCIQTZ_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS
return MCIERR_INVALID_DEVICE_ID;
if (dwFlags & MCI_DGV_UPDATE_HDC) {
- IBasicVideo *vidbasic;
- IVideoWindow *vidwin;
+ LONG state, size;
+ BYTE *data;
+ BITMAPINFO *info;
+ HRESULT hr;
+ RECT src, dest;
+
res = MCIERR_INTERNAL;
- IFilterGraph2_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&vidwin);
- IFilterGraph2_QueryInterface(wma->pgraph, &IID_IBasicVideo, (void**)&vidbasic);
- if (vidbasic && vidwin) {
- LONG state, size;
- BYTE *data;
- BITMAPINFO *info;
- HRESULT hr;
- RECT src, dest;
-
- /* If in stopped state, nothing has been drawn to screen
- * moving to pause, which is needed for the old dib renderer, will result
- * in a single frame drawn, so hide the window here */
- IVideoWindow_put_Visible(vidwin, OAFALSE);
- /* FIXME: Should we check the original state and restore it? */
- IMediaControl_Pause(wma->pmctrl);
- IMediaControl_GetState(wma->pmctrl, -1, &state);
- if (FAILED(hr = IBasicVideo_GetCurrentImage(vidbasic, &size, NULL))) {
- WARN("Could not get image size (hr = %x)\n", hr);
- goto out;
- }
- data = HeapAlloc(GetProcessHeap(), 0, size);
- info = (BITMAPINFO*)data;
- IBasicVideo_GetCurrentImage(vidbasic, &size, (LONG*)data);
- data += info->bmiHeader.biSize;
-
- IBasicVideo_GetSourcePosition(vidbasic, &src.left, &src.top, &src.right, &src.bottom);
- IBasicVideo_GetDestinationPosition(vidbasic, &dest.left, &dest.top, &dest.right, &dest.bottom);
- StretchDIBits(lpParms->hDC,
- dest.left, dest.top, dest.right + dest.left, dest.bottom + dest.top,
- src.left, src.top, src.right + src.left, src.bottom + src.top,
- data, info, DIB_RGB_COLORS, SRCCOPY);
- HeapFree(GetProcessHeap(), 0, data);
+ /* If in stopped state, nothing has been drawn to screen
+ * moving to pause, which is needed for the old dib renderer, will result
+ * in a single frame drawn, so hide the window here */
+ IVideoWindow_put_Visible(wma->vidwin, OAFALSE);
+ /* FIXME: Should we check the original state and restore it? */
+ IMediaControl_Pause(wma->pmctrl);
+ IMediaControl_GetState(wma->pmctrl, -1, &state);
+ if (FAILED(hr = IBasicVideo_GetCurrentImage(wma->vidbasic, &size, NULL))) {
+ WARN("Could not get image size (hr = %x)\n", hr);
+ goto out;
}
+ data = HeapAlloc(GetProcessHeap(), 0, size);
+ info = (BITMAPINFO*)data;
+ IBasicVideo_GetCurrentImage(wma->vidbasic, &size, (LONG*)data);
+ data += info->bmiHeader.biSize;
+
+ IBasicVideo_GetSourcePosition(wma->vidbasic, &src.left, &src.top, &src.right, &src.bottom);
+ IBasicVideo_GetDestinationPosition(wma->vidbasic, &dest.left, &dest.top, &dest.right, &dest.bottom);
+ StretchDIBits(lpParms->hDC,
+ dest.left, dest.top, dest.right + dest.left, dest.bottom + dest.top,
+ src.left, src.top, src.right + src.left, src.bottom + src.top,
+ data, info, DIB_RGB_COLORS, SRCCOPY);
+ HeapFree(GetProcessHeap(), 0, data);
res = 0;
out:
- if (vidbasic)
- IBasicVideo_Release(vidbasic);
- if (vidwin) {
- if (wma->parent)
- IVideoWindow_put_Visible(vidwin, OATRUE);
- IVideoWindow_Release(vidwin);
- }
+ if (wma->parent)
+ IVideoWindow_put_Visible(wma->vidwin, OATRUE);
}
else if (dwFlags)
FIXME("Unhandled flags %x\n", dwFlags);
diff --git a/dlls/mciqtz32/mciqtz_private.h b/dlls/mciqtz32/mciqtz_private.h
index 2fdef73..93834fb 100644
--- a/dlls/mciqtz32/mciqtz_private.h
+++ b/dlls/mciqtz32/mciqtz_private.h
@@ -31,6 +31,9 @@ typedef struct {
BOOL uninit;
IGraphBuilder* pgraph;
IMediaControl* pmctrl;
+ IMediaSeeking* seek;
+ IVideoWindow* vidwin;
+ IBasicVideo* vidbasic;
DWORD time_format;
UINT command_table;
HWND parent;
--
1.7.0.4
--------------080108050009020709000702--
More information about the wine-patches
mailing list