From b1f9e28cd155459ab2843690c248ed9f4767bc3f Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sun, 2 Jun 2019 06:00:38 +0300 Subject: skeleton updated, windows specific stuff added --- dxsdk/Include/DShowIDL/vmr9.idl | 1057 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1057 insertions(+) create mode 100644 dxsdk/Include/DShowIDL/vmr9.idl (limited to 'dxsdk/Include/DShowIDL/vmr9.idl') diff --git a/dxsdk/Include/DShowIDL/vmr9.idl b/dxsdk/Include/DShowIDL/vmr9.idl new file mode 100644 index 00000000..ae9245f2 --- /dev/null +++ b/dxsdk/Include/DShowIDL/vmr9.idl @@ -0,0 +1,1057 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// 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 + ); +}; -- cgit v1.2.3