mirror of https://github.com/UMSKT/xpmgr.git
1783 lines
60 KiB
Plaintext
1783 lines
60 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Public Interfaces for the Enhanced Video Renderer.
|
|
//
|
|
// Copyright (c) 1999 - 2004, Microsoft Corporation. All rights reserved.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
import "unknwn.idl";
|
|
import "propidl.idl";
|
|
import "mfidl.idl";
|
|
import "mftransform.idl";
|
|
|
|
// DMO IDL import for IMediaBuffer and IMediaObject
|
|
import "mediaobj.idl";
|
|
|
|
// Get AM_MEDIA_TYPES
|
|
import "strmif.idl";
|
|
|
|
// __midl definitions : only defined for MIDL processing
|
|
|
|
cpp_quote( "#if defined(__midl)" )
|
|
|
|
// MAKEFOURCC definition
|
|
|
|
#ifndef MAKEFOURCC
|
|
|
|
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
|
|
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
|
|
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
|
|
|
|
#endif // MAKEFOURCC
|
|
|
|
// D3DFORMAT definition
|
|
|
|
#ifndef D3DFORMAT
|
|
|
|
typedef enum _D3DFORMAT
|
|
{
|
|
|
|
D3DFMT_UNKNOWN = 0,
|
|
|
|
D3DFMT_R8G8B8 = 20,
|
|
D3DFMT_A8R8G8B8 = 21,
|
|
D3DFMT_X8R8G8B8 = 22,
|
|
D3DFMT_R5G6B5 = 23,
|
|
D3DFMT_X1R5G5B5 = 24,
|
|
D3DFMT_A1R5G5B5 = 25,
|
|
D3DFMT_A4R4G4B4 = 26,
|
|
D3DFMT_R3G3B2 = 27,
|
|
D3DFMT_A8 = 28,
|
|
D3DFMT_A8R3G3B2 = 29,
|
|
D3DFMT_X4R4G4B4 = 30,
|
|
D3DFMT_A2B10G10R10 = 31,
|
|
D3DFMT_G16R16 = 34,
|
|
|
|
D3DFMT_A8P8 = 40,
|
|
D3DFMT_P8 = 41,
|
|
|
|
D3DFMT_L8 = 50,
|
|
D3DFMT_A8L8 = 51,
|
|
D3DFMT_A4L4 = 52,
|
|
|
|
D3DFMT_V8U8 = 60,
|
|
D3DFMT_L6V5U5 = 61,
|
|
D3DFMT_X8L8V8U8 = 62,
|
|
D3DFMT_Q8W8V8U8 = 63,
|
|
D3DFMT_V16U16 = 64,
|
|
D3DFMT_W11V11U10 = 65,
|
|
D3DFMT_A2W10V10U10 = 67,
|
|
/*
|
|
D3DFMT_UYVY = MAKEFOURCC('U', 'Y', 'V', 'Y'),
|
|
D3DFMT_YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'),
|
|
D3DFMT_DXT1 = MAKEFOURCC('D', 'X', 'T', '1'),
|
|
D3DFMT_DXT2 = MAKEFOURCC('D', 'X', 'T', '2'),
|
|
D3DFMT_DXT3 = MAKEFOURCC('D', 'X', 'T', '3'),
|
|
D3DFMT_DXT4 = MAKEFOURCC('D', 'X', 'T', '4'),
|
|
D3DFMT_DXT5 = MAKEFOURCC('D', 'X', 'T', '5'),
|
|
*/
|
|
D3DFMT_D16_LOCKABLE = 70,
|
|
D3DFMT_D32 = 71,
|
|
D3DFMT_D15S1 = 73,
|
|
D3DFMT_D24S8 = 75,
|
|
D3DFMT_D16 = 80,
|
|
D3DFMT_D24X8 = 77,
|
|
D3DFMT_D24X4S4 = 79,
|
|
|
|
|
|
D3DFMT_VERTEXDATA =100,
|
|
D3DFMT_INDEX16 =101,
|
|
D3DFMT_INDEX32 =102,
|
|
|
|
D3DFMT_FORCE_DWORD =0x7fffffff
|
|
|
|
} D3DFORMAT;
|
|
|
|
#endif // D3DFORMAT
|
|
|
|
cpp_quote( "#endif // __midl" ) // __midl
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Service GUID used by IMFGetService::GetService to retrieve interfaces from
|
|
// the renderer or the presenter.
|
|
//
|
|
cpp_quote( "DEFINE_GUID(MR_VIDEO_RENDER_SERVICE, " )
|
|
cpp_quote( " 0x1092a86c, " )
|
|
cpp_quote( " 0xab1a, " )
|
|
cpp_quote( " 0x459a, " )
|
|
cpp_quote( " 0xa3, 0x36, 0x83, 0x1f, 0xbc, 0x4d, 0x11, 0xff " )
|
|
cpp_quote( ");" )
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Service GUID used by IMFGetService::GetService to retrieve interfaces from
|
|
// the mixer.
|
|
//
|
|
cpp_quote( "DEFINE_GUID(MR_VIDEO_MIXER_SERVICE, " )
|
|
cpp_quote( " 0x73cd2fc, " )
|
|
cpp_quote( " 0x6cf4, " )
|
|
cpp_quote( " 0x40b7, " )
|
|
cpp_quote( " 0x88, 0x59, 0xe8, 0x95, 0x52, 0xc8, 0x41, 0xf8 " )
|
|
cpp_quote( ");" )
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Service GUID used by IMFGetService::GetService to retrieve HW acceleration
|
|
// interfaces in the pipeline.
|
|
//
|
|
cpp_quote( "DEFINE_GUID(MR_VIDEO_ACCELERATION_SERVICE, " )
|
|
cpp_quote( " 0xefef5175, " )
|
|
cpp_quote( " 0x5c7d, " )
|
|
cpp_quote( " 0x4ce2, " )
|
|
cpp_quote( " 0xbb, 0xbd, 0x34, 0xff, 0x8b, 0xca, 0x65, 0x54 " )
|
|
cpp_quote( "); " )
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Service GUID used by IMFGetService::GetService to retrieve an object
|
|
// from a buffer.
|
|
//
|
|
cpp_quote( "DEFINE_GUID(MR_BUFFER_SERVICE, " )
|
|
cpp_quote( " 0xa562248c, " )
|
|
cpp_quote( " 0x9ac6, " )
|
|
cpp_quote( " 0x4ffc, " )
|
|
cpp_quote( " 0x9f, 0xba, 0x3a, 0xf8, 0xf8, 0xad, 0x1a, 0x4d " )
|
|
cpp_quote( ");" )
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// IMFAttributes Blob GUID set on the mixer by the presenter to indicate
|
|
// the zoom rectangle to be used in processing the video. The zoom rectangle
|
|
// is expressed as an MFVideoNormalizedRect.
|
|
//
|
|
cpp_quote( "DEFINE_GUID(VIDEO_ZOOM_RECT, " )
|
|
cpp_quote( " 0x7aaa1638, " )
|
|
cpp_quote( " 0x1b7f, " )
|
|
cpp_quote( " 0x4c93, " )
|
|
cpp_quote( " 0xbd, 0x89, 0x5b, 0x9c, 0x9f, 0xb6, 0xfc, 0xf0" )
|
|
cpp_quote( ");" )
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// public interfaces supported by the EVR
|
|
//
|
|
interface IMFTrackedSample;
|
|
interface IMFVideoDisplayControl;
|
|
interface IMFVideoPresenter;
|
|
interface IMFVideoPositionMapper;
|
|
interface IMFDesiredSample;
|
|
interface IMFVideoMixerControl;
|
|
interface IMFVideoRenderer;
|
|
interface IMFVideoDeviceID;
|
|
interface IEVRFilterConfig;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// This interface is used to map coordinates on the output video frame to
|
|
// coordinates on the input video frame. If a component in the MF pipeline
|
|
// (MF transform, demux, sink) transforms the video in such a way that
|
|
// co-ordinates in the input image map to different co-ordinate values in the
|
|
// output image, then that component must implement this interface to provide
|
|
// the reverse transformation.
|
|
//
|
|
// It is accessible to the application via the IMFGetService interface from
|
|
// the renderer object using service GUID MR_VIDEO_RENDER_SERVICE.
|
|
//
|
|
[
|
|
object,
|
|
uuid(1F6A9F17-E70B-4e24-8AE4-0B2C3BA7A4AE),
|
|
helpstring("IMFVideoPositionMapper Interface"),
|
|
local
|
|
]
|
|
interface IMFVideoPositionMapper : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Provides the reverse transformation of coordinates for components that
|
|
// transform the video in such a way that co-ordinates in the input image
|
|
// map to different co-ordinate values in the output image.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// xOut - x coordinate of the output image normalized to the range [0,1]
|
|
// yOut - y coordinate of the output image normalized to the range [0,1]
|
|
// dwOutputStreamIndex - Output stream index relative to which co-ordinate
|
|
// mapping is required.
|
|
// dwInputStreamIndex - Input stream index relative to which co-ordinate
|
|
// mapping is required.
|
|
// pxIn - Mapped x coordinate of the input image normalized to the range [0,1]
|
|
// pyIn - Mapped y coordinate of the input image normalized to the range [0,1]
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT MapOutputCoordinateToInputStream(
|
|
[in] float xOut,
|
|
[in] float yOut,
|
|
[in] DWORD dwOutputStreamIndex,
|
|
[in] DWORD dwInputStreamIndex,
|
|
[out, annotation("__out")] float* pxIn,
|
|
[out, annotation("__out")] float* pyIn
|
|
);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoDeviceID interface supports a single method, which returns the device
|
|
// IID supported by that object. This IID must be compatible with other components.
|
|
// This interface is mandatory for the Mixer and Presenter objects, since these
|
|
// components must use the same type of video device.
|
|
//
|
|
[
|
|
object,
|
|
uuid(A38D9567-5A9C-4f3c-B293-8EB415B279BA),
|
|
helpstring("IMFVideoDeviceID Interface"),
|
|
local
|
|
]
|
|
interface IMFVideoDeviceID : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// The GetDeviceID method retrieves the video device ID of the video device
|
|
// supported by this video component. Although not restricted to these, it
|
|
// will generally be one of the following:
|
|
// - IID_IDirect3DDevice9
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pDeviceID - Pointer that receives the IID of the device supported by this component.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetDeviceID(
|
|
[out, annotation("__out")] IID* pDeviceID
|
|
);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Enumeration used to specify the aspect ratio mode desired to be used when
|
|
// rendering video. Set by calling IMFVideoDisplayControl::SetRenderingPrefs.
|
|
//
|
|
typedef enum MFVideoAspectRatioMode {
|
|
// No aspect ratio correction - fill window
|
|
MFVideoARMode_None = 0x00000000,
|
|
// Indicates that the picture aspect ratio should be preserved. That is, if the
|
|
// video is 640 by 480 pixels (4:3), and the video destination region is a rectangle
|
|
// 800 by 700, then the video should be letterboxed and displayed as 800 by 600
|
|
// (retain 4:3).
|
|
MFVideoARMode_PreservePicture = 0x00000001,
|
|
// Indicates that the pixel aspect ratio should be preserved. This setting comes into
|
|
// play when the video display is physically of a certain aspect ratio, but is set
|
|
// to a resolution that is not the same aspect ratio, thus making the pixels non-square.
|
|
// I.e. a monitor whose native resolution is 1600 by 1200 (4:3) is set to 1280 by 1024
|
|
// (5:4). This flag is only valid when passed with MFVideoARMode_PreservePicture.
|
|
MFVideoARMode_PreservePixel = 0x00000002,
|
|
// Indicates that a horizontal non-linear stretch should be applied when the aspect
|
|
// ratio of the destination rectangle does not match the aspect ratio of the source
|
|
// rectangle. The non-linear stretch algorithm acts by preserving the aspect ratio in
|
|
// the middle of the picture (relative to the left and right) and stretching (or
|
|
// shrinking) progressively more towards the left and right. This mode is useful when
|
|
// viewing 4:3 content full screen on a 16:9 aspect ratio display and would be used
|
|
// instead of pillar-boxing. It can also be used to view 16:9 content on a 4:3 display
|
|
// to replace the letterboxing. Note that this mode may cause performance degradation.
|
|
MFVideoARMode_NonLinearStretch = 0x00000004,
|
|
MFVideoARMode_Mask = 0x00000007
|
|
} MFVideoAspectRatioMode;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The rendering preferences used by the video presenter object.
|
|
//
|
|
typedef enum MFVideoRenderPrefs {
|
|
// Do not paint color keys (default off)
|
|
MFVideoRenderPrefs_DoNotRenderBorder = 0x00000001,
|
|
// Do not clip to monitor that has largest amount of video (default off)
|
|
MFVideoRenderPrefs_DoNotClipToDevice = 0x00000002,
|
|
MFVideoRenderPrefs_AllowOutputThrottling = 0x00000004,
|
|
MFVideoRenderPrefs_ForceOutputThrottling = 0x00000008,
|
|
MFVideoRenderPrefs_ForceBatching = 0x00000010,
|
|
MFVideoRenderPrefs_AllowBatching = 0x00000020,
|
|
MFVideoRenderPrefs_ForceScaling = 0x00000040,
|
|
MFVideoRenderPrefs_AllowScaling = 0x00000080,
|
|
MFVideoRenderPrefs_DoNotRepaintOnStop = 0x00000100,
|
|
MFVideoRenderPrefs_Mask = 0x000001ff,
|
|
} MFVideoRenderPrefs;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// A Normalized relative rectangle where the coordinates exist in the rate [0,1].
|
|
//
|
|
// Remarks:
|
|
//
|
|
// When the rectangle refers to a video stream, the following restrictions apply
|
|
// o left <= right.
|
|
// o top <= bottom.
|
|
//
|
|
typedef struct MFVideoNormalizedRect
|
|
{
|
|
float left;
|
|
float top;
|
|
float right;
|
|
float bottom;
|
|
} MFVideoNormalizedRect;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoDisplayControl interface supports window-based rendering.
|
|
//
|
|
// If a video renderer supports this functionality it is accessible to the
|
|
// application via the IMFGetService interface from the renderer object
|
|
// using service GUID MR_VIDEO_RENDER_SERVICE.
|
|
//
|
|
// Custom Video Presenter objects may optionally support this interface.
|
|
//
|
|
[
|
|
object,
|
|
uuid(a490b1e4-ab84-4d31-a1b2-181e03b1077a),
|
|
helpstring("IMFVideoDisplayControl Interface")
|
|
]
|
|
interface IMFVideoDisplayControl : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the un-stretched video size and aspect ratio of the video.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pszVideo - Receives the size of the native video rectangle. Optional, unless pszARVideo is NULL.
|
|
// pszARVideo - Receives the aspect ratio size of the native video rectangle. Optional, unless pszVideo is NULL.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - Both pointers passed were NULL.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// If the video renderer has not had one of its streams opened and
|
|
// media type set, this method will succeed but all parameters will be
|
|
// set to zero.
|
|
//
|
|
HRESULT GetNativeVideoSize(
|
|
[in, out, unique] SIZE* pszVideo,
|
|
[in, out, unique] SIZE* pszARVideo
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the minimum and maximum video sizes that the VIDEO RENDERER can
|
|
// display without incurring significant performance or image quality degradation.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pszMin - Receives the minimum ideal size. Optional, unless pszMax is NULL.
|
|
// pszMax - Receives the maximum ideal size. Optional, unless pszMax is NULL.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - Both pointers passed were NULL.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetIdealVideoSize(
|
|
[in, out, unique] SIZE* pszMin,
|
|
[in, out, unique] SIZE* pszMax
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets the source rectangle and destination region for the video.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pnrcSource - Specifies the source zoom rectangle as a normalized rectangle.
|
|
// This means that the coordinates exist as float values in the range {0, 1}.
|
|
// To zoom to 100 on the middle content, a rectangle of {.25, .25, .75, .75}
|
|
// would be specified. A src rectangle with zero height or width is invalid;
|
|
// it would be akin to a divide by zero, since nothing cannot be stretched.
|
|
// Optional, unless prcDest is NULL.
|
|
// prgnDest - Specifies the destination rectangle.
|
|
// Optional, unless pnrcSource is NULL.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetVideoPosition(
|
|
[in, unique] const MFVideoNormalizedRect* pnrcSource,
|
|
[in, unique] const LPRECT prcDest
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current source rectangle and destination region used to display
|
|
// the video.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pnrcSource - Receives the current source rectangle. This is expressed as a
|
|
// normalized rectangle using float values in the range {0, 1}. If a rectangle
|
|
// of {.25, .25, .75, .75} is retrieved, then the middle content has been
|
|
// zoomed to 200.
|
|
// prcDest - Receives the current destination rectangle.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Need to add size_is(*pdwSizeofRgnData) attribute to prgnDest,
|
|
// but since that represents array size, need to change prgnDest
|
|
// to be BYTE* first.
|
|
//
|
|
HRESULT GetVideoPosition(
|
|
[out] MFVideoNormalizedRect* pnrcSource,
|
|
[out] LPRECT prcDest
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Specifies how the video renderer will preserve the aspect ratio of the source video.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// AspectRatioMode - The aspect ratio mode in which the video should presented.
|
|
// This is an OR combination of MFVideoAspectRatioMode.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetAspectRatioMode(
|
|
[in] DWORD dwAspectRatioMode
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current mode in which video is being displayed in a window.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// lpAspectRatioMode - Receives the aspect ratio mode. This is an OR
|
|
// combination of MFVideoAspectRatioMode.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetAspectRatioMode(
|
|
[out] DWORD* pdwAspectRatioMode
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Specifies the container window that video should be clipped to.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// hwndVideo - The window to which the video should be clipped.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetVideoWindow(
|
|
[in] HWND hwndVideo
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the container window that video is being clipped to.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// phwndVideo - Receives the HWND value to which the video is being clipped.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetVideoWindow(
|
|
[out] HWND* phwndVideo
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Repaints the current video frame. Should be called when the application
|
|
// receives a WM_PAINT message.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT RepaintVideo();
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves a copy of the current image being displayed by the video renderer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pBih - Receives the description of the bitmap. biSize must be set
|
|
// to sizeof(BITMAPINFOHEADER).
|
|
// pDib - Receives the current image. Allocated by the callee.
|
|
// pcbDib - Receives the size of the the image in pDib.
|
|
// pTimeStamp - Receives the timestamp of the current frame.
|
|
//
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// The image is returned in the form of packed Windows DIB. The caller is
|
|
// responsible for free the returned memory by calling CoTaskMemFree.
|
|
//
|
|
// GetCurrentImage can be called at any time, but excessive use of this
|
|
// function will degrade video playback performed.
|
|
//
|
|
HRESULT GetCurrentImage(
|
|
[in, out] BITMAPINFOHEADER* pBih,
|
|
[out, size_is(, *pcbDib)] BYTE** pDib,
|
|
[out] DWORD* pcbDib,
|
|
[in, out, unique] LONGLONG* pTimeStamp
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets the border color to be used by the video renderer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Clr - The color to be set.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// 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:
|
|
// 1) When the video straddles two monitors and
|
|
// 2) When the EVR is trying to maintain the aspect
|
|
// ratio of the movies by letter boxing the video
|
|
// to fit within the specified destination rectangle.
|
|
// See also SetAspectRatioMode.
|
|
//
|
|
HRESULT SetBorderColor(
|
|
[in] COLORREF Clr
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current border color used by the video renderer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pClr - Receives the current border color.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetBorderColor(
|
|
[out] COLORREF* pClr
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets various application preferences related to video rendering.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwRenderFlags - A bitwise OR of MFVideoRenderPrefs values specifying the
|
|
// rendering preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_INVALIDARG - An invalid set of preferences were supplied.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetRenderingPrefs(
|
|
[in] DWORD dwRenderFlags // a combination of MFVideoRenderPrefs
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current set of rendering preferences being used by
|
|
// the video renderer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pdwRenderFlags - receives a DWORD representing a bitwise OR of
|
|
// MFVideoRenderprefs values indicating the current rendering preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetRenderingPrefs(
|
|
[out] DWORD* pdwRenderFlags
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets or unsets the renderer from its fullscreen rendering mode. For the
|
|
// D3D9 renderer, this is D3D exclusive mode.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// fFullscreen - TRUE if the renderer should display to the entire screen.
|
|
// FALSE otherwise.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetFullscreen(
|
|
[in] BOOL fFullscreen
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Indicates whether or not the renderer is currently in full screen mode.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pfFullscreen - TRUE if the renderer is displaying to the entire screen.
|
|
// FALSE otherwise.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetFullscreen(
|
|
[out] BOOL* pfFullscreen
|
|
);
|
|
}
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The different message types that can be passed to the video presenter via
|
|
// IMFVideoPresenter::ProcessMessage.
|
|
//
|
|
typedef enum MFVP_MESSAGE_TYPE {
|
|
// Called by the video renderer when a flush request is received on the
|
|
// reference video stream. In response, the presenter should clear its
|
|
// queue of samples waiting to be presented.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_FLUSH = 0x00000000,
|
|
// Indicates to the presenter that the current output media type on the
|
|
// mixer has changed. In response, the presenter may now wish to renegotiate
|
|
// the media type of the video mixer.
|
|
// Return Values:
|
|
// S_OK - successful completion
|
|
// MF_E_INVALIDMEDIATYPE - The presenter and mixer could not agree on
|
|
// a media type.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_INVALIDATEMEDIATYPE = 0x00000001,
|
|
// Indicates that a sample has been delivered to the video mixer object,
|
|
// and there may now be a sample now available on the mixer's output. In
|
|
// response, the presenter may want to draw frames out of the mixer's
|
|
// output.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_PROCESSINPUTNOTIFY = 0x00000002,
|
|
// Called when streaming is about to begin. In
|
|
// response, the presenter should allocate any resources necessary to begin
|
|
// streaming.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_BEGINSTREAMING = 0x00000003,
|
|
// Called when streaming has completed. In
|
|
// response, the presenter should release any resources that were
|
|
// previously allocated for streaming.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_ENDSTREAMING = 0x00000004,
|
|
// Indicates that the end of this segment has been reached.
|
|
// When the last frame has been rendered, EC_COMPLETE should be sent
|
|
// on the IMediaEvent interface retrieved from the renderer
|
|
// during IMFTopologyServiceLookupClient::InitServicePointers method.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_ENDOFSTREAM = 0x00000005,
|
|
// The presenter should step the number frames indicated by the lower DWORD
|
|
// of ulParam.
|
|
// The first n-1 frames should be skipped and only the nth frame should be
|
|
// shown. Note that this message should only be received while in the pause
|
|
// state or while in the started state when the rate is 0.
|
|
// Otherwise, MF_E_INVALIDREQUEST should be returned.
|
|
// When the nth frame has been shown EC_STEP_COMPLETE
|
|
// should be sent on the IMediaEvent interface.
|
|
// Additionally, if stepping is being done while the rate is set to 0
|
|
// (a.k.a. "scrubbing"), the frame should be displayed immediately when
|
|
// it is received, and EC_SCRUB_TIME should be sent right away after
|
|
// sending EC_STEP_COMPLETE.
|
|
MFVP_MESSAGE_STEP = 0x00000006,
|
|
// The currently queued step operation should be cancelled. The presenter
|
|
// should remain in the pause state following the cancellation.
|
|
// ulParam is unused and should be set to zero.
|
|
MFVP_MESSAGE_CANCELSTEP = 0x00000007,
|
|
|
|
} MFVP_MESSAGE_TYPE;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoPresenter interface allows for direct control over the video
|
|
// frames, in that it receives video samples as soon as they are available
|
|
// from upstream. The video presenter must therefore take care of the timing
|
|
// of the samples and synchronize with the render clock.
|
|
//
|
|
// Custom Video Presenter objects must support this interface.
|
|
//
|
|
[
|
|
object,
|
|
uuid(29AFF080-182A-4a5d-AF3B-448F3A6346CB),
|
|
helpstring("IMFVideoPresenter Interface"),
|
|
local
|
|
]
|
|
interface IMFVideoPresenter : IMFClockStateSink
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Indicates to the presenter that a certain action needs to be performed,
|
|
// or signals that something has occured.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// eMessage - Indicates the action to be performed or the condition that
|
|
// has occured.
|
|
// ulParam - Allows for additional information to be passed to the caller.
|
|
// See the definition of eMessage for more information.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT ProcessMessage(
|
|
MFVP_MESSAGE_TYPE eMessage,
|
|
ULONG_PTR ulParam
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current media type that has been last negotiated by a
|
|
// successful call to InvalidateMediaType.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// ppMediaType - Receives the currently set media type.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetCurrentMediaType(
|
|
[out, annotation("__deref_out")] IMFVideoMediaType** ppMediaType
|
|
);
|
|
}
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// This interface may be optionally supported by buffers passed back to a
|
|
// D3D mixer. It allows the presenter more control over which frames the video
|
|
// mixer gives back the presenter.
|
|
//
|
|
// It is retrieved by calling QueryInterface on the IMFSample object.
|
|
//
|
|
[
|
|
object,
|
|
uuid(56C294D0-753E-4260-8D61-A3D8820B1D54),
|
|
helpstring("IMFDesiredSample Interface"),
|
|
local
|
|
]
|
|
interface IMFDesiredSample : IUnknown
|
|
{
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Called by the Mixer to get the time and duration of sample that the
|
|
// presenter wishes.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// phnsSampleTime - Receives the desired sample time which should be mixed.
|
|
// For example, if the sample time is the same as the last sample time,
|
|
// the same sample will be retrieved. To retrieve the next sample, use
|
|
// the actual sample time plus the actual sample duration.
|
|
// phnsSampleDuration - Receives the sample duration that should be mixed.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
// MF_E_NOT_AVAILABLE - There is no timestamp set.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetDesiredSampleTimeAndDuration(
|
|
[out, annotation("__out")] LONGLONG *phnsSampleTime,
|
|
[out, annotation("__out")] LONGLONG *phnsSampleDuration
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Called by the Presenter to set the time and duration of sample which it
|
|
// desires from the mixer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// hnsSampleTime - The time of the sample that is wished from the mixer.
|
|
// hnsSampleDuration - The duration of the sample that is wished from the
|
|
// mixer.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// This value should be set prior to passing the buffer to the mixer for
|
|
// a Mix operation. The mixer sets the actual start and duration times on
|
|
// the IMFSample before handing it back.
|
|
//
|
|
void SetDesiredSampleTimeAndDuration(
|
|
[in] LONGLONG hnsSampleTime,
|
|
[in] LONGLONG hnsSampleDuration
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Clears the timestamps previously set by a call to
|
|
// SetDesiredSampleTimeAndDuration, thus resulting in any subsequent calls
|
|
// to GetDesiredSampleTimeAndDuration failing with error code
|
|
// MF_E_NOT_AVAILABLE.
|
|
//
|
|
void Clear();
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFTrackedSample interface is used to notify allocators when their
|
|
// samples are no longer in use by other clients.
|
|
//
|
|
[
|
|
object,
|
|
uuid(245BF8E9-0755-40f7-88A5-AE0F18D55E17),
|
|
helpstring("IMFTrackedSample Interface"),
|
|
local
|
|
]
|
|
interface IMFTrackedSample : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// This method sets the allocator on a sample.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pSampleAllocator - The sample allocator interface to be notified when all
|
|
// clients have finished with a sample.
|
|
// punkState - Caller supplied state that will be furnished during the
|
|
// Invoke call. This value will be addref'ed and it is therefore
|
|
// recommended that the object passed be a pointer to the
|
|
// object itself. This will guarantee that the
|
|
// object does not disappear during the call.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// When the reference count
|
|
// on the sample reaches 1, indicating that only the owner (allocator)
|
|
// holds a reference, the owner will receive a callback. The allocator
|
|
// interface will be subsequently NULL'ed out. This interface ensures that
|
|
// the allocator does not get freed while it has samples outstanding.
|
|
//
|
|
HRESULT SetAllocator(
|
|
[in, annotation("__in")] IMFAsyncCallback* pSampleAllocator,
|
|
[in, unique] IUnknown* pUnkState
|
|
);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoMixerControl interface supports mixing of separate video streams.
|
|
// If a video renderer supports this functionality it is accessed via the
|
|
// IMFGetService interface from the renderer object, using service GUID
|
|
// MR_VIDEO_MIXER_SERVICE.
|
|
//
|
|
[
|
|
object,
|
|
uuid(A5C6C53F-C202-4aa5-9695-175BA8C508A5),
|
|
helpstring("IMFVideoMixerControl Interface")
|
|
]
|
|
interface IMFVideoMixerControl : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets this video stream's position in the Z-order.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwStreamID - The stream ID of the stream to set.
|
|
// dwZ - The z-order value. 0 indicates the bottom of the z-order and must
|
|
// be the reference stream.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_INVALIDSTREAMNUMBER - an invalid stream ID was supplied.
|
|
// MF_E_INVALIDREQUEST - 0 was supplied as the Z-order for a stream other
|
|
// then the reference stream, or a value other than 0 was supplied
|
|
// for the reference stream.
|
|
// E_INVALIDARG - a z-order value greater than <the number of streams minus
|
|
// one> was supplied.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Z-order of the reference stream is always 0 and cannot be set otherwise.
|
|
//
|
|
HRESULT SetStreamZOrder(
|
|
[in] DWORD dwStreamID,
|
|
[in] DWORD dwZ
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves this video stream's position in the Z-order.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwStreamID - The stream ID of the stream to get.
|
|
// pdwZ - Receives the z-order value. 0 indicates the bottom of the z-order
|
|
// will always be the value of the reference stream.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_INVALIDSTREAMNUMBER - an invalid stream ID was supplied.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetStreamZOrder(
|
|
[in] DWORD dwStreamID,
|
|
[out] DWORD* pdwZ
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets the position of this stream within the composition rectangle.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwStreamID - The stream ID of the stream to set.
|
|
// pnrcOutput - The bounding rectangle, in normalized coordinates.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_INVALIDSTREAMNUMBER - an invalid stream ID was supplied.
|
|
// E_INVALIDARG - the Normalized rectangle supplied had coordinates that
|
|
// were invalid. See MFVideoNormalizedRect for more information.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetStreamOutputRect(
|
|
[in] DWORD dwStreamID,
|
|
[in] const MFVideoNormalizedRect *pnrcOutput
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the position of this stream's video rectangle within the composition rectangle.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwStreamID - The stream ID of the stream to get.
|
|
// pnrcOutput - Receives the bounding rectangle, in normalized coordinates.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_INVALIDSTREAMNUMBER - an invalid stream ID was supplied.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetStreamOutputRect(
|
|
[in] DWORD dwStreamID,
|
|
[out] MFVideoNormalizedRect *pnrcOutput
|
|
);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The mixing preferences used by the video mixer object.
|
|
//
|
|
typedef enum _MFVideoMixPrefs {
|
|
MFVideoMixPrefs_ForceHalfInterlace = 0x00000001,
|
|
MFVideoMixPrefs_AllowDropToHalfInterlace = 0x00000002,
|
|
MFVideoMixPrefs_AllowDropToBob = 0x00000004,
|
|
MFVideoMixPrefs_ForceBob = 0x00000008,
|
|
MFVideoMixPrefs_Mask = 0x0000000f,
|
|
} MFVideoMixPrefs;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoMixerControl2 interface supports mixing of separate video streams.
|
|
// If a video renderer supports this functionality it is accessed via the
|
|
// IMFGetService interface from the renderer object, using service GUID
|
|
// MR_VIDEO_MIXER_SERVICE.
|
|
//
|
|
[
|
|
object,
|
|
uuid(8459616d-966e-4930-b658-54fa7e5a16d3),
|
|
helpstring("IMFVideoMixerControl2 Interface")
|
|
]
|
|
interface IMFVideoMixerControl2 : IMFVideoMixerControl
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets various application preferences related to video mixing.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwMixFlags - A bitwise OR of MFVideoMixPrefs values specifying the
|
|
// rendering preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video mixer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_INVALIDARG - An invalid set of preferences were supplied.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetMixingPrefs(
|
|
[in] DWORD dwMixFlags // a combination of MFVideoMixPrefs
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current set of mixing preferences being used by
|
|
// the video mixer.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pdwMixFlags - receives a DWORD representing a bitwise OR of
|
|
// MFVideoMixingprefs values indicating the current mixing preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video mixer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetMixingPrefs(
|
|
[out] DWORD* pdwMixFlags
|
|
);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IMFVideoRenderer interface supports a single method, which allows an
|
|
// application to replace the video presenter and mixer objects with ones of
|
|
// its own creation.
|
|
//
|
|
[
|
|
object,
|
|
uuid(DFDFD197-A9CA-43d8-B341-6AF3503792CD),
|
|
helpstring("IMFVideoRenderer Interface"),
|
|
local
|
|
]
|
|
interface IMFVideoRenderer : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Replaces the video presenter and mixer objects with ones specified by the
|
|
// application.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pVideoMixer - The new video mixer object. Can be NULL.
|
|
//
|
|
// pVideoPresenter - The new video presenter object. Can be NULL.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_SHUTDOWN - The video renderer has been Shutdown and will no longer
|
|
// respond to methods calls. It must be released.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// If the video renderer is in the protected media path(PMP), then the mixer
|
|
// and presenter objects must be certified safe components and pass any trust
|
|
// authority verification that is being enforced. Otherwise, this method will fail.
|
|
//
|
|
// It is legal to supply NULL as the parameter for both arguments.
|
|
//
|
|
HRESULT InitializeRenderer(
|
|
[in, unique, annotation("__in_opt")] IMFTransform* pVideoMixer,
|
|
[in, unique, annotation("__in_opt")] IMFVideoPresenter* pVideoPresenter
|
|
);
|
|
}
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IEVRFilterConfig interface exists for configuration of the DShow EVR
|
|
// filter. It allows for setting the stream count.
|
|
//
|
|
[
|
|
object,
|
|
uuid(83E91E85-82C1-4ea7-801D-85DC50B75086),
|
|
helpstring("IEVRFilterConfig Interface"),
|
|
local
|
|
]
|
|
interface IEVRFilterConfig : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Configures the video renderer filter with the desired number of streams.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwMaxStreams - The number of pins.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// VFW_E_WRONG_STATE - The Pin count has already been set or the EVR is
|
|
// still connected.
|
|
// E_INVALIDARG - There must always be a minimum of one pin. Specifying 0
|
|
// will result in this error code.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Pins are created in the disabled state.
|
|
//
|
|
HRESULT SetNumberOfStreams(
|
|
[in] DWORD dwMaxStreams
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current number of pins that exist on the video renderer.
|
|
// There is always at least one pin.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pdwMaxStreams - Receives the number of pins on the filter.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// E_POINTER - pdwMaxStreams is NULL.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetNumberOfStreams(
|
|
[out, annotation("__out")] DWORD* pdwMaxStreams
|
|
);
|
|
}
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The configuration preferences used by the filter.
|
|
//
|
|
typedef enum _EVRFilterConfig_Prefs {
|
|
EVRFilterConfigPrefs_EnableQoS = 0x00000001,
|
|
EVRFilterConfigPrefs_Mask = 0x00000001,
|
|
} EVRFilterConfigPrefs;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// The IEVRFilterConfigEx interface controls the filter behavior
|
|
//
|
|
[
|
|
object,
|
|
uuid(aea36028-796d-454f-beee-b48071e24304),
|
|
helpstring("IEVRFilterConfigEx Interface")
|
|
]
|
|
interface IEVRFilterConfigEx : IEVRFilterConfig
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Sets various application filter preferences.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwConfigFlags - A bitwise OR of EVRFilterConfigPrefs values specifying the
|
|
// filter preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// E_INVALIDARG - An invalid set of preferences were supplied.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT SetConfigPrefs(
|
|
[in] DWORD dwConfigFlags // a combination of EVRFilterConfigPrefs
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Retrieves the current set of Config preferences being used by
|
|
// the EVR filter.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pdwConfigFlags - receives a DWORD representing a bitwise OR of
|
|
// EVRFilterConfigPrefs values indicating the current Config preferences.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// E_POINTER - An invalid pointer was passed.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// None.
|
|
//
|
|
HRESULT GetConfigPrefs(
|
|
[out] DWORD* pdwConfigFlags
|
|
);
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef enum _MF_SERVICE_LOOKUP_TYPE
|
|
{
|
|
MF_SERVICE_LOOKUP_UPSTREAM,
|
|
MF_SERVICE_LOOKUP_UPSTREAM_DIRECT,
|
|
MF_SERVICE_LOOKUP_DOWNSTREAM,
|
|
MF_SERVICE_LOOKUP_DOWNSTREAM_DIRECT,
|
|
MF_SERVICE_LOOKUP_ALL, // lookup service on any components of the graph
|
|
MF_SERVICE_LOOKUP_GLOBAL, // lookup global objects
|
|
} MF_SERVICE_LOOKUP_TYPE;
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Component can use IMFTopologyServiceLookup interface to lookup object in topology.
|
|
// Pipeline will call IMFTopologyServiceLookupClient::InitServicePointers some time after component is created
|
|
// Component should only use IMFTopologyServiceLookup in the context of IMFTopologyServiceLookupClient::InitServicePointers call
|
|
// After call is complete IMFTopologyServiceLookup interface will return an error for any call
|
|
//
|
|
[
|
|
object,
|
|
uuid(fa993889-4383-415a-a930-dd472a8cf6f7),
|
|
helpstring("IMFTopologyServiceLookup Interface"),
|
|
local
|
|
]
|
|
interface IMFTopologyServiceLookup : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Called by a client to retrieve external interfaces.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Type - Identifies the scope of the search.
|
|
//
|
|
// dwIndex - Optional index to identify component input or output. Ignored for _ALL or _GLOBAL type .
|
|
//
|
|
// guidService - Identifies the service to lookup.
|
|
//
|
|
// riid - IID of the interface on the service.
|
|
//
|
|
// ppvObjects - Contains array of size == *pnObject to fill in .
|
|
//
|
|
// pnObjects - At input time, contains the maximum number of elements in ppvObjects array.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
// MF_E_UNSUPPORTED_SERVICE - The service specified by guidService is not supported.
|
|
// MF_E_NOTACCEPTING - The method was called outside the context of an IMFTopologyServiceLookupClient::InitServicePointers method call.
|
|
// E_POINTER - pnObjects or ppvObjects was NULL.
|
|
// E_INVALIDARG - *pnObjects was zero.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Method may only be called within the context of an
|
|
// IMFTopologyServiceLookupClient::InitServicePointers method call.
|
|
//
|
|
HRESULT LookupService(
|
|
[in] MF_SERVICE_LOOKUP_TYPE Type,
|
|
[in] DWORD dwIndex,
|
|
[in] REFGUID guidService,
|
|
[in] REFIID riid,
|
|
[out, iid_is(riid), annotation("__out_ecount_full(*pnObjects)")] LPVOID* ppvObjects,
|
|
[in, out, annotation("__inout")] DWORD * pnObjects
|
|
);
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// Component can implement IMFTopologyServiceLookupClient if it wants to lookup services on other components in the pipeline
|
|
//
|
|
[
|
|
local,
|
|
object,
|
|
uuid(fa99388a-4383-415a-a930-dd472a8cf6f7)
|
|
]
|
|
interface IMFTopologyServiceLookupClient : IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Called by the EVR during initialization of the component.
|
|
// Component can lookup services using pLookup object
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pLookup - The interface to be used to discover objects.
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// The IMFTopologyServiceLookup pointer should not be addref'ed or cached
|
|
// by the callee. It can not be used outside the context of this method
|
|
// call and will fail if an attempt is made.
|
|
//
|
|
HRESULT InitServicePointers(
|
|
[in, annotation("__in")] IMFTopologyServiceLookup * pLookup
|
|
);
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Called by the pipeline during deinitialization of the component.
|
|
// Component should release all services acquired during InitServicePointers call
|
|
//
|
|
HRESULT ReleaseServicePointers(
|
|
);
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
// Description:
|
|
//
|
|
// EVR plug-ins (mixer, presenter) are expected to implement IEVRTrustedVideoPlugin - QI-able interface
|
|
// to enable working in the Protected Video Path. Video OTA uses them to communicate with
|
|
// policy objects from ITA.
|
|
//
|
|
// Abscence of this interface on the plug-in is interpreted as a negative answer to both predicates
|
|
// for the purposes of EVR-OTA communication
|
|
//
|
|
|
|
[
|
|
object,
|
|
uuid(83A4CE40-7710-494b-A893-A472049AF630),
|
|
helpstring("IEVRTrustedVideoPlugin Interface"),
|
|
local
|
|
]
|
|
interface IEVRTrustedVideoPlugin: IUnknown
|
|
{
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// This predicate is a simple mechanism for a plug-in to report presence of transient/conditional "video vulnerabilities"
|
|
// known to a plug-in on EVR's device change. Returning FALSE here will result in indication to a Policy Object from ITA
|
|
// of an additional presence of "unknown software "connector" as an output. Policy Object may take this into consideration
|
|
// when defining the protection settings.
|
|
//
|
|
// The method is called every time on every EVR plug-in after EVR's OTA is informed by EVR about new rendering "device"
|
|
//
|
|
// The example of such "transient" vulnerability is a windowed (non-fullscreen DX) mode for the EVR presenter in Vista
|
|
// ("GDI hole") that is vulnerable to a screen scraping. Whenever the presenter finds itself in a windowed mode it should
|
|
// return FALSE. Once "GDI hole" is fixed this may be reflected in this plug-in's implementation of this method.
|
|
|
|
// The vulnerabilities are expected to be "transient" as a plug-in that is *always* cannot be trusted with premium video probably
|
|
// shouldn't be certified to be loaded in PMP at all. It is responsibility of the plug-in to verify during this call all applicable transient
|
|
// conditions for known video vulnerabilities.
|
|
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pYes - To return TRUE if plug-in is in trusted video mode, FALSE otherwise
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion. Any failure is treated as if the method returned FALSE.
|
|
//
|
|
// Remarks:
|
|
//
|
|
HRESULT IsInTrustedVideoMode (
|
|
[out] BOOL *pYes
|
|
);
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Constriction (limiting the effective resolution of the image to a specified number of pixels)
|
|
// is a protection mechanism offered by EVR via OTA to a content policy owner. It can be
|
|
// implemented either by a mixer or a presenter plug-in (or both) with preference given to a
|
|
// mixer. If no mixer is available or a mixer indicates that it cannot support constriction then
|
|
// the presenter will be asked if it implements constriction.
|
|
// This predicate currently is called immediately after every SetDevice in EVR.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// pYes - To return TRUE if plug-in can constrict, FALSE otherwise
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion. Any failure is treated as if the method returned FALSE.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Care should be taken that no public interface exposed by plug-ins can lessen bandwidth
|
|
// restriction imposed by private IEVRTrustedVideo::SetConstriction. If constriction cannot be performed
|
|
// in a trusted manner (regardless of the answer on IsInTrustedVideoMode) this capability should
|
|
// not be reported.
|
|
//
|
|
//
|
|
HRESULT CanConstrict (
|
|
[out] BOOL *pYes
|
|
);
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Once an EVR plug-in reports that it CanConstrict video it may be called at any time
|
|
// to SetContsriction with the argument establishing limit on the total number of "source" pixels
|
|
// in the full output image in "kilopixels" (1000 pixels). (The actual number of pixels at destination can be
|
|
// different due to stretch scaling, etc)
|
|
// Two argument values are reserved: DWORD(0) and DWORD(0xFFFFFFFF). The former is meant
|
|
// to "disable" video (0 "source" pixels, preferably "black video"
|
|
// Refer to compliance rules for the definition of "disable". It may be possible to treat "ultra-constriction"
|
|
// (<1Kpix) as "disable".) The latter is used to indicate the end of any policy-imposed constriction
|
|
// requirements that might be in effect before.
|
|
//
|
|
// Parameters:
|
|
//
|
|
// dwKPix - Amount of allowed source pixels in the image in KPixels, or one the two reserved value (see description)
|
|
//
|
|
// Return values:
|
|
//
|
|
// S_OK - Successful completion. Any failure here is teated as Policy Enforcemet Failure and is reported to
|
|
// to MIG's policy engine as such.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// Care should be taken that no public interface exposed by plug-ins can lessen bandwidth
|
|
// restriction imposed by private IEVRTrustedVideo::SetConstriction. If constriction cannot be performed
|
|
// in a trusted manner (regardless of the answer on IsInTrustedVideoMode) this capability should
|
|
// not be reported.
|
|
//
|
|
//
|
|
HRESULT SetConstriction(
|
|
DWORD dwKPix
|
|
);
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
// Description:
|
|
//
|
|
// Some plug-ins (presenters) may implement some form of image exports
|
|
// like vidctrl GetCurrentImage(). This OTA callback sets permission to do that.
|
|
//
|
|
// By default the plug-in is assumed to start with ImageExport functionality enabled
|
|
// (if implemented)
|
|
//
|
|
// Parameters:
|
|
//
|
|
// BOOL bDisable - TRUE/FALSE. TRUE disables all subsequent image export requests, until set to FALSE.
|
|
//
|
|
// Return values:
|
|
//
|
|
// Should always S_OK. Failure will be reported as a policy enforcement error.
|
|
//
|
|
// Remarks:
|
|
//
|
|
// A plug-in is expected to return MF_E_LICENSE_INCORRECT_RIGHTS
|
|
// from an export methods when disabled.
|
|
//
|
|
HRESULT DisableImageExport(
|
|
BOOL bDisable
|
|
);
|
|
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "#if MFEVRDLL" )
|
|
cpp_quote( "#define EVRPUBLIC(func) STDAPI _##func" )
|
|
cpp_quote( "#else" )
|
|
cpp_quote( "#define EVRPUBLIC(func) STDAPI func" )
|
|
cpp_quote( "#endif" )
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "EVRPUBLIC(MFCreateVideoPresenter)(" )
|
|
cpp_quote( " __in_opt IUnknown * pOwner," )
|
|
cpp_quote( " REFIID riidDevice," )
|
|
cpp_quote( " REFIID riid," )
|
|
cpp_quote( " __deref_out_opt void ** ppVideoPresenter" )
|
|
cpp_quote( " );" )
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "EVRPUBLIC(MFCreateVideoMixer)(" )
|
|
cpp_quote( " __in_opt IUnknown * pOwner," )
|
|
cpp_quote( " REFIID riidDevice," )
|
|
cpp_quote( " REFIID riid," )
|
|
cpp_quote( " __deref_out_opt void ** ppVideoMixer" )
|
|
cpp_quote( " );" )
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "EVRPUBLIC(MFCreateVideoMixerAndPresenter)(" )
|
|
cpp_quote( " __in_opt IUnknown * pMixerOwner,")
|
|
cpp_quote( " __in_opt IUnknown * pPresenterOwner,")
|
|
cpp_quote( " REFIID riidMixer,")
|
|
cpp_quote( " __deref_out void ** ppvVideoMixer, ")
|
|
cpp_quote( " REFIID riidPresenter,")
|
|
cpp_quote( " __deref_out void ** ppvVideoPresenter")
|
|
cpp_quote( " );" )
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "EVRPUBLIC(MFCreateVideoRenderer)(" )
|
|
cpp_quote( " REFIID riidRenderer,")
|
|
cpp_quote( " __deref_out_opt void ** ppVideoRenderer" )
|
|
cpp_quote( " );" )
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
cpp_quote( "EVRPUBLIC(MFCreateVideoSampleFromSurface)(" )
|
|
cpp_quote( " __in_opt IUnknown* pUnkSurface," )
|
|
cpp_quote( " __deref_out_opt IMFSample** ppSample" )
|
|
cpp_quote( " );" )
|
|
|
|
|
|
|