xpmgr/BuildTools/Include/Mfobjects.idl

4037 lines
146 KiB
Plaintext

//*@@@+++@@@@******************************************************************
//
// Microsoft Windows Media Foundation
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//*@@@---@@@@******************************************************************
//
import "unknwn.idl";
import "propsys.idl";
import "mediaobj.idl";
#ifndef __QWORD_DEFINED
#define __QWORD_DEFINED
typedef ULONGLONG QWORD;
#endif // __QWORD_DEFINED
//
// This line enforces non-idl files to include the standard definition of
// WAVEFORMATEX as opposed to the below definition.
// Without this line every non-idl file would have to explicitly include mmreg.h
//
cpp_quote( "#include <mmreg.h>" )
//
// Include this for marshallable definition of WAVEFORMATEX
//
#include <mmreg.h>
////////////////////////////////////////////////////////////////////////////////
//
// Media Foundation primitive interfaces
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// Attributes
//
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
typedef enum _MF_ATTRIBUTE_TYPE {
MF_ATTRIBUTE_UINT32 = VT_UI4,
MF_ATTRIBUTE_UINT64 = VT_UI8,
MF_ATTRIBUTE_DOUBLE = VT_R8,
MF_ATTRIBUTE_GUID = VT_CLSID,
MF_ATTRIBUTE_STRING = VT_LPWSTR,
MF_ATTRIBUTE_BLOB = VT_VECTOR | VT_UI1,
MF_ATTRIBUTE_IUNKNOWN = VT_UNKNOWN
} MF_ATTRIBUTE_TYPE;
typedef enum _MF_ATTRIBUTES_MATCH_TYPE {
MF_ATTRIBUTES_MATCH_OUR_ITEMS = 0, // do all of our items exist in their store and have identical data?
MF_ATTRIBUTES_MATCH_THEIR_ITEMS = 1, // do all of their items exist in our store and have identical data?
MF_ATTRIBUTES_MATCH_ALL_ITEMS = 2, // do both stores have the same set of identical items?
MF_ATTRIBUTES_MATCH_INTERSECTION = 3, // do the attributes that intersect match?
MF_ATTRIBUTES_MATCH_SMALLER = 4, // do all the attributes in the type that has fewer attributes match?
} MF_ATTRIBUTES_MATCH_TYPE;
[
object,
uuid(2cd2d921-c447-44a7-a13c-4adabfc247e3)
]
/// <summary>
/// The IMFAttributes interface is a general-purpose interface for storing
/// key/value pairs, where the key is a GUID and the value is one of a
/// small number of common data types, including UINT32, UINT64, double,
/// GUID, Unicode string, and BLOB (counted array of UINT8). In addition
/// to the methods inherited from IUnknown, the IMFAttributes interface
/// exposes the following methods.
/// </summary>
/// <remarks>
/// <para>
/// The LockStore and UnlockStore calls may not be nested, and may not
/// be called from different threads.
/// </para>
/// </remarks>
interface IMFAttributes : IUnknown
{
/// <summary>
/// GetItem returns a value from the attributes store that corresponds
/// to the given key (a GUID).
/// </summary>
/// <param name="guidKey">
/// Key corresponding to value to search for
/// </param>
/// <param name="pValue">
/// A PROPVARIANT structure provided by the caller. It is filled in with
/// a copy of the stored value, if the value is found. The PROPVARIANT
/// must be cleared with PropVariantClear when the caller is done with
/// the value. If pValue is NULL, the method will still return S_OK if
/// the key is found, but the value will not be returned.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The key exists (and the value was copied into the
/// PROPVARIANT structure, if provided).
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetItem(
REFGUID guidKey,
[in, out, ptr] PROPVARIANT* pValue // can be NULL to check for existence - must use PropVariantClear to free
);
/// <summary>
/// GetItemType returns the type of a value from the attributes store
/// that corresponds to the given key (a GUID).
/// </summary>
/// <param name="guidKey">
/// Key corresponding to value to search for
/// </param>
/// <param name="pType">
/// Pointer to an MF_ATTRIBUTE_TYPE value. It is filled in with a copy
/// of the type of the stored value, if the value is found.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The key exists, and the value of pType signifies the type of
/// the item value.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetItemType(
REFGUID guidKey,
[out] MF_ATTRIBUTE_TYPE* pType
);
/// <summary>
/// CompareItem checks whether the given PROPVARIANT is equivalent to
/// one in store with the same key.
/// </summary>
/// <param name="guidKey">
/// Key corresponding to value to search for
/// </param>
/// <param name="Value">
/// Reference to a PROPVARIANT value to be compared.
/// </param>
/// <param name="pbResult">
/// BOOL value indicating whether an equivalent value was found with the
/// same key.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The key exists, and comparison was made. Check the value of
/// *pbResult to determine whether the values were equivalent.
/// </para>
/// <para>
/// </returns>
/// <remarks>
/// <para>
/// pbResult, if not NULL, will be set to FALSE in any case where
/// CompareItem returns a code other than S_OK. Additionally, of
/// course, it is set to FALSE in the case where the call is
/// successful, but the value is not found or not equivalent.
/// </para>
/// </remarks>
HRESULT CompareItem(
REFGUID guidKey,
REFPROPVARIANT Value,
[out] BOOL* pbResult
);
/// <summary>
/// Compare checks all of "our" items against "theirs", or "theirs"
/// against "ours," or both, according to the match type passed in by
/// the caller.
/// </summary>
/// <param name="pTheirs">
/// pointer to an IMFAttributes interface to compare items in.
/// </param>
/// <param name="MatchType">
/// Enumeration value indicating how to compare sets.
/// </param>
/// <param name="pbResult">
/// BOOL value indicating whether sets exhibit the desired level of
/// equivalency.
/// </param>
/// <remarks>
/// <para>
/// pbResult, if not NULL, will be set to FALSE in any case where
/// Compare returns a code other than S_OK. Additionally, of
/// course, it is set to FALSE in the case where the call is
/// successful, but the sets do not meet the equivalency condition.
/// </para>
/// </remarks>
/// <returns>
/// <para>
/// S_OK.
/// Sets were compared successfully. Check the value of
/// *pbResult to determine whether the sets met the desired
/// equivalency condition.
/// </para>
/// </returns>
HRESULT Compare(
IMFAttributes* pTheirs,
MF_ATTRIBUTES_MATCH_TYPE MatchType,
[out] BOOL* pbResult
);
/// <summary>
/// GetUINT32 retrieves a value of type UINT32 corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="punValue">
/// Value of the property, in a UINT32.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type UINT32.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetUINT32(
REFGUID guidKey,
[out] UINT32* punValue
);
/// <summary>
/// GetUINT64 retrieves a value of type UINT64 corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="punValue">
/// Value of the property, in a UINT64.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type UINT64.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetUINT64(
REFGUID guidKey,
[out] UINT64* punValue
);
/// <summary>
/// GetDouble retrieves a value of type double corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="pfValue">
/// Value of the property, in a double.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type double.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetDouble(
REFGUID guidKey,
[out] double* pfValue
);
/// <summary>
/// GetGUID retrieve a value of type GUID corresponding to the given
/// key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="pguidValue">
/// Value of the property, in a GUID.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type GUID.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetGUID(
REFGUID guidKey,
[out] GUID* pguidValue
);
/// <summary>
/// GetStringLength retrieve the length of a string value corresponding
/// to the given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to check.
/// </param>
/// <param name="pcchLength">
/// Upon success, holds the length of the string, in characters, not
/// including the NULL terminator.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Value was found, but string length is too large to fit in a
/// UINT32 value.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type LPWSTR.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetStringLength(
REFGUID guidKey,
[out] UINT32* pcchLength
);
/// <summary>
/// GetString retrieves a string value corresponding to the given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="pwszValue">
/// Upon success, holds the retrieved LPWSTR value.
/// </param>
/// <param name="cchBufSize">
/// Specifies the size, in characters, of the buffer passed in the
/// pwszValue parameter. Note that this is the size of the entire
/// buffer, not string length, so no further space for NULL
/// termination will be assumed.
/// </param>
/// <param name="pcchLength">
/// Upon success, contains the length, in characters, of the string in the
/// pwszValue parameter, excluding NULL termination. pcchLength may be
/// NULL if the length of the return string is not needed.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Value was found, but string length is too large to fit in a
/// UINT32 value.
/// </para>
/// <para>
/// HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER )
/// cchBufSize was not sufficiently large to hold the string
/// value with NULL terminator. In this case, *pcchLength will be
/// set to the length of the string value in chars. The caller
/// will need to allocate a buffer of size at least
/// *ppchLength + 1 chars and call the method again.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type LPWSTR.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetString(
REFGUID guidKey,
[out, size_is(cchBufSize)] LPWSTR pwszValue,
UINT32 cchBufSize,
[in, out, ptr] UINT32* pcchLength
);
/// <summary>
/// GetAllocatedString retrieves a string value corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="pwszValue">
/// Upon success, holds the retrieved LPWSTR value.
/// </param>
/// <param name="pcchLength">
/// Upon success, contains the size, in characters, of the string in the
/// pwszValue parameter, excluding NULL termination.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// insufficient memory was available to allocate *pwszValue.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type LPWSTR.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
/// <remarks>
/// Memory for the string returned from GetAllocatedString is allocated
/// by the callee using CoTaskMemAlloc. It is the responsibility of the
/// caller to free the memory via CoTaskMemFree.
/// </remarks>
HRESULT GetAllocatedString(
REFGUID guidKey,
[out, size_is( ,*pcchLength + 1)] LPWSTR* ppwszValue, // returned string must be deallocated with CoTaskMemFree
[out] UINT32* pcchLength
);
/// <summary>
/// GetBlobSize retrieves the size of a blob value corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to check.
/// </param>
/// <param name="pcbBlobSize">
/// Upon success, holds the size of the blob, in bytes.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type VT_BLOB.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetBlobSize(
REFGUID guidKey,
[out] UINT32* pcbBlobSize
);
/// <summary>
/// GetBlob retrieves the blob of data corresponding to the given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="pBuf">
/// A buffer supplied by the caller which will be filled with a copy of
/// the blob data from the attributes store.
/// </param>
/// <param name="cbBufSize">
/// Specifies the size, in bytes, of the data buffer.
/// </param>
/// <param name="pcbBlobSize">
/// Upon success, holds size, in bytes, of the data blob.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER )
/// cbBufSize was not sufficiently large to hold the data blob.
/// *pcbBlobSize contains the size, in bytes, necessary to copy
/// the data blob.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type VT_BLOB.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
HRESULT GetBlob(
REFGUID guidKey,
[out, size_is(cbBufSize)] UINT8* pBuf,
UINT32 cbBufSize,
[in, out, ptr] UINT32* pcbBlobSize
);
/// <summary>
/// GetAllocatedBlob retrieves a blob of data corresponding to the
/// given key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="ppBuf">
/// Upon success, holds the retrieved data blob.
/// </param>
/// <param name="pcbSize">
/// Upon success, contains the size, in bytes, of the buffer in the
/// ppBuf parameter.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// insufficient memory was available to allocate *ppBuf.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type VT_BLOB.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
/// <remarks>
/// Memory for the data blob returned from GetAllocatedBlob is allocated
/// by the callee using CoTaskMemAlloc. It is the responsibility of the
/// caller to free the memory via CoTaskMemFree.
/// </remarks>
HRESULT GetAllocatedBlob(
REFGUID guidKey,
[out, size_is( ,*pcbSize)] UINT8** ppBuf, // returned blob must be deallocated with CoTaskMemFree
[out] UINT32* pcbSize
);
/// <summary>
/// GetUnknown retrieves an interface pointer to the requested
// interface, in an LPVOID, from the value corresponding to the given
/// key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the value to retrieve.
/// </param>
/// <param name="riid">
///
/// <param name="ppv">
/// Value of the property, in an LPVOID. Returned value needs to be cast
/// to an interface pointer of the appropriate type.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was found and retrieved successfully.
/// </para>
/// <para>
/// MF_E_INVALIDTYPE
/// Value was found, but is not of type IUnknown.
/// </para>
/// <para>
/// E_NOINTERFACE
/// Value was found, but does not support the interface
/// specified by the riid parameter.
/// </para>
/// <para>
/// MF_E_ATTRIBUTENOTFOUND.
/// No value corresponding to this key is stored in this object.
/// </para>
/// </returns>
/// <remarks>
/// It is the responsibility of the caller to call Release on the
/// returned interface pointer when done with it.
/// </remarks>
HRESULT GetUnknown(
REFGUID guidKey,
REFIID riid,
[out, iid_is(riid)] LPVOID* ppv
);
/// <summary>
/// SetItem associates the given value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="Value">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// insufficient memory was available to create a new item.
/// </para>
/// </returns>
/// <remarks>
/// Use with caution. SetItem does not perform type-checking on the
/// PROPVARIANT Value, so it is easy to associate a key in one set
/// with a value of one type, and the same key in another set with a
/// value of a different type. This will lead to unexpected results
/// from item and set comparisons. SetItem will only allow values to be
/// set which are of a type corresponding to an MF_ATTRIBUTE_TYPE value,
/// i.e. VT_UI4 (UINT32), VT_UI8 (UINT64), VT_CLSID (GUID), VT_LPWSTR
/// (String), VT_VECTOR | VT_UI1 (Blob), and VT_UNKNOWN (IUnknown).
/// </remarks>
HRESULT SetItem(
REFGUID guidKey,
REFPROPVARIANT Value
);
/// <summary>
/// DeleteItem removes the value associated with the specified key from
/// the attribute set.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully removed.
/// </para>
/// </returns>
HRESULT DeleteItem(
REFGUID guidKey
);
/// <summary>
/// DeleteAllItems removes all values from the attribute set.
/// </summary>
/// <returns>
/// <para>
/// S_OK.
/// All values were successfully removed from the set.
/// </para>
/// </returns>
HRESULT DeleteAllItems();
/// <summary>
/// SetUINT32 associates the given UINT32 value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="unValue">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
HRESULT SetUINT32(
REFGUID guidKey,
UINT32 unValue
);
/// <summary>
/// SetUINT64 associates the given UINT64 value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="unValue">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
HRESULT SetUINT64(
REFGUID guidKey,
UINT64 unValue
);
/// <summary>
/// SetDouble associates the given double value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="fValue">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
HRESULT SetDouble(
REFGUID guidKey,
double fValue
);
/// <summary>
/// SetGUID associates the given GUID value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="guidValue">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
HRESULT SetGUID(
REFGUID guidKey,
REFGUID guidValue
);
/// <summary>
/// SetString associates the given LPWSTR value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="wszValue">
/// Value of the property. WszValue is presumed to be NULL-terminated.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
/// <remarks>
/// Callee will allocate a new buffer and copy the given string, rather
/// than storing a reference to the string passed in. Thus, caller is
/// responsible for freeing any memory which may have been allocated
/// for wszValue.
/// </remarks>
HRESULT SetString(
REFGUID guidKey,
[in, string] LPCWSTR wszValue
);
/// <summary>
/// SetBlob associates the given data blob value with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="pBuf">
/// Value of the property.
/// </param>
/// <param name="cbBufSize">
/// Size of the buffer specified by pBuf, in bytes.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
/// <remarks>
/// Callee will allocate a new buffer and copy the given data blob, rather
/// than storing a reference to the string passed in. Thus, caller is
/// responsible for freeing any memory which may have been allocated
/// for pBuf.
/// </remarks>
HRESULT SetBlob(
REFGUID guidKey,
[in, size_is(cbBufSize)] const UINT8* pBuf,
UINT32 cbBufSize
);
/// <summary>
/// SetUnknown associates the given IUnknown interface pointer value
/// with the specified key.
/// </summary>
/// <param name="guidKey">
/// GUID specifying the key.
/// </param>
/// <param name="pUnknown">
/// Value of the property.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// Value was successfully set.
/// </para>
/// <para>
/// E_OUTOFMEMORY
/// Insufficient memory was available to create a new item in
/// the store.
/// </para>
/// </returns>
HRESULT SetUnknown(
REFGUID guidKey,
[in] IUnknown* pUnknown
);
/// <summary>
/// LockStore excludes other threads from accessing the set, until such
/// time as UnlockStore is called.
/// </summary>
/// <returns>
/// <para>
/// S_OK.
/// Store was successfully locked.
/// </para>
/// </returns>
HRESULT LockStore();
/// <summary>
/// UnlockStore allows other threads access to the set, if they were
/// previously denied access via LockStore.
/// </summary>
/// <returns>
/// <para>
/// S_OK.
/// Store was successfully unlocked.
/// </para>
/// </returns>
HRESULT UnlockStore();
/// <summary>
/// GetCount retrieves the number of items currently in the set.
/// </summary>
/// <param name="pcItems">
/// Upon success, will contain the count of items in the set.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The call was successful, and *pcItems contains the number of
/// values in the set.
/// </para>
/// </returns>
HRESULT GetCount(
[out] UINT32* pcItems
);
/// <summary>
/// GetItemByIndex retrieves the item at the specified index in the
/// store.
/// </summary>
/// <param name="unIndex">
/// Zero-based index of the item to retrieve.
/// </param>
/// <param name="pguidKey">
/// Upon success, contains the GUID key associated with this value.
/// </param>
/// <param name="pValue">
/// Upon success, contains the value at index unIndex of the set.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The call was successful.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// All values returned are copies of the actual value in the set.
/// Thus, the caller is responsible for freeing memory associated
/// with the value by calling PropVariantClear.
/// </para>
/// <para>
/// The order of items within the set is UNDEFINED, therefore the
/// caller should never expect to find the same value at the same
/// index except between matched LockStore and UnlockStore calls.
/// </para>
/// </remarks>
HRESULT GetItemByIndex(
UINT32 unIndex,
[out] GUID* pguidKey,
[in, out, ptr] PROPVARIANT* pValue // can be NULL. If not NULL, when done must use PropVariantClear() to free
);
/// <summary>
/// CopyAllItems clones all items from the store to the specified store.
/// </summary>
/// <param name="pDest">
/// pointer to an IMFAttributes interface which will recieve all items
/// from this set.
/// </param>
/// <returns>
/// <para>
/// S_OK.
/// The call was successful.
/// </para>
/// <para>
/// E_FAIL.
/// Copying one or more items from the store to the destination
/// was unsuccessful.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// Note that the pDest store must be unlocked in order to retrieve
/// or set items by key.
/// </para>
/// <para>
/// CopyAllItems is a destructive operation on the destination store.
/// In the event of a failure to copy all items, the state of the
/// pDest store is UNDEFINED. Furthermore, any existing items in
/// the pDest store will be removed prior to copying items from the
/// source store.
/// </para>
/// </remarks>
HRESULT CopyAllItems(
[in] IMFAttributes* pDest
);
};
enum MF_ATTRIBUTE_SERIALIZE_OPTIONS
{
// serialize IUnknown by reference
MF_ATTRIBUTE_SERIALIZE_UNKNOWN_BYREF = 0x00000001,
};
cpp_quote( "STDAPI MFSerializeAttributesToStream(")
cpp_quote( " IMFAttributes * pAttr, ")
cpp_quote( " DWORD dwOptions, ")
cpp_quote( " IStream * pStm);")
cpp_quote( "STDAPI MFDeserializeAttributesFromStream(")
cpp_quote( " IMFAttributes * pAttr, ")
cpp_quote( " DWORD dwOptions, ")
cpp_quote( " IStream * pStm);")
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// Buffers and samples
//
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(045FA593-8799-42b8-BC8D-8968C6453507),
local,
]
/// <summary>
/// The IMFMediaBuffer interface represent a buffer of multimedia data
/// for any possible multimedia type.
/// It provides methods for accessing the buffer pointer, the current
/// length, and the maximum length of the buffer
/// </summary>
interface IMFMediaBuffer : IUnknown
{
/// <summary>
/// The Lock method gives the caller access to the underlying
/// buffer pointer and current length of the media buffer.
/// </summary>
/// <param name="ppbBuffer">
/// Specifies a pointer to a variable where the buffer pointer
/// will be stored.
/// </param>
/// <param name="pcbMaxLength">
/// Pointer to a count of bytes where the maximum length of the
/// buffer will be stored.
/// This is the maximum amount of data that can be written to the
/// buffer.
/// </param>
/// <param name="pcbCurrentLength">
/// Pointer to a count of bytes where the current length of the
/// buffer will be stored.
/// This is amount of valid data currently in the buffer.
/// May be NULL
/// </param>
/// <remarks>
/// The buffer pointer is guaranteed to be valid for access up to
/// the maximum length of the media buffer for the duration of the lock.
// When the caller is finished, the Unlock method should be called.
/// Note that Unlock must be called the same number of times that
// Lock has been called in order to signal completion of the use of
/// the buffer pointer.
/// It is recommended that the caller lock the media buffer only
// for the time necessary to manipulate the buffer contents.
/// </remarks>
HRESULT Lock(
[out, annotation("__deref_out_bcount_part(*pcbMaxLength, *pcbCurrentLength)")] BYTE** ppbBuffer,
[out, annotation("__out_opt")] DWORD *pcbMaxLength,
[out, annotation("__out_opt")] DWORD* pcbCurrentLength
);
/// <summary>
/// The Unlock method signals completion of the use of the
/// buffer pointer acquired via the Lock method.
/// </summary>
/// <remarks>
/// The buffer pointer acquired via Lock can no longer be used
/// once the caller signals completion of that
/// usage via the Unlock call.
/// Also, note that Unlock must be called the same number of
/// times that Lock has been called in order to signal completion
/// of the use of the buffer pointer.
/// </remarks>
HRESULT Unlock();
/// <summary>
/// The GetCurrentLength method returns the current length of the
/// media buffer.
/// </summary>
/// <param name="pcbCurrentLength">
/// Pointer to a count of bytes where the current length of the
/// buffer will be stored.
/// </param>
/// <remarks>
/// A returned value of zero bytes indicates a media buffer with
/// no valid data (an empty buffer).
/// </remarks>
HRESULT GetCurrentLength(
[out, annotation("__out")] DWORD* pcbCurrentLength
);
/// <summary>
/// The SetCurrentLength method allows the caller to set the current
/// length of the media buffer.
/// </summary>
/// <param name="cbCurrentLength">
/// Current length of the media buffer in bytes.
/// </param>
/// <remarks>
/// This method should be used anytime a client modifies the content
/// of the media buffer in such a way that
/// the length of valid data in the media buffer changes.
/// </remarks>
HRESULT SetCurrentLength(
[in] DWORD cbCurrentLength
);
/// <summary>
/// The GetMaxLength method allows the caller to retrieve the maximum
/// length of the buffer represented by the IMFMediaBuffer object.
/// </summary>
/// <param name="pcbMaxLength">
/// Pointer to a count of bytes where the maximum length of the
/// buffer will be stored.
/// </param>
HRESULT GetMaxLength(
[out, annotation("__out")] DWORD* pcbMaxLength
);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(c40a00f2-b93a-4d80-ae8c-5a1c634f58e4),
local,
]
/// <summary>
/// The IMFSample interface represents a multimedia sample for a
/// multimedia stream type. An typical example is a video frame,
/// and a notable exception is audio where an IMFSample does not usually
/// represent a single sample of audio, but rather a chunk
/// of audio samples. Note that this allows us to reduce the overhead for
/// representing audio in the pipeline.
///
/// A sample may consist of a multiple buffers as is the case of compressed
/// audio or video samples received from the network or being sent to an
/// ASF media sink or ASF multiplexer.
///
/// The IMFAttributes interface can be used to tag the sample with extra
/// information that is not represented by the IMFSample methods.
/// The MFSampleExtension_xxx GUIDs in mfapi.h define some standard
/// attributes, but custom attributes are allowed and are preserved
/// through the Media Foundation pipeline as well as possible.
/// </summary>
/// <remarks>
/// MediaFoundation does not provide a synchronized (thread-safe) way to
/// call the IMFSample methods.
/// To guarantee thread-safety, the caller should obtain a lock while
/// working with sample object to prevent access by other threads.
/// </remarks>
interface IMFSample : IMFAttributes
{
/// <summary>
/// The GetSampleFlags method returns a set of bitwise flags associated with the sample. The flags are defined in the Remarks section.
/// </summary>
/// <param name="pdwSampleFlags">
/// Pointer to a 32 bit value where the sample flags will be stored.
/// </param>
/// <remarks>
/// No flags are defined in this version. *pdwSampleFlags must be
/// set to 0.
/// </remarks>
HRESULT GetSampleFlags(
[out, annotation("__out")] DWORD* pdwSampleFlags );
/// <summary>
/// The SetSampleFlags method allows the caller to set flags associated with the sample.
/// See the Remarks section of the GetSampleFlags method for the definition of the flags.
/// </summary>
/// <param name="dwSampleFlags">
/// 32 bit value specifying the sample flags.
/// </param>
HRESULT SetSampleFlags(
[in] DWORD dwSampleFlags );
/// <summary>
/// The GetSampleTime method returns the presentation time associated with the sample.
/// </summary>
/// <param name="phnsSampleTime">
/// Specifies a pointer to a 64 bit variable where the presentation time will be stored.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// If no the sample does not have a sample time MF_E_NO_SAMPLE_TIMESTAMP is returned.
/// If this method fails otherwise it returns an error code.
/// </returns>
/// <remarks>
/// The presentation time is stored in 100ns interval units.
/// </remarks>
HRESULT GetSampleTime(
[out, annotation("__out")] LONGLONG* phnsSampleTime
);
/// <summary>
/// The SetSampleTime method allows the caller to set the presentation time associated with the sample.
/// </summary>
/// <param name="hnsSampleTime">
/// 64 bit value specifying the presentation time.
/// </param>
/// <remarks>
/// The presentation time is stored in 100ns interval units.
/// </remarks>
HRESULT SetSampleTime(
[in] LONGLONG hnsSampleTime );
/// <summary>
/// The GetSampleDuration method returns the duration of the sample.
/// </summary>
/// <param name="phnsSampleDuration">
/// Specifies a pointer to a 64 bit variable where duration will be stored.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// If no the sample does not have a duration MF_E_NO_SAMPLE_DURATION is returned.
/// If this method fails otherwise it returns an error code.
/// </returns>
/// <remarks>
/// The duration is specified in 100ns interval units.
/// If the duration is zero, then the sample duration is unknown. In such cases, it is possible that it can be derived from the media type e.g. video frame rate.
/// Application should avoid calculating duration of presentation as sum of sample durations because of possible cumulative error.
/// For example cumulative error for 60fps video on 24 hours interval is 0.1728 seconds.
/// For 60fps, there are 5184000 frames * 166667 100ns/frame = 24 hours + 0.1728 seconds
/// </remarks>
HRESULT GetSampleDuration(
[out, annotation("__out")] LONGLONG* phnsSampleDuration );
/// <summary>
/// The SetSampleDuration method allows the caller to set the duration of the sample.
/// </summary>
/// <param name="hnsSampleDuration">
/// 64 bit value specifying the sample duration.
/// </param>
/// <remarks>
/// The duration is specified in 100ns interval units. This value should be set wherever possible to aid in the processing of samples in a multimedia pipeline.
/// </remarks>
HRESULT SetSampleDuration(
[in] LONGLONG hnsSampleDuration );
//
// Methods to manage the sample's buffers
//
/// <summary>
/// The GetBufferCount method returns the count of the buffers in that are currently associated with this sample.
/// </summary>
/// <param name="pdwBufferCount">
/// Pointer to a 32 bit variable where the buffer count will be stored.
/// </param>
/// <remarks>
/// It is valid to have a sample with a buffer count of zero. This is considered to be an empty sample.
/// </remarks>
HRESULT GetBufferCount(
[out, annotation("__out")] DWORD* pdwBufferCount );
/// <summary>
/// The GetBufferByIndex method returns a pointer to the IMFMediaBuffer object at a specified index in the sample.
/// </summary>
/// <param name="dwIndex">
/// 32 bit value specifying the index of the buffer object requested.
/// </param>
/// <param name="ppBuffer">
/// Pointer to a pointer where the buffer object will be stored.
/// </param>
HRESULT GetBufferByIndex(
[in] DWORD dwIndex,
[out, annotation("__out")] IMFMediaBuffer** ppBuffer );
/// <summary>
/// The GetContiguousBuffer method converts sample with multiple buffers into sample with single buffer and returns a pointer to this buffer.
/// </summary>
/// <param name="ppBuffer">
/// Pointer to a pointer where the buffer object will be stored.
/// </param>
/// <remarks>
/// This method copies the content of the sample into a contiguous media buffer, and should be used with care.
/// </remarks>
HRESULT ConvertToContiguousBuffer(
[out, annotation("__out")] IMFMediaBuffer** ppBuffer );
/// <summary>
/// The AddBuffer method allows the caller to add a media buffer to the end of current list of buffers in the sample.
/// </summary>
/// <param name="pBuffer">
/// Pointer to a buffer object.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// If sample does not support adding buffers, it returns MF_E_SAMPLE_UNSUPPORTED_OP.
/// If it fails, it returns an error code.
/// </returns>
/// <remarks>
/// The newly added buffer represents sample data at an offset equal to the previous total length of the sample.
/// </remarks>
HRESULT AddBuffer(
[in] IMFMediaBuffer* pBuffer );
/// <summary>
/// The RemoveBufferByIndex method allows the caller to remove a buffer object at a specified index within the list of available buffer objects in the sample.
/// </summary>
/// <param name="dwIndex">
/// 32 bit value specifying the index.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// If sample does not support removing buffers, it returns MF_E_SAMPLE_UNSUPPORTED_OP.
/// If it fails, it returns an error code.
/// </returns>
/// <remarks>
/// The total length of the sample is reduced by the length of the removed buffer, and the offsets of all buffer objects that
/// were at indices greater than dwIndex are shifted up by the length of the removed buffer.
/// </remarks>
HRESULT RemoveBufferByIndex(
[in] DWORD dwIndex );
/// <summary>
/// The RemoveAllBuffers method allows the caller to remove all buffer objects associated with the sample.
/// </summary>
/// <returns>
/// If the method succeeds, it returns S_OK.
/// If sample does not support removing buffers, it returns MF_E_SAMPLE_UNSUPPORTED_OP.
/// If it fails, it returns an error code.
/// </returns>
/// <remarks>
/// After this call, the buffer count of the sample is zero i.e. it is an empty sample.
/// </remarks>
HRESULT RemoveAllBuffers( void );
/// <summary>
/// The GetTotalLength method returns the total length of all buffers objects in the sample.
/// </summary>
/// <param name="pcbTotalLength">
/// Pointer to a 32 bit variable where the total length in bytes will be stored.
/// </param>
/// <remarks>
/// The total length of the sample is tracked when buffers are added (via AddBuffer), removed (via RemoveBufferByIndex and RemoveAllBuffers).
/// </remarks>
HRESULT GetTotalLength(
[out, annotation("__out")] DWORD* pcbTotalLength );
/// <summary>
/// The CopyToBuffer method allows the caller to copy the sample data to the buffer object provided.
/// </summary>
/// <param name="pBuffer">
/// Pointer to a buffer object.
/// </param>
/// <returns>
/// If the method succeeds, it returns S_OK. If destination buffer is too small, it returns MF_E_BUFFERTOOSMALL. If it fails for other reason, it returns an error code.
/// </returns>
HRESULT CopyToBuffer(
[in] IMFMediaBuffer* pBuffer );
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(7DC9D5F9-9ED9-44ec-9BBF-0600BB589FBB),
local
]
/// <summary>
/// The IMF2DBuffer interface is supported by a media buffer whose multimedia data represents a 2D media type e.g. video.
/// For these media types it is important to know the "pitch" of the buffer which indicates the number of bytes required to go from
/// scanline to scanline. The IMF2DBuffer interface is obtained from a buffer by calling QueryInterface().
/// For each 2D media type a contiguous standard representation is defined which is designed to be compatible with the standard
/// layout of a DirectX surface when represented by system memory. In this representation the surface pitch is always positive and
/// equal to the number of bytes taken up by a single row of pixels padded out to a 4-byte boundary.
///
/// Applications may still access 2D buffers using IMFBuffer::Lock(). In that case the data in the buffer will always be in the
/// standard contiguous format for the format of data represented by the buffer. An internal copy may be required on IMFBuffer::Lock()
/// and IMFBuffer::Unlock() to achieve this. The copy will not occur if the buffer is already in the correct format. When a copy occurs an
/// event will be generated to aid debugging performance issues resulting from the copy. Components that process 2D data should aim to
/// use the IMF2DBuffer interface to access sample data.
/// </summary>
interface IMF2DBuffer : IUnknown
{
/// <summary>
/// The Lock2D method ensures the buffer memory is accessible in the correct format and returns a pointer to
/// the start of the first line and the pitch of the buffer. Each call to Lock2D must be matched by a corresponding call to Unlock2D.
/// The memory pointer and pitch value are only valid while there is at least one outstanding Lock2D call with an unmactched Unlock2D call.
/// </summary>
/// <param name="pbScanline0">
/// Pointer to a byte ponter where the pointer to the first byte of the top row of the buffer will be stored
/// </param>
/// <param name="plPitch">
/// Pointer to a count of bytes where the pitch of the buffer will be stored. This value can be added to a pointer to the
/// start of a given row of the buffer to get the pointer to the start of the next row of the buffer.
/// </param>
HRESULT Lock2D(
[out, annotation("__out")] BYTE** pbScanline0,
[out] LONG* plPitch
);
/// <summary>
/// The Unlock2D method unlocks the buffer. Each call to Lock2D must be matched by a call to Unlock2D.
/// When there are no more outstanding Unlocks all existing pointers to the buffer and pitch values should be considered invalid.
/// </summary>
HRESULT Unlock2D();
/// <summary>
/// The GetScanline0AndPitch returns a pointer to the start of the first line and the pitch of the buffer.
/// The memory pointer and pitch value are only valid while there is at least one outstanding Lock call with an unmactched Unlock call.
/// </summary>
/// <param name="pbScanline0">
/// Pointer to a byte ponter where the pointer to the first byte of the top row of the buffer will be stored
/// </param>
/// <param name="plPitch">
/// Pointer to a count of bytes where the pitch of the buffer will be stored. This value can be added to a pointer to the
/// start of a given row of the buffer to get the pointer to the start of the next row of the buffer.
/// </param>
HRESULT GetScanline0AndPitch(
[out, annotation("__out")] BYTE** pbScanline0,
[out, annotation("__out")] LONG* plPitch
);
/// <summary>
/// The IsContignousFormat method returns a BOOL value which is TRUE if the buffer is in contiguous format and FALSE if it is not in contiguous format.
/// </summary>
/// <param name="pfIsContiguous">
/// Pointer to where the BOOL value saying whether the buffer is in contiguous format will be stored.
/// </param>
HRESULT IsContiguousFormat(
[out, annotation("__out")] BOOL* pfIsContiguous
);
/// <summary>
/// The GetContiguousLength method returns the number of bytes required store the buffer contents in contiguous format.
/// </summary>
/// <param name="pcbLength">
/// Pointer to where the count of bytes needed to store the buffer contents in contiguous will be stored.
/// </param>
HRESULT GetContiguousLength(
[out, annotation("__out")] DWORD* pcbLength
);
/// <summary>
/// The ContiguousCopyTo method copies the contents of the buffer into the caller's buffer in contiguous format.
/// </summary>
/// <param name="pbDestBuffer">
/// Pointer to where to store the contiguous data to.
/// </param>
/// <param name="cbDestBuffer">
/// Number of bytes to copy. This must match the value returned by GetContiguousLength. If it doesn't this method returns E_INVALIDARG.
/// </param>
HRESULT ContiguousCopyTo(
[out, size_is(cbDestBuffer), annotation("__out_bcount(cbDestBuffer)")] BYTE* pbDestBuffer,
[in] DWORD cbDestBuffer
);
/// <summary>
/// The ContiguousCopyFrom method copies the contents of the caller's buffer which is in contiguous format into
/// the buffer - correcting for the buffer's pitch as necessary.
/// </summary>
/// <param name="pbSrcBuffer">
/// Pointer to where to copy the contiguous from.
/// </param>
/// <param name="cbSrcBuffer">
/// Number of bytes to copy. This must match the value returned by GetContiguousLength. If it doesn't this method returns E_INVALIDARG.
/// </param>
HRESULT ContiguousCopyFrom(
[in, size_is(cbSrcBuffer), annotation("__in_bcount(cbSrcBuffer)")] const BYTE* pbSrcBuffer,
[in] DWORD cbSrcBuffer
);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
// Media Types
//
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(44ae0fa8-ea31-4109-8d2e-4cae4997c555),
local
]
interface IMFMediaType : IMFAttributes
{
HRESULT GetMajorType(
[out, annotation("__out")] GUID* pguidMajorType
);
HRESULT IsCompressedFormat(
[out, annotation("__out")] BOOL* pfCompressed
);
HRESULT IsEqual(
[in] IMFMediaType* pIMediaType,
[out, annotation("__out")] DWORD* pdwFlags
);
HRESULT GetRepresentation(
[in] GUID guidRepresentation,
[out, annotation("__out")] LPVOID* ppvRepresentation
);
HRESULT FreeRepresentation(
[in] GUID guidRepresentation,
[in] LPVOID pvRepresentation
);
};
//
// IsEqual flags
//
// for audio
// major type match = both are audio
// subtype match = format types match = iscompressed for both matches
// format_data match = format blocks match exactly
// for video
// major type match = both are video
// sub type match = bit format for both are the same
// format type match = both of them have format blocks
// format_data match = both format blocks match exactly
cpp_quote( "#define MF_MEDIATYPE_EQUAL_MAJOR_TYPES 0x00000001" )
cpp_quote( "#define MF_MEDIATYPE_EQUAL_FORMAT_TYPES 0x00000002" )
cpp_quote( "#define MF_MEDIATYPE_EQUAL_FORMAT_DATA 0x00000004" )
cpp_quote( "#define MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA 0x00000008" )
cpp_quote( "" )
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(26a0adc3-ce26-4672-9304-69552edd3faf),
local
]
interface IMFAudioMediaType : IMFMediaType
{
//
// This method has been deprecated, and its use should be avoided.
// There are no guarantees about how long the memory pointed to by the
// return value will be valid.
// Applications are advised to use MFCreateWaveFormatExFromMFMediaType()
// instead.
//
const WAVEFORMATEX* GetAudioFormat();
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// BITMAPINFOHEADER and BITMAPINFO
//
cpp_quote("#ifndef _WINGDI_")
// RGBQUAD definition
#ifndef RGBQUAD
typedef DWORD RGBQUAD;
#endif // RGBQUAD
typedef struct
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
typedef struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
cpp_quote("#endif")
cpp_quote("")
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// New version of MFT_REGISTER_TYPE_INFO for MF
//
typedef struct
{
GUID guidMajorType;
GUID guidSubtype;
} MFT_REGISTER_TYPE_INFO;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// Video mediatype-related definitions
//
cpp_quote( "#if !defined( _MFVIDEOFORMAT_ )" )
cpp_quote( "#define _MFVIDEOFORMAT_" )
typedef enum _MFVideoInterlaceMode
{
// This is an invalid flag and will be deleted before release
MFVideoInterlace_Unknown = 0,
MFVideoInterlace_Progressive = 2,
MFVideoInterlace_FieldInterleavedUpperFirst = 3,
MFVideoInterlace_FieldInterleavedLowerFirst = 4,
MFVideoInterlace_FieldSingleUpper = 5,
MFVideoInterlace_FieldSingleLower = 6,
MFVideoInterlace_MixedInterlaceOrProgressive= 7,
MFVideoInterlace_Last,
MFVideoInterlace_ForceDWORD = 0x7FFFFFFF
} MFVideoInterlaceMode;
// Obsolete flags that should not be used.
cpp_quote("#define MFVideoInterlace_FieldSingleUpperFirst MFVideoInterlace_FieldSingleUpper")
cpp_quote("#define MFVideoInterlace_FieldSingleLowerFirst MFVideoInterlace_FieldSingleLower")
typedef enum _MFVideoTransferFunction
{
MFVideoTransFunc_Unknown = 0,
MFVideoTransFunc_10 = 1,
MFVideoTransFunc_18 = 2,
MFVideoTransFunc_20 = 3,
MFVideoTransFunc_22 = 4,
MFVideoTransFunc_709 = 5, // 1361
MFVideoTransFunc_240M = 6,
MFVideoTransFunc_sRGB = 7,
MFVideoTransFunc_28 = 8,
#if (WINVER >= _WIN32_WINNT_WIN7)
MFVideoTransFunc_Log_100 = 9,
MFVideoTransFunc_Log_316 = 10,
MFVideoTransFunc_709_sym = 11, // symmetric 709
#endif // (WINVER >= _WIN32_WINNT_WIN7)
MFVideoTransFunc_Last,
MFVideoTransFunc_ForceDWORD = 0x7FFFFFFF
} MFVideoTransferFunction;
typedef enum _MFVideoPrimaries
{
MFVideoPrimaries_Unknown = 0,
MFVideoPrimaries_reserved = 1,
MFVideoPrimaries_BT709 = 2,
MFVideoPrimaries_BT470_2_SysM = 3,
MFVideoPrimaries_BT470_2_SysBG = 4,
MFVideoPrimaries_SMPTE170M = 5,
MFVideoPrimaries_SMPTE240M = 6,
MFVideoPrimaries_EBU3213 = 7,
MFVideoPrimaries_SMPTE_C = 8,
MFVideoPrimaries_Last,
MFVideoPrimaries_ForceDWORD = 0x7FFFFFFF
} MFVideoPrimaries;
typedef enum _MFVideoLighting
{
MFVideoLighting_Unknown = 0,
MFVideoLighting_bright=1,
MFVideoLighting_office=2,
MFVideoLighting_dim=3,
MFVideoLighting_dark=4,
MFVideoLighting_Last,
MFVideoLighting_ForceDWORD = 0x7FFFFFFF
} MFVideoLighting;
typedef enum _MFVideoTransferMatrix
{
MFVideoTransferMatrix_Unknown = 0,
MFVideoTransferMatrix_BT709 = 1,
MFVideoTransferMatrix_BT601 = 2,
MFVideoTransferMatrix_SMPTE240M = 3,
MFVideoTransferMatrix_Last,
MFVideoTransferMatrix_ForceDWORD = 0x7FFFFFFF
} MFVideoTransferMatrix;
typedef enum _MFVideoChromaSubsampling
{
MFVideoChromaSubsampling_Unknown = 0,
MFVideoChromaSubsampling_ProgressiveChroma = 0x8,
MFVideoChromaSubsampling_Horizontally_Cosited = 0x4, // bit 2
MFVideoChromaSubsampling_Vertically_Cosited = 0x2, // bit 1
MFVideoChromaSubsampling_Vertically_AlignedChromaPlanes = 0x1, // bit 0, can only be 0 if vertically cosited
// 4:2:0 variations
MFVideoChromaSubsampling_MPEG2 = MFVideoChromaSubsampling_Horizontally_Cosited |
MFVideoChromaSubsampling_Vertically_AlignedChromaPlanes,
MFVideoChromaSubsampling_MPEG1 = MFVideoChromaSubsampling_Vertically_AlignedChromaPlanes,
MFVideoChromaSubsampling_DV_PAL = MFVideoChromaSubsampling_Horizontally_Cosited |
MFVideoChromaSubsampling_Vertically_Cosited,
// 4:4:4, 4:2:2, 4:1:1
MFVideoChromaSubsampling_Cosited = MFVideoChromaSubsampling_Horizontally_Cosited |
MFVideoChromaSubsampling_Vertically_Cosited |
MFVideoChromaSubsampling_Vertically_AlignedChromaPlanes,
MFVideoChromaSubsampling_Last = MFVideoChromaSubsampling_Cosited+1,
MFVideoChromaSubsampling_ForceDWORD = 0x7FFFFFFF
} MFVideoChromaSubsampling;
typedef enum _MFNominalRange
{
MFNominalRange_Unknown = 0,
MFNominalRange_Normal = 1,
MFNominalRange_Wide = 2,
// explicit range forms
MFNominalRange_0_255 = 1,
MFNominalRange_16_235 = 2,
MFNominalRange_48_208 = 3,
#if (WINVER >= _WIN32_WINNT_WIN7)
MFNominalRange_64_127 = 4,
#endif // (WINVER >= _WIN32_WINNT_WIN7)
MFNominalRange_Last,
MFNominalRange_ForceDWORD = 0x7FFFFFFF
} MFNominalRange;
typedef enum _MFVideoFlags {
// static flags
MFVideoFlag_PAD_TO_Mask = 0x0001 | 0x0002,
MFVideoFlag_PAD_TO_None = 0*0x0001,
MFVideoFlag_PAD_TO_4x3 = 1*0x0001,
MFVideoFlag_PAD_TO_16x9 = 2*0x0001,
MFVideoFlag_SrcContentHintMask = 0x0004 | 0x0008 | 0x0010,
MFVideoFlag_SrcContentHintNone = 0*0x0004,
MFVideoFlag_SrcContentHint16x9 = 1*0x0004,
MFVideoFlag_SrcContentHint235_1 = 2*0x0004,
// static/dynamic flags
MFVideoFlag_AnalogProtected = 0x0020,
MFVideoFlag_DigitallyProtected = 0x0040,
// dynamic flags
MFVideoFlag_ProgressiveContent = 0x0080,
MFVideoFlag_FieldRepeatCountMask = 0x0100 | 0x0200 | 0x0400,
MFVideoFlag_FieldRepeatCountShift = 8,
MFVideoFlag_ProgressiveSeqReset = 0x0800,
MFVideoFlag_PanScanEnabled = 0x20000,
MFVideoFlag_LowerFieldFirst = 0x40000,
MFVideoFlag_BottomUpLinearRep = 0x80000,
// ******************************************
// static surface creation flags - UNAPPROVED
// --------------- DO NOT USE ---------------
// ******************************************
MFVideoFlags_DXVASurface = 0x100000,
MFVideoFlags_RenderTargetSurface = 0x400000,
MFVideoFlags_ForceQWORD = 0x7FFFFFFF
} MFVideoFlags;
typedef struct _MFRatio
{
DWORD Numerator;
DWORD Denominator;
} MFRatio;
// number = value + fract/65535f
typedef struct _MFOffset {
WORD fract;
short value;
} MFOffset;
typedef struct _MFVideoArea
{
MFOffset OffsetX;
MFOffset OffsetY;
SIZE Area;
} MFVideoArea;
typedef struct _MFVideoInfo
{
DWORD dwWidth;
DWORD dwHeight;
MFRatio PixelAspectRatio;
MFVideoChromaSubsampling SourceChromaSubsampling;
MFVideoInterlaceMode InterlaceMode;
MFVideoTransferFunction TransferFunction;
MFVideoPrimaries ColorPrimaries;
MFVideoTransferMatrix TransferMatrix;
MFVideoLighting SourceLighting;
MFRatio FramesPerSecond;
MFNominalRange NominalRange;
MFVideoArea GeometricAperture;
MFVideoArea MinimumDisplayAperture;
MFVideoArea PanScanAperture;
unsigned __int64 VideoFlags;
} MFVideoInfo;
typedef struct __MFAYUVSample {
BYTE bCrValue;
BYTE bCbValue;
BYTE bYValue;
BYTE bSampleAlpha8;
} MFAYUVSample;
typedef struct _MFARGB
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbAlpha;
} MFARGB;
typedef union _MFPaletteEntry {
MFARGB ARGB;
MFAYUVSample AYCbCr;
} MFPaletteEntry;
typedef struct _MFVideoSurfaceInfo
{
DWORD Format;
DWORD PaletteEntries;
[size_is(PaletteEntries)] MFPaletteEntry Palette[];
} MFVideoSurfaceInfo;
typedef struct _MFVideoCompressedInfo
{
LONGLONG AvgBitrate;
LONGLONG AvgBitErrorRate;
DWORD MaxKeyFrameSpacing;
} MFVideoCompressedInfo;
typedef struct _MFVIDEOFORMAT
{
DWORD dwSize; // includes palette
MFVideoInfo videoInfo;
GUID guidFormat; // compressed (4CC & other) & uncompressed (4CC/D3DFMT)
// compressed if surfaceInfo.Format = 0
// If uncompressed, then guidFormat.Data1 is mirrored in surfaceInfo.Format
MFVideoCompressedInfo compressedInfo;
MFVideoSurfaceInfo surfaceInfo;
// optional Palette[256] (in surfaceInfo)
} MFVIDEOFORMAT;
//
// Init helper functions for common video standards
//
typedef enum _MFStandardVideoFormat
{
MFStdVideoFormat_reserved = 0,
MFStdVideoFormat_NTSC,
MFStdVideoFormat_PAL,
MFStdVideoFormat_DVD_NTSC,
MFStdVideoFormat_DVD_PAL,
MFStdVideoFormat_DV_PAL,
MFStdVideoFormat_DV_NTSC,
MFStdVideoFormat_ATSC_SD480i,
MFStdVideoFormat_ATSC_HD1080i,
MFStdVideoFormat_ATSC_HD720p,
} MFStandardVideoFormat;
cpp_quote( "#endif" )
cpp_quote( "" )
[
object,
uuid(b99f381f-a8f9-47a2-a5af-ca3a225a3890),
local
]
interface IMFVideoMediaType : IMFMediaType
{
//
// This method has been deprecated, and its use should be avoided.
// There are no guarantees about how long the memory pointed to by the
// return value will be valid.
// Applications are advised to use MFCreateMFVideoFormatFromMFMediaType()
// instead.
//
const MFVIDEOFORMAT* GetVideoFormat();
// translation service to other formats such as FORMAT_VideoInfo
HRESULT GetVideoRepresentation(
[in] GUID guidRepresentation,
[out, annotation("__out")] LPVOID* ppvRepresentation,
[in] LONG lStride
);
};
////////////////////////////////////////////////////////////////////////////////
//
// Asynchronous model
//
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(ac6b7889-0740-4d51-8619-905994a55cc6)
]
/// <summary>
/// This interface is used to represent the result from an asynchronous
/// operation.
/// For most Media Foundation components and applications that need to
/// create an IMFAsyncResult implementation, MFCreateAsyncResult, which
/// instantiates the MF implementation of this interface, will suffice.
/// Any implementation of IMFAsyncResult must inherit from the
/// MFASYNCRESULT structure defined in mfapi.h
/// </summary>
interface IMFAsyncResult : IUnknown
{
/// <summary>
/// Retrieves an IUnknown pointer to the state object associated with
/// the asynchronous operation, if any.
/// If there is no associated state, then *ppunkState is set to NULL.
/// </summary>
HRESULT GetState(
[out] IUnknown** ppunkState);
/// <summary>
/// Returns an HRESULT indicating the success or failure of the
/// asynchronous operation
/// </summary>
HRESULT GetStatus();
/// <summary>
/// Sets the HRESULT status code to indicate the success or failure
/// of the asynchronous operation.
/// </summary>
HRESULT SetStatus(
[in] HRESULT hrStatus);
/// <summary>
/// Retrieves an IUnknown pointer to the object associated with the
/// asynchronous operation, if any.
/// If there is no associated object, then *ppunkObject is set to NULL.
/// </summary>
HRESULT GetObject(
[out] IUnknown ** ppObject);
/// <summary>
/// Returns an IUnknown pointer to the state object associated with
/// the asynchronous operation, if any, without incrementing its
/// reference count
/// </summary>
[local] IUnknown * GetStateNoAddRef();
};
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
[
object,
uuid(a27003cf-2354-4f2a-8d6a-ab7cff15437e),
]
/// <summary>
/// This interface is used to represent the callback object which will
/// receive notification of the completion of an asynchronous operation.
/// </summary>
interface IMFAsyncCallback : IUnknown
{
/// <summary>
/// The GetParameters method allows the asynchronous callback implementer to provide configuration
/// information to the callback dispatching mechanism.
/// </summary>
/// <param name="pdwFlags">
/// Pointer to a 32 bit value containing the flags. Default value is no flags set.
/// The following flags are currently defined:
/// <para>
/// MFASYNC_FAST_IO_PROCESSING_CALLBACK:
/// The callback should do very minimal processing (take less than 1 millisecond to complete).
/// Longer processing may block device I/O and cause data to be lost or retrieved from or sent to a device late..
/// </para>
/// <para>
/// MFASYNC_SIGNAL_CALLBACK:
/// Implies MFASYNC_FAST_IO_PROCESSING_CALLBACK, with the additional restriction that the callback
/// does no processing (take much less than 50 microseconds) and the only system call it may make is to SetEvent().
/// </para>
/// If no flag is set and this callback is not specifically for the long function work queue, the callback should not take a long time to complete (greater than 30ms).
/// Longer processing may block other callbacks that need to happen in a timely manner during multimedia processing.
/// </param>
/// <param name="pdwQueue">
/// Pointer to a double word containing a hint on how to dispatch the callback. Default value is MFASYNC_CALLBACK_QUEUE_STANDARD.
/// The following dispatch hint is currently defined:
/// MFASYNC_CALLBACK_QUEUE_STANDARD
/// </param>
/// <remarks>
/// The callback dispatcher calls this method to determine configuration information for dispatching the callback.
/// If this function returns E_NOTIMPL, the callback dispatcher uses default configuration values.
/// If the callback wants to mark itself as "realtime safe", it should implement the IRealtime interface, as defined
/// in the Media Foundation RealTime Specification. This will place additional restrictions on what the callback's Invoke method may do.
/// </remarks>
HRESULT GetParameters(
[out] DWORD* pdwFlags,
[out] DWORD* pdwQueue
);
/// <summary>
/// The Invoke method is called to indicate that the asynchronous operation has completed,
/// and to give the callback implementer the result object which can be used to retrieve the output data via a call to EndXXX.
/// </summary>
/// <param name="pAsyncResult">
/// Pointer to an async result object
/// </param>
HRESULT Invoke(
[in] IMFAsyncResult* pAsyncResult
);
}
//
// Async callback flags
//
cpp_quote( "#define MFASYNC_FAST_IO_PROCESSING_CALLBACK 0x00000001" )
cpp_quote( "#define MFASYNC_SIGNAL_CALLBACK 0x00000002" )
//
// Async callback invocation queue IDs
//
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_UNDEFINED 0x00000000" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_STANDARD 0x00000001" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_RT 0x00000002" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_IO 0x00000003" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_TIMER 0x00000004" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION 0x00000007" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_PRIVATE_MASK 0xFFFF0000" )
cpp_quote( "#define MFASYNC_CALLBACK_QUEUE_ALL 0xFFFFFFFF" )
////////////////////////////////////////////////////////////////////////////////
//
// Events
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// Media Foundation media event types
/// </summary>
enum
{
//-------------------------------------------------------------------------
// generic events
//-------------------------------------------------------------------------
/// <member name="MEUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
MEUnknown = 0,
/// <member name="MEError">
/// Any component can send MEError event at any time to notify
/// about a fatal failure.
/// </member>
MEError = 1,
/// <member name="MEExtendedType">
/// Extensible event type. Use the extended event type
/// (IMFMediaEvent::GetExtendedType)
/// </member>
MEExtendedType = 2,
/// <member name="MENonFatalError">
/// Any component can send MENonFatalError event at any time to notify
/// about a non-fatal error.
/// </member>
MENonFatalError = 3,
/// <member name="MEGenericV1Anchor">
/// Last generic event for v1. Do not add or remove events above this one.
/// </member>
MEGenericV1Anchor = MENonFatalError,
//-------------------------------------------------------------------------
// Media Session events:
// Events of interest to applications using the Media Session
//-------------------------------------------------------------------------
/// <member name="MESessionUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
MESessionUnknown = 100,
/// <member name="MESessionTopologySet">
/// Media Session response to IMFMediaSession::SetTopology.
/// Value:
/// VT_UNKNOWN
/// IMFTopology * for the full topology that was set
/// </member>
MESessionTopologySet = 101,
/// <member name="MESessionTopologiesCleared">
/// Media Session response to IMFMediaSession::ClearTopologies
/// </member>
MESessionTopologiesCleared = 102,
/// <member name="MESessionStarted">
/// Media Session response to IMFMediaSession::Start
///
/// MF_EVENT_PRESENTATION_TIME_OFFSET:
/// Indicates the offset between presentation time and original
/// content timestamps (source time) for this presentation.
/// Applications may prefer to display source time
/// for their UI and should use this value to do so.
/// The relationship between presentation time and source time is:
/// PresentationTimeOffset = PresentationTime - SourceTime
///
/// </member>
MESessionStarted = 103,
/// <member name="MESessionPaused">
/// Media Session response to IMFMediaSession::Pause
/// </member>
MESessionPaused = 104,
/// <member name="MESessionStopped">
/// Media Session response to IMFMediaSession::Stop
/// </member>
MESessionStopped = 105,
/// <member name="MESessionClosed">
/// Media Session response to IMFMediaSession::Close
/// </member>
MESessionClosed = 106,
/// <member name="MESessionEnded">
/// Media Session sends when it has reached the end of
/// the presentation(s). Pipeline will then enter the
/// stopped state
/// </member>
MESessionEnded = 107,
/// <member name="MESessionRateChanged">
/// Media Session response to IMFRateControl::SetRate on its
/// rate control service
/// Value:
/// VT_R4
/// New rate
/// </member>
MESessionRateChanged = 108,
/// <member name="MESessionScrubSampleComplete">
/// Media Session response to IMFMediaSession::Start when the
/// rate is set to 0 ("scrubbing"). This means that a frame
/// for the specified time has been displayed
/// </member>
MESessionScrubSampleComplete = 109,
/// <member name="MESessionCapabilitiesChanged">
/// Media Session sends this events whenever there is an update to
/// its capabilities
/// Attributes:
/// MF_EVENT_SESSIONCAPS:
/// Combination of MFSESSIONCAP_xxx bitflags
/// MF_EVENT_SESSIONCAPS_DELTA:
/// Delta between the previous session capabilities and the
/// current ones
/// </member>
MESessionCapabilitiesChanged = 110,
/// <member name="MESessionTopologyStatus">
/// Media Session sends this informational event to report the
/// status of the associated topology to the application
/// Value:
/// VT_UNKNOWN
/// IMFTopology * for the full topology whose status this is
/// Attributes:
/// MF_EVENT_TOPOLOGY_STATUS:
/// Status of this topology. See the MF_TOPOSTATUS enumerated
/// type values for details.
/// </member>
MESessionTopologyStatus = 111,
/// <member name="MESessionNotifyPresentationTime">
/// This event is sent by the Media Session whenever a a new topology
/// is started. It indicates when the presentation will start
/// and the offset between presentation time and the original content's
/// timestamps.
/// Attributes:
/// MF_EVENT_START_PRESENTATION_TIME:
/// Time (in terms of Presentation Clock time) this topology
/// will start
/// MF_EVENT_START_PRESENTATION_TIME_AT_OUTPUT
/// Indicates presentation time when sink is going to render the first sample of new topology
/// If any nodes in topology are buffering, MF_EVENT_OUTPUT_PRESENTATION_TIME will be smaller then
/// MF_EVENT_PRESENTATION_TIME
/// MF_EVENT_PRESENTATION_TIME_OFFSET:
/// Indicates the offset between presentation time and original
/// content timestamps (source time) for this presentation.
/// Applications may prefer to display source time
/// for their UI and should use this value to do so.
/// The relationship between presentation time and source time is:
/// PresentationTimeOffset = PresentationTime - SourceTime
/// </member>
MESessionNotifyPresentationTime = 112,
/// <member name="MENewPresentation">
/// This event originates from a multiple-presentations Media Source and
/// is forwarded to the application by the Media Session.
/// Application can obtain the corresponding topology from
/// the IMFMediaSourceTopologyProvider interface on the Media Source
/// and queue this topology at the Media Session via
/// IMFMediaSession::SetTopology.
/// Value:
/// VT_UNKNOWN
/// IMFPresentationDescriptor * for the new presentation.
/// Attributes:
/// There are no attributes corresponding to the MENewPresentation
/// event; however, the following attribute may be present on
/// the IMFPresentationDescriptor * associated with this event.
/// MF_PD_PLAYBACK_ELEMENT_ID:
/// This is an optional attribute for Media Sources with playlist-
/// style content. Its value indicates which playlist element
/// this presentation corresponds.
/// When the application uses this PresentationDescriptor to build
/// a new topology, it should transfer this attribute value to
/// the topology that it builds.
/// Example: Suppose the Media Source is sourcing Element1,
/// Element2, Element3 in sequence. The Presentation Descriptors
/// for the MENewPresentation events announcing each of these
/// should have different values for this attribute.
/// However, if the Media Source is firing
/// MENewPresentation to announce a presentation change on a
/// particular element, such as some kind of dynamic stream switch
/// or addition/removal, this value should remain the same to
/// indicate that it is the same actual element.
/// Note that this is very similar in intent to the IMFTopologyNode
/// attribute MF_TOPONODE_SEQUENCE_ELEMENTID. Media Sources that
/// provide topologies (i.e. that implement
/// IMFMediaSourceTopologyProvider) should use that mechanism
/// instead, since, unlike this attribute, it will be recognized
/// by MF on Windows Vista.
/// If two consecutive presentations have the same value for this
/// attribute, the MF pipeline will expect their timestamps to
/// remain continuous across the transition; therefore, the
/// Media Source should _not_ use the MF_EVENT_SOURCE_ACTUAL_START
/// when rolling to the next presentation.
/// Media Sources that set this attribute on the
/// IMFPresentationDescriptors accompanying MENewPresentation events
/// should also set it on the IMFPresentationDescriptor produced
/// by IMFMediaSource::CreatePresentationDescriptor.
/// MF_PD_PLAYBACK_BOUNDARY_TIME:
/// This is an optional attribute for Media Sources with playlist-
/// style content. Its value indicates where (in Media Source time)
/// this presentation actually starts.
/// When the application uses this PresentationDescriptor to build
/// a new topology, it should transfer this attribute value to
/// the topology that it builds.
/// Example: Suppose that the Media Source is sourcing Element1,
/// Element2, Element3 in sequence. In the middle of Element1,
/// there is a dynamic stream change (or addition/removal) at t=15.
/// However, in the new stream, the nearest previous keyframe is
/// at t=12, and therefore the Media Source will start sourcing
/// this stream from t=12 after the transition. What we want here
/// is a markin that will drop the decoded samples in [12, 15).
/// The MENewPresentation event for this change, in addition to
/// carrying a value MF_PD_PLAYBACK_ELEMENT_ID=1 as described
/// above, would also carry MF_PD_BOUNDARY_TIME=150000000, to
/// indicate that this happens at t=15. The Media Processor will
/// perform a markin at t=15 (usually right after decoding), and
/// this will prevent the t=12...15 frames from being displayed.
/// Note that this is very similar in intent to the IMFTopologyNode
/// attribute MF_TOPONODE_MEDIASTART. Media Sources that provide
/// topologies (i.e. that implement IMFMediaSourceTopologyProvider)
/// should use that mechanism instead, since, unlike this attribute,
/// it will be recognized by MF on Windows Vista.
/// This value does not affect how the MF pipeline adjusts
/// timestamps; it affects only markin time.
/// This attribute will be ignored unless the Media Source
/// indicates, by means of the MF_PD_PLAYBACK_ELEMENT_ID attribute
/// described above, that this presentation is the same playback
/// element as the previous one.
/// </member>
MENewPresentation = 113,
/// <member name="MELicenseAcquisitionStart">
/// Indicates that license acquisition is about to begin.
/// License acquisition is done through the application-provided
/// IMFContentProtectionManager
/// </member>
MELicenseAcquisitionStart = 114,
/// <member name="MELicenseAcquisitionCompleted">
/// Indicates that license acquisition is complete
/// </member>
MELicenseAcquisitionCompleted = 115,
/// <member name="MEIndividualizationStart">
/// Indicates that individualization is about to begin.
/// Individualization is done through the application-provided
/// IMFContentProtectionManager
/// </member>
MEIndividualizationStart = 116,
/// <member name="MEIndividualizationCompleted">
/// Indicates that individualization is complete
/// </member>
MEIndividualizationCompleted = 117,
/// <member name="MEEnablerProgress">
/// Optionally sent by the Input Trust Authority's implementation of
/// IMFContentEnabler to the application-provided
/// IMFContentProtectionManager.
/// Value:
/// VT_LPWSTR
/// Progress update for the Content Enabler's current action
/// </member>
MEEnablerProgress = 118,
/// <member name="MEEnablerCompleted">
/// Optionally sent by the Input Trust Authority's implementation of
/// IMFContentEnabler to the application-provided
/// IMFContentProtectionManager.
/// </member>
MEEnablerCompleted = 119,
/// <member name="MEPolicyError">
/// Sent by any trusted component when an error is encountered enforcing
/// the required content protection policy.
/// This event is forwarded to the application by the Media Session,
/// and the MF pipeline stops playback.
/// </member>
MEPolicyError = 120,
/// <member name="MEPolicyReport">
/// Sent by trusted outputs to report on how the policy was applied.
/// Attributes and status codes are specific to the content
/// protection system being used.
/// </member>
MEPolicyReport = 121,
/// <member name="MEBufferingStarted">
/// Indicates that the MF pipeline is pausing in order to buffer
/// data as needed by one or more of its Media Sources.
/// </member>
MEBufferingStarted = 122,
/// <member name="MEBufferingStopped">
/// Indicates that the MF pipeline is done buffering and will start
/// playback
/// </member>
MEBufferingStopped = 123,
/// <member name="MEConnectStart">
/// If the application provides an IMFSourceOpenMonitor callback,
/// this event is delivered directly to that callback when the
/// MF network source starts connecting to the media
/// </member>
MEConnectStart = 124,
/// <member name="MEConnectEnd">
/// If the application provides an IMFSourceOpenMonitor callback,
/// this event is delivered directly to that callback when the
/// MF network source is done connecting to the media
/// </member>
MEConnectEnd = 125,
/// <member name="MEReconnectStart">
/// Indicates that the Media Source is attempting to reconnect
/// to the media
/// </member>
MEReconnectStart = 126,
/// <member name="MEReconnectStop">
/// Indicates that the Media Source has finished reconnecting to
/// the media
/// </member>
MEReconnectEnd = 127,
/// <member name="MERendererEvent">
/// This event can be generated by a custom renderer.
/// <para>
/// Value: VT_I4
/// This is the custom event code generated by the renderer.
/// </para>
/// </member>
MERendererEvent = 128,
/// <member name="MESessionStreamSinkFormatChanged">
/// This event is generated by the Media Session when a stream
/// sink's format has changed.
/// Attributes:
/// MF_EVENT_OUTPUT_NODE
/// The topology node id of the stream sink whose format changed.
/// </member>
MESessionStreamSinkFormatChanged = 129,
/// <member name="MESessionV1Anchor">
/// Last session event for v1. Do not add or remove events above this one.
/// </member>
MESessionV1Anchor = MESessionStreamSinkFormatChanged,
//-------------------------------------------------------------------------
// Media Source events:
// Events of interest to Media Source implementations or applications
// using Media Sources directly
//-------------------------------------------------------------------------
/// <member name="MESourceUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
MESourceUnknown = 200,
/// <member name="MESourceStarted">
/// Media Source response to IMFMediaSource::Start for non-seeking
/// starts.
/// Value:
/// VT_I8
/// MFTIME for start time, relative to sample timestamps.
/// Can be empty if the start is from the current position
/// (i.e. the start time given to IMFMediaSource::Start was
/// VT_EMPTY), and the Media Source is either already in the
/// started state or is resuming playback from the paused state.
/// Otherwise, this must be set to a valid value.
/// Attributes:
/// MF_EVENT_SOURCE_FAKE_START
/// This attribute should be set by Media Sources that work
/// with topologies (such as the MF Sequencer Source).
/// That Media Source should set this attribute to a nonzero
/// value if the topology currently being started will be
/// empty (i.e. playback will not actually start from this
/// topology)
/// MF_EVENT_SOURCE_PROJECTSTART
/// This attribute should be set by Media Sources that work
/// with topologies (such as the MF Sequencer Source).
/// If the topology from which we will be starting has an
/// MF_TOPOLOGY_PROJECTSTART attribute, then that Media Source
/// should set this attribute on the event to the same value.
/// MF_EVENT_SOURCE_ACTUAL_START
/// This attribute is relevant only if the value associated
/// with this MESourceStarted event is VT_EMPTY.
/// Its value indicates the time (in terms of source time)
/// at which this Media Source is started.
/// For example, suppose a live Media Source is started at
/// "current position", and its timestamps will start at some
/// unknown "current" point. The MESourceStarted event will
/// carry a VT_EMPTY value, since that is what was requested in
/// IMFMediaSource::Start, but this attribute will indicate
/// where this Media Source is actually starting.
/// If this attribute is absent and the MESourceStarted event
/// carries a VT_EMPTY value, then this attribute's value
/// should be assumed to be zero.
/// </member>
MESourceStarted = 201,
/// <member name="MEStreamStarted">
/// Each Media Stream sends this event in response to
/// IMFMediaSource::Start for a non-seeking start
/// Value:
/// VT_I8
/// See description for MESourceStarted above
/// </member>
MEStreamStarted = 202,
/// <member name="MESourceSeeked">
/// Media Source response to IMFMediaSource::Start for seeking starts.
/// A start is considered to be a "seek" if the playback position
/// is being changed and the Media Source is in the playing state
/// or is resuming from the paused state.
/// Value:
/// VT_I8
/// See description above for MESourceStarted event
/// Attributes:
/// See description above for MESourceStarted event
/// </member>
MESourceSeeked = 203,
/// <member name="MEStreamSeeked">
/// Each Media Stream sends this event in response to
/// IMFMediaSource::Start for a seeking start
/// Value:
/// VT_I8
/// See description for MESourceStarted above
/// </member>
MEStreamSeeked = 204,
/// <member name="MENewStream">
/// Media Source response to IMFMediaSource::Start.
/// One such event is sent for each stream that is appearing for the
/// first time in this start.
/// Value:
/// VT_UNKNOWN
/// IMFMediaStream * of new stream
/// </member>
MENewStream = 205,
/// <member name="MEUpdatedStream">
/// Media Source response to IMFMediaSource::Start.
/// One such event is sent for each stream in this start that has
/// appeared in a previous start.
/// Value:
/// VT_UNKNOWN
/// IMFMediaStream * of stream
/// </member>
MEUpdatedStream = 206,
/// <member name="MESourceStopped">
/// Media Source response to IMFMediaSource::Stop
/// </member>
MESourceStopped = 207,
/// <member name="MEStreamStopped">
/// Each Media Stream sends this event in response to
/// IMFMediaSource::Stop
/// </member>
MEStreamStopped = 208,
/// <member name="MESourcePaused">
/// Media Source response to IMFMediaSource::Pause
/// </member>
MESourcePaused = 209,
/// <member name="MEStreamPaused">
/// Each Media Stream sends this event in response to
/// IMFMediaSource::Pause
/// </member>
MEStreamPaused = 210,
/// <member name="MEEndOfPresentation">
/// This event originates from the Media Source and is forwarded
/// to the application by the Media Session.
/// It means that the final (or only) segment is finished.
/// No action required from the application
/// </member>
MEEndOfPresentation = 211,
/// <member name="MEEndOfStream">
/// Each Media Stream sends this event when it hits the end of
/// the stream.
/// The Media Streams of the sequencer Media Source will send
/// this event at the end of each presentation.
/// </member>
MEEndOfStream = 212,
/// <member name="MEMediaSample">
/// Sent by the Media Stream to deliver a new sample
/// Value:
/// VT_UNKNOWN
/// IMFSample * for the sample
/// </member>
MEMediaSample = 213,
/// <member name="MEStreamTick">
/// Sent by a Media Stream to indicate that there will be no
/// samples delivered on this stream until at least the indicated
/// time.
/// Value:
/// VT_I8
/// MFTIME (relative to sample timestamps) until which
/// the Media Stream expects not to deliver any data
/// </member>
MEStreamTick = 214,
/// <member name="MEStreamThinMode">
/// Sent to indicate that the stream is being thinned. A thinned stream
/// delivers some samples but not all of them. An example
/// is when a media source is only delivering key frames.
///
/// Value:
/// VT_BOOL
/// VARIANT_TRUE -- the following samples will be thinned
/// VARIANT_FALSE -- the following samples are not being thinned
/// </member>
MEStreamThinMode = 215,
/// <member name="MEStreamFormatChanged">
/// Sent by a Media Stream indicating a format change in the media stream.
/// Value:
/// VT_UNKNOWN
/// IMFMediaType * for the new media type for the stream
/// </member>
MEStreamFormatChanged = 216,
/// <member name="MESourceRateChanged">
/// Media Source response to IMFRateControl::SetRate on its
/// rate control service, if it exists
/// Value:
/// VT_R4
/// New rate
/// </member>
MESourceRateChanged = 217,
//
// MENewPresentation
// Sent by the sequencer Media Source to notify the application of the
// next presentation in the sequence.
// This event is described in the "Media Session events" section above.
//
/// <member name="MEEndOfPresentationSegment">
/// This event originates from a sequencer Media Source and is
/// forwarded to the application by the Media Session.
/// It means that the sequencer has finished a non-final segment and
/// has moved onto the next one.
/// No action required from the application.
/// Attributes:
/// MF_EVENT_SOURCE_TOPOLOGY_CANCELED
/// If present and nonzero, that means that the presentation
/// has ended because the Media Source has canceled this
/// topology
/// </member>
MEEndOfPresentationSegment = 218,
/// <member name="MESourceCharacteristicsChanged">
/// Sent by a Media Source if its characteristics change.
/// Attributes:
/// MF_EVENT_SOURCE_CHARACTERISTICS
/// New IMFMediaSource characteristics bitflags
/// MF_EVENT_SOURCE_CHARACTERISTICS_OLD
/// Previous IMFMediaSource characteristics bitflags
/// </member>
MESourceCharacteristicsChanged = 219,
/// <member name="MESourceRateChangeRequested">
/// Sent by a Media Source if it requires that the rate be changed
/// A typical reason for sending this event would be if the Media
/// Source cannot continue playback at the current rate.
/// Value:
/// VT_R4
/// New rate requested by the Media Source
/// Attributes:
/// MF_EVENT_DO_THINNING
/// If present and non-zero, this event is requesting
/// that thinning at the new rate
/// </member>
MESourceRateChangeRequested = 220,
/// <member name="MESourceMetadataChanged">
/// Sent by a Media Source if the metadata has been updated.
/// Usually this happens when the Media Source can not provide
/// all the metadata at startup.
/// </member>
MESourceMetadataChanged = 221,
/// <member name="MESequencerSourceTopologyUpdated">
/// This event is sent in response to the asynchronous method
/// IMFSequncerSource::UpdateTopology. This is just a notification to
/// the application that the sequencer source is handling the
/// UpdateTopology request. The application should use the
/// MESessionTopologyXXX events to see when the topology is actually
/// ready for playback.
/// <para>
/// Value: VT_UI4
/// The sequencer ID of the topology which was updated.
/// </para>
/// </member>
MESequencerSourceTopologyUpdated = 222,
/// <member name="MESourceV1Anchor">
/// Last source event for v1. Do not add or remove events above this one.
/// </member>
MESourceV1Anchor = MESequencerSourceTopologyUpdated,
//
// MEBufferingStarted
// Sent by Media Sources that need to buffer data while starting.
// The MF pipeline will pause until it receives MEBufferingStopped.
// This event is described in the "Media Session events" section above
//
//
// MEBufferingStopped
// Sent by Media Sources that need to buffer data while starting.
// The MF pipeline will enter the started state and begin playing.
// This event is described in the "Media Session events" section above
//
//
// MEReconnectStart
// Sent by a Media Source when it attempts to reconnect to the media
// This event is described in the "Media Session events" section above
//
//
// MEReconnectEnd
// Sent by a Media Source when it is done reconnecting to the media
// This event is described in the "Media Session events" section above
//
//-------------------------------------------------------------------------
// Media Sink events:
// Events of interest to IMFMediaSink implementations or applications
// that use Media Sinks directly
//-------------------------------------------------------------------------
/// <member name="MESinkUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
MESinkUnknown = 300,
/// <member name="MEStreamSinkStarted">
/// Each Stream Sink sends this event in response to the
/// IMFClockStateSink::OnClockStart call made on the Media Sink
/// </member>
MEStreamSinkStarted = 301,
/// <member name="MEStreamSinkStopped">
/// Each Stream Sink sends this event in response to the
/// IMFClockStateSink::OnClockStop call made on the Media Sink
/// </member>
MEStreamSinkStopped = 302,
/// <member name="MEStreamSinkPaused">
/// Each Stream Sink sends this event in response to the
/// IMFClockStateSink::OnClockPause call made on the Media Sink
/// </member>
MEStreamSinkPaused = 303,
/// <member name="MEStreamSinkRateChanged">
/// Each Stream Sink sends this event in response to the
/// IMFClockStateSink::OnClockRateChanged call made on the Media Sink
/// </member>
MEStreamSinkRateChanged = 304,
/// <member name="MEStreamSinkRequestSample">
/// A Stream Sink sends this event to request for each sample
/// that it wants delivered to IMFStreamSink::ProcessSample
/// </member>
MEStreamSinkRequestSample = 305,
/// <member name="MEStreamSinkMarker">
/// A Stream Sink sends this event in response to
/// IMFStreamSink::PlaceMarker, when it hits that marker.
/// Markers should be processed in order with samples.
/// Value:
/// [Type determined by IMFStreamSink::PlaceMarker call]
/// Copy of the PROPVARIANT passed into IMFStreamSink::PlaceMarker
/// as the "context" for the marker
/// </member>
MEStreamSinkMarker = 306,
/// <member name="MEStreamSinkPrerolled">
/// Each Stream Sink of a Media Sink that supports IMFMediaSinkPreroll
/// sends this event when enough samples have been received through
/// IMFStreamSinkProcessSample to preroll up to the time specified
/// in IMFMediaSinkPreroll::NotifyPreroll
/// </member>
MEStreamSinkPrerolled = 307,
/// <member name="MEStreamSinkScrubSampleComplete">
/// Each Stream Sink of a Media Sink that supports rate 0 sends
/// this event when the rate is 0, as soon as a frame has been
/// displayed for the time specified in IMFClockStateSink::OnClockStart.
/// Sinks that support rate 0 but do not render anything will send
/// back this event as soon as they receive the OnClockStart
/// notification.
/// Attributes:
/// MF_EVENT_SCRUBSAMPLE_TIME
/// If present, indicates the presentation time for which
/// a frame has been displayed.
/// Sinks that do not render any data while in rate 0 should
/// not set this attribute.
/// </member>
MEStreamSinkScrubSampleComplete = 308,
/// <member name="MEStreamSinkFormatChanged">
/// Sent by a Stream Sink when the downstream format changes in such
/// a way that will require the topology to be renegotiated.
/// </member>
MEStreamSinkFormatChanged = 309,
/// <member name="MEStreamSinkDeviceChanged">
/// Sent by the Stream Sink of the Enhanced Video Renderer to
/// indicate that the device has changed. The MF pipeline responds
/// to this event by resubmitting all sample requests that failed
/// while the device was in the process of changing.
/// </member>
MEStreamSinkDeviceChanged = 310,
//
// MEStreamTick
// Stream Sinks can receive this event via IMFStreamSink::PlaceMarker.
// This tells the Stream Sink to expect a gap in the data until at least
// the event's PROPVARIANT value, which is given in terms of
// Presentation Clock time.
// In addition to optionally acting on this information, Stream Sinks
// should handle this marker like any other marker.
//
//
// MEPolicySet
// Stream Sinks that are Output Trust Authorities and set policy
// asynchronously should send this event.
// This event is described in the "Trust events" section below.
//
//
// MENetQualityReport
// Sent by Stream Sinks that send data out over the network to provide
// feedback on streaming
// This event is described in the "Media Session events" section above
//
/// <member name="MEQualityNotify">
/// This event is generated by components which want to give a
/// continuous feedback
/// <para>
/// GUID: MF_QUALITY_NOTIFY_SAMPLE_LAG
/// Value: VT_I8
/// This event is generated by components which want to give a
/// continuous feedback on whether things are going fine or bad.
/// <para>
/// Value representing 100-nanosecond units indicating the
/// lag time for the sample. Positive values show by how much
/// the component determined the sample to be late. Negative
/// values show by how much the sample was delivered early
/// </para>
/// </para>
///
/// <para>
/// GUID: MF_QUALITY_NOTIFY_PROCESSING_LATENCY
/// Value: VT_I8
/// This event is generated by components which want to notify
/// the Quality Manager of their processing latency.
/// <para>
/// Value represents a LONGLONG representating 100-nonosecond
/// unit value indicating latency.
///
/// In order to determine that a sample is late the
/// Quality Manager needs to know how much latency the
/// component adds to delivering the sample. For example, on
/// the EVR the Quality Manager knows when a sample is received
/// but has no good way of estimating the time it takes for
/// this sample to eventually be presented on the screen. This
/// latency could vary depending on hardware.
///
/// It is also possible that there is no 1 to 1 mapping between
/// each sample received and the samples presented. For this
/// reason, just looking at process input and process output calls
/// on the component to estimate the latency will not help. The
/// component is at the best position to determine this latency
/// and it should give the quality manager this information.
///
/// The component can update the processing latency anytime it
/// thinks that it has changed by calling this function multiple times.
/// </para>
/// </para>
/// </member>
MEQualityNotify = 311,
/// <member name="MESinkInvalidated">
/// This event is generated by mediasession in the response to following events from the sink
/// MEAudioSessionFormatChanged,
/// MEAudioSessionDeviceRemoved,
/// MEAudioSessionServerShutdown,
/// Sink can also generate this event by itself. In this case, session simply propagates event to the application
/// <para>
MESinkInvalidated = 312,
/// <member name="MEAudioSessionNameChanged">
/// Indicates that the name of the audio session has changed.
/// Sent by the Streaming Audio Renderer Media Sink and forwarded
/// to the application by the Media Session
/// </member>
MEAudioSessionNameChanged = 313,
/// <member name="MEAudioSessionVolumeChanged">
/// Indicates that the volume level has changed.
/// Sent by the Streaming Audio Renderer Media Sink and forwarded
/// to the application by the Media Session
/// </member>
MEAudioSessionVolumeChanged = 314,
/// <member name="MEAudioSessionDeviceRemoved">
/// Indicates that the audio device through which playback had been
/// occurring has been removed.
/// Sent by the Streaming Audio Renderer Media Sink and forwarded
/// to the application by the Media Session
/// </member>
MEAudioSessionDeviceRemoved = 315,
/// <member name="MEAudioSessionServerShutdown">
/// Indicates that the audio service on the machine has been shutdown.
/// Sent by the Streaming Audio Renderer Media Sink and forwarded
/// to the application by the Media Session
/// </member>
MEAudioSessionServerShutdown = 316,
/// <member name="MEAudioSessionGroupingParamChanged">
/// Indicates that the audio session grouping parameters have changed.
/// </member>
MEAudioSessionGroupingParamChanged = 317,
/// <member name="MEAudioSessionIconChanges">
/// Indicates that the audio session icon has changed.
/// </member>
MEAudioSessionIconChanged = 318,
/// <member name="MEAudioSessionFormatChanged">
/// Indicates that the audio session format has changed.
/// </member>
MEAudioSessionFormatChanged = 319,
/// <member name="MEAudioSessionDisconnected">
/// Indicates that the audio session was disconnected.
/// </member>
MEAudioSessionDisconnected = 320,
/// <member name="MEAudioSessionExclusiveModeOverride">
/// Indicates that the audio session was pre-empted by an exclusive mode client.
/// </member>
MEAudioSessionExclusiveModeOverride = 321,
/// <member name="MESinkV1Anchor">
/// Last source event for v1. Do not add or remove events above this one.
/// </member>
MESinkV1Anchor = MEAudioSessionExclusiveModeOverride,
//-------------------------------------------------------------------------
// Trust Authority events:
// Events of interest to IMFInputTrustAuthority and IMFTrustedOutput
// implementations
//-------------------------------------------------------------------------
/// <member name="METrustUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
METrustUnknown = 400,
/// <member name="MEPolicyChanged">
/// All trusted outputs must handle this event, which describes
/// the new output policy that must be enforced.
/// For transforms, the event will come through
/// IMFTransform::ProcessInput.
/// For Media Sinks, it will come through IMFStreamSink::PlaceMarker.
/// The component should handle the new policy or return
/// MF_E_POLICY_UNSUPPORTED either synchronously or
/// asynchronously on the MEPolicyError event
/// Value:
/// VT_UNKNOWN
/// IMFOutputPolicy * describing the new output policy
/// </member>
MEPolicyChanged = 401,
/// <member name="MEContentProtectionMessage">
/// All trusted outputs must handle this event, which carries a message
/// specific to the output policy already in use.
/// For transforms, the event will come through
/// IMFTransform::ProcessInput.
/// For Media Sinks, it will come through IMFStreamSink::PlaceMarker.
/// The component should handle the new policy or return
/// MF_E_POLICY_UNSUPPORTED either synchronously or
/// asynchronously on the MEPolicyError event
/// Value/Attributes:
/// [Event data is protection-system-specific]
/// </member>
MEContentProtectionMessage = 402,
/// <member name="MEPolicySet">
/// Any Stream Sink that provides an IMFOutputTrustAuthority that
/// sets policy asynchronously should return MF_S_WAIT_FOR_POLICY_SET
/// from IMFOutputTrustAuthority::SetPolicy and send this event
/// when the policy has been set.
/// </member>
MEPolicySet = 403,
/// <member name="METrustV1Anchor">
/// Last trust event for v1. Do not add or remove events above this one.
/// </member>
METrustV1Anchor = MEPolicySet,
//
// MEPolicyError
// Sent by any trusted component when an error is encountered enforcing
// the required content protection policy.
// This event is forwarded to the application by the Media Session.
// This event is described in the "Media Session events" section above.
//
//
// MEPolicyReport
// Sent by any trusted output to report on how the content protection
// system is being applied.
// This event is forwarded to the application by the Media Session.
// This event is described in the "Media Session events" section above.
//
//
// MEEnablerProgress
// Sent by the Input Trust Authority's IMFContentEnabler implementation.
// This event is described in the "Media Session events" section above
//
//
// MEEnablerCompleted
// Sent by the Input Trust Authority's IMFContentEnabler implementation.
// This event is described in the "Media Session events" section above
//
//-------------------------------------------------------------------------
// WMDRM events:
// Events of interest to applications using the Windows Media Digital
// Rights Management (IWMDRMxxx) interfaces
//-------------------------------------------------------------------------
/// <member name="MEWMDRMLicenseBackupCompleted">
/// Sent by IWMDRMLicenseManagement
/// Value:
/// VT_UNKNOWN
/// IWMDRMLicenseBackupRestoreStatus *
/// </member>
MEWMDRMLicenseBackupCompleted = 500,
/// <member name="MEWMDRMLicenseBackupProgress">
/// Sent by IWMDRMLicenseManagement
/// Value:
/// VT_UNKNOWN
/// IWMDRMLicenseBackupRestoreStatus *
/// </member>
MEWMDRMLicenseBackupProgress = 501,
/// <member name="MEWMDRMLicenseRestoreCompleted">
/// Sent by IWMDRMLicenseManagement
/// Value:
/// VT_UNKNOWN
/// IWMDRMLicenseBackupRestoreStatus *
/// </member>
MEWMDRMLicenseRestoreCompleted = 502,
/// <member name="MEWMDRMLicenseRestoreProgress">
/// Sent by IWMDRMLicenseManagement
/// Value:
/// VT_UNKNOWN
/// IWMDRMLicenseBackupRestoreStatus *
/// </member>
MEWMDRMLicenseRestoreProgress = 503,
/// <member name="MEWMDRMLicenseAcquisitionCompleted">
/// Sent by IWMDRMLicenseManagement
/// </member>
MEWMDRMLicenseAcquisitionCompleted = 506,
/// <member name="MEWMDRMIndividualizationCompleted">
/// Sent by IWMDRMSecurity
/// Value:
/// VT_UNKNOWN
/// IWMDRMIndividualizationStatus
/// </member>
MEWMDRMIndividualizationCompleted = 508,
/// <member name="MEWMDRMIndividualizationProgress">
/// Sent by IWMDRMSecurity
/// Value:
/// VT_UNKNOWN:
/// IWMDRMIndividualizationStatus
/// </member>
MEWMDRMIndividualizationProgress = 513,
/// <member name="MEWMDRMProximityCompleted">
/// Sent by IWMDRMNetReceiver
/// </member>
MEWMDRMProximityCompleted = 514,
/// <member name="MEWMDRMLicenseStoreCleaned">
/// Sent by IWMDRMLicenseManagement
/// </member>
MEWMDRMLicenseStoreCleaned = 515,
/// <member name="MEWMDRMRevocationDownloadCompleted">
/// Sent by IWMDRMSecurity
/// </member>
MEWMDRMRevocationDownloadCompleted = 516,
/// <member name="MEWMDRMV1Anchor">
/// Last WMDRM event for v1. Do not add or remove events above this one.
/// </member>
MEWMDRMV1Anchor = MEWMDRMRevocationDownloadCompleted,
#if (WINVER >= _WIN32_WINNT_WIN7)
//-------------------------------------------------------------------------
// MF Transform events:
// Events sent by asynchronous IMFTransforms.
//-------------------------------------------------------------------------
/// <member name="METransformUnknown">
/// Unknown event type. Do not use for legitimate events.
/// </member>
METransformUnknown = 600,
/// <member name="METransformNeedInput">
/// Asynchronous transforms send this event when they need another
/// call to IMFTransform::ProcessInput. Callers should respond to
/// each such event by calling ProcessInput once.
/// Attributes:
/// MF_EVENT_MFT_INPUT_STREAM_ID:
/// This value should be the dwInputStreamID argument for the call
/// to ProcessInput
/// </member>
METransformNeedInput,
/// <member name="METransformHaveOutput">
/// Asynchronous transforms send this event when an output sample
/// becomes available. Callers should respond to each such event by
/// calling ProcessOutput once to pick up the sample.
/// </member>
METransformHaveOutput,
/// <member name="METransformDrainComplete">
/// Asynchronous transforms send this event after sending the final
/// METransformHaveOutput while executing a drain command.
/// Attributes:
/// MF_EVENT_MFT_CONTEXT:
/// This value corresponds to the value of ulParam that was
/// specified in the ProcessMessage call for
/// MFT_MESSAGE_COMMAND_DRAIN, which is the index of the input
/// stream for which the drain was requested.
/// </member>
METransformDrainComplete,
/// <member name="METransformMarker">
/// Asynchronous transforms send this event after receiving an
/// MFT_MESSAGE_COMMAND_MARKER command and queueing
/// METransformHaveOutput events for all outputs that will be produced
/// given the inputs received up until the command.
/// MF_EVENT_MFT_CONTEXT:
/// This value corresponds to the value of ulParam that was
/// specified in the ProcessMessage call for
/// MFT_MESSAGE_COMMAND_MARKER and can be used by the caller to
/// identify the marker.
/// </member>
METransformMarker,
#endif // (WINVER >= _WIN32_WINNT_WIN7)
//-------------------------------------------------------------------------
// MF reserves a range of events for internal and future use
//-------------------------------------------------------------------------
/// <member name="MEReservedMax">
/// All event type codes up to and including this value are
/// reserved.
/// </member>
MEReservedMax = 10000,
};
typedef DWORD MediaEventType;
[
object,
uuid(DF598932-F10C-4E39-BBA2-C308F101DAA3)
]
interface IMFMediaEvent : IMFAttributes
{
/// <summary>
/// Retrieves the event type.
/// </summary>
/// <param name="pmet">
/// Out parameter that will receive the event type.
/// Common MF event types are listed in the MediaEventType
/// enumerated type, but other types are possible.
/// </param>
HRESULT GetType(
[out] MediaEventType* pmet
);
/// <summary>
/// Retrieves the event's extended type.
/// This is for use with events of the MEExtendedType type
/// </summary>
/// <param name="pguidExtendedType">
/// Out parameter that will receive the extended type
/// </param>
HRESULT GetExtendedType(
[out] GUID* pguidExtendedType
);
/// <summary>
/// Retrieves the status code for this event.
/// For example, an event such as MESessionTopologySet that signals
/// the completion of an asynchronous operation can return a failure
/// code if the operation failed.
/// </summary>
/// <param name="phrStatus">
/// Out param that will receive the HRESULT status code
/// </param>
HRESULT GetStatus(
[out] HRESULT* phrStatus
);
/// <summary>
/// Retrieves extra data for the event
/// </summary>
/// <param>
/// Out param that will receive the extra data.
/// The meaning of this value is event-specific.
/// Some events have no extra data.
/// </param>
HRESULT GetValue(
[out] PROPVARIANT *pvValue
);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
cpp_quote( "#define MF_EVENT_FLAG_NO_WAIT 0x00000001" )
interface IMFRemoteAsyncCallback;
[
object,
uuid(2CD0BD52-BCD5-4B89-B62C-EADC0C031E7D)
]
interface IMFMediaEventGenerator : IUnknown
{
/// <summary>
/// Synchronous method for retrieving events
/// </summary>
/// <param name="dwFlags">
/// The following bits may be set:
/// MF_EVENT_FLAG_NO_WAIT:
/// If set, then GetEvent will return a failure code
/// immediately if no event is available at the time.
/// Otherwise, this call will block until an event
/// is ready
/// </param>
/// <param name="ppEvent">
/// Out param that will receive an event
/// </param>
HRESULT GetEvent(
[in] DWORD dwFlags,
[out] IMFMediaEvent** ppEvent
);
/// <summary>
/// Asynchronous method for retrieving events
/// </summary>
/// <param name="pCallback">
/// Callback that will be invoked when an event is available
/// </param>
/// <param name="punkState">
/// Pointer to state that will be given to pCallback->Invoke()
/// when it is called
/// </param>
/// <remarks>
/// When this call is being made to a Media Event Generator in a remote
/// process, this call will be proxied via RemoteBeginGetEvent.
/// </remarks>
[local]
HRESULT BeginGetEvent(
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState
);
/// <summary>
/// This method is used to proxy BeginGetEvent calls
/// to a Media Event Generator in a remote process.
/// Media Event Generators do not need to implement this method.
/// </summary>
/// <remarks>
/// This call will result in a call to
/// IMFMediaEventGenerator::BeginGetEvent on the remote Media Event
/// Generator
/// </remarks>
[call_as(BeginGetEvent)]
HRESULT RemoteBeginGetEvent(
[in] IMFRemoteAsyncCallback* pCallback
);
/// <summary>
/// Method for completing asynchronous event retrieval.
/// This method can be called to obtain the event after
/// the callback specified in BeginGetEvent is invoked
/// </summary>
/// <param name="pResult">
/// This should be the pResult value that was passed as a parameter
/// to IMFAsyncCallback::Invoke().
/// </param>
/// <param name="ppEvent">
/// Out param that will receive the event.
/// </param>
/// <remarks>
/// When this call is being made to a Media Event Generator in a remote
/// process, this call will be proxied via RemoteEndGetEvent.
/// </remarks>
[local]
HRESULT EndGetEvent(
[in] IMFAsyncResult* pResult,
[out, annotation("__out")] IMFMediaEvent** ppEvent
);
/// <summary>
/// This method is used to proxy EndGetEvent calls
/// to a Media Event Generator in a remote process.
/// Media Event Generators do not need to implement this method.
/// </summary>
/// <remarks>
/// This call will result in a call to
/// IMFMediaEventGenerator::EndGetEvent on the remote Media Event
/// Generator
/// </remarks>
[call_as(EndGetEvent)]
HRESULT RemoteEndGetEvent(
[in] IUnknown * pResult,
[out] DWORD * pcbEvent,
[out, size_is(, *pcbEvent)] BYTE ** ppbEvent
);
/// <summary>
/// This method is used to queue an event on the Media Event
/// Generator. It can later be retrieved via the methods above.
/// </summary>
/// <param name="met">
/// Event type.
/// Common MF event types are listed in the MediaEventType enum,
/// but other values are possible.
/// </param>
/// <param name="guidExtendedType">
/// Extended type for the event
/// </param>
/// <param name="hrStatus">
/// Status code for the event
/// </param>
/// <param name="pvValue">
/// Optional pointer to extra data for the event
/// </param>
HRESULT QueueEvent(
[in] MediaEventType met,
[in] REFGUID guidExtendedType,
[in] HRESULT hrStatus,
[in, unique] const PROPVARIANT * pvValue
);
}
[
object,
uuid(a27003d0-2354-4f2a-8d6a-ab7cff15437e),
]
/// <summary>
/// Remote async callback function for use with
/// IMFMediaEventGenerator::RemoteBeginGetEvent.
/// Media Foundation applications need not implement this interface.
/// </summary>
interface IMFRemoteAsyncCallback : IUnknown
{
HRESULT Invoke(
[in] HRESULT hr,
[in] IUnknown * pRemoteResult);
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef enum _MFBYTESTREAM_SEEK_ORIGIN
{
msoBegin,
msoCurrent
} MFBYTESTREAM_SEEK_ORIGIN;
[
object,
uuid(ad4c1b00-4bf7-422f-9175-756693d9130d),
]
interface IMFByteStream : IUnknown
{
HRESULT GetCapabilities(
[out] DWORD* pdwCapabilities
);
/// <summary>
/// GetLength gets the length of the stream
/// </summary>
/// <param name="pqwLength">
/// Pointer to a variable that will receive the length of the stream.
/// </param>
/// <returns>
/// <para>
/// MF_E_BYTESTREAM_UNKNOWN_LENGTH:
/// The stream length is unknown (can happen in HTTP scenarios)
/// </para>
/// </returns>
HRESULT GetLength(
[out] QWORD* pqwLength
);
HRESULT SetLength(
[in] QWORD qwLength
);
HRESULT GetCurrentPosition(
[out] QWORD* pqwPosition
);
HRESULT SetCurrentPosition(
[in] QWORD qwPosition
);
HRESULT IsEndOfStream(
[out] BOOL* pfEndOfStream
);
/// <summary>
/// Read number of bytes from bytestream. Local only
/// </summary>
[local]
HRESULT Read(
[in, annotation("__out_bcount_part(cb, *pcbRead)")] BYTE* pb,
[in] ULONG cb,
[out, annotation("__out")] ULONG* pcbRead
);
/// <summary>
/// Begin async read number of bytes from bytestream. Local only
/// </summary>
[local]
HRESULT BeginRead(
[in, annotation("__out_bcount(cb)")] BYTE* pb,
[in] ULONG cb,
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState
);
/// <summary>
/// Complete async read operation. Local only
/// </summary>
[local]
HRESULT EndRead(
[in] IMFAsyncResult* pResult,
[out, annotation("__out")] ULONG* pcbRead
);
/// <summary>
/// Write number of bytes to bytestream. Local only
/// </summary>
[local]
HRESULT Write(
[in, annotation("__in_bcount(cb)")] const BYTE* pb,
[in] ULONG cb,
[out, annotation("__out __deref_out_range(<=, cb)")] ULONG* pcbWritten
);
/// <summary>
/// Begin async write operation. Local only
/// </summary>
[local]
HRESULT BeginWrite(
[in, annotation("__in_bcount(cb)")] const BYTE* pb,
[in] ULONG cb,
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState
);
/// <summary>
/// Complete async write operation. Local only
/// </summary>
[local]
HRESULT EndWrite(
[in] IMFAsyncResult* pResult,
[out, annotation("__out")] ULONG* pcbWritten
);
/// <summary>
/// Seek to location in bytestream. Local only
/// </summary>
[local]
HRESULT Seek(
[in] MFBYTESTREAM_SEEK_ORIGIN SeekOrigin,
[in] LONGLONG llSeekOffset,
[in] DWORD dwSeekFlags,
[out, annotation("__out_opt")] QWORD* pqwCurrentPosition
);
HRESULT Flush();
HRESULT Close();
};
//
// Capabilities flags (from IMFByteStream::GetCapabilities)
//
/// <summary>
/// This bit indicates that the byte stream can be read from.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_READABLE 0x00000001" )
/// <summary>
/// This bit indicates that the byte stream can be written to.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_WRITABLE 0x00000002" )
/// <summary>
/// This bit indicates that the byte stream can be sought.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_SEEKABLE 0x00000004" )
/// <summary>
/// This bit indicates that the byte stream is based on a remote (network)
/// drive.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_REMOTE 0x00000008" )
/// <summary>
/// This bit indicates that the byte stream is a directory.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_DIRECTORY 0x00000080" )
/// <summary>
/// This bit indicates that a read operation following a seek operation
/// may take a long time to complete depending on whether the byte stream
/// has to wait for the data to become available from a remote server or not.
/// This capability is exposed by byte streams that pre-cache the data
/// sequentially from a remote server. This bit goes away when the data is
/// fully cached.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_HAS_SLOW_SEEK 0x00000100" )
/// <summary>
/// This bit indicates that the byte stream is downloading the data
/// in the background to a local cache. In this case a read operation may
/// take longer to complete depending on whether the byte stream has the
/// data in cache or not. If MFBYTESTREAM_HAS_SLOW_SEEK is not present,
/// then the byte stream can pre-cache the data sparsely instead of
/// sequentially, and a read operation that misses the local cache
/// will cause a reconnection to the remote server instead of waiting
/// for the sequential download to catch up. This bit goes away when the
/// data is fully cached.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_IS_PARTIALLY_DOWNLOADED 0x00000200" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
/// <summary>
/// This bit indicates that the byte stream data is opened for write by
/// another thread or process. This means that the length of the
/// bytestream could change and special care must be taken to handle
/// situations where only part of a file may be written. Only byte
/// stream plugins with the attribute MF_BYTESTREAMPLUGIN_ACCEPTS_SHARE_WRITE
/// will be considered by the source resolver for byte streams that have this
/// characteristic.
/// </summary>
cpp_quote( "#define MFBYTESTREAM_SHARE_WRITE 0x00000400" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
//
// Seek flags (see IMFByteStream::Seek)
//
cpp_quote( "#define MFBYTESTREAM_SEEK_FLAG_CANCEL_PENDING_IO 0x00000001" )
//
// Byte Stream attributes (query the Byte Stream for IMFAttributes)
//
// MF_BYTESTREAM_ORIGIN_NAME
// Data type: LPWSTR
// {FC358288-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_ORIGIN_NAME, 0xfc358288, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
// MF_BYTESTREAM_CONTENT_TYPE
// Data type: LPWSTR
// {FC358289-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_CONTENT_TYPE, 0xfc358289, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
// MF_BYTESTREAM_DURATION
// Data type: int64
// Duration in 100ns units of the presentation. This attribute is optional.
// {FC35828A-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_DURATION, 0xfc35828a, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
// MF_BYTESTREAM_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.
// {FC35828B-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_LAST_MODIFIED_TIME, 0xfc35828b, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
// MF_BYTESTREAM_IFO_FILE_URI
// Data type: LPWSTR
// The URL to the IFO file specified by the HTTP server on the "Pragma: ifoFileURI.dlna.org" HTTP header, if any
// {FC35828C-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_IFO_FILE_URI, 0xfc35828c, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
// MF_BYTESTREAM_DLNA_PROFILE_ID
// Data type: LPWSTR
// The DLNA Profile ID of the content that is being downloaded.
// {FC35828D-3CB6-460C-A424-B6681260375A}
cpp_quote( "EXTERN_GUID( MF_BYTESTREAM_DLNA_PROFILE_ID, 0xfc35828d, 0x3cb6, 0x460c, 0xa4, 0x24, 0xb6, 0x68, 0x12, 0x60, 0x37, 0x5a);" )
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")
//
// File access modes for the file creation functions (MFCreateFile and related
// functions in mfapi.h).
// Regardless of the access mode with which the file is opened, the sharing
// permissions will allow shared reading and deleting.
//
typedef enum
{
MF_ACCESSMODE_READ = 1,
MF_ACCESSMODE_WRITE = 2,
MF_ACCESSMODE_READWRITE = 3,
} MF_FILE_ACCESSMODE;
typedef enum
{
MF_OPENMODE_FAIL_IF_NOT_EXIST = 0,
MF_OPENMODE_FAIL_IF_EXIST = 1,
MF_OPENMODE_RESET_IF_EXIST = 2,
MF_OPENMODE_APPEND_IF_EXIST = 3,
MF_OPENMODE_DELETE_IF_EXIST = 4,
} MF_FILE_OPENMODE;
typedef enum
{
MF_FILEFLAGS_NONE = 0x00000000,
MF_FILEFLAGS_NOBUFFERING = 0x00000001,
#if (WINVER >= _WIN32_WINNT_WIN7)
MF_FILEFLAGS_ALLOW_WRITE_SHARING = 0x00000002,
#endif // (WINVER >= _WIN32_WINNT_WIN7)
} MF_FILE_FLAGS;
///////////////////////////////////////////////////////////////////////////////
//
// Other Media Foundation abstractions
//
///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
[
object,
uuid(5BC8A76B-869A-46a3-9B03-FA218A66AEBE)
]
interface IMFCollection : IUnknown
{
HRESULT GetElementCount(
[out] DWORD* pcElements
);
HRESULT GetElement(
[in] DWORD dwElementIndex,
[out] IUnknown** ppUnkElement
);
HRESULT AddElement(
[in] IUnknown* pUnkElement
);
HRESULT RemoveElement(
[in] DWORD dwElementIndex,
[out] IUnknown **ppUnkElement
);
HRESULT InsertElementAt(
[in] DWORD dwIndex, [in]
IUnknown* pUnknown );
HRESULT RemoveAllElements();
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
[
object,
uuid(36f846fc-2256-48b6-b58e-e2b638316581),
local
]
/// <summary>
/// MFCreateEventQueue instantiates an object that implements this
/// interface. This object can be used by components that need to
/// provide IMFMediaEventGenerator functionality to help with the
/// mechanics of event-queueing.
/// When the caller makes an IMFMediaEventGenerator call, the component
/// should just forward that call to the appropriate method of the
/// Media Event Queue object.
/// When the component wishes to send an event to the caller, it can
/// do so using the QueueEventXXX methods on the Media Event Queue object.
/// </summary>
interface IMFMediaEventQueue : IUnknown
{
/// <summary>
/// Media Event Generator components that use the Media Event Queue
/// object should just forward IMFMediaEventGenerator::GetEvent
/// calls to this method on the Media Event Queue.
/// See IMFMediaEventGenerator::GetEvent parameter descriptions.
/// </summary>
HRESULT GetEvent(
[in] DWORD dwFlags,
[out, annotation("__out")] IMFMediaEvent** ppEvent
);
/// <summary>
/// Media Event Generator components that use the Media Event Queue
/// object should just forward IMFMediaEventGenerator::BeginGetEvent
/// calls to this method on the Media Event Queue.
/// See IMFMediaEventGenerator::BeginGetEvent parameter descriptions.
/// </summary>
HRESULT BeginGetEvent(
[in] IMFAsyncCallback* pCallback,
[in] IUnknown* punkState
);
/// <summary>
/// Media Event Generator components that use the Media Event Queue
/// object should just forward IMFMediaEventGenerator::EndGetEvent
/// calls to this method on the Media Event Queue.
/// See IMFMediaEventGenerator::EndGetEvent parameter descriptions.
/// </summary>
HRESULT EndGetEvent(
[in] IMFAsyncResult* pResult,
[out, annotation("__out")] IMFMediaEvent** ppEvent
);
/// <summary>
/// Queues the specified event on the Media Event Queue object.
/// This event will be retrievable using Begin/EndGetEvent or
/// GetEvent
/// </summary>
/// <param name="pEvent">
/// Pointer to the Media Event object to queue
/// </param>
HRESULT QueueEvent(
[in] IMFMediaEvent * pEvent );
/// <summary>
/// Queues an event with the specified event data on the Media Event
/// Queue object.
/// This event will be retrievable using Begin/EndGetEvent or
/// GetEvent
/// </summary>
/// <param name="met">
/// Event type
/// </param>
/// <param name="guidExtendedType">
/// Extended event type
/// </param>
/// <param name="hrStatus">
/// Event status
/// </param>
/// <param name="pvValue">
/// Event value
/// </param>
HRESULT QueueEventParamVar(
[in] MediaEventType met,
[in] REFGUID guidExtendedType,
[in] HRESULT hrStatus,
[in, unique] const PROPVARIANT * pvValue );
/// <summary>
/// Queues an event with the specified event data on the Media Event
/// Queue object.
/// This event will be retrievable using Begin/EndGetEvent or
/// GetEvent
/// </summary>
/// <param name="met">
/// Event type
/// </param>
/// <param name="guidExtendedType">
/// Extended event type
/// </param>
/// <param name="hrStatus">
/// Event status
/// </param>
/// <param name="pUnk">
/// Event value, specified as an IUnknown *
/// </param>
HRESULT QueueEventParamUnk(
[in] MediaEventType met,
[in] REFGUID guidExtendedType,
[in] HRESULT hrStatus,
[in, unique] IUnknown * pUnk );
/// <summary>
/// Shutdown must be called when the component is done using the
/// Media Event Queue object to break circular references and
/// prevent memory leaks.
/// </summary>
HRESULT Shutdown();
}
///////////////////////////////////////////////////////////////////////////////
[
object,
uuid(7FEE9E9A-4A89-47a6-899C-B6A53A70FB67),
helpstring("IMFActivate Interface"),
pointer_default(unique)
]
/// <summary>
/// The IMFActivate interface is a base interface for Activate objects.
/// An Activate object is a helper object which creates and keeps a pointer to the real object.
/// MF pipeline uses activate objects instead of real objects in partial topologies.
/// The ActivateObject(...) method should always return the same instance of the object until either
/// ShutdownObject() or DetachObject() is called, then it can create a new instance.
/// </summary>
interface IMFActivate : IMFAttributes
{
/// <summary>
/// Creates the object that this activate represents.
/// The ActivateObject(...) method should always return the same instance of the object
/// until either ShutdownObject() or DetachObject() is called.
/// </summary>
/// <param name="riid">
/// The interface ID that the requested object will be QI'ed for
/// </param>
/// <param name="ppv">
/// Will contain the requested interface
/// </param>
HRESULT ActivateObject(
[in] REFIID riid,
[out, iid_is(riid), retval] void ** ppv);
/// <summary>
/// Shuts down the internal represented object
/// (that is returned on ActivateObject(...))
/// and then releases all references to it.
/// </summary>
HRESULT ShutdownObject();
/// <summary>
/// Releases all references to the internal represented
/// object (without shutting it down.)
/// If this action is not supported, E_NOTIMPL should be returned.
/// </summary>
HRESULT DetachObject();
};
///////////////////////////////////////////////////////////////////////////////
cpp_quote("#if (WINVER >= _WIN32_WINNT_WIN7) ")
//
// List IDs for IMFPluginControl
//
typedef enum _MF_Plugin_Type {
MF_Plugin_Type_MFT = 0,
MF_Plugin_Type_MediaSource = 1
} MF_Plugin_Type;
[
object,
local,
uuid(5c6c44bf-1db6-435b-9249-e8cd10fdec96),
helpstring("IMFPluginControl Interface"),
pointer_default(unique)
]
/// <summary>
/// The IMFPluginControl interface returns information about preferred and 'don't use' objects
// The preferred/don't use status of objects can be added to or overridden
/// </summary>
interface IMFPluginControl : IUnknown
{
/// <summary>
/// Gets the CLSID of an object given a particular selection string (CLSID or file extension or mime type)
/// </summary>
/// <param name="ListId">
/// ID of list being searched
/// </param>
/// <param name="pSelector">
/// String representing selector being used to find object
/// </param>
/// <param name="clsid">
/// Class ID of object meeting selection criteria
/// </param>
/// <returns>
/// S_OK - entry found
/// HRESULT_FROM_WIN32(ERROR_NOT_FOUND) - entry not present
/// Other failure code - something failed when checking the list
/// </returns>
HRESULT GetPreferredClsid(
DWORD pluginType,
[annotation("__in")] LPCWSTR selector,
[annotation("__out")] CLSID *clsid
);
/// <summary>
/// Gets the selector by index in the list
/// </summary>
/// <param name="ListId">
/// ID of list being searched
/// </param>
/// <param name="Index">
/// 0-based index
/// </param>
/// <param name="ppSelector">
/// String representing selector being used to find object
/// </param>
/// <param name="pclsid">
/// Class ID of object meeting selectionc criteria
/// </param>
HRESULT GetPreferredClsidByIndex(
DWORD pluginType,
DWORD index,
[annotation("__out")] LPWSTR *selector,
[annotation("__out")] CLSID *clsid
);
/// <summary>
/// Sets the CLSID of an object given a particular selection string (CLSID or file extension or mime type)
/// </summary>
/// <param name="pluginType">
/// ID of list being searched
/// </param>
/// <param name="selector">
/// String representing selector being used to find object
/// </param>
/// <param name="clsid">
/// Class ID of object to set preferred - NULL if no preference is to be set for the selector
/// </param>
HRESULT SetPreferredClsid(
DWORD pluginType,
[annotation("__in")] LPCWSTR selector,
[annotation("__in_opt")] const CLSID *clsid
);
/// <summary>
/// Checks if the CLSID is present in the list
/// </summary>
/// <param name="pluginType">
/// Plugin type
/// </param>
/// <param name="clsid">
/// Class ID to search for
/// </param>
/// <returns>
/// S_OK - clsid is disabled
/// HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) - off end of list
/// HRESULT_FROM_WIN32(ERROR_NOT_FOUND) - not disabled
/// Other failure code - failed
/// </returns>
HRESULT IsDisabled(
DWORD pluginType,
REFCLSID clsid
);
/// <summary>
/// Checks if the CLSID is present in the list
/// </summary>
/// <param name="ListId">
/// ID of list being searched
/// </param>
/// <param name="clsid">
/// Disabled Class ID
/// </param>
/// <returns>
/// S_OK - entry found - returned clsid is disabled
///
/// </returns>
HRESULT GetDisabledByIndex(
DWORD pluginType,
DWORD index,
[annotation("__out")] CLSID *clsid
);
/// <summary>
/// Sets the disabled state for a CLSID
/// </summary>
/// <param name="ListId">
/// ID of list being searched
/// </param>
/// <param name="clsid">
/// Class ID to search for
/// </param>
/// <param name="disabled">
/// TRUE to disable, FALSE to enable
/// </param>
HRESULT SetDisabled(
DWORD pluginType,
REFCLSID clsid,
BOOL disabled
);
}
cpp_quote("#endif // (WINVER >= _WIN32_WINNT_WIN7) ")