You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1093 lines
31 KiB
Plaintext
1093 lines
31 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Public Interfaces for the Video Mixing Renderer DShow filter
|
|
//
|
|
// Copyright (c) 1999 - 2002, Microsoft Corporation. All rights reserved.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote("#if 0")
|
|
// This is temporary work around to persuade
|
|
// MIDL to allow forward declarations.
|
|
typedef DWORD* LPDIRECTDRAW7;
|
|
typedef DWORD* LPDIRECTDRAWSURFACE7;
|
|
typedef DWORD* LPDDPIXELFORMAT;
|
|
typedef DWORD* LPBITMAPINFOHEADER;
|
|
typedef struct {DWORD dw1; DWORD dw2;} DDCOLORKEY;
|
|
typedef DDCOLORKEY* LPDDCOLORKEY;
|
|
cpp_quote ("#endif")
|
|
cpp_quote("#include <ddraw.h>")
|
|
|
|
|
|
// public interfaces supported by the VMR
|
|
interface IVMRSurface;
|
|
|
|
interface IVMRSurfaceAllocator;
|
|
interface IVMRSurfaceAllocatorNotify;
|
|
interface IVMRImagePresenter;
|
|
interface IVMRImagePresenterConfig;
|
|
|
|
interface IVMRWindowlessControl;
|
|
interface IVMRMixerControl;
|
|
interface IVMRMixerBitmap;
|
|
interface IVMRFilterConfig;
|
|
interface IVMRAspectRatioControl;
|
|
interface IVMRDeinterlaceControl;
|
|
interface IVMRMonitorConfig;
|
|
|
|
interface IVMRImageCompositor;
|
|
|
|
interface IVMRVideoStreamControl;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Allocator Presenter interfaces
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRImagePresenter
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
VMRSample_SyncPoint = 0x00000001,
|
|
VMRSample_Preroll = 0x00000002,
|
|
VMRSample_Discontinuity = 0x00000004,
|
|
VMRSample_TimeValid = 0x00000008,
|
|
VMRSample_SrcDstRectsValid= 0x00000010
|
|
} VMRPresentationFlags;
|
|
|
|
|
|
typedef struct tagVMRPRESENTATIONINFO {
|
|
DWORD dwFlags;
|
|
LPDIRECTDRAWSURFACE7 lpSurf;
|
|
REFERENCE_TIME rtStart;
|
|
REFERENCE_TIME rtEnd;
|
|
SIZE szAspectRatio;
|
|
RECT rcSrc;
|
|
RECT rcDst;
|
|
DWORD dwTypeSpecificFlags;
|
|
DWORD dwInterlaceFlags;
|
|
} VMRPRESENTATIONINFO;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(CE704FE7-E71E-41fb-BAA2-C4403E1182F5),
|
|
helpstring("IVMRImagePresenter Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRImagePresenter : IUnknown
|
|
{
|
|
HRESULT StartPresenting(
|
|
[in] DWORD_PTR dwUserID
|
|
);
|
|
|
|
HRESULT StopPresenting(
|
|
[in] DWORD_PTR dwUserID
|
|
);
|
|
|
|
|
|
HRESULT PresentImage(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] VMRPRESENTATIONINFO* lpPresInfo
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurfaceAllocator
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef enum {
|
|
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,
|
|
local,
|
|
uuid(31ce832e-4484-458b-8cca-f4d7e3db0b52),
|
|
helpstring("IVMRSurfaceAllocator Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurfaceAllocator : IUnknown
|
|
{
|
|
HRESULT AllocateSurface(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] VMRALLOCATIONINFO* lpAllocInfo,
|
|
[in] [out] DWORD* lpdwActualBuffers,
|
|
[out] LPDIRECTDRAWSURFACE7 *lplpSurface
|
|
);
|
|
|
|
HRESULT FreeSurface(
|
|
[in] DWORD_PTR dwID
|
|
);
|
|
|
|
HRESULT PrepareSurface(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] LPDIRECTDRAWSURFACE7 lpSurface,
|
|
[in] DWORD dwSurfaceFlags
|
|
);
|
|
|
|
HRESULT AdviseNotify(
|
|
[in] IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify
|
|
);
|
|
};
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurfaceAllocatorNotify
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(aada05a8-5a4e-4729-af0b-cea27aed51e2),
|
|
helpstring("IVMRSurfaceAllocatorNotify Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurfaceAllocatorNotify : IUnknown
|
|
{
|
|
HRESULT AdviseSurfaceAllocator(
|
|
[in] DWORD_PTR dwUserID,
|
|
[in] IVMRSurfaceAllocator* lpIVRMSurfaceAllocator
|
|
);
|
|
|
|
HRESULT SetDDrawDevice(
|
|
[in] LPDIRECTDRAW7 lpDDrawDevice,
|
|
[in] HMONITOR hMonitor
|
|
);
|
|
|
|
HRESULT ChangeDDrawDevice(
|
|
[in] LPDIRECTDRAW7 lpDDrawDevice,
|
|
[in] HMONITOR hMonitor
|
|
);
|
|
|
|
HRESULT RestoreDDrawSurfaces();
|
|
|
|
HRESULT NotifyEvent(
|
|
[in] LONG EventCode,
|
|
[in] LONG_PTR Param1,
|
|
[in] LONG_PTR Param2
|
|
);
|
|
|
|
HRESULT SetBorderColor(
|
|
[in] COLORREF clrBorder
|
|
);
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Application control and configuration interfaces
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRWindowlessControl
|
|
//
|
|
//=====================================================================
|
|
typedef enum {
|
|
VMR_ARMODE_NONE,
|
|
VMR_ARMODE_LETTER_BOX
|
|
} VMR_ASPECT_RATIO_MODE;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(0eb1088c-4dcd-46f0-878f-39dae86a51b7),
|
|
helpstring("IVMRWindowlessControl Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRWindowlessControl : 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
|
|
);
|
|
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
// Color key control only meaningful when the VMR is using
|
|
// and overlay
|
|
//////////////////////////////////////////////////////////
|
|
//
|
|
HRESULT SetColorKey(
|
|
[in] COLORREF Clr
|
|
);
|
|
|
|
HRESULT GetColorKey(
|
|
[out] COLORREF* lpClr
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRMixerControl
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef enum {
|
|
MixerPref_NoDecimation = 0x00000001, // No decimation - full size
|
|
MixerPref_DecimateOutput = 0x00000002, // decimate output by 2 in x & y
|
|
MixerPref_ARAdjustXorY = 0x00000004, // adjust the aspect ratio in x or y
|
|
MixerPref_DecimationReserved = 0x00000008, // bits reserved for future use.
|
|
MixerPref_DecimateMask = 0x0000000F,
|
|
|
|
MixerPref_BiLinearFiltering = 0x00000010, // use bi-linear filtering
|
|
MixerPref_PointFiltering = 0x00000020, // use point filtering
|
|
MixerPref_FilteringMask = 0x000000F0, // OR of all above flags
|
|
|
|
MixerPref_RenderTargetRGB = 0x00000100, // Uses D3D to perform mixing
|
|
MixerPref_RenderTargetYUV = 0x00001000, // Uses DXVA to perform mixing
|
|
|
|
MixerPref_RenderTargetYUV420 = 0x00000200, // Deprecated render target
|
|
MixerPref_RenderTargetYUV422 = 0x00000400, // Deprecated render target
|
|
MixerPref_RenderTargetYUV444 = 0x00000800, // Deprecated render target
|
|
MixerPref_RenderTargetReserved = 0x0000E000, // 3 bits reserved for future use.
|
|
MixerPref_RenderTargetMask = 0x0000FF00, // 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.
|
|
//
|
|
MixerPref_DynamicSwitchToBOB = 0x00010000,
|
|
MixerPref_DynamicDecimateBy2 = 0x00020000,
|
|
|
|
MixerPref_DynamicReserved = 0x000C0000,
|
|
MixerPref_DynamicMask = 0x000F0000
|
|
|
|
} VMRMixerPrefs;
|
|
|
|
//
|
|
// 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 _NORMALIZEDRECT
|
|
{
|
|
float left;
|
|
float top;
|
|
float right;
|
|
float bottom;
|
|
} NORMALIZEDRECT, *PNORMALIZEDRECT;
|
|
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(1c1a17b0-bed0-415d-974b-dc6696131599),
|
|
helpstring("IVMRMixerControl Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMixerControl : 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 NORMALIZEDRECT *pRect
|
|
);
|
|
|
|
HRESULT GetOutputRect(
|
|
[in] DWORD dwStreamID,
|
|
[out] NORMALIZEDRECT *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
|
|
);
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VMR Multimon configuration interface
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
typedef struct tagVMRGUID {
|
|
GUID* pGUID; // is NULL if the default DDraw device
|
|
GUID GUID; // otherwise points to this GUID
|
|
} VMRGUID;
|
|
|
|
#define VMRDEVICENAMELEN 32
|
|
#define VMRDEVICEDESCRIPTIONLEN 256
|
|
|
|
typedef struct tagVMRMONITORINFO {
|
|
VMRGUID guid;
|
|
RECT rcMonitor;
|
|
HMONITOR hMon;
|
|
DWORD dwFlags; // described in MONITORINFOEX, currently only MONITORINFOF_PRIMARY
|
|
wchar_t szDevice[VMRDEVICENAMELEN];
|
|
wchar_t szDescription[VMRDEVICEDESCRIPTIONLEN];
|
|
LARGE_INTEGER liDriverVersion;
|
|
DWORD dwVendorId;
|
|
DWORD dwDeviceId;
|
|
DWORD dwSubSysId;
|
|
DWORD dwRevision;
|
|
// find out the DDCAPS using DDrawCreate on the monitor GUID
|
|
} VMRMONITORINFO;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(9cf0b1b6-fbaa-4b7f-88cf-cf1f130a0dce),
|
|
helpstring("IVMRMonitorConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMonitorConfig : 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] const VMRGUID *pGUID
|
|
);
|
|
|
|
// 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] VMRGUID *pGUID
|
|
);
|
|
|
|
// 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] const VMRGUID *pGUID
|
|
);
|
|
|
|
// 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] VMRGUID *pGUID
|
|
);
|
|
|
|
// 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)] VMRMONITORINFO* pInfo,
|
|
[in] DWORD dwMaxInfoArraySize, // in array members
|
|
[out] DWORD* pdwNumDevices // actual number of devices retrieved
|
|
);
|
|
};
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VMR Filter configuration interfaces
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef enum {
|
|
RenderPrefs_RestrictToInitialMonitor = 0x00000000, // not implemented do not use
|
|
RenderPrefs_ForceOffscreen = 0x00000001,
|
|
RenderPrefs_ForceOverlays = 0x00000002, // fail if no overlays
|
|
RenderPrefs_AllowOverlays = 0x00000000, // overlay used by default
|
|
RenderPrefs_AllowOffscreen = 0x00000000, // offscreen used if no overlay
|
|
RenderPrefs_DoNotRenderColorKeyAndBorder = 0x00000008, // app paints color keys
|
|
RenderPrefs_Reserved = 0x00000010, // note: used to be RestrictToInitialMonitor
|
|
RenderPrefs_PreferAGPMemWhenMixing = 0x00000020, // try agp mem when allocating textures
|
|
|
|
RenderPrefs_Mask = 0x0000003f, // OR of all above flags
|
|
} VMRRenderPrefs;
|
|
|
|
typedef enum {
|
|
VMRMode_Windowed = 0x00000001,
|
|
VMRMode_Windowless = 0x00000002,
|
|
VMRMode_Renderless = 0x00000004,
|
|
|
|
// not a valid value to pass to SetRenderMode
|
|
VMRMode_Mask = 0x00000007, // OR of all above flags
|
|
} VMRMode;
|
|
|
|
enum {
|
|
MAX_NUMBER_OF_STREAMS = 16
|
|
};
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(9e5530c5-7034-48b4-bb46-0b8a6efc8e36),
|
|
helpstring("IVMRFilterConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRFilterConfig : IUnknown
|
|
{
|
|
HRESULT SetImageCompositor(
|
|
[in] IVMRImageCompositor* lpVMRImgCompositor
|
|
);
|
|
|
|
HRESULT SetNumberOfStreams(
|
|
[in] DWORD dwMaxStreams
|
|
);
|
|
|
|
HRESULT GetNumberOfStreams(
|
|
[out] DWORD* pdwMaxStreams
|
|
);
|
|
|
|
HRESULT SetRenderingPrefs(
|
|
[in] DWORD dwRenderFlags // a combination of VMRRenderingPrefFlags
|
|
);
|
|
|
|
HRESULT GetRenderingPrefs(
|
|
[out] DWORD* pdwRenderFlags
|
|
);
|
|
|
|
HRESULT SetRenderingMode(
|
|
[in] DWORD Mode // a combination of VMRMode
|
|
);
|
|
|
|
HRESULT GetRenderingMode(
|
|
[out] DWORD* pMode
|
|
);
|
|
}
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRAspectRatioControl
|
|
//
|
|
//=====================================================================
|
|
[
|
|
object,
|
|
local,
|
|
uuid(ede80b5c-bad6-4623-b537-65586c9f8dfd),
|
|
helpstring("IVMRAspectRatioControl Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRAspectRatioControl : IUnknown
|
|
{
|
|
HRESULT GetAspectRatioMode(
|
|
[out] LPDWORD lpdwARMode
|
|
);
|
|
|
|
HRESULT SetAspectRatioMode(
|
|
[in] DWORD dwARMode
|
|
);
|
|
}
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// 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 {
|
|
DeinterlacePref_NextBest = 0x01,
|
|
DeinterlacePref_BOB = 0x02,
|
|
DeinterlacePref_Weave = 0x04,
|
|
DeinterlacePref_Mask = 0x07
|
|
} VMRDeinterlacePrefs;
|
|
|
|
typedef enum {
|
|
|
|
// the algorithm is unknown or proprietary
|
|
DeinterlaceTech_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
|
|
DeinterlaceTech_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.
|
|
DeinterlaceTech_BOBVerticalStretch = 0x0002,
|
|
|
|
// the pixels in the missing line are recreated by a median filtering operation
|
|
DeinterlaceTech_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.
|
|
DeinterlaceTech_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.
|
|
DeinterlaceTech_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..
|
|
DeinterlaceTech_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.
|
|
DeinterlaceTech_MotionVectorSteered = 0x0080
|
|
|
|
} VMRDeinterlaceTech;
|
|
|
|
typedef struct _VMRFrequency {
|
|
DWORD dwNumerator;
|
|
DWORD 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;
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(bb057577-0db8-4e6a-87a7-1a8c9a505a0f),
|
|
helpstring("IVMRDeinterlaceControl Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRDeinterlaceControl : 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] VMRVideoDesc* 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] VMRVideoDesc* lpVideoDescription,
|
|
[in] [out] VMRDeinterlaceCaps* 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
|
|
);
|
|
}
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRMixerBitmap
|
|
//
|
|
//=====================================================================
|
|
typedef struct _VMRALPHABITMAP
|
|
{
|
|
DWORD dwFlags; // flags word
|
|
HDC hdc; // DC for the bitmap to copy
|
|
LPDIRECTDRAWSURFACE7 pDDS; // DirectDraw surface to copy
|
|
RECT rSrc; // rectangle to copy from the DC/DDS
|
|
NORMALIZEDRECT rDest; // output rectangle in composition space
|
|
FLOAT fAlpha; // opacity of the bitmap
|
|
COLORREF clrSrcKey; // src color key
|
|
} VMRALPHABITMAP, *PVMRALPHABITMAP;
|
|
|
|
// Disable the alpha bitmap for now
|
|
cpp_quote("#define VMRBITMAP_DISABLE 0x00000001")
|
|
|
|
// Take the bitmap from the HDC rather than the DirectDraw surface
|
|
cpp_quote("#define VMRBITMAP_HDC 0x00000002")
|
|
|
|
// Take the entire DDraw surface - rSrc is ignored
|
|
cpp_quote("#define VMRBITMAP_ENTIREDDS 0x00000004")
|
|
|
|
// Indicates that the clrTrans value is valid and should be
|
|
// used when blending
|
|
cpp_quote("#define VMRBITMAP_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"
|
|
cpp_quote("#define VMRBITMAP_SRCRECT 0x00000010")
|
|
|
|
[
|
|
object,
|
|
local,
|
|
uuid(1E673275-0257-40aa-AF20-7C608D4A0428),
|
|
helpstring("IVMRMixerBitmap Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRMixerBitmap : IUnknown
|
|
{
|
|
// Set bitmap, location to blend it, and blending value
|
|
HRESULT SetAlphaBitmap(
|
|
[in] const VMRALPHABITMAP *pBmpParms
|
|
);
|
|
|
|
// Change bitmap location, size and blending value,
|
|
// graph must be running for change to take effect.
|
|
HRESULT UpdateAlphaBitmapParameters(
|
|
[in] PVMRALPHABITMAP pBmpParms
|
|
);
|
|
|
|
// Get bitmap, location to blend it, and blending value
|
|
HRESULT GetAlphaBitmapParameters(
|
|
[out] PVMRALPHABITMAP pBmpParms
|
|
);
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRImageCompositor
|
|
//
|
|
//=====================================================================
|
|
|
|
typedef struct _VMRVIDEOSTREAMINFO {
|
|
LPDIRECTDRAWSURFACE7 pddsVideoSurface;
|
|
DWORD dwWidth, dwHeight;
|
|
DWORD dwStrmID;
|
|
FLOAT fAlpha;
|
|
DDCOLORKEY ddClrKey;
|
|
NORMALIZEDRECT rNormal;
|
|
} VMRVIDEOSTREAMINFO;
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(7a4fb5af-479f-4074-bb40-ce6722e43c82),
|
|
helpstring("IVMRImageCompositor Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRImageCompositor : IUnknown
|
|
{
|
|
HRESULT InitCompositionTarget(
|
|
[in] IUnknown* pD3DDevice,
|
|
[in] LPDIRECTDRAWSURFACE7 pddsRenderTarget
|
|
);
|
|
|
|
HRESULT TermCompositionTarget(
|
|
[in] IUnknown* pD3DDevice,
|
|
[in] LPDIRECTDRAWSURFACE7 pddsRenderTarget
|
|
);
|
|
|
|
HRESULT SetStreamMediaType(
|
|
[in] DWORD dwStrmID,
|
|
[in] AM_MEDIA_TYPE* pmt,
|
|
[in] BOOL fTexture
|
|
);
|
|
|
|
HRESULT CompositeImage(
|
|
[in] IUnknown* pD3DDevice,
|
|
[in] LPDIRECTDRAWSURFACE7 pddsRenderTarget,
|
|
[in] AM_MEDIA_TYPE* pmtRenderTarget,
|
|
[in] REFERENCE_TIME rtStart,
|
|
[in] REFERENCE_TIME rtEnd,
|
|
[in] DWORD dwClrBkGnd,
|
|
[in] VMRVIDEOSTREAMINFO* pVideoStreamInfo,
|
|
[in] UINT cStreams
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRVideoStreamControl
|
|
//
|
|
//=====================================================================
|
|
[
|
|
object,
|
|
local,
|
|
uuid(058d1f11-2a54-4bef-bd54-df706626b727),
|
|
helpstring("IVMRMixerStreamConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRVideoStreamControl: IUnknown
|
|
{
|
|
HRESULT SetColorKey(
|
|
[in] LPDDCOLORKEY lpClrKey // Source color key, set to 0xFFFFFFFF to disable
|
|
);
|
|
|
|
HRESULT GetColorKey(
|
|
[out] LPDDCOLORKEY lpClrKey
|
|
);
|
|
|
|
|
|
HRESULT SetStreamActiveState(
|
|
[in] BOOL fActive
|
|
);
|
|
|
|
HRESULT GetStreamActiveState(
|
|
[out] BOOL* lpfActive
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVMRSurface
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(a9849bbe-9ec8-4263-b764-62730f0d15d0),
|
|
helpstring("IVMRSurface Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVMRSurface : IUnknown
|
|
{
|
|
HRESULT IsSurfaceLocked();
|
|
|
|
HRESULT LockSurface(
|
|
[out] BYTE** lpSurface
|
|
);
|
|
|
|
HRESULT UnlockSurface();
|
|
|
|
HRESULT GetSurface(
|
|
[out] LPDIRECTDRAWSURFACE7 *lplpSurface
|
|
);
|
|
};
|
|
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IID_IVMRImagePresenterConfig - this interface allows applications
|
|
// to configure the default Microsoft provided allocator-presenter
|
|
// inorder to simplify the implementation of their own
|
|
// allocator-presenter plug-in.
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(9f3a1c85-8555-49ba-935f-be5b5b29d178),
|
|
helpstring("IVMRImagePresenterConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IVMRImagePresenterConfig : IUnknown
|
|
{
|
|
|
|
HRESULT SetRenderingPrefs(
|
|
[in] DWORD dwRenderFlags // see VMRRenderPrefs for valid flags
|
|
);
|
|
|
|
HRESULT GetRenderingPrefs(
|
|
[out] DWORD* dwRenderFlags // see VMRRenderPrefs for valid flags
|
|
);
|
|
|
|
}
|
|
|
|
//=====================================================================
|
|
//
|
|
// IID_IVMRImagePresenterExclModeConfig - this interface allows applications
|
|
// to configure the DDraw exclusive mode allocator-presenter. This
|
|
// interface extends the IVMRImagePresenterConfig interface defined
|
|
// above and is only implemented by the CLSID_AllocPresenterDDXclMode
|
|
// allocator-presenter object.
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(e6f7ce40-4673-44f1-8f77-5499d68cb4ea),
|
|
helpstring("IVMRImagePresenterExclModeConfig Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
|
|
interface IVMRImagePresenterExclModeConfig : IVMRImagePresenterConfig
|
|
{
|
|
HRESULT SetXlcModeDDObjAndPrimarySurface(
|
|
[in] LPDIRECTDRAW7 lpDDObj,
|
|
[in] LPDIRECTDRAWSURFACE7 lpPrimarySurf
|
|
);
|
|
|
|
HRESULT GetXlcModeDDObjAndPrimarySurface(
|
|
[out] LPDIRECTDRAW7* lpDDObj,
|
|
[out] LPDIRECTDRAWSURFACE7* lpPrimarySurf
|
|
);
|
|
}
|
|
|
|
|
|
//=====================================================================
|
|
//
|
|
// IVPManager
|
|
//
|
|
//=====================================================================
|
|
[
|
|
local,
|
|
object,
|
|
local,
|
|
uuid(aac18c18-e186-46d2-825d-a1f8dc8e395a),
|
|
helpstring("IVPManager Interface"),
|
|
pointer_default(unique)
|
|
]
|
|
interface IVPManager : IUnknown
|
|
{
|
|
// Use this method on a Multi-Monitor system to specify to the
|
|
// video port manager filter which videoport index is used
|
|
// to an upstream decoder filter.
|
|
//
|
|
HRESULT SetVideoPortIndex(
|
|
[in] DWORD dwVideoPortIndex // the video port number that this is connected to
|
|
);
|
|
|
|
// This method returns the current video port index being used by the VPM.
|
|
//
|
|
HRESULT GetVideoPortIndex(
|
|
[out] DWORD* pdwVideoPortIndex // the video port number that this is connected to
|
|
);
|
|
};
|
|
|