1058 lines
31 KiB
Plaintext
1058 lines
31 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Public Interfaces for the DX9 Video Mixing Renderer DShow filter
|
|
//
|
|
// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
import "unknwn.idl";
|
|
|
|
|
|
cpp_quote("#if 0")
|
|
// This is temporary work around to persuade
|
|
// MIDL to allow forward declarations.
|
|
typedef DWORD IDirect3DDevice9;
|
|
typedef DWORD IDirect3DSurface9;
|
|
typedef DWORD D3DFORMAT;
|
|
typedef DWORD D3DCOLOR;
|
|
typedef DWORD D3DPOOL;
|
|
typedef LONGLONG REFERENCE_TIME;
|
|
typedef DWORD* HMONITOR;
|
|
typedef struct {DWORD dw1; DWORD dw2;} AM_MEDIA_TYPE;
|
|
cpp_quote ("#endif")
|
|
|
|
|
|
// public interfaces supported by the VMR9
|
|
|
|
interface IVMRSurface9;
|
|
|
|
interface IVMRSurfaceAllocator9;
|
|
interface IVMRSurfaceAllocatorNotify9;
|
|
interface IVMRImagePresenter9;
|
|
interface IVMRImagePresenterConfig9;
|
|
interface IVMRMonitorConfig9;
|
|
interface IVMRWindowlessControl9;
|
|
|
|
interface IVMRMixerControl9;
|
|
interface IVMRImageCompositor9;
|
|
interface IVMRMixerBitmap9;
|
|
|
|
|
|
interface IVMRFilterConfig9;
|
|
interface IVMRAspectRatioControl9;
|
|
interface IVMRVideoStreamControl9;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Allocator Presenter interfaces
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRImagePresenter9
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
VMR9Sample_SyncPoint = 0x00000001,
|
|
VMR9Sample_Preroll = 0x00000002,
|
|
VMR9Sample_Discontinuity = 0x00000004,
|
|
VMR9Sample_TimeValid = 0x00000008,
|
|
VMR9Sample_SrcDstRectsValid= 0x00000010
|
|
} VMR9PresentationFlags;
|
|
|
|
|
|
typedef struct _VMR9PresentationInfo {
|
|
DWORD dwFlags;
|
|
IDirect3DSurface9* lpSurf;
|
|
REFERENCE_TIME rtStart;
|
|
REFERENCE_TIME rtEnd;
|
|
SIZE szAspectRatio;
|
|
RECT rcSrc;
|
|
RECT rcDst;
|
|
DWORD dwReserved1;
|
|
DWORD dwReserved2;
|
|
} VMR9PresentationInfo;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(69188c61-12a3-40f0-8ffc-342e7b433fd7),
|
|
helpstring("IVMRImagePresenter9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRImagePresenter9 : IUnknown
|
|
{
|
|
HRESULT StartPresenting(
|
|
[in] DWORD_PTR dwUserID
|
|
);
|
|
|
|
HRESULT StopPresenting(
|
|
[in] DWORD_PTR dwUserID
|
|
);
|
|
|
|
HRESULT PresentImage(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] VMR9PresentationInfo* lpPresInfo
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurfaceAllocator
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
// surface types/usage
|
|
VMR9AllocFlag_3DRenderTarget = 0x0001,
|
|
VMR9AllocFlag_DXVATarget = 0x0002,
|
|
|
|
//
|
|
// VMR9AllocFlag_TextureSurface can be combined with
|
|
// DXVATarget and 3DRenderTarget
|
|
//
|
|
VMR9AllocFlag_TextureSurface = 0x0004,
|
|
VMR9AllocFlag_OffscreenSurface = 0x0008,
|
|
VMR9AllocFlag_UsageReserved = 0x00F0,
|
|
VMR9AllocFlag_UsageMask = 0x00FF
|
|
|
|
// surface
|
|
} VMR9SurfaceAllocationFlags;
|
|
|
|
|
|
typedef struct _VMR9AllocationInfo {
|
|
DWORD dwFlags; // see VMR9SurfaceAllocationFlags
|
|
DWORD dwWidth;
|
|
DWORD dwHeight;
|
|
D3DFORMAT Format; // 0 means use a format compatible with the display
|
|
D3DPOOL Pool;
|
|
DWORD MinBuffers;
|
|
SIZE szAspectRatio;
|
|
SIZE szNativeSize;
|
|
} VMR9AllocationInfo;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(8d5148ea-3f5d-46cf-9df1-d1b896eedb1f),
|
|
helpstring("IVMRSurfaceAllocator9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurfaceAllocator9 : IUnknown
|
|
{
|
|
HRESULT InitializeDevice(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] VMR9AllocationInfo* lpAllocInfo,
|
|
[in, out] DWORD* lpNumBuffers
|
|
);
|
|
|
|
HRESULT TerminateDevice(
|
|
[in] DWORD_PTR dwID
|
|
);
|
|
|
|
HRESULT GetSurface(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] DWORD SurfaceIndex,
|
|
[in] DWORD SurfaceFlags,
|
|
[out] IDirect3DSurface9** lplpSurface
|
|
);
|
|
|
|
HRESULT AdviseNotify(
|
|
[in] IVMRSurfaceAllocatorNotify9* lpIVMRSurfAllocNotify
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurfaceAllocatorNotify9
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(dca3f5df-bb3a-4d03-bd81-84614bfbfa0c),
|
|
helpstring("IVMRSurfaceAllocatorNotify9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurfaceAllocatorNotify9 : IUnknown
|
|
{
|
|
HRESULT AdviseSurfaceAllocator(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] IVMRSurfaceAllocator9* lpIVRMSurfaceAllocator
|
|
);
|
|
|
|
HRESULT SetD3DDevice(
|
|
[in] IDirect3DDevice9* lpD3DDevice,
|
|
[in] HMONITOR hMonitor
|
|
);
|
|
|
|
HRESULT ChangeD3DDevice(
|
|
[in] IDirect3DDevice9* lpD3DDevice,
|
|
[in] HMONITOR hMonitor
|
|
);
|
|
|
|
HRESULT AllocateSurfaceHelper(
|
|
[in] VMR9AllocationInfo* lpAllocInfo,
|
|
[in, out] DWORD* lpNumBuffers,
|
|
[out] IDirect3DSurface9** lplpSurface
|
|
);
|
|
|
|
HRESULT NotifyEvent(
|
|
[in] LONG EventCode,
|
|
[in] LONG_PTR Param1,
|
|
[in] LONG_PTR Param2
|
|
);
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Application control and configuration interfaces
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRWindowlessControl9
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
VMR9ARMode_None,
|
|
VMR9ARMode_LetterBox
|
|
} VMR9AspectRatioMode;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(8f537d09-f85e-4414-b23b-502e54c79927),
|
|
helpstring("IVMRWindowlessControl Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRWindowlessControl9 : IUnknown
|
|
{
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
// Video size and position information
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
HRESULT GetNativeVideoSize(
|
|
[out] LONG* lpWidth,
|
|
[out] LONG* lpHeight,
|
|
[out] LONG* lpARWidth,
|
|
[out] LONG* lpARHeight
|
|
);
|
|
|
|
HRESULT GetMinIdealVideoSize(
|
|
[out] LONG* lpWidth,
|
|
[out] LONG* lpHeight
|
|
);
|
|
|
|
HRESULT GetMaxIdealVideoSize(
|
|
[out] LONG* lpWidth,
|
|
[out] LONG* lpHeight
|
|
);
|
|
|
|
HRESULT SetVideoPosition(
|
|
[in] const LPRECT lpSRCRect,
|
|
[in] const LPRECT lpDSTRect
|
|
);
|
|
|
|
HRESULT GetVideoPosition(
|
|
[out] LPRECT lpSRCRect,
|
|
[out] LPRECT lpDSTRect
|
|
);
|
|
|
|
HRESULT GetAspectRatioMode(
|
|
[out] DWORD* lpAspectRatioMode
|
|
);
|
|
|
|
HRESULT SetAspectRatioMode(
|
|
[in] DWORD AspectRatioMode
|
|
);
|
|
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
// Display and clipping management
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
HRESULT SetVideoClippingWindow(
|
|
[in] HWND hwnd
|
|
);
|
|
|
|
HRESULT RepaintVideo(
|
|
[in] HWND hwnd,
|
|
[in] HDC hdc
|
|
);
|
|
|
|
HRESULT DisplayModeChanged();
|
|
|
|
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
// GetCurrentImage
|
|
//
|
|
// Returns the current image being displayed. This images
|
|
// is returned in the form of packed Windows DIB.
|
|
//
|
|
// GetCurrentImage can be called at any time, also
|
|
// the caller is responsible for free the returned memory
|
|
// by calling CoTaskMemFree.
|
|
//
|
|
// Excessive use of this function will degrade video
|
|
// playback performed.
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
HRESULT GetCurrentImage(
|
|
[out] BYTE** lpDib
|
|
);
|
|
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
// Border Color control
|
|
//
|
|
// The border color is color used to fill any area of the
|
|
// the destination rectangle that does not contain video.
|
|
// It is typically used in two instances. When the video
|
|
// straddles two monitors and when the VMR is trying
|
|
// to maintain the aspect ratio of the movies by letter
|
|
// boxing the video to fit within the specified destination
|
|
// rectangle. See SetAspectRatioMode above.
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
HRESULT SetBorderColor(
|
|
[in] COLORREF Clr
|
|
);
|
|
|
|
HRESULT GetBorderColor(
|
|
[out] COLORREF* lpClr
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRMixerControl9
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef enum {
|
|
MixerPref9_NoDecimation = 0x00000001, // No decimation - full size
|
|
MixerPref9_DecimateOutput = 0x00000002, // decimate output by 2 in x & y
|
|
MixerPref9_ARAdjustXorY = 0x00000004, // adjust the aspect ratio in x or y
|
|
MixerPref9_NonSquareMixing = 0x00000008, // assume AP can handle non-square mixing, avoids intermediate scales
|
|
MixerPref9_DecimateMask = 0x0000000F,
|
|
|
|
MixerPref9_BiLinearFiltering = 0x00000010, // use bi-linear filtering
|
|
MixerPref9_PointFiltering = 0x00000020, // use point filtering
|
|
MixerPref9_AnisotropicFiltering = 0x00000040, //
|
|
MixerPref9_PyramidalQuadFiltering = 0x00000080, // 4-sample tent
|
|
MixerPref9_GaussianQuadFiltering = 0x00000100, // 4-sample gaussian
|
|
MixerPref9_FilteringReserved = 0x00000E00, // bits reserved for future use.
|
|
MixerPref9_FilteringMask = 0x00000FF0, // OR of all above flags
|
|
|
|
MixerPref9_RenderTargetRGB = 0x00001000,
|
|
MixerPref9_RenderTargetYUV = 0x00002000, // Uses DXVA to perform mixing
|
|
MixerPref9_RenderTargetReserved = 0x000FC000, // bits reserved for future use.
|
|
MixerPref9_RenderTargetMask = 0x000FF000, // OR of all above flags
|
|
|
|
//
|
|
// Dynamic changes that can be performed when the VMR's mixer is
|
|
// configured to use the YUV Render target (see MixerPref_RenderTargetYUV)
|
|
// These preferences can be applied while the graph is running and take effect
|
|
// when the next frame is composed by the mixer.
|
|
//
|
|
MixerPref9_DynamicSwitchToBOB = 0x00100000,
|
|
MixerPref9_DynamicDecimateBy2 = 0x00200000,
|
|
|
|
MixerPref9_DynamicReserved = 0x00C00000,
|
|
MixerPref9_DynamicMask = 0x00F00000
|
|
|
|
} VMR9MixerPrefs;
|
|
|
|
|
|
//
|
|
// Normalized relative rectangle
|
|
// Coordinate ranges: x=[0...1) y=[0...1)
|
|
// Where the output window goes from 0,0 (closed inclusive lower bound)
|
|
// to 1,1 (open exclusive upper bound)
|
|
//
|
|
typedef struct _VMR9NormalizedRect
|
|
{
|
|
float left;
|
|
float top;
|
|
float right;
|
|
float bottom;
|
|
} VMR9NormalizedRect;
|
|
|
|
|
|
|
|
typedef enum {
|
|
ProcAmpControl9_Brightness = 0x00000001,
|
|
ProcAmpControl9_Contrast = 0x00000002,
|
|
ProcAmpControl9_Hue = 0x00000004,
|
|
ProcAmpControl9_Saturation = 0x00000008,
|
|
ProcAmpControl9_Mask = 0x0000000F
|
|
} VMR9ProcAmpControlFlags;
|
|
|
|
typedef struct _VMR9ProcAmpControl
|
|
{
|
|
DWORD dwSize;
|
|
DWORD dwFlags;
|
|
float Brightness;
|
|
float Contrast;
|
|
float Hue;
|
|
float Saturation;
|
|
} VMR9ProcAmpControl;
|
|
|
|
typedef struct _VMR9ProcAmpControlRange
|
|
{
|
|
DWORD dwSize;
|
|
VMR9ProcAmpControlFlags dwProperty; // see VMR9ProcAmpControlFlags above
|
|
float MinValue;
|
|
float MaxValue;
|
|
float DefaultValue;
|
|
float StepSize;
|
|
} VMR9ProcAmpControlRange;
|
|
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(1a777eaa-47c8-4930-b2c9-8fee1c1b0f3b),
|
|
helpstring("IVMRMixerControl9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMixerControl9 : IUnknown
|
|
{
|
|
HRESULT SetAlpha(
|
|
[in] DWORD dwStreamID,
|
|
[in] float Alpha // Source alpha premultication factor (global alpha for source)
|
|
);
|
|
|
|
HRESULT GetAlpha(
|
|
[in] DWORD dwStreamID,
|
|
[out] float* pAlpha
|
|
);
|
|
|
|
HRESULT SetZOrder(
|
|
[in] DWORD dwStreamID,
|
|
[in] DWORD dwZ
|
|
);
|
|
|
|
HRESULT GetZOrder(
|
|
[in] DWORD dwStreamID,
|
|
[out] DWORD* pZ
|
|
);
|
|
|
|
HRESULT SetOutputRect(
|
|
[in] DWORD dwStreamID,
|
|
[in] const VMR9NormalizedRect *pRect
|
|
);
|
|
|
|
HRESULT GetOutputRect(
|
|
[in] DWORD dwStreamID,
|
|
[out] VMR9NormalizedRect *pRect
|
|
);
|
|
|
|
HRESULT SetBackgroundClr(
|
|
[in] COLORREF ClrBkg
|
|
);
|
|
|
|
HRESULT GetBackgroundClr(
|
|
[in] COLORREF* lpClrBkg
|
|
);
|
|
|
|
HRESULT SetMixingPrefs(
|
|
[in] DWORD dwMixerPrefs // a combination of VMRMixingPrefFlags
|
|
);
|
|
|
|
HRESULT GetMixingPrefs(
|
|
[out] DWORD* pdwMixerPrefs
|
|
);
|
|
|
|
HRESULT SetProcAmpControl(
|
|
[in] DWORD dwStreamID,
|
|
[in] VMR9ProcAmpControl* lpClrControl
|
|
);
|
|
|
|
HRESULT GetProcAmpControl(
|
|
[in] DWORD dwStreamID,
|
|
[in, out] VMR9ProcAmpControl* lpClrControl
|
|
);
|
|
|
|
HRESULT GetProcAmpControlRange(
|
|
[in] DWORD dwStreamID,
|
|
[in, out] VMR9ProcAmpControlRange* lpClrControl
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRMixerBitmap9
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef struct _VMR9AlphaBitmap
|
|
{
|
|
DWORD dwFlags; // flags word
|
|
HDC hdc; // DC for the bitmap to copy
|
|
IDirect3DSurface9* pDDS; // D3D surface to copy
|
|
RECT rSrc; // rectangle to copy from the DC/DDS
|
|
VMR9NormalizedRect rDest; // output rectangle in composition space
|
|
FLOAT fAlpha; // opacity of the bitmap
|
|
COLORREF clrSrcKey; // src color key
|
|
DWORD dwFilterMode; // See "SetMixerPrefs"
|
|
} VMR9AlphaBitmap;
|
|
|
|
|
|
typedef enum {
|
|
|
|
// Disable the alpha bitmap for now
|
|
VMR9AlphaBitmap_Disable = 0x00000001,
|
|
|
|
// Take the bitmap from the HDC rather than the DirectDraw surface
|
|
VMR9AlphaBitmap_hDC = 0x00000002,
|
|
|
|
// Take the entire DDraw surface - rSrc is ignored
|
|
VMR9AlphaBitmap_EntireDDS = 0x00000004,
|
|
|
|
// Indicates that the clrTrans value is valid and should be
|
|
// used when blending
|
|
VMR9AlphaBitmap_SrcColorKey = 0x00000008,
|
|
|
|
// Indicates that the rSrc rectangle is valid and specifies a
|
|
// sub-rectangle of the of original app image to be blended.
|
|
// Use of this parameter enables "Image Strips"
|
|
VMR9AlphaBitmap_SrcRect = 0x00000010,
|
|
|
|
// Indicates that dwFilterMode parameter is valid and should be
|
|
// used to overide the default filtering method used by the VMR.
|
|
// MixerPref_PointFiltering is particulaly useful for images that
|
|
// contain text and do not need to be stretch prior to blending with
|
|
// the video content.
|
|
VMR9AlphaBitmap_FilterMode = 0x00000020
|
|
} VMR9AlphaBitmapFlags;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(ced175e5-1935-4820-81bd-ff6ad00c9108),
|
|
helpstring("IVMRMixerBitmap Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMixerBitmap9 : IUnknown
|
|
{
|
|
// Set bitmap, location to blend it, and blending value
|
|
HRESULT SetAlphaBitmap(
|
|
[in] const VMR9AlphaBitmap* pBmpParms
|
|
);
|
|
|
|
// Change bitmap location, size and blending value,
|
|
// graph must be running for change to take effect.
|
|
HRESULT UpdateAlphaBitmapParameters(
|
|
[in] const VMR9AlphaBitmap* pBmpParms
|
|
);
|
|
|
|
// Get bitmap, location to blend it, and blending value
|
|
HRESULT GetAlphaBitmapParameters(
|
|
[out] VMR9AlphaBitmap* pBmpParms
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurface9
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(dfc581a1-6e1f-4c3a-8d0a-5e9792ea2afc),
|
|
helpstring("IVMRSurface Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurface9 : IUnknown
|
|
{
|
|
HRESULT IsSurfaceLocked();
|
|
|
|
HRESULT LockSurface(
|
|
[out] BYTE** lpSurface
|
|
);
|
|
|
|
HRESULT UnlockSurface();
|
|
|
|
HRESULT GetSurface(
|
|
[out] IDirect3DSurface9** lplpSurface
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IID_IVMRImagePresenterConfig9 - this interface allows applications
|
|
// to configure the default Microsoft provided allocator-presenter
|
|
// inorder to simplify the implementation of their own
|
|
// allocator-presenter plug-in.
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
RenderPrefs9_DoNotRenderBorder = 0x00000001, // app paints color keys
|
|
RenderPrefs9_Mask = 0x00000001, // OR of all above flags
|
|
} VMR9RenderPrefs;
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(45c15cab-6e22-420a-8043-ae1f0ac02c7d),
|
|
helpstring("IVMRImagePresenterConfig9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IVMRImagePresenterConfig9 : IUnknown
|
|
{
|
|
|
|
HRESULT SetRenderingPrefs(
|
|
[in] DWORD dwRenderFlags // see VMRRenderPrefs for valid flags
|
|
);
|
|
|
|
HRESULT GetRenderingPrefs(
|
|
[out] DWORD* dwRenderFlags // see VMRRenderPrefs for valid flags
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRVideoStreamControl9
|
|
//
|
|
//=====================================================================
|
|
[
|
|
object,
|
|
local,
|
|
uuid(d0cfe38b-93e7-4772-8957-0400c49a4485),
|
|
helpstring("IVMRMixerStreamConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRVideoStreamControl9: IUnknown
|
|
{
|
|
|
|
HRESULT SetStreamActiveState(
|
|
[in] BOOL fActive
|
|
);
|
|
|
|
HRESULT GetStreamActiveState(
|
|
[out] BOOL* lpfActive
|
|
);
|
|
};
|
|
|
|
|
|
typedef enum {
|
|
VMR9Mode_Windowed = 0x00000001,
|
|
VMR9Mode_Windowless = 0x00000002,
|
|
VMR9Mode_Renderless = 0x00000004,
|
|
|
|
// not a valid value to pass to SetRenderMode
|
|
VMR9Mode_Mask = 0x00000007, // OR of all above flags
|
|
} VMR9Mode;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(5a804648-4f66-4867-9c43-4f5c822cf1b8),
|
|
helpstring("IVMRFilterConfig9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRFilterConfig9 : IUnknown
|
|
{
|
|
HRESULT SetImageCompositor(
|
|
[in] IVMRImageCompositor9* lpVMRImgCompositor
|
|
);
|
|
|
|
HRESULT SetNumberOfStreams(
|
|
[in] DWORD dwMaxStreams
|
|
);
|
|
|
|
HRESULT GetNumberOfStreams(
|
|
[out] DWORD* pdwMaxStreams
|
|
);
|
|
|
|
HRESULT SetRenderingPrefs(
|
|
[in] DWORD dwRenderFlags // a combination of VMR9RenderPrefs
|
|
);
|
|
|
|
HRESULT GetRenderingPrefs(
|
|
[out] DWORD* pdwRenderFlags
|
|
);
|
|
|
|
HRESULT SetRenderingMode(
|
|
[in] DWORD Mode // a combination of VMRMode
|
|
);
|
|
|
|
HRESULT GetRenderingMode(
|
|
[out] DWORD* pMode
|
|
);
|
|
}
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRAspectRatioControl9
|
|
//
|
|
//=====================================================================
|
|
[
|
|
object,
|
|
local,
|
|
uuid(00d96c29-bbde-4efc-9901-bb5036392146),
|
|
helpstring("IVMRAspectRatioControl9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRAspectRatioControl9 : IUnknown
|
|
{
|
|
HRESULT GetAspectRatioMode(
|
|
[out] LPDWORD lpdwARMode
|
|
);
|
|
|
|
HRESULT SetAspectRatioMode(
|
|
[in] DWORD dwARMode
|
|
);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VMR Multimon configuration interface
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#define VMR9DEVICENAMELEN 32
|
|
#define VMR9DEVICEDESCRIPTIONLEN 512
|
|
|
|
typedef struct _VMR9MonitorInfo {
|
|
UINT uDevID;
|
|
RECT rcMonitor;
|
|
HMONITOR hMon;
|
|
DWORD dwFlags; // described in MONITORINFOEX, currently only MONITORINFOF_PRIMARY
|
|
wchar_t szDevice[VMR9DEVICENAMELEN];
|
|
wchar_t szDescription[VMR9DEVICEDESCRIPTIONLEN];
|
|
LARGE_INTEGER liDriverVersion;
|
|
DWORD dwVendorId;
|
|
DWORD dwDeviceId;
|
|
DWORD dwSubSysId;
|
|
DWORD dwRevision;
|
|
//
|
|
} VMR9MonitorInfo;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(46c2e457-8ba0-4eef-b80b-0680f0978749),
|
|
helpstring("IVMRMonitorConfig9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMonitorConfig9 : IUnknown
|
|
{
|
|
// Use this method on a Multi-Monitor system to specify to the
|
|
// mixer filter which Direct Draw driver should be used when connecting
|
|
// to an upstream decoder filter.
|
|
//
|
|
HRESULT SetMonitor(
|
|
[in] UINT uDev
|
|
);
|
|
|
|
// Use this method to determine the direct draw object that will be used when
|
|
// connecting the mixer filter to an upstream decoder filter.
|
|
//
|
|
HRESULT GetMonitor(
|
|
[out] UINT *puDev
|
|
);
|
|
|
|
// Use this method on a multi-monitor system to specify to the
|
|
// mixer filter the default Direct Draw device to use when
|
|
// connecting to an upstream filter. The default direct draw device
|
|
// can be overriden for a particular connection by SetMonitor method
|
|
// described above.
|
|
//
|
|
HRESULT SetDefaultMonitor(
|
|
[in] UINT uDev
|
|
);
|
|
|
|
// Use this method on a multi-monitor system to determine which
|
|
// is the default direct draw device the overlay mixer filter
|
|
// will use when connecting to an upstream filter.
|
|
//
|
|
HRESULT GetDefaultMonitor(
|
|
[out] UINT* puDev
|
|
);
|
|
|
|
// Use this method to get a list of Direct Draw device GUIDs and thier
|
|
// associated monitor information that the mixer can use when
|
|
// connecting to an upstream decoder filter. Passing down a NULL pInfo
|
|
// parameter allows the app to determine the required array size (returned
|
|
// in pdwNumDevices). Otherwise, dwNumDevices returns the actual
|
|
// number of devices retrieved.
|
|
//
|
|
HRESULT GetAvailableMonitors(
|
|
[out, size_is(dwMaxInfoArraySize)] VMR9MonitorInfo* pInfo,
|
|
[in] DWORD dwMaxInfoArraySize, // in array members
|
|
[out] DWORD* pdwNumDevices // actual number of devices retrieved
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRDeinterlaceControl
|
|
//
|
|
// New interfaced introduced into the WindowsXP SP1 release of the VMR.
|
|
// This interface allows applications to control the DX-VA deinterlacing
|
|
// support provided by the VMR.
|
|
//
|
|
// The VMR needs to be set into "mixing" mode for this interface to work.
|
|
//
|
|
// SetDeinterlaceMode is only effective for new connections made to the
|
|
// VMR. It should be noted that the graphics device driver may refuse
|
|
// to use the specified deinterlace mode, in which case 3 fallback
|
|
// policies are offered by the VMR, these being:
|
|
//
|
|
// 1. Fallback to the next best mode offered by the driver.
|
|
// 2. Fallback to the BOB deinterlace mode.
|
|
// 3. Fallback to the WEAVE deinterlace mode (ie. turn deinterlacing off).
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef enum {
|
|
DeinterlacePref9_NextBest = 0x01,
|
|
DeinterlacePref9_BOB = 0x02,
|
|
DeinterlacePref9_Weave = 0x04,
|
|
DeinterlacePref9_Mask = 0x07
|
|
} VMR9DeinterlacePrefs;
|
|
|
|
typedef enum {
|
|
|
|
// the algorithm is unknown or proprietary
|
|
DeinterlaceTech9_Unknown = 0x0000,
|
|
|
|
// the algorithm creates the missing lines by repeating
|
|
// the line either above or below it - this method will look very jaggy and
|
|
// isn't recommended
|
|
DeinterlaceTech9_BOBLineReplicate = 0x0001,
|
|
|
|
|
|
// the algorithm creates the missing lines by vertically stretching each
|
|
// video field by a factor of two, for example by averaging two lines or
|
|
// using a [-1, 9, 9, -1]/16 filter across four lines.
|
|
// Slight vertical adjustments are made to ensure that the resulting image
|
|
// does not "bob" up and down.
|
|
DeinterlaceTech9_BOBVerticalStretch = 0x0002,
|
|
|
|
// the pixels in the missing line are recreated by a median filtering operation
|
|
DeinterlaceTech9_MedianFiltering = 0x0004,
|
|
|
|
// the pixels in the missing line are recreated by an edge filter.
|
|
// In this process, spatial directional filters are applied to determine
|
|
// the orientation of edges in the picture content, and missing
|
|
// pixels are created by filtering along (rather than across) the
|
|
// detected edges.
|
|
DeinterlaceTech9_EdgeFiltering = 0x0010,
|
|
|
|
// the pixels in the missing line are recreated by switching on a field by
|
|
// field basis between using either spatial or temporal interpolation
|
|
// depending on the amount of motion.
|
|
DeinterlaceTech9_FieldAdaptive = 0x0020,
|
|
|
|
// the pixels in the missing line are recreated by switching on a pixel by pixel
|
|
// basis between using either spatial or temporal interpolation depending on
|
|
// the amount of motion..
|
|
DeinterlaceTech9_PixelAdaptive = 0x0040,
|
|
|
|
// Motion Vector Steering identifies objects within a sequence of video
|
|
// fields. The missing pixels are recreated after first aligning the
|
|
// movement axes of the individual objects in the scene to make them
|
|
// parallel with the time axis.
|
|
DeinterlaceTech9_MotionVectorSteered = 0x0080
|
|
|
|
} VMR9DeinterlaceTech;
|
|
|
|
typedef struct _VMR9Frequency {
|
|
DWORD dwNumerator;
|
|
DWORD dwDenominator;
|
|
} VMR9Frequency;
|
|
|
|
typedef enum _VMR9_SampleFormat {
|
|
VMR9_SampleReserved = 1,
|
|
VMR9_SampleProgressiveFrame = 2,
|
|
VMR9_SampleFieldInterleavedEvenFirst = 3,
|
|
VMR9_SampleFieldInterleavedOddFirst = 4,
|
|
VMR9_SampleFieldSingleEven = 5,
|
|
VMR9_SampleFieldSingleOdd = 6,
|
|
} VMR9_SampleFormat;
|
|
|
|
typedef struct _VMR9VideoDesc {
|
|
DWORD dwSize;
|
|
DWORD dwSampleWidth;
|
|
DWORD dwSampleHeight;
|
|
VMR9_SampleFormat SampleFormat;
|
|
DWORD dwFourCC;
|
|
VMR9Frequency InputSampleFreq;
|
|
VMR9Frequency OutputFrameFreq;
|
|
} VMR9VideoDesc;
|
|
|
|
|
|
typedef struct _VMR9DeinterlaceCaps {
|
|
DWORD dwSize;
|
|
DWORD dwNumPreviousOutputFrames;
|
|
DWORD dwNumForwardRefSamples;
|
|
DWORD dwNumBackwardRefSamples;
|
|
VMR9DeinterlaceTech DeinterlaceTechnology;
|
|
} VMR9DeinterlaceCaps;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(a215fb8d-13c2-4f7f-993c-003d6271a459),
|
|
helpstring("IVMRDeinterlaceControl9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRDeinterlaceControl9 : IUnknown
|
|
{
|
|
//
|
|
// For the specified video description returns the
|
|
// number of deinterlacing modes available to the VMR.
|
|
// The deinterlacing modes are returned in descending
|
|
// quality order ie. the best quality mode is at
|
|
// lpdwNumDeinterlaceModes[0], the next best at
|
|
// lpdwNumDeinterlaceModes[1] and so on.
|
|
//
|
|
// To determine how big an array of guids to pass to the
|
|
// GetNumberOfDeinterlaceModes method call
|
|
// GetNumberOfDeinterlaceModes(lpVideoDescription, &dwNumModes, NULL);
|
|
//
|
|
HRESULT GetNumberOfDeinterlaceModes(
|
|
[in] VMR9VideoDesc* lpVideoDescription,
|
|
[in] [out] LPDWORD lpdwNumDeinterlaceModes,
|
|
[out] LPGUID lpDeinterlaceModes
|
|
);
|
|
|
|
//
|
|
// For the given video description get the capabilities of the
|
|
// specified de-interlace mode.
|
|
//
|
|
HRESULT GetDeinterlaceModeCaps(
|
|
[in] LPGUID lpDeinterlaceMode,
|
|
[in] VMR9VideoDesc* lpVideoDescription,
|
|
[out] VMR9DeinterlaceCaps* lpDeinterlaceCaps
|
|
);
|
|
|
|
//
|
|
// Get/Set the deinterlace mode that you would like the
|
|
// VMR to use when de-interlacing the specified stream.
|
|
// It should be noted that the VMR may not actually be able
|
|
// to use the requested deinterlace mode, in which case the
|
|
// the VMR will fall back to other de-interlace modes as specified
|
|
// by the de-interlace preferences (see SetDeinterlacePrefs below).
|
|
//
|
|
HRESULT GetDeinterlaceMode(
|
|
[in] DWORD dwStreamID,
|
|
[out] LPGUID lpDeinterlaceMode // returns GUID_NULL if SetDeinterlaceMode
|
|
); // has not been called yet.
|
|
|
|
HRESULT SetDeinterlaceMode(
|
|
[in] DWORD dwStreamID, // use 0xFFFFFFFF to set mode for all streams
|
|
[in] LPGUID lpDeinterlaceMode // GUID_NULL == turn deinterlacing off
|
|
);
|
|
|
|
|
|
HRESULT GetDeinterlacePrefs(
|
|
[out] LPDWORD lpdwDeinterlacePrefs
|
|
);
|
|
|
|
HRESULT SetDeinterlacePrefs(
|
|
[in] DWORD dwDeinterlacePrefs
|
|
);
|
|
|
|
//
|
|
// Get the DeinterlaceMode currently in use for the specified
|
|
// video stream (ie. pin). The returned GUID will be NULL if
|
|
// the de-interlacing h/w has not been created by the VMR at the
|
|
// time the function is called, or if the VMR determines that
|
|
// this stream should not or can be de-interlaced.
|
|
//
|
|
HRESULT GetActualDeinterlaceMode(
|
|
[in] DWORD dwStreamID,
|
|
[out] LPGUID lpDeinterlaceMode
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRImageCompositor9
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef struct _VMR9VideoStreamInfo {
|
|
IDirect3DSurface9* pddsVideoSurface;
|
|
DWORD dwWidth, dwHeight;
|
|
DWORD dwStrmID;
|
|
FLOAT fAlpha;
|
|
VMR9NormalizedRect rNormal;
|
|
REFERENCE_TIME rtStart;
|
|
REFERENCE_TIME rtEnd;
|
|
VMR9_SampleFormat SampleFormat;
|
|
} VMR9VideoStreamInfo;
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(4a5c89eb-df51-4654-ac2a-e48e02bbabf6),
|
|
helpstring("IVMRImageCompositor9 Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRImageCompositor9 : IUnknown
|
|
{
|
|
HRESULT InitCompositionDevice(
|
|
[in] IUnknown* pD3DDevice
|
|
);
|
|
|
|
HRESULT TermCompositionDevice(
|
|
[in] IUnknown* pD3DDevice
|
|
);
|
|
|
|
HRESULT SetStreamMediaType(
|
|
[in] DWORD dwStrmID,
|
|
[in] AM_MEDIA_TYPE* pmt,
|
|
[in] BOOL fTexture
|
|
);
|
|
|
|
HRESULT CompositeImage(
|
|
[in] IUnknown* pD3DDevice,
|
|
[in] IDirect3DSurface9* pddsRenderTarget,
|
|
[in] AM_MEDIA_TYPE* pmtRenderTarget,
|
|
[in] REFERENCE_TIME rtStart,
|
|
[in] REFERENCE_TIME rtEnd,
|
|
[in] D3DCOLOR dwClrBkGnd,
|
|
[in] VMR9VideoStreamInfo* pVideoStreamInfo,
|
|
[in] UINT cStreams
|
|
);
|
|
};
|