diff --git a/dlls/qcap/capturegraph.c b/dlls/qcap/capturegraph.c index f439f3bb012..b858762e5cc 100644 --- a/dlls/qcap/capturegraph.c +++ b/dlls/qcap/capturegraph.c @@ -28,6 +28,7 @@ #include "windef.h" #include "winbase.h" +#include "wingdi.h" #include "winerror.h" #include "objbase.h" diff --git a/dlls/qcap/dllsetup.c b/dlls/qcap/dllsetup.c index 850e6b0dd35..6aa14785294 100644 --- a/dlls/qcap/dllsetup.c +++ b/dlls/qcap/dllsetup.c @@ -28,6 +28,7 @@ #include "windef.h" #include "winbase.h" +#include "wingdi.h" #include "winerror.h" #include "winreg.h" #include "objbase.h" diff --git a/dlls/qcap/qcap_main.c b/dlls/qcap/qcap_main.c index 93ae555bba5..0d29f58aaf4 100644 --- a/dlls/qcap/qcap_main.c +++ b/dlls/qcap/qcap_main.c @@ -30,6 +30,7 @@ #include "windef.h" #include "winbase.h" +#include "wingdi.h" #include "winerror.h" #include "objbase.h" #include "uuids.h" diff --git a/dlls/qcap/yuv.c b/dlls/qcap/yuv.c index 29aa1f2c110..358a711ef07 100644 --- a/dlls/qcap/yuv.c +++ b/dlls/qcap/yuv.c @@ -24,6 +24,7 @@ #include #include "windef.h" +#include "wingdi.h" #include "objbase.h" #include "strmif.h" #include "qcap_main.h" diff --git a/dlls/quartz/regsvr.c b/dlls/quartz/regsvr.c index e779e011512..79000bf3db7 100644 --- a/dlls/quartz/regsvr.c +++ b/dlls/quartz/regsvr.c @@ -26,6 +26,7 @@ #include "windef.h" #include "winbase.h" +#include "wingdi.h" #include "winuser.h" #include "winreg.h" #include "winerror.h" diff --git a/include/Makefile.in b/include/Makefile.in index f2b4af9ba2c..3b6370a7bd8 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -399,6 +399,7 @@ SRCDIR_INCLUDES = \ ver.h \ vfw.h \ vfwmsgs.h \ + vmrender.idl \ wfext.h \ winbase.h \ wincon.h \ diff --git a/include/strmif.idl b/include/strmif.idl index 6ca3c175f51..a1cad6ba00e 100644 --- a/include/strmif.idl +++ b/include/strmif.idl @@ -25,3 +25,6 @@ import "objidl.idl"; #include #include + +/* TODO: #include */ +#include diff --git a/include/vmrender.idl b/include/vmrender.idl new file mode 100644 index 00000000000..edf9e1e431d --- /dev/null +++ b/include/vmrender.idl @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2008 Maarten Lankhorst + * + * 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 + */ + +cpp_quote("#if 0") +typedef DWORD IDirectDrawSurface7; +typedef DWORD IDirectDraw7; +typedef DWORD *LPBITMAPINFOHEADER; +typedef DWORD *LPDDPIXELFORMAT; +typedef struct { DWORD dw1, dw2; } DDCOLORKEY; +cpp_quote("#endif") +cpp_quote("#include ") + +interface IVMRSurface; +interface IVMRSurfaceAllocator; +interface IVMRSurfaceAllocatorNotify; +interface IVMRImagePresenter; +interface IVMRImagePresenterNotify; +interface IVMRWindowlessControl; +interface IVMRMixerControl; +interface IVMRMixerBitmap; +interface IVMRFilterConfig; +interface IVMRAspectRatioControl; +interface IVMRDeinterlaceControl; +interface IVMRMonitorConfig; +interface IVMRImageCompositor; +interface IVMRVideoStreamControl; + +typedef enum _VMRPresentationFlags +{ + VMRSample_SyncPoint = 0x01, + VMRSample_Preroll = 0x02, + VMRSample_Discontinuity = 0x04, + VMRSample_TimeValid = 0x08, + VMRSample_SrcDstRectsValid = 0x10 +} VMRPresentationFlags; + +typedef struct tagVMRPRESENTATIONINFO +{ + DWORD dwFlags; + IDirectDrawSurface7 *lpSurf; + REFERENCE_TIME rtStart, rtEnd; + SIZE szAspectRatio; + RECT rcSrc, rcDst; + DWORD dwTypeSpecificFlags; + DWORD dwInterlaceFlags; +} VMRPRESENTATIONINFO; + +[ + local, + object, + uuid(ce704fe7-e71e-41fb-baa2-c4403e1182f5), + helpstring("IVMRImagePresenter interface"), + pointer_default(unique) +] +interface IVMRImagePresenter : IUnknown +{ + HRESULT StartPresenting([in] DWORD_PTR id); + HRESULT StopPresenting([in] DWORD_PTR id); + HRESULT PresentImage([in] DWORD_PTR id, [in] VMRPRESENTATIONINFO *info); +}; + +typedef enum _VMRSurfaceAllocationFlags +{ + AMAP_PIXELFORMAT_VALID = 0x01, + AMAP_3D_TARGET = 0x02, + AMAP_ALLOW_SYSMEM = 0x04, + AMAP_FORCE_SYSMEM = 0x08, + AMAP_DIRECTED_FLIP = 0x10, + AMAP_DXVA_TARGET = 0x20 +} VMRSurfaceAllocationFlags; + +typedef struct tagVMRALLOCATIONINFO +{ + DWORD dwFlags; + LPBITMAPINFOHEADER lpHdr; + LPDDPIXELFORMAT lpPixFmt; + SIZE szAspectRatio; + DWORD dwMinBuffers; + DWORD dwMaxBuffers; + DWORD dwInterlaceFlags; + SIZE szNativeSize; +} VMRALLOCATIONINFO; + +[ + local, + object, + uuid(31ce832e-4484-458b-8cca-f4d7e3db0b52), + helpstring("IVMRSurfaceAllocator interface"), + pointer_default(unique) +] +interface IVMRSurfaceAllocator : IUnknown +{ + HRESULT AllocateSurface([in] DWORD_PTR id, [in] VMRALLOCATIONINFO *allocinfo, [in, out] DWORD *buffers, IDirectDrawSurface7 **surface); + HRESULT FreeSurface([in] DWORD_PTR id); + HRESULT PrepareSurface([in] DWORD_PTR id, [in] IDirectDrawSurface7 *surface, [in] DWORD dwSurfaceFlags); + HRESULT AdviseNotify([in] IVMRSurfaceAllocatorNotify *notify); +}; + +[ + local, + object, + uuid(aada05a8-5a4e-4729-af0b-cea27aed51e2), + helpstring("IVMRSurfaceAllocatorNotify interface"), + pointer_default(unique) +] +interface IVMRSurfaceAllocatorNotify : IUnknown +{ + HRESULT AdviseSurfaceAllocator([in] DWORD_PTR id, [in] IVMRSurfaceAllocator *allocator); + HRESULT SetDDrawDevice([in] IDirectDraw7 *device, [in] HMONITOR monitor); + HRESULT ChangeDDrawDevice([in] IDirectDraw7 *device, [in] HMONITOR monitor); + HRESULT RestoreDDrawSurfaces(); + HRESULT NotifyEvent([in] LONG EventCode, [in] LONG_PTR p1, [in] LONG_PTR p2); + HRESULT SetBorderColor([in] COLORREF border); +}; + +typedef enum _VMR_ASPECT_RATIO_MODE +{ + VMR_ARMODE_NONE, + VMR_ARMODE_LETTER_BOX +} VMR_ASPECT_RATIO_MODE; + +[ + local, + object, + uuid(0eb1088c-4dcd-46f0-878f-39dae86a51b7), + helpstring("IVMRWindowlessControl interface"), + pointer_default(unique) +] +interface IVMRWindowlessControl : IUnknown +{ + HRESULT GetNativeVideoSize([out] LONG *width, [out] LONG *height, [out] LONG *ar_width, [out] LONG *ar_height); + HRESULT GetMinIdealVideoSize([out] LONG *width, [out] LONG *height); + HRESULT GetMaxIdealVideoSize([out] LONG *width, [out] LONG *height); + HRESULT SetVideoPosition([in] const RECT *src_rect, [in] const RECT *dst_rect); + HRESULT GetVideoPosition([out] RECT *src_rect, [out] RECT *dst_rect); + HRESULT GetAspectRatioMode([out] DWORD *mode); + HRESULT SetAspectRatioMode([in] DWORD mode); + HRESULT SetVideoClippingWindow([in] HWND hwnd); + HRESULT RepaintVideo([in] HWND hwnd, [in] HDC hdc); + HRESULT DisplayModeChanged(); + HRESULT GetCurrentImage([out] BYTE **data); + HRESULT SetBorderColor([in] COLORREF border); + HRESULT GetBorderColor([out] COLORREF *border); + HRESULT SetColorKey([in] COLORREF key); + HRESULT GetColorKey([out] COLORREF *key); +}; + +typedef enum _VMRMixerPrefs +{ + MixerPref_NoDecimation = 0x0001, + MixerPref_DecimateOutput = 0x0002, + MixerPref_ARAdjustXorY = 0x0004, + MixerPref_DecimationReserved = 0x0008, + MixerPref_DecimateMask = 0x000f, + + MixerPref_BiLinearFiltering = 0x0010, + MixerPref_PointFiltering = 0x0020, + MixerPref_FinteringMask = 0x00f0, + + MixerPref_RenderTargetRGB = 0x0100, + MixerPref_RenderTargetYUV = 0x1000, + MixerPref_RenderTargetYUV420 = 0x0200, + MixerPref_RenderTargetYUV422 = 0x0400, + MixerPref_RenderTargetYUV444 = 0x0800, + MixerPref_RenderTargetReserved = 0xe000, + MixerPref_RenderTargetMask = 0xff00, + + MixerPref_DynamicSwitchToBOB = 0x10000, + MixerPref_DynamicDecimateBy2 = 0x20000, + MixerPref_DynamicReserved = 0xc0000, + MixerPref_DynamicMask = 0xf0000 +} VMRMixerPrefs; + +typedef struct _NORMALIZEDRECT +{ + FLOAT left, top, right, bottom; +} NORMALIZEDRECT; + +[ + local, + object, + uuid(1c1a17b0-bed0-415d-974b-dc6696131599), + helpstring("IVMRMixerControl interface"), + pointer_default(unique) +] +interface IVMRMixerControl : IUnknown +{ + HRESULT SetAlpha([in] DWORD id, [in] FLOAT alpha); + HRESULT GetAlpha([in] DWORD id, [out] FLOAT *alpha); + HRESULT SetZOrder([in] DWORD id, [in] DWORD z); + HRESULT GetZOrder([in] DWORD id, [out] DWORD *z); + HRESULT SetOutputRect([in] DWORD id, [in] const NORMALIZEDRECT *rect); + HRESULT SetBackgroundClr([in] COLORREF background); + HRESULT GetBackgroundClr([out] COLORREF *background); + HRESULT SetMixingPrefs([in] DWORD prefs); + HRESULT GetMixingPrefs([out] DWORD *prefs); +}; + +typedef struct tagVMRGUID +{ + GUID *pGUID, GUID; +} VMRGUID; + +#define VMRDEVICENAMELEN 32 +#define VMRDEVICEDESCRIPTIONLEN 256 + +typedef struct tagVMRMONITORINFO +{ + VMRGUID guid; + RECT rcMonitor; + HMONITOR hMon; + DWORD dwFlags; + WCHAR szDevice[VMRDEVICENAMELEN]; + WCHAR szDescription[VMRDEVICEDESCRIPTIONLEN]; + LARGE_INTEGER liDriverVersion; + DWORD dwVendorId; + DWORD dwDeviceId; + DWORD dwSubSysId; + DWORD dwRevision; +} VMRMONITORINFO; + +[ + local, + object, + uuid(9cf0b1b6-fbaa-4b7f-88cf-cf1f130a0dce), + helpstring("IVMRMonitorConfig interface"), + pointer_default(unique) +] +interface IVMRMonitorConfig : IUnknown +{ + HRESULT SetMonitor([in] const VMRGUID *vmrguid); + HRESULT GetMonitor([out] VMRGUID *vmrguid); + HRESULT SetDefaultMonitor([in] const VMRGUID *vmrguid); + HRESULT GetDefaultMonitor([out] VMRGUID *vmrguid); + HRESULT GetAvailableMonitors([out, size_is(array_size)] VMRMONITORINFO *info, [in] DWORD array_size, [out] DWORD *retrieved); +} + +typedef enum _VMRRenderPrefs +{ + RenderPrefs_RestrictToInitialMonitor = 0x00, + RenderPrefs_ForceOffScreen = 0x01, + RenderPrefs_ForceOverlays = 0x02, + RenderPrefs_AllowOverlays = 0x00, + RenderPrefs_AllowOffscreen = 0x00, + RenderPrefs_DoNotRenderColorKeyAndBorder = 0x08, + RenderPrefs_Reserved = 0x10, + RenderPrefs_PreferAGPMemWhenMixing = 0x20, + RenderPrefs_Mask = 0x3f +} VMRRenderPrefs; + +typedef enum _VMRMode +{ + VMRMode_Windowed = 0x1, + VMRMode_Windowless = 0x2, + VMRMode_Renderless = 0x4, + VMRMODE_Mask = 0x7 +} VMRMode; + +enum { MAX_NUMBER_OF_STREAMS = 16 }; + +[ + local, + object, + uuid(9e5530c5-7034-48b4-bb46-0b8a6efc8e36), + helpstring("IVMRFilterConfig interface"), + pointer_default(unique) +] +interface IVMRFilterConfig : IUnknown +{ + HRESULT SetImageCompositor([in] IVMRImageCompositor *compositor); + HRESULT SetNumberOfStreams([in] DWORD streams); + HRESULT GetNumberOfStreams([out] DWORD *streams); + HRESULT SetRenderingPrefs([in] DWORD prefs); + HRESULT GetRenderingPrefs([out] DWORD *prefs); + HRESULT SetRenderingMode([in] DWORD mode); + HRESULT GetRenderingMode([out] DWORD *mode); +}; + +[ + local, + object, + uuid(ede80b5c-bad6-4623-b537-65586c9f8dfd), + helpstring("IVMRAspectRatioControl interface"), + pointer_default(unique) +] +interface IVMRAspectRatioControl : IUnknown +{ + HRESULT GetAspectRatioMode([out] DWORD *armode); + HRESULT SetAspectRatioMode([in] DWORD armode); +}; + +typedef enum _VMRDeinterlacePrefs +{ + DeinterlacePref_NextBest = 0x1, + DeinterlacePref_BOB = 0x2, + DeinterlacePref_Weave = 0x4, + DeinterlacePref_Mask = 0x7 +} VMRDeinterlacePrefs; + +typedef enum _VMRDeinterlaceTech +{ + DeinterlaceTech_Unknown = 0x00, + DeinterlaceTech_BOBLineReplicate = 0x01, + DeinterlaceTech_BOBVerticalStretch = 0x02, + DeinterlaceTech_MedianFiltering = 0x04, + DeinterlaceTech_EdgeFiltering = 0x08, + DeinterlaceTech_FieldAdaptive = 0x10, + DeinterlaceTech_PixelAdaptive = 0x20, + DeinterlaceTech_MotionVectorSteered = 0x80 +} VMRDeinterlaceTech; + +typedef struct _VMRFrequency +{ + DWORD dwNumerator, dwDenominator; +} VMRFrequency; + +typedef struct _VMRVideoDesc +{ + DWORD dwSize; + DWORD dwSampleWidth; + DWORD dwSampleHeight; + BOOL SingleFieldPerSample; + DWORD dwFourCC; + VMRFrequency InputSampleFreq; + VMRFrequency OutputFrameFreq; +} VMRVideoDesc; + +typedef struct _VMRDeinterlaceCaps +{ + DWORD dwSize; + DWORD dwNumPreviousOutputFrames; + DWORD dwNumForwardRefSamples; + DWORD dwNumBackwardRefSamples; + VMRDeinterlaceTech DeinterlaceTechnology; +} VMRDeinterlaceCaps; + +[ + local, + object, + uuid(bb057577-0db8-4e6a-87a7-1a8c9a505a0f), + helpstring("IVMRDeinterlaceControl interface"), + pointer_default(unique) +] +interface IVMRDeinterlaceControl : IUnknown +{ + HRESULT GetNumberOfDeinterlaceModes([in] VMRVideoDesc *desc, [in, out] DWORD *num_modes, [out] GUID *modes); + HRESULT GetDeinterlaceModeCaps([in] GUID *mode, [in] VMRVideoDesc *desc, [in, out] VMRDeinterlaceCaps *caps); + HRESULT GetDeinterlaceMode([in] DWORD id, [out] GUID *mode); + HRESULT SetDeinterlaceMode([in] DWORD id, [in] GUID *mode); + HRESULT GetDeinterlacePrefs([out] DWORD *prefs); + HRESULT SetDeinterlacePrefs([in] DWORD prefs); + HRESULT GetActualDeinterlaceMode([in] DWORD id, [out] GUID *mode); +}; + +typedef struct _VMRALPHABITMAP +{ + DWORD dwFlags; + HDC hdc; + IDirectDrawSurface7 *pDDS; + RECT rSrc; + RECT rDest; + FLOAT fAlpha; + COLORREF clrSrcKey; +} VMRALPHABITMAP, *PVMRALPHABITMAP; + +cpp_quote("#define VMRBITMAP_DISABLE (0x01)") +cpp_quote("#define VMRBITMAP_HDC (0x02)") +cpp_quote("#define VMRBITMAP_ENTIREDDS (0x04)") +cpp_quote("#define VMRBITMAP_SRCCOLORKEY (0x08)") +cpp_quote("#define VMRBITMAP_SRCRECT (0x10)") + +[ + local, + object, + uuid(1e673275-0257-40aa-af20-7c608d4a0428), + helpstring("IVMRMixerBitmap interface"), + pointer_default(unique) +] +interface IVMRMixerBitmap : IUnknown +{ + HRESULT SetAlphaBitmap([in] const VMRALPHABITMAP *params); + HRESULT UpdateAlphaBitmapParameters([in] VMRALPHABITMAP *params); + HRESULT GetAlphaBitmapParameters([out] VMRALPHABITMAP *params); +}; + +typedef struct _VMRVIDEOSTREAMINFO +{ + IDirectDrawSurface7 *pddsVideoSurface; + DWORD dwWidth; + DWORD dwHeight; + DWORD dwStrmID; + FLOAT fAlpha; + DDCOLORKEY ddClrKey; + NORMALIZEDRECT rNormal; +} VMRVIDEOSTREAMINFO; + +[ + local, + object, + uuid(7a4fb5af-479f-4074-bb40-ce6722e43c82), + helpstring("IVMRImageCompositor interface"), + pointer_default(unique) +] +interface IVMRImageCompositor : IUnknown +{ + HRESULT InitCompositionTarget([in] IUnknown *d3ddev, [in] IDirectDrawSurface7 *rendertarget); + HRESULT TermCompositionTarget([in] IUnknown *d3ddev, [in] IDirectDrawSurface7 *rendertarget); + HRESULT SetStreamMediaType([in] DWORD id, [in] AM_MEDIA_TYPE *pmt, [in] BOOL texture); + HRESULT CompositeImage([in] IUnknown *d3ddev, [in] IDirectDrawSurface7 *rendertarget, + [in] AM_MEDIA_TYPE *pmt, [in] REFERENCE_TIME start, [in] REFERENCE_TIME stop, + [in] DWORD backgrnd, [in] VMRVIDEOSTREAMINFO *info, [in] UINT streams); +}; + +[ + local, + object, + uuid(058d1f11-2a54-4bef-bd54-df706626b727), + helpstring("IVMRVideoStreamControl interface"), + pointer_default(unique) +] +interface IVMRVideoStreamControl : IUnknown +{ + HRESULT SetColorKey([in] DDCOLORKEY *key); + HRESULT GetColorKey([out] DDCOLORKEY *key); + HRESULT SetStreamActiveState([in] BOOL active); + HRESULT GetStreamActiveState([out] BOOL *active); +}; + +[ + local, + object, + uuid(9f3a1c85-8555-49ba-935f-be5b5b29d178), + helpstring("IVMRImagePresenterConfig interface"), + pointer_default(unique) +] +interface IVMRImagePresenterConfig : IUnknown +{ + HRESULT SetRenderingPrefs([in] DWORD prefs); + HRESULT GetRenderingPrefs([out] DWORD *prefs); +}; + +[ + local, + object, + uuid(e6f7ce40-4673-44f1-8f77-5499d68cb4ea), + helpstring("IVMRImagePresenterExclModeConfig interface"), + pointer_default(unique) +] +interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig +{ + HRESULT SetXlcModeDDObjAndPrimarySurface([in] IDirectDraw7 *dddev, [in] IDirectDrawSurface7 *ddsurface); + HRESULT GetXlcModeDDObjAndPrimarySurface([out] IDirectDraw7 **dddev, [out] IDirectDrawSurface7 **ddsurface); +}; + +[ + local, + object, + uuid(aac18c18-e186-46d2-825d-a1f8dc8e395a), + helpstring("IVPManager interface"), + pointer_default(unique) +] +interface IVPManager : IUnknown +{ + HRESULT SetVideoPortIndex([in] DWORD index); + HRESULT GetVideoPortIndex([out] DWORD *index); +}; diff --git a/tools/make_makefiles b/tools/make_makefiles index 64c4fbb2913..d87b3ce205a 100755 --- a/tools/make_makefiles +++ b/tools/make_makefiles @@ -137,7 +137,8 @@ my %private_idl_headers = ( "dbprop.idl" => 1, "dbs.idl" => 1, "devenum.idl" => 1, - "dyngraph.idl" => 1 + "dyngraph.idl" => 1, + "vmrender.idl" => 1, ); my (@makefiles, %makefiles);