xpmgr/BuildTools/Include/Mfidl.idl

9882 lines
386 KiB
Plaintext
Raw Blame History

//*@@@+++@@@@******************************************************************
//
// Microsoft Windows Media Foundation
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//*@@@---@@@@******************************************************************
//
import "mfobjects.idl";
import "mftransform.idl";
//
// Include this for MAX_PATH
//
cpp_quote("#include <windef.h>")
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation basic control-layer interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The enumeration type defines several ways by which SetTopology can be
/// called on a media session.
/// </summary>
/// <remarks>
/// The flags are neither exclusive nor mandatory. If none of the following
/// flags is set, it means the topology will be resolved at first and then
/// queued, and it will be used sequentially when the previous presentation
/// is done.
/// </remarks>
typedef enum MFSESSION_SETTOPOLOGY_FLAGS
{
/// <summary>
/// Media session should end the current presentation and use
/// this topology immediately
/// </summary>
MFSESSION_SETTOPOLOGY_IMMEDIATE = 0x1,
/// <summary>
/// Media session does not need to resolve the topology.
/// </summary>
MFSESSION_SETTOPOLOGY_NORESOLUTION = 0x2,
#if (WINVER >= _WIN32_WINNT_WIN7)
/// <summary>
/// Media session should end the current presentation and remove
/// it from the session.
/// </summary>
MFSESSION_SETTOPOLOGY_CLEAR_CURRENT = 0x4
#endif
} MFSESSION_SETTOPOLOGY_FLAGS;
/// <summary>
/// Flags for use with IMFMediaSession::GetFullTopology
/// </summary>
typedef enum MFSESSION_GETFULLTOPOLOGY_FLAGS
{
/// <summary>
/// Media Session should return the topology it is currently
/// playing.
/// </summary>
MFSESSION_GETFULLTOPOLOGY_CURRENT = 0x1
} MFSESSION_GETFULLTOPOLOGY_FLAGS;
/// <summary>
/// Flags for use with MFCreatePMPMediaSession
/// </summary>
typedef enum MFPMPSESSION_CREATION_FLAGS
{
/// <summary>
/// If set, the Protected Media Path will exist in an unprotected
/// process.
/// This is for applications that wish to play clear content in a
/// separate (unprotected) process.
/// If not set, the Protected Media Path will exist in a protected
/// process, and both protected and clear content will play in
/// this process.
/// </summary>
MFPMPSESSION_UNPROTECTED_PROCESS = 0x1
} MFPMPSESSION_CREATION_FLAGS;
/// <summary>
/// ID for topology node.
/// </summary>
typedef unsigned __int64 TOPOID;
interface IMFTopology;
interface IMFClock;
interface IMFPresentationTimeSource;
[
object,
uuid(90377834-21D0-4dee-8214-BA2E3E6C1127),
]
/// <summary>
/// IMFMediaSession is the control-level abstraction used by applications
/// working with the Media Foundation pipeline.
/// This is the main interface used by the application for both
/// unprotected and protected content.
/// For unprotected content, the application instantiates a Media Session
/// in its own process using MFCreateMediaSession.
/// For protected content, the application instantiates a PMP Media Session
/// in its own process using MFCreatePMPMediaSession. The PMP Media Session
/// implements IMFMediaSession, which the application uses to control
/// the session.
/// </summary>
interface IMFMediaSession : IMFMediaEventGenerator
{
/// <summary>
/// SetTopology is used to specify the topology to be used by
/// the Media Session. The topology specifies the Media Source,
/// Media Transforms, and Media Sinks to be used.
/// This is an asynchronous call.
/// </summary>
/// <param name="dwSetTopologyFlags">
/// Bitflags that can be a combination of the following:
/// MFSESSION_SETTOPOLOGY_IMMEDIATE:
/// If set, the currently-playing topology will be ended
/// and this topology will be set immediately.
/// This is different from the default behavior, in which
/// the currently-playing topology is allowed to reach the
/// end of its presentation before this operation is carried out.
/// MFSESSION_SETTOPOLOGY_NORESOLUTION:
/// This flag should be set if pTopology is a fully-specified
/// topology.
/// This is different from the default behavior, in which
/// pTopology is assumed to be only partially specified,
/// in which case the Media Session will attempt to resolve
/// the topology using the Topology Loader.
/// </param>
/// <param name="pTopology">
/// Specifies a pointer to a topology.
/// Unless the MFSESSION_SETTOPOLOGY_NORESOLUTION bit is set in
/// dwFlags, this is assumed to be a partial topology. A partial
/// topology is one in which not all nodes are specified; for
/// instance, an application may specify a topology that has only
/// source and output nodes specified, and the Media Session will
/// supply the other necessary nodes (decoders, etc) during the
/// topology loading step.
/// </param>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MESessionTopologySet event.
///</remarks>
HRESULT SetTopology(
[in] DWORD dwSetTopologyFlags,
[in] IMFTopology* pTopology
);
/// <summary>
/// ClearTopologies will asynchronously clear all pending topologies
/// for this Media Session
/// </summary>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MEClearQueuedPresentations event.
/// </remarks>
HRESULT ClearTopologies( void );
/// <summary>
/// Start starts the processing of media samples and starts the
/// Presentation Clock.
/// </summary>
/// <param name="pguidTimeFormat">
/// Specifies the time format that should be used to interpret
/// the pvarStartPosition parameter.
/// Can be NULL, in which case, pvarStartPosition will be in terms
/// of MFTIME.
/// Support for other time formats depends on the Media Source
/// being used.
/// </param>
/// <param name="pvarStartPosition">
/// Specifies where to start playback.
/// This value is interpreted according to the value of pguidTimeFormat.
/// If pguidTimeFormat is NULL or *pguidTimeFormat is GUID_NULL, then
/// pvarStartPosition should either be of type VT_I8, with its value
/// specifying a time offset in MFTIME units; or it can be VT_EMPTY
/// to specify that the Media Session should start at the current
/// position.
/// </param>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MESessionStarted event.
/// </remarks>
HRESULT Start(
[in, unique] const GUID *pguidTimeFormat,
[in, unique] const PROPVARIANT *pvarStartPosition
);
/// <summary>
/// Pause pauses the processing of media samples and pauses the
/// Presentation Clock.
/// </summary>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MESessionPaused event.
/// </remarks>
HRESULT Pause( void );
/// <summary>
/// Stop stops the processing of media samples and stops the
/// Presentation Clock.
/// </summary>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MESessionStopped event.
/// </remarks>
HRESULT Stop( void );
/// <summary>
/// The Close methods closes and releases all resources being
/// used by the Media Session.
/// The application should call this method after it is done
/// using the Media Session to ensure that all of the final
/// operations take place.
/// </summary>
/// <remarks>
/// Upon completion of this asynchronous operation, the Media Session
/// will send the MESessionClosed event.
/// </remarks>
HRESULT Close( void );
/// <summary>
/// The Shutdown method causes all the resources used by the
/// Media Session to be properly shutdown and released.
/// The application must call this method after it is done using
/// the Media Session to avoid memory leaks.
/// </summary>
HRESULT Shutdown( void );
/// <summary>
/// The GetClock method gives the application access to the
/// Presentation Clock used for this session.
/// This clock is useful for displaying presentation time in
/// the application
/// </summary>
/// <param name="ppClock">
/// Pointer to a variable that will receive a pointer to the
/// clock for this presentation.
/// </param>
/// <remarks>
/// *ppClock will be a Presentation Clock.
/// Although it will QueryInterface for IMFPresentationClock, the
/// application should not control the state of the presentation
/// clock directly; instead, the application should always use
/// the transport-control methods (Start, Stop, Pause) on
/// IMFMediaSession.
/// </remarks>
HRESULT GetClock(
[out] IMFClock** ppClock
);
/// <summary>
/// The GetSessionCapabilities method returns a DWORD that can reflect the capabilities of the
/// current media session.
/// </summary>
/// <param name="pdwCaps">
/// Specifies a pointer to a variable where the DWORD will be stored.
/// </param>
/// <return>
/// If the method succeeds, it returns S_OK. If it fails, it returns an error code.
/// </return>
/// <remarks>
/// The capabilities DWORD is a bitwise combination of the
/// MFSESSIONCAP_xxx flags
/// </remarks>
HRESULT GetSessionCapabilities(
[out] DWORD *pdwCaps
);
/// <summary>
/// The application can use this method to retrieve fully-specified
/// (i.e. loaded) topologies from the Media Session.
/// </summary>
/// <param name="dwGetFullTopologyFlags">
/// Bitflag combination of the MFSESSION_GETFULLTOPOLOGY_FLAGS:
/// MFSESSION_GETFULLTOPOLOGY_CURRENT:
/// If this bit is set, then the TopoId parameter will be ignored,
/// and the Media Session will return the full topology for the
/// presentation it is currently playing.
/// </param>
/// <param name="TopoId">
/// Identifier of the topology to retrieve.
/// Ignored if the MFSESSION_GETFULLTOPOLOGY_CURRENT bit is set
/// in dwGetFullTopologyFlags.
/// </param>
/// <param name="ppFullTopology">
/// Pointer to a variable in which the full topology is returned.
/// </param>
/// <remarks>
/// If the TopoId parameter is used, the Media Session will only be
/// able to provide full topologies for the currently-playing
/// presentation and for all topologies that have been queued on
/// the Media Session. This method cannot be used for retrieving
/// topologies that have ended.
/// </remarks>
HRESULT GetFullTopology(
[in] DWORD dwGetFullTopologyFlags,
[in] TOPOID TopoId,
[out] IMFTopology** ppFullTopology
);
}
//
// MFCreateMediaSession attributes
//
// MF_SESSION_TOPOLOADER
// Data type: GUID
// If the MF_SESSION_TOPOLOADER is set, this value is used to CoCreate topoloader
cpp_quote( "EXTERN_GUID( MF_SESSION_TOPOLOADER, 0x1e83d482, 0x1f1c, 0x4571, 0x84, 0x5, 0x88, 0xf4, 0xb2, 0x18, 0x1f, 0x71);" )
// MF_SESSION_GLOBAL_TIME
// Data type: UINT32
// If set to a nonzero value, then the Media Session expects all topologies
// it receives to have the MF_TOPOLOGY_PROJECTSTART and MF_TOPOLOGY_PROJECTSTOP
// attributes set to valid values that are relative to the beginning of the
// entire timeline.
cpp_quote( "EXTERN_GUID( MF_SESSION_GLOBAL_TIME, 0x1e83d482, 0x1f1c, 0x4571, 0x84, 0x5, 0x88, 0xf4, 0xb2, 0x18, 0x1f, 0x72);" )
// MF_SESSION_QUALITY_MANAGER
// Data type: GUID
// The Media Foundation default Quality Manager(QM) implementation will
// be playback specific. Third party applications can pass in their own custom
// QM. They can do this by passing a GUID for the QM in the
// MFCreateMediaSession/MFCreatePMPMediaSession call. The third party QM will
// be CoCreated. A GUID to the QM will be specified as an attribute,
// MF_SESSION_QUALITY_MANAGER, in the configuration passed to these functions.
// To get rid of the Quality Manager altogether an application can pass in
// GUID_NULL for the MF_SESSION_QUALITY_MANAGER configuration attribute.
// {EF8436C7-2512-4abd-AC73-20C8186D2B7F}
cpp_quote( "EXTERN_GUID( MF_SESSION_QUALITY_MANAGER, 0x1e83d482, 0x1f1c, 0x4571, 0x84, 0x5, 0x88, 0xf4, 0xb2, 0x18, 0x1f, 0x73);" )
//
// MFCreatePMPMediaSession attributes
//
// MF_SESSION_CONTENT_PROTECTION_MANAGER
// Data type: IUNKNOWN
// The application supplies an object implementing IMFContentProtectionManager
// which can handle operations related to protected content (such as license
// {AFE5B29D-50FA-46e8-B9BE-0C0C3CE4B3A5}
// acquisition)
cpp_quote( "EXTERN_GUID( MF_SESSION_CONTENT_PROTECTION_MANAGER, 0x1e83d482, 0x1f1c, 0x4571, 0x84, 0x5, 0x88, 0xf4, 0xb2, 0x18, 0x1f, 0x74);" )
// MF_SESSION_SERVER_CONTEXT
// Data type: IUNKNOWN
// Application can set MF_SESSION_SERVER_CONTEXT property if it wants to
// share PMP process among more then one session.
// To do this, application has to request MF_PMP_SERVER_CONTEXT service
// from first mediasession and store it in the configuration for the
// second session
cpp_quote( "EXTERN_GUID( MF_SESSION_SERVER_CONTEXT, 0xafe5b291, 0x50fa, 0x46e8, 0xb9, 0xbe, 0xc, 0xc, 0x3c, 0xe4, 0xb3, 0xa5);" )
// MF_SESSION_REMOTE_SOURCE_MODE
// Data type: UINT32
// Application can set MF_SESSION_REMOTE_SOURCE_MODE property to indicate that source is already running in remote
// process and PMPSession does not have to remote it
cpp_quote( "EXTERN_GUID( MF_SESSION_REMOTE_SOURCE_MODE, 0xf4033ef4, 0x9bb3, 0x4378, 0x94, 0x1f, 0x85, 0xa0, 0x85, 0x6b, 0xc2, 0x44);" )
// MF_SESSION_APPROX_EVENT_OCCURRENCE_TIME
// Data type: UINT64
// Some events fired by the media session will have this attribute attached. This attribute represents
// the approximate time of the presentation clock at the time the event occured. This is useful for scenarios where
// the presentation clock may be reset when the consumer receives the event (i.e. MESessionStopped).
cpp_quote( "EXTERN_GUID( MF_SESSION_APPROX_EVENT_OCCURRENCE_TIME, 0x190e852f, 0x6238, 0x42d1, 0xb5, 0xaf, 0x69, 0xea, 0x33, 0x8e, 0xf8, 0x50);" )
//
// Media Session constants
//
// MF_PMP_SERVER_CONTEXT
// An application wishing to share the same PMP process among multiple
// Media Sessions should obtain the PMP Server Context service from the first
// Media Session using this service GUID and store this as the
// MF_SESSION_SERVER_CONTEXT attribute in the second Media Session's
// configuration attributes.
cpp_quote( "EXTERN_GUID( MF_PMP_SERVER_CONTEXT, 0x2f00c910, 0xd2cf, 0x4278, 0x8b, 0x6a, 0xd0, 0x77, 0xfa, 0xc3, 0xa2, 0x5f);" )
//
// Media Session functions
//
/// <summary>
/// Creates a Media Processing Session. Applications that do not plan
/// to play protected content can create the Media Session this way.
/// </summary>
/// <param name="pConfiguration">
/// Specifies a pointer to an IMFAttributes object.
/// </param>
/// <param name="ppMediaSession">
/// Specifies a pointer to a variable where the media session object
/// will be stored.
/// </param>
cpp_quote( "STDAPI MFCreateMediaSession(" )
cpp_quote( " IMFAttributes* pConfiguration," )
cpp_quote( " __out IMFMediaSession** ppMediaSession" )
cpp_quote( " );" )
/// <summary>
/// Creates a PMP (Protected Media Path) Media Session
/// </summary>
/// <param name="dwCreationFlags">
/// Bitflags containing a combination of the bits specified
/// by MFPMPSESSION_CREATION_FLAGS.
/// See MFPMPSESSION_CREATION_FLAGS for details.
/// </param>
/// <param name="pConfiguration">
/// Specifies a pointer to an IMFAttributes object.
/// Applications can set the following attributes:
/// MF_SESSION_CONTENT_PROTECTION_MANAGER
/// This is a pointer to an application-implemented
/// IMFContentProtectionManager to handle protected content
/// operations.
/// See IMFContentProtectionManager for details.
/// </param>
/// <param name="ppMediaSession">
/// Specifies a pointer to a variable where the PMP Media Session object
/// will be stored
/// </param>
cpp_quote( "STDAPI MFCreatePMPMediaSession(" )
cpp_quote( " DWORD dwCreationFlags," )
cpp_quote( " IMFAttributes *pConfiguration," )
cpp_quote( " __out IMFMediaSession** ppMediaSession," )
cpp_quote( " __out_opt IMFActivate **ppEnablerActivate" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Resolution will return one of the following source types
//
typedef enum MF_OBJECT_TYPE
{
MF_OBJECT_MEDIASOURCE,
MF_OBJECT_BYTESTREAM,
MF_OBJECT_INVALID
} MF_OBJECT_TYPE;
enum
{
//
// Object type requested
//
MF_RESOLUTION_MEDIASOURCE = 0x00000001, // Attempt to return a MediaSource object
MF_RESOLUTION_BYTESTREAM = 0x00000002, // Attempt to return a ByteStream object (not currently supported)
//
// Advanced resolution
//
MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE = 0x00000010,
// Enumerates though all handlers, if the default handler for the extension fails. For example,
// suppose we have a WMV file with the extension ".MP3". If you do not specify this flag, then the
// resolver will only try to invoke the MP3 handler on the file and it will fail since it is not an mp3 file.
// If this flag is specified, then after the failure, it will enumerate through all it's known handlers to
// see if any of them will accept the file
// NOTE: This flag is mutually exclusive with the MF_RESOLUTION_KEEP_BYTE_STREAM_ALIVE_ON_FAIL flag
MF_RESOLUTION_KEEP_BYTE_STREAM_ALIVE_ON_FAIL = 0x00000020,
// This flag allows the bytestream that the resolver creates during resolution to be cached (kept alive) on failure
// so it can be used on the subsequent call. By specifying this flag, the caller agrees to attempt resolution
// again if the resolution fails. For example, suppose we are trying to play back a network URL that points to a
// file with extension ".MP3" and resolution fails because the file is really a misnamed WMV file. If this
// flag is specified for the first resolution, then the network byte stream is cached (kept alive) by the resolver.
// On the subsequent resolution, the user would specify the MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE
// flag to allow handler enumeration. By using the MF_RESOLUTION_KEEP_BYTE_STREAM_ALIVE_ON_FAIL, the networked URL
// is accessed once even though resolution is done twice. In this manner, the web server logs depict a more
// accurate access count.
// NOTE: This flag is mutually exclusive with the MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE flag
//
// Access mode requested
//
//In what mode should the requested resource be open
MF_RESOLUTION_READ = 0x00010000,
MF_RESOLUTION_WRITE = 0x00020000
};
typedef enum _MF_CONNECT_METHOD
{
MF_CONNECT_DIRECT = 0x00000000,
MF_CONNECT_ALLOW_CONVERTER = 0x00000001,
MF_CONNECT_ALLOW_DECODER = 0x00000003,
//
// If MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES is set, the topoloader
// tries to fully resolve each output type, by inserting decoders/converters, etc. The
// next type in the list of output types is tried only if every attempt to resolve the current
// one failed.
// Currently this flag is only used in conjunction with the MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES flag.
// And as such it should be set only on a SourceStream topo node. If this flag is set on any other node, it is
// a no-op.
//
MF_CONNECT_RESOLVE_INDEPENDENT_OUTPUTTYPES = 0x00000004,
MF_CONNECT_AS_OPTIONAL = 0x00010000,
MF_CONNECT_AS_OPTIONAL_BRANCH = 0x00020000,
} MF_CONNECT_METHOD;
typedef enum _MF_TOPOLOGY_RESOLUTION_STATUS_FLAGS
{
MF_TOPOLOGY_RESOLUTION_SUCCEEDED = 0x00000000,
MF_OPTIONAL_NODE_REJECTED_MEDIA_TYPE = 0x00000001,
MF_OPTIONAL_NODE_REJECTED_PROTECTED_PROCESS = 0x00000002,
} MF_TOPOLOGY_RESOLUTION_STATUS_FLAGS;
interface IMFByteStream;
[
object,
uuid(FBE5A32D-A497-4b61-BB85-97B1A848A6E3),
]
/// <summary>
/// The Media Foundation Source Resolver can be used to resolve an
/// URL or an IMFByteStream object into the correct Media Source
/// for reading this content.
/// Whenever an IPropertyStore * input param appears, this parameter
/// is to contain any configuration attributes that will be needed
/// in creating this Media Source.
/// </summary>
interface IMFSourceResolver : IUnknown
{
[local]
HRESULT CreateObjectFromURL(
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
[local]
HRESULT CreateObjectFromByteStream(
[in] IMFByteStream* pByteStream,
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
[local]
HRESULT BeginCreateObjectFromURL(
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out_opt")] IUnknown **ppIUnknownCancelCookie,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
[call_as(BeginCreateObjectFromURL)]
HRESULT RemoteBeginCreateObjectFromURL(
[in, string] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[in] IMFRemoteAsyncCallback *pCallback
);
[local]
HRESULT EndCreateObjectFromURL(
[in] IMFAsyncResult *pResult,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
[call_as(EndCreateObjectFromURL)]
HRESULT RemoteEndCreateObjectFromURL(
[in] IUnknown *pResult,
[out] MF_OBJECT_TYPE *pObjectType,
[out] IUnknown **ppObject
);
[local]
HRESULT BeginCreateObjectFromByteStream(
[in] IMFByteStream* pByteStream,
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out_opt")] IUnknown **ppIUnknownCancelCookie,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
[call_as(BeginCreateObjectFromByteStream)]
HRESULT RemoteBeginCreateObjectFromByteStream(
[in] IMFByteStream* pByteStream,
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[in] IMFRemoteAsyncCallback *pCallback
);
[local]
HRESULT EndCreateObjectFromByteStream(
[in] IMFAsyncResult *pResult,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
[call_as(EndCreateObjectFromByteStream)]
HRESULT RemoteEndCreateObjectFromByteStream(
[in] IUnknown *pResult,
[out] MF_OBJECT_TYPE *pObjectType,
[out] IUnknown **ppObject
);
[local]
HRESULT CancelObjectCreation(
[in] IUnknown *pIUnknownCancelCookie
);
}
cpp_quote( "STDAPI MFCreateSourceResolver( " )
cpp_quote( " /* out */ __out IMFSourceResolver **ppISourceResolver);" )
cpp_quote( "STDAPI CreatePropertyStore( " )
cpp_quote( " /* out */ __out IPropertyStore **ppStore);" )
/// <summary>
/// Returns the currently registered MF schemes
/// </summary>
/// <param name="pPropVarSchemeArray">
/// Pointer to a PROPVARIANT that will receive the array (VT_VECTOR)
/// of VT_LPWSTRs that contains the currently registered MF schemes
/// </param>
/// <remarks>
/// Before calling this function, PropVariantInit() should be called
/// on the PROPVARIANT argument.
/// The user of this function is responsible for calling PropVariantClear()
/// on the PROPVARIANT to ensure that the array of strings is deallocated.
/// </remarks>
cpp_quote( "STDAPI MFGetSupportedSchemes( ")
cpp_quote( " __out PROPVARIANT* pPropVarSchemeArray ); ")
/// <summary>
/// Returns the currently registered MIME types supported by MF Byte Streams
/// </summary>
/// <param name="pPropVarMimeTypeArray">
/// Pointer to a PROPVARIANT that will receive the array (VT_VECTOR)
/// of VT_LPWSTRs that contains the currently registered MIME types
/// </param>
/// <remarks>
/// Before calling this function, PropVariantInit() should be called
/// on the PROPVARIANT argument.
/// The user of this function is responsible for calling PropVariantClear()
/// on the PROPVARIANT to ensure that the array of strings is deallocated.
/// </remarks>
cpp_quote( "STDAPI MFGetSupportedMimeTypes( ")
cpp_quote( " __out PROPVARIANT* pPropVarMimeTypeArray ); ")
//
// Properties for the configuration property store in the Source Resolver
// creation methods
//
// Type: VT_UNKNOWN
// The application can pass in an object implementing IMFSourceOpenMonitor
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_SourceOpenMonitor = { { 0x074d4637, 0xb5ae, 0x465d, 0xaf, 0x17, 0x1a, 0x53, 0x8d, 0x28, 0x59, 0xdd}, 0x02 }; ")
// Type: VT_BOOL
// When this is set to VARIANT_TRUE, if an ASF Media Source is created,
// it will perform all seek operations approximately (and more quickly)
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMediaSource_ApproxSeek = { { 0xb4cd270f, 0x244d, 0x4969, 0xbb, 0x92, 0x3f, 0x0f, 0xb8, 0x31, 0x6f, 0x10}, 0x01 }; ")
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
// Type: VT_BOOL
// When this is set to VARIANT_TRUE, if an ASF Media Source is created,
// it will perform iterative seek if there is no index
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex = { { 0x170b65dc, 0x4a4e, 0x407a, 0xac, 0x22, 0x57, 0x7f, 0x50, 0xe4, 0xa3, 0x7c }, 0x01 }; ")
// Type: VT_UINT32
// Only valid when MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex is set to TRUE
// The count is any integer [1, 10]
// If this value is not set, the default value 5 is used.
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMediaSource_IterativeSeek_Max_Count = { { 0x170b65dc, 0x4a4e, 0x407a, 0xac, 0x22, 0x57, 0x7f, 0x50, 0xe4, 0xa3, 0x7c }, 0x02 }; ")
// Type: VT_UINT32
// Only valid when MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex is set to TRUE
// the tolerance zone is the difference that allowed between the real seek time and preferred seek time.
// Keyframe distance is recommended to use.
// If this value is not set, the default value 8000 millisecond is used.
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond = { { 0x170b65dc, 0x4a4e, 0x407a, 0xac, 0x22, 0x57, 0x7f, 0x50, 0xe4, 0xa3, 0x7c }, 0x03 }; ")
//
// DLNA Profile ID - needed for media sharing.
//
// {CFA31B45-525D-4998-BB44-3F7D81542FA4}
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_Content_DLNA_Profile_ID = { { 0xcfa31b45, 0x525d, 0x4998, 0xbb, 0x44, 0x3f, 0x7d, 0x81, 0x54, 0x2f, 0xa4 }, 0x01 }; ")
// Type: VT_BOOL
// When this is set to VARIANT_TRUE, the media source is requested to disable any read-ahead.
// This can be a useful performance optimization to limit disk read when a media source will
// only be instantiated for limited tasks, such as reading video thumbnail data.
// Not all sources will support this feature.
// {26366C14-C5BF-4c76-887B-9F1754DB5F09}
cpp_quote( "EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_MediaSource_DisableReadAhead = { { 0x26366c14, 0xc5bf, 0x4c76, 0x88, 0x7b, 0x9f, 0x17, 0x54, 0xdb, 0x5f, 0x9}, 0x01 }; ")
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Bitflags returned by IMFMediaSource::GetCharacteristics
/// </summary>
typedef enum _MFMEDIASOURCE_CHARACTERISTICS
{
/// <summary>
/// This bit should be set if the Media Source is sourcing a live
/// presentation
/// <summary>
MFMEDIASOURCE_IS_LIVE = 0x1,
/// <summary>
/// This bit should be set if the Media Source supports seeking
/// </summary>
MFMEDIASOURCE_CAN_SEEK = 0x2,
/// <summary>
/// This bit should be set if the Media Source supports pausing
/// </summary>
MFMEDIASOURCE_CAN_PAUSE = 0x4,
/// <summary>
/// This bit should be set if the Media Source downloads content
/// and seeking outside the downloaded area is slow.
/// </summary>
MFMEDIASOURCE_HAS_SLOW_SEEK = 0x8,
#if (WINVER >= _WIN32_WINNT_WIN7)
/// <summary>
/// This bit should be set if the Media Source may change presentation
/// information during playback, such as network sources.
/// </summary>
MFMEDIASOURCE_HAS_MULTIPLE_PRESENTATIONS = 0x10,
/// <summary>
/// This bit should be set if the Media Source can skip to the next
/// playlist entry
/// </summary>
MFMEDIASOURCE_CAN_SKIPFORWARD = 0x20,
/// <summary>
/// This bit should be set if the Media Source can skip to the previous
/// playlist entry
/// </summary>
MFMEDIASOURCE_CAN_SKIPBACKWARD = 0x40
#endif // (WINVER >= _WIN32_WINNT_WIN7)
} MFMEDIASOURCE_CHARACTERISTICS;
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// MF_TIME_FORMAT_ENTRY_RELATIVE can be used as the pguidTimeFormat
/// argument to IMFMediaSession::Start and IMFMediaSource::Start to
/// indicate that playback should start at a given offset relative to
/// current play list entry.The associated PROPVARIANT should be of type
/// VT_I4, indicated the entry offset from current entry.
/// </summary>
cpp_quote( "EXTERN_GUID( MF_TIME_FORMAT_ENTRY_RELATIVE, 0x4399f178, 0x46d3, 0x4504, 0xaf, 0xda, 0x20, 0xd3, 0x2e, 0x9b, 0xa3, 0x60 );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
interface IMFPresentationDescriptor;
interface IMFStreamDescriptor;
[
object,
uuid(279a808d-aec7-40c8-9c6b-a6b492c78a66),
]
/// <summary>
/// IMFMediaSource is the interface implemented by Media Sources in
/// the MF pipeline
/// </summary>
interface IMFMediaSource : IMFMediaEventGenerator
{
/// <summary>
/// Returns the characteristics of this Media Source
/// </summary>
/// <param name="pdwCharacteristics">
/// Pointer to a variable in which the characteristics will be stored.
/// *pdwCharacteristics will be a combination of the bitflags
/// in the MFMEDIASOURCE_CHARACTERISTICS enumerated type.
/// </param>
/// <remarks>
/// Characteristics may change throughout the life of the Media Source
/// </remarks>
HRESULT GetCharacteristics(
[out] DWORD* pdwCharacteristics);
/// <summary>
/// Obtains a Presentation Descriptor describing the presentation
/// being sourced by the Media Source.
/// </summary>
/// <param name="ppPresentationDescriptor">
/// Pointer to a variable in which a pointer to the Presentation
/// Descriptor for this presentation will be stored.
/// </param>
/// <remarks>
/// When this call is being made to a Media Source in a remote
/// process, this call will be proxied via
/// RemoteCreatePresentationDescriptor.
/// In this case, a local copy of the Presentation Descriptor
/// will be returned.
/// </remarks>
[local]
HRESULT CreatePresentationDescriptor(
[out, annotation("__out")] IMFPresentationDescriptor** ppPresentationDescriptor);
/// <summary>
/// This method is used to proxy CreatePresentationDescriptor calls
/// to a Media Source in a remote process.
/// Media Sources do not need to implement this method.
/// </summary>
/// <remarks>
/// This call will result in a call to
/// IMFMediaSource::CreatePresentationDescriptor on the remote
/// Media Source
/// </remarks>
[call_as(CreatePresentationDescriptor)]
HRESULT RemoteCreatePresentationDescriptor(
[out] DWORD * pcbPD,
[out, size_is(, *pcbPD)] BYTE ** pbPD,
[out] IMFPresentationDescriptor ** ppRemotePD);
/// <summary>
/// Starts the presentation on this Media Source
/// </summary>
/// <param name="pPresentationDescriptor">
/// The caller can obtain this Presentation Descriptor from
/// CreatePresentationDescriptor.
/// The application can use this Presentation Descriptor to indicate
/// which streams to select, by means of the IMFPresentationDescriptor
/// methods
/// </param>
/// <param name="pguidTimeFormat">
/// Specifies the time format that should be used to interpret
/// the pvarStartPosition parameter.
/// Can be NULL, in which case, pvarStartPosition will be in terms
/// of MFTIME.
/// Support for other time formats varies across Media Source
/// implementations.
/// </param>
/// <param name="pvarStartPosition">
/// Specifies where to start playback.
/// This value is interpreted according to the value of pguidTimeFormat.
/// If pguidTimeFormat is NULL or *pguidTimeFormat is GUID_NULL, then
/// pvarStartPosition should either be of type VT_I8, with its value
/// specifying a time offset in MFTIME units; or it can be VT_EMPTY
/// to specify that the Media Session should start at the current
/// position.
/// </param>
HRESULT Start(
[in] IMFPresentationDescriptor* pPresentationDescriptor,
[in, unique] const GUID* pguidTimeFormat,
[in, unique] const PROPVARIANT* pvarStartPosition);
/// <summary>
/// Stops the presentation on this Media Source
/// </summary>
/// <remarks>
/// If Start() is subsequently called with a NULL or VT_EMPTY
/// pvarStartPosition, playback will begin at the beginning of the
/// presentation.
/// </remarks>
HRESULT Stop( void );
/// <summary>
/// Pauses the presentation on this Media Source
/// </summary>
/// <remarks>
/// Not all Media Sources support pausing.
/// Media Sources that support pausing should set the
/// MFMEDIASOURCE_CAN_PAUSE characteristic in GetCharateristics.
/// Those that do not support it may fail this call.
/// If the Media Session supports pausing, then if Start()
/// is subsequently called with a NULL or VT_EMPTY pvarStartPosition,
/// then playback will resume from its current position
/// </remarks>
HRESULT Pause( void );
/// <summary>
/// Shuts down the Media Source and releases all resources.
/// </summary>
/// <remarks>
/// If the application created the Media Source -- whether manually
/// or via IMFSourceResolver -- the application is responsible for
/// calling Shutdown on the Media Source in order to avoid memory
/// or resource leaks
/// </remarks>
HRESULT Shutdown( void );
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(D182108F-4EC6-443f-AA42-A71106EC825F),
]
interface IMFMediaStream : IMFMediaEventGenerator
{
HRESULT GetMediaSource(
[out] IMFMediaSource** ppMediaSource
);
HRESULT GetStreamDescriptor(
[out] IMFStreamDescriptor** ppStreamDescriptor
);
[local]
HRESULT RequestSample(
[in] IUnknown* pToken
);
[call_as(RequestSample)]
HRESULT RemoteRequestSample(
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Sink characteristics
//
cpp_quote( "#define MEDIASINK_FIXED_STREAMS 0x00000001" )
cpp_quote( "#define MEDIASINK_CANNOT_MATCH_CLOCK 0x00000002" )
cpp_quote( "#define MEDIASINK_RATELESS 0x00000004" )
cpp_quote( "#define MEDIASINK_CLOCK_REQUIRED 0x00000008" )
cpp_quote( "#define MEDIASINK_CAN_PREROLL 0x00000010" )
/// <summary>
/// MediaSink should expose cap if it requires mediatype to be set on the reference stream in order to connect other streams
/// Topoloader will use this flag to set mediatype during topology resolution
/// </summary>
cpp_quote( "#define MEDIASINK_REQUIRE_REFERENCE_MEDIATYPE 0x00000020" )
interface IMFPresentationClock;
interface IMFStreamSink;
[
object,
uuid(6ef2a660-47c0-4666-b13d-cbb717f2fa2c)
]
/// <summary>
/// The IMFMediaSink interface is the base interface for all
/// Media Foundation sinks (for both encoding and rendering).
/// While Stream Sinks handle the actual processing of data on
/// each stream, the Media Sink is responsible for managing the
/// sink end of the presentation as a whole.
/// </summary>
interface IMFMediaSink : IUnknown
{
/// <summary>
/// The GetCharacteristics method allows the caller to
/// retrieve the characteristics for this Media Sink.
/// </summary>
/// <param name="pdwCharacteristics">
/// Pointer to a variable where the Media Sink characteristics
/// flags will be returned. Should not be NULL.
/// </param>
/// <remarks>
/// The characteristics can be a combination of zero or
/// more of the following flags:
/// <para>
/// MEDIASINK_FIXED_STREAMS:
/// This flag indicates that AddStreamSink and
/// RemoveStreamSink are not supported, since the
/// Media Sink creates and maintains a fixed set
/// of StreamSinks.
/// </para>
/// <para>
/// MEDIASINK_CANNOT_MATCH_CLOCK:
/// This flag indicates that this Media Sink cannot
/// match to an outside Presentation Time Source.
/// If this flag is set, then calling SetPresentationClock
/// on this Media Sink with a Presentation Clock that is
/// using a Time Source other than the one provided by
/// this Media Sink will have suboptimal results.
/// This flag should be used sparingly, since it restricts
/// the scenarios in which this Media Sink can be used.
/// </para>
/// <para>
/// MEDIASINK_RATELESS:
/// This flag indicates that the Media Sink is "rateless".
/// This means that the Media Sink simply operates as quickly
/// as possible and does not make any attempt to operate in
/// real time or to sync to a presentation clock.
/// Most archiving sinks are rateless.
/// See the MF Timing Model design doc for more details on how
/// rateless sinks are handled.
/// </para>
/// <para>
/// MEDIASINK_CLOCK_REQUIRED:
/// This flag indicates that the Media Sink requires a
/// Presentation Clock to be set via
/// IMFMediaSink::SetPresentationClock in order for the
/// sink to operate correctly.
/// Video renderers that depend on a presentation clock
/// for scheduling when to display their frames should
/// set this flag.
/// </para>
/// </remarks>
HRESULT GetCharacteristics(
[out] DWORD* pdwCharacteristics
);
/// <summary>
/// The AddStreamSink method provides a way to add a Stream Sink
/// supporting the given Media Type.
/// </summary>
/// <param name="dwStreamSinkIdentifier">
/// Identifier of the stream sink to support pMediaType.
/// This must be an identifier that is not currently in use.
/// </param>
/// <param name="pMediaType">
/// Pointer to the Media Type to support.
/// This can point to a valid media type, or it can be NULL
/// to signify that media type negotiation will happen later.
/// </param>
/// <param name="ppStreamSink">
/// Pointer to a variable in which the pointer to the new
/// Stream Sink is returned. Should not be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_MEDIASINK_FIXED_STREAMS:
/// This Media Sink has a fixed set of Stream Sinks,
/// and therefore AddStreamSink and RemoveStreamSink are not
/// supported.
/// </para>
/// <para>
/// MF_E_STREAMSINK_EXISTS:
/// A Stream Sink with identifier dwStreamSinkIdentifier
/// already exists.
/// </para>
/// </returns>
/// <remarks>
/// Media Sinks that set MEDIASINK_FIXED_STREAMS in GetCharacteristics
/// will fail this call.
/// </remarks>
HRESULT AddStreamSink(
[in] DWORD dwStreamSinkIdentifier,
[in] IMFMediaType* pMediaType,
[out] IMFStreamSink** ppStreamSink
);
/// <summary>
/// The RemoveStreamSink method signals to the Media Sink that
/// the Stream Sink with the given identifier will no longer be
/// used and should no longer be enumerated.
/// </summary>
/// <param name="dwStreamSinkIdentifier">
/// Identifier of the Stream Sink to remove.
/// </param>
/// <returns>
/// <para>
/// MF_E_MEDIASINK_FIXED_STREAMS:
/// This Media Sink has a fixed set of Stream Sinks,
/// and therefore AddStreamSink and RemoveStreamSink are not
/// supported.
/// </para>
/// <para>
/// MF_E_INVALIDSTREAMNUMBER:
/// There is no Stream Sink with identifier dwStreamSinkIdentifier.
/// </para>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has already been removed
/// </para>
/// </returns>
/// <remarks>
/// Media Sinks that set MEDIASINK_FIXED_STREAMS in GetCharacteristics
/// will fail this call.
/// This Stream Sink will no longer be enumerated by
/// GetStreamSinkByIndex or by GetStreamSinkById.
/// This same identifier can be used to create a new Stream Sink
/// via AddStreamSink.
/// </remarks>
HRESULT RemoveStreamSink(
[in] DWORD dwStreamSinkIdentifier
);
/// <summary>
/// The GetStreamSinkCount method allows the user to
/// retrieve the number of Stream Sinks associated with
/// this Media Sink.
/// </summary>
/// <param name="pcStreamSinkCount">
/// Pointer to a variable in which the number of Stream Sinks
/// associated with this Media Sink will be returned.
/// Should not be NULL.
/// </param>
HRESULT GetStreamSinkCount(
[out] DWORD* pcStreamSinkCount
);
/// <summary>
/// The GetStreamSinkByIndex method allows the user to
/// retrieve a pointer to a Stream Sink associated with
/// this Media Sink given its index among the Media Sink's
/// Stream Sinks.
/// </summary>
/// <param name="dwIndex">
/// 0-based index into the Media Sink's Stream Sinks.
/// </param>
/// <param name="ppStreamSink">
/// Pointer to a variable that in which the pointer to
/// the requested Stream Sink will be returned. Should not be NULL.
/// </param>
/// <remarks>
/// Note that enumeration is not a thread-safe operation,
/// since Stream Sinks can be added or removed between
/// calls to this method.
/// </remarks>
HRESULT GetStreamSinkByIndex(
[in] DWORD dwIndex,
[out] IMFStreamSink** ppStreamSink
);
/// <summary>
/// The GetStreamSinkById method allows the user to retrieve
/// a pointer to a Stream Sink associated with this Media Sink
/// given its Stream Sink identifier.
/// </summary>
/// <param name="dwStreamSinkIdentifier">
/// The Stream Sink identifier for the desired Stream Sink.
/// </param>
/// <param name="ppStreamSink">
/// Pointer to a variable in which the pointer to the requested
/// Stream Sink will be returned. Should not be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_INVALIDSTREAMNUMBER:
/// There is no Stream Sink with the given identifier.
/// </para>
/// </returns>
HRESULT GetStreamSinkById(
[in] DWORD dwStreamSinkIdentifier,
[out] IMFStreamSink** ppStreamSink
);
/// <summary>
/// The SetPresentationClock method allows the user to set a
/// Presentation Clock on the Media Sink that will control
/// how it sinks data
/// </summary>
/// <param name="pPresentationClock">
/// A pointer to the Presentation Clock that the user chooses
/// to control the sinking behavior. Can be NULL.
/// </param>
/// <remarks>
/// <para>
/// A NULL value indicates that the Media Sink is being removed
/// from the presentation. The Media Sink should call
/// IMFPresentationClock::RemoveClockStateSink to stop listening
/// for notifications from its former Presentation Clock.
/// </para>
/// <para>
/// pPresentationClock must have already had a valid
/// Presentation Time Source set.
/// Implementations must handle this call.
/// </para>
/// <para>
/// If this Media Sink is a Presentation Time Source, the Presentation
/// Clock may or may not be using this Media Sink as the Presentation
/// Time Source.
/// If SetPresentationClock has been called, the Media Sink should
/// pay attention to the time on that Presentation Clock's Time Source
/// and not fall behind, even if a Presentation Time Source other
/// than this Media Sink is being used by the Presentation Clock.
/// The exception is rateless sinks, which
/// will ignore the clock. If a Media Sink cannot do this,
/// then the MEDIASINK_CANNOT_MATCH_CLOCK flag should be set from
/// GetCharacteristics. In this case, SetPresentationClock
/// should still succeed, but the results may be suboptimal
/// if this sink's failure to allocate samples quickly enough holds
/// up the entire pipeline.
/// </para>
/// <para>
/// The Media Sink is expected to call AddClockStateSink
/// on this Presentation Clock to register itself
/// for clock state change notifications.
/// The Media Sink is expected to call RemoveClockStateSink
/// to deregister itself when a new Presentation Clock is
/// set via SetPresentationClock, or upon shutdown of the
/// Media Sink.
/// </para>
/// </remarks>
HRESULT SetPresentationClock(
[in] IMFPresentationClock* pPresentationClock
);
/// <summary>
/// The GetPresentationClock method allows the user to
/// retrieve the last Presentation Clock that was set
/// on the Media Sink.
/// </summary>
/// <param name="ppPresentationClock">
/// A pointer to a variable in which a pointer to the last
/// Presentation Clock set on this Media Sink is returned.
/// Should not be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_NO_CLOCK:
/// No clock was ever set.
/// </para>
/// </returns>
HRESULT GetPresentationClock(
[out] IMFPresentationClock** ppPresentationClock
);
/// <summary>
/// The Shutdown method causes all the resources used by the
/// Media Sink to be properly shutdown and released.
/// The Media Sink should be shut down when the caller is done with
/// it to prevent memory leaks
/// </summary>
/// <remarks>
/// Upon successful completion of this call, all
/// methods on the Media Sink will return MF_E_SHUTDOWN when called.
/// The exception is the IMFMediaEventGenerator calls
/// which are still allowed.
/// </remarks>
HRESULT Shutdown();
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Marker types for use with IMFStreamSink::PlaceMarker.
/// </summary>
typedef enum _MFSTREAMSINK_MARKER_TYPE
{
/// <member name="MFSTREAMSINK_MARKER_DEFAULT">
/// This indicates that this marker is not meant to convey
/// any special information to the Stream Sink and is just
/// for the caller's use.
/// </member>
MFSTREAMSINK_MARKER_DEFAULT,
/// <member name="MFSTREAMSINK_MARKER_ENDOFSEGMENT">
/// This is an informational marker sent to the Stream Sink
/// when the end of a particular segment (topology) for this stream has been
/// hit.
/// Receiving this marker is an indication that there may be
/// a gap in this stream until the next segment starts; however,
/// samples for the next segment may follow immediately.
/// </member>
MFSTREAMSINK_MARKER_ENDOFSEGMENT,
/// <member name="MFSTREAMSINK_MARKER_TICK">
/// This is a hint to the Stream Sink that there is a gap
/// in the sample times. The marker value associated with
/// this marker will be a VT_I8 100ns value indicating
/// the next possible sample time for this Stream Sink.
/// The Stream Sink can ignore this marker, but some Stream
/// Sinks will want to inspect these markers for optimal behavior.
/// </member>
MFSTREAMSINK_MARKER_TICK,
/// <member name="MFSTREAMSINK_MARKER_EVENT">
/// The pvarMarkerValue argument to PlaceMarker will be a
/// VT_UNKNOWN containing an IMFMediaEvent. This event
/// should be processed by the Stream Sink if the Stream Sink
/// recognizes it; otherwise, it should just send the marker
/// back.
/// </member>
MFSTREAMSINK_MARKER_EVENT,
} MFSTREAMSINK_MARKER_TYPE;
interface IMFMediaTypeHandler;
[
object,
uuid(0A97B3CF-8E7C-4a3d-8F8C-0C843DC247FB),
]
/// <summary>
/// The IMFStreamSink interface is the base interface for all
/// Media Foundation stream-based sinks (for both encoding
/// and rendering).
/// </summary>
interface IMFStreamSink : IMFMediaEventGenerator
{
/// <summary>
/// The GetMediaSink method allows the caller to retrieve
/// a pointer to the Media Sink to which this stream belongs.
/// </summary>
/// <param name=ppMediaSink>
/// Pointer to a variable where the pointer to the Media Sink
/// for this stream will be returned. Should not be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has been removed and is no longer usable.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// All Stream Sink objects should be associated with exactly
/// one Media Sink. Media Sinks can contain more than one Stream Sink.
/// </para>
/// <para>
/// This call should return a pointer to a valid Media Sink
/// object, regardless of the state the Stream Sink was in when the
/// call was made.
/// </para>
/// </remarks>
HRESULT GetMediaSink(
[out] IMFMediaSink** ppMediaSink
);
/// <summary>
/// The GetIdentifier method allows the caller to retrieve the
/// unique identifier for this stream.
/// </summary>
/// <param name=pdwIdentifier>
/// Pointer to a variable where the stream identifier will be returned.
/// Should not be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has been removed and is no longer usable.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// This call should return a Stream Sink identifier that is unique
/// within this Media Sink. It should do so regardless of the state
/// of the Stream Sink.
/// </para>
/// <para>
/// If the Stream Sink was created via IMFMediaSink::AddStreamSink,
/// then this identifier will be the identifier with which the Stream
/// Sink was created; otherwise, this identifier gets assigned by the
/// Media Sink itself. For certain implementations, this identifier
/// has a meaning (for instance, in an ASF encoding sink, it would be
/// the ASF stream number); for other implementations it is simply an
/// identifier.
/// </para>
/// </remarks>
HRESULT GetIdentifier(
[out] DWORD* pdwIdentifier
);
/// <summary>
/// The GetMediaTypeHandler method allows the caller to retrieve
/// the Media Type Handler for this stream, which will in turn
/// allow the user to see which media types are supported and to
/// choose a media type.
/// </summary>
/// <param name=ppMediaTypeHandler>
/// Pointer to a variable where the pointer to the stream's Media
/// Type Handler will be returned. Should not be NULL.
/// </param>
/// <remarks>
/// This method should return a valid Media Type Handler, regardless
/// of the state the Stream Sink is in (except, of course, if the
/// Stream Sink has been removed from its Media Sink, in which case
/// MF_E_STREAMSINK_REMOVED will be returned). If no media types
/// are currently supported, then the correct behavior is to return
/// a Media Type Handler that simply fails the
/// IMFMediaTypeHandler::GetCurrentMediaType and indicates from
/// IMFMedaTypeHandler::IsMediaTypeSupported that no media types
/// are supported.
/// </remarks>
HRESULT GetMediaTypeHandler(
[out] IMFMediaTypeHandler** ppHandler
);
/// <summary>
/// The ProcessSample method provides a way for the user to send
/// samples into the Stream Sink to be either written or rendered.
/// </summary>
/// <param name=pSample>
/// Pointer to an object implementing IMFSample that contains the
/// sample to be written or rendered.
/// </param>
/// <returns>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has been removed and is no longer usable.
/// </para>
/// <para>
/// MF_E_INVALIDREQUEST:
/// This Stream Sink is either in the paused or stopped state
/// and cannot handle the sample.
/// </para>
/// <para>
/// MF_E_NO_TIMESTAMP:
/// pSample is missing a timestamp, and this Stream Sink
/// requires timestamps
/// </para>
/// </returns>
/// <remarks>
/// Please see Media Sink design spec for info on how ProcessSample works.
/// </remarks>
HRESULT ProcessSample(
[in] IMFSample* pSample
);
/// <summary>
/// The PlaceMarker method indicates to the Stream Sink that
/// it should send an MEStreamSinkMarker event once it has
/// finished processing all samples that were passed in before
/// this call was made.
/// </summary>
/// <param name=eMarkerType>
/// Indicates type of marker
/// </param>
/// <param name=pvarMarkerValue>
/// This is an additional piece of data that may be useful,
/// depending on the value of eMarkerType.
/// For instance, if dwFlags is STREAMSINK_MARKER_TICK,
/// then this is a VT_I8 containing the next possible sample time,
/// in 100ns units. May be NULL.
/// </param>
/// <param name=pvarContextValue>
/// This is an optional piece of context data that will be
//// returned to the caller as the value attached to the
//// MEStreamSinkMarker event.
//// This value is purely for the caller's use.
//// The Stream Sink should make its own copy of this PROPVARIANT.
//// May be NULL.
/// </param>
/// <returns>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has been removed and is no longer usable.
/// </para>
/// </returns>
/// <remarks>
/// Callers should call PlaceMarker with type STREAMSINK_MARKER_ENDOFSEGMENT
/// when they are done passing data to this Stream Sink.
/// All of the data waiting in the Stream Sink at the time of
/// PlaceMarker will still get handled, even if the type is
/// is STREAMSINK_MARKER_ENDOFSEGMENT..
/// This call should succeed and queue the MEStreamSinkMarker
/// event even while the Stream Sink is in a stopped or paused state
/// Even if Flush is called on the Stream Sink after a
/// PlaceMarker call but before the Stream Sink sends out the
/// MEStreamSinkMarker event, then the MEStreamSinkMarker event
/// should nevertheless get sent.
/// If the marker is of the STREAMSINK_MARKER_ENDOFSEGMENT
/// or STREAMSINK_MARKER_TICK types, then this call will likely affect
/// the behavior of the Stream Sink in some way.
/// If STREAMSINK_MARKER_DEFAULT is the type, then the Stream Sink's
/// processing of samples should not be affected.
/// </remarks>
HRESULT PlaceMarker(
[in] MFSTREAMSINK_MARKER_TYPE eMarkerType,
[in] const PROPVARIANT *pvarMarkerValue,
[in] const PROPVARIANT *pvarContextValue );
/// <summary>
/// The Flush method signals to the Stream Sink that it should
/// drop all data that has come into ProcessSample but has not
/// yet been processed.
/// </summary>
/// <returns>
/// <para>
/// MF_E_STREAM_REMOVED:
/// This Stream Sink has been removed and is no longer usable.
/// </para>
/// </returns>
/// <remarks>
/// None of the data waiting in the Stream Sink at the time
/// of Flush will get handled.
/// The call will return once all of the waiting data has been
/// successfully dropped.
/// Flush does not change the running state of the Stream Sink
/// (i.e. started, stopped, pause).
/// Since queued data gets dropped at the Flush call,
/// the result will be a glitch in the data.
/// Flush does not drop any pending events on the Stream Sink's
/// Media Event Generator. Those events will still get delivered;
/// however, they will contain the error code MF_E_STREAMSINK_FLUSHED
/// in their status HRESULTs, which will indicate that they were
/// generated after a Flush.
/// </remarks>
HRESULT Flush();
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(86cbc910-e533-4751-8e3b-f19b5b806a03),
local
]
interface IMFVideoSampleAllocator : IUnknown
{
HRESULT SetDirectXManager(
[in, unique] IUnknown* pManager);
HRESULT UninitializeSampleAllocator();
HRESULT InitializeSampleAllocator(
[in] DWORD cRequestedFrames,
[in] IMFMediaType* pMediaType);
HRESULT AllocateSample(
[out] IMFSample** ppSample);
};
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(A792CDBE-C374-4e89-8335-278E7B9956A4),
local
]
interface IMFVideoSampleAllocatorNotify : IUnknown
{
HRESULT NotifyRelease();
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(992388B4-3372-4f67-8B6F-C84C071F4751),
local
]
interface IMFVideoSampleAllocatorCallback : IUnknown
{
HRESULT SetCallback(
[in, unique] IMFVideoSampleAllocatorNotify* pNotify);
HRESULT GetFreeSampleCount(
[out] LONG* plSamples);
};
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
interface IMFTopologyNode;
/// <summary>
/// IMFTopology is provided to configure topology. The application or other MF components can create
/// the topology object via MFCreateTopology and then use the interface to configure the partial topology.
/// </summary>
[
object,
uuid(83CF873A-F6DA-4bc8-823F-BACFD55DC433),
]
interface IMFTopology : IMFAttributes
{
/// <summary>
/// It returns the identifier for the whole topology.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pID">Pointer to a variable where the identifier of the topology is returned</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetTopologyID( [out] TOPOID* pID );
/// <summary>
/// Add a node to the topology
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pNode">The pointer to the topology node to be added</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
[local]
HRESULT AddNode( [in] IMFTopologyNode* pNode );
/// <summary>
/// Remove a node from the topology
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pNode">the pointer to the topology node to be removed</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
[local]
HRESULT RemoveNode( [in] IMFTopologyNode* pNode );
/// <summary>
/// Return the count of nodes in the topology
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pwNodes">The pointer of a WORD variable where the node count will be returned.</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetNodeCount( [out] WORD* pwNodes );
/// <summary>
/// Retreives the node at position wIndex
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="wIndex">the index of the node to return</param>
/// <param name="ppNode">the node to return</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetNode( [in] WORD wIndex,
[out] IMFTopologyNode** ppNode );
/// <summary>
/// Removes all nodes
/// </summary>
/// <remarks>
/// </remarks>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
[local]
HRESULT Clear( void );
/// <summary>
/// Makes the current topology a copy of the topology passed in as pTopology
/// </summary>
/// <remarks>
/// It simplies calls IMFTopologyNode::CloneFrom on each topology node in the topology
/// </remarks>
/// <param name="pTopology">The topology to clone from</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT CloneFrom( [in] IMFTopology* pTopology );
/// <summary>
/// Finds topology node by ID
/// </summary>
/// <returns>
/// <para>
/// MF_E_NOT_FOUND:
/// No node with the specific node ID exist in the topology.
/// </para>
/// </returns>
HRESULT GetNodeByID(
[in] TOPOID qwTopoNodeID,
[out] IMFTopologyNode **ppNode );
/// <summary>
/// Used by MF components or application to discover all the source
/// nodes in current topology.
/// This is a helper function to save caller from having to enumerate
/// through the whole topology.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="ppCollection">
/// The collection of the topology source nodes
/// </param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetSourceNodeCollection(
[out] IMFCollection** ppCollection );
/// <summary>
/// Used by MF components or application to discover all the output
/// nodes.
/// This is a helper function to save caller from having to enumerate
/// through the whole topology.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="ppCollection">
/// The collection of the topology output nodes
/// </param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetOutputNodeCollection(
[out] IMFCollection** ppCollection );
};
//
// Topology attributes
//
// MF_TOPOLOGY_PROJECTSTART
// Data type: UINT64
// Indicates when in the timeline this topology is to start.
// This is given as an MFTIME value relative to the beginning of the entire
// sequence (i.e. global time).
// This attribute is required to be present if the Media Session has been
// configured with a nonzero value for MF_SESSION_GLOBAL_TIME.
// If this topology follows another topology in a sequence, this value must
// equal the MF_TOPOLOGY_PROJECTSTOP value of the previous topology.
cpp_quote( "EXTERN_GUID( MF_TOPOLOGY_PROJECTSTART, 0x7ed3f802, 0x86bb, 0x4b3f, 0xb7, 0xe4, 0x7c, 0xb4, 0x3a, 0xfd, 0x4b, 0x80);" )
// MF_TOPOLOGY_PROJECTSTOP
// Data type: UINT64
// Indicates when in the timeline this topology is to stop.
// This is given as an MFTIME value relative to the beginning of the entire
// sequence (i.e. global time).
// This attribute is required to be present if the Media Session has been
// configured with a nonzero value for MF_SESSION_GLOBAL_TIME.
cpp_quote( "EXTERN_GUID( MF_TOPOLOGY_PROJECTSTOP, 0x7ed3f803, 0x86bb, 0x4b3f, 0xb7, 0xe4, 0x7c, 0xb4, 0x3a, 0xfd, 0x4b, 0x80);" )
// MF_TOPOLOGY_NO_MARKIN_MARKOUT
// Data type: UINT32
// If present and set to a nonzero value, the Media Foundation pipeline will
// not attempt to trim the stream data to any particular markin or markout
// values.
// The default behavior of the Media Foundation pipeline is to trim stream
// data at some topology node; the node at which the trimming will occur
// is determined either by the Topology Loader or the application.
// See the MF_TOPONODE_MARKIN/MARKOUT_HERE attributes for more details
cpp_quote( "EXTERN_GUID( MF_TOPOLOGY_NO_MARKIN_MARKOUT, 0x7ed3f804, 0x86bb, 0x4b3f, 0xb7, 0xe4, 0x7c, 0xb4, 0x3a, 0xfd, 0x4b, 0x80);" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
typedef enum MFTOPOLOGY_DXVA_MODE
{
/// <summary>
/// Default DXVA handling for MF v1. The D3DManager will be set on
/// decoders inserted by the topoloader only.
/// </summary>
MFTOPOLOGY_DXVA_DEFAULT = 0,
/// <summary>
/// No DXVA. No transforms will get the D3DManager. This allows
/// software processing even on DXVA-enabled machines
/// </summary>
MFTOPOLOGY_DXVA_NONE = 1,
/// <summary>
/// Full DXVA. The D3DManager will be set on any chain of D3D-aware
/// nodes upstream from a D3D-aware renderer.
MFTOPOLOGY_DXVA_FULL = 2,
} MFTOPOLOGY_DXVA_MODE;
// MF_TOPOLOGY_DXVA_MODE
// Data type: UINT32
// Sets the DXVA mode for the topoloader, with possible options defined in
// the MFTOPOLOGY_DXVA_MODE enumeration.
// The default behavior of the Media Foundation pipeline is to enable DXVA
// at the decoder if possible and drop optional MFTs that are not D3D-aware.
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_DXVA_MODE, 0x1e8d34f6, 0xf5ab, 0x4e23, 0xbb, 0x88, 0x87, 0x4a, 0xa3, 0xa1, 0xa7, 0x4d);" )
// MF_TOPOLOGY_STATIC_PLAYBACK_OPTIMIZATIONS
// Data type: UINT32
// Enables statically optimizing the playback pipeline using WinSAT data and user power scheme preferences.
// The default behavior of the Media Foundation pipeline is not to enable this feature.
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_STATIC_PLAYBACK_OPTIMIZATIONS, 0xb86cac42, 0x41a6, 0x4b79, 0x89, 0x7a, 0x1a, 0xb0, 0xe5, 0x2b, 0x4a, 0x1b);" )
// MF_TOPOLOGY_PLAYBACK_MAX_DIMS
// Data type: UINT64 (UINT32 width /UINT32 height)
// Specifies the output window size. A missing attribute or a value of 0 indicates to use the desktop resolution.
//
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_PLAYBACK_MAX_DIMS, 0x5715cf19, 0x5768, 0x44aa, 0xad, 0x6e, 0x87, 0x21, 0xf1, 0xb0, 0xf9, 0xbb);" )
typedef enum MFTOPOLOGY_HARDWARE_MODE
{
/// <summary>
/// Default hardware handling for MF v1. Hardware MFTs will
/// not be inserted.
/// </summary>
MFTOPOLOGY_HWMODE_SOFTWARE_ONLY = 0,
/// <summary>
/// If hardware MFTs are available, the topoloader will insert
/// them. If not, the topoloader will fall back to a software
/// MFT to perform the task.
/// </summary>
MFTOPOLOGY_HWMODE_USE_HARDWARE = 1,
} MFTOPOLOGY_HARDWARE_MODE;
// MF_TOPOLOGY_HARDWARE_MODE
// Data type: UINT32
// Sets the hardware mode for the topoloader, with possible options defined in
// the MFTOPOLOGY_HARDWARE_MODE enumeration.
// The deffault behavior of the Media Foundation pipeline is to insert only
// software transforms
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_HARDWARE_MODE, 0xd2d362fd, 0x4e4f, 0x4191, 0xa5, 0x79, 0xc6, 0x18, 0xb6, 0x67, 0x6, 0xaf);" )
// MF_TOPOLOGY_PLAYBACK_FRAMERATE
// Data type: UINT32 (UINT32 numerator /UINT32 denominator)
// Specifies the monitor refresh rate
//
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_PLAYBACK_FRAMERATE, 0xc164737a, 0xc2b1, 0x4553, 0x83, 0xbb, 0x5a, 0x52, 0x60, 0x72, 0x44, 0x8f);" )
// MF_TOPOLOGY_DYNAMIC_CHANGE_NOT_ALLOWED
// Data type: BOOL (UINT32)
// Set this attribute on a topology if the topology is not allowed to change
// to re-negotiate the new media type between the nodes
// when format change happens, for example, by inserting a new video resizer or audio resampler.
// {D529950B-D484-4527-A9CD-B1909532B5B0}
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_DYNAMIC_CHANGE_NOT_ALLOWED, 0xd529950b, 0xd484, 0x4527, 0xa9, 0xcd, 0xb1, 0x90, 0x95, 0x32, 0xb5, 0xb0);" )
// MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES
// Data type: BOOL (UINT32)
// The topoloader will typically use the source's current type as-is. To allow the topoloader to enumerate all of the
// source types from a multiple format source, set this attribute to 1.
cpp_quote( "EXTERN_GUID(MF_TOPOLOGY_ENUMERATE_SOURCE_TYPES, 0x6248c36d, 0x5d0b, 0x4f40, 0xa0, 0xbb, 0xb0, 0xb3, 0x05, 0xf7, 0x76, 0x98);" )
// MF_TOPOLOGY_START_TIME_ON_PRESENTATION_SWITCH
// Data type: UINT64
// Indicates the start time that should be used on the topology during a presentation
// switch.
// This is given as an MFTIME value in HNS units
// {C8CC113F-7951-4548-AAD6-9ED6202E62B3}
cpp_quote( "EXTERN_GUID( MF_TOPOLOGY_START_TIME_ON_PRESENTATION_SWITCH, 0xc8cc113f, 0x7951, 0x4548, 0xaa, 0xd6, 0x9e, 0xd6, 0x20, 0x2e, 0x62, 0xb3);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
//
// Topology functions
//
cpp_quote( "STDAPI MFCreateTopology(" )
cpp_quote( " __out IMFTopology ** ppTopo );" )
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Topology node types
/// </summary>
typedef enum MF_TOPOLOGY_TYPE
{
/// <member name="MF_TOPOLOGY_OUTPUT_NODE">
/// It represents the output topolgy node. The object contained in the output node could be a media sink object or an sink activator object.
/// </member>
MF_TOPOLOGY_OUTPUT_NODE,
/// <member name="MF_TOPOLOGY_SOURCESTREAM_NODE">
/// It represents the source topology node. The node of this type implements IMFSourceStreamTopologyNode.
/// </member>
MF_TOPOLOGY_SOURCESTREAM_NODE,
/// <member name="MF_TOPOLOGY_TRANSFORM_NODE">
/// It represents a media foundation transform object. The node of this type contains an IMFTransform object.
/// </member>
MF_TOPOLOGY_TRANSFORM_NODE,
/// <member name="MF_TOPOLOGY_TEE_NODE">
/// represents a TEE node. It doesn't hold any real object. The node will be useful in scenarios like preview & archive.
/// </member>
MF_TOPOLOGY_TEE_NODE,
MF_TOPOLOGY_MAX = 0xffffffff
} MF_TOPOLOGY_TYPE;
/// <summary>
/// IMFTopologyNode interface.
/// Methods for configuring topology nodes
/// </summary>
[
object,
uuid(83CF873A-F6DA-4bc8-823F-BACFD55DC430),
]
interface IMFTopologyNode : IMFAttributes
{
/// <summary>
/// Allows the application to set the object pointer.
/// </summary>
/// <remarks>
///
/// Set the object associated with the node;
///
/// For MF_TOPOLOGY_TRANSFORM_NODE node, the object needs to implement IMFTransform or IMFActivate
/// For MF_TOPOLOGY_OUTPUT_NODE node, the object needs to implement IMFStreamSink or IMFActivate.
///
/// </remarks>
/// <param name="pObject">The pointer to the object that will be associated with the node</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT SetObject( [in] IUnknown* pObject );
/// <summary>
/// Allows the application to get the object pointer.
/// </summary>
/// <remarks>
///
/// Get the object associated with the node;
///
/// For MF_TOPOLOGY_TRANSFORM_NODE node, it returns the IMFTransform object. With PMP process is involved, the object we give out is a proxy of the actual object.
/// For MF_TOPOLOGY_OUTPUT_NODE node, the object it returns the object implements IMFStreamSink or IMFActivate.
///
/// </remarks>
/// <param name="ppObject">The pointer to the object that is associated with the topology node</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetObject( [out] IUnknown** ppObject );
/// <summary>
/// Returns the node type
/// </summary>
/// <remarks>
///
/// </remarks>
/// <param name="pType">pointer to a variable where the node type is returned. See MF_TOPOLOGY_TYPE for a list of topolgy node types</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetNodeType( [out] MF_TOPOLOGY_TYPE* pType );
/// <summary>
/// Return the unique identifier for the node.
/// </summary>
/// <remarks>
/// This ID is set when the topology node is created,
/// and stays the same no matter what object is set in the node<64>s SetObject.
/// This unique ID is used by the Topoloader find a node in the previous full topology for object reuse.
/// </remarks>
/// <param name="pID">pointer to a variable where TOPOID is returned</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetTopoNodeID( [out] TOPOID* pID );
/// Sets the unique identifier for the node.
/// </summary>
HRESULT SetTopoNodeID( [in] TOPOID ullTopoID );
/// <summary>
/// Return the number of inputs currently available on this topology node.
/// This might not be the same as the number of input connection of this topology node.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pcInputs">pointer to a variable where the input count is returned</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetInputCount( [out] DWORD* pcInputs );
/// <summary>
/// Return the number of outputs currently available on this topology node.
/// This might not be the same as the number of output connection of this topology node.
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="pcOutputs">pointer to a variable where the output count is returned</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT GetOutputCount( [out] DWORD* pcOutputs );
/// <summary>
/// Move to topology interface
/// Connect this node's output to another node's input.
/// If this output node stream is already connected, it is unlinked first.
/// </summary>
/// <param name="dwOutputIndex">
/// The 0-based index of the output to connect
/// </param>
/// <param name="pDownstreamNode">
/// The downstream node to which to connect
/// </param>
/// <param name="dwInputIndexOnDownstreamNode">
/// The 0-based index of the input to which to connect on
/// pDownstreamNode
/// </param>
/// <remarks>
/// Input/output index values are meant to be sequential 0-based values.
/// If a new value dwIndex is used, then new input/output connections
/// are created for that node so that connections 0 through dwIndex
/// will exist.
/// </remarks>
/// <returns>
/// </returns>
[local]
HRESULT ConnectOutput( [in] DWORD dwOutputIndex,
[in] IMFTopologyNode* pDownstreamNode,
[in] DWORD dwInputIndexOnDownstreamNode );
/// <summary>
/// Disconnects this node's output from another node's input.
/// </summary>
[local]
HRESULT DisconnectOutput( [in] DWORD dwOutputIndex );
/// <summary>
/// Query what node is connected to the given input of this node.
/// </summary>
/// <remarks>
/// Source stream nodes have no inputs and will fail this call.
/// </remarks>
/// <param name="dwInputIndex">
/// The 0-based index of the input connection to query
/// </param>
/// <param name="ppUpstreamNode">
/// Pointer to a variable that will receive the IMFTopologyNode *
/// that is connected to this input, if any
/// </param>
/// <param name="pdwOutputIndexOnUpstreamNode">
/// Pointer to a variable that will receive the 0-based index
/// of the output connection on *ppUpstreamNode, if it exists.
/// </param>
HRESULT GetInput( [in] DWORD dwInputIndex,
[out] IMFTopologyNode** ppUpstreamNode,
[out] DWORD* pdwOutputIndexOnUpstreamNode );
/// <summary>
/// Query what node is connected to the given output of this node.
/// </summary>
/// <remarks>
/// Output nodes have no outputs and will fail this call
/// </remarks>
/// <param name="dwOutputIndex">
/// The 0-based index of the output connection to query
/// </param>
/// <param name="ppDownstreamNode">
/// Pointer to a variable that will receive the IMFTopologyNode *
/// that is connected to this output, if any
/// </param>
/// <param name="pdwInputIndexOnDownstreamNode">
/// Pointer to a variable that will receive the 0-based index
/// of the input connection on *ppDownstreamNode, if it exists.
/// </param>
HRESULT GetOutput( [in] DWORD dwOutputIndex,
[out] IMFTopologyNode** ppDownstreamNode,
[out] DWORD* pdwInputIndexOnDownstreamNode );
/// <summary>
/// Set the output preferred type
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="dwOutputIndex">
/// 0-based output index.
/// </param>
/// <param name="pType">
/// Media type to set
/// </param>
/// <returns>
/// Input/output index values are meant to be sequential 0-based values.
/// If a new value dwIndex is used, then new input/output connections
/// are created for that node so that connections 0 through dwIndex
/// will exist.
/// </returns>
[local]
HRESULT SetOutputPrefType( [in] DWORD dwOutputIndex,
[in] IMFMediaType* pType );
/// <summary>
/// Get the output preferred type
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="dwOutputIndex">
/// 0-based output index
/// </param>
/// <param name="ppType">
/// Pointer to IMFMediaType* where the media type is returned
/// </param>
/// <returns>
/// If the index is out of range, we will return E_INVALIDARG.
/// </returns>
[local] HRESULT GetOutputPrefType(
[in] DWORD dwOutputIndex,
[out, annotation("__out")] IMFMediaType** ppType );
[call_as(GetOutputPrefType)] HRESULT RemoteGetOutputPrefType(
[in] DWORD dwOutputIndex,
[out] DWORD * pcbData,
[out, size_is(, *pcbData)] BYTE ** ppbData);
/// <summary>
/// Set the input preferred type
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="dwInputIndex">
/// 0-based input index
/// </param>
/// <param name="pType">
/// Specifies the media type to set
/// </param>
/// <returns>
/// <returns>
/// Input/output index values are meant to be sequential 0-based values.
/// If a new value dwIndex is used, then new input/output connections
/// are created for that node so that connections 0 through dwIndex
/// will exist.
/// </returns>
[local]
HRESULT SetInputPrefType( [in] DWORD dwInputIndex,
[in] IMFMediaType* pType );
/// <summary>
/// Get the input preferred type
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="dwInputIndex">
/// 0-based input index
/// </param>
/// <param name="ppType">
/// Pointer to a variable where the media type is returned
/// </param>
/// <returns>
/// If the index is out of range, we will return E_INVALIDARG.
/// </returns>
[local]
HRESULT GetInputPrefType( [in] DWORD dwInputIndex,
[out, annotation("__out")] IMFMediaType** ppType );
[call_as(GetInputPrefType)] HRESULT RemoteGetInputPrefType(
[in] DWORD dwInputIndex,
[out] DWORD * pcbData,
[out, size_is(, *pcbData)] BYTE ** ppbData);
/// Makes current node a copy of the node that is passed in as input
/// </summary>
/// <remarks>
/// The two nodes will share the same topology node id and underlying object pointer
/// </remarks>
/// <param name="pNode">the input node to clone from</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT CloneFrom( [in] IMFTopologyNode* pNode );
};
//
// Topology node attributes
//
//
// general node attributes (0x494bbcea, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc)
//
/// <summary>
/// Enumerated type to define when the transform at a transform node
/// is supposed to be flushed.
/// These are the possible values for the MF_TOPONODE_FLUSH attribute.
/// </summary>
typedef enum _MF_TOPONODE_FLUSH_MODE
{
/// <member name="MF_TOPONODE_FLUSH_ALWAYS">
/// Transform is to be flushed for all types of stream changes
/// (e.g. seeks, new segment, etc.)
/// </member>
MF_TOPONODE_FLUSH_ALWAYS,
/// <member name="MF_TOPONODE_FLUSH_SEEK">
/// Transform is to be flushed only when the stream is seeked
/// </member>
MF_TOPONODE_FLUSH_SEEK,
/// <member name="MF_TOPONODE_FLUSH_NEVER">
/// Transform is never to be flushed (except when we are completely done
/// with it)
/// </member>
MF_TOPONODE_FLUSH_NEVER,
} MF_TOPONODE_FLUSH_MODE;
// MF_TOPONODE_FLUSH
// Data type: UINT32
// For transform nodes, indicates under what circumstances the transform
// will be flushed at a stream change.
// If not set, then the behavior is MF_TOPONODE_FLUSH_ALWAYS.
// Value should be one of the MF_TOPONODE_FLUSH_MODE values defined.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_FLUSH, 0x494bbce8, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
/// <summary>
/// Enumerated type to define when the transform at a transform node
/// is supposed to be drained.
/// These are the possible values for the MF_TOPONODE_DRAIN attribute.
/// </summary>
typedef enum _MF_TOPONODE_DRAIN_MODE
{
/// <member name="MF_TOPONODE_DRAIN_DEFAULT">
/// Default draining behavior is to be applied:
/// At EndOfStream: drain
/// At a markout: do not drain
/// </member>
MF_TOPONODE_DRAIN_DEFAULT,
/// <member name="MF_TOPONODE_DRAIN_ALWAYS">
/// Transform is to be drained whenever a topology ends
/// </member>
MF_TOPONODE_DRAIN_ALWAYS,
/// <member name="MF_TOPONODE_DRAIN_NEVER">
/// Transform is never to be drained
/// </member>
MF_TOPONODE_DRAIN_NEVER,
} MF_TOPONODE_DRAIN_MODE;
// MF_TOPONODE_DRAIN
// Data type: UINT32
// For transform nodes, indicates whether or not to drain the transform
// at the end of topologies.
// If not set, then the behavior is as described for MF_TOPONODE_DRAIN_DEFAULT.
// Value should be one of the MF_TOPONODE_DRAIN_MODE values defined.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_DRAIN, 0x494bbce9, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_D3DAWARE
// Data type: UINT32
// If nonzero, indicates that node is D3D aware and mediaproc should not
// use default D3D logic
cpp_quote( "EXTERN_GUID( MF_TOPONODE_D3DAWARE, 0x494bbced, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPOLOGY_RESOLUTION_STATUS_FLAGS
// Data type: UINT32
// After topology resolution this value can be bitwise of MF_TOPOLOGY_RESOLUTION_STATUS_FLAGS
cpp_quote( "EXTERN_GUID( MF_TOPOLOGY_RESOLUTION_STATUS, 0x494bbcde, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_ERRORCODE
// Data type: UINT32
// Stores the error code from connection failures
cpp_quote( "EXTERN_GUID( MF_TOPONODE_ERRORCODE, 0x494bbcee, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_CONNECT_METHOD
// Data type: UINT32
// The value should be bitwise of MF_CONNECT_METHOD, describing the connect
// method topoloader should try to use for this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_CONNECT_METHOD, 0x494bbcf1, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_LOCKED
// Data type: UINT32
// When value is nonzero, indicates that the media type should not be changed,
// since the node is in use
cpp_quote( "EXTERN_GUID( MF_TOPONODE_LOCKED, 0x494bbcf7, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_WORKQUEUE_ID
// Data type: UINT32
// Work queue to use for this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_WORKQUEUE_ID, 0x494bbcf8, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_WORKQUEUE_MMCSS_CLASS
// Data type: STRING
// MMCSS class to be used for the work queue serving this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_WORKQUEUE_MMCSS_CLASS, 0x494bbcf9, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_DECRYPTOR
// Data type: UINT32
// If nonzero, indicates that the node's object is a decryptor
cpp_quote( "EXTERN_GUID( MF_TOPONODE_DECRYPTOR, 0x494bbcfa, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_DECRYPTOR
// Data type: BLOB of UINT32
// Contains array of output indexes which should be marked as discardable
cpp_quote( "EXTERN_GUID( MF_TOPONODE_DISCARDABLE, 0x494bbcfb, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_ERROR_MAJORTYPE
// Data type: GUID
// Only set when certain errors occur.
// If present, indicates the media type's major type.
// Currently, this will only be set when topology resolution fails
// due to missing codec.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_ERROR_MAJORTYPE, 0x494bbcfd, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_ERROR_SUBTYPE
// Data type: GUID
// Only set when certain errors occur.
// If present, indicates the media type's sub type.
// Currently, this will only be set when topology resolution fails
// due to missing codec.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_ERROR_SUBTYPE, 0x494bbcfe, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_WORKQUEUE_MMCSS_TASKID
// Data type: UINT32
// MMCSS TaskId to be used for the work queue serving this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_WORKQUEUE_MMCSS_TASKID, 0x494bbcff, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_MARKIN_HERE
// Data type: UINT32
// If nonzero, the Media Foundation pipeline will apply markin at this
// node.
// For resolved topologies, it is recommended that exactly one node in
// every path from a source node to an output node have this attribute
// set to a nonzero value.
// If this attribute is not present for some path, then markin will
// not occur at all on that path.
// Media Foundation's Topology Loader handles setting this attribute at
// the appropriate node.
// Note that Media Foundation does not support doing markin and markout
// at different nodes
cpp_quote( "EXTERN_GUID( MF_TOPONODE_MARKIN_HERE, 0x494bbd00, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_MARKOUT_HERE
// Data type: UINT32
// If nonzero, the Media Foundation pipeline will apply markin at this
// node.
// For resolved topologies, it is recommended that exactly one node in
// every path from a source node to an output node have this attribute
// set to a nonzero value.
// If this attribute is not present for some path, then markout will
// not occur at all on that path.
// Media Foundation's Topology Loader handles setting this attribute at
// the appropriate node.
// Note that Media Foundation does not support doing markin and markout
// at different nodes
cpp_quote( "EXTERN_GUID( MF_TOPONODE_MARKOUT_HERE, 0x494bbd01, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
// MF_TOPONODE_DECODER
// Data type: UINT32
// If nonzero, indicates that the node's object is a decoder
cpp_quote( "EXTERN_GUID( MF_TOPONODE_DECODER, 0x494bbd02, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);" )
//
// source node attributes (0x835c58ea, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6)
//
// MF_TOPONODE_MEDIASTART
// Data type: UINT64
// Indicates the start time for this segment relative to the original media.
// If not set, assumed to be whatever the current position is in that media.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_MEDIASTART, 0x835c58ea, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
// MF_TOPONODE_MEDIASTOP
// Data type: UINT64
// Indicates the stop time for this segment relative to the original media.
// If not set, segment will include the rest of this media
cpp_quote( "EXTERN_GUID( MF_TOPONODE_MEDIASTOP, 0x835c58eb, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
// MF_TOPONODE_SOURCE
// Data type: IUNKNOWN
// Pointer to the IMFMediaSource associated with this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_SOURCE, 0x835c58ec, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
// MF_TOPONODE_PRESENTATION_DESCRIPTOR
// Data type: IUNKNOWN
// Pointer to the IMFPresentationDescriptor for the Media Source
// associated with this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_PRESENTATION_DESCRIPTOR, 0x835c58ed, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
// MF_TOPONODE_STREAM_DESCRIPTOR
// Data type: IUNKNOWN
// Pointer to the IMFStreamDescriptor from the Presentation Desciptor of
// the Media Source associated with this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_STREAM_DESCRIPTOR, 0x835c58ee, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
// MF_TOPONODE_SEQUENCE_ELEMENTID
// Data type: UINT32
// Media Sources that provide topologies should set this on source nodes
// to indicate which element this topology belongs to.
// Two topologies that have the same value for this attribute on their
// source nodes are really the "same" segment (i.e. time will be continuous
// on all nodes between them).
// In the MF Sequencer Source, this corresponds to the MFSequencerElementId
// associated with the topology.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_SEQUENCE_ELEMENTID, 0x835c58ef, 0xe075, 0x4bc7, 0xbc, 0xba, 0x4d, 0xe0, 0x00, 0xdf, 0x9a, 0xe6);" )
//
// transform node attributes (0x88DCC0C9, 0x293E, 0x4e8b, 0x9A, 0xEB, 0x0A, 0xD6, 0x4C, 0xC0, 0x16, 0xB0)
//
// MF_TOPONODE_TRANSFORM_OBJECTID
// Data type: GUID
// CLSID of the transform for this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_TRANSFORM_OBJECTID, 0x88dcc0c9, 0x293e, 0x4e8b, 0x9a, 0xeb, 0xa, 0xd6, 0x4c, 0xc0, 0x16, 0xb0);" )
//
// output node attributes (0x14932f9b, 0x9087, 0x4bb4, 0x84, 0x12, 0x51, 0x67, 0x14, 0x5c, 0xbe, 0x04)
//
// MF_TOPONODE_STREAMID
// Data type: UINT32
// Indicates Stream Sink ID of the Stream Sink associated with this node
cpp_quote( "EXTERN_GUID( MF_TOPONODE_STREAMID, 0x14932f9b, 0x9087, 0x4bb4, 0x84, 0x12, 0x51, 0x67, 0x14, 0x5c, 0xbe, 0x04);" )
// MF_TOPONODE_NOSHUTDOWN_ON_REMOVE
// Data type: UINT32
// If nonzero, indicates that the Media Session should not shut down the
// Media Sink associated with this node when the Media Sink no longer appears
// in the topology. By default, the Media Session will shut this sink down.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, 0x14932f9c, 0x9087, 0x4bb4, 0x84, 0x12, 0x51, 0x67, 0x14, 0x5c, 0xbe, 0x04);" )
// MF_TOPONODE_RATELESS
// Data type: UINT32
// If nonzero, indicates that the Media Sink associated with this node is
// rateless. In this case, the Media Sink will be treated as a rateless sink,
// regardless of whether or not it sets the MEDIASINK_RATELESS characteristic
// If not set, Media Sink is assumed not to be rateless.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_RATELESS, 0x14932f9d, 0x9087, 0x4bb4, 0x84, 0x12, 0x51, 0x67, 0x14, 0x5c, 0xbe, 0x04);" )
// MF_TOPONODE_DISABLE_PREROLL
// Data type: UINT32
// If nonzero, indicates that this output should not be prerolled, regardless
// of whether the associated Media Sink supports prerolling.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_DISABLE_PREROLL, 0x14932f9e, 0x9087, 0x4bb4, 0x84, 0x12, 0x51, 0x67, 0x14, 0x5c, 0xbe, 0x04);" )
//
// tee node attributes (0x6304ef99, 0x16b2, 0x4ebe, 0x9d, 0x67, 0xe4, 0xc5, 0x39, 0xb3, 0xa2, 0x59)
//
// MF_TOPONODE_PRIMARYOUTPUT
// Data type: UINT32
// 0-based output connection index. Indicates which output is the "primary
// output", which indicates which of the output streams the pipeline
// should wait to get a request on before it can process the request
// from the remaining outputs.
cpp_quote( "EXTERN_GUID( MF_TOPONODE_PRIMARYOUTPUT, 0x6304ef99, 0x16b2, 0x4ebe, 0x9d, 0x67, 0xe4, 0xc5, 0x39, 0xb3, 0xa2, 0x59);" )
//
// Topology node functions
//
cpp_quote( "STDAPI MFCreateTopologyNode(" )
cpp_quote( " MF_TOPOLOGY_TYPE NodeType," )
cpp_quote( " __out IMFTopologyNode ** ppNode );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Gets the current media type set on a given input or output on the given topology node
/// </summary>
/// <param name="pNode">the input node to get the type from</param>
/// <param name="dwStreamIndex">the stream index of the stream to get the type from</param>
/// <param name="fOutput">TRUE to get an output stream type; FALSE for an input stream</param>
/// <param name="ppType">receives the media type from the node</param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
cpp_quote( "STDAPI MFGetTopoNodeCurrentType(" )
cpp_quote( " IMFTopologyNode* pNode," )
cpp_quote( " DWORD dwStreamIndex," )
cpp_quote( " BOOL fOutput," )
cpp_quote( " __deref_out IMFMediaType** ppType);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(fa993888-4383-415a-a930-dd472a8cf6f7)
]
/// <summary>
/// Queries an object for a specified service interface.
/// A service is an interface that is exposed by one object but might be
/// implemented by another object. The GetService method is equivalent
/// to QueryInterface, with the following difference: when QueryInterface
/// retrieves a pointer to an interface, it is guaranteed that you can query
/// the returned interface and get back the original interface. The
/// GetService method does not make this guarantee, because the retrieved
/// interface might be implemented by a separate object.
/// </summary>
interface IMFGetService : IUnknown
{
/// <summary>
/// Retrieves a service interface.
/// </summary>
/// <param name="guidService">
/// The service identifier (SID) of the service.
/// </param>
/// <param name="riid">
/// The interface identifier (IID) of the interface being requested.
/// </param>
/// <param name="ppvObject">
/// Receives the interface pointer. The caller must release the interface.
/// </param>
/// <returns>
/// If the method succeeds it returns S_OK. If the component does not
/// support the service it returns MF_E_UNSUPPORTED_SERVICE.
/// </returns>
/// <remarks>
/// Objects which implement IMFGetService should check to see that the
/// REFIID is requested for the right service GUID.
/// </remarks>
HRESULT GetService(
[in] REFGUID guidService,
[in] REFIID riid,
[out, iid_is(riid)] LPVOID* ppvObject
);
}
cpp_quote( "STDAPI MFGetService(" )
cpp_quote( " IUnknown* punkObject," )
cpp_quote( " REFGUID guidService," )
cpp_quote( " REFIID riid," )
cpp_quote( " __out LPVOID* ppvObject" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// MFTIME is the type used to describe time in Media Foundation.
/// It is in 100ns units.
/// </summary>
typedef LONGLONG MFTIME;
/// <summary>
/// Bit flags for the clock characteristics returned by
/// IMFClock::GetClockCharacteristics
/// </summary>
typedef enum _MFCLOCK_CHARACTERISTICS_FLAGS
{
/// <member name="MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ">
/// If set, clock times given in IMFClock::GetCorrelatedTime
/// are in standard MFTIME (100ns) units.
/// The dwClockFrequency member of the MFCLOCK_PROPERTIES structure
/// returned from IMFClock::GetProperties must be set to
/// MFCLOCK_FREQUENCY_HNS in this case.
/// </member>
MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ = 0x2,
/// <member name="MFCLOCK_CHARACTERISTICS_FLAG_ALWAYS_RUNNING">
/// If set, the clock will always be in the MFCLOCK_STATE_RUNNING
/// state.
/// </member>
MFCLOCK_CHARACTERISTICS_FLAG_ALWAYS_RUNNING = 0x4,
/// <member name="MFCLOCK_CHARACTERISTICS_FLAG_IS_SYSTEM_CLOCK">
/// If set, then this clock is running according to system time.
/// Therefore, the clock time returned from
/// IMFClock::GetCorrelation can be used without any further
/// calculations.
/// </member>
MFCLOCK_CHARACTERISTICS_FLAG_IS_SYSTEM_CLOCK = 0x8
} MFCLOCK_CHARACTERISTICS_FLAGS;
/// <summary>
/// Enumerated type describing the state of a clock.
/// Obtained from IMFClock::GetState.
/// </summary>
typedef enum _MFCLOCK_STATE
{
/// <member name="MFCLOCK_STATE_INVALID">
/// Clock is currently invalid.
/// If the clock uses an underlying device, this could mean that
/// there is no device.
/// </member>
MFCLOCK_STATE_INVALID,
/// <member name="MFCLOCK_STATE_RUNNING">
/// Clock is currently running (started).
/// </member>
MFCLOCK_STATE_RUNNING,
/// <member name="MFCLOCK_STATE_STOPPED">
/// Clock is currently stopped and reporting a time of 0.
/// </member>
MFCLOCK_STATE_STOPPED,
/// <member name="MFCLOCK_STATE_PAUSED">
/// Clock is currently paused, and the time it reports is frozen.
/// </member>
MFCLOCK_STATE_PAUSED
} MFCLOCK_STATE;
/// <summary>
/// Bit flags for the dwClockFlags member of MFCLOCK_PROPERTIES
/// </summary>
typedef enum _MFCLOCK_RELATIONAL_FLAGS
{
/// <member name="MFCLOCK_RELATIONAL_FLAG_JITTER_NEVER_AHEAD">
/// If set, this bit indicates that jitter values are always negative.
/// That is, the clock time returned by IMFClock::GetCorrelatedTime()
/// will never jitter to times ahead; only to times behind.
/// </member>
MFCLOCK_RELATIONAL_FLAG_JITTER_NEVER_AHEAD = 0x1
} MFCLOCK_RELATIONAL_FLAGS;
/// <summary>
/// Properties structure describing how the clock retrieves and reports
/// time.
/// Obtained from IMFClock::GetProperties
/// </summary>
typedef struct _MFCLOCK_PROPERTIES
{
/// <member name="qwCorrelationRate">
/// The nominal rate at which the clock is correlated to MF system time.
/// A value of 0 means that the correlation is made during the
/// IMFClock::GetCorrelatedTime call.
/// </member>
unsigned __int64 qwCorrelationRate;
/// <member name="guidClockId">
/// Uniquely identifies the clocking device (source crystal).
/// If two clocks have the same guidClockId, then they are based
/// on the same clocking device.
/// A value of GUID_NULL indicates that this clock is not similar
/// to any other clock.
/// </member>
GUID guidClockId;
/// <member name="dwClockFlags">
/// Bit flags describing this clock.
/// See enumerated type MFCLOCK_RELATIONAL_FLAGS.
/// </member>
DWORD dwClockFlags;
/// <member name="qwClockFrequency">
/// Fixed frequency in Hz at which the clock operates.
/// A value of MFCLOCK_FREQUENCY_HNS means that the clock has
/// a frequency of 10MHz, which is standard MFTIME units (100ns).
/// If the bit flag MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ
/// is set in the characteristics returned by
/// IMFClock::GetClockCharacteristics, then this value must be equal
/// to MFCLOCK_FREQUENCY_HNS.
/// </member>
unsigned __int64 qwClockFrequency;
/// <member name="dwClockTolerance">
/// Amount of inaccuracy in parts-per-billion that may be present
/// on the clock.
/// Implementations that do not know the clock tolerance should
/// set this value to MFCLOCK_TOLERANCE_UNKNOWN, which is the
/// value typical in crystal specifications.
/// </member>
DWORD dwClockTolerance;
/// <member name="dwClockJitter">
/// Amount of jitter in 100ns units that may be present on this
/// clock due to sampling (this does not include the inaccuracies
/// accounted for in dwClockTolerance).
/// For single-device clocks, this is the inverse of frequency.
/// For frequencies greater than or equal to 10MHz on single-device
/// clocks, this value should be 1.
/// When this clock belongs to a capture device that is not directly
/// timestamping the incoming data, the correlation cannot be made
/// until the driver's interrupt service routine runs.
/// If this is the case,
/// then these values should be included in the expected jitter:
/// <para>
/// MFCLOCK_JITTER_ISR:
/// Jitter due to timestamping during
/// the device driver's interrupt service routine.
/// </para>
/// <para>
/// MFCLOCK_JITTER_DPC:
/// Jitter due to timestampind during
/// the device driver's deferred procedure call processing.
/// </para>
/// <para>
/// MFCLOCK_JITTER_PASSIVE:
/// Jitter due to dropping to
/// passive level (normal thread execution) before timestamping.
/// </para>
/// </member>
DWORD dwClockJitter;
} MFCLOCK_PROPERTIES;
/// <summary>
/// Constants used in MFCLOCK_PROPERTIES fields.
/// See CMFCLOCK_PROPERTIES comments.
/// </summary>
cpp_quote( "#define MFCLOCK_FREQUENCY_HNS 10000000" )
cpp_quote( "#define MFCLOCK_TOLERANCE_UNKNOWN 50000" )
cpp_quote( "#define MFCLOCK_JITTER_ISR 1000" )
cpp_quote( "#define MFCLOCK_JITTER_DPC 4000" )
cpp_quote( "#define MFCLOCK_JITTER_PASSIVE 10000" )
[
object,
uuid(2eb1e945-18b8-4139-9b1a-d5d584818530),
]
/// <summary>
/// IMFClock is the basic interface for any object providing a time.
/// </summary>
interface IMFClock : IUnknown
{
/// <summary>
/// Gets the characteristics of this clock.
/// </summary>
/// <param name="pdwCharacteristics">
/// Pointer to a variable that will receive the
/// MFCLOCK_CHARACTERISTICS_FLAGS bit flags.
/// </param>
HRESULT GetClockCharacteristics(
[out] DWORD *pdwCharacteristics );
/// <summary>
/// Gets the last known clock time, as correlated to MF system time
/// (QueryPerformanceCounter time).
/// </summary>
/// <param name="dwReserved">
/// Reserved: Must be 0.
/// </param>
/// <param name="pllClockTime">
/// Pointer to a variable that will be set to the clock time,
/// in clock's frequency units, at the last
/// correlation to system time.
/// </param>
/// <param name="phnsSystemTime">
/// Pointer to a variable that will be set to the system time
/// in 100ns units at which the clock was at *pllClockTime.
/// </param>
/// <remarks>
/// Clock providers should make this correlation as accurate
/// as possible by raising the driver to the highest IRQL
/// level to sample device time and system time.
/// </remarks>
HRESULT GetCorrelatedTime(
[in] DWORD dwReserved,
[out] LONGLONG *pllClockTime,
[out] MFTIME *phnsSystemTime );
/// <summary>
/// IMFClock::GetContinuityKey is not used in this version of
/// Media Foundation. Clocks must return 0 in *pdwContinuityKey.
/// </summary>
HRESULT GetContinuityKey(
[out] DWORD *pdwContinuityKey );
/// <summary>
/// Gets the current state of the clock.
/// </summary>
/// <param name="dwReserved">
/// Reserved: Must be 0.
/// </param>
/// <param name="peClockState">
/// Pointer to a variable that will receive the current state
/// of the clock.
/// </param>
HRESULT GetState(
[in] DWORD dwReserved,
[out] MFCLOCK_STATE *peClockState );
/// <summary>
/// Retrieves advanced properties of the clock.
/// </summary>
/// <param name="pClockProperties">
/// Pointer to an MFCLOCK_PROPERTIES that will be filled in
/// with the advanced properties of this clock.
/// </param>
/// <remark>
/// Please see comments for MFCLOCK_PROPERTIES structure to see
/// what information can be obtained through the properties.
/// </remark>
HRESULT GetProperties(
[out] MFCLOCK_PROPERTIES *pClockProperties );
};
/// <summary>
/// Retrieves the current MF system time
/// </summary>
/// <returns>
/// Return value is the current MF system time in 100ns units
/// </returns>
cpp_quote( "STDAPI_(MFTIME) " )
cpp_quote( "MFGetSystemTime(" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// PRESENTATION_CURRENT_POSITION generally means "now".
/// For example, when used as the clock time in a Start call, it means to
/// start at the current position without seeking.
/// </summary>
cpp_quote( "#define PRESENTATION_CURRENT_POSITION 0x7fffffffffffffff" )
interface IMFClockStateSink;
interface IMFPresentationTimeSource;
[
object,
uuid(868CE85C-8EA9-4f55-AB82-B009A910A805),
]
/// <summary>
/// IMFPresentationClock is implemented by the Presentation Clock.
/// The caller can specify the Presentation Time Source from which
/// this clock is to read time.
/// There are also methods to control the state of the clock, as
/// well as methods for subscribing and unsubscribing to clock state
/// change notifications.
/// Timers can be set on the Presentation Clock by QIing for
/// IMFTimer.
/// The rate of the Presentation Clock can be set and queried by
/// QIing the Presentation Clock for IMFRateControl.
/// </summary>
interface IMFPresentationClock : IMFClock
{
/// <summary>
/// Sets the Presentation Time Source from which this Presentation
/// Clock will read its time.
/// </summary>
/// <param name="pTimeSource">
/// Pointer to a Presentation Time Source to be used by this
/// Presentation Clock.
/// </param>
/// <remarks>
/// <para>
/// pTimeSource must QI for IMFClock. All time queries on the
/// Presentation Clock are forwarded to the Presentation Time
/// Source.
/// </para>
/// <para>
/// A Presentation Time Source must be set in order for
/// the Presentation Clock to operate.
/// </para>
/// <para>
/// Note that the Presentation Clock will subscribe pTimeSource
/// as a Clock State Sink so that pTimeSource will receive
/// state change notifications. The Presentation Time Source
/// will receive these notifications synchronously as the clock
/// state change is happening; this is not necessarily true
/// for other Clock State Sinks.
/// </para>
/// </remarks>
HRESULT SetTimeSource(
[in] IMFPresentationTimeSource* pTimeSource
);
/// <summary>
/// Gets the Presentation Time Source currently in use by this
/// Presentation Clock
/// </summary>
/// <param name="ppTimeSource>
/// Pointer to a variable that will receive a pointer to the current
/// Presentation Time Source
/// </param>
HRESULT GetTimeSource(
[out] IMFPresentationTimeSource** ppTimeSource
);
/// <summary>
/// GetTime is a helper that retrieves the latest clock time
/// in 100ns units for Presentation Clocks with simple Presentation
/// Time Sources.
/// </summary>
/// <param name="phnsClockTime">
/// Pointer to a variable that will receive the latest clock time
/// </param>
/// <returns>
/// <para>
/// MF_E_CLOCK_NOT_SIMPLE:
/// MFGetClockTime cannot read the time on the clock because
/// the clock uses more advanced features. See remarks
/// for what kinds of clocks are handled by GetTime.
/// If this error code is returned, then time should be obtained
/// via IMFClock::GetCorrelatedTime() instead.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// GetTime handles only "simple" clocks. That is, clocks
/// must have a frequency of 10MHz. For more advanced clocks,
/// IMFClock::GetCorrelatedTime() should be used.
/// </para>
/// <para>
/// GetTime makes no attempt to smooth out jitter or
/// otherwise account for any inaccuracies in the clock time.
/// It simply estimates the current clock time based on the system
/// time in the latest correlation (as given by
/// IMFClock::GetCorrelatedTime) and the system time now.
/// Callers wishing to get better information about the clock time
/// should use IMFClock::GetCorrelatedTime along with the properties
/// returned by IMFClock::GetProperties.
/// </para>
/// </remarks>
HRESULT GetTime(
[out] MFTIME *phnsClockTime
);
/// <summary>
/// Subscribes an object to receive clock state change notifications
/// </summary>
/// <param name="pStateSink">
/// Pointer to the Clock State Sink to be subscribed.
/// </param>
/// <remarks>
/// <para>
/// The Clock State Sink will be asynchronously notified of
/// the current state of the Presentation Clock after it is
/// added.
/// </para>
/// <para>
/// See comments on IMFClockStateSink::OnClockStart for
/// more info on how Clock State Sinks are notified of state
/// changes.
/// </para>
/// </remarks>
HRESULT AddClockStateSink(
[in] IMFClockStateSink* pStateSink
);
/// <summary>
/// Unsubscribes an object from receiving clock state change
/// notifications.
/// </summary>
/// <param name="pStateSink">
/// Pointer to the Clock State Sink to be unsubscribed.
/// </param>
HRESULT RemoveClockStateSink(
[in] IMFClockStateSink* pStateSink
);
/// <summary>
/// Starts the Presentation Clock so that it starts running from the
/// specified clock offset.
/// </summary>
/// <param name="llClockStartOffset">
/// Clock time from which the clock should start running.
/// ullClockStartOffset is given in the units of the clock's frequency.
/// Please see comments on the MF_CLOCK_PROPERTIES structure returned
/// from IMFClock::GetProperties.
/// A value of PRESENTATION_CURRENT_POSITION indicates that the
/// clock should start running from wherever it is right now;
/// this value is used to resume from the paused state.
/// </param>
/// <remarks>
/// <para>
/// The Presentation Clock will synchronously call OnClockStart on
/// the Presentation Time Source and will proceed with the state
/// change only if that call succeeds. All other subscribed Clock
/// State Sinks will be notified of the state change asynchronously.
/// </para>
/// </remarks>
HRESULT Start(
[in] LONGLONG llClockStartOffset
);
/// <summary>
/// Stops the Presentation Clock.
/// </summary>
/// <remarks>
/// <para>
/// The Presentation Clock will synchronously call OnClockStop on
/// the Presentation Time Source and will proceed with the state
/// change only if that call succeeds. All other subscribed Clock
/// State Sinks will be notified of the state change asynchronously.
/// </para>
/// </remarks>
HRESULT Stop(
);
/// <summary>
/// Pauses the Presentation Clock.
/// </summary>
/// <remarks>
/// <para>
/// The Presentation Clock will synchronously call OnClockPause on
/// the Presentation Time Source and will proceed with the state
/// change only if that call succeeds. All other subscribed Clock
/// State Sinks will be notified of the state change asynchronously.
/// </para>
/// </remarks>
HRESULT Pause(
);
}
/// <summary>
/// Creates a Presentation Clock object
/// </summary>
/// <param name="ppPresentationClock">
/// Pointer to a variable that will receive a pointer to the Presentation
/// Clock
/// </param>
/// <remarks>
/// *ppPresentationClock must be given a valid Presentation Time Source
/// before it will work.
/// </remarks>
cpp_quote( "STDAPI MFCreatePresentationClock(" )
cpp_quote( " __out IMFPresentationClock** ppPresentationClock" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(7FF12CCE-F76F-41c2-863B-1666C8E5E139),
]
/// <summary>
/// IMFPresentationTimeSource is the interface that an object implements
/// in order to be able to provide presentation time to the Presentation
/// Clock. Objects implementing IMFPresentationTimeSource must QI
/// for IMFClock and IMFClockStateSink.
/// </summary>
interface IMFPresentationTimeSource : IMFClock
{
/// <summary>
/// GetUnderlyingClock gets the always-running clock that drives
/// this Presentation Time Source
/// </summary>
/// <param name="ppClock">
/// Pointer to a variable that will receive a pointer to the
/// underlying clock for this Presentation Time Source
/// </param>
/// <returns>
/// <para>
/// MF_E_NO_CLOCK:
/// There is no underlying clock
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The underlying clock is useful to components in the
/// pipeline that want to make decisions based on the speed
/// at which the Presentation Clock will run, and they want
/// to observe that speed even when the Presentation Clock is
/// stopped or paused. (For example, some Media Sources
/// implement IMFPresentationClockClient for this purpose).
/// </para>
/// <para>
/// The underlying clock is required to be always running,
/// regardless of the state (started/stopped/paused) of the
/// Presentation Time Source. That is, the underlying clock
/// must set the bit MFCLOCK_CHARACTERISTICS_FLAG_ALWAYS_RUNNING
/// in IMFClock::GetClockCharacteristics, even though this
/// Presentation Time Source will not set that bit.
/// </para>
/// <para>
/// Returning an underlying clock is optional. If there is
/// no such clock, implementations will return MF_E_NO_CLOCK.
/// </para>
/// </remarks>
HRESULT GetUnderlyingClock(
[out] IMFClock** ppClock
);
}
/// <summary>
/// Creates a Presentation Time Source that returns system time
/// </summary>
/// <param name="ppSystemTimeSource">
/// Pointer to a variable that will receive a pointer to a
/// Presentation Time Source based on system time
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateSystemTimeSource(" )
cpp_quote( " __out IMFPresentationTimeSource** ppSystemTimeSource" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(F6696E82-74F7-4f3d-A178-8A5E09C3659F),
]
/// <summary>
/// The IMFClockStateSink interface is implemented by any object
/// that wishes to subscribe to clock state notifications from a
/// Presentation Clock.
/// In particular, all Presentation Time Sources are Clock State Sinks.
/// </summary>
interface IMFClockStateSink : IUnknown
{
/// <summary>
/// OnClockStart is called when the Presentation Clock has been started
/// </summary>
/// <param name="hnsSystemTime">
/// The MF system time, given in 100ns units, at which the clock
/// started running.
/// </param>
/// <param name="llClockStartOffset">
/// Clock time, given in the clock's frequency units, from which
/// the clock started running.
/// </param>
/// <remarks>
/// <para>
/// If the Clock State Sink is the Presentation Time Source
/// currently being used by the Presentation Clock, then
/// the Presentation Clock makes these state change notification
/// calls synchronously from the IMFPresentationClock::Start,
/// Stop, and Pause calls. In this case, any failure code
/// returned from this method will result in an error being
/// returned to the caller of the Presentation Clock, and the state
/// change will not take place.
/// </para>
/// <para>
/// If the Clock State Sink is not the Presentation Time Source
/// currently in use, then these state change notification calls
/// are made asynchronously after the fact. Error codes returned
/// are ignored.
/// </para>
/// <para>
/// hnsSystemTime should be in the very recent past.
/// </para>
/// </remarks>
HRESULT OnClockStart(
[in] MFTIME hnsSystemTime,
[in] LONGLONG llClockStartOffset
);
/// <summary>
/// OnClockStop is called when the Presentation Clock has been stopped
/// </summary>
/// <param name="hnsSystemTime">
/// The MF system time, given in 100ns units, at which the clock
/// stopped.
/// </param>
/// <remarks>
/// <para>
/// If the Clock State Sink is the Presentation Time Source
/// currently being used by the Presentation Clock, then
/// the Presentation Clock makes these state change notification
/// calls synchronously from the IMFPresentationClock::Start,
/// Stop, and Pause calls. In this case, any failure code
/// returned from this method will result in an error being
/// returned to the caller of the Presentation Clock, and the state
/// change will not take place.
/// </para>
/// <para>
/// If the Clock State Sink is not the Presentation Time Source
/// currently in use, then these state change notification calls
/// are made asynchronously after the fact. Error codes returned
/// are ignored.
/// </para>
/// <para>
/// hnsSystemTime should be in the very recent past.
/// </para>
/// </remarks>
HRESULT OnClockStop(
[in] MFTIME hnsSystemTime
);
/// <summary>
/// OnClockPause is called when the Presentation Clock has been paused
/// </summary>
/// <param name="hnsSystemTime">
/// The MF system time, given in 100ns units, at which the clock
/// paused.
/// </param>
/// <remarks>
/// <para>
/// If the Clock State Sink is the Presentation Time Source
/// currently being used by the Presentation Clock, then
/// the Presentation Clock makes these state change notification
/// calls synchronously from the IMFPresentationClock::Start,
/// Stop, and Pause calls. In this case, any failure code
/// returned from this method will result in an error being
/// returned to the caller of the Presentation Clock, and the state
/// change will not take place.
/// </para>
/// <para>
/// If the Clock State Sink is not the Presentation Time Source
/// currently in use, then these state change notification calls
/// are made asynchronously after the fact. Error codes returned
/// are ignored.
/// </para>
/// <para>
/// hnsSystemTime should be in the very recent past.
/// </para>
/// </remarks>
HRESULT OnClockPause(
[in] MFTIME hnsSystemTime
);
/// <summary>
/// OnClockRestart is called when the Presentation Clock has been
/// restarted from the paused state.
/// </summary>
/// <param name="hnsSystemTime">
/// The MF system time, given in 100ns units, at which the clock
/// restarted.
/// </param>
/// <remarks>
/// <para>
/// If the Clock State Sink is the Presentation Time Source
/// currently being used by the Presentation Clock, then
/// the Presentation Clock makes these state change notification
/// calls synchronously from the IMFPresentationClock::Start,
/// Stop, and Pause calls. In this case, any failure code
/// returned from this method will result in an error being
/// returned to the caller of the Presentation Clock, and the state
/// change will not take place.
/// </para>
/// <para>
/// If the Clock State Sink is not the Presentation Time Source
/// currently in use, then these state change notification calls
/// are made asynchronously after the fact. Error codes returned
/// are ignored.
/// </para>
/// <para>
/// hnsSystemTime should be in the very recent past.
/// </para>
/// </remarks>
HRESULT OnClockRestart(
[in] MFTIME hnsSystemTime
);
/// <summary>
/// OnClockSetRate is called when the rate has been changed on the
/// PresentationClock.
/// </summary>
/// <param name="hnsSystemTime">
/// The MF system time, given in 100ns units, at which the clock
/// changed rates.
/// </param>
/// <param name="flRate>
/// The new rate
/// </param>
/// <remarks>
/// <para>
/// If the Clock State Sink is the Presentation Time Source
/// currently being used by the Presentation Clock, then
/// the Presentation Clock makes these rate change notification
/// calls synchronously from the IMFRateControl::SetRate call
/// on the Presentation Clock. In this case, any failure code
/// returned from this method will result in an error being
/// returned to the caller of the Presentation Clock, and the rate
/// change will not take place.
/// </para>
/// <para>
/// If the Clock State Sink is not the Presentation Time Source
/// currently in use, then these rate change notification calls
/// are made asynchronously after the fact. Error codes returned
/// are ignored.
/// </para>
/// </remarks>
HRESULT OnClockSetRate(
[in] MFTIME hnsSystemTime,
[in] float flRate
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation presentation primitives
//
///////////////////////////////////////////////////////////////////////////////
// MF_PD_PMPHOST_CONTEXT
// Data type: IUnknown
// Used by PMPHost to store app PD in the remote PD
// {6C990D31-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_PMPHOST_CONTEXT, 0x6c990d31, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_APP_CONTEXT
// Data type: IUnknown
// Used by IMFMediaSource proxy code to store remote PD in the AppSource PD
// {6C990D32-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_APP_CONTEXT, 0x6c990d32, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_DURATION
// Data type: int64
// Duration in 100ns units of the presentation. This attribute is optional.
// {6C990D33-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_DURATION, 0x6c990d33, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_TOTAL_FILE_SIZE
// Data type: UINT64
// Total file size in bytes of the presentation. This attributes is optional.
// {6C990D34-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_TOTAL_FILE_SIZE, 0x6c990d34, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_AUDIO_ENCODING_BITRATE
// Data type: UINT32
// Encoding bitrate for audio in this presentation.
// This attributes is optional and is absent for formats such as ASF that have
// more complex bitrate reporting.
// {6C990D35-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_AUDIO_ENCODING_BITRATE, 0x6c990d35, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_VIDEO_ENCODING_BITRATE
// Data type: UINT32
// Encoding bitrate for video in this presentation.
// This attributes is optional and is absent for formats such as ASF that have
// more complex bitrate reporting.
// {6C990D36-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_VIDEO_ENCODING_BITRATE, 0x6c990d36, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_MIME_TYPE
// Data type: string
// Used by IMFMediaSource to store the mime type of the content opened by the source.
// {6C990D37-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_MIME_TYPE, 0x6c990d37, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_LAST_MODIFIED_TIME
// Type: BLOB
// The format of this blob is given by the FILETIME structure.
// It specifies the time the presentation was last modified. This attribute is optional.
// {6C990D38-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID(MF_PD_LAST_MODIFIED_TIME, 0x6c990d38, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
// MF_PD_PLAYBACK_ELEMENT_ID
// Type: UINT32
// This attribute may be present on the IMFPresentationDescriptor *
// accompanying an MENewPresentation event. Please see comments on
// MENewPresentation for an explanation of this attribute.
// {6C990D39-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID(MF_PD_PLAYBACK_ELEMENT_ID, 0x6c990d39, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_PREFERRED_LANGUAGE
// Data type: string
// Used by application to set preferred language( RFC1766) to sources ( such as network sources ). This attribute is optional.
// {6C990D3A-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID( MF_PD_PREFERRED_LANGUAGE, 0x6c990d3A, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_PLAYBACK_BOUNDARY_TIME
// Type: UINT64
// This attribute may be present on the IMFPresentationDescriptor *
// accompanying an MENewPresentation event. Please see comments on
// MENewPresentation for an explanation of this attribute.
// {6C990D3B-BB8E-477a-8598-0D5D96FCD88A}
cpp_quote( "EXTERN_GUID(MF_PD_PLAYBACK_BOUNDARY_TIME, 0x6c990d3b, 0xbb8e, 0x477a, 0x85, 0x98, 0xd, 0x5d, 0x96, 0xfc, 0xd8, 0x8a );" )
// MF_PD_AUDIO_ISVARIABLEBITRATE
// Type: UINT32 (boolean)
// Used by media source to indicate the audio stream(s) in this presentation are variable bitrate. This attribute is optional.
// {33026ee0-e387-4582-ae0a-34a2ad3baa18}
cpp_quote( "EXTERN_GUID( MF_PD_AUDIO_ISVARIABLEBITRATE, 0x33026ee0, 0xe387, 0x4582, 0xae, 0x0a, 0x34, 0xa2, 0xad, 0x3b, 0xaa, 0x18 );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
[
object,
uuid(03cb2711-24d7-4db6-a17f-f3a7a479a536),
]
interface IMFPresentationDescriptor : IMFAttributes
{
HRESULT GetStreamDescriptorCount(
[out] DWORD* pdwDescriptorCount
);
HRESULT GetStreamDescriptorByIndex(
[in] DWORD dwIndex,
[out] BOOL* pfSelected,
[out] IMFStreamDescriptor** ppDescriptor
);
HRESULT SelectStream(
[in] DWORD dwDescriptorIndex
);
HRESULT DeselectStream(
[in] DWORD dwDescriptorIndex
);
HRESULT Clone(
[out] IMFPresentationDescriptor** ppPresentationDescriptor
);
}
//
// Instantiates the Media Foundation-provided implementation of
// IMFPresentationDescriptor.
// The IMFStreamDescriptors in the apStreamDescriptors array should be the
// MF implementations.
//
cpp_quote( "STDAPI MFCreatePresentationDescriptor(" )
cpp_quote( " DWORD cStreamDescriptors," )
cpp_quote( " __in_ecount_opt( cStreamDescriptors ) IMFStreamDescriptor** apStreamDescriptors," )
cpp_quote( " __deref_out IMFPresentationDescriptor** ppPresentationDescriptor" )
cpp_quote( " );" )
cpp_quote("")
//
// Given an IMFPresentationDescriptor, determines whether this presentation
// requires that it be played in the Media Foundation Protected Environment.
//
cpp_quote("STDAPI MFRequireProtectedEnvironment(")
cpp_quote(" __in IMFPresentationDescriptor* pPresentationDescriptor")
cpp_quote(" );")
cpp_quote("")
//
// Functions to serialize and deserialize a Presentation Descriptor
//
cpp_quote( "STDAPI MFSerializePresentationDescriptor(" )
cpp_quote( " __in IMFPresentationDescriptor * pPD,")
cpp_quote( " __out DWORD * pcbData," )
cpp_quote( " __deref_out_bcount_full(*pcbData) BYTE ** ppbData);" )
cpp_quote("")
cpp_quote( "STDAPI MFDeserializePresentationDescriptor(" )
cpp_quote( " __in DWORD cbData," )
cpp_quote( " __in_ecount( cbData ) BYTE * pbData," )
cpp_quote( " __deref_out IMFPresentationDescriptor ** ppPD);")
cpp_quote("")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// MF_SD_LANGUAGE
// Type: LPWSTR
// {00AF2180-BDC2-423c-ABCA-F503593BC121}
cpp_quote( "EXTERN_GUID(MF_SD_LANGUAGE, 0xaf2180, 0xbdc2, 0x423c, 0xab, 0xca, 0xf5, 0x3, 0x59, 0x3b, 0xc1, 0x21);" )
// MF_SD_PROTECTED
// Data type: UINT32
// Indicates if stream is protected
// {00AF2181-BDC2-423c-ABCA-F503593BC121}
cpp_quote( "EXTERN_GUID(MF_SD_PROTECTED, 0xaf2181, 0xbdc2, 0x423c, 0xab, 0xca, 0xf5, 0x3, 0x59, 0x3b, 0xc1, 0x21);" )
// MF_SD_STREAM_NAME
// Type: LPWSTR
// Stores the stream name (if available) for the stream
// {4F1B099D-D314-41e5-A781-7FEFAA4C501F}
cpp_quote( "EXTERN_GUID(MF_SD_STREAM_NAME, 0x4f1b099d, 0xd314, 0x41e5, 0xa7, 0x81, 0x7f, 0xef, 0xaa, 0x4c, 0x50, 0x1f);" )
// MF_SD_MUTUALLY_EXCLUSIVE
// Type: UINT32
// Indicates that the stream is mutually exclusive with respect to all other streams of this type
// {023EF79C-388D-487f-AC17-696CD6E3C6F5}
cpp_quote( "EXTERN_GUID(MF_SD_MUTUALLY_EXCLUSIVE, 0x23ef79c, 0x388d, 0x487f, 0xac, 0x17, 0x69, 0x6c, 0xd6, 0xe3, 0xc6, 0xf5);" )
[
object,
uuid(56c03d9c-9dbb-45f5-ab4b-d80f47c05938),
]
interface IMFStreamDescriptor : IMFAttributes
{
HRESULT GetStreamIdentifier(
[out] DWORD* pdwStreamIdentifier
);
HRESULT GetMediaTypeHandler(
[out] IMFMediaTypeHandler** ppMediaTypeHandler
);
}
//
// Instantiates the Media Foundation-provided implementations of
// IMFStreamDescriptor
//
cpp_quote( "STDAPI MFCreateStreamDescriptor(" )
cpp_quote( " DWORD dwStreamIdentifier," )
cpp_quote( " DWORD cMediaTypes," )
cpp_quote( " __in_ecount(cMediaTypes) IMFMediaType** apMediaTypes," )
cpp_quote( " __out IMFStreamDescriptor** ppDescriptor" )
cpp_quote( " );" )
cpp_quote( "" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(e93dcf6c-4b07-4e1e-8123-aa16ed6eadf5),
]
/// <summary>
/// IMFMediaTypeHandler is the interface used by some Media Foundation
/// components for media type enumeration and negotiation
/// </summary>
interface IMFMediaTypeHandler : IUnknown
{
[local]
HRESULT IsMediaTypeSupported(
[in] IMFMediaType* pMediaType,
[out, annotation("__out")] IMFMediaType** ppMediaType
);
[local]
HRESULT GetMediaTypeCount(
[out, annotation("__out")] DWORD* pdwTypeCount
);
[local]
HRESULT GetMediaTypeByIndex(
[in] DWORD dwIndex,
[out, annotation("__out")] IMFMediaType** ppType
);
[local]
HRESULT SetCurrentMediaType(
[in] IMFMediaType* pMediaType
);
[local]
HRESULT GetCurrentMediaType(
[out, annotation("__out")] IMFMediaType** ppMediaType
);
midl_pragma warning (disable: 2495)
[call_as(GetCurrentMediaType)]
HRESULT RemoteGetCurrentMediaType(
[out, annotation("__out"), size_is(, *pcbData)] BYTE ** ppbData,
[out] DWORD * pcbData
);
midl_pragma warning (default: 2495)
midl_pragma warning (disable: 2495)
HRESULT GetMajorType(
[out, annotation("__out")] GUID* pguidMajorType
);
midl_pragma warning (default: 2495)
};
//
// Instantiates a simple Media Type Handler object that manages a single media
// type. To use this object, initialize it with a media type via
// IMFMediaTypeHandler::SetCurrentMediaType.
//
cpp_quote( "STDAPI MFCreateSimpleTypeHandler(" )
cpp_quote( " __out IMFMediaTypeHandler ** ppHandler );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum MFTIMER_FLAGS
{
/// <summary>
/// Indicates that time passed to SetTimer function is relative to the
/// current time
/// </summary>
MFTIMER_RELATIVE = 0x00000001,
} MFTIMER_FLAGS;
[
object,
uuid(e56e4cbd-8f70-49d8-a0f8-edb3d6ab9bf2),
local
]
/// <summary>
/// IMFTimer is implemented by clocks that provide timer functionality
/// </summary>
interface IMFTimer : IUnknown
{
/// <summary>
/// SetTimer sets a timer that will cause the callback
/// function to be called at the specified clock time.
/// </summary>
/// <param name="dwFlags">
/// Combination of MFTIMER_FLAGS flags.
/// </param>
/// <param name="llClockTime">
/// Clock time at which the timer should fire.
/// Given in the clock's frequency units.
/// <param>
/// <param name="pCallback">
/// Callback that will be invoked when the timer fires.
/// </param>
/// <param name="punkState">
/// Caller-defined state object that will be passed to
/// pCallback->Invoke when the timer fires. Optional.
/// </param>
/// <param name="ppunkKey">
/// Pointer to a variable that will receive a key that can be
/// used to cancel the timer.
/// </param>
HRESULT SetTimer(
[in] DWORD dwFlags,
[in] LONGLONG llClockTime,
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState,
[out] IUnknown** ppunkKey
);
/// <summary>
/// Cancels a previously-set timer
/// </summary>
/// <param name="punkKey">
/// The key associated with the timer.
/// This key was returned from IMFTimer::SetTimer.
/// </param>
/// <returns>
/// <para>
/// MF_E_CLOCK_INVALID_TIMER_KEY:
/// punkKey does not correspond to any timer that can
/// currently be canceled.
/// </para>
/// </returns>
/// <remarks>
/// If CancelTimer succeeds, the callback will not be invoked
/// for that timer.
/// </remarks>
HRESULT CancelTimer(
[in] IUnknown* punkKey
);
}
////////////////////////////////////// Activate guids ////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Following attributes are used by WMP to pass custom video mixer/presenter
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID, 0xba491360, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE, 0xba491361, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_MIXER_FLAGS, 0xba491362, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_CLSID, 0xba491364, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, 0xba491365, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_FLAGS, 0xba491366, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8 );" )
enum
{
//
// Custom mixer flags
//
MF_ACTIVATE_CUSTOM_MIXER_ALLOWFAIL = 0x00000001, // Failure to create custom mixer will not fail the pipeline
};
enum
{
//
// Custom presenter flags
//
MF_ACTIVATE_CUSTOM_PRESENTER_ALLOWFAIL = 0x00000001, // Failure to create custom presenter will not fail the pipeline
};
/// <summary>
/// MF_ACTIVATE_MFT_LOCKED indicates that MFT which pointed by this activate is locked. Topoloader cannot change the mediatypes for this MFT
/// Topoloader sets this attribute after it uses activate during first topology resolution
/// </summary>
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_MFT_LOCKED, 0xc1f6093c, 0x7f65, 0x4fbd, 0x9e, 0x39, 0x5f, 0xae, 0xc3, 0xc4, 0xfb, 0xd7 );" )
/// <summary>
/// MF_ACTIVATE_VIDEO_WINDOW - UINT64
/// Contains HWND for video activate
/// </summary>
cpp_quote( "EXTERN_GUID( MF_ACTIVATE_VIDEO_WINDOW, 0x9a2dbbdd, 0xf57e, 0x4162, 0x82, 0xb9, 0x68, 0x31, 0x37, 0x76, 0x82, 0xd3 );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum _MFSHUTDOWN_STATUS
{
MFSHUTDOWN_INITIATED,
MFSHUTDOWN_COMPLETED,
} MFSHUTDOWN_STATUS;
[
object,
uuid(97ec2ea4-0e42-4937-97ac-9d6d328824e1),
]
/// <summary>
/// Many Media Foundation components need to be shut down upon exit to break
/// circular references and avoid memory leaks. For any object that
/// implements an interface with a method called Shutdown(), this method
/// should be called at shutdown time.
/// However, some Media Foundation components instead need to be QIed
/// for IMFShutdown and shut down through this interface.
/// The easiest way to do this is to call MFShutdownObject on the object.
/// Most notably, applications should try to QI for IMFShutdown on
/// any objects implementing the following interfaces:
/// IMFPresentationClock
/// IMFActivate
/// IMFContentEnabler
/// IMFInputTrustAuthority
/// IMFTransform (for asynchronous MFTs)
/// </summary>
interface IMFShutdown : IUnknown
{
HRESULT Shutdown();
HRESULT GetShutdownStatus(
[out] MFSHUTDOWN_STATUS * pStatus);
};
//
// MFShutdownObject can be used on any MF object that inherits or may inherit
// from IMFShutdown.
// If the object inherits from IMFShutdown, then IMFShutdown::Shutdown is
// called. Regardless, this function will return success.
cpp_quote( "STDAPI " )
cpp_quote( "MFShutdownObject(")
cpp_quote( " IUnknown * pUnk );")
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation playback sink creation functions
//
///////////////////////////////////////////////////////////////////////////////
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateAudioRenderer(" )
cpp_quote( " IMFAttributes* pAudioAttributes," )
cpp_quote( " __out IMFMediaSink** ppSink" )
cpp_quote( " );" )
/// <summary>
/// Creates an Audio Renderer Media Sink Activate
/// </summary>
/// </param>
/// <param name="ppIActivate">
/// Returns pointer to an Audio Renderer Media Sink Activate
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateAudioRendererActivate( " )
cpp_quote( " __out IMFActivate ** ppActivate " )
cpp_quote( " );" )
//
// Attributes for use with MFCreateAudioRenderer (0xede4b5e0, 0xf805, 0x4d6c, 0x99, 0xb3, 0xdb, 0x01, 0xbf, 0x95, 0xdf, 0xab)
//
// MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS
// Data type: UINT32
// Audio renderer flags attribute. See below for defined flags.
cpp_quote( "EXTERN_GUID( MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS, 0xede4b5e0, 0xf805, 0x4d6c, 0x99, 0xb3, 0xdb, 0x01, 0xbf, 0x95, 0xdf, 0xab);" )
//
// Flags for the MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS attribute:
//
// MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS - If this attribute bit is set, the audio renderer will treat a MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID
// set on it as a cross-process session, allowing audio renderers in multiple processes to share the audio session and associated volume and policy control. Otherwise, audio
// sessions will always stay local to audio renderers in the current process.
//
cpp_quote("#define MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS 0x00000001")
//
// MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_NOPERSIST - If this attribute bit is set, audio engine is not going to persist properties for audio session.
//
cpp_quote("#define MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_NOPERSIST 0x00000002")
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
//
// MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_DONT_ALLOW_FORMAT_CHANGES - **New for Win7**
// In order to handle dynamic audio device changes without requiring the application to listen for device change events and swap renderers
// dynamically (and deal with any clocking issues that stem from that) the audio renderer sink was enhanced to support format changes
// when generated by an audio device change (in-band formats changes are handled by the MF pipeline, which can dynamically insert a resampler).
// This attribute can be used to disable these enhancements and prevent the SAR from allowing its media type to be changed in this
// situations. In those cases it will send the necessary events on dynamic device changes to allow the app to handle the device changes
// itself.
//
cpp_quote("#define MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_DONT_ALLOW_FORMAT_CHANGES 0x00000004")
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
// MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID
// Data type: GUID
// This attribute allows the caller to specify an audio session ID for audio media sink. If this is not specified, the sink will use the application's default audio session.
cpp_quote( "EXTERN_GUID( MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID, 0xede4b5e3, 0xf805, 0x4d6c, 0x99, 0xb3, 0xdb, 0x01, 0xbf, 0x95, 0xdf, 0xab);" )
// MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID
// Data type: STRING
// This attribute allows the caller to pass in an audio endpoint id (obtained by calling IMMDevice::GetId on a device enumerated from IMMDeviceEnumerator - see MDeviceAPI.idl)
// for creation of an audio renderer media sink on that device endpoint.
// If this attribute is set, the MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE must not be set. Otherwise, a failure will result on audio media sink creation.
// If neither this attribute nor the MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE attribute is set, the default eConsole audio endpoint will be used.
cpp_quote( "EXTERN_GUID( MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 0xb10aaec3, 0xef71, 0x4cc3, 0xb8, 0x73, 0x5, 0xa9, 0xa0, 0x8b, 0x9f, 0x8e);" )
// MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE
// Data type: UINT32
// This attribute allows the caller to pass in an audio endpoint "role", to have an audio media sink created using the default device for the supplied role.
// See the MultimediaDevice documentation (MMDeviceAPI.idl) for the list of list of audio endpoint roles that can be passed with this attribute.
// If this attribute is set, the MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID must not be set. Otherwise, a failure will result on audio media sink creation.
// If neither this attribute nor the MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID attribute is set, the default eConsole audio endpoint will be used.
cpp_quote( "EXTERN_GUID( MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE, 0x6ba644ff, 0x27c5, 0x4d02, 0x98, 0x87, 0xc2, 0x86, 0x19, 0xfd, 0xb9, 0x1b);" )
//
// Attributes for use with MFCreateAudioRenderer
//
/// <summary>
/// Creates a Video Renderer Media Sink Activate
/// </summary>
/// <param name="hwndVideo">
/// The HWND within which the video will play
/// </param>
/// <param name="ppIActivate">
/// Returns pointer to a Video Renderer Media Sink Activate
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateVideoRendererActivate(" )
cpp_quote( " __in HWND hwndVideo, " )
cpp_quote( " __out IMFActivate ** ppActivate " )
cpp_quote( " );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Creates a MPEG4 Archive Sink
/// </summary>
/// <param name="pIByteStream">
/// Pointer to the byte stream that will be used to write the MPEG4 file
/// </param>
/// <param name="pVideoMediaType">
/// Pointer to the media type of the video input stream
/// </param>
/// <param name="pAudioMediaType">
/// Pointer to the media type of the audio input stream
/// </param>
/// <param name="ppIMediaSink">
/// Receives a pointer to the IMFMediaSinkInterface. The caller must release this interface.
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateMPEG4MediaSink(" )
cpp_quote( " __in IMFByteStream* pIByteStream, " )
cpp_quote( " __in_opt IMFMediaType* pVideoMediaType, " )
cpp_quote( " __in_opt IMFMediaType* pAudioMediaType, " )
cpp_quote( " __out IMFMediaSink** ppIMediaSink " )
cpp_quote( " );" )
/// <summary>
/// Creates a 3GP Archive Sink
/// </summary>
/// <param name="pIByteStream">
/// Pointer to the byte stream that will be used to write the 3GP file
/// </param>
/// <param name="pVideoMediaType">
/// Pointer to the media type of the video input stream
/// </param>
/// <param name="pAudioMediaType">
/// Pointer to the media type of the audio input stream
/// </param>
/// <param name="ppIMediaSink">
/// Receives a pointer to the IMFMediaSinkInterface. The caller must release this interface.
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreate3GPMediaSink(" )
cpp_quote( " __in IMFByteStream* pIByteStream, " )
cpp_quote( " __in_opt IMFMediaType* pVideoMediaType, " )
cpp_quote( " __in_opt IMFMediaType* pAudioMediaType, " )
cpp_quote( " __out IMFMediaSink** ppIMediaSink " )
cpp_quote( " );" )
/// <summary>
/// Creates a MP3 archive sink. The MP3 archive sink takes metadata and compressed MP3
/// audio and writes it to an MP3 file with ID3 headers.
/// </summary>
/// <param name="pTargetByteStream">
/// Pointer to the byte stream that will be used to write the MP3 file
/// </param>
/// <param name="ppMediaSink">
/// Receives a pointer to the IMFMediaSinkInterface. The caller must release this interface.
/// </param>
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateMP3MediaSink(" )
cpp_quote( " __in IMFByteStream* pTargetByteStream, " )
cpp_quote(" __deref_out IMFMediaSink** ppMediaSink " )
cpp_quote( " );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation topology-related interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// IMFTopoLoader interface.
/// Unless the MFSESSION_SETTOPOLOGY_NORESOLUTION flag is set when
/// IMFMediaSession::SetTopology is called, the Media Session takes
/// care of topology resolution.
/// However, applications that wish to do topology resolution outside
/// the Media Session can call MFCreateTopoLoader to create the topoloader
/// object. They can then use this interface to resolve a partial
/// topology to afull topology, which can be set on the Media Session with
/// the flag MFSESSION_SETTOPOLOGY_NORESOLUTION.
/// </summary>
[
object,
uuid(DE9A6157-F660-4643-B56A-DF9F7998C7CD),
local
]
interface IMFTopoLoader : IUnknown
{
/// <summary>
/// Given the input partial topology, the method will turn it into a
/// fully loaded topology.
/// </summary>
/// <remarks>
/// Topoloader will find all the intermediate transforms needed to
/// provide a fully specified topology of sources, transforms,
/// and sinks.
/// Sets all the input and output media types on all the objects
/// in the topology.
/// If this method returns successfully, the output topology is
/// ready for processing by the media processor.
/// The third parameter pCurrentTopo can be NULL or a pointer to
/// the preceding topology.
/// </remarks>
/// <param name="pInputTopo">
/// The pointer to the partial topology to be resolved.
/// </param>
/// <param name="ppOutputTopo">
/// The pointer to a IMFTopology pointer where the full topology
/// is returned
/// </param>
/// <param name="pCurrentTopo">
/// The pointer to the previous full topology for object caching.
/// May be NULL.
/// The topoloader will use this full topology as reference and
/// pull the topology node objects from it into the new
/// full topology it creates.
/// Once Load completes successfully, pCurrentTopo should be discarded.
/// </param>
/// <returns>
/// If the method succeeds, the return value is S_OK.
/// If the method fails, the return value will be some failure code.
/// </returns>
HRESULT Load(
[in] IMFTopology * pInputTopo,
[out, annotation("__out")] IMFTopology ** ppOutputTopo,
[in] IMFTopology* pCurrentTopo);
};
/// <summary>
/// Creates an IMFTopologyLoader object
/// </summary>
/// <param name="ppObj">
/// Pointer to an IMFTopoLoader pointer where the Topology Loader object
/// will be returned
/// </param>
cpp_quote( "STDAPI MFCreateTopoLoader(" )
cpp_quote( " __out IMFTopoLoader ** ppObj );" )
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation protected playback interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( ACF92459-6A61-42bd-B57C-B43E51203CB0 ),
helpstring( "IMFContentProtectionManager Interface"),
pointer_default(unique)
]
/// <summary>
/// IMFContentProtectionManager is the interface that an application is called
/// back on if a PMP component wants to perform some steps with the application<6F>s
/// help/consent, like license acquisition or individualization.
/// <para>
/// The application should implement this callback and set the callback pointer in
/// the configuration property store that it passes into the PMP Session as part
/// of the MFCreatePMPMediaSession method. If the application does not set a
/// callback pointer then certain operations like license acquisition that require
/// application help will fail.
/// </para>
/// <para>
/// The PMP marshals calls from within the Protected Environment to the application.
/// </para>
/// <para>
/// Typically, this interface will be invoked during the SetTopology operation, before
/// MESessionTopologySet is fired by the session. The application should be prepared to receive
/// multiple content enablers during this time. Content Enablers may also be fired outside
/// of the SetTopology operation, but those scenarios are not as common, and typically
/// involve just a single content enabler, so the application should not need special
/// UI to handle multiple enablers outside of the SetTopology operation.
/// </para>
/// </summary>
interface IMFContentProtectionManager: IUnknown
{
/// <summary>
/// BeginEnableContent requests the application to perform a specific step to
/// acquire rights to the content. The application should not block in this method.
/// It should do any time-consuming operations asynchronously on its own thread and
/// when done notify the PMP via the pCallback parameter passed into this method.
/// </summary>
/// <param name="pEnablerActivate">
/// [in] An IMFActivate to a Content Enabler object. The methods of this object provide
/// the various options available to the application to perform what is necessary to
/// finish this step of acquiring rights to the content.
/// </param>
/// <param name="pTopo">
/// [in] A pointer to the topology that caused this content enabler
/// to be fired. Note that in some cases, there is no relevant
/// topology, and this parameter will be NULL.
/// </param>
/// <param name="pCallback">
/// [in] A callback pointer into the PMP. When the application is done with its
/// asynchronous processing it should call pCallback->Invoke.
/// </param>
/// <param name="punkState">
/// [in] A context object that the application should pass back into pCallback->Invoke.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
/// <remarks>
/// If the application returns a success code from BeginEnableContent, then it must
/// call pCallback->Invoke. If it returns an error code from BeginEnableContent, then
/// it must not call pCallback->Invoke.
///</remarks>
[local]
HRESULT BeginEnableContent(
[in] IMFActivate *pEnablerActivate,
[in] IMFTopology *pTopo,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
[call_as(BeginEnableContent)]
HRESULT RemoteBeginEnableContent(
[in] REFCLSID clsidType,
[in, size_is(cbData)] BYTE *pbData,
[in] DWORD cbData,
[in] IMFRemoteAsyncCallback *pCallback
);
/// <summary>
/// After the application notifies the PMP (via pCallback->Invoke) that it is done with
/// all asynchronous processing following BeginEnableContent, PMP calls EndEnableContent
/// on the application to fetch the result code of that processing.
/// </summary>
/// <param name="pResult">
/// [in] This is the same pointer that the application passed into pCallback->Invoke,
/// where pCallback is what was passed into BeginEnableContent.
/// </param>
/// <returns>
/// The application should return the success code or error code of the asynchronous
/// processing that followed the BeginEnableContent call.
/// </returns>
/// <remarks>
/// This method is called synchronously from the callback passed in to
/// BeginEnableContent. Thus, this method will be called on the application's
/// thread, and should not block.
///</remarks>
[local]
HRESULT EndEnableContent(
[in] IMFAsyncResult *pResult
);
[call_as(EndEnableContent)]
HRESULT RemoteEndEnableContent(
[in] IUnknown *pResult
);
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum
{
MF_LICENSE_URL_UNTRUSTED,
MF_LICENSE_URL_TRUSTED,
MF_LICENSE_URL_TAMPERED,
} MF_URL_TRUST_STATUS;
[
object,
uuid( D3C4EF59-49CE-4381-9071-D5BCD044C770 ),
helpstring( "IMFContentEnabler Interface"),
pointer_default(unique)
]
/// <summary>
/// The IMFContentEnabler interface encapsulates all of the options available
/// to the application to perform one step along the way to acquire rights to
/// the content.
/// <para>
/// For instance, if the application wants to play WMDRM content, the steps
/// required may be to first individualize the machine and then acquire a license.
/// </para>
/// <para>
/// - For individualization, the platform creates a Content Enabler object and
/// passes it to the application as part of a platform callback. The application
/// can then put up UI if required, get user consent if required, and finally
/// call the methods of the Content Enabler to perform individualization. The
/// AutomaticEnable method of the Content Enabler performs the individualization.
/// - The same process is repeated for license acquisition. In this case as well
/// the platform creates (a different implementation of) the Content Enabler object.
/// The AutomaticEnable method of this Content Enabler fetches a license.
/// </para>
/// <para>
/// Abstracting these operations through the IMFContentEnabler interface allows an
/// application to write common code to deal with the various steps of acquiring
/// rights. This also makes it possible for a variety of current and future content
/// protection systems to automatically be plugged in under the application as long
/// as their requirements can be abstracted within this interface.
/// </para>
/// </summary>
interface IMFContentEnabler : IUnknown
{
/// <summary>
/// GetEnableType returns the type of operation that needs to be done to acquire
/// rights to the content. For the types that the application is aware of, it can
/// put up friendly strings in its UI.
/// </summary>
/// <param name="pType">
/// [out] GUID representing the type of operation requested.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK. Otherwise it returns a failure code.
/// </returns>
HRESULT GetEnableType(
[out] GUID *pType );
/// <summary>
/// If the operation requested can be achieved by the application opening a certain
/// URL in the browser then GetEnableURL returns that URL. For instance, for license
/// acquisition an application might prefer to navigate to the URL itself.
/// <para>
/// The application is expected to do an HTTP POST request to this URL.
/// </para>
/// </summary>
/// <param name="pwszURL">
/// [out] Pointer to a WCHAR array allocated by the caller. The Content Enabler
/// object fills in the URL to navigate to if the length of the array, indicated by
/// the pcchURL parameter, is sufficient.
/// </param>
/// <param name="pcchURL">
/// [in, out] Pointer to a DWORD. The caller should initialize it to the size of the
/// array, in WCHARs, that pwszURL points to. The Content Enabler overwrites it with
/// the length of the URL in WCHARs excluding the terminating NULL.
/// </param>
/// <param name="pTrustStatus">
/// [out] An enum that tells the application whether the URL is from a trusted source.
/// See MF_URL_TRUST_STATUS for details.
/// </param>
/// <returns>
/// If there is an URL to return and the method succeeds, it returns S_OK. Otherwise it
/// returns a failure code.
/// </returns>
/// <remarks>
/// The application needs to call this method twice - once with a NULL pwszURL in order
/// to get the length of the WCHAR array to allocate, and the second time with the
/// allocated array and its size.
/// <para>
/// The GetEnableURL call must be accompanied by a GetEnableData call. Typically the
/// application will also call MonitorEnable subsequently.
/// </para>
///</remarks>
HRESULT GetEnableURL(
[out, size_is(, *pcchURL)] LPWSTR * ppwszURL,
[out] DWORD *pcchURL,
[in, out, unique] MF_URL_TRUST_STATUS *pTrustStatus );
/// <summary>
/// GetEnableData returns the data that needs to accompany the HTTP POST request in case
/// the application chooses to navigate to the URL returned by GetEnableURL.
/// </summary>
/// <param name="pbData">
/// [out] Pointer to a BYTE array allocated by GetEnableData that contains the HTTP POST data.
/// </param>
/// <param name="pcbData">
/// [out] Pointer to a DWORD. The Content Enabler overwrites this with the
/// length of the POST data in BYTEs.
/// </param>
/// <returns>
/// If there is POST data to return and the method succeeds, it returns S_OK. Otherwise
/// it returns a failure code.
/// </returns>
/// <remarks>
///</remarks>
HRESULT GetEnableData(
[out, size_is(, *pcbData)] BYTE ** ppbData,
[out] DWORD *pcbData );
/// <summary>
/// The IsAutomaticSupported method indicates whether the Content Enabler can do all of the
/// requested steps on its own. For WMDRM license acquisition for instance, the Content
/// Enabler is able to navigate to the license acquisition URL on its own and download
/// the license.
/// </summary>
/// <param name="pfAutomatic">
/// [in] Pointer to a BOOL. The Content Enabler sets the BOOL to TRUE if it can do the
/// required operation on its own. It sets the BOOL to FALSE if it needs the application
/// to do the required operation by calling GetEnableURL and navigating to it.
/// </param>
/// <returns>
/// If the method succeeds it returns S_OK, otherwise it returns a failure code.
/// </returns>
/// <remarks>
///</remarks>
HRESULT IsAutomaticSupported(
[out] BOOL *pfAutomatic );
/// <summary>
/// Through AutomaticEnable the application instructs the Content Enabler to perform the
/// required operation on its own. MF ONLY: When the operation completes the Content Enabler
/// queues up a MEEnablerCompleted event onto its IMFMediaEventGenerator interface.
/// </summary>
/// <returns>
/// If the method succeeds it returns S_OK, otherwise it returns a failure code.
/// </returns>
/// <remarks>
///</remarks>
HRESULT AutomaticEnable();
/// <summary>
/// MF ONLY: In case the application chooses to call GetEnableURL and navigate itself, the
/// application is expected to do so through a web browser or web browser control.
/// From that point the rest of the operation proceeds without the application<6F>s
/// involvement. If the application wants to be notified when the operation completes,
/// then it should call MonitorEnable. In this case the Content Enabler queues up a
/// MEEnablerCompleted event onto its IMFMediaEventGenerator interface, just like in
/// the SilentEnable case.
/// </summary>
/// <returns>
/// If the method succeeds it returns S_OK, otherwise it returns a failure code.
/// </returns>
/// <remarks>
///</remarks>
HRESULT MonitorEnable();
/// <summary>
/// The application can call Cancel to cancel a pending SilentEnable or MonitorEnable.
/// MF ONLY: In response the Content Enabler queues up a MEEnablerCompleted event immediately
/// with an error code of E_CANCEL.
/// </summary>
/// <returns>
/// If the method succeeds it returns S_OK, otherwise it returns a failure code.
/// </returns>
/// <remarks>
///</remarks>
HRESULT Cancel();
};
//
// Content Enabler Type GUIDs
//
cpp_quote( "" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_WMDRMV1_LicenseAcquisition, 0x4ff6eeaf, 0xb43, 0x4797, 0x9b, 0x85, 0xab, 0xf3, 0x18, 0x15, 0xe7, 0xb0);" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_WMDRMV7_LicenseAcquisition, 0x3306df, 0x4a06, 0x4884,0xa0, 0x97, 0xef, 0x6d, 0x22, 0xec, 0x84, 0xa3);" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_WMDRMV7_Individualization, 0xacd2c84a, 0xb303, 0x4f65, 0xbc, 0x2c, 0x2c, 0x84, 0x8d, 0x1, 0xa9, 0x89);" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_MF_UpdateRevocationInformation, 0xe558b0b5, 0xb3c4, 0x44a0, 0x92, 0x4c, 0x50, 0xd1, 0x78, 0x93, 0x23, 0x85);" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_MF_UpdateUntrustedComponent, 0x9879f3d6, 0xcee2, 0x48e6, 0xb5, 0x73, 0x97, 0x67, 0xab, 0x17, 0x2f, 0x16);" )
cpp_quote( "EXTERN_GUID( MFENABLETYPE_MF_RebootRequired, 0x6d4d3d4b, 0x0ece, 0x4652, 0x8b, 0x3a, 0xf2, 0xd2, 0x42, 0x60, 0xd8, 0x87);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
cpp_quote( "// ")
cpp_quote( "// Structs that contain information about revoked or unsigned binaries, ")
cpp_quote( "// returned by the IMFContentEnabler::GetEnableData() method of ")
cpp_quote( "// the Revocation content enabler ")
cpp_quote( "// ")
cpp_quote( "#ifndef MFRR_INFO_VERSION" )
cpp_quote( "#define MFRR_INFO_VERSION 0" )
cpp_quote( "#endif" )
cpp_quote( "// ")
cpp_quote( "// The values for MFRR_COMPONENT_HASH_INFO.ulReason ")
cpp_quote( "// ")
cpp_quote( "#define MF_USER_MODE_COMPONENT_LOAD 0x00000001")
cpp_quote( "#define MF_KERNEL_MODE_COMPONENT_LOAD 0x00000002")
cpp_quote( "#define MF_GRL_LOAD_FAILED 0x00000010")
cpp_quote( "#define MF_INVALID_GRL_SIGNATURE 0x00000020")
cpp_quote( "#define MF_GRL_ABSENT 0x00001000")
cpp_quote( "#define MF_COMPONENT_REVOKED 0x00002000")
cpp_quote( "#define MF_COMPONENT_INVALID_EKU 0x00004000")
cpp_quote( "#define MF_COMPONENT_CERT_REVOKED 0x00008000")
cpp_quote( "#define MF_COMPONENT_INVALID_ROOT 0x00010000")
cpp_quote( "#define MF_COMPONENT_HS_CERT_REVOKED 0x00020000")
cpp_quote( "#define MF_COMPONENT_LS_CERT_REVOKED 0x00040000")
cpp_quote( "#define MF_BOOT_DRIVER_VERIFICATION_FAILED 0x00100000")
cpp_quote( "#define MF_TEST_SIGNED_COMPONENT_LOADING 0x01000000")
cpp_quote( "#define MF_MINCRYPT_FAILURE 0x10000000")
cpp_quote( "// ")
cpp_quote( "// STR_HASH_LEN: Number of characters required to represent a SHA-1 hash ")
cpp_quote( "// (RTL_MAX_HASH_LEN_V1) as a string of the form \"0x5a3b53463b672a4f...\" ")
cpp_quote( "// Each byte of a SHA-1 hash takes two characters to represent, and ")
cpp_quote( "// we add in two leading characters \"0x\" as well as the NULL terminator ")
cpp_quote( "// ")
cpp_quote( "#define SHA_HASH_LEN 20 ")
cpp_quote( "#define STR_HASH_LEN (SHA_HASH_LEN*2 + 3) ")
cpp_quote( "typedef struct _MFRR_COMPONENT_HASH_INFO ")
cpp_quote( "{ ")
cpp_quote( " // Reason for failure (revoked or unsigned or badly signed). ")
cpp_quote( " DWORD ulReason; ")
cpp_quote( " ")
cpp_quote( " // Header hash of the component ")
cpp_quote( " WCHAR rgHeaderHash[STR_HASH_LEN]; ")
cpp_quote( " ")
cpp_quote( " // Hash of public key if one of the certificates ")
cpp_quote( " // in the signing certificate chain is revoked ")
cpp_quote( " WCHAR rgPublicKeyHash[STR_HASH_LEN]; ")
cpp_quote( " ")
cpp_quote( " // Component name (full path name) ")
cpp_quote( " WCHAR wszName[MAX_PATH]; ")
cpp_quote( " ")
cpp_quote( "} MFRR_COMPONENT_HASH_INFO, *PMFRR_COMPONENT_HASH_INFO; ")
cpp_quote( "typedef struct _MFRR_COMPONENTS ")
cpp_quote( "{ ")
cpp_quote( " ")
cpp_quote( " // Version number ")
cpp_quote( " DWORD dwRRInfoVersion; ")
cpp_quote( " ")
cpp_quote( " // Number of components in list ")
cpp_quote( " DWORD dwRRComponents; ")
cpp_quote( " ")
cpp_quote( " // points to the end of this structure that has ")
cpp_quote( " // allocated memory for the array of component info structures ")
cpp_quote( " PMFRR_COMPONENT_HASH_INFO pRRComponents; ")
cpp_quote( " ")
cpp_quote( "} MFRR_COMPONENTS, *PMFRR_COMPONENTS; ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation advanced playback interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Structure used in flattening WM_PICTURE data
// This is the format of the blob in an ASF file, and what will be returned
// from a call to IMFMetadata::GetProperty( ). It is always byte
// aligned since it is part of a file format. Full binary layout of the blob
// is ASF_FLAT_PICTURE followed by null-terminated UNICODE string denoting MIME
// type, null-terminated UNICODE string description, and pointer to image
// bytes.
//
cpp_quote( "#pragma pack ( push ) ")
cpp_quote( "#pragma pack ( 1 ) ")
cpp_quote( "typedef struct _ASFFlatPicture ")
cpp_quote( "{ ")
cpp_quote( " // ")
cpp_quote( " // Direct mapped fields ")
cpp_quote( " // ")
cpp_quote( " BYTE bPictureType; ")
cpp_quote( " DWORD dwDataLen; ")
cpp_quote( "} ASF_FLAT_PICTURE; ")
cpp_quote( "#pragma pack ( pop ) ")
//
// Structure used in flattening WM_SYNCHRONISED_LYRICS data
// This is the format of the blob in an ASF file, and what will be returned
// from a call to IMFMetadata::GetProperty( ). It is always byte aligned
// since it is part of a file format. Full binary layout of the blob is
// FLAT_SYNCHRONIZED_LYRICS followed by null-terminated UNICODE string content
// description, followed by BYTE pointer to lyrics. Lyrics themselves are
// defined as array, null-terminated UNICODE string followed by DWORD timestamp
// (units specified by bTimeStampFormat value).
//
cpp_quote( "#pragma pack ( push ) ")
cpp_quote( "#pragma pack ( 1 ) ")
cpp_quote( "typedef struct _ASFFlatSynchronisedLyrics ")
cpp_quote( "{ ")
cpp_quote( " // ")
cpp_quote( " // Direct mapped fields ")
cpp_quote( " // ")
cpp_quote( " BYTE bTimeStampFormat; ")
cpp_quote( " BYTE bContentType; ")
cpp_quote( " DWORD dwLyricsLen; ")
cpp_quote( "} ASF_FLAT_SYNCHRONISED_LYRICS; ")
cpp_quote( "#pragma pack ( pop ) ")
[
object,
uuid(F88CFB8C-EF16-4991-B450-CB8C69E51704),
]
/// <summary>
/// <para>
/// The IMFMetadata interface is the method by which MF-aware applications
/// access file metadata from media sources.
/// </para>
/// </summary>
interface IMFMetadata : IUnknown
{
/// <summary>
/// Sets the language context in which values are to be returned.
/// </summary>
/// <param name="pwszRFC1766">
/// Language ID, specified per RFC 1766.
/// </param>
HRESULT SetLanguage(
[in] LPCWSTR pwszRFC1766
);
/// <summary>
/// Retrieves the current language context.
/// </summary>
/// <param name="pwszRFC1766">
/// Language ID, specified per RFC 1766. Must be deallocated using CoTaskMemFree(...)
/// </param>
HRESULT GetLanguage(
[out] LPWSTR * ppwszRFC1766
);
/// <summary>
/// Retrieves a list of all available languages in this metadata set.
/// </summary>
/// <param name="ppvLanguages">
/// Returns a list of language IDs, per RFC1766, in a PROPVARIANT specified as type
/// VT_VECTOR | VT_LPWSTR.
/// </PARAM>
HRESULT GetAllLanguages(
[out] PROPVARIANT * ppvLanguages
);
/// <summary>
/// Set given property to the given value. For property type, consult schema
/// documentation.
/// </summary>
/// <param name="pwszName">
/// The name of the property.
/// </param>
/// <param name="ppvValue">
/// Value to set.
/// </param>
/// <remarks>
/// <para>
/// If the value is recognized, the type of the PROPVARIANT will be enforced.
/// </para>
/// <para>
/// If the value is NOT recognized, but exists in the current propery set,
/// SetProperty will enforce agreement between the type of the existing value
/// and the type of the new value.
/// </para>
/// <para>
/// If the value is NOT recognized and does NOT exist in the current property
/// set, SetProperty will successfully set the property regardless of type.
/// </para>
/// </remarks>
HRESULT SetProperty(
[in] LPCWSTR pwszName,
[in] const PROPVARIANT * ppvValue
);
/// <summary>
/// Retrieve value corresponding to the specified name.
/// </summary>
/// <param name="pwszName">
/// The name of the property.
/// </param>
/// <param name="ppvValue">
/// Value to retrieve.
/// </param>
/// <remarks>
/// For predefined values, type will be as specified in schema documentation.
/// For unknown values, type will be as specified when set, or in the case of
/// unknown file metadata values, will default to string.
/// </remarks>
HRESULT GetProperty(
[in] LPCWSTR pwszName,
[out] PROPVARIANT * ppvValue
);
/// <summary>
/// Remove specified property from a set.
/// </summary>
/// <param name="pwszName">
/// Name of the property to remove.
/// </param>
/// <remarks>
/// Some properties may be considered read-only. An attempt to delete a
/// read-only property will result in an error. An attempt to delete a
/// property which is not part of the set will succeed with status code
/// S_FALSE.
/// </remarks>
HRESULT DeleteProperty(
[in] LPCWSTR pwszName
);
/// <summary>
/// Retrieve the names of all properties in the given set.
/// </summary>
/// <param name="ppvNames">
/// Array of VT_LPWSTR property names.
/// </param>
/// <remarks>
/// Note that the list will be returned as type VT_VECTOR | VT_LPWSTR,
/// i.e. a simple array, NOT in a SAFEARRAY type.
/// </remarks>
HRESULT GetAllPropertyNames(
[out] PROPVARIANT * ppvNames
);
};
[
object,
uuid(56181D2D-E221-4adb-B1C8-3CEE6A53F76F)
]
/// <summary>
/// IMFMetadataProvider is used to obtain a IMFMetadata interface
/// associated with a particular IMFPresentationDescriptor
/// </summary>
interface IMFMetadataProvider : IUnknown
{
/// <summary>
/// Returns a IMFMetadata interface
/// </summary>
/// <param name="pPresentationDescriptor">
/// Pointer to the IMFPresentationDescriptor for which the
/// IMFMetadata is desired.
/// </param>
/// <param name="dwStreamIdentifier">
/// If set to 0, the function returns the IMFMetadata of the whole
/// presentation. If dwStreamIdentifier is set to a non-zero value,
/// the function returns a IMFMetadata belonging to the stream
/// identified by dwStreamIdentifier.
/// </param>
/// <param name="dwFlags">
/// Reserved for future use. Must be set to zero.
/// </param>
/// <param name="ppMFMetadata">
/// Pointer to a variable that will be set to a pointer to the IMFMetadata interface.
/// </param>
/// <returns>
/// <para>
/// MF_E_PROPERTY_NOT_FOUND:
/// An IMFMetadata interface is not available for the requested
/// IMFPresentationDescriptor and/or stream identifier.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// An IMFMetadata interface may not always be available for a
/// certain IMFPresentationDescriptor and/or stream identifier.
/// </para>
/// </remarks>
HRESULT GetMFMetadata(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] DWORD dwStreamIdentifier,
[in] DWORD dwFlags,
[out] IMFMetadata **ppMFMetadata
);
}
//
// Use this GUID to retrieve IMFMetadataProvider from components providing
// that service.
//
cpp_quote( "EXTERN_GUID( MF_METADATA_PROVIDER_SERVICE, 0xdb214084, 0x58a4, 0x4d2e, 0xb8, 0x4f, 0x6f, 0x75, 0x5b, 0x2f, 0x7a, 0xd);" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
//
// Use this GUID for "new" metadata service, i.e. IPropertyStore. Use of
// IMFMetadataProvider is deprecated for general metadata use, and doesn't
// support writing.
//
cpp_quote( "EXTERN_GUID( MF_PROPERTY_HANDLER_SERVICE, 0xa3face02, 0x32b8, 0x41dd, 0x90, 0xe7, 0x5f, 0xef, 0x7c, 0x89, 0x91, 0xb5);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum _MFRATE_DIRECTION
{
//
// Indicates forward playback
//
MFRATE_FORWARD,
//
// Indicates reverse playback
//
MFRATE_REVERSE
} MFRATE_DIRECTION;
[
object,
uuid(0a9ccdbc-d797-4563-9667-94ec5d79292d),
pointer_default(unique)
]
/// <summary>
/// IMFRateSupport is used to query a component for what
/// rates it supports.
/// This interface is obtained from the component via
/// IMFGetService::GetService using the MF_RATE_CONTROL_SERVICE
/// service GUID.
/// The Media Session provides IMFRateSupport.
/// Media Sources, Transforms, and Media Sinks may provide IMFRateSupport.
/// Those that do not are assumed to support any positive rate but
/// not zero or negative rates.
/// </summary>
interface IMFRateSupport : IUnknown
{
/// <summary>
/// Gets the slowest rate at which playback can happen
/// </summary>
/// <param name="eDirection">
/// Indicates playback direction for this query.
/// If MFRATE_FORWARD, then *pflRate will be set to the slowest
/// positive rate supported.
/// If MFRATE_REVERSE, then *pflRate will be set to the slowest
/// negative rate (by absolute value) supported.
/// </param>
/// <param name="fThin">
/// If TRUE, then *pflRate will be set to the slowest rate at
/// which thinning will occur.
/// </param>
/// <param name="pflRate">
/// Pointer to a variable to receive the slowest rate supported.
/// </param>
/// <returns>
/// <para>
/// MF_E_REVERSE_UNSUPPORTED
/// Returned by components that do not support reverse
/// playback when fForwardPlayback is FALSE.
/// </para>
/// <para>
/// MF_E_THINNING_UNSUPPORTED
/// Returned by components that cannot thin streams or handle
/// thinned streams when fThin is TRUE.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// If 0 is returned in *pflRate, that does not guarantee that
/// rate 0 is supported; the caller must do a separate
/// IsRateSupported query to determine that.
/// Otherwise, *pflRate can be assumed to be supported.
/// </para>
/// <para>
/// "Thinning" is defined in a format-specific manner.
/// For some formats (such as ASF), thinning will mean dropping
/// all frames that are not I-frames.
/// If the component produces stream data (like a Media Source
/// or a demultiplexer), it should pay attention
/// to the fThin argument and return MF_E_THINNING_UNSUPPORTED
/// if it cannot thin the stream.
/// If the component processes or receives a stream (like
/// most transforms or Media Sinks), it may ignore this
/// parameter if it does not care whether the stream is thinned.
/// In the Media Session's implementation of rate support,
/// if the transforms do not explicitly support reverse playback,
/// the Media Session will attempt to do reverse playback in
/// thinned mode (but will not do so unthinned).
/// Therefore, most applications will set fThin to TRUE
/// when using the Media Session for reverse playback.
/// </para>
/// </remarks>
HRESULT GetSlowestRate(
[in] MFRATE_DIRECTION eDirection,
[in] BOOL fThin,
[out] float* pflRate
);
/// <summary>
/// Gets the fastest rate at which playback can happen
/// </summary>
/// <param name="eDirection">
/// Indicates playback direction for this query.
/// If MFRATE_FORWARD, then *pflRate will be set to the fastest
/// positive rate supported.
/// If MFRATE_REVERSE, then *pflRate will be set to the fastest
/// negative rate (by absolute value) supported.
/// </param>
/// <param name="fThin">
/// If TRUE, then *pflRate will be set to the fastest rate at
/// which thinning will occur.
/// </param>
/// <param name="pflRate">
/// Pointer to a variable to receive the fastest rate supported.
/// </param>
/// <returns>
/// <para>
/// MF_E_REVERSE_UNSUPPORTED
/// Returned by components that do not support reverse
/// playback when fForwardPlayback is FALSE.
/// </para>
/// <para>
/// MF_E_THINNING_UNSUPPORTED
/// Returned by components that cannot thin streams or handle
/// thinned streams when fThin is TRUE.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// If 0 is returned in *pflRate, that does not guarantee that
/// rate 0 is supported; the caller must do a separate
/// IsRateSupported query to determine that.
/// Otherwise, *pflRate can be assumed to be supported.
/// </para>
/// <para>
/// "Thinning" is defined in a format-specific manner.
/// For some formats (such as ASF), thinning will mean dropping
/// all frames that are not I-frames.
/// If the component produces stream data (like a Media Source
/// or a demultiplexer), it should pay attention
/// to the fThin argument and return MF_E_THINNING_UNSUPPORTED
/// if it cannot thin the stream.
/// If the component processes or receives a stream (like
/// most transforms or Media Sinks), it may ignore this
/// parameter if it does not care whether the stream is thinned.
/// In the Media Session's implementation of rate support,
/// if the transforms do not explicitly support reverse playback,
/// the Media Session will attempt to do reverse playback in
/// thinned mode (but will not do so unthinned).
/// Therefore, most applications will set fThin to TRUE
/// when using the Media Session for reverse playback.
/// </para>
/// </remarks>
HRESULT GetFastestRate(
[in] MFRATE_DIRECTION eDirection,
[in] BOOL fThin,
[out] float* pflRate
);
/// <summary>
/// Queries whether a rate is supported by the component.
/// </summary>
/// <param name="fThin">
/// If TRUE, then the query concerns support of a thinned stream
/// at the flRate.
/// If FALSE, then the query concerns an unthinned stream.
/// </param>
/// <param name="flRate">
/// Rate for which support is being queried
/// </param>
/// <param name="pflNearestSupportedRate">
/// Optional; may be NULL.
/// If non-NULL and flRate is unsupported, the value returned
/// should be the nearest rate that is supported (in the same direction
/// of flRate) given the value specified for fThin.
/// (In the success case, it will be set to flRate.)
/// This return value is useful for components that support
/// several discrete rates.
/// If there are supported rates on either side of flRate,
/// then whichever is closer to flRate is the one that is returned.
/// </param>
/// <returns>
/// <para>
/// MF_E_UNSUPPORTED_RATE:
/// Rate is not supported
/// </para>
/// <para>
/// MF_E_REVERSE_UNSUPPORTED
/// Returned by components that do not support reverse
/// playback when fForwardPlayback is FALSE.
/// </para>
/// <para>
/// MF_E_THINNING_UNSUPPORTED
/// Returned by components that cannot thin streams or handle
/// thinned streams when fThin is TRUE.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The Media Foundation pipeline will pay attention to the
/// value returned in pflNearestSupportedRate for Media Sources
/// only; this value will be ignored coming from Transforms
/// or Media Sinks.
/// </para>
/// <para>
/// "Thinning" is defined in a format-specific manner.
/// For some formats (such as ASF), thinning will mean dropping
/// all frames that are not I-frames.
/// If the component produces stream data (like a Media Source
/// or a demultiplexer), it should pay attention
/// to the fThin argument and return MF_E_THINNING_UNSUPPORTED
/// if it cannot thin the stream.
/// If the component processes or receives a stream (like
/// most transforms or Media Sinks), it may ignore this
/// parameter if it does not care whether the stream is thinned.
/// In the Media Session's implementation of rate support,
/// if the transforms do not explicitly support reverse playback,
/// the Media Session will attempt to do reverse playback in
/// thinned mode (but will not do so unthinned).
/// Therefore, most applications will set fThin to TRUE
/// when using the Media Session for reverse playback.
/// </para>
/// </remarks>
HRESULT IsRateSupported(
[in] BOOL fThin,
[in] float flRate,
[in, out, unique] float *pflNearestSupportedRate
);
};
//
// This service GUID should be passed to the component's implementation
// of IMFGetService::GetService to obtain the IMFRateSupport and
// IMFRateControl services
//
cpp_quote( "EXTERN_GUID( MF_RATE_CONTROL_SERVICE, 0x866fa297, 0xb802, 0x4bf8, 0x9d, 0xc9, 0x5e, 0x3b, 0x6a, 0x9f, 0x53, 0xc9);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(88ddcd21-03c3-4275-91ed-55ee3929328f),
pointer_default(unique)
]
/// <summary>
/// IMFRateControl is used to notify components of a rate change.
/// This interface is obtained from the component via
/// IMFGetService::GetService using the MF_RATE_CONTROL_SERVICE
/// service GUID.
/// The Media Session provides IMFRateControl.
/// Media Sources and Transforms may provide IMFRateControl.
/// If they do, they will be notified of rate changes.
/// Media Sinks should not provide IMFRateControl; instead, they
/// will be notified of rate changes via IMFClockStateSink::OnClockSetRate.
/// </summary>
interface IMFRateControl : IUnknown
{
/// <summary>
/// Sets the rate on the component.
/// </summary>
/// <param name="fThin">
/// A value of TRUE means that the stream will be thinned.
/// For Media Sources and demultiplexers, this is an indication
/// that the component should thin the stream.
/// For downstream Transforms, this is an indication that
/// the stream will be thinned.
/// A value of FALSE means that the stream is not to be thinned.
/// <param name="flRate">
/// New rate
/// </param>
/// <returns>
/// <para>
/// MF_E_UNSUPPORTED_RATE_TRANSITION:
/// The component cannot transition from the current rate
/// to flRate while in the playing state.
/// </para>
/// <para>
/// MF_E_UNSUPPORTED_RATE:
/// flRate is not supported
/// </para>
/// <para>
/// MF_E_REVERSE_UNSUPPORTED:
/// Reverse rates are unsupported
/// </para>
/// <para>
/// MF_E_THINNING_UNSUPPORTED
/// Returned by components that cannot thin streams or handle
/// thinned streams when fThin is TRUE.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// SetRate may fail with MF_E_UNSUPPORTED_RATE even though
/// a previous call to IMFRateSupport::IsRateSupported
/// succeeded for that rate. This is because components
/// can dynamically change which rates are supported.
/// </para>
/// <para>
/// SetRate is an asynchronous call for the Media Session
/// and Media Sources.
/// How the rate change is completed depends on the component:
/// <para>
/// The Media Session will send MESessionRateChanged.
/// </para>
/// <para>
/// Media Sources will send MESourceRateChanged.
/// </para>
/// <para>
/// The Presentation Clock will notify all subscribed
/// clock state sinks via IMFClockStateSinks::OnClockSetRate,
/// and the Stream Sinks should send the
/// MEStreamSinkRateChanged event.
/// </para>
/// </para>
/// <para>
/// If SetRate is called on an object that is in the running state,
/// the rate change should proceed as soon as possible.
/// If SetRate is called on an object that is in a non-running
/// state, the new rate should be used next time the component
/// enters the running state.
/// </para>
/// <para>
/// "Thinning" is defined in a format-specific manner.
/// For some formats (such as ASF), thinning will mean dropping
/// all frames that are not I-frames.
/// If the component produces stream data (like a Media Source
/// or a demultiplexer), it should pay attention
/// to the fThin argument and return MF_E_THINNING_UNSUPPORTED
/// if it cannot thin the stream.
/// If the component processes or receives a stream (like
/// most transforms or Media Sinks), it may ignore this
/// parameter if it does not care whether the stream is thinned.
/// In the Media Session's implementation of rate support,
/// if the transforms do not explicitly support reverse playback,
/// the Media Session will attempt to do reverse playback in
/// thinned mode (but will not do so unthinned).
/// Therefore, most applications will set fThin to TRUE
/// when using the Media Session for reverse playback.
/// </para>
/// </remarks>
HRESULT SetRate(
[in] BOOL fThin,
[in] float flRate
);
/// <summary>
/// Queries the component's current rate
/// </summary>
/// <param name="pfThin">
/// Optional; may be NULL.
/// Pointer to a variable whose value will indicate whether
/// the stream is being thinned.
/// Implementations that do not understand thinning should set
/// this value to FALSE.
/// </param>
/// <param name="pflRate">
/// Pointer to a variable to receive the current rate
/// </param>
HRESULT GetRate(
[in, out, unique] BOOL *pfThin,
[in, out, unique] float *pflRate
);
};
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(ab9d8661-f7e8-4ef4-9861-89f334f94e74),
local
]
/// <summary>
/// IMFTimecodeTranslate interface is used to convert SMPTE timecodes to and from hundered nanoseconds units.
/// </summary>
interface IMFTimecodeTranslate : IUnknown
{
/// <summary>
/// Converts SMPTE Timecode to hunderd nanoseconds
/// </summary>
HRESULT BeginConvertTimecodeToHNS(
[in] const PROPVARIANT *pPropVarTimecode,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
HRESULT EndConvertTimecodeToHNS(
[in] IMFAsyncResult *pResult,
[out] MFTIME *phnsTime
);
HRESULT BeginConvertHNSToTimecode(
[in] MFTIME hnsTime,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
HRESULT EndConvertHNSToTimecode(
[in] IMFAsyncResult *pResult,
[out] PROPVARIANT *pPropVarTimecode
);
};
//
// This service GUID should be passed to the component's implementation
// of IMFGetService::GetService to obtain the IMFTimecodeTranslate service
//
cpp_quote( "EXTERN_GUID( MF_TIMECODE_SERVICE, 0xa0d502a7, 0x0eb3, 0x4885, 0xb1, 0xb9, 0x9f, 0xeb, 0x0d, 0x08, 0x34, 0x54 );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(089EDF13-CF71-4338-8D13-9E569DBDC319)
]
/// <summary>
/// This interface is used to set the application's session audio volume through Media Foundation.
/// It can be obtained via IMFGetService.
/// </summary>
interface IMFSimpleAudioVolume : IUnknown
{
HRESULT SetMasterVolume(
[in] float fLevel
);
HRESULT GetMasterVolume(
[out] float *pfLevel
);
HRESULT SetMute(
[in] const BOOL bMute
);
HRESULT GetMute(
[out] BOOL *pbMute
);
}
//
// Use this service GUID to retrieve IMFSimpleAudioVolume through
// IMFGetService::GetService
//
cpp_quote( "EXTERN_GUID( MR_POLICY_VOLUME_SERVICE, 0x1abaa2ac, 0x9d3b, 0x47c6, 0xab, 0x48, 0xc5, 0x95, 0x6, 0xde, 0x78, 0x4d);" )
[
object,
uuid(76B1BBDB-4EC8-4f36-B106-70A9316DF593)
]
/// <summary>
/// This interface is used to set the stream audio volume through Media Foundation.
/// The IMFSimpleAudioVolume is the recommended way for Media Foundation applications
/// to control audio volume; however, this volume interface is provided for special cases
/// where an application needs to control the volume of an individual audio stream without
/// affecting the overall application volume.
/// It is implemented on the Streaming Audio Renderer sink (SAR) and is obtained via IMFGetService.
/// </summary>
interface IMFAudioStreamVolume : IUnknown
{
HRESULT GetChannelCount(
[out] UINT32 *pdwCount
);
HRESULT SetChannelVolume(
[in] UINT32 dwIndex,
[in] const float fLevel
);
HRESULT GetChannelVolume(
[in] UINT32 dwIndex,
[out] float *pfLevel
);
HRESULT SetAllVolumes(
[in] UINT32 dwCount,
[in, size_is(dwCount)] const float *pfVolumes
);
HRESULT GetAllVolumes(
[in] UINT32 dwCount,
[out, size_is(dwCount)] float *pfVolumes
);
}
//
// Use this service GUID to retrieve IMFAudioStreamVolume through
// IMFGetService::GetService
//
cpp_quote( "EXTERN_GUID( MR_STREAM_VOLUME_SERVICE, 0xf8b5fa2f, 0x32ef, 0x46f5, 0xb1, 0x72, 0x13, 0x21, 0x21, 0x2f, 0xb2, 0xc4);" )
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(a0638c2b-6465-4395-9ae7-a321a9fd2856),
local
]
/// <summary>
/// This interface is used to set the audio policy through Media Foundation.
/// It can be obtained via IMFGetService.
/// </summary>
interface IMFAudioPolicy : IUnknown
{
HRESULT SetGroupingParam(
[in] REFGUID rguidClass
);
HRESULT GetGroupingParam(
[out, annotation("__out")] GUID *pguidClass
);
HRESULT SetDisplayName(
[in] LPCWSTR pszName
);
HRESULT GetDisplayName(
[out, annotation("__deref_out")] LPWSTR *pszName
);
HRESULT SetIconPath(
[in] LPCWSTR pszPath
);
HRESULT GetIconPath(
[out, annotation("__deref_out")] LPWSTR *pszPath
);
};
//
// Use this service GUID to retrieve IMFAudioPolicy through
// IMFGetService::GetService
//
cpp_quote( "EXTERN_GUID( MR_AUDIO_POLICY_SERVICE, 0x911fd737, 0x6775, 0x4ab0, 0xa6, 0x14, 0x29, 0x78, 0x62, 0xfd, 0xac, 0x88);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(8C7B80BF-EE42-4b59-B1DF-55668E1BDCA8),
local
]
interface IMFSampleGrabberSinkCallback : IMFClockStateSink
{
//
// Presentation Clock Setting
//
HRESULT OnSetPresentationClock(
[in] IMFPresentationClock* pPresentationClock
);
//
// Process Sample
//
HRESULT OnProcessSample(
[in] REFGUID guidMajorMediaType,
[in] DWORD dwSampleFlags,
[in] LONGLONG llSampleTime,
[in] LONGLONG llSampleDuration,
[in, annotation("__in_bcount(dwSampleSize)")] const BYTE * pSampleBuffer,
[in] DWORD dwSampleSize
);
//
// Shutdown
//
HRESULT OnShutdown();
}
cpp_quote( "STDAPI" )
cpp_quote( "MFCreateSampleGrabberSinkActivate(" )
cpp_quote( " IMFMediaType *pIMFMediaType,")
cpp_quote( " IMFSampleGrabberSinkCallback* pIMFSampleGrabberSinkCallback," )
cpp_quote( " __out IMFActivate** ppIActivate" )
cpp_quote( " );" )
//
// Sample Grabber Sink Activate Attributes
//
// MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET
// Data type: UINT64
// The MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET value will be subtracted from the sample time when the Sample Grabber Sink
// is deciding when to present the sample (via the Sample Grabber Sink Callback.) The Sample Grabber Sink will not modify
// the original time stamp in the sample. This attribute is used to have the Sample Grabber Sink send samples before the
// presentation clock has reached the sample time.
// The units of this attribute are in 100 NS (MFTime).
// If this attribute is not present, a value of 0 is used.
cpp_quote( "EXTERN_GUID( MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET, 0x62e3d776, 0x8100, 0x4e03, 0xa6, 0xe8, 0xbd, 0x38, 0x57, 0xac, 0x9c, 0x47);" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
// MF_SAMPLEGRABBERSINK_IGNORE_CLOCK
// Data type: BOOL (UINT32)
// Typically, the sample grabber sink will push out samples based upon the current presentation time. This can result
// in delays for clients that do not need sample output to be synchronized with the presentation clock. To ignore
// the clock and have the sample grabber sink push out samples as fast as possible, set this attribute to 1.
cpp_quote( "EXTERN_GUID( MF_SAMPLEGRABBERSINK_IGNORE_CLOCK, 0x0efda2c0, 0x2b69, 0x4e2e, 0xab, 0x8d, 0x46, 0xdc, 0xbf, 0xf7, 0xd2, 0x5d);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(ca86aa50-c46e-429e-ab27-16d6ac6844cb),
local
]
/// <summary>
/// The IMFSampleGrabberSinkCallback2 is used by the MF SampleGrabberSink to deliver samples to the implementer of this interface.
/// </summary>
/// <remarks>
/// Since this interface inherits from IMFSampleGrabberSinkCallback, the SampleGrabberSink (SGS) will attempt to QI for the IMFSampleGrabberSinkCallback2 interface.
/// If it finds the IMFSampleGrabberSinkCallback2 interface, then the SGS will ONLY deliver samples via the IMFSampleGrabberSinkCallback2::OnProcessSampleEx(...) method
/// and never use the IMFSampleGrabberSinkCallback::OnProcessSample(...) method. However, if the callback object used to create the SGS only implements the
/// IMFSampleGrabberSinkCallback interface, then the SGS will naturally use the IMFSampleGrabberSinkCallback::OnProcessSample(...) to deliver the samples.
/// </remarks>
interface IMFSampleGrabberSinkCallback2 : IMFSampleGrabberSinkCallback
{
/// <summary>
/// The OnProcessSampleEx method is called by the SampleGrabberSink to deliver samples.
/// </summary>
/// <param name=guidMajorMediaType>
/// The major GUID type of the sample being delivered
/// </param>
/// <param name=dwSampleFlags>
/// The sample flags of the sample being delivered
/// </param>
/// <param name=llSampleTime>
/// The timestamp in HNS units of the sample being delivered
/// </param>
/// <param name=llSampleDuration>
/// The duration in HNS units of the sample being delivered
/// </param>
/// <param name=pSampleBuffer>
/// A byte pointer to the sample data
/// </param>
/// <param name=dwSampleSize>
/// The size in bytes of the data pointed to by the pSampleBuffer argument.
/// </param>
/// <param name=pAttributes>
/// IMFAttributes pointer that allows the retrieval of the sample attributes
/// </param>
HRESULT OnProcessSampleEx(
[in] REFGUID guidMajorMediaType,
[in] DWORD dwSampleFlags,
[in] LONGLONG llSampleTime,
[in] LONGLONG llSampleDuration,
[in, annotation("__in_bcount(dwSampleSize)")] const BYTE * pSampleBuffer,
[in] DWORD dwSampleSize,
[in, annotation("__in")] IMFAttributes* pAttributes
);
}
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
cpp_quote( "EXTERN_GUID( MF_QUALITY_SERVICES, 0xb7e2be11, 0x2f96, 0x4640, 0xb5, 0x2c, 0x28, 0x23, 0x65, 0xbd, 0xf1, 0x6c);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(35FE1BB8-A3A9-40fe-BBEC-EB569C9CCCA3),
]
/// <summary>
/// The IMFWorkQueueServices can be obtained from the session by querying
/// for the MF_WORKQUEUE_SERVICES service
/// </summary>
/// <remarks>
/// This interface allows applications to control
/// both platform and topology workqueues
/// </remarks>
interface IMFWorkQueueServices : IUnknown
{
/// <summary>
/// The BeginRegisterTopologyWorkQueuesWithMMCSS method parses
/// the topology nodes and registers the assigned workqueues
/// with the appropriate MMCSS classes
/// </summary>
/// <param name=pCallback>
/// Standard callback used for async operations in MF
/// </param>
/// <param name=pState>
/// Standard state used for async operations in MF
/// </param>
[local]
HRESULT BeginRegisterTopologyWorkQueuesWithMMCSS(
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
[call_as(BeginRegisterTopologyWorkQueuesWithMMCSS)]
HRESULT RemoteBeginRegisterTopologyWorkQueuesWithMMCSS(
[in] IMFRemoteAsyncCallback * pCallback );
/// <summary>
/// The EndRegisterTopologyWorkQueuesWithMMCSS method is called
/// by the application when all the WorkQueues of the current topology
/// have been registered with MMCSS
/// </summary>
/// <param name=pResult>
/// Standard result passed to end MF async operations
/// </param>
[local]
HRESULT EndRegisterTopologyWorkQueuesWithMMCSS(
[in] IMFAsyncResult * pResult );
[call_as(EndRegisterTopologyWorkQueuesWithMMCSS)]
HRESULT RemoteEndRegisterTopologyWorkQueuesWithMMCSS(
[in] IUnknown * pResult );
/// <summary>
/// The BeginUnregisterTopologyWorkQueuesWithMMCSS method unregisters
/// the assigned workqueues from MMCSS
/// </summary>
/// <param name=pCallback>
/// Standard callback used for async operations in MF
/// </param>
/// <param name=pState>
/// Standard state used for async operations in MF
/// </param>
[local]
HRESULT BeginUnregisterTopologyWorkQueuesWithMMCSS(
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
[call_as(BeginUnregisterTopologyWorkQueuesWithMMCSS)]
HRESULT RemoteBeginUnregisterTopologyWorkQueuesWithMMCSS(
[in] IMFRemoteAsyncCallback * pCallback );
/// <summary>
/// The EndUnregisterTopologyWorkQueuesWithMMCSS method is called
/// by the application when all the WorkQueues of the current topology
/// have been unregistered from MMCSS
/// </summary>
/// <param name=pResult>
/// Standard result passed to end MF async operations
/// </param>
[local]
HRESULT EndUnregisterTopologyWorkQueuesWithMMCSS(
[in] IMFAsyncResult * pResult );
[call_as(EndUnregisterTopologyWorkQueuesWithMMCSS)]
HRESULT RemoteEndUnregisterTopologyWorkQueuesWithMMCSS(
[in] IUnknown * pResult );
/// <summary>
/// Retrieves the MMCSS class string associated with
/// the given topology workqueue
/// </summary>
/// <param name=dwTopologyWorkQueueId>
/// Topology workqueue id for which the info will be returned
/// </param>
/// <param name=pwszClass>
/// Pointer to an array of WCHARs allocated by the caller
/// </param>
/// <param name=pcchClass>
/// Size, in number of characters, of the pwszClass array
/// </param>
HRESULT GetTopologyWorkQueueMMCSSClass(
[in] DWORD dwTopologyWorkQueueId,
[out, size_is( *pcchClass )] LPWSTR pwszClass,
[in, out] DWORD * pcchClass );
/// <summary>
/// Retrieves the MMCSS class string associated with
/// the given topology workqueue
/// </summary>
/// <param name=dwTopologyWorkQueueId>
/// Topology workqueue id for which the info will be returned
/// </param>
/// <param name=pdwTaskId>
/// Pointer to a buffer allocated by the caller
/// The workqueue's MMCSS task id will be filled in
/// </param>
HRESULT GetTopologyWorkQueueMMCSSTaskId(
[in] DWORD dwTopologyWorkQueueId,
[out] DWORD * pdwTaskId );
/// <summary>
/// The BeginRegisterPlatformWorkQueueWithMMCSS method registers
/// the specified platform workqueue with MMCSS using the specified
/// class and taskId
/// </summary>
/// <param name=dwPlatformWorkQueue>
/// The id of one of the standard platform workqueues
/// </param>
/// <param name=wszClass>
/// The MMCSS class which the workqueue should be registered with
/// </param>
/// <param name=dwTaskId>
/// The task id which the workqueue should be registered to
/// If dwTaskId is 0, new MMCSS bucket will be created
/// </param>
/// <param name=pCallback>
/// Standard callback used for async operations in MF
/// </param>
/// <param name=pState>
/// Standard state used for async operations in MF
/// </param>
[local]
HRESULT BeginRegisterPlatformWorkQueueWithMMCSS(
[in] DWORD dwPlatformWorkQueue,
[in] LPCWSTR wszClass,
[in] DWORD dwTaskId,
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
[call_as(BeginRegisterPlatformWorkQueueWithMMCSS)]
HRESULT RemoteBeginRegisterPlatformWorkQueueWithMMCSS(
[in] DWORD dwPlatformWorkQueue,
[in] LPCWSTR wszClass,
[in] DWORD dwTaskId,
[in] IMFRemoteAsyncCallback * pCallback );
/// <summary>
/// The EndRegisterPlatformWorkQueueWithMMCSS method should be called
/// by the application when the platform workqueue has been registered with MMCSS
/// </summary>
/// <param name=pResult>
/// Standard result passed to end MF async operations
/// </param>
/// <param name=pdwTaskId>
/// This buffer will be filled with the TaskId of the specified workqueue
/// </param>
[local]
HRESULT EndRegisterPlatformWorkQueueWithMMCSS(
[in] IMFAsyncResult * pResult,
[out, annotation("__out")] DWORD* pdwTaskId );
[call_as(EndRegisterPlatformWorkQueueWithMMCSS)]
HRESULT RemoteEndRegisterPlatformWorkQueueWithMMCSS(
[in] IUnknown * pResult,
[out] DWORD* pdwTaskId );
/// <summary>
/// The BeginUnregisterPlatformWorkQueueWithMMCSS method unregisters
/// the specified platform workqueue from MMCSS
/// </summary>
/// <param name=dwPlatformWorkQueue>
/// The id of one of the standard platform workqueues
/// </param>
/// <param name=pCallback>
/// Standard callback used for async operations in MF
/// </param>
/// <param name=pState>
/// Standard state used for async operations in MF
/// </param>
[local]
HRESULT BeginUnregisterPlatformWorkQueueWithMMCSS(
[in] DWORD dwPlatformWorkQueue,
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
[call_as(BeginUnregisterPlatformWorkQueueWithMMCSS)]
HRESULT RemoteBeginUnregisterPlatformWorkQueueWithMMCSS(
[in] DWORD dwPlatformWorkQueue,
[in] IMFRemoteAsyncCallback * pCallback );
/// <summary>
/// The EndUnregisterPlatformWorkQueueWithMMCSS method should be called
/// by the application when the platform workqueue has been unregistered from MMCSS
/// </summary>
/// <param name=pResult>
/// Standard result passed to end MF async operations
/// </param>
[local]
HRESULT EndUnregisterPlatformWorkQueueWithMMCSS(
[in] IMFAsyncResult * pResult );
[call_as(EndUnregisterPlatformWorkQueueWithMMCSS)]
HRESULT RemoteEndUnregisterPlatformWorkQueueWithMMCSS(
[in] IUnknown * pResult );
/// <summary>
/// Retrieves the MMCSS class string associated with
/// the given platform workqueue
/// </summary>
/// <param name=dwPlatformWorkQueueId>
/// Topology workqueue id for which the info will be returned
/// </param>
/// <param name=pwszClass>
/// Pointer to an array of WCHARs allocated by the caller
/// </param>
/// <param name=pcchClass>
/// Size, in number of characters, of the pwszClass array
/// </param>
HRESULT GetPlaftormWorkQueueMMCSSClass(
[in] DWORD dwPlatformWorkQueueId,
[out, size_is( *pcchClass )] LPWSTR pwszClass,
[in, out] DWORD * pcchClass );
/// <summary>
/// Retrieves the MMCSS class string associated with
/// the given platform workqueue
/// </summary>
/// <param name=dwPlatformWorkQueueId>
/// Topology workqueue id for which the info will be returned
/// </param>
/// <param name=pdwTaskId>
/// Pointer to a buffer allocated by the caller
/// The workqueue's MMCSS task id will be filled in
/// </param>
HRESULT GetPlatformWorkQueueMMCSSTaskId(
[in] DWORD dwPlatformWorkQueueId,
[out] DWORD * pdwTaskId );
};
// {8e37d489-41e0-413a-9068-287c886d8dda}
cpp_quote( "EXTERN_GUID( MF_WORKQUEUE_SERVICES, 0x8e37d489, 0x41e0, 0x413a, 0x90, 0x68, 0x28, 0x7c, 0x88, 0x6d, 0x8d, 0xda);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation Quality Management
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum _MF_QUALITY_DROP_MODE
{
MF_DROP_MODE_NONE = 0x0,
MF_DROP_MODE_1 = 0x1,
MF_DROP_MODE_2 = 0x2,
MF_DROP_MODE_3 = 0x3,
MF_DROP_MODE_4 = 0x4,
MF_DROP_MODE_5 = 0x5,
MF_NUM_DROP_MODES = 0x6 // Helper value, indicates the # of drop modes supported.
} MF_QUALITY_DROP_MODE;
typedef enum _MF_QUALITY_LEVEL
{
MF_QUALITY_NORMAL = 0x0,
MF_QUALITY_NORMAL_MINUS_1 = 0x1,
MF_QUALITY_NORMAL_MINUS_2 = 0x2,
MF_QUALITY_NORMAL_MINUS_3 = 0x3,
MF_QUALITY_NORMAL_MINUS_4 = 0x4,
MF_QUALITY_NORMAL_MINUS_5 = 0x5,
MF_NUM_QUALITY_LEVELS = 0x6 // Helper value, indicates the # of quality levels supported.
} MF_QUALITY_LEVEL;
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
typedef enum _MF_QUALITY_ADVISE_FLAGS
{
MF_QUALITY_CANNOT_KEEP_UP = 0x1,
} MF_QUALITY_ADVISE_FLAGS;
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(8D009D86-5B9F-4115-B1FC-9F80D52AB8AB),
local
]
/// <summary>
/// Generic interface which 3rd party quality managers will need to
/// support. They will get a topology and a clock.
/// </summary>
interface IMFQualityManager : IUnknown
{
/// <summary>
/// The NotifyTopology method is called by the media processor to
// pass to the QM the topology that its about to use.
/// </summary>
/// <param name="pTopology">
/// Pointer to the topology about to be used by Media Processor.
/// Pass in NULL to inform the quality manager to release
/// references to the topology.
/// </param>
HRESULT NotifyTopology( [in] IMFTopology * pTopology );
/// <summary>
/// The NotifyPresentationClock method is called by the
/// media processor to pass QM the presentation clock for the
/// current presentation.
/// </summary>
/// <param name="pClock">
/// Pointer to the clock that will be used for the current
/// presentation. Pass in NULL to inform the quality manager
/// to release references to the clock.
/// </param>
/// <remarks>
/// The quality manager may subscribe to the clock to be informed
/// of state changes, as well as the direction of playback
/// (forward or reverse) and the rate.
/// </remarks>
HRESULT NotifyPresentationClock( [in] IMFPresentationClock * pClock );
/// <summary>
/// The NotifyProcessInput method is called when the media proc is
/// about to deliver a sample to a component
/// </summary>
/// <param name=pNode>
/// Pointer to the node media processor is about to deliver data to.
/// </param>
/// <param name=lInputIndex>
/// The index of the input on the node data is being fed to.
/// </param>
/// <param name=pSample>
/// Pointer to the sample about to be fed into the topology node.
/// </param>
/// <remarks>
/// This method is called for every sample passing through every
/// component. To avoid increasing the steady state latency too much,
/// it needs to be as quick as possible.
/// </remarks>
HRESULT NotifyProcessInput(
[in] IMFTopologyNode * pNode,
[in] long lInputIndex,
[in] IMFSample * pSample
);
/// <summary>
/// The NotifyProcessOutput method is called when the media proc
/// receives a sample from a component
/// </summary>
/// <param name=pNode>
/// Pointer to the node the media processor has received data from.
/// </param>
/// <param name=lOutputIndex>
/// The index of the output on the node data was produced from.
/// </param>
/// <param name=pSample>
/// Pointer to the sample that was produced by the topology node.
/// </param>
/// <remarks>
/// This method is called for every sample passing through every
/// component. To avoid increasing the steady state latency too much,
/// it needs to be as quick as possible.
/// </remarks>
HRESULT NotifyProcessOutput(
[in] IMFTopologyNode * pNode,
[in] long lOutputIndex,
[in] IMFSample * pSample
);
/// <summary>
/// This callback is made to the Quality manager by the pipeline in
/// response to the MEQualityNotify event.
/// </summary>
/// <param name=pObject>
/// Pointer to the Object from which the notification is coming in.
/// This is not the topo node. In case of MFTs this will be the MFT
/// specifed on the toponode. In the case of sinks this will be the
/// Media sink object itself.
/// </param>
/// <param name=pEvent>
/// The event pointer.
/// </param>
/// <remarks>
/// See data on the MEQualityNotify
/// </remarks>
HRESULT NotifyQualityEvent(
[in] IUnknown * pObject,
[in] IMFMediaEvent *pEvent );
/// <summary>
/// Called when the session is being shutdown
/// </summary>
/// <remarks>
/// Releases references on pipeline components.
/// </remarks>
HRESULT Shutdown();
};
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Creates the default MF Quality Manager.
/// </summary>
/// <param name="ppQualityManager">
/// A pointer to receive the MF Quality Manager.
/// </param>
/// <remarks>
/// A 3rd party can create the default MF Quality Manager using
/// this function. It could be used to sub-class its functionality.
/// </remarks>
cpp_quote( "STDAPI MFCreateStandardQualityManager(" )
cpp_quote( " __out IMFQualityManager **ppQualityManager );" )
///////////////////////////////////////////////////////////////////////////////
// GUIDs to go with MEQualityNotify
//
// {F6B44AF8-604D-46fe-A95D-45479B10C9BC}
cpp_quote( "EXTERN_GUID( MF_QUALITY_NOTIFY_PROCESSING_LATENCY, 0xf6b44af8, 0x604d, 0x46fe, 0xa9, 0x5d, 0x45, 0x47, 0x9b, 0x10, 0xc9, 0xbc );" )
// {30D15206-ED2A-4760-BE17-EB4A9F12295C}
cpp_quote( "EXTERN_GUID( MF_QUALITY_NOTIFY_SAMPLE_LAG, 0x30d15206, 0xed2a, 0x4760, 0xbe, 0x17, 0xeb, 0x4a, 0x9f, 0x12, 0x29, 0x5c );" )
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(EC15E2E9-E36B-4f7c-8758-77D452EF4CE7)
]
/// <summary>
/// Implemented by a component which can respond to quality adjustment requests from the Quality Manager.
/// </summary>
interface IMFQualityAdvise: IUnknown
{
/// <param name="eDropMode">
/// The Quality Manager can request the component to go into a
/// particular drop mode. The component can define what it wants to do
/// for each drop level. See remarks section for some examples. MF
/// defines 6 drop modes: MF_DROP_MODE_NONE, MF_DROP_MODE_1,
/// MF_DROP_MODE_2, ... MF_DROP_MODE_5
/// </param>
/// <remarks>
/// As an example, consider a video decoder which supports 3 drop modes.
/// For example, if the content has 3 B-frames between each pair of
/// P-frames, the decoder might decide the following 3 drop modes:
/// -- Drop 1 B-frame for every 2 B-frames
/// -- Drop every alternate B-frame
/// -- Drop P-frames and go to key frame only mode
///
/// If the quality of playback is not improving over time the Quality Manager
/// might make the following calls to this video decoder:
/// -- SetDropMode( MF_DROP_MODE_NONE ). The decoder returns S_OK
/// and knows that it should decode all samples.
/// -- SetDropMode( MF_DROP_MODE_1 ). The decoder returns S_OK and
/// starts dropping 1 B-frame for every 2 B-frames.
/// -- SetDropMode( MF_DROP_MODE_2 ). The decoder returns S_OK and
/// starts dropping every alternate B-frame
/// -- SetDropMode( MF_DROP_MODE_3).
/// -- SetDropMode( MF_DROP_MODE_4). The decoder returns
/// MF_E_NO_MORE_DROP_MODES and start dropping P-frames. The
/// special return code tells the Quality Manager that there the
/// maximum drop mode is reached. The Quality Manager will not call
/// SetDropMode( MF_DROP_MODE_4) on this component.
/// </remarks>
/// <returns>
/// If the method succeeds it returns S_OK. If the component has
/// reached its highest level of drop mode it should return
/// MF_E_NO_MORE_DROP_MODES. This indicates to the Quality Manager
/// that it cannot request any more drop modes from this component.
/// </returns>
HRESULT SetDropMode(
[in] MF_QUALITY_DROP_MODE eDropMode );
/// <param name="eQualityLevel">
/// The Quality Manager can request the component to reduce its output
/// to a particular quality level. The component can define what it wants
/// to do for each quality level. See remarks section for some examples.
/// MF defines 6 quality levels: MF_QUALITY_NORMAL,
/// MF_QUALITY_NORMAL_MINUS_1, MF_QUALITY_NORMAL_MINUS_2,
/// ... MF_QUALITY_NORMAL_MINUS_5.
/// </param>
/// <remarks>
/// As an example, consider a video decoder which has 4 steps in
/// post-processing of the decoded video. This decoder can drop these
/// post-processing steps to produce frames faster even though they are
/// at a lower quality.
/// If the quality of playback is not improving over time the QM might
/// make the following calls to this video decoder:
/// -- SetQualityLevel(MF_QUALITY_NORMAL). The decoder returns S_OK
/// and knows that it should use all the normal post processing steps.
/// -- SetQualityLevel (MF_QUALITY_NORMAL_MINUS_1). The decoder
/// returns S_OK and stops doing one of the post-processing steps.
/// -- SetQualityLevel (MF_QUALITY_NORMAL_MINUS_2). The decoder
/// returns S_OK and stops doing one of the post-processing steps.
/// -- ...
/// -- SetQualityLevel (MF_QUALITY_NORMAL_MINUS_4). The decoder
/// returns S_OK and stops doing one of the post-processing steps.
/// -- SetQualityLevel( MF_QUALITY_NORMAL_MINUS_5). The decoder returns
/// MF_E_NO_MORE_QUALITY_LEVELS. The special return code tells the
/// Quality Manager that the minimum level of quality has been
/// reached. The Quality Manager will not call
/// SetQualityLevel (MF_QUALITY_NORMAL_MINUS_5) on this component.
/// </remarks>
/// <returns>
/// If the method succeeds it returns S_OK. If the component has
/// reached its lowest level of quality it should return
/// MF_E_NO_MORE_QUALITY_LEVELS. This indicates to the
/// Quality Manager that it cannot request any more quality levels
/// below the currently requested level.
/// </returns>
HRESULT SetQualityLevel(
[in] MF_QUALITY_LEVEL eQualityLevel );
/// <param name="peDropMode">
/// The current Drop mode is returned by the component.
/// </param>
midl_pragma warning (disable: 2495)
HRESULT GetDropMode(
[out, annotation("__out")] MF_QUALITY_DROP_MODE *peDropMode );
midl_pragma warning (default: 2495)
/// <param name="peQualityLevel">
/// The current quality level is returned by the component.
/// </param>
midl_pragma warning (disable: 2495)
HRESULT GetQualityLevel(
[out, annotation("__out")] MF_QUALITY_LEVEL *peQualityLevel );
midl_pragma warning (default: 2495)
/// <param name="hnsAmountToDrop">
/// The component should drop samples covering the time interval
/// hnsDropTime.
/// </param>
/// <remarks>
/// This is to get A/V back in sync once we are already out of sync.
/// If video is already late by 30 ms, adjusting the quality on the
/// video will not help. The quality will go down but that does not
/// mean rendering will catch up. In such a scenario we will ask the
/// EVR to DropTime( 30 ms ), indicating that it should drop 30 ms
/// of data to quickly catch up. This functionality might not make
/// sense for the decoder, the decoder can just return an error
/// from this call.
///
/// If DropTime is called multiple times, the hnsAmountToDrop value is
/// absolute. The renderer should not add/aggregate the
/// hnsAmountToDrop value from subsequent calls.
///
/// The caller can give a DropTime value of zero to ask the component
/// to come out of its DropTime mode.
/// </remarks>
/// <returns>
/// S_OK on success. MF_E_DROPTIME_NOT_SUPPORTED if the
/// component does not support drop time.
/// </returns>
HRESULT DropTime(
[in] LONGLONG hnsAmountToDrop );
};
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(F3706F0D-8EA2-4886-8000-7155E9EC2EAE)
]
/// <summary>
/// Implemented by a component which can respond to quality notifications from the Quality Manager
/// and wants to manage its quality parameters itself
/// </summary>
interface IMFQualityAdvise2: IMFQualityAdvise
{
/// <summary>
/// This callback is made to the component by the Quality manager in
/// response to the MEQualityNotify event from the sink.
/// </summary>
/// <param name=pEvent>
/// The event pointer.
/// </param>
/// <param name=pdwFlags>
/// Flags specifying the state of the component.
/// See the enumeration MF_QUALITY_ADVISE_FLAGS.
/// </param>
/// <remarks>
/// See data on the MEQualityNotify
/// </remarks>
HRESULT NotifyQualityEvent(
[in] IMFMediaEvent *pEvent,
[out] DWORD *pdwFlags);
};
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(dfcd8e4d-30b5-4567-acaa-8eb5b7853dc9)
]
/// <summary>
/// Reports back the maximum drop and minimum quality levels
/// </summary>
interface IMFQualityAdviseLimits: IUnknown
{
/// <param name="peDropMode">
/// The current Drop mode is returned by the component.
/// </param>
midl_pragma warning (disable: 2495)
HRESULT GetMaximumDropMode(
[out, annotation("__out")] MF_QUALITY_DROP_MODE *peDropMode );
midl_pragma warning (default: 2495)
/// <param name="peQualityLevel">
/// The current quality level is returned by the component.
/// </param>
midl_pragma warning (disable: 2495)
HRESULT GetMinimumQualityLevel(
[out, annotation("__out")] MF_QUALITY_LEVEL *peQualityLevel );
midl_pragma warning (default: 2495)
};
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(2347D60B-3FB5-480c-8803-8DF3ADCD3EF0),
local
]
/// <summary>
/// Implemented by components who spin off new threads and need to enlist
/// these threads in MMCSS in the same group with the rest of MF threads.
/// </summary>
interface IMFRealTimeClient : IUnknown
{
/// <summary>
/// This method is called by MF when the RT operations start.
/// Implementation uses this data for enlisting threads in MMCSS
/// </summary>
HRESULT RegisterThreads(
[in] DWORD dwTaskIndex,
[in] LPCWSTR wszClass );
/// <summary>
/// This method is called by MF when the RT operations end
/// Implementation can deregister the threads now
/// </summary>
HRESULT UnregisterThreads( );
/// <summary>
/// The application can ask the pipeline to run different branches of the topology
/// on different work queues. When the pipeline is using private workqueues it will
/// notify components on that brach about which work queue is being used through this
/// function.
/// </summary>
HRESULT SetWorkQueue(
[in] DWORD dwWorkQueueId );
};
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation sequence playback interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef DWORD MFSequencerElementId;
const DWORD MFSEQUENCER_INVALID_ELEMENT_ID = 0xffffffff;
typedef enum _MFSequencerTopologyFlags
{
SequencerTopologyFlags_Last = 0x00000001,
} MFSequencerTopologyFlags;
[
object,
uuid(197CD219-19CB-4de1-A64C-ACF2EDCBE59E),
local
]
/// <summary>
/// IMFSequencerSource allows the caller to queue multiple topologies for
/// rendering.
/// </summary>
interface IMFSequencerSource : IUnknown
{
/// <summary>
/// AppendTopology adds a topology to the end of the queue of
/// topologies.
/// </summary>
/// <param name="pTopology">
/// Pointer to the topology to be queued. This pointer can be NULL.
/// </param>
/// <param name="dwFlags">
/// Combination of MFSequencerTopologyFlags.
/// </param>
/// <param name="pdwId">
/// Pointer to a variable to receive the sequencer element ID
/// that the sequencer assigns to this topology
/// </param>
/// <remarks>
/// Topologies are played by the sequencer in the order in which
/// they are queued up.
/// The application indicates that no more topologies will be queued
/// either by setting the SequencerTopologyFlags_Last flag or
/// by calling AppendTopology with a NULL pTopology.
/// It is important to tell the sequencer that there are no more
/// topologies coming. It uses this information to end playback
/// in the pipeline. If the application does not indicate when
/// there are no more topologies to be queued, the sequencer will
/// wait for a new topology to be queued up even if it has finished
/// playing everything it currently has.
/// </remarks>
HRESULT AppendTopology(
[in] IMFTopology *pTopology,
[in] DWORD dwFlags,
[out, annotation("__out")] MFSequencerElementId *pdwId );
/// <summary>
/// Deletes topology by ID.
/// </summary>
/// <param name="dwId">
/// Sequencer element ID of the topology to delete
/// </param>
HRESULT DeleteTopology(
[in] MFSequencerElementId dwId);
/// <summary>
/// GetPresentationContext maps a Presentation Descriptor to
/// its associated sequencer element ID and topology.
/// </summary>
/// <param name="pPD>
/// Pointer to the Presentation Descriptor to map
/// </param>
/// <param name="pId">
/// Pointer to a variable that will receive the sequencer element
/// ID associated with pPD.
/// </param>
/// <param name="ppTopology">
/// Topology associated with this sequencer element
/// The return value can be NULL if sequencer has already switched to the next presentation
/// </param>
/// <returns>
/// <para> S_OK: On success</para>
/// <para>
/// MF_S_SEQUENCER_CONTEXT_CANCELED : For a topology which was cancelled.
/// A cancelled topology is one which was prerolled but was then discarded because
/// of a change in the order of playback. When a topology is cancelled the user will
/// get events from the session when the topology is set, started, ended, etc. but the
/// topology will not process any data.
/// </para>
/// </returns>
///
HRESULT GetPresentationContext(
[in] IMFPresentationDescriptor* pPD,
[out, optional, annotation("__out_opt")] MFSequencerElementId *pId,
[out, optional, annotation("__out_opt")] IMFTopology **ppTopology );
/// <summary>
/// UpdateTopology updates a topology in the queue
/// </summary>
/// <param name="dwId">
/// Sequencer element ID for this topology
/// </param>
/// <param name="pTopology">
/// Updated topology for this sequencer element.
/// Ignored unless SequencerTopologyMask_Topology is set in dwMask
/// </param>
HRESULT UpdateTopology(
[in] MFSequencerElementId dwId,
[in] IMFTopology *pTopology);
/// <summary>
/// UpdateTopologyFlags updates a topology in the queue
/// </summary>
/// <param name="dwId">
/// Sequencer element ID for this topology
/// </param>
/// <param name="dwFlags">
/// Bitflags defined by MFSequencerTopologyFlags.
/// Ignored unless SequencerTopologyMask_Flags is set in dwMask
/// </param>
HRESULT UpdateTopologyFlags(
[in] MFSequencerElementId dwId,
[in] DWORD dwFlags);
};
//
// Sequencer constants
//
//
// MF_TIME_FORMAT_SEGMENT_OFFSET can be used as the pguidTimeFormat argument
// to IMFMediaSession::Start and IMFMediaSource::Start to indicate that
// playback should start at a given offset relative to a sequencer element.
// The associated PROPVARIANT can be created by calling
// MFCreateSequencerSegmentOffset.
//
cpp_quote( "EXTERN_GUID( MF_TIME_FORMAT_SEGMENT_OFFSET, 0xc8b8be77, 0x869c, 0x431d, 0x81, 0x2e, 0x16, 0x96, 0x93, 0xf6, 0x5a, 0x39 );" )
//
// Sequencer functions
//
/// <summary>
/// Creates a Sequencer Source
/// </summary>
/// <param name="pReserved">
/// MUST be NULL
/// </param>
/// <param name="pCallback">
/// Pointer to the callback interface. Can be NULL.
/// </param>
/// <param name="ppSequencer">
/// Returns pointer to a Sequencer.
/// </param>
cpp_quote( "STDAPI MFCreateSequencerSource(" )
cpp_quote( " IUnknown *pReserved," )
cpp_quote( " __out IMFSequencerSource **ppSequencerSource" )
cpp_quote( " );" )
/// <summary>
/// Creates a start point for use in IMFMediaSession::Start and
/// IMFMediaSource::Start calls when the time format is
/// MF_TIME_FORMAT_SEGMENT_OFFSET
/// </summary>
/// <param name="dwId">
/// Sequencer element ID of the element in which to start
/// </param>
/// <param name="hnsOffset">
/// Time offset within the specified sequencer element
/// </param>
/// <param name="pvarSegmentOffset">
/// Pointer to receive the PROPVARIANT that should be used with Start()
/// calls
/// </param>
cpp_quote( "STDAPI MFCreateSequencerSegmentOffset(" )
cpp_quote( " MFSequencerElementId dwId," )
cpp_quote( " MFTIME hnsOffset," )
cpp_quote( " __out PROPVARIANT *pvarSegmentOffset" )
cpp_quote( " );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Creates an aggregated IMFMediaSource from a list of input media sources
/// </summary>
/// <param name="pSourceCollection">
/// The collection of media sources to be aggregated. MUST be non-NULL.
/// </param>
/// <param name="ppAggSource">
/// Returns a pointer to the aggregated media source.
/// </param>
cpp_quote( "STDAPI MFCreateAggregateSource(" )
cpp_quote( " __in IMFCollection *pSourceCollection," )
cpp_quote( " __deref_out IMFMediaSource **ppAggSource" )
cpp_quote( " );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(0E1D6009-C9F3-442d-8C51-A42D2D49452F),
]
/// <summary>
/// IMFMediaSourceTopologyProvider is implemented by sequencer sources.
/// </summary>
interface IMFMediaSourceTopologyProvider : IUnknown
{
/// <summary>
/// Maps an IMFPresentationDescriptor to an IMFTopology for
/// this Media Source
/// </summary>
/// <param name="pPresentationDescriptor">
/// Presentation Descriptor for which to obtain the topology.
/// This is generally obtained by obtaining the IMFMediaSource
/// interface pointer for this source and calling
/// IMFMediaSource::CreatePresentationDescriptor
/// </param>
/// <param name="ppTopology">
/// Pointer to a variable that will receive the IMFTopology
/// corresponding to pPresentationDescriptor.
/// The application should use this topology when it calls
/// IMFMediaSession::SetTopology.
/// </param>
HRESULT GetMediaSourceTopology(
[in] IMFPresentationDescriptor* pPresentationDescriptor,
[out] IMFTopology** ppTopology
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(0E1D600a-C9F3-442d-8C51-A42D2D49452F),
]
/// <summary>
/// IMFMediaSourcePresentationProvider is provided by sequencer sources
/// and is obtained via IMFGetService::GetService
/// </summary>
interface IMFMediaSourcePresentationProvider : IUnknown
{
/// <summary>
/// The Media Foundation pipeline calls this method to notify the
/// Media Source that this presentation has hit its markout
/// (or markin, for reverse playback).
/// This is needed in the case of markout (markin for reverse)
/// because the Media Source may not know exactly where it should
/// end this segment to hit the specified markout.
/// </summary>
/// <param name="pPresentationDescriptor">
/// Presentation Descriptor for the presentation whose end we
/// have reached
/// </param>
HRESULT ForceEndOfPresentation(
[in] IMFPresentationDescriptor* pPresentationDescriptor
);
}
//
// MF_SOURCE_PRESENTATION_PROVIDER_SERVICE is the service GUID for
// obtaining IMFMediaSourcePresentationProvider
//
cpp_quote( "EXTERN_GUID( MF_SOURCE_PRESENTATION_PROVIDER_SERVICE, 0xe002aadc, 0xf4af, 0x4ee5, 0x98, 0x47, 0x05, 0x3e, 0xdf, 0x84, 0x04, 0x26 );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// This structure is used in IMFTopologyNodeAttributeEditor::UpdateNodeAttributes.
// NodeId indicate which node's attributes to update.
//
typedef struct _MFTOPONODE_ATTRIBUTE_UPDATE
{
TOPOID NodeId;
GUID guidAttributeKey;
MF_ATTRIBUTE_TYPE attrType;
[switch_is(attrType)] [switch_type(DWORD)] union
{
[case(MF_ATTRIBUTE_UINT32)]
UINT32 u32;
[case(MF_ATTRIBUTE_UINT64)]
UINT64 u64;
[case(MF_ATTRIBUTE_DOUBLE)]
double d;
[default]
;
} ;
} MFTOPONODE_ATTRIBUTE_UPDATE;
[
object,
uuid(676aa6dd-238a-410d-bb99-65668d01605a),
]
/// <summary>
/// IMFTopologyNodeAttributeEditor interface is exposed by pipeline to allow application to change
/// properties on the toponode objects during playback.
/// In the current implementation, the only supported property is MF_TOPONODE_MEDIASTOP.
/// Pipeline will ignore all other properties
/// </summary>
interface IMFTopologyNodeAttributeEditor : IUnknown
{
/// <summary>
/// UpdateNodeAttributes makes one or more updates to
/// the attributes on various nodes in the topology
/// </summary>
/// <param name="TopoId">
/// Topology ID of the topology whose nodes' attributes
/// will be updated
/// </param>
/// <param name="cUpdates">
/// Number of elements in the array pUpdates
/// </param>
/// <param name="pUpdates">
/// Array of size cUpdates of MFSEQUENCER_NODE_ATTRIBUTE_UPDATE structures.
/// Each element indicates the node and the attribute to update.
/// IMFAttributes::SetItem will be called using guidAttributeKey
/// and the PROPVARIANT supplied
/// </param>
HRESULT UpdateNodeAttributes(
[in] TOPOID TopoId,
[in] DWORD cUpdates,
[in, size_is(cUpdates)] MFTOPONODE_ATTRIBUTE_UPDATE * pUpdates);
};
//
// MF_TOPONODE_ATTRIBUTE_EDITOR_SERVICE is the service GUID for
// obtaining IMFTopologyNodeAttributeEditor
//
cpp_quote( "EXTERN_GUID( MF_TOPONODE_ATTRIBUTE_EDITOR_SERVICE, 0x65656e1a, 0x077f, 0x4472, 0x83, 0xef, 0x31, 0x6f, 0x11, 0xd5, 0x08, 0x7a );" )
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation network playback interfaces
//
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
typedef [public] struct _MF_LEAKY_BUCKET_PAIR
{
DWORD dwBitrate;
DWORD msBufferWindow;
}
MF_LEAKY_BUCKET_PAIR;
/// <summary>
/// The MFBYTESTREAM_BUFFERING_PARAMS structure is for passing the buffering parameters to the byte stream.
/// </summary>
typedef [public] struct _MFBYTESTREAM_BUFFERING_PARAMS
{
/// <member name="cbTotalFileSize">
/// Total number of bytes in file, or -1 if unknown
/// Type: QWORD.
/// </member>
QWORD cbTotalFileSize;
/// <member name="cbPlayableDataSize">
/// Number of bytes in Data Object, or -1 if unknown or N/A
/// Type: QWORD.
/// </member>
QWORD cbPlayableDataSize;
/// <member name="prgBuckets">
/// Array of leaky buckets for various bitrates
/// Type: MF_LEAKY_BUCKET_PAIR.
/// </member>
MF_LEAKY_BUCKET_PAIR *prgBuckets;
/// <member name="cBuckets">
/// Number of leaky buckets in array
/// Type: DWORD.
/// </member>
DWORD cBuckets;
/// <member name="qwNetBufferingTime">
/// Network buffering time to add to any leaky bucket parameters, in 100ns
/// Type: QWORD.
/// </member>
QWORD qwNetBufferingTime;
/// <member name="qwPlayDuration">
/// Seek requires downloading the data starting from the Key frame
/// This specifies the time duration,in 100ns, between the previous key frame
/// poistion and the seek point.
/// Type: QWORD.
/// </member>
QWORD qwExtraBufferingTimeDuringSeek;
/// <member name="qwPlayDuration">
/// Duration of playable portion of file in 100ns, or 0 if unknown
/// Type: QWORD.
/// </member>
QWORD qwPlayDuration;
/// <member name="dRate">
/// The rate of the playback
/// Type: FLOAT.
/// </member>
float dRate;
}
MFBYTESTREAM_BUFFERING_PARAMS;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(6d66d782-1d4f-4db7-8c63-cb8c77f1ef5e),
local
]
/// <summary>
/// The IMFByteStreamBuffering interface is for controlling the buffer on the byte stream
/// </summary>
interface IMFByteStreamBuffering : IUnknown
{
/// <summary>
/// The SetBufferingParams method is for setting the buffering parameters.
/// </summary>
/// <param name=pParams>
/// The input MFBYTESTREAM_BUFFERING_PARAMS.
/// </param>
HRESULT SetBufferingParams(
[in, annotation("__in")] MFBYTESTREAM_BUFFERING_PARAMS *pParams
);
/// <summary>
/// The EnableBuffering method is for enabling/disabling the buffering on the byte stream
/// </summary>
/// <param name=fEnable>
/// BOOL flag indicating enable or disable the buffering.
/// </param>
HRESULT EnableBuffering(
[in] BOOL fEnable
);
/// <summary>
/// If the byte stream is currently buffering, invoking this method will cause a MEBufferingStopped
/// event to be sent immediately, without waiting for the necessary data to be buffered.
/// Invoking this method while the byte stream is not buffering has no effect.
/// </summary>
HRESULT StopBuffering();
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(F5042EA4-7A96-4a75-AA7B-2BE1EF7F88D5),
local
]
/// <summary>
/// This interface is exposed by byte streams that transfer data from
/// a remote resource to a local cache in the background. It allows the
/// application to have some control over the way the transfer happens.
/// </summary>
interface IMFByteStreamCacheControl : IUnknown
{
/// <summary>
/// Instructs the byte stream to stop the background transfer to cache.
/// The byte stream resumes the transfer the next time the application
/// reads data. The transfer is also resumed if buffering is enabled
/// using IMFByteStreamBuffering::EnableBuffering.
/// </summary>
HRESULT StopBackgroundTransfer();
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(5b87ef6a-7ed8-434f-ba0e-184fac1628d1),
local
]
/// <summary>
/// The IMFNetCredential interface is used to set and retrieve the username
/// and password for authentication purposes.
/// </summary>
interface IMFNetCredential : IUnknown
{
/// <summary>
/// SetUser sets the user name of the credential.
/// <param name="pbData">
/// Pointer to a buffer containing a UNICODE string with the user name. The
/// object will make an encrypted copy of this data. If the data is already
/// encrypted, the application must set fDataIsEncrypted to TRUE. To encrypt
/// the data the application must use the CryptProtectData function from the
/// Platform SDK.
/// </param>
/// <param name="cbData">
/// Size, in bytes, of the data pointed by pbData. If the data is an
/// unencrypted string, this value must include the null terminator
/// of the string.
/// </param>
/// <param name="fEncrypted">
/// Boolean value that specifies if the data is already encrypted.
/// </param>
HRESULT SetUser(
[in, size_is(cbData), annotation("__in_bcount(cbData)")] BYTE * pbData,
[in] DWORD cbData,
[in] BOOL fDataIsEncrypted );
/// <summary>
/// SetPassword sets the password of the credential.
/// <param name="pbData">
/// Pointer to a buffer containing a UNICODE string with the password. The
/// object will make an encrypted copy of this data. If the data is already
/// encrypted, the application must set fDataIsEncrypted to TRUE. To encrypt
/// the data the application must use the CryptProtectData function from the
/// Platform SDK.
/// </param>
/// <param name="cbData">
/// Size, in bytes, of the data pointed by pbData. If the data is an
/// unencrypted string, this value must include the null terminator
/// of the string.
/// </param>
/// <param name="fEncrypted">
/// Boolean value that specifies if the data is already encrypted.
/// </param>
HRESULT SetPassword(
[in, size_is(cbData), annotation("__in_bcount(cbData)")] BYTE * pbData,
[in] DWORD cbData,
[in] BOOL fDataIsEncrypted );
/// <summary>
/// GetUser retrieves the user name of this credential.
/// </summary>
/// <param name="pbData">
/// Pointer to the buffer that will receive the user name. If the application
/// sets the fEncryptData parameter to TRUE, the function will return the data
/// unencrypted as a UNICODE string format. If the application sets the
/// sets the fEncryptData parameter to FALSE, the function will return the data
/// encrypted. To unencrypt the data the application will have to use the
/// CryptUnprotectData function from the Platform SDK.
/// </param>
/// <param name="pcbData">
/// Pointer to a DWORD value that contains the size of the data buffer. Upon input,
/// the value contains the maximum size of the buffer. Upon return, the value contains
/// the number of bytes needed to hold the data, including the null terminator if the
/// data is returned unencrypted.
/// </param>
/// <param name="fEncryptData">
/// If this value is TRUE, the function will return the data encrypted, otherwise
/// it'll return the data unencrypted.
/// </param>
HRESULT GetUser(
[out, size_is(*pcbData), annotation("__out_ecount_part_opt(*pcbData,*pcbData)")] BYTE * pbData,
[in, out, annotation("__inout")] DWORD * pcbData,
[in] BOOL fEncryptData );
/// <summary>
/// GetPassword retrieves the user name of this credential.
/// </summary>
/// <param name="pbData">
/// Pointer to the buffer that will receive the password. If the application
/// sets the fEncryptData parameter to TRUE, the function will return the data
/// unencrypted as a UNICODE string format. If the application sets the
/// sets the fEncryptData parameter to FALSE, the function will return the data
/// encrypted. To unencrypt the data the application will have to use the
/// CryptUnprotectData function from the Platform SDK.
/// </param>
/// <param name="pcbData">
/// Pointer to a DWORD value that contains the size of the data buffer. Upon input,
/// the value contains the maximum size of the buffer. Upon return, the value contains
/// the number of bytes needed to hold the data, including the null terminator if the
/// data is returned unencrypted.
/// </param>
/// <param name="fEncryptData">
/// If this value is TRUE, the function will return the data encrypted, otherwise
/// it'll return the data unencrypted.
/// </param>
HRESULT GetPassword(
[out, size_is(*pcbData), annotation("__out_ecount_part_opt(*pcbData,*pcbData)")] BYTE * pbData,
[in, out, annotation("__inout")] DWORD * pcbData,
[in] BOOL fEncryptData );
/// <summary> LoggedOnUser returns TRUE if logged on credentials should be used. </summary>
HRESULT LoggedOnUser( [out, annotation("__out")] BOOL *pfLoggedOnUser );
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(5b87ef6b-7ed8-434f-ba0e-184fac1628d1),
local
]
/// <summary>
/// The IMFNetCredentialManager interface is used by MF to get user credentials.
/// The application can provide an object exposing this interface in the
/// MFNETSOURCE_CREDENTIAL_MANAGER property of the property store that is
/// passed to IMFSourceResolver or IMFSchemeHandler. If an object is not provided,
/// MF will not handle network authentication requests.
/// </summary>
interface IMFNetCredentialManager : IUnknown
{
/// <summary>
/// The MFNetCredentialManagerGetParam structure is for passing the authentication information to the credential manager .
/// </summary>
typedef struct _MFNetCredentialManagerGetParam
{
/// <member name="hrOp">
/// The response code of the authenticaion challenge.
/// Examples are: NS_E_PROXY_ACCESSDENIED, E_ACCESSDENIED, etc.
/// Type: HRESULT.
/// </member>
HRESULT hrOp;
/// <member name="fAllowLoggedOnUser">
/// Specify if currently logged on user's credential should be used as the default credential.
/// Type: BOOL.
/// </member>
BOOL fAllowLoggedOnUser;
/// <member name="fClearTextPackage">
/// When set this flag indicates that the authentication package will send the credentials
/// unencrypted over the network.
/// </member>
BOOL fClearTextPackage;
/// <member name="pszUrl">
/// The original URL for which authentication is required.
/// Type: String.
/// </member>
LPCWSTR pszUrl;
/// <member name="pszSite">
/// The name of the site or proxy that required authentication.
/// Type: String.
/// </member>
LPCWSTR pszSite;
/// <member name="pszRealm">
/// The Realm for the authentication.
/// Type: String.
/// </member>
LPCWSTR pszRealm;
/// <member name="pszPackage">
/// The name of the authentication package. For example, "Digest" or "MBS_BASIC".
/// Type: String.
/// </member>
LPCWSTR pszPackage;
/// <member name="nRetries">
/// The number of times that the credential manager should retry after authentication failed.
/// Type: LONG.
/// </member>
LONG nRetries;
} MFNetCredentialManagerGetParam;
/// <summary> BeginGetCredentials is the start of the asynchronous call to get the credential. </summary>
/// <param name="pParam">
/// Pointer to the MFNetCredentialManagerGetParam parameter.
/// </param>
/// <param name="pCallback">
/// The callback when the operation is completed.
/// </param>
/// <param name="pState">
/// The state from the caller that should be returned in the callback.
/// </param>
HRESULT BeginGetCredentials(
[in] MFNetCredentialManagerGetParam * pParam,
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
/// <summary> EndGetCredentials is the end of the asynchronous call to get the credential. </summary>
/// <param name="pResult">
/// The state of the operation from the callback.
/// </param>
/// <param name="ppCred">
/// Pointer to the IMFNetCredential* interface for getting the credentials.
/// </param>
HRESULT EndGetCredentials(
[in] IMFAsyncResult * pResult,
[out, annotation("__out")] IMFNetCredential ** ppCred
);
/// <summary> SetGood is called by MF to notify whether the credential succeeded authentication.</summary>
/// <param name="pCred">
/// The credential used in the authentication.
/// </param>
/// <param name="fGood">
/// Notify whether the credential provided succeeded the authentication.
/// </param>
HRESULT SetGood(
[in] IMFNetCredential * pCred,
[in] BOOL fGood );
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(5b87ef6c-7ed8-434f-ba0e-184fac1628d1),
local
]
/// <summary>
/// The IMFNetCredentialCache is for retrieving the credentials from the credential cache.
/// An application that implements a Credential Manager (see IMFNetCredentialManager)
/// can use MF's Credential Cache to cache credentials. To create a Credential Cache the
/// application calls MFCreateCredentialCache.
/// </summary>
interface IMFNetCredentialCache : IUnknown
{
typedef enum _MFNetCredentialRequirements
{
/// <member name="REQUIRE_PROMPT">
/// Specify that the credential manager needs to prompt
/// the user to provide the credentials.
/// Type: DWORD.
/// </member>
REQUIRE_PROMPT = 0x00000001,
#if (WINVER >= _WIN32_WINNT_WIN7)
/// <member name="REQUIRE_SAVE_SELECTED">
/// Specify that the credential manager needs to prompt
/// the user with the option to save credentials selected.
/// This happens when the credentials were saved already,
/// therefore the user does not need to reselect the option.
/// </member>
REQUIRE_SAVE_SELECTED = 0x00000002,
#endif // (WINVER >= _WIN32_WINNT_WIN7)
} MFNetCredentialRequirements;
/// <summary>
/// The MFNetCredentialOptions is the enumerate of
/// the options for the credential cache.
/// </summary>
typedef enum _MFNetCredentialOptions
{
/// <member name="MFNET_CREDENTIAL_SAVE">
/// Specify that the Credential Cache may save the
/// credentials in a persistent storage to be used
/// the next time it gets instantiated by the
/// application.
/// Type: DWORD.
/// </member>
MFNET_CREDENTIAL_SAVE = 0x00000001,
/// <member name="MFNET_CREDENTIAL_DONT_CACHE">
/// Specify that the Credential Cache must not cache
/// the credentials in memory. If this flag
/// is set, then MFNET_CREDENTIAL_SAVE must not be used.
/// Type: DWORD.
/// </member>
MFNET_CREDENTIAL_DONT_CACHE = 0x00000002,
/// <member name="MFNET_CREDENTIAL_ALLOW_CLEAR_TEXT">
/// Specify the user allowed the credentials to be sent over
/// the network unencrypted.
/// Type: DWORD.
/// </member>
MFNET_CREDENTIAL_ALLOW_CLEAR_TEXT = 0x00000004,
} MFNetCredentialOptions;
/// <summary>
/// Authentication flags.
/// </summary>
typedef enum _MFNetAuthenticationFlags
{
/// <member name="MFNET_AUTHENTICATION_PROXY">
/// Specify that the credentials will be used to authenticate with a proxy.
/// Type: DWORD.
/// </member>
MFNET_AUTHENTICATION_PROXY = 0x00000001,
/// <member name="MFNET_AUTHENTICATION_CLEAR_TEXT">
/// Specify that the credentials will be sent over the network unencrypted.
/// Type: DWORD.
/// </member>
MFNET_AUTHENTICATION_CLEAR_TEXT = 0x00000002,
/// <member name="MFNET_AUTHENTICATION_LOGGED_ON_USER">
/// Requires a credential for the logged on user.
/// Type: DWORD.
/// </member>
MFNET_AUTHENTICATION_LOGGED_ON_USER = 0x00000004,
} MFNetAuthenticationFlags;
/// <summary>
/// The GetCredential returns a credential object for a specific URL.
/// </summary>
/// <param name="pszUrl">
/// The URL for which the credential is needed.
/// </param>
/// <param name="pszRealm">
/// The Realm for the authentication.
/// </param>
/// <param name="dwAuthenticationFlags">
/// Authenticaiton flags as defined in MFNetAuthenticationFlags.
/// </param>
/// <param name="ppCred">
/// Pointer to get the credential.
/// </param>
/// <param name="pdwRequirementsFlags">
/// Pointer to get the requirement flags, as defined in MFNetCredentialRequirements.
/// </param>
HRESULT GetCredential(
[in] LPCWSTR pszUrl,
[in] LPCWSTR pszRealm,
[in] DWORD dwAuthenticationFlags,
[out, annotation("__out")] IMFNetCredential ** ppCred,
[out, annotation("__out")] DWORD * pdwRequirementsFlags );
/// <summary> SetGood is called by the Credential Manager to notify whether the credential provided succeeded the authentication.</summary>
/// <param name="pCred">
/// The credential used in the authentication.
/// </param>
/// <param name="fGood">
/// Notify whether the credential provided succeeded the authentication.
/// </param>
HRESULT SetGood(
[in] IMFNetCredential * pCred,
[in] BOOL fGood );
/// <summary>
/// SetUserOptions is called by the Credential Manager to set user options for the credential.
/// </summary>
/// <param name="pCred">
/// The credential being referred to.
/// </param>
/// <param name="dwOptionsFlags">
/// User flags as defined in MFNetCredentialOptions.
/// </param>
HRESULT SetUserOptions(
[in] IMFNetCredential * pCred,
[in] DWORD dwOptionsFlags );
};
/// <summary>
/// MFCreateCredentialCache creates MF's default Credential Cache.
/// An application that implements a Credential Manager (see IMFNetCredentialManager)
/// should use the default Credential Cache to persist credentials.
/// </summary>
cpp_quote( "STDAPI ")
cpp_quote( "MFCreateCredentialCache(")
cpp_quote( " __out IMFNetCredentialCache ** ppCache);")
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(61f7d887-1230-4a8b-aeba-8ad434d1a64d),
local
]
/// <summary>
/// The IMFSSLCertificateManager interface is used by MF to retrieve a
/// client SSL certificate in case HTTPS is used and the server requests
/// a client-side certificate. The interface can also be used to allow the application
/// to validate the server<65>s SSL certificate.
/// The application can provide an object exposing this interface in the
/// MFNETSOURCE_SSLCERTIFICATE_MANAGER property of the property store that is
/// passed to IMFSourceResolver or IMFSchemeHandler. If an object is not provided,
/// MF will be unable to use HTTPS if the server requests a client-side certificate.
/// </summary>
interface IMFSSLCertificateManager : IUnknown
{
/// <summary> GetClientCertificate is used to get the client<6E>s SSL certificate using a synchronous call </summary>
/// <param name="pszURL">
/// The URL used when sending a request to the server, and for which a client-side SSL certificate is now required.
/// </param>
/// <param name="ppbData">
/// Pointer to a pointer which, on successful return, will point to the certificate.
/// The certificate is stored in a buffer which must be allocated using CoTaskMemAlloc,
/// and the caller must free the memory pointed to by *ppbData using CoTaskMemFree.
/// </param>
/// <param name="pcbData">
/// Pointer to a DWORD value that contains the size of the data buffer. Upon
/// input, the value contains the maximum size of the buffer. Upon return, the
/// value contains the number of bytes needed to hold the data.
/// </param>
HRESULT GetClientCertificate(
[in] LPCWSTR pszURL,
[out, size_is(, *pcbData), annotation("__deref_out_bcount(*pcbData)")] BYTE **ppbData,
[out, annotation("__out")] DWORD * pcbData );
/// <summary> BeginGetClientCertificate is the start of the asynchronous call to get the client<6E>s SSL certificate. </summary>
/// <param name="pszURL">
/// The URL used when sending a request to the server, and for which a client-side SSL certificate is now required.
/// </param>
/// <param name="pCallback">
/// The callback when the operation is completed.
/// </param>
/// <param name="pState">
/// The state from the caller that should be returned in the callback.
/// </param>
HRESULT BeginGetClientCertificate(
[in] LPCWSTR pszURL,
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
/// <summary> EndGetClientCertificate is the end of the asynchronous call to get the client<6E>s SSL certificate. </summary>
/// <param name="pResult">
/// The state of the operation from the callback.
/// </param>
/// <param name="ppbData">
/// Pointer to a pointer which, on successful return, will point to the certificate. The certificate is
/// stored in a buffer which must be allocated using CoTaskMemAlloc, and the caller must free the memory
/// pointed to by *ppbData using CoTaskMemFree.
/// </param>
/// <param name="pcbData">
/// Pointer to a DWORD value that contains the size of the data buffer. Upon
/// input, the value contains the maximum size of the buffer. Upon return, the
/// value contains the number of bytes needed to hold the data.
/// </param>
HRESULT EndGetClientCertificate(
[in] IMFAsyncResult * pResult,
[out, size_is(, *pcbData), annotation("__deref_out_bcount(*pcbData)")] BYTE **ppbData,
[out, annotation("__out")] DWORD * pcbData );
/// <summary> GetCertificatePolicy is called by MF to determine if the server<65>s SSL certificate should be verified
/// automatically or if IMFSSLCertificateManager should be used to verify the server<65>s certificate.
/// </summary>
/// <param name="pszURL">
/// The URL which will be sent to the server.
/// </param>
/// <param name=" pfOverrideAutomaticCheck">
/// Set to TRUE if IMFSSLCertificateManager::OnServerCertificate should be used to verify the server<65>s certificate.
/// Set to FALSE to verify the server<65>s certificate using the certificates in the Windows certificate store.
/// </param>
/// <param name=" pfClientCertificateAvailable">
/// Set to TRUE if SSL certificate for the client is available upfront. In this case, the client certificate will
/// be supplied with a synchronous call to GetClientCertificate. Set to FALSE to verify the server<65>s certificate
/// using the certificates in the Windows certificate store. In this case client`s SSL certificate will be obtained
/// with an asynchronous call to BeginGetClientCertificate.
/// </param>
HRESULT GetCertificatePolicy(
[in] LPCWSTR pszURL,
[out] BOOL *pfOverrideAutomaticCheck,
[out] BOOL *pfClientCertificateAvailable );
/// <summary>
/// OnServerCertificate is invoked by MF when the server<65>s SSL certificate has been received, and is used for checking
/// if the certificate is accepted.
/// <param name="pszURL">
/// The URL used when sending a request to the server, and for which a server-side SSL certificate has now been received.
/// </param>
/// <param name="pbData">
/// Pointer to a buffer containing the server<65>s SSL certificate.
/// </param>
/// <param name="cbData">
/// Size, in bytes, of the data pointed by pbData.
/// </param>
/// <param name="pfGood">
/// Boolean value which, if set to TRUE, indicates that the server<65>s SSL certificate has been accepted and that the
/// connection can proceed. If set to FALSE, the certificate is rejected and the connection will be closed.
/// </param>
HRESULT OnServerCertificate(
[in] LPCWSTR pszURL,
[in, size_is(cbData), annotation("__in_bcount(cbData)")] BYTE * pbData,
[in] DWORD cbData,
[out] BOOL *pfIsGood );
};
/// <summary>
/// Netsource configuration property: The SSL credential manager.
/// Application provided credential manager is stored in the config
/// property store using this ID.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_SSLCERTIFICATE_MANAGER, 0x55e6cb27, 0xe69b, 0x4267, 0x94, 0x0c, 0x2d, 0x7e, 0xc5, 0xbb, 0x8a, 0x0f );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(059054B3-027C-494C-A27D-9113291CF87F),
]
/// <summary>
/// The application can provide an object exposing the IMFSourceOpenMonitor
/// interface to receive notifications on the progress of an asynchronous
/// open operation. The application provides the object in the
/// MFPKEY_SourceOpenMonitor property of the property store that
/// is passed to IMFSourceResolver or IMFSchemeHandler.
/// </summary>
interface IMFSourceOpenMonitor : IUnknown
{
/// <summary>
/// Called by the Network Media Source to indicate the progress of
/// the asynchronous open operation.
/// </summary>
/// <param name=pEvent>
/// The status of the open operation. It can be MEConnectStart or
/// MEConnectEnd.
/// </param>
///
HRESULT OnSourceEvent(
[in] IMFMediaEvent *pEvent
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(e9cd0383-a268-4bb4-82de-658d53574d41),
local
]
/// <summary>
/// The IMFNetProxyLocator interface is used to determine the proxy to
/// use for connecting to a server.
/// </summary>
interface IMFNetProxyLocator : IUnknown
{
/// <summary>
/// Initializes the ProxyLocator object. Once the ProxyLocator
/// object has been initialized, the client has to call FindNextProxy to
/// retrieve the information about the first proxy.
/// </summary>
/// <param name=pszHost>The hostname of the destination server.</param>
/// <param name=pszUrl>The destination url.</param>
/// <param name=fReserved>This parameter is reserved and should be set to FALSE.</param>
///
HRESULT FindFirstProxy(
[in] LPCWSTR pszHost,
[in] LPCWSTR pszUrl,
[in] BOOL fReserved );
/// <summary>
/// Continues the proxy enumeration from a previous call to FindNextProxy or
/// FindFirstProxy.
/// </summary>
/// <returns>
/// <para> S_OK: a new proxy has been located.</para>
/// <para> S_FALSE: no more proxies can be found.</para>
/// </returns>
///
HRESULT FindNextProxy();
/// <summary>
/// RegisterProxyResult is called by the client to record the success
/// or failure of using the current proxy.
/// </summary>
/// <param name=hrOp>The result of using the current proxy for connection.</param>
HRESULT RegisterProxyResult(
[in] HRESULT hrOp );
/// <summary>Retrieve the current proxy information including hostname and port.</summary>
/// <param name=pszStr>The proxy hostname and port.</param>
/// <param name=pcchStr>The count of unicode characters in pszStr.</param>
HRESULT GetCurrentProxy(
[out, size_is( *pcchStr ), annotation("__out_ecount_opt(*pcchStr)") ] LPWSTR pszStr,
[in, out] DWORD * pcchStr );
/// <summary>Creates a new instance of the ProxyLocator.</summary>
/// <param name=ppProxyLocator>The new ProxyLocator created.</param>
HRESULT Clone(
[out] IMFNetProxyLocator ** ppProxyLocator);
}
/// <summary>
/// Creates a default proxy locator.
/// </summary>
/// <param name=pszProtocol>The name of the protocol.</param>
/// <param name=pProxyConfig>
/// Property store that contains the proxy configuration.
/// See property keys MFNETSOURCE_PROXYHOSTNAME through MFNETSOURCE_PROXYRERUNAUTODETECTION.
/// </param>
/// <param name=ppProxyLocator>Pointer to receive the ProxyLocator object.</param>
cpp_quote( "STDAPI MFCreateProxyLocator(")
cpp_quote( " LPCWSTR pszProtocol," )
cpp_quote( " IPropertyStore* pProxyConfig, " )
cpp_quote( " __out IMFNetProxyLocator** ppProxyLocator );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(e9cd0384-a268-4bb4-82de-658d53574d41),
local
]
///<summary>
/// IMFNetProxyLocatorFactory interface is used to create the
/// IMFNetProxyLocator interface which determines the proxy to use.
/// The application can provide an object exposing this interface
/// in the MFNETSOURCE_PROXYLOCATORFACTORY property of the property store
/// that is passed to IMFSourceResolver or IMFSchemeHandler.
/// If the object is not provided, MF will use the default ProxyLocatorFactory.
///</summary>
interface IMFNetProxyLocatorFactory : IUnknown
{
/// <summary>
/// CreateProxyLocator is called to create a ProxyLocator
/// object for a given protocol.
/// </summary>
/// <param name="pszProtocol">
/// The protocol name, such as "rtsp" and "http".
/// </param>
/// <param name="ppProxyLocator">
/// The IMFNetProxyLocator interface of the ProxyLocator object.
/// </param>
HRESULT CreateProxyLocator(
[in] LPCWSTR pszProtocol,
[out, annotation("__out")] IMFNetProxyLocator ** ppProxyLocator);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(e9931663-80bf-4c6e-98af-5dcf58747d1f),
local
]
///<summary>
/// IMFSaveJob interface is a service interface that can be used to persist
/// content to a ByteStream object provided by the application. The application
/// uses the MFNET_SAVEJOB_SERVICE GUID to retrieve this service.
/// Currently only the HTTP ByteStream object provides it.
///</summary>
interface IMFSaveJob : IUnknown
{
/// <summary>
/// Starts an asynchronous operation that will persist the content
/// of the object to a ByteStream given by the application.
/// </summary>
/// <param name=pStream>The ByteStream in which the service will persist the content.</param>
/// <param name=pCallback>The callback when the operation is completed.</param>
/// <param name=pState>The state from the caller that should be returned in the callback.</param>
HRESULT BeginSave(
[in] IMFByteStream * pStream,
[in] IMFAsyncCallback * pCallback,
[in] IUnknown * pState );
///<summary>
/// Completes the operation started by BeginSave.
///</summary>
///<param name=pResult>
/// The state of the operation from the callback.
///</param>
HRESULT EndSave(
[in] IMFAsyncResult * pResult );
/// <summary>Cancels the operation started by BeginSave.</summary>
HRESULT CancelSave( );
/// <summary>Retrieves the percentage of content that has been persisted</summary>
/// <param name=pdwPercentComplete>The percentage of completion.</param>
HRESULT GetProgress(
[out, annotation("__out")] DWORD *pdwPercentComplete );
};
/// <summary>
/// GUID passed to IMFGetService::GetService to retrieve the IMFSaveJob interface.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNET_SAVEJOB_SERVICE, 0xb85a587f, 0x3d02, 0x4e52, 0x95, 0x65, 0x55, 0xd3, 0xec, 0x1e, 0x7f, 0xf7 );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The type of control protocol used by the Media Source.
/// See MFNETSOURCE_PROTOCOL_ID.
/// </summary>
typedef enum _MFNETSOURCE_PROTOCOL_TYPE
{
/// <member name="MFNETSOURCE_UNDEFINED">
/// The protocol type has not yet been determined.
/// </member>
MFNETSOURCE_UNDEFINED = 0x0,
/// <member name="MFNETSOURCE_HTTP">
/// The protocol type is HTTP. This includes HTTPv9, WMSP and HTTP download.
/// </member>
MFNETSOURCE_HTTP = 0x1,
/// <member name="MFNETSOURCE_RTSP">
/// The protocol type is RTSP.
/// </member>
MFNETSOURCE_RTSP = 0x2,
/// <member name="MFNETSOURCE_FILE">
/// The content is read from a file. The file may be local or on a remote share.
/// </member>
MFNETSOURCE_FILE = 0x3,
/// <member name="MFNETSOURCE_MULTICAST">
/// The protocol type is multicast.
/// </member>
MFNETSOURCE_MULTICAST = 0x4,
} MFNETSOURCE_PROTOCOL_TYPE;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(7BE19E73-C9BF-468a-AC5A-A5E8653BEC87),
local
]
///<summary>
/// Used to query and set the configuration
/// of the Net Scheme plugin.
///</summary>
interface IMFNetSchemeHandlerConfig : IUnknown
{
/// <summary>
/// Method that retrieves the number of protocols
/// supported by this Net Scheme plugin.
/// </summary>
/// <param name=pcProtocols>
/// Pointer used to return the number of protocols.
/// </param>
HRESULT GetNumberOfSupportedProtocols(
[out, annotation("__out")] ULONG* pcProtocols );
/// <summary>
/// This method gets the protocol type for
/// a given protocol index.
/// </summary>
/// <param name=nProtocolIndex>
/// Protocol index. It is a value between 0 and
/// the value returned by GetNumberOfSupportedProtocols,
/// exclusively.
/// </param>
HRESULT GetSupportedProtocolType(
[in] ULONG nProtocolIndex,
[out, annotation("__out")] MFNETSOURCE_PROTOCOL_TYPE* pnProtocolType );
/// <summary>
/// Forces the Network scheme plugin to clean up the protocol
/// rollover settings and use the default rollover behavior.
/// NOTE: This method is not implemented in this version of MF,
/// and it always returns S_OK.
/// </summary>
HRESULT ResetProtocolRolloverSettings();
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
cpp_quote( "STDAPI MFCreateNetSchemePlugin(" )
cpp_quote( " REFIID riid, " )
cpp_quote( " LPVOID *ppvHandler );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// The type of transport used in streaming or download.
/// See MFNETSOURCE_TRANSPORT_ID.
/// </summary>
typedef enum _MFNETSOURCE_TRANSPORT_TYPE
{
/// <member name="MFNETSOURCE_UDP">
/// The data transport used is UDP.
/// </member>
MFNETSOURCE_UDP,
/// <member name="MFNETSOURCE_TCP">
/// The data transport used is TCP.
/// </member>
MFNETSOURCE_TCP,
} MFNETSOURCE_TRANSPORT_TYPE;
/// <summary>
/// The status of cache for a media file or entry.
/// See MFNETSOURCE_CACHE_STATE_ID.
/// </summary>
typedef enum _MFNETSOURCE_CACHE_STATE
{
/// <member name="MFNETSOURCE_CACHE_UNAVAILABLE">
/// The cache for a file or entry does not exist.
/// </member>
MFNETSOURCE_CACHE_UNAVAILABLE,
/// <member name=" MFNETSOURCE_CACHE_ACTIVE_WRITING">
/// The cache for a file or entry is growing.
/// </member>
MFNETSOURCE_CACHE_ACTIVE_WRITING,
/// <member name="MFNETSOURCE_CACHE_ACTIVE_COMPLETE">
/// The cache for a file or entry is completed.
/// </member>
MFNETSOURCE_CACHE_ACTIVE_COMPLETE,
} MFNETSOURCE_CACHE_STATE;
/// <summary>
/// The property IDs of the statistics that are supported by
/// Network Media Sources and Byte Streams. To retrieve the
/// statistics the application uses IMFGetService::GetService with
/// the MFNETSOURCE_STATISTICS_SERVICE service GUID and a
/// IID_IPropertyStore RIID. Then the application can use the returned
/// IPropertyStore interface to read the object's statistics with
/// the following pids and the MFNETSOURCE_STATISTICS
/// fmtid.
/// </summary>
typedef enum _MFNETSOURCE_STATISTICS_IDS
{
/// <member name="MFNETSOURCE_RECVPACKETS_ID">
/// The number of packets received.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECVPACKETS_ID = 0,
/// <member name="MFNETSOURCE_LOSTPACKETS_ID">
/// The number of packets lost.
/// Type: DWORD.
/// </member>
MFNETSOURCE_LOSTPACKETS_ID,
/// <member name="MFNETSOURCE_RESENDSREQUESTED_ID">
/// The number of packets resend requested.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RESENDSREQUESTED_ID,
/// <member name="MFNETSOURCE_RESENDSRECEIVED_ID">
/// The number of packets resend received.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RESENDSRECEIVED_ID,
/// <member name="MFNETSOURCE_RECOVEREDBYECCPACKETS_ID">
/// The total of packets recovered by error correction (ECC).
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECOVEREDBYECCPACKETS_ID,
/// <member name="MFNETSOURCE_RECOVEREDBYRTXPACKETS_ID">
/// The total number of packets recovered by retransmission (RTX).
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECOVEREDBYRTXPACKETS_ID,
/// <member name="MFNETSOURCE_OUTPACKETS_ID">
/// The total number of packets returned to user.
/// This includes recovered packets.
/// Type: DWORD.
/// </member>
MFNETSOURCE_OUTPACKETS_ID,
/// <member name="MFNETSOURCE_RECVRATE_ID">
/// The 10 second average receive rate.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECVRATE_ID,
/// <member name="MFNETSOURCE_AVGBANDWIDTHBPS_ID">
/// The average bandwidth of the clip.
/// Type: DWORD.
/// </member>
MFNETSOURCE_AVGBANDWIDTHBPS_ID,
/// <member name="MFNETSOURCE_BYTESRECEIVED_ID">
/// The total number of bytes received.
/// Type: QWORD.
/// </member>
MFNETSOURCE_BYTESRECEIVED_ID,
/// <member name="MFNETSOURCE_PROTOCOL_ID">
/// The type of control protocol used to receive the data.
/// Valid values are defined in MFNETSOURCE_PROTOCOL_TYPE.
/// Type: DWORD.
/// </member>
MFNETSOURCE_PROTOCOL_ID,
/// <member name="MFNETSOURCE_TRANSPORT_ID">
/// The type of transport used to receive the data.
/// Valid values are defined in MFNETSOURCE_TRANSPORT_TYPE.
/// Type: DWORD.
/// </member>
MFNETSOURCE_TRANSPORT_ID,
/// <member name="MFNETSOURCE_CACHE_STATE_ID">
/// The status of cache for a media file or entry.
/// Valid values are defined in MFNETSOURCE_CACHE_STATE.
/// Type: DWORD.
/// </member>
MFNETSOURCE_CACHE_STATE_ID,
/// <member name="MFNETSOURCE_LINKBANDWIDTH_ID">
/// Current link bandwidth in bits per second.
/// Type: DWORD.
/// </member>
MFNETSOURCE_LINKBANDWIDTH_ID,
/// <member name="MFNETSOURCE_CONTENTBITRATE_ID">
/// Current content bitrate.
/// Type: DWORD.
/// </member>
MFNETSOURCE_CONTENTBITRATE_ID,
/// <member name="MFNETSOURCE_SPEEDFACTOR_ID">
/// The negotiated speed factor used in data transmission, multiplied by 1000.
/// The sender sends data in the speed of speed factor * content bitrate.
/// Type: DWORD.
/// </member>
MFNETSOURCE_SPEEDFACTOR_ID,
/// <member name="MFNETSOURCE_BUFFERSIZE_ID">
/// The playout buffer size in milliseconds.
/// Type: DWORD.
/// </member>
MFNETSOURCE_BUFFERSIZE_ID,
/// <member name="MFNETSOURCE_BUFFERPROGRESS_ID">
/// The percentage of playout buffer filled up during buffering.
/// Type: DWORD.
/// </member>
MFNETSOURCE_BUFFERPROGRESS_ID,
/// <member name="MFNETSOURCE_LASTBWSWITCHTS_ID">
/// Tickcount of last bandwidth switch.
/// Type: DWORD.
/// </member>
MFNETSOURCE_LASTBWSWITCHTS_ID,
/// <member name="MFNETSOURCE_SEEKRANGESTART_ID">
/// Start of seekable range in nanoseconds.
/// Type: QWORD.
/// </member>
MFNETSOURCE_SEEKRANGESTART_ID,
/// <member name="MFNETSOURCE_SEEKRANGEEND_ID">
/// End of seekable range in nanoseconds.
/// Type: QWORD.
/// </member>
MFNETSOURCE_SEEKRANGEEND_ID,
/// <member name="MFNETSOURCE_BUFFERINGCOUNT_ID">
/// Number of times buffering happened (including the initial buffering).
/// Type: DWORD.
/// </member>
MFNETSOURCE_BUFFERINGCOUNT_ID,
/// <member name="MFNETSOURCE_INCORRECTLYSIGNEDPACKETS_ID">
/// Number of packets that had incorrect signature.
/// Type: DWORD.
/// </member>
MFNETSOURCE_INCORRECTLYSIGNEDPACKETS_ID,
/// <member name="MFNETSOURCE_SIGNEDSESSION_ID">
/// Whether this is a signed session.
/// Type: BOOLEAN.
/// </member>
MFNETSOURCE_SIGNEDSESSION_ID,
/// <member name="MFNETSOURCE_MAXBITRATE_ID">
/// Current content maximum bitrate.
/// Type: DWORD.
/// </member>
MFNETSOURCE_MAXBITRATE_ID,
/// <member name="MFNETSOURCE_RECEPTION_QUALITY_ID">
/// Reception quality.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECEPTION_QUALITY_ID,
/// <member name="MFNETSOURCE_RECOVEREDPACKETS_ID">
/// The total number of packets recovered.
/// Type: DWORD.
/// </member>
MFNETSOURCE_RECOVEREDPACKETS_ID,
/// <member name="MFNETSOURCE_VBR_ID">
/// Whether this is VBR content.
/// Type: BOOLEAN.
/// </member>
MFNETSOURCE_VBR_ID,
/// <member name="MFNETSOURCE_DOWNLOADPROGRESS_ID">
/// The percentage of the content that has been downloaded so far.
/// Type: BOOLEAN.
/// </member>
MFNETSOURCE_DOWNLOADPROGRESS_ID,
#if (WINVER >= _WIN32_WINNT_WIN7)
/// <member name="MFNETSOURCE_UNPREDEFINEDPROTOCOLNAME_ID">
/// The name of protocol when MFNETSOURCE_PROTOCOL_ID is MFNETSOURCE_UNDEFINED.
/// Data type: STRING
/// </member>
MFNETSOURCE_UNPREDEFINEDPROTOCOLNAME_ID,
#endif // (WINVER >= _WIN32_WINNT_WIN7)
} MFNETSOURCE_STATISTICS_IDS;
/// <summary>
/// GUID passed to IMFGetService::GetService to retrieve a statistics
/// service interface such as IMFStatisticsSite or IMFPropertyStore
/// from a Network Media Source or Byte Stream.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_STATISTICS_SERVICE, 0x3cb1f275, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// The fmtid of the PROPERTYKEY used to retrieve statistics from
/// Network Media Sources and Byte Streams. It is used with
/// the property IDs defined in MFNETSOURCE_STATISTICS_IDS.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_STATISTICS, 0x3cb1f274, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: startup buffering time in seconds.
/// Default: 5 seconds.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_BUFFERINGTIME, 0x3cb1f276, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: acceleration duration in milliseconds.
/// Default: 10000 ms.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ACCELERATEDSTREAMINGDURATION, 0x3cb1f277, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: UDP stream acceleration duration in milliseconds.
/// UDP stream should not accelerate more than the server's UDP resend buffer size.
/// Default: 8000 ms.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_MAXUDPACCELERATEDSTREAMINGDURATION, 0x4aab2879, 0xbbe1, 0x4994, 0x9f, 0xf0, 0x54, 0x95, 0xbd, 0x25, 0x1, 0x29 );" )
/// <summary>
/// Netsource configuration property: Maximun memory buffered samples in milliseconds.
/// The net source should not buffer more than this limit worth of data in memory.
/// Default: 40000 ms.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_MAXBUFFERTIMEMS, 0x408b24e6, 0x4038, 0x4401, 0xb5, 0xb2, 0xfe, 0x70, 0x1a, 0x9e, 0xbf, 0x10 );" )
/// <summary>
/// Netsource configuration property: link bandwidth.
/// This can be set by the application or detected by link bandwidth tests such as packetpair.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_CONNECTIONBANDWIDTH, 0x3cb1f278, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: enable or disable caching of content.
/// Default is enable.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_CACHEENABLED, 0x3cb1f279, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: number of times the client will try to reconnect
/// to the server and resume streaming if the connection was broken due to temporary
/// network outage.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_AUTORECONNECTLIMIT, 0x3cb1f27a, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: enable or disable UDP resend in case of packet loss.
/// Default is enable.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_RESENDSENABLED, 0x3cb1f27b, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: enable or disable stream switching for MBR files.
/// Default is enable.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_THINNINGENABLED, 0x3cb1f27c, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: The control protocol used.
/// This property is read-only. Valid values are in MFNETSOURCE_PROTOCOL_TYPE.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROTOCOL, 0x3cb1f27d, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: The transport protocol used.
/// This property is read-only. Valid values are in MFNETSOURCE_TRANSPORT_TYPE.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_TRANSPORT, 0x3cb1f27e, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Netsource configuration property: enable or disable preview mode.
/// Default is disabled.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PREVIEWMODEENABLED, 0x3cb1f27f, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Netsource configuration property: The credential manager.
/// Application provided credential manager is stored in the config
/// property store using this ID.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_CREDENTIAL_MANAGER, 0x3cb1f280, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// This is a read-only property used to retrieve from netsource
/// the packetpair and runtime bandwidth detected.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PPBANDWIDTH, 0x3cb1f281, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// This is a read-only property used to retrieve from netsource
/// the number of auto-reconnect attemps.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_AUTORECONNECTPROGRESS, 0x3cb1f282, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of the property that the application uses to set the Proxy Locator Factory
/// (IMFNetProxyLocatorFactory) that will be used by the netsource to enumerate proxies.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYLOCATORFACTORY, 0x3cb1f283, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value used as part of cs(User-Agent) field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_BROWSERUSERAGENT, 0x3cb1f28b, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value of cs(Referer) field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_BROWSERWEBPAGE, 0x3cb1f28c, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value of c-playerversion field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PLAYERVERSION, 0x3cb1f28d, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value of c-playerid field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PLAYERID, 0x3cb1f28e, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified the value of c-hostexe field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_HOSTEXE, 0x3cb1f28f, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value of c-hostexever in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_HOSTVERSION, 0x3cb1f291, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// ID of application specified value used as part of cs(User-Agent) field in logging message.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PLAYERUSERAGENT, 0x3cb1f292, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// GUID that uniquely identifies the client to the server. If not set, or set as GUID_NULL, MF will generate a new
/// anonymous GUID per session that ensures the user's privacy.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_CLIENTGUID, 0x60a2c4a6, 0xf197, 0x4c14, 0xa5, 0xbf, 0x88, 0x83, 0xd, 0x24, 0x58, 0xaf );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// ID of application specified array of urls that netsource should send logging messages to
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_LOGURL, 0x3cb1f293, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable UDP based data protocol.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_UDP, 0x3cb1f294, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable TCP based data protocol.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_TCP, 0x3cb1f295, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable MSB multicast protocol.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_MSB, 0x3cb1f296, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable RTSP control protocol.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_RTSP, 0x3cb1f298, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable HTTP control protocol.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_HTTP, 0x3cb1f299, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable all streaming protocols.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_STREAMING, 0x3cb1f29c, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Enable or disable all download protocols.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_ENABLE_DOWNLOAD, 0x3cb1f29d, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Netsource configuration property: Range of valid UDP ports that can be used to receive streaming content.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_UDP_PORT_RANGE, 0x3cb1f29a, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// This is the ID of a read-only property used to retrieve from netsource
/// the proxy host and port used in the connection.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYINFO, 0x3cb1f29b, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Network byte stream read-only property: Array of bytes that contains
/// the representation of the DRM License associated with this byte stream.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_DRMNET_LICENSE_REPRESENTATION, 0x47eae1bd, 0xbdfe, 0x42e2, 0x82, 0xf3, 0x54, 0xa4, 0x8c, 0x17, 0x96, 0x2d );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. Look for MFNET_PROXYSETTINGS
/// for a list of the values that this property can have.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYSETTINGS, 0x3cb1f287, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. It defines the name of the proxy
/// host to be used with the manual proxy setting.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYHOSTNAME, 0x3cb1f284, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. It defines the default proxy port
/// to be used.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYPORT, 0x3cb1f288, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. It defines the list of addresses
/// that do not needed to be accessed through the proxy server. Entries in the
/// list can be separated by semicolons (;).
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYEXCEPTIONLIST, 0x3cb1f285, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. If this property is set to a value
/// different than zero, the proxy locator will bypass the proxy server for
/// local addresses.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYBYPASSFORLOCAL, 0x3cb1f286, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
/// <summary>
/// Property passed in a property store to MFCreateProxyLocator in order to
/// instantiate a default proxy locator. If this property is set to a value
/// different than zero, the proxy locator will force proxy detection when
/// enumerating proxies.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_PROXYRERUNAUTODETECTION, 0x3cb1f289, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1 );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// The string sent in the Accept-Language header.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_STREAM_LANGUAGE, 0x9ab44318, 0xf7cd, 0x4f2d, 0x8d, 0x6d, 0xfa, 0x35, 0xb4, 0x92, 0xce, 0xcb );" )
/// <summary>
/// Array of strings with the parameters to send to the log server.
/// </summary>
cpp_quote( "EXTERN_GUID( MFNETSOURCE_LOGPARAMS, 0x64936ae8, 0x9418, 0x453a, 0x8c, 0xda, 0x3e, 0xa, 0x66, 0x8b, 0x35, 0x3b );" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// Options that can be used with MFNETSOURCE_PROXYSETTINGS.
/// </summary>
typedef enum _MFNET_PROXYSETTINGS
{
/// <summary>
/// This option sets the proxy locator to bypass all addresses.
/// </summary>
MFNET_PROXYSETTING_NONE = 0,
/// <summary>
/// This options sets the proxy locator to use manual settings.
/// </summary>
MFNET_PROXYSETTING_MANUAL = 1,
/// <summary>
/// This options sets the proxy locator to use proxy auto-discovery.
/// </summary>
MFNET_PROXYSETTING_AUTO = 2,
/// <summary>
/// This options sets the proxy locator to use the internet browser
/// proxy settings.
/// </summary>
MFNET_PROXYSETTING_BROWSER = 3
}
MFNET_PROXYSETTINGS;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation source resolution interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(6D4C7B74-52A0-4bb7-B0DB-55F29F47A668),
local
]
/// <summary>
/// A scheme handler is typically associated with one or more schemes
/// (e.g. file:// or http://) and is able to create an object (generally
/// an IMFByteStream) capable of reading from that URL.
/// </summary>
interface IMFSchemeHandler : IUnknown
{
HRESULT BeginCreateObject(
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out_opt")] IUnknown **ppIUnknownCancelCookie,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
HRESULT EndCreateObject(
[in] IMFAsyncResult *pResult,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
HRESULT CancelObjectCreation(
[in] IUnknown *pIUnknownCancelCookie
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
// {A6E1F733-3001-4915-8150-1558A2180EC8}
cpp_quote( "EXTERN_GUID(MF_BYTESTREAMHANDLER_ACCEPTS_SHARE_WRITE, 0xa6e1f733, 0x3001, 0x4915, 0x81, 0x50, 0x15, 0x58, 0xa2, 0x18, 0xe, 0xc8);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
[
object,
uuid(BB420AA4-765B-4a1f-91FE-D6A8A143924C),
local
]
/// <summary>
/// A byte stream handler is typically associated with one or more formats
/// (e.g. WMV or MP3) and is able to create an object (generally an
/// IMFMediaSource) capable of reading that format.
/// </summary>
interface IMFByteStreamHandler : IUnknown
{
HRESULT BeginCreateObject(
[in] IMFByteStream *pByteStream,
[in] LPCWSTR pwszURL,
[in] DWORD dwFlags,
[in] IPropertyStore *pProps,
[out, annotation("__out_opt")] IUnknown **ppIUnknownCancelCookie,
[in] IMFAsyncCallback *pCallback,
[in] IUnknown *punkState
);
HRESULT EndCreateObject(
[in] IMFAsyncResult *pResult,
[out, annotation("__out")] MF_OBJECT_TYPE *pObjectType,
[out, annotation("__out")] IUnknown **ppObject
);
HRESULT CancelObjectCreation(
[in] IUnknown *pIUnknownCancelCookie
);
HRESULT GetMaxNumberOfBytesRequiredForResolution(
[out, annotation("__out")] QWORD *pqwBytes
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation Protected Media Path component interfaces
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( 542612C4-A1B8-4632-B521-DE11EA64A0B0 ),
helpstring( "IMFTrustedInput Interface")
]
/// <summary>
/// A component that exposes Input Trust Authorities implements
/// IMFTrustedInput.
/// This interface provides a common way for the components to expose
/// ITAs on each of its streams.
/// In addition to the methods inherited from IUnknown, IMFTrustedInput also
/// exposes the following methods.
/// </summary>
interface IMFTrustedInput : IUnknown
{
/// <summary>
/// The GetInputTrustAuthority method returns an Input Trust Authority
/// for the specified presentation and stream.
/// </summary>
/// <param name="dwStreamID">
/// [in] The stream ID for which the ITA is being requested.
/// </param>
/// <param name="riid">
/// [in] The interface ID that is requested from the ITA.
/// </param>
/// <param name="ppv">
/// [out] A pointer to the requested interface of an ITA.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// Otherwise it returns a failure code.
/// If the decrypter does not support the requested interface,
/// the failure code is E_NOINTERFACE.
/// </returns>
/// <remarks>
/// The only value of riid currently passed in by MF is
/// IID_IMFInputTrustAuthority.
/// We are using custom marshalling for cross-process remoting
///</remarks>
HRESULT GetInputTrustAuthority(
[in] DWORD dwStreamID,
[in] REFIID riid,
[out, iid_is(riid)] IUnknown** ppunkObject
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum _MFPOLICYMANAGER_ACTION
{
PEACTION_NO = 0,
PEACTION_PLAY = 1,
PEACTION_COPY = 2,
PEACTION_EXPORT = 3,
PEACTION_EXTRACT = 4,
PEACTION_RESERVED1 = 5,
PEACTION_RESERVED2 = 6,
PEACTION_RESERVED3 = 7,
PEACTION_LAST = 7
} MFPOLICYMANAGER_ACTION;
typedef struct _MFINPUTTRUSTAUTHORITY_ACTION
{
// action performed by the OTA
MFPOLICYMANAGER_ACTION Action;
// pointer to ticket object provided by the OTA
BYTE * pbTicket;
// size of the ticket object
DWORD cbTicket;
} MFINPUTTRUSTAUTHORITY_ACCESS_ACTION;
/// <summary>
/// Contains parameters for BindAccess / UpdateAccess operation
/// PolicyEngine has to do following operations in order to call BindAccess
/// - go through the list OTAs which are receiving data from the ITA
/// - call OTA::SetPolicy passing PolicyObject from the ITA
/// - get Ticket object (Ticket can be returned from OTA::SetPolicy call or as part of MESetPolicy event)
/// * OTA can return NULL if it does not support tickets
/// - put action / ticket to rgOutputActions array
/// - sign structure. append signature at the end of the structure
/// </summary>
typedef struct _MFINPUTTRUSTAUTHORITY_ACCESS_PARAMS
{
// sizeof of structure
DWORD dwSize;
// version. should be 0
DWORD dwVer;
// offset and size of signature blob
DWORD cbSignatureOffset;
DWORD cbSignatureSize;
// offset and size of extension blob
DWORD cbExtensionOffset;
DWORD cbExtensionSize;
// number of elements in rgOutputActions array
DWORD cActions;
// array of MFINPUTTRUSTAUTHORITY_ACCESS_ACTION structure
// one structure per OTA / per action;
MFINPUTTRUSTAUTHORITY_ACCESS_ACTION rgOutputActions[1];
} MFINPUTTRUSTAUTHORITY_ACCESS_PARAMS;
interface IMFOutputPolicy;
[
object,
uuid( D19F8E98-B126-4446-890C-5DCB7AD71453 ),
helpstring( "IMFInputTrustAuthority Interface"),
]
/// <summary>
/// Input Trust Authorities implement IMFInputTrustAuthority. This
/// interface provides a common way for the rest of the PMP components
/// to talk to various input protection systems. In addition to the methods
/// inherited from IUnknown, IMFInputTrustAuthority also exposes the
// following methods.
/// </summary>
interface IMFInputTrustAuthority : IUnknown
{
/// <summary>
/// The GetDecrypter method returns a decrypter transform.
/// <para>
/// Usually protected content is encrypted when it is stored
/// or transmitted.
/// After it enters the Media Path via a media source or transform, /// it typically needs to be decrypted first as the majority
/// of components in the Media Path can process
/// clear content only. The decrypter transform does this.
/// </para>
/// <para>
/// The PMP inserts the decrypter as the first node in the
/// topology right after the node corresponding to the ITA.
/// For every protected stream of the ITA node object there
/// is a separate instance of the ITA and decrypter.
/// However since the ITA node object hands out
/// all ITA instances (via ITA Creator) it can arrange for the
/// ITAs to be light objects that point to a common underlying
/// object. For instance, the ASF media source does this
/// for the WMDRM ITAs it hands out for its streams.
/// </para>
/// </summary>
/// <param name="riid">
/// [in] The interface ID that is requested from the decrypter
/// transform.
/// </param>
/// <param name="ppv">
/// [out] A pointer to the requested interface of a decrypter
/// transform.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// Otherwise it returns a failure code.
/// If the decrypter does not support the requested interface,
/// the failure code is E_NOINTERFACE.
/// </returns>
/// <remarks>
/// The only value of riid currently passed in by the MF Policy Engine
/// is IID_IMFTransform.
/// <para>
/// It is recommended that on creation the decrypter transform
/// should be in a "disabled" state i.e. the ProcessOutput method
/// should fail. After the ITA verifies that it is running inside
/// the PMP,
/// it should enable the decrypter.
/// It can do this through a private interface, since
/// the decrypter is handed out by the ITA.
/// Having the decrypter disabled by default
/// prevents the decrypter from being used outside the PMP.
/// </para>
/// <para>
/// The ITA node object and ITA together should ensure that the
/// decrypter transform that they hand out can accept the media
/// type(s) possible for the corresponding input stream.
/// </para>
///</remarks>
[local]
HRESULT GetDecrypter(
[in] REFIID riid,
[out, iid_is(riid), annotation("__out")] void ** ppv );
/// <summary>
/// Through the RequestAccess method the Policy Engine tells the ITA
/// about the actions that will be performed with that stream.
/// <para>
/// At this point the ITA should do whatever work it needs to
/// verify a user<65>s right to do those actions, check licenses etc.
/// </para>
/// <para>
/// This method may be called multiple times, once for every
/// output that this stream goes to.
/// The actions in each call may be different.
/// </para>
/// <para>
/// Sometimes even if the user currently does not have the
/// requested right, the ITA may be able to get the user that
/// right by performing some additional steps, but
/// user consent would be required before performing those steps.
/// An example is license acquisition or individualization.
/// In such a case the ITA should pass back
/// an IMFActivate to a ContentEnabler object through
/// ppContentEnablerActivate. The ContentEnabler
/// implementation should be provided by the ITA and its
/// methods should completely encapsulate the additional steps to
/// be done. The Policy Engine will pass this to
/// the application, let the application Activate and call the
/// ContentEnabler methods after getting the user<65>s consent.
/// Once that completes, the Policy Engine will call RequestAccess
/// once again on the ITA.
/// </para>
/// </summary>
/// <param name="Action">
/// [in] An enum that says how the data from this stream is going
/// to be used.
/// </param>
/// <param name="ppContentEnablerActivate">
/// [out] An optional IMFActivate to a ContentEnabler object.
/// </param>
/// <returns>
/// If this verification succeeds, the ITA should return S_OK
/// and pass back NULL in the optional ppContentEnablerActivate
/// parameter.
/// <para>
/// If the verification results in a definite no,
/// the ITA should return MF_E_NO_RIGHTS
/// and pass back NULL in the optional ppContentEnablerActivate
/// parameter.
/// </para>
/// <para>
/// If the verification needs additional steps to be performed
/// with user consent, the ITA should return MF_E_NEEDS_ENABLING
/// and pass back an IMFActivate to a ContentEnabler
/// pointer in the ppContentEnablerActivate parameter.
/// </para>
/// </returns>
/// <remarks>
/// Through RequestAccess the Policy Engine tells the ITA to only
/// prepare for an action.
/// The ITA should not assume that the action will definitely happen.
/// For instance there might be a failure in one of the later steps
/// before even a single media sample is pulled out of the input.
/// When the action is definitely about to happen the Policy
/// Engine calls BindAccess.
///</remarks>
[local]
HRESULT RequestAccess(
[in] MFPOLICYMANAGER_ACTION Action,
[out, annotation("__out")] IMFActivate **ppContentEnablerActivate );
/// <summary>
/// The GetPolicy method returns the policy that dictates which output
/// protection systems to allow for the given stream and the
/// configuration data for each protection system.
/// </summary>
/// <param name="Action">
/// [in] An enum that says how the data from this stream is going
/// to be used. The policy returned is typically a function of
/// the action being performed on that
/// stream.
/// </param>
/// <param name="ppPolicy">
/// [out] An IMFOutputPolicy object for that stream for that action.
/// See IMFOutputPolicy for details.
/// </param>
/// <returns>
/// The ITA should return S_OK on success and an appropriate error code
/// on failure.
/// </returns>
/// <remarks>
///</remarks>
[local]
HRESULT GetPolicy(
[in] MFPOLICYMANAGER_ACTION Action,
[out, annotation("__out")] IMFOutputPolicy ** ppPolicy);
/// <summary>
/// Through the BindAccess method the Policy Engine informs the
/// ITA that the action requested is definitely happening.
/// This allows the ITA to change any internal state.
/// For instance a WMDRM ITA might update the playcount remaining
/// for that piece of content.
/// <para>
/// The action passed in through BindAccess must be the same
/// as the one passed in earlier through RequestAccess.
/// </para>
/// </summary>
/// <param name="pParam">
/// [in] pointer to the structure which contains parameters for BIND operation.
/// </param>
/// <returns>
/// If the ITA approves of the action it should return S_OK.
/// Otherwise it should return a failure code.
/// </returns>
/// <remarks>
/// </remarks>
[local]
HRESULT BindAccess(
[in, annotation("__in")] MFINPUTTRUSTAUTHORITY_ACCESS_PARAMS * pParam);
/// <summary>
/// Through the UpdateAccess method the Policy Engine informs
/// the ITA of any changes in the pipeline that affect the
/// cActionCount value passed in the preceding BindAccess call for
/// this action.
/// This allows the ITA to change any internal state.
/// For instance a WMDRM ITA might update the copycount remaining
/// for that piece of content.
/// </summary>
/// <param name="pParam">
/// [in] pointer to the structure which contains parameters for BIND operation.
/// </param>
/// <returns>
/// If the ITA approves of the action it should return S_OK.
/// Otherwise it should return a failure code.
/// </returns>
/// <remarks>
/// </remarks>
[local]
HRESULT UpdateAccess(
[in, annotation("__in")] MFINPUTTRUSTAUTHORITY_ACCESS_PARAMS * pParam);
/// <summary>
/// The Reset method tells the ITA to return to the initial state.
/// Any decrypter it handed out should be disabled at this point.
/// </summary>
/// <returns>
/// If the ITA can reset successfully it should return an S_OK,
/// otherwise it should return an error code.
/// </returns>
/// <remarks>
/// The Policy Engine currently ignores the return code from this
/// method.
///</remarks>
HRESULT Reset();
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
interface IMFOutputTrustAuthority;
[
object,
uuid( D19F8E95-B126-4446-890C-5DCB7AD71453 ),
helpstring( "IMFTrustedOutput Interface"),
pointer_default(unique),
local
]
/// <summary>
/// Media sinks and transforms that are designed to work with the PMP
/// and send protected content outside the MF pipeline must implement
/// IMFTrustedOutput. Through this interface the Policy Engine negotiates
/// which type of content protection the output should apply.
/// </summary>
interface IMFTrustedOutput : IUnknown
{
/// <summary>
/// GetOutputTrustAuthorityCount returns the number of Output Trust
/// Authorities being exposed by this output. A trusted output
/// can expose one or more OTAs, each of which reports a single action.
/// </summary>
/// <param name="pcOutputTrustAuthorities">
/// [out] The number of Output Trust Authorities exposed by this
/// output.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetOutputTrustAuthorityCount(
[out, annotation("__out")] DWORD * pcOutputTrustAuthorities);
/// <summary>
/// GetOutputTrustAuthorityByIndex returns the Trust Authority for
/// the output at
/// the specified index, which exposes an action being executed by this
/// output, and implements the content protection systems supported for
/// that action.
/// </summary>
/// <param name="dwIndex">
/// [in] The index for the requested Trust Authority pointer.
/// </param>
/// <param name="ppauthority">
/// [out] The output returns the Output Trust Authority pointer
/// through this.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetOutputTrustAuthorityByIndex(
[in] DWORD dwIndex,
[out, annotation("__out")] IMFOutputTrustAuthority ** ppauthority);
/// <summary>
/// IsFinal returns whether the trusted output is to be considered a
/// policy sink, or whether policy needs to be enforced further
/// downstream of this trusted output.
/// </summary>
/// <param name="pfIsFinal">
/// [out] The value returned indicates whether this is a final output
/// which acts as a policy sink.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
/// <remarks>
/// A trusted output is generally considered final if it ensures that
/// it either does not give out any of the media content it receives,
/// or any part of the content that it gives out is protected by
/// its own proprietary methods (e.g. encryption) or sufficiently
/// devalued so as to not require protection.
///</remarks>
HRESULT IsFinal(
[out, annotation("__out")] BOOL *pfIsFinal );
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( D19F8E94-B126-4446-890C-5DCB7AD71453 ),
helpstring( "IMFOutputTrustAuthority Interface"),
pointer_default(unique),
local
]
/// <summary>
/// The Output Trust Authority encapsulates the functionality of one or
/// more specific content protection systems that a trusted output supports.
/// Every output must provide an IMFOutputTrustAuthority (OTA)
/// implementation for each virtual output it encapsulates.
/// It may do this through one OTA object if those outputs have the same
/// action or multiple OTAs if they are different actions.
/// </summary>
interface IMFOutputTrustAuthority : IUnknown
{
/// <summary>
/// GetAction returns what the output trust authority does with the
/// content.
/// </summary>
/// <param name="pAction">
/// [in] A pointer to an MFPOLICYMANAGER_ACTION enum.
/// The output fills in the enum value that comes closest to
/// describing what the output does with the content.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetAction(
[out, annotation("__out")] MFPOLICYMANAGER_ACTION * pAction);
/// <summary>
/// Through SetPolicy the Policy Engine passes the output the
/// Policy Objects provided by the ITAs, which specify which
/// content protections to apply to the content.
/// Content from multiple Input TAs may be given to the same
/// output, so SetPolicy takes an array of Policy Objects
/// </summary>
/// <param name="ppPolicy">
/// [in] An array of Policy Objects, each packaged as an
/// IMFOutputPolicy.
/// Each Policy Object negotiates policy with the OTA and specifies the
/// content protection systems to apply to all content received by the
/// output henceforth.
/// </param>
/// <returns>
/// The return value is S_OK if the output supports the specified
/// content protection systems.
//// Otherwise the return value is an error code.
/// </returns>
HRESULT SetPolicy(
[in, annotation("__in_ecount_opt(nPolicy)")] IMFOutputPolicy ** ppPolicy,
[in] DWORD nPolicy,
[out, unique, size_is( ,*pcbTicket), annotation("__deref_opt_out_bcount(*pcbTicket)")] BYTE ** ppbTicket,
[out, annotation("__out_opt")] DWORD * pcbTicket);
};
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( 7F00F10A-DAED-41AF-AB26-5FDFA4DFBA3C ),
helpstring( "IMFOutputPolicy Interface"),
pointer_default(unique),
local
]
/// <summary>
/// The IMFOutputPolicy interface allows OTAs to query for the
/// protection systems they are required to enforce on each of their
/// outputs for the current content
/// </summary>
interface IMFOutputPolicy : IMFAttributes
{
/// <summary>
/// GenerateRequiredSchemas takes in the specifics of the output type
/// and the list of protection systems supported by the output.
/// It returns either an error code or an IMFOutputSchemaCollection
/// pointer indicating a subset of the output's supported protection
/// schemas that need to be enforced, along with configuration
/// data for each protection schema that needs to be enforced.
/// </summary>
/// <param name="dwAttributes">
/// [in] A bitfield that indicates the attributes of an output
/// that this OTA represents and of the media going over this
/// output.
/// </param>
/// <param name="guidOutputID">
/// [in] A GUID that indicates a specific media output connector or
/// family of connectors that this OTA represents.
/// For instance, for an analog video output, this tells the
/// Policy Object whether this is a Component, Composite, S-Video or
/// VGA output.
/// For a digital audio output, this tells the Policy Object whether
/// this is a S/PDIF or HDMI output.
/// </param>
/// <param name="rgGuidProtectionSchemasSupported">
/// [in] An array of GUIDs that indicates the output protection
/// schemas this OTA supports.
/// This is used by the Policy Object to determine whether
/// this output supports enough protection
/// to meet the security bar of the content this policy is for
/// </param>
/// <param name="cProtectionSchemasSupported">
/// [in] A DWORD that indicates the number of GUIDs passed in the
/// rgGuidProtectionSchemasSupported parameter.
/// </param>
/// <param name="ppRequiredProtectionSchemas">
/// [out] A pointer to an IMFOutputSchemaCollection that will store
/// the collection of IMFOutputSchema's to indicate the
/// protection schemas this OTA is required to enforce on
/// the specified output
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GenerateRequiredSchemas(
[in] DWORD dwAttributes,
[in] GUID guidOutputSubType,
[in] GUID *rgGuidProtectionSchemasSupported,
[in] DWORD cProtectionSchemasSupported,
[out, annotation("__out")] IMFCollection **ppRequiredProtectionSchemas );
/// <summary>
/// GetOriginatorID returns a GUID identifying the ITA originator
/// of this Policy Object.
/// The OriginatorID of an ITA should be the same for all of the
/// Policy Objects and Output Schemas it gives out, as well as those
/// given out by its topology component for dynamic policy changes.
/// However, it should be unique from all the other ITAs that could
/// give Policy Objects and Output Schemas to an OTA.
/// </summary>
/// <param name="pguidOriginatorID">
/// [out] A pointer to a GUID that will store the ID of the
//// originator of this Policy Object.
/// The Originator ID allows the OTA to distinguish
/// Policy Objects coming from different ITAs, so it can
/// know which one to update during dynamic policy changes
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetOriginatorID(
[out, annotation("__out")] GUID *pguidOriginatorID );
/// <summary>
/// GetMinimumGRLVersion returns a DWORD indicating the minimum version
/// of the Global Revocation List that needs to be enforced by the
/// Protected Environment to process the content that this
/// policy applies to.
/// </summary>
/// <param name="pdwMinimumGRLVersion">
/// [out] A pointer to a DWORD that will store the minimum version
/// of the GRL required for the content associated with this
/// Policy Object.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
/// <remarks>
/// In MF v1, we do not support dynamic changes to a content's
/// security level requirements within a single presentation.
/// The content security level is checked before content streaming
/// begins, and is assumed to remain constant for the duration of
/// that presentation.
/// If content exposes a new Policy Object via dynamic policy changes,
/// any changes to the SL value will not be handled.
///</remarks>
HRESULT GetMinimumGRLVersion(
[out, annotation("__out")] DWORD *pdwMinimumGRLVersion );
};
//
// Output attributes (bit masks for fields)
//
cpp_quote( "#define MFOUTPUTATTRIBUTE_DIGITAL ((DWORD) 0x00000001)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_NONSTANDARDIMPLEMENTATION ((DWORD) 0x00000002)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_VIDEO ((DWORD) 0x00000004)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_COMPRESSED ((DWORD) 0x00000008)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_SOFTWARE ((DWORD) 0x00000010)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_BUS ((DWORD) 0x00000020)" )
cpp_quote( "#define MFOUTPUTATTRIBUTE_BUSIMPLEMENTATION ((DWORD) 0x0000FF00)" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_SPDIF, 0xb94a712, 0xad3e, 0x4cee, 0x83, 0xce, 0xce, 0x32, 0xe3, 0xdb, 0x65, 0x22);" )
//
// Bus Connector GUIDs
// NOTE: All 128 GUIDs ac3aefXX-ce43-11d9-92db-000bdb28ff98 for XX=5c-db
// have been reserved for connector GUIDs for buses. This reserved range
// shall be used when defining new bus connectors
//
cpp_quote( "" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_UNKNOWN, 0xac3aef5c, 0xce43, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_PCI, 0xac3aef5d, 0xce43, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_PCIX, 0xac3aef5e, 0xce43, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_PCI_Express, 0xac3aef5f, 0xce43, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_AGP, 0xac3aef60, 0xce43, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "" )
//
// Output Connector GUIDs
// NOTE: All 128 GUIDs 57cd59XX-ce47-11d9-92db-000bdb28ff98 for XX=68-e7
// have been reserved for connector GUIDs for outputs. This reserved range
// shall be used when defining new output connectors.
// The value of the GUID needs to be in the same order as defined in COPP_ConnectorType.
//
cpp_quote( "" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_VGA, 0x57cd5968, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_SVIDEO, 0x57cd5969, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_COMPOSITE, 0x57cd596a, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_COMPONENT, 0x57cd596b, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_DVI, 0x57cd596c, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_HDMI, 0x57cd596d, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_LVDS, 0x57cd596e, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
// The GUID 57cd596f-ce47-11d9-92db-000bdb28ff98 is reserved for TMDS
cpp_quote( "EXTERN_GUID( MFCONNECTOR_D_JPN, 0x57cd5970, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_SDI, 0x57cd5971, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_DISPLAYPORT_EXTERNAL, 0x57cd5972, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_DISPLAYPORT_EMBEDDED, 0x57cd5973, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_UDI_EXTERNAL, 0x57cd5974, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "EXTERN_GUID( MFCONNECTOR_UDI_EMBEDDED, 0x57cd5975, 0xce47, 0x11d9, 0x92, 0xdb, 0x00, 0x0b, 0xdb, 0x28, 0xff, 0x98);" )
cpp_quote( "" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( 7BE0FC5B-ABD9-44FB-A5C8-F50136E71599 ),
helpstring( "IMFOutputSchema Interface"),
pointer_default(unique),
local
]
/// <summary>
/// The IMFOutputSchema interface encapsulates information for a single
/// output protection system and its corresponding configuration data.
/// IMFAttributes is used to store configuration data beyond the default DWORD
/// </summary>
interface IMFOutputSchema : IMFAttributes
{
/// <summary>
/// GetSchemaType returns the GUID for the output protection system specified
/// by this IMFOutputSchema.
/// </summary>
/// <param name="guidSchemaType">
/// [out] A GUID representing a specific output protection system.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetSchemaType(
[out, annotation("__out")] GUID *pguidSchemaType);
/// <summary>
/// GetConfigurationData provides OTAs easy access to policy configuration data
/// if that data does not need more than a DWORD of space (this is true for many
/// of our OTAs right now.
/// </summary>
/// <param name="pdwVal">
/// [out] A pointer to a DWORD that will store the basic configuration data
/// for the protection scheme specified by this IMFOutputSchema. The semantics
/// of the DWORD vary across protection schemes.
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetConfigurationData(
[out, annotation("__out")] DWORD *pdwVal);
/// <summary>
/// GetOriginatorID returns a GUID identifying the ITA originator of this Output Schema.
/// The OriginatorID of an ITA should be the same for all of the Policy Objects and Output Schemas
/// it gives out, as well as those given out by its topology component for dynamic policy changes.
/// However, it should be unique from all the other ITAs that could give Policy Objects and
/// Output Schemas to an OTA.
/// </summary>
/// <param name="pguidOriginatorID">
/// [out] A pointer to a GUID that will store the ID of the originator of this Output
/// Schema. The Originator ID allows the OTA to distinguish Output Schemas coming from
/// different ITAs, so it can know which one to update during content protection messages
/// </param>
/// <returns>
/// The return value is S_OK on success, and an error code otherwise.
/// </returns>
HRESULT GetOriginatorID(
[out, annotation("__out")] GUID *pguidOriginatorID );
};
//
// Protection Scheme GUIDs
//
cpp_quote( "" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_DISABLE, 0x8cc6d81b, 0xfec6, 0x4d8f, 0x96, 0x4b, 0xcf, 0xba, 0x0b, 0x0d, 0xad, 0x0d);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_CONSTRICTVIDEO, 0x193370ce, 0xc5e4, 0x4c3a, 0x8a, 0x66, 0x69, 0x59, 0xb4, 0xda, 0x44, 0x42);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_CONSTRICTAUDIO, 0xffc99b44, 0xdf48, 0x4e16, 0x8e, 0x66, 0x09, 0x68, 0x92, 0xc1, 0x57, 0x8a);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_TRUSTEDAUDIODRIVERS, 0x65bdf3d2, 0x0168, 0x4816, 0xa5, 0x33, 0x55, 0xd4, 0x7b, 0x02, 0x71, 0x01);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_HDCP, 0xAE7CC03D, 0xC828, 0x4021, 0xac, 0xb7, 0xd5, 0x78, 0xd2, 0x7a, 0xaf, 0x13);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_CGMSA, 0xE57E69E9, 0x226B, 0x4d31, 0xB4, 0xE3, 0xD3, 0xDB, 0x00, 0x87, 0x36, 0xDD);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_ACP, 0xc3fd11c6, 0xf8b7, 0x4d20, 0xb0, 0x08, 0x1d, 0xb1, 0x7d, 0x61, 0xf2, 0xda);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_WMDRMOTA, 0xa267a6a1, 0x362e, 0x47d0, 0x88, 0x05, 0x46, 0x28, 0x59, 0x8a, 0x23, 0xe4);" )
cpp_quote( "EXTERN_GUID( MFPROTECTION_FFT, 0x462a56b2, 0x2866, 0x4bb6, 0x98, 0x0d, 0x6d, 0x8d, 0x9e, 0xdb, 0x1a, 0x8c);" )
cpp_quote( "" )
//
// Protection schema attribute GUIDs
//
cpp_quote( "" )
cpp_quote( "EXTERN_GUID( MFPROTECTIONATTRIBUTE_CONSTRICTVIDEO_IMAGESIZE, 0x8476fc, 0x4b58, 0x4d80, 0xa7, 0x90, 0xe7, 0x29, 0x76, 0x73, 0x16, 0x1d);" )
cpp_quote( "EXTERN_GUID( MFPROTECTIONATTRIBUTE_HDCP_SRM, 0x6f302107, 0x3477, 0x4468, 0x8a, 0x8, 0xee, 0xf9, 0xdb, 0x10, 0xe2, 0xf);" )
cpp_quote( "" )
//
// MFPROTECTION_DISABLE schema data
//
// Schema data is a 32 bit value defined as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +-------------------------------------------------------------+-+
// | Reserved |S|
// +-------------------------------------------------------------+-+
//
// where
//
// Reserved - must be zero
//
// S - Status
// 0 = off, i.e. do not disable
// 1 = on, i.e. disable
//
// The MAKE macro is useful to ITA policy objects for building the DWORD
// schema data. Note it does not validate the parameters.
//
// The EXTRACT macros are normally useful only to implementors of this type of
// protection for breaking out parameters from the DWORD schema data.
// Extracting the Reserved data is useful only to verify that it is zero.
//
cpp_quote( "" )
cpp_quote( "#define MAKE_MFPROTECTIONDATA_DISABLE(Disable) \\" )
cpp_quote( " ((DWORD)(Disable ? 0x00000001 : 0))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_DISABLE_ON(Data) \\" )
cpp_quote( " (0 != ((Data) & 0x00000001))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_DISABLE_RESERVED(Data) \\" )
cpp_quote( " (((DWORD)((Data) & 0xFFFFFFFE)) >> 1)" )
cpp_quote( "" )
//
// MFPROTECTION_CONSTRICTAUDIO schema data
//
// Schema data is a 32 bit value defined as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +-----------------------------------------------+---------------+
// | Reserved | Level |
// +-----------------------------------------------+---------------+
//
// where
//
// Reserved - must be zero
//
// Level - the constriction level. Values defined by the
// EAudioConstriction enumeration.
//
// The MAKE macro is useful to ITA policy objects for building the DWORD
// schema data. Note it does not validate the parameters.
//
// The EXTRACT macros are normally useful only to implementors of this type of
// protection for breaking out parameters from the DWORD schema data.
// Extracting the Reserved data is useful only to verify that it is zero.
//
cpp_quote( "" )
cpp_quote( "#define MAKE_MFPROTECTIONDATA_CONSTRICTAUDIO(Level) \\" )
cpp_quote( " ((DWORD)(Level))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_CONSTRICTAUDIO_LEVEL(Data) \\" )
cpp_quote( " ((DWORD)((Data) & 0x000000FF))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_CONSTRICTAUDIO_RESERVED(Data) \\" )
cpp_quote( " (((DWORD)((Data) & 0xFFFFFF00)) >> 8)" )
cpp_quote( "" )
//
// MFPROTECTION_TRUSTEDAUDIODRIVERS schema data
//
// Schema data is a 32 bit value defined as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---------------------------+-+-+-------------------------------+
// | Reserved |N|T|D| DrmLevel |
// +---------------------------+-+-+-------------------------------+
//
// where
//
// Reserved - must be zero
//
// N - CopyOk
//
// T - allow test certificates
//
// D - digital output disable
//
// DrmLevel - the minimim allowed DrmLevel attribute for the audio drivers
//
// The MAKE macro is useful to ITA policy objects for building the DWORD
// schema data. Note it does not validate the parameters.
//
// The EXTRACT macros are normally useful only to implementors of this type of
// protection for breaking out parameters from the DWORD schema data.
// Extracting the Reserved data is useful only to verify that it is zero.
//
cpp_quote( "" )
cpp_quote( "#define MAKE_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS(TestCertificateEnable, DigitalOutputDisable, DrmLevel) \\" )
cpp_quote( " (((DWORD)((TestCertificateEnable) ? 0x00020000 : 0)) | \\" )
cpp_quote( " ((DWORD)((DigitalOutputDisable) ? 0x00010000 : 0)) | \\" )
cpp_quote( " ((DWORD)(DrmLevel)))" )
cpp_quote( "" )
cpp_quote( "" )
cpp_quote( "#if (WINVER >= _WIN32_WINNT_WIN7) ")
cpp_quote( "#define MAKE_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS2(TestCertificateEnable, DigitalOutputDisable, CopyOK, DrmLevel) \\" )
cpp_quote( " (((DWORD)((TestCertificateEnable) ? 0x00020000 : 0)) | \\" )
cpp_quote( " ((DWORD)((DigitalOutputDisable) ? 0x00010000 : 0)) | \\" )
cpp_quote( " ((DWORD)((CopyOK) ? 0x00040000 : 0)) | \\" )
cpp_quote( " ((DWORD)(DrmLevel)))" )
cpp_quote( "" )
cpp_quote( "#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_DRMLEVEL(Data) \\" )
cpp_quote( " ((DWORD)((Data) & 0x0000FFFF))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_DIGITALOUTPUTDISABLE(Data) \\" )
cpp_quote( " (0 != ((Data) & 0x00010000))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_TESTCERTIFICATEENABLE(Data) \\" )
cpp_quote( " (0 != ((Data) & 0x00020000))" )
cpp_quote( "" )
cpp_quote( "#if (WINVER >= _WIN32_WINNT_WIN7) ")
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_COPYOK(Data) \\" )
cpp_quote( " (0 != ((Data) & 0x00040000))" )
cpp_quote( "" )
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_RESERVED(Data) \\" )
cpp_quote( " (((DWORD)((Data) & 0xFFF80000)) >> 19)" )
cpp_quote( "" )
cpp_quote( "#else ")
cpp_quote( "#define EXTRACT_MFPROTECTIONDATA_TRUSTEDAUDIODRIVERS_RESERVED(Data) \\" )
cpp_quote( " (((DWORD)((Data) & 0xFFF80000)) >> 18)" )
cpp_quote( "" )
cpp_quote( "#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( d0ae555d-3b12-4d97-b060-0990bc5aeb67 ),
local
]
/// <summary>
/// IMFSecureChannel is the base level interfaced used for initializing
/// a one-way secure channel between a host and a client. The client
/// implements the IMFSecureChannel interface, which the host calls methods
/// on to setup the channel.
/// </summary>
interface IMFSecureChannel : IUnknown
{
/// <summary>
/// GetCertificate should return the client's secure channel
/// certificate.
/// </summary>
/// <param name="ppCoTaskMemCert">
/// ppCoTaskMemCert receives a pointer to a chunk of memory containing
/// the secure channel certificate. This memory should be allocated
/// by the callee using CoTaskMemAlloc, and must be freed by the caller
/// using CoTaskMemFree.
/// </param>
/// <param name="pcbCert">
/// pcbCert receives the length of the buffer returned by the
/// ppCoTaskMemCert parameter.
/// </param>
HRESULT GetCertificate( [out, annotation("__deref_out_bcount(*pcbCert)")] BYTE **ppCert, [out, annotation("__out")] DWORD* pcbCert );
/// <summary>
/// SetupSession passes the encrypted session key to the callee. The
/// callee should decrypt this key and use it as the session key for
/// the secure channel connection.
/// </summary>
/// <param name="pbEncryptedSessionKey">
/// Contains a pointer to a chunk of memory containing the encrypted
/// session key.
/// </param>
/// <param name="cbSessionKey">
/// Contains the length of the memory buffer pointed to by the
/// pbEncryptedSessionKey parameter.
/// </param>
HRESULT SetupSession( [in, annotation("__in_bcount(cbSessionKey)")] BYTE *pbEncryptedSessionKey, [in] DWORD cbSessionKey );
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum SAMPLE_PROTECTION_VERSION
{
SAMPLE_PROTECTION_VERSION_NO = 0,
SAMPLE_PROTECTION_VERSION_BASIC_LOKI = 1,
SAMPLE_PROTECTION_VERSION_SCATTER = 2,
SAMPLE_PROTECTION_VERSION_RC4 = 3
} SAMPLE_PROTECTION_VERSION;
cpp_quote( "EXTERN_GUID( MF_SampleProtectionSalt, 0x5403deee, 0xb9ee, 0x438f, 0xaa, 0x83, 0x38, 0x4, 0x99, 0x7e, 0x56, 0x9d);" )
[
object,
uuid( 8e36395f-c7b9-43c4-a54d-512b4af63c95 ),
local
]
interface IMFSampleProtection : IUnknown
{
/// <summary>
/// GetInputProtectionVersion returns the version of sample protection implemented by
/// the component on the input.
/// </summary>
/// <param name="pdwVersion">
/// pdwVersion receives a DWORD containing the version number.
/// </param>
HRESULT GetInputProtectionVersion( [out, annotation("__out")] DWORD *pdwVersion );
/// <summary>
/// GetOutputProtectionVersion returns the version of sample protection implemented by
/// the component on the input.
/// </summary>
/// <param name="pdwVersion">
/// pdwVersion receives a DWORD containing the version number.
/// </param>
HRESULT GetOutputProtectionVersion( [out, annotation("__out")] DWORD *pdwVersion );
/// <summary>
/// GetProtectionCertificate only needs to be implemented for a
/// downstream component providing sample protection for certain
/// version numbers of sample protection. It returns the sample
/// protection certificate of that component.
/// Components which do not need to implement the certificate
/// functionality should simply return E_NOTIMPL.
/// </summary>
/// <param name="dwVersion">
/// Contains the version number of the sample protection scheme for
/// which to receive the sample protection certificate.
/// </param>
/// <param name="ppMemCert">
/// Receives a pointer to a memory buffer containing the sample
/// protection certificate. This memory should be allocated by the
/// callee using CoTaskMemAlloc and freed by the caller using
/// CoTaskMemFree.
/// </param>
/// <param name="pcbCert">
/// Receives the length of the memory buffer returned in the
/// ppCoTaskMemCert parameter.
/// </param>
HRESULT GetProtectionCertificate( [in] DWORD dwVersion,
[out, annotation("__deref_out_bcount(*pcbCert)")] BYTE **ppCert,
[out, annotation("__out")] DWORD *pcbCert );
/// <summary>
/// InitOutputProtection is implemented by an upstream component
/// providing sample protection functionality. It receives a version
/// number for the sample protection scheme to use, and returns
/// initialization information specific to that sample protection
/// scheme.
/// The component should return a failure code if the specified version
/// of sample protection is not supported.
/// A downstream component should return E_NOTIMPL for this method.
/// </summary>
/// <param name="dwVersion">
/// Specifies the version number of sample protection to be used.
/// </param>
/// <param name="dwOutputId">
/// Specifies the ID of the output (output ID for IMFTransform)
/// </param>
/// <param name="pbCert">
/// Pointer to certificate blob provided by the downstream component
/// </param>
/// <param name="pbCert">
/// Size to certificate blob provided by the downstream component
/// </param>
/// <param name="ppbSeed">
/// Receives the initialization information for downstream component.
/// This information should be deallocated by the caller using the
/// CoTaskMemFree method.
/// </param>
/// <param name="pcbSeed">
/// Receives the size of initialization information.
/// </param>
HRESULT InitOutputProtection( [in] DWORD dwVersion,
[in] DWORD dwOutputId,
[in] BYTE * pbCert,
[in] DWORD cbCert,
[out] BYTE ** ppbSeed,
[out] DWORD * pcbSeed );
/// <summary>
/// InitInputProtection is implemented by a downstream component
/// providing sample protection functionality. It takes a version
/// number of sample protection, along with initialization information
/// specific to that sample protection scheme.
/// The method should return a failure code in the event that the
/// component does not support the specified version of sample
/// protection.
/// An upstream component should return E_NOTIMPL for this method.
/// </summary>
/// <param name="dwVersion">
/// Specifies the version number of sample protection to be used.
/// </param>
/// <param name="dwInputId">
/// Specifies the ID of the input (input ID for IMFTransform or stream ID for IMFMediaSink)
/// </param>
/// <param name="pbSeed">
/// Specifies the initialization information provided by the upstream node.
/// The callee should copy this information if it is needed outside the
/// scope of this call.
/// </param>
/// <param name="cbSeed">
/// Specifies the size of initialization information contained in a
/// pbSeed.
/// </param>
HRESULT InitInputProtection( [in] DWORD dwVersion,
[in] DWORD dwInputId,
[in] BYTE * pbSeed,
[in] DWORD cbSeed );
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation Media Source/Sink: interfaces for advanced implementations
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(5dfd4b2a-7674-4110-a4e6-8a68fd5f3688)
]
///
/// <summary>
/// IMFMediaSinkPreroll is optionally implemented by Media Sinks
/// that are able to preroll. Prerolling helps avoid glitches
/// upon startup.
/// </summary>
interface IMFMediaSinkPreroll : IUnknown
{
/// <summary>
///
/// </summary>
/// <param name="hnsUpcomingStartTime">
/// An MFTIME indicating what the start time for IMFClock::Start call
/// </param>
/// <remarks>
/// <para>
/// For all IMFStreamSink::ProcessSample calls received
/// between this call and the IMFClockStateSink::OnClockStart call,
/// any necessary work should be done on the sample to prepare it
/// to be processed, but the sample should not be rendered until
/// OnClockStart is received.
/// </para>
/// </remarks>
HRESULT NotifyPreroll(
[in] MFTIME hnsUpcomingStartTime
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(EAECB74A-9A50-42ce-9541-6A7F57AA4AD7),
local
]
/// <summary>
/// IMFFinalizableMediaSink is optionally supported by Media Sinks
/// that finish its time-consuming tasks before shutdown.
/// </summary>
interface IMFFinalizableMediaSink : IMFMediaSink
{
///
/// <summary>
/// BeginFinalize tells the Media Sink to asynchronously
/// take any steps it needs to finish its tasks.
/// </summary>
/// <param name="pCallback">
/// Pointer to an Asynchronous Callback object.
/// Should not be NULL.
/// </param>
/// <param name="punkState">
/// Pointer to user-defined state that will be returned with the
/// sample in the call to pCallback->Invoke.
/// </param>
/// <remarks>
/// <para>
/// Many archive Media Sinks have steps they need to do at
/// the end of archiving to finish up the file, such as updating
/// the header (for some formats) or flushing all pending writes
/// to disk. In some cases, this may include expensive operations
/// (such as indexing the content).
/// this is an asynchronous way to do this.
/// </para>
/// <para>
/// Making this call is optional
/// </para>
/// </remarks>
HRESULT BeginFinalize(
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState
);
/// <summary>
/// EndFinalize should be called when the async callback
/// given to BeginFinalize is invoked.
/// </summary>
/// <param name="pResult">
/// Pointer to the Asynchronous Result which was passed into the
/// IMFAsyncCallbackInvoke on the user's Asynchronous Callback object.
/// Should not be NULL.
/// </param>
HRESULT EndFinalize(
[in] IMFAsyncResult* pResult
);
}
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(9db7aa41-3cc5-40d4-8509-555804ad34cc)
]
/// <summary>
/// IMFStreamingSinkConfig is optionally supported by Media Sinks.
/// The interface is used for passing configuration information to
/// Media Sinks that are used for streaming.
/// </summary>
interface IMFStreamingSinkConfig : IUnknown
{
/// <summary>
/// StartStreaming should be called before the Media Session
/// is started.
/// </summary>
/// <param name="fSeekOffsetIsByteOffset">
/// If TRUE, qwSeekOffset is the byte position specified by the
/// streaming media client. If FALSE, qwSeekOffset is the time
/// position, in hundreds of nanoseconds, which was specified by
/// the streaming media client.
/// </param>
/// <param name="qwSeekOffset">
/// Either a byte offset or a time offset, depending on the value
/// of fSeekOffsetIsByteOffset. Time offsets are specified in
/// hundreds of nanoseconds.
/// </param>
HRESULT StartStreaming(
[in] BOOL fSeekOffsetIsByteOffset,
[in] QWORD qwSeekOffset
);
};
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation playback quality
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Media Foundation interfaces for use with advanced content protection
// scenarios
//
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/// <summary>
/// when pipeline runs source in the remote process, pipeline creates a special proxy objects in the application
/// process for source and sequencer. All proxy objects should implement the IMFRemoteProxy interface in order for
/// pipeline to access remote object and proxy host.
/// </summary>
[
object,
uuid( 994e23ad-1cc2-493c-b9fa-46f1cb040fa4 ),
local,
]
interface IMFRemoteProxy : IUnknown
{
HRESULT GetRemoteObject(
[in] REFIID riid,
[out, iid_is(riid), annotation("__out")] void ** ppv);
HRESULT GetRemoteHost(
[in] REFIID riid,
[out, iid_is(riid), annotation("__out")] void ** ppv);
}
// Component should expose MF_REMOTE_PROXY service if it works as a proxy for remote component
cpp_quote( "EXTERN_GUID( MF_REMOTE_PROXY, 0x2f00c90e, 0xd2cf, 0x4278, 0x8b, 0x6a, 0xd0, 0x77, 0xfa, 0xc3, 0xa2, 0x5f);" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(09EF5BE3-C8A7-469e-8B70-73BF25BB193F),
local
]
/// <summary>
/// Provide a way for activate to marshal interface across process.
/// If the activate can't be created in the remote process, the platform will know how to unmarshal the interface for the activate
/// </summary>
interface IMFObjectReferenceStream : IUnknown
{
HRESULT SaveReference(
[in] REFIID riid,
[in] IUnknown * pUnk);
HRESULT LoadReference(
[in] REFIID riid,
[out] void ** ppv);
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(F70CA1A9-FDC7-4782-B994-ADFFB1C98606),
]
/// <summary>
/// IMFPMPHost supply the methods for creating object in the PMP process
/// </summary>
interface IMFPMPHost: IUnknown
{
/// <summary>
/// Locks process from shutdown. If lock count is not 0, process will wait for 3 sec before terminating after shutdown
/// </summary>
HRESULT LockProcess();
/// <summary>
/// Unlocks process from shutdown
/// </summary>
HRESULT UnlockProcess();
/// <summary>
/// Creates object in pmp process by clsid
/// </summary>
/// <param name="pStream">
/// Optional pointer to serialized object.
/// If pointer is provided, pmp host will QI object for IPersistStream interface and call IPersistStream::Load
/// </param>
[local]
HRESULT CreateObjectByCLSID(
[in] REFCLSID clsid,
[in, unique] IStream * pStream,
[in] REFIID riid,
[out, iid_is(riid)] void ** ppv);
[call_as(CreateObjectByCLSID)]
HRESULT RemoteCreateObjectByCLSID(
[in] REFCLSID clsid,
[in, unique, size_is(cbData)] BYTE * pbData,
[in] DWORD cbData,
[in] REFIID riid,
[out, iid_is(riid)] void ** ppv);
}
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
//
// MF_PMP_SERVICE is the service GUID for
// obtaining IMFPMPHost
//
cpp_quote( "EXTERN_C const GUID MF_PMP_SERVICE;" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
[
object,
uuid(6C4E655D-EAD8-4421-B6B9-54DCDBBDF820),
local,
]
/// <summary>
/// IMFPMPClient is the interface implemented by components (usualy sources)
/// which need access to IMFPMPHost
/// </summary>
interface IMFPMPClient: IUnknown
{
/// <summary>
/// Initialize the component with IMFPMPHost.
/// </summary>
HRESULT SetPMPHost(
[in] IMFPMPHost * pPMPHost
);
}
[
object,
uuid( 994e23af-1cc2-493c-b9fa-46f1cb040fa4 ),
]
/// <summary>
/// The IMFPMPServer interface is an internal interface used to communicate between PMPSession and PMPHost objects
/// It provides methods to create and setup objects in PMP process.
/// </summary>
interface IMFPMPServer : IUnknown
{
/// <summary>
/// Locks process from shutdown. If lock count is not 0, process will wait for 3 sec before terminating after shutdown
/// </summary>
HRESULT LockProcess();
/// <summary>
/// Unlocks process from shutdown
/// </summary>
HRESULT UnlockProcess();
/// <summary>
/// Creates object in the PMP process.
/// </summary>
HRESULT CreateObjectByCLSID(
[in] REFCLSID clsid,
[in] REFIID riid,
[out, iid_is(riid)] void ** ppObject);
};
cpp_quote( "STDAPI MFCreatePMPServer(" )
cpp_quote( " DWORD dwCreationFlags," )
cpp_quote( " __out IMFPMPServer** ppPMPServer" )
cpp_quote( " );" )
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid( 1cde6309-cae0-4940-907e-c1ec9c3d1d4a ),
local,
]
/// <summary>
/// The IMFRemoteDesktopPlugin interface is expose by remote desktop plugin
/// Application should create remote desktop plugin and call it for every partial topology
/// </summary>
interface IMFRemoteDesktopPlugin : IUnknown
{
/// <summary>
/// Called by application to update topology
/// </summary>
HRESULT UpdateTopology(
[in, out] IMFTopology * pTopology);
}
/// <summary>
/// Creates party remote manager
/// </summary>
cpp_quote( "STDAPI MFCreateRemoteDesktopPlugin(")
cpp_quote( " __out IMFRemoteDesktopPlugin** ppPlugin );" )
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// CreateNamedPropertyStore
//
cpp_quote( "EXTERN_C HRESULT STDAPICALLTYPE CreateNamedPropertyStore(" )
cpp_quote( " __out INamedPropertyStore **ppStore" )
cpp_quote( " );" )
cpp_quote( "" )
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// SAMI interfaces and GUIDS
//
/// <summary>
/// Used to retrieve and set SAMI styles on the MF SAMI Media Source.
/// </summary>
[
object,
uuid(A7E025DD-5303-4a62-89D6-E747E1EFAC73),
local
]
interface IMFSAMIStyle: IUnknown
{
/// <summary>
/// Gets the total number of styles
/// </summary>
HRESULT GetStyleCount( [out, annotation("__out")] DWORD * pdwCount );
/// <summary>
/// Gets all of the styles as a string array in a PROPVARIANT.
/// The caller must properly clear the PROPVARIANT to avoid memory leaks.
/// </summary>
HRESULT GetStyles( [out, annotation("__out")] PROPVARIANT* pPropVarStyleArray );
/// <summary>
/// Sets the current selected style to the provided style.
/// </summary>
HRESULT SetSelectedStyle( [in, annotation("__in")] LPCWSTR pwszStyle );
/// <summary>
/// Gets the currently selected style.
/// The returned string must be deallocated using CoTaskMemFree().
/// </summary>
HRESULT GetSelectedStyle( [out, annotation("__deref_out") ] LPWSTR * ppwszStyle );
}
// MF_SAMI_SERVICE
// This is the "service" GUID that is used to obtain the IMFSAMIStyle interface from the
// MF SAMI source from via a GetService() call from another component. (e.g., The Media Session )
// {49A89AE7-B4D9-4ef2-AA5C-F65A3E05AE4E}
//
cpp_quote( "EXTERN_GUID( MF_SAMI_SERVICE, 0x49a89ae7, 0xb4d9, 0x4ef2, 0xaa, 0x5c, 0xf6, 0x5a, 0x3e, 0x5, 0xae, 0x4e );" )
//
// MF_PD_SAMI_STYLELIST
// Data type: BLOB
// This "Presentation Descriptor Style List" attribute contains the friendly name of the supported styles
// of the currently opened file. This attribute is present on the Presentation Descriptor that the MF SAMI source provides.
// The form of the blob is as follows:
//
// [ DWORD: number of style strings ]
// [ DWORD: number of bytes in string #1 including NULL char ]
// [ wide string #1 including NULL char ]
// [ DWORD: number of bytes in string #2 including NULL char ]
// [ wide string #2 including NULL char ]
// [ DWORD: number of bytes in string #3 including NULL char ]
// [ wide string #3 including NULL char ]
//
// {E0B73C7F-486D-484e-9872-4DE5192A7BF8}
cpp_quote( "EXTERN_GUID( MF_PD_SAMI_STYLELIST, 0xe0b73c7f, 0x486d, 0x484e, 0x98, 0x72, 0x4d, 0xe5, 0x19, 0x2a, 0x7b, 0xf8 );" )
//
// MF_SD_SAMI_LANGUAGE
// Data Type: LPWSTR
// This attribute contains the SAMI language name defined for the stream.
// This attribute is present in the Stream Descriptors returned from the MF SAMI Source.
// The SAMI language name is specified in the SAMI file.
// {36FCB98A-6CD0-44cb-ACB9-A8F5600DD0BB}
//
cpp_quote( "EXTERN_GUID( MF_SD_SAMI_LANGUAGE, 0x36fcb98a, 0x6cd0, 0x44cb, 0xac, 0xb9, 0xa8, 0xf5, 0x60, 0xd, 0xd0, 0xbb );" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
////////////////////////////////////////////////////////////////////////////
//
// TRANSFORM FUNCTIONS
//
/// <summary>
/// Creates a sample copier MFT. This MFT is typically used to copy non-D3D
/// samples into D3D samples provided by the EVR.
/// </summary>
/// <param name="ppCopierMFT">
/// Specifies a pointer to a variable where the sample copier transform
/// will be stored.
/// </param>
cpp_quote("STDAPI MFCreateSampleCopierMFT(__deref_out IMFTransform** ppCopierMFT);")
//////////////////////////////////////////////////////////////////////////////
//
// Transcode APIs
//
/////////////////////////////////////////////////////////////////////////////
[
object,
uuid(4ADFDBA3-7AB0-4953-A62B-461E7FF3DA1E),
local
]
/// <summary>
/// IMFTranscodeProfile is for setting transcode configurations
/// that user perfers for the transcoded output media file.
/// </summary>
interface IMFTranscodeProfile : IUnknown
{
/// <summary>
/// SetAudioAttributes is used to specify the audio stream settings.
/// These attributes are the ones defined by MF audio media type.
/// </summary>
/// <param name="pAttrs">
/// A pointer to an IMFAttributes object having the audio stream settings.
/// </param>
HRESULT SetAudioAttributes( [in, annotation("__in_opt")] IMFAttributes* pAttrs );
/// <summary>
/// GetAudioAttributes is used to get the audio stream settings.
/// </summary>
/// <param name="ppAttrs">
/// Specifies a pointer to a variable where IMFAttributes object stored.
/// If no audio attributes have been set,
/// GetAudioAttributes expected to succeed and return NULL.
/// </param>
HRESULT GetAudioAttributes( [out, annotation("__deref_out_opt")] IMFAttributes** ppAttrs );
/// <summary>
/// SetVideoAttributes is used to specify the video stream settings.
/// These attributes are the ones defined by MF video media type.
/// </summary>
/// <param name="pAttrs">
/// A pointer to an IMFAttributes object having the video stream settings.
/// If no video attributes have been set,
/// GetVideoAttributes expected to succeed and return NULL.
/// </param>
HRESULT SetVideoAttributes( [in, annotation("__in_opt")] IMFAttributes* pAttrs );
/// <summary>
/// GetVideoAttributes is used to get the video stream settings.
/// </summary>
/// <param name="ppAttrs">
/// Specifies a pointer to a variable where IMFAttributes object stored.
/// </param>
HRESULT GetVideoAttributes( [out, annotation("__deref_out_opt")] IMFAttributes** ppAttrs );
/// <summary>
/// SetContainerAttributes is used to specify the container settings.
/// These attributes are defined by transcode APIs.
/// </summary>
/// <param name="pAttrs">
/// A pointer to an IMFAttributes object having the container settings.
/// </param>
HRESULT SetContainerAttributes( [in, annotation("__in_opt")] IMFAttributes* pAttrs );
/// <summary>
/// GetContainerAttributes is used to get the container settings.
/// </summary>
/// <param name="ppAttrs">
/// Specifies a pointer to a variable where IMFAttributes object stored.
/// If no container attributes have been set,
/// GetContainerAttributes expected to succeed and return NULL.
/// </param>
HRESULT GetContainerAttributes( [out, annotation("__deref_out_opt")] IMFAttributes** ppAttrs );
};
/////////////////////////////////////////////////////////////////////////////
// Transcode attribute guids
//
// Container attrributes
// They include
// 1. The following attributes
// 2. MFT_FIELDOFUSE_UNLOCK_Attribute
//
// MF_TRANSCODE_CONTAINERTYPE
// DataType: GUID(one of the transcode supported container types)
// Only support the pre-defined container attributes
// {150FF23F-4ABC-478b-AC4F-E1916FBA1CCA}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_CONTAINERTYPE, 0x150ff23f, 0x4abc, 0x478b, 0xac, 0x4f, 0xe1, 0x91, 0x6f, 0xba, 0x1c, 0xca );" )
// MFTranscodeContainerType_ASF
// represents MF built-in ASF container
// {430F6F6E-B6BF-4fc1-A0BD-9EE46EEE2AFB}
cpp_quote( "EXTERN_GUID( MFTranscodeContainerType_ASF, 0x430f6f6e, 0xb6bf, 0x4fc1, 0xa0, 0xbd, 0x9e, 0xe4, 0x6e, 0xee, 0x2a, 0xfb );" )
// MFTranscodeContainerType_MPEG4
// represents MF built-in MPEG4 container
// {DC6CD05D-B9D0-40ef-BD35-FA622C1AB28A}
cpp_quote( "EXTERN_GUID( MFTranscodeContainerType_MPEG4, 0xdc6cd05d, 0xb9d0, 0x40ef, 0xbd, 0x35, 0xfa, 0x62, 0x2c, 0x1a, 0xb2, 0x8a );" )
// MFTranscodeContainerType_MP3
// represents MF built-in MP3 container
// {E438B912-83F1-4de6-9E3A-9FFBC6DD24D1}
cpp_quote( "EXTERN_GUID( MFTranscodeContainerType_MP3, 0xe438b912, 0x83f1, 0x4de6, 0x9e, 0x3a, 0x9f, 0xfb, 0xc6, 0xdd, 0x24, 0xd1 );" )
// MFTranscodeContainerType_3GP
// represents MF built-in 3GP container
// {34c50167-4472-4f34-9ea0-c49fbacf037d }
cpp_quote( "EXTERN_GUID( MFTranscodeContainerType_3GP, 0x34c50167, 0x4472, 0x4f34, 0x9e, 0xa0, 0xc4, 0x9f, 0xba, 0xcf, 0x03, 0x7d );" )
// MF_TRANSCODE_SKIP_METADATA_TRANSFER
// DataType: UINT32(0:auto transfer, 1:don't transfer)
// {4E4469EF-B571-4959-8F83-3DCFBA33A393}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_SKIP_METADATA_TRANSFER, 0x4e4469ef, 0xb571, 0x4959, 0x8f, 0x83, 0x3d, 0xcf, 0xba, 0x33, 0xa3, 0x93 );" )
// MF_TRANSCODE_TOPOLOGYMODE
// DataType: UINT32(By default, software-only with a encoder MFT)
// {3E3DF610-394A-40b2-9DEA-3BAB650BEBF2}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_TOPOLOGYMODE, 0x3e3df610, 0x394a, 0x40b2, 0x9d, 0xea, 0x3b, 0xab, 0x65, 0xb, 0xeb, 0xf2 );" )
typedef enum _MF_TRANSCODE_TOPOLOGYMODE_FLAGS
{
// Only software MFTs inserted into a trancode topology, by default
MF_TRANSCODE_TOPOLOGYMODE_SOFTWARE_ONLY = 0,
// Allow hardware MFTs inserted into a trancode topology
MF_TRANSCODE_TOPOLOGYMODE_HARDWARE_ALLOWED = 1
// Reserved for future use
} MF_TRANSCODE_TOPOLOGYMODE_FLAGS;
// MF_TRANSCODE_ADJUST_PROFILE
// DataType: UINT32
// {3E3DF610-394A-40b2-9DEA-3BAB650BEBF2}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_ADJUST_PROFILE, 0x9c37c21b, 0x60f, 0x487c, 0xa6, 0x90, 0x80, 0xd7, 0xf5, 0xd, 0x1c, 0x72 );" )
typedef enum _MF_TRANSCODE_ADJUST_PROFILE_FLAGS
{
// Only adjust the frame rate/interlace mode if needed, by default
MF_TRANSCODE_ADJUST_PROFILE_DEFAULT = 0,
// Fill the missing media type attributes by the source media type. It does not overwrite the already set stream-level attributes.
MF_TRANSCODE_ADJUST_PROFILE_USE_SOURCE_ATTRIBUTES = 1
// Reserved for future use
} MF_TRANSCODE_ADJUST_PROFILE_FLAGS;
//
// Audio/video stream attributes
// They include
// 1. Audio/video MT attributes(refer to mfapi.h for all the MT attributes)
// 2. Audio/video encoder specific properties, some of them got from codecapi.h
//
// MF_TRANSCODE_ENCODINGPROFILE
// DataType: LPCWSTR(one of the device conformance profile strings got from the device capability)
// This attribute is only used if the transcoded file is targeted for a WM-capable device
// For video,
// - "AP" advanced profile
// - "MP" main profile
// - "SP" simple profile
// {6947787C-F508-4ea9-B1E9-A1FE3A49FBC9}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_ENCODINGPROFILE, 0x6947787c, 0xf508, 0x4ea9, 0xb1, 0xe9, 0xa1, 0xfe, 0x3a, 0x49, 0xfb, 0xc9 );" )
// MF_TRANSCODE_QUALITYVSSPEED
// DataType: UINT32 (from 0~100, 0=lowest quality, highest speed, 100=highest quality, lowest speed)
// Same guid as STATIC_CODECAPI_AVEncCommonQualityVsSpeed
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_QUALITYVSSPEED, 0x98332df8, 0x03cd, 0x476b, 0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f );" )
// MF_TRANSCODE_DONOT_INSERT_ENCODER
// DataType: UINT32(0:insert encoder in the partial topology, 1:don't insert encoder in the partial topology)
// By default, encoder is inserted.
// {F45AA7CE-AB24-4012-A11B-DC8220201410}
cpp_quote( "EXTERN_GUID( MF_TRANSCODE_DONOT_INSERT_ENCODER, 0xf45aa7ce, 0xab24, 0x4012, 0xa1, 0x1b, 0xdc, 0x82, 0x20, 0x20, 0x14, 0x10 );" )
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Creates a transcode profile to store user perfers audio and video settings.
/// </summary>
/// <param name="ppTranscodeProfile">
/// Specifies a pointer to a variable where the transcode profile
/// will be stored.
/// </param>
cpp_quote( "STDAPI MFCreateTranscodeProfile(" )
cpp_quote( " __out IMFTranscodeProfile** ppTranscodeProfile" )
cpp_quote( " );" )
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Creates a partial transcode topology. The partial topology has a
/// source object, encoder object and sink object. The encoder object and sink object
// has been configured properly.
/// </summary>
/// <param name="pSrc">
/// A pointer to an IMFMediaSource object.
/// </param>
/// <param name="pwszOutputFilePath">
/// Specifies a output file path.
/// </param>
/// <param name="pProfile">
/// Specifies a pointer to an IMFTranscodeProfile object.
/// It has the user preferred output configurations.
/// </param>
/// <param name="ppTranscodeTopo">
/// Specifies a pointer to a variable where the partial transcode topology
/// will be stored.
/// </param>
cpp_quote( "STDAPI MFCreateTranscodeTopology(" )
cpp_quote( " __in IMFMediaSource* pSrc," )
cpp_quote( " __in LPCWSTR pwszOutputFilePath," )
cpp_quote( " __in IMFTranscodeProfile* pProfile," )
cpp_quote( " __out IMFTopology** ppTranscodeTopo" )
cpp_quote( " );" )
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Get the available output types from an audio encoder.
/// </summary>
/// <param name="guidSubType">
/// Specifies the sub type of the preferred media type
/// </param>
/// <param name="dwMFTFlags">
/// Specifies which category the preferred audio encoder is, for example, HW or SW.
/// </param>
/// <param name="pCodecConfig">
/// Specifies the specific encoder configurations, which needs to be set before getting the preferred output media types.
/// </param>
/// <param name="ppAvailableTypes">
/// Specifies a pointer to a variable to a list of the available output types.
/// </param>
cpp_quote( "STDAPI MFTranscodeGetAudioOutputAvailableTypes(" )
cpp_quote( " __in REFGUID guidSubType," )
cpp_quote( " __in DWORD dwMFTFlags," )
cpp_quote( " __in_opt IMFAttributes* pCodecConfig, ")
cpp_quote( " __out IMFCollection** ppAvailableTypes );" )
//////////////////////////////////////////////////////////////////////////////
typedef struct _MF_TRANSCODE_SINK_INFO {
DWORD dwVideoStreamID;
IMFMediaType* pVideoMediaType;
DWORD dwAudioStreamID;
IMFMediaType* pAudioMediaType;
} MF_TRANSCODE_SINK_INFO;
[
object,
uuid(8CFFCD2E-5A03-4a3a-AFF7-EDCD107C620E),
local
]
interface IMFTranscodeSinkInfoProvider : IUnknown
{
HRESULT SetOutputFile( [in, annotation("__in")] LPCWSTR pwszFileName );
HRESULT SetOutputByteStream( [in, annotation("__in")] IMFActivate* pByteStreamActivate );
HRESULT SetProfile( [in, annotation("__in")] IMFTranscodeProfile* pProfile );
HRESULT GetSinkInfo( [out, annotation("__out")] MF_TRANSCODE_SINK_INFO* pSinkInfo );
};
//////////////////////////////////////////////////////////////////////////////
///
/// <summary>
/// Create a generic transcode sink activate for out-of-proc topology
/// </summary>
/// <param name="ppActivate">
/// Receive pointer for a transcode sink activate.
/// </param>
cpp_quote(" STDAPI MFCreateTranscodeSinkActivate( ")
cpp_quote(" __out IMFActivate** ppActivate ); ")
//////////////////////////////////////////////////////////////////////////////
//
// Field-of-use API
//
/////////////////////////////////////////////////////////////////////////////
[
object,
uuid(508E71D3-EC66-4fc3-8775-B4B9ED6BA847),
]
/// <summary>
/// IMFFieldOfUseMFTUnlock manages the unlocking process on behalf of the application
/// </summary>
/// <remarks>
/// Restricted MFTs need to be unlocked at creation time, otherwise both the type negociation
/// and data processing will fail with error codes MF_E_UNAUTHORIZED.
/// </remarks>
interface IMFFieldOfUseMFTUnlock : IUnknown
{
/// <summary>
/// Unlock manages the unlocking process on behalf of the application.
/// </summary>
/// <param name="pUnkMFT">
/// Points to the IUnknown interface of the MFT to unlock.
/// </param>
/// <returns>
/// The return value is S_OK if the MFT has been successfully unlocked, and an error code otherwise.
/// </returns>
HRESULT Unlock(
[in] IUnknown *pUnkMFT
);
}
typedef struct _MFT_REGISTRATION_INFO
{
CLSID clsid;
GUID guidCategory;
UINT32 uiFlags;
LPCWSTR pszName;
DWORD cInTypes;
[size_is(cInTypes)] MFT_REGISTER_TYPE_INFO* pInTypes;
DWORD cOutTypes;
[size_is(cOutTypes)] MFT_REGISTER_TYPE_INFO* pOutTypes;
} MFT_REGISTRATION_INFO;
/* ddf5cf9c-4506-45aa-abf0-6d5d94dd1b4a */
cpp_quote( "EXTERN_GUID(MF_LOCAL_MFT_REGISTRATION_SERVICE, 0xddf5cf9c, 0x4506, 0x45aa, 0xab, 0xf0, 0x6d, 0x5d, 0x94, 0xdd, 0x1b, 0x4a);" )
[
object,
uuid(149c4d73-b4be-4f8d-8b87-079e926b6add),
]
/// <summary>
/// IMFLocalMFTRegistration is a service interface exposed by the session. Using this
/// service, applications can register an MFT locally for its own use. If the session
/// is running cross-process, the registration will be remoted into the remote process.
/// </summary>
interface IMFLocalMFTRegistration : IUnknown
{
/// <summary>
/// Call RegisterMFTs to locally register a set of MFTs defined by an array
/// of MFT_REGISTRATION_INFO structures.
/// </summary>
/// <param name="pMFTs">
/// Points to an array of MFT_REGISTRATION_INFO structures. The MFTs defined
/// by these structures will be registered locally.
/// </param>
/// <param name="cMFTs">
/// Defines how many MFT_REGISTRATION_INFO structures are pointed to by pMFTs.
/// </param>
/// <returns>
/// S_OK on sucessful registration. An error code may be returned if there is
/// a problem remoting the registrations into the remote process.
/// </returns>
HRESULT RegisterMFTs([in, size_is(cMFTs)] MFT_REGISTRATION_INFO* pMFTs, DWORD cMFTs);
}
/////////////////////////////////////////////////////////////////////////////
cpp_quote( "STDAPI MFCreateMFByteStreamOnStream(" )
cpp_quote( " IStream* pStream," )
cpp_quote( " __out IMFByteStream** ppByteStream);" )
/////////////////////////////////////////////////////////////////////////////
// Scheme and Bytestream handler CLSIDs
// {9EC4B4F9-3029-45ad-947B-344DE2A249E2}
cpp_quote( "EXTERN_GUID(CLSID_UrlmonSchemePlugin, 0x9ec4b4f9, 0x3029, 0x45ad, 0x94, 0x7b, 0x34, 0x4d, 0xe2, 0xa2, 0x49, 0xe2);" )
//////////////////////////////////////////////////////////////////////////////
//
// Capture (device) source APIs
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Enumerates Media Foundation Capture Sources
/// </summary>
/// <param name="pAttributes">
/// Attribute store for enumeration (containing source type GUID, etc)
/// </param>
/// <param name="pppSourceActivate">
/// Array of IMFActivate pointers
/// Each pointer must be released and the array freed with CoTaskMemFree
/// </param>
/// <param name="pcSourceActivate">
/// Number of pointers in the pppSourceActivate array
/// </param>
cpp_quote( "STDAPI MFEnumDeviceSources(" )
cpp_quote( " __in IMFAttributes* pAttributes," )
cpp_quote( " __deref_out_ecount(*pcSourceActivate) IMFActivate*** pppSourceActivate," )
cpp_quote( " __out UINT32* pcSourceActivate" )
cpp_quote( ");" )
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Creates a Media Foundation Device Source
/// </summary>
/// <param name="pAttributes">
/// Device Source creation attributes
/// </param>
/// <param name="ppSource">
/// Returns pointer to a Device Source
/// </param>
cpp_quote( "STDAPI MFCreateDeviceSource(" )
cpp_quote( " __in IMFAttributes* pAttributes," )
cpp_quote( " __out IMFMediaSource** ppSource" )
cpp_quote( ");" )
/////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Creates a Media Foundation Device Source Activate
/// </summary>
/// <param name="pAttributes">
/// Device Source creation attributes
/// </param>
/// <param name="ppActivate">
/// Returns pointer to a Device Source Activate
/// </param>
cpp_quote( "STDAPI MFCreateDeviceSourceActivate( " )
cpp_quote( " __in IMFAttributes* pAttributes," )
cpp_quote( " __out IMFActivate** ppActivate" )
cpp_quote( ");" )
/////////////////////////////////////////////////////////////////////////////
//
// Capture source attributes
//
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE
// Data type: GUID
// Media Source type GUID (e.g. MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID )
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 0xc60ac5fe, 0x252a, 0x478f, 0xa0, 0xef, 0xbc, 0x8f, 0xa5, 0xf7, 0xca, 0xd3);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_HW_SOURCE
// Data type: UINT32
// If this attribute is TRUE, this is a hardware capture source, otherwise it's a software source
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_HW_SOURCE, 0xde7046ba, 0x54d6, 0x4487, 0xa2, 0xa4, 0xec, 0x7c, 0xd, 0x1b, 0xd1, 0x63);" )
// MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME
// Data type: STRING
// Friendly name of the video capture device
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, 0x60d0e559, 0x52f8, 0x4fa2, 0xbb, 0xce, 0xac, 0xdb, 0x34, 0xa8, 0xec, 0x1);" )
// MF_DEVSOURCE_ATTRIBUTE_MEDIA_TYPE
// Data type: BLOB
// Blob consisting of one MAJOR_TYPE GUID\MINOR_TYPE GUID pair
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_MEDIA_TYPE, 0x56a819ca, 0xc78, 0x4de4, 0xa0, 0xa7, 0x3d, 0xda, 0xba, 0xf, 0x24, 0xd4);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY
// Data type: GUID
// Capture source category (e.g. CLSID_VideoInputDeviceCategory)
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY, 0x77f0ae69, 0xc3bd, 0x4509, 0x94, 0x1d, 0x46, 0x7e, 0x4d, 0x24, 0x89, 0x9e);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK
// Data type: STRING
// Symbolic link for creating a video capture source
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, 0x58f0aad8, 0x22bf, 0x4f8a, 0xbb, 0x3d, 0xd2, 0xc4, 0x97, 0x8c, 0x6e, 0x2f);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_MAX_BUFFERS
// Data type: UINT32
// Maximum # of sample that the video capture source will buffer
// {7DD9B730-4F2D-41d5-8F95-0CC9A912BA26}
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_MAX_BUFFERS, 0x7dd9b730, 0x4f2d, 0x41d5, 0x8f, 0x95, 0xc, 0xc9, 0xa9, 0x12, 0xba, 0x26);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID
// Data type: STRING
// Device endpoint ID for creating an audio capture source
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID, 0x30da9258, 0xfeb9, 0x47a7, 0xa4, 0x53, 0x76, 0x3a, 0x7a, 0x8e, 0x1c, 0x5f);" )
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ROLE
// Data type: UINT32
// Device role (ERole) for creating an audio capture source
cpp_quote( "EXTERN_GUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ROLE, 0xbc9d118e, 0x8c67, 0x4a18, 0x85, 0xd4, 0x12, 0xd3, 0x0, 0x40, 0x5, 0x52);" )
/////////////////////////////////////////////////////////////////////////////
//
// Device Source Type GUIDs
//
// {14DD9A1C-7CFF-41be-B1B9-BA1AC6ECB571}...MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
cpp_quote( "EXTERN_GUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID, 0x14dd9a1c, 0x7cff, 0x41be, 0xb1, 0xb9, 0xba, 0x1a, 0xc6, 0xec, 0xb5, 0x71);")
// {8AC3587A-4AE7-42D8-99E0-0A6013EEF90F}...MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
cpp_quote( "EXTERN_GUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID, 0x8ac3587a, 0x4ae7, 0x42d8, 0x99, 0xe0, 0x0a, 0x60, 0x13, 0xee, 0xf9, 0x0f);")
/////////////////////////////////////////////////////////////////////////////
//
// MFSample DevSource-specific attribute GUIDs
//
// {8F3E35E7-2DCD-4887-8622-2A58BAA652B0} MFSampleExtension_DeviceTimestamp
// Type: UINT64
// Stores the original device timestamp prior to QPC correlation and conversion to stream time.
cpp_quote( "EXTERN_GUID(MFSampleExtension_DeviceTimestamp, 0x8f3e35e7, 0x2dcd, 0x4887, 0x86, 0x22, 0x2a, 0x58, 0xba, 0xa6, 0x52, 0xb0);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")