/////////////////////////////////////////////////////////////////////////////// // // 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 ") // 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 ); };