/*** Autogenerated by WIDL 3.20 from include/wmcontainer.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wmcontainer_h__
#define __wmcontainer_h__

/* Forward declarations */

#ifndef __IMFASFContentInfo_FWD_DEFINED__
#define __IMFASFContentInfo_FWD_DEFINED__
typedef interface IMFASFContentInfo IMFASFContentInfo;
#ifdef __cplusplus
interface IMFASFContentInfo;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFMutualExclusion_FWD_DEFINED__
#define __IMFASFMutualExclusion_FWD_DEFINED__
typedef interface IMFASFMutualExclusion IMFASFMutualExclusion;
#ifdef __cplusplus
interface IMFASFMutualExclusion;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFStreamPrioritization_FWD_DEFINED__
#define __IMFASFStreamPrioritization_FWD_DEFINED__
typedef interface IMFASFStreamPrioritization IMFASFStreamPrioritization;
#ifdef __cplusplus
interface IMFASFStreamPrioritization;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFSplitter_FWD_DEFINED__
#define __IMFASFSplitter_FWD_DEFINED__
typedef interface IMFASFSplitter IMFASFSplitter;
#ifdef __cplusplus
interface IMFASFSplitter;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFMultiplexer_FWD_DEFINED__
#define __IMFASFMultiplexer_FWD_DEFINED__
typedef interface IMFASFMultiplexer IMFASFMultiplexer;
#ifdef __cplusplus
interface IMFASFMultiplexer;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFIndexer_FWD_DEFINED__
#define __IMFASFIndexer_FWD_DEFINED__
typedef interface IMFASFIndexer IMFASFIndexer;
#ifdef __cplusplus
interface IMFASFIndexer;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFStreamSelector_FWD_DEFINED__
#define __IMFASFStreamSelector_FWD_DEFINED__
typedef interface IMFASFStreamSelector IMFASFStreamSelector;
#ifdef __cplusplus
interface IMFASFStreamSelector;
#endif /* __cplusplus */
#endif

#ifndef __IMFDRMNetHelper_FWD_DEFINED__
#define __IMFDRMNetHelper_FWD_DEFINED__
typedef interface IMFDRMNetHelper IMFDRMNetHelper;
#ifdef __cplusplus
interface IMFDRMNetHelper;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFProfile_FWD_DEFINED__
#define __IMFASFProfile_FWD_DEFINED__
typedef interface IMFASFProfile IMFASFProfile;
#ifdef __cplusplus
interface IMFASFProfile;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFStreamConfig_FWD_DEFINED__
#define __IMFASFStreamConfig_FWD_DEFINED__
typedef interface IMFASFStreamConfig IMFASFStreamConfig;
#ifdef __cplusplus
interface IMFASFStreamConfig;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <mfidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_FILE_ID, 0x3de649b4, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_CREATION_TIME, 0x3de649b6, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_FLAGS, 0x3de649bb, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_MAX_PACKET_SIZE, 0x3de649bd, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_MAX_BITRATE, 0x3de649be, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_MIN_PACKET_SIZE, 0x3de649bc, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_PACKETS, 0x3de649b7, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_PLAY_DURATION, 0x3de649b8, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_PREROLL, 0x3de649ba, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(MF_PD_ASF_FILEPROPERTIES_SEND_DURATION, 0x3de649b9, 0xd76d, 0x4e66, 0x9e, 0xc9, 0x78, 0x12, 0xf, 0xb4, 0xc7, 0xe3);
EXTERN_GUID(CLSID_WMDRMSystemID, 0x8948BB22, 0x11BD, 0x4796, 0x93, 0xE3, 0x97, 0x4D, 0x1B, 0x57, 0x56, 0x78);
EXTERN_GUID(MF_PD_ASF_CONTENTENCRYPTION_KEYID, 0x8520fe3e, 0x277e, 0x46ea, 0x99, 0xe4, 0xe3, 0xa, 0x86, 0xdb, 0x12, 0xbe);
EXTERN_GUID(MF_PD_ASF_CONTENTENCRYPTION_LICENSE_URL, 0x8520fe40, 0x277e, 0x46ea, 0x99, 0xe4, 0xe3, 0xa, 0x86, 0xdb, 0x12, 0xbe);
EXTERN_GUID(MF_PD_ASF_CONTENTENCRYPTION_SECRET_DATA, 0x8520fe3f, 0x277e, 0x46ea, 0x99, 0xe4, 0xe3, 0xa, 0x86, 0xdb, 0x12, 0xbe);
EXTERN_GUID(MF_PD_ASF_CONTENTENCRYPTION_TYPE, 0x8520fe3d, 0x277e, 0x46ea, 0x99, 0xe4, 0xe3, 0xa, 0x86, 0xdb, 0x12, 0xbe);
EXTERN_GUID(MF_PD_ASF_CONTENTENCRYPTIONEX_ENCRYPTION_DATA, 0x62508be5, 0xecdf, 0x4924, 0xa3, 0x59, 0x72, 0xba, 0xb3, 0x39, 0x7b, 0x9d);
EXTERN_GUID(MF_PD_ASF_LANGLIST, 0xf23de43c, 0x9977, 0x460d, 0xa6, 0xec, 0x32, 0x93, 0x7f, 0x16, 0xf, 0x7d);
EXTERN_GUID(MF_PD_ASF_MARKER, 0x5134330e, 0x83a6, 0x475e, 0xa9, 0xd5, 0x4f, 0xb8, 0x75, 0xfb, 0x2e, 0x31);
EXTERN_GUID(MF_PD_ASF_SCRIPT, 0xe29cd0d7, 0xd602, 0x4923, 0xa7, 0xfe, 0x73, 0xfd, 0x97, 0xec, 0xc6, 0x50);
EXTERN_GUID(MF_PD_ASF_CODECLIST, 0xe4bb3509, 0xc18d, 0x4df1, 0xbb, 0x99, 0x7a, 0x36, 0xb3, 0xcc, 0x41, 0x19);
EXTERN_GUID(MF_PD_ASF_METADATA_IS_VBR, 0x5fc6947a, 0xef60, 0x445d, 0xb4, 0x49, 0x44, 0x2e, 0xcc, 0x78, 0xb4, 0xc1);
EXTERN_GUID(MF_PD_ASF_METADATA_V8_VBRPEAK, 0x5fc6947b, 0xef60, 0x445d, 0xb4, 0x49, 0x44, 0x2e, 0xcc, 0x78, 0xb4, 0xc1);
EXTERN_GUID(MF_PD_ASF_METADATA_V8_BUFFERAVERAGE, 0x5fc6947c, 0xef60, 0x445d, 0xb4, 0x49, 0x44, 0x2e, 0xcc, 0x78, 0xb4, 0xc1);
EXTERN_GUID(MF_PD_ASF_METADATA_LEAKY_BUCKET_PAIRS, 0x5fc6947d, 0xef60, 0x445d, 0xb4, 0x49, 0x44, 0x2e, 0xcc, 0x78, 0xb4, 0xc1);
EXTERN_GUID(MF_PD_ASF_DATA_START_OFFSET, 0xe7d5b3e7, 0x1f29, 0x45d3, 0x88, 0x22, 0x3e, 0x78, 0xfa, 0xe2, 0x72, 0xed);
EXTERN_GUID(MF_PD_ASF_DATA_LENGTH, 0xe7d5b3e8, 0x1f29, 0x45d3, 0x88, 0x22, 0x3e, 0x78, 0xfa, 0xe2, 0x72, 0xed);
EXTERN_GUID(MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX, 0x48f8a522, 0x305d, 0x422d, 0x85, 0x24, 0x25, 0x2, 0xdd, 0xa3, 0x36, 0x80);
EXTERN_GUID(MF_SD_ASF_EXTSTRMPROP_AVG_DATA_BITRATE, 0x48f8a523, 0x305d, 0x422d, 0x85, 0x24, 0x25, 0x2, 0xdd, 0xa3, 0x36, 0x80);
EXTERN_GUID(MF_SD_ASF_EXTSTRMPROP_AVG_BUFFERSIZE, 0x48f8a524, 0x305d, 0x422d, 0x85, 0x24, 0x25, 0x2, 0xdd, 0xa3, 0x36, 0x80);
EXTERN_GUID(MF_SD_ASF_EXTSTRMPROP_MAX_DATA_BITRATE, 0x48f8a525, 0x305d, 0x422d, 0x85, 0x24, 0x25, 0x2, 0xdd, 0xa3, 0x36, 0x80);
EXTERN_GUID(MF_SD_ASF_EXTSTRMPROP_MAX_BUFFERSIZE, 0x48f8a526, 0x305d, 0x422d, 0x85, 0x24, 0x25, 0x2, 0xdd, 0xa3, 0x36, 0x80);
EXTERN_GUID(MF_SD_ASF_STREAMBITRATES_BITRATE, 0xa8e182ed, 0xafc8, 0x43d0, 0xb0, 0xd1, 0xf6, 0x5b, 0xad, 0x9d, 0xa5, 0x58);
EXTERN_GUID(MF_SD_ASF_METADATA_DEVICE_CONFORMANCE_TEMPLATE, 0x245e929d, 0xc44e, 0x4f7e, 0xbb, 0x3c, 0x77, 0xd4, 0xdf, 0xd2, 0x7f, 0x8a);
EXTERN_GUID(MF_PD_ASF_INFO_HAS_AUDIO, 0x80e62295, 0x2296, 0x4a44, 0xb3, 0x1c, 0xd1, 0x3, 0xc6, 0xfe, 0xd2, 0x3c);
EXTERN_GUID(MF_PD_ASF_INFO_HAS_VIDEO, 0x80e62296, 0x2296, 0x4a44, 0xb3, 0x1c, 0xd1, 0x3, 0xc6, 0xfe, 0xd2, 0x3c);
EXTERN_GUID(MF_PD_ASF_INFO_HAS_NON_AUDIO_VIDEO, 0x80e62297, 0x2296, 0x4a44, 0xb3, 0x1c, 0xd1, 0x3, 0xc6, 0xfe, 0xd2, 0x3c);
#if WINVER >= 0x0601
EXTERN_GUID(MFASFINDEXER_TYPE_TIMECODE, 0x49815231, 0x6bad, 0x44fd, 0x81, 0xa, 0x3f, 0x60, 0x98, 0x4e, 0xc7, 0xfd);
EXTERN_GUID(MF_PD_ASF_LANGLIST_LEGACYORDER, 0xf23de43d, 0x9977, 0x460d, 0xa6, 0xec, 0x32, 0x93, 0x7f, 0x16, 0xf, 0x7d);
#endif

EXTERN_GUID(MFASFMutexType_Bitrate, 0x72178C2C, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
EXTERN_GUID(MFASFMutexType_Language, 0x72178C2B, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
EXTERN_GUID(MFASFMutexType_Presentation, 0x72178C2D, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
EXTERN_GUID(MFASFMutexType_Unknown, 0x72178C2E, 0xE45B, 0x11D5, 0xBC, 0x2A, 0x00, 0xB0, 0xD0, 0xF3, 0xF4, 0xAB);
EXTERN_GUID(MFASFSampleExtension_ContentType, 0xd590dc20, 0x07bc, 0x436c, 0x9c, 0xf7, 0xf3, 0xbb, 0xfb, 0xf1, 0xa4, 0xdc);
EXTERN_GUID(MFASFSampleExtension_Encryption_SampleID, 0x6698B84E, 0x0AFA, 0x4330, 0xAE, 0xB2, 0x1C, 0x0A, 0x98, 0xD7, 0xA4, 0x4D);
EXTERN_GUID(MFASFSampleExtension_Encryption_KeyID, 0x76376591,  0x795f,  0x4da1, 0x86, 0xed, 0x9d, 0x46, 0xec, 0xa1, 0x09, 0xa9);
EXTERN_GUID(MFASFSampleExtension_FileName, 0xe165ec0e, 0x19ed, 0x45d7, 0xb4, 0xa7, 0x25, 0xcb, 0xd1, 0xe2, 0x8e, 0x9b);
EXTERN_GUID(MFASFSampleExtension_OutputCleanPoint, 0xf72a3c6f, 0x6eb4, 0x4ebc, 0xb1, 0x92, 0x9, 0xad, 0x97, 0x59, 0xe8, 0x28);
EXTERN_GUID(MFASFSampleExtension_PixelAspectRatio, 0x1b1ee554, 0xf9ea, 0x4bc8, 0x82, 0x1a, 0x37, 0x6b, 0x74, 0xe4, 0xc4, 0xb8);
EXTERN_GUID(MFASFSampleExtension_SampleDuration, 0xc6bd9450, 0x867f, 0x4907, 0x83, 0xa3, 0xc7, 0x79, 0x21, 0xb7, 0x33, 0xad);
EXTERN_GUID(MFASFSampleExtension_SMPTE, 0x399595ec, 0x8667, 0x4e2d, 0x8f, 0xdb, 0x98, 0x81, 0x4c, 0xe7, 0x6c, 0x1e);
EXTERN_GUID(MFASFSPLITTER_PACKET_BOUNDARY, 0xfe584a05, 0xe8d6, 0x42e3, 0xb1, 0x76, 0xf1, 0x21, 0x17, 0x5, 0xfb, 0x6f);
EXTERN_GUID(MF_ASFPROFILE_MINPACKETSIZE, 0x22587626, 0x47de, 0x4168, 0x87, 0xf5, 0xb5, 0xaa, 0x9b, 0x12, 0xa8, 0xf0);
EXTERN_GUID(MF_ASFPROFILE_MAXPACKETSIZE, 0x22587627, 0x47de, 0x4168, 0x87, 0xf5, 0xb5, 0xaa, 0x9b, 0x12, 0xa8, 0xf0);
EXTERN_GUID(MF_ASFSTREAMCONFIG_LEAKYBUCKET1, 0xc69b5901, 0xea1a, 0x4c9b, 0xb6, 0x92, 0xe2, 0xa0, 0xd2, 0x9a, 0x8a, 0xdd);
EXTERN_GUID(MF_ASFSTREAMCONFIG_LEAKYBUCKET2, 0xc69b5902, 0xea1a, 0x4c9b, 0xb6, 0x92, 0xe2, 0xa0, 0xd2, 0x9a, 0x8a, 0xdd);
#ifndef __IMFASFProfile_FWD_DEFINED__
#define __IMFASFProfile_FWD_DEFINED__
typedef interface IMFASFProfile IMFASFProfile;
#ifdef __cplusplus
interface IMFASFProfile;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFStreamConfig_FWD_DEFINED__
#define __IMFASFStreamConfig_FWD_DEFINED__
typedef interface IMFASFStreamConfig IMFASFStreamConfig;
#ifdef __cplusplus
interface IMFASFStreamConfig;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFMutualExclusion_FWD_DEFINED__
#define __IMFASFMutualExclusion_FWD_DEFINED__
typedef interface IMFASFMutualExclusion IMFASFMutualExclusion;
#ifdef __cplusplus
interface IMFASFMutualExclusion;
#endif /* __cplusplus */
#endif

#ifndef __IMFASFStreamPrioritization_FWD_DEFINED__
#define __IMFASFStreamPrioritization_FWD_DEFINED__
typedef interface IMFASFStreamPrioritization IMFASFStreamPrioritization;
#ifdef __cplusplus
interface IMFASFStreamPrioritization;
#endif /* __cplusplus */
#endif

#define MFASFINDEXER_PER_ENTRY_BYTES_DYNAMIC 0xffff
#define MFASFINDEXER_NO_FIXED_INTERVAL 0xffffffff
#define MFASFINDEXER_READ_FOR_REVERSEPLAYBACK_OUTOFDATASEGMENT 0xffffffffffffffffll
#define MFASFINDEXER_APPROX_SEEK_TIME_UNKNOWN 0xffffffffffffffffll

#define MFASF_MIN_HEADER_BYTES (sizeof (GUID) + sizeof (QWORD))

#define  MFASF_MAX_STREAM_NUMBER 127
#define  MFASF_INVALID_STREAM_NUMBER (MFASF_MAX_STREAM_NUMBER + 1)
#define  MFASF_PAYLOADEXTENSION_MAX_SIZE 0xff
#define  MFASF_PAYLOADEXTENSION_VARIABLE_SIZE 0xffff
#define  MFASF_DEFAULT_BUFFER_WINDOW_MS 3000

typedef enum MFASF_SPLITTERFLAGS {
    MFASF_SPLITTER_REVERSE = 0x1,
    MFASF_SPLITTER_WMDRM = 0x2
} MFASF_SPLITTERFLAGS;
typedef enum ASF_STATUSFLAGS {
    ASF_STATUSFLAGS_INCOMPLETE = 0x1
} ASF_STATUSFLAGS;
typedef enum MFASF_MULTIPLEXERFLAGS {
    MFASF_MULTIPLEXER_AUTOADJUST_BITRATE = 0x1
} MFASF_MULTIPLEXERFLAGS;
typedef enum MFASF_INDEXERFLAGS {
    MFASF_INDEXER_WRITE_NEW_INDEX = 0x1,
    MFASF_INDEXER_READ_FOR_REVERSEPLAYBACK = 0x2,
    MFASF_INDEXER_WRITE_FOR_LIVEREAD = 0x4
} MFASF_INDEXER_FLAGS;
typedef enum MFASF_STREAMSELECTORFLAGS {
    MFASF_STREAMSELECTOR_DISABLE_THINNING = 0x1,
    MFASF_STREAMSELECTOR_USE_AVERAGE_BITRATE = 0x2
} MFASF_STREAMSELECTOR_FLAGS;
typedef enum ASF_SELECTION_STATUS {
    ASF_STATUS_NOTSELECTED = 0,
    ASF_STATUS_CLEANPOINTSONLY = 1,
    ASF_STATUS_ALLDATAUNITS = 2
} ASF_SELECTION_STATUS;
typedef enum _MFSINK_WMDRMACTION {
    MFSINK_WMDRMACTION_UNDEFINED = 0,
    MFSINK_WMDRMACTION_ENCODE = 1,
    MFSINK_WMDRMACTION_TRANSCODE = 2,
    MFSINK_WMDRMACTION_TRANSCRYPT = 3,
    MFSINK_WMDRMACTION_LAST = 3
} MFSINK_WMDRMACTION;

typedef struct ASF_MUX_STATISTICS {
    DWORD cFramesWritten;
    DWORD cFramesDropped;
} ASF_MUX_STATISTICS;
typedef struct _ASF_INDEX_IDENTIFIER {
    GUID guidIndexType;
    WORD wStreamNumber;
} ASF_INDEX_IDENTIFIER;
typedef struct _ASF_INDEX_DESCRIPTOR {
    ASF_INDEX_IDENTIFIER Identifier;
    WORD cPerEntryBytes;
    WCHAR szDescription[32];
    DWORD dwInterval;
} ASF_INDEX_DESCRIPTOR;

/*****************************************************************************
 * IMFASFContentInfo interface
 */
#ifndef __IMFASFContentInfo_INTERFACE_DEFINED__
#define __IMFASFContentInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFContentInfo, 0xb1dca5cd, 0xd5da, 0x4451, 0x8e,0x9e, 0xdb,0x5c,0x59,0x91,0x4e,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b1dca5cd-d5da-4451-8e9e-db5c59914ead")
IMFASFContentInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetHeaderSize(
        IMFMediaBuffer *pIStartOfContent,
        QWORD *cbHeaderSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseHeader(
        IMFMediaBuffer *pIHeaderBuffer,
        QWORD cbOffsetWithinHeader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GenerateHeader(
        IMFMediaBuffer *pIHeader,
        DWORD *pcbHeader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProfile(
        IMFASFProfile **ppIProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProfile(
        IMFASFProfile *pIProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE GeneratePresentationDescriptor(
        IMFPresentationDescriptor **ppIPresentationDescriptor) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEncodingConfigurationPropertyStore(
        WORD wStreamNumber,
        IPropertyStore **ppIStore) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFContentInfo, 0xb1dca5cd, 0xd5da, 0x4451, 0x8e,0x9e, 0xdb,0x5c,0x59,0x91,0x4e,0xad)
#endif
#else
typedef struct IMFASFContentInfoVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFContentInfo *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFContentInfo *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFContentInfo *This);

    /*** IMFASFContentInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetHeaderSize)(
        IMFASFContentInfo *This,
        IMFMediaBuffer *pIStartOfContent,
        QWORD *cbHeaderSize);

    HRESULT (STDMETHODCALLTYPE *ParseHeader)(
        IMFASFContentInfo *This,
        IMFMediaBuffer *pIHeaderBuffer,
        QWORD cbOffsetWithinHeader);

    HRESULT (STDMETHODCALLTYPE *GenerateHeader)(
        IMFASFContentInfo *This,
        IMFMediaBuffer *pIHeader,
        DWORD *pcbHeader);

    HRESULT (STDMETHODCALLTYPE *GetProfile)(
        IMFASFContentInfo *This,
        IMFASFProfile **ppIProfile);

    HRESULT (STDMETHODCALLTYPE *SetProfile)(
        IMFASFContentInfo *This,
        IMFASFProfile *pIProfile);

    HRESULT (STDMETHODCALLTYPE *GeneratePresentationDescriptor)(
        IMFASFContentInfo *This,
        IMFPresentationDescriptor **ppIPresentationDescriptor);

    HRESULT (STDMETHODCALLTYPE *GetEncodingConfigurationPropertyStore)(
        IMFASFContentInfo *This,
        WORD wStreamNumber,
        IPropertyStore **ppIStore);

    END_INTERFACE
} IMFASFContentInfoVtbl;

interface IMFASFContentInfo {
    CONST_VTBL IMFASFContentInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFContentInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFContentInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFContentInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFContentInfo methods ***/
#define IMFASFContentInfo_GetHeaderSize(This,pIStartOfContent,cbHeaderSize) (This)->lpVtbl->GetHeaderSize(This,pIStartOfContent,cbHeaderSize)
#define IMFASFContentInfo_ParseHeader(This,pIHeaderBuffer,cbOffsetWithinHeader) (This)->lpVtbl->ParseHeader(This,pIHeaderBuffer,cbOffsetWithinHeader)
#define IMFASFContentInfo_GenerateHeader(This,pIHeader,pcbHeader) (This)->lpVtbl->GenerateHeader(This,pIHeader,pcbHeader)
#define IMFASFContentInfo_GetProfile(This,ppIProfile) (This)->lpVtbl->GetProfile(This,ppIProfile)
#define IMFASFContentInfo_SetProfile(This,pIProfile) (This)->lpVtbl->SetProfile(This,pIProfile)
#define IMFASFContentInfo_GeneratePresentationDescriptor(This,ppIPresentationDescriptor) (This)->lpVtbl->GeneratePresentationDescriptor(This,ppIPresentationDescriptor)
#define IMFASFContentInfo_GetEncodingConfigurationPropertyStore(This,wStreamNumber,ppIStore) (This)->lpVtbl->GetEncodingConfigurationPropertyStore(This,wStreamNumber,ppIStore)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFContentInfo_QueryInterface(IMFASFContentInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFContentInfo_AddRef(IMFASFContentInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFContentInfo_Release(IMFASFContentInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFContentInfo methods ***/
static FORCEINLINE HRESULT IMFASFContentInfo_GetHeaderSize(IMFASFContentInfo* This,IMFMediaBuffer *pIStartOfContent,QWORD *cbHeaderSize) {
    return This->lpVtbl->GetHeaderSize(This,pIStartOfContent,cbHeaderSize);
}
static FORCEINLINE HRESULT IMFASFContentInfo_ParseHeader(IMFASFContentInfo* This,IMFMediaBuffer *pIHeaderBuffer,QWORD cbOffsetWithinHeader) {
    return This->lpVtbl->ParseHeader(This,pIHeaderBuffer,cbOffsetWithinHeader);
}
static FORCEINLINE HRESULT IMFASFContentInfo_GenerateHeader(IMFASFContentInfo* This,IMFMediaBuffer *pIHeader,DWORD *pcbHeader) {
    return This->lpVtbl->GenerateHeader(This,pIHeader,pcbHeader);
}
static FORCEINLINE HRESULT IMFASFContentInfo_GetProfile(IMFASFContentInfo* This,IMFASFProfile **ppIProfile) {
    return This->lpVtbl->GetProfile(This,ppIProfile);
}
static FORCEINLINE HRESULT IMFASFContentInfo_SetProfile(IMFASFContentInfo* This,IMFASFProfile *pIProfile) {
    return This->lpVtbl->SetProfile(This,pIProfile);
}
static FORCEINLINE HRESULT IMFASFContentInfo_GeneratePresentationDescriptor(IMFASFContentInfo* This,IMFPresentationDescriptor **ppIPresentationDescriptor) {
    return This->lpVtbl->GeneratePresentationDescriptor(This,ppIPresentationDescriptor);
}
static FORCEINLINE HRESULT IMFASFContentInfo_GetEncodingConfigurationPropertyStore(IMFASFContentInfo* This,WORD wStreamNumber,IPropertyStore **ppIStore) {
    return This->lpVtbl->GetEncodingConfigurationPropertyStore(This,wStreamNumber,ppIStore);
}
#endif
#endif

#endif


#endif  /* __IMFASFContentInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFMutualExclusion interface
 */
#ifndef __IMFASFMutualExclusion_INTERFACE_DEFINED__
#define __IMFASFMutualExclusion_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFMutualExclusion, 0x12558291, 0xe399, 0x11d5, 0xbc,0x2a, 0x00,0xb0,0xd0,0xf3,0xf4,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("12558291-e399-11d5-bc2a-00b0d0f3f4ab")
IMFASFMutualExclusion : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *pguidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetType(
        REFGUID guidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRecordCount(
        DWORD *pdwRecordCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamsForRecord(
        DWORD dwRecordNumber,
        WORD *pwStreamNumArray,
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStreamForRecord(
        DWORD dwRecordNumber,
        WORD wStreamNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStreamFromRecord(
        DWORD dwRecordNumber,
        WORD wStreamNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveRecord(
        DWORD dwRecordNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRecord(
        DWORD *pdwRecordNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IMFASFMutualExclusion **ppIMutex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFMutualExclusion, 0x12558291, 0xe399, 0x11d5, 0xbc,0x2a, 0x00,0xb0,0xd0,0xf3,0xf4,0xab)
#endif
#else
typedef struct IMFASFMutualExclusionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFMutualExclusion *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFMutualExclusion *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFMutualExclusion *This);

    /*** IMFASFMutualExclusion methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IMFASFMutualExclusion *This,
        GUID *pguidType);

    HRESULT (STDMETHODCALLTYPE *SetType)(
        IMFASFMutualExclusion *This,
        REFGUID guidType);

    HRESULT (STDMETHODCALLTYPE *GetRecordCount)(
        IMFASFMutualExclusion *This,
        DWORD *pdwRecordCount);

    HRESULT (STDMETHODCALLTYPE *GetStreamsForRecord)(
        IMFASFMutualExclusion *This,
        DWORD dwRecordNumber,
        WORD *pwStreamNumArray,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStreamForRecord)(
        IMFASFMutualExclusion *This,
        DWORD dwRecordNumber,
        WORD wStreamNumber);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamFromRecord)(
        IMFASFMutualExclusion *This,
        DWORD dwRecordNumber,
        WORD wStreamNumber);

    HRESULT (STDMETHODCALLTYPE *RemoveRecord)(
        IMFASFMutualExclusion *This,
        DWORD dwRecordNumber);

    HRESULT (STDMETHODCALLTYPE *AddRecord)(
        IMFASFMutualExclusion *This,
        DWORD *pdwRecordNumber);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMFASFMutualExclusion *This,
        IMFASFMutualExclusion **ppIMutex);

    END_INTERFACE
} IMFASFMutualExclusionVtbl;

interface IMFASFMutualExclusion {
    CONST_VTBL IMFASFMutualExclusionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFMutualExclusion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFMutualExclusion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFMutualExclusion_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFMutualExclusion methods ***/
#define IMFASFMutualExclusion_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IMFASFMutualExclusion_SetType(This,guidType) (This)->lpVtbl->SetType(This,guidType)
#define IMFASFMutualExclusion_GetRecordCount(This,pdwRecordCount) (This)->lpVtbl->GetRecordCount(This,pdwRecordCount)
#define IMFASFMutualExclusion_GetStreamsForRecord(This,dwRecordNumber,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreamsForRecord(This,dwRecordNumber,pwStreamNumArray,pcStreams)
#define IMFASFMutualExclusion_AddStreamForRecord(This,dwRecordNumber,wStreamNumber) (This)->lpVtbl->AddStreamForRecord(This,dwRecordNumber,wStreamNumber)
#define IMFASFMutualExclusion_RemoveStreamFromRecord(This,dwRecordNumber,wStreamNumber) (This)->lpVtbl->RemoveStreamFromRecord(This,dwRecordNumber,wStreamNumber)
#define IMFASFMutualExclusion_RemoveRecord(This,dwRecordNumber) (This)->lpVtbl->RemoveRecord(This,dwRecordNumber)
#define IMFASFMutualExclusion_AddRecord(This,pdwRecordNumber) (This)->lpVtbl->AddRecord(This,pdwRecordNumber)
#define IMFASFMutualExclusion_Clone(This,ppIMutex) (This)->lpVtbl->Clone(This,ppIMutex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFMutualExclusion_QueryInterface(IMFASFMutualExclusion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFMutualExclusion_AddRef(IMFASFMutualExclusion* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFMutualExclusion_Release(IMFASFMutualExclusion* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFMutualExclusion methods ***/
static FORCEINLINE HRESULT IMFASFMutualExclusion_GetType(IMFASFMutualExclusion* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_SetType(IMFASFMutualExclusion* This,REFGUID guidType) {
    return This->lpVtbl->SetType(This,guidType);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_GetRecordCount(IMFASFMutualExclusion* This,DWORD *pdwRecordCount) {
    return This->lpVtbl->GetRecordCount(This,pdwRecordCount);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_GetStreamsForRecord(IMFASFMutualExclusion* This,DWORD dwRecordNumber,WORD *pwStreamNumArray,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamsForRecord(This,dwRecordNumber,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_AddStreamForRecord(IMFASFMutualExclusion* This,DWORD dwRecordNumber,WORD wStreamNumber) {
    return This->lpVtbl->AddStreamForRecord(This,dwRecordNumber,wStreamNumber);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_RemoveStreamFromRecord(IMFASFMutualExclusion* This,DWORD dwRecordNumber,WORD wStreamNumber) {
    return This->lpVtbl->RemoveStreamFromRecord(This,dwRecordNumber,wStreamNumber);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_RemoveRecord(IMFASFMutualExclusion* This,DWORD dwRecordNumber) {
    return This->lpVtbl->RemoveRecord(This,dwRecordNumber);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_AddRecord(IMFASFMutualExclusion* This,DWORD *pdwRecordNumber) {
    return This->lpVtbl->AddRecord(This,pdwRecordNumber);
}
static FORCEINLINE HRESULT IMFASFMutualExclusion_Clone(IMFASFMutualExclusion* This,IMFASFMutualExclusion **ppIMutex) {
    return This->lpVtbl->Clone(This,ppIMutex);
}
#endif
#endif

#endif


#endif  /* __IMFASFMutualExclusion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFStreamPrioritization interface
 */
#ifndef __IMFASFStreamPrioritization_INTERFACE_DEFINED__
#define __IMFASFStreamPrioritization_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFStreamPrioritization, 0x699bdc27, 0xbbaf, 0x49ff, 0x8e,0x38, 0x9c,0x39,0xc9,0xb5,0xe0,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("699bdc27-bbaf-49ff-8e38-9c39c9b5e088")
IMFASFStreamPrioritization : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamCount(
        DWORD *pdwStreamCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        DWORD dwStreamIndex,
        WORD *pwStreamNumber,
        WORD *pwStreamFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        WORD wStreamNumber,
        WORD wStreamFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        DWORD dwStreamIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IMFASFStreamPrioritization **ppIStreamPrioritization) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFStreamPrioritization, 0x699bdc27, 0xbbaf, 0x49ff, 0x8e,0x38, 0x9c,0x39,0xc9,0xb5,0xe0,0x88)
#endif
#else
typedef struct IMFASFStreamPrioritizationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFStreamPrioritization *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFStreamPrioritization *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFStreamPrioritization *This);

    /*** IMFASFStreamPrioritization methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IMFASFStreamPrioritization *This,
        DWORD *pdwStreamCount);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IMFASFStreamPrioritization *This,
        DWORD dwStreamIndex,
        WORD *pwStreamNumber,
        WORD *pwStreamFlags);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFASFStreamPrioritization *This,
        WORD wStreamNumber,
        WORD wStreamFlags);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IMFASFStreamPrioritization *This,
        DWORD dwStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMFASFStreamPrioritization *This,
        IMFASFStreamPrioritization **ppIStreamPrioritization);

    END_INTERFACE
} IMFASFStreamPrioritizationVtbl;

interface IMFASFStreamPrioritization {
    CONST_VTBL IMFASFStreamPrioritizationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFStreamPrioritization_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFStreamPrioritization_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFStreamPrioritization_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFStreamPrioritization methods ***/
#define IMFASFStreamPrioritization_GetStreamCount(This,pdwStreamCount) (This)->lpVtbl->GetStreamCount(This,pdwStreamCount)
#define IMFASFStreamPrioritization_GetStream(This,dwStreamIndex,pwStreamNumber,pwStreamFlags) (This)->lpVtbl->GetStream(This,dwStreamIndex,pwStreamNumber,pwStreamFlags)
#define IMFASFStreamPrioritization_AddStream(This,wStreamNumber,wStreamFlags) (This)->lpVtbl->AddStream(This,wStreamNumber,wStreamFlags)
#define IMFASFStreamPrioritization_RemoveStream(This,dwStreamIndex) (This)->lpVtbl->RemoveStream(This,dwStreamIndex)
#define IMFASFStreamPrioritization_Clone(This,ppIStreamPrioritization) (This)->lpVtbl->Clone(This,ppIStreamPrioritization)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFStreamPrioritization_QueryInterface(IMFASFStreamPrioritization* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFStreamPrioritization_AddRef(IMFASFStreamPrioritization* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFStreamPrioritization_Release(IMFASFStreamPrioritization* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFStreamPrioritization methods ***/
static FORCEINLINE HRESULT IMFASFStreamPrioritization_GetStreamCount(IMFASFStreamPrioritization* This,DWORD *pdwStreamCount) {
    return This->lpVtbl->GetStreamCount(This,pdwStreamCount);
}
static FORCEINLINE HRESULT IMFASFStreamPrioritization_GetStream(IMFASFStreamPrioritization* This,DWORD dwStreamIndex,WORD *pwStreamNumber,WORD *pwStreamFlags) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,pwStreamNumber,pwStreamFlags);
}
static FORCEINLINE HRESULT IMFASFStreamPrioritization_AddStream(IMFASFStreamPrioritization* This,WORD wStreamNumber,WORD wStreamFlags) {
    return This->lpVtbl->AddStream(This,wStreamNumber,wStreamFlags);
}
static FORCEINLINE HRESULT IMFASFStreamPrioritization_RemoveStream(IMFASFStreamPrioritization* This,DWORD dwStreamIndex) {
    return This->lpVtbl->RemoveStream(This,dwStreamIndex);
}
static FORCEINLINE HRESULT IMFASFStreamPrioritization_Clone(IMFASFStreamPrioritization* This,IMFASFStreamPrioritization **ppIStreamPrioritization) {
    return This->lpVtbl->Clone(This,ppIStreamPrioritization);
}
#endif
#endif

#endif


#endif  /* __IMFASFStreamPrioritization_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFSplitter interface
 */
#ifndef __IMFASFSplitter_INTERFACE_DEFINED__
#define __IMFASFSplitter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFSplitter, 0x12558295, 0xe399, 0x11d5, 0xbc,0x2a, 0x00,0xb0,0xd0,0xf3,0xf4,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("12558295-e399-11d5-bc2a-00b0d0f3f4ab")
IMFASFSplitter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IMFASFContentInfo *pIContentInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SelectStreams(
        WORD *pwStreamNumbers,
        WORD wNumStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelectedStreams(
        WORD *pwStreamNumbers,
        WORD *pwNumStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE ParseData(
        IMFMediaBuffer *pIBuffer,
        DWORD cbBufferOffset,
        DWORD cbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextSample(
        DWORD *pdwStatusFlags,
        WORD *pwStreamNumber,
        IMFSample **ppISample) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastSendTime(
        DWORD *pdwLastSendTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFSplitter, 0x12558295, 0xe399, 0x11d5, 0xbc,0x2a, 0x00,0xb0,0xd0,0xf3,0xf4,0xab)
#endif
#else
typedef struct IMFASFSplitterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFSplitter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFSplitter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFSplitter *This);

    /*** IMFASFSplitter methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IMFASFSplitter *This,
        IMFASFContentInfo *pIContentInfo);

    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IMFASFSplitter *This,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IMFASFSplitter *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *SelectStreams)(
        IMFASFSplitter *This,
        WORD *pwStreamNumbers,
        WORD wNumStreams);

    HRESULT (STDMETHODCALLTYPE *GetSelectedStreams)(
        IMFASFSplitter *This,
        WORD *pwStreamNumbers,
        WORD *pwNumStreams);

    HRESULT (STDMETHODCALLTYPE *ParseData)(
        IMFASFSplitter *This,
        IMFMediaBuffer *pIBuffer,
        DWORD cbBufferOffset,
        DWORD cbLength);

    HRESULT (STDMETHODCALLTYPE *GetNextSample)(
        IMFASFSplitter *This,
        DWORD *pdwStatusFlags,
        WORD *pwStreamNumber,
        IMFSample **ppISample);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IMFASFSplitter *This);

    HRESULT (STDMETHODCALLTYPE *GetLastSendTime)(
        IMFASFSplitter *This,
        DWORD *pdwLastSendTime);

    END_INTERFACE
} IMFASFSplitterVtbl;

interface IMFASFSplitter {
    CONST_VTBL IMFASFSplitterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFSplitter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFSplitter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFSplitter_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFSplitter methods ***/
#define IMFASFSplitter_Initialize(This,pIContentInfo) (This)->lpVtbl->Initialize(This,pIContentInfo)
#define IMFASFSplitter_SetFlags(This,dwFlags) (This)->lpVtbl->SetFlags(This,dwFlags)
#define IMFASFSplitter_GetFlags(This,pdwFlags) (This)->lpVtbl->GetFlags(This,pdwFlags)
#define IMFASFSplitter_SelectStreams(This,pwStreamNumbers,wNumStreams) (This)->lpVtbl->SelectStreams(This,pwStreamNumbers,wNumStreams)
#define IMFASFSplitter_GetSelectedStreams(This,pwStreamNumbers,pwNumStreams) (This)->lpVtbl->GetSelectedStreams(This,pwStreamNumbers,pwNumStreams)
#define IMFASFSplitter_ParseData(This,pIBuffer,cbBufferOffset,cbLength) (This)->lpVtbl->ParseData(This,pIBuffer,cbBufferOffset,cbLength)
#define IMFASFSplitter_GetNextSample(This,pdwStatusFlags,pwStreamNumber,ppISample) (This)->lpVtbl->GetNextSample(This,pdwStatusFlags,pwStreamNumber,ppISample)
#define IMFASFSplitter_Flush(This) (This)->lpVtbl->Flush(This)
#define IMFASFSplitter_GetLastSendTime(This,pdwLastSendTime) (This)->lpVtbl->GetLastSendTime(This,pdwLastSendTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFSplitter_QueryInterface(IMFASFSplitter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFSplitter_AddRef(IMFASFSplitter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFSplitter_Release(IMFASFSplitter* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFSplitter methods ***/
static FORCEINLINE HRESULT IMFASFSplitter_Initialize(IMFASFSplitter* This,IMFASFContentInfo *pIContentInfo) {
    return This->lpVtbl->Initialize(This,pIContentInfo);
}
static FORCEINLINE HRESULT IMFASFSplitter_SetFlags(IMFASFSplitter* This,DWORD dwFlags) {
    return This->lpVtbl->SetFlags(This,dwFlags);
}
static FORCEINLINE HRESULT IMFASFSplitter_GetFlags(IMFASFSplitter* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetFlags(This,pdwFlags);
}
static FORCEINLINE HRESULT IMFASFSplitter_SelectStreams(IMFASFSplitter* This,WORD *pwStreamNumbers,WORD wNumStreams) {
    return This->lpVtbl->SelectStreams(This,pwStreamNumbers,wNumStreams);
}
static FORCEINLINE HRESULT IMFASFSplitter_GetSelectedStreams(IMFASFSplitter* This,WORD *pwStreamNumbers,WORD *pwNumStreams) {
    return This->lpVtbl->GetSelectedStreams(This,pwStreamNumbers,pwNumStreams);
}
static FORCEINLINE HRESULT IMFASFSplitter_ParseData(IMFASFSplitter* This,IMFMediaBuffer *pIBuffer,DWORD cbBufferOffset,DWORD cbLength) {
    return This->lpVtbl->ParseData(This,pIBuffer,cbBufferOffset,cbLength);
}
static FORCEINLINE HRESULT IMFASFSplitter_GetNextSample(IMFASFSplitter* This,DWORD *pdwStatusFlags,WORD *pwStreamNumber,IMFSample **ppISample) {
    return This->lpVtbl->GetNextSample(This,pdwStatusFlags,pwStreamNumber,ppISample);
}
static FORCEINLINE HRESULT IMFASFSplitter_Flush(IMFASFSplitter* This) {
    return This->lpVtbl->Flush(This);
}
static FORCEINLINE HRESULT IMFASFSplitter_GetLastSendTime(IMFASFSplitter* This,DWORD *pdwLastSendTime) {
    return This->lpVtbl->GetLastSendTime(This,pdwLastSendTime);
}
#endif
#endif

#endif


#endif  /* __IMFASFSplitter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFMultiplexer interface
 */
#ifndef __IMFASFMultiplexer_INTERFACE_DEFINED__
#define __IMFASFMultiplexer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFMultiplexer, 0x57bdd80a, 0x9b38, 0x4838, 0xb7,0x37, 0xc5,0x8f,0x67,0x0d,0x7d,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("57bdd80a-9b38-4838-b737-c58f670d7d4f")
IMFASFMultiplexer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IMFASFContentInfo *pIContentInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessSample(
        WORD wStreamNumber,
        IMFSample *pISample,
        LONGLONG hnsTimestampAdjust) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextPacket(
        DWORD *pdwStatusFlags,
        IMFSample **ppIPacket) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE End(
        IMFASFContentInfo *pIContentInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        WORD wStreamNumber,
        ASF_MUX_STATISTICS *pMuxStats) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSyncTolerance(
        DWORD msSyncTolerance) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFMultiplexer, 0x57bdd80a, 0x9b38, 0x4838, 0xb7,0x37, 0xc5,0x8f,0x67,0x0d,0x7d,0x4f)
#endif
#else
typedef struct IMFASFMultiplexerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFMultiplexer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFMultiplexer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFMultiplexer *This);

    /*** IMFASFMultiplexer methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IMFASFMultiplexer *This,
        IMFASFContentInfo *pIContentInfo);

    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IMFASFMultiplexer *This,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IMFASFMultiplexer *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *ProcessSample)(
        IMFASFMultiplexer *This,
        WORD wStreamNumber,
        IMFSample *pISample,
        LONGLONG hnsTimestampAdjust);

    HRESULT (STDMETHODCALLTYPE *GetNextPacket)(
        IMFASFMultiplexer *This,
        DWORD *pdwStatusFlags,
        IMFSample **ppIPacket);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IMFASFMultiplexer *This);

    HRESULT (STDMETHODCALLTYPE *End)(
        IMFASFMultiplexer *This,
        IMFASFContentInfo *pIContentInfo);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IMFASFMultiplexer *This,
        WORD wStreamNumber,
        ASF_MUX_STATISTICS *pMuxStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IMFASFMultiplexer *This,
        DWORD msSyncTolerance);

    END_INTERFACE
} IMFASFMultiplexerVtbl;

interface IMFASFMultiplexer {
    CONST_VTBL IMFASFMultiplexerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFMultiplexer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFMultiplexer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFMultiplexer_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFMultiplexer methods ***/
#define IMFASFMultiplexer_Initialize(This,pIContentInfo) (This)->lpVtbl->Initialize(This,pIContentInfo)
#define IMFASFMultiplexer_SetFlags(This,dwFlags) (This)->lpVtbl->SetFlags(This,dwFlags)
#define IMFASFMultiplexer_GetFlags(This,pdwFlags) (This)->lpVtbl->GetFlags(This,pdwFlags)
#define IMFASFMultiplexer_ProcessSample(This,wStreamNumber,pISample,hnsTimestampAdjust) (This)->lpVtbl->ProcessSample(This,wStreamNumber,pISample,hnsTimestampAdjust)
#define IMFASFMultiplexer_GetNextPacket(This,pdwStatusFlags,ppIPacket) (This)->lpVtbl->GetNextPacket(This,pdwStatusFlags,ppIPacket)
#define IMFASFMultiplexer_Flush(This) (This)->lpVtbl->Flush(This)
#define IMFASFMultiplexer_End(This,pIContentInfo) (This)->lpVtbl->End(This,pIContentInfo)
#define IMFASFMultiplexer_GetStatistics(This,wStreamNumber,pMuxStats) (This)->lpVtbl->GetStatistics(This,wStreamNumber,pMuxStats)
#define IMFASFMultiplexer_SetSyncTolerance(This,msSyncTolerance) (This)->lpVtbl->SetSyncTolerance(This,msSyncTolerance)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFMultiplexer_QueryInterface(IMFASFMultiplexer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFMultiplexer_AddRef(IMFASFMultiplexer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFMultiplexer_Release(IMFASFMultiplexer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFMultiplexer methods ***/
static FORCEINLINE HRESULT IMFASFMultiplexer_Initialize(IMFASFMultiplexer* This,IMFASFContentInfo *pIContentInfo) {
    return This->lpVtbl->Initialize(This,pIContentInfo);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_SetFlags(IMFASFMultiplexer* This,DWORD dwFlags) {
    return This->lpVtbl->SetFlags(This,dwFlags);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_GetFlags(IMFASFMultiplexer* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetFlags(This,pdwFlags);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_ProcessSample(IMFASFMultiplexer* This,WORD wStreamNumber,IMFSample *pISample,LONGLONG hnsTimestampAdjust) {
    return This->lpVtbl->ProcessSample(This,wStreamNumber,pISample,hnsTimestampAdjust);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_GetNextPacket(IMFASFMultiplexer* This,DWORD *pdwStatusFlags,IMFSample **ppIPacket) {
    return This->lpVtbl->GetNextPacket(This,pdwStatusFlags,ppIPacket);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_Flush(IMFASFMultiplexer* This) {
    return This->lpVtbl->Flush(This);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_End(IMFASFMultiplexer* This,IMFASFContentInfo *pIContentInfo) {
    return This->lpVtbl->End(This,pIContentInfo);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_GetStatistics(IMFASFMultiplexer* This,WORD wStreamNumber,ASF_MUX_STATISTICS *pMuxStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNumber,pMuxStats);
}
static FORCEINLINE HRESULT IMFASFMultiplexer_SetSyncTolerance(IMFASFMultiplexer* This,DWORD msSyncTolerance) {
    return This->lpVtbl->SetSyncTolerance(This,msSyncTolerance);
}
#endif
#endif

#endif


#endif  /* __IMFASFMultiplexer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFIndexer interface
 */
#ifndef __IMFASFIndexer_INTERFACE_DEFINED__
#define __IMFASFIndexer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFIndexer, 0x53590f48, 0xdc3b, 0x4297, 0x81,0x3f, 0x78,0x77,0x61,0xad,0x7b,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("53590f48-dc3b-4297-813f-787761ad7b3e")
IMFASFIndexer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFlags(
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlags(
        DWORD *pdwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IMFASFContentInfo *pIContentInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIndexPosition(
        IMFASFContentInfo *pIContentInfo,
        QWORD *pcbIndexOffset) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIndexByteStreams(
        IMFByteStream **ppIByteStreams,
        DWORD cByteStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIndexByteStreamCount(
        DWORD *pcByteStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIndexStatus(
        ASF_INDEX_IDENTIFIER *pIndexIdentifier,
        WINBOOL *pfIsIndexed,
        BYTE *pbIndexDescriptor,
        DWORD *pcbIndexDescriptor) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIndexStatus(
        BYTE *pbIndexDescriptor,
        DWORD cbIndexDescriptor,
        WINBOOL fGenerateIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSeekPositionForValue(
        const PROPVARIANT *pvarValue,
        ASF_INDEX_IDENTIFIER *pIndexIdentifier,
        QWORD *pcbOffsetWithinData,
        MFTIME *phnsApproxTime,
        DWORD *pdwPayloadNumberOfStreamWithinPacket) = 0;

    virtual HRESULT STDMETHODCALLTYPE GenerateIndexEntries(
        IMFSample *pIASFPacketSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitIndex(
        IMFASFContentInfo *pIContentInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIndexWriteSpace(
        QWORD *pcbIndexWriteSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCompletedIndex(
        IMFMediaBuffer *pIIndexBuffer,
        QWORD cbOffsetWithinIndex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFIndexer, 0x53590f48, 0xdc3b, 0x4297, 0x81,0x3f, 0x78,0x77,0x61,0xad,0x7b,0x3e)
#endif
#else
typedef struct IMFASFIndexerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFIndexer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFIndexer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFIndexer *This);

    /*** IMFASFIndexer methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFlags)(
        IMFASFIndexer *This,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *GetFlags)(
        IMFASFIndexer *This,
        DWORD *pdwFlags);

    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IMFASFIndexer *This,
        IMFASFContentInfo *pIContentInfo);

    HRESULT (STDMETHODCALLTYPE *GetIndexPosition)(
        IMFASFIndexer *This,
        IMFASFContentInfo *pIContentInfo,
        QWORD *pcbIndexOffset);

    HRESULT (STDMETHODCALLTYPE *SetIndexByteStreams)(
        IMFASFIndexer *This,
        IMFByteStream **ppIByteStreams,
        DWORD cByteStreams);

    HRESULT (STDMETHODCALLTYPE *GetIndexByteStreamCount)(
        IMFASFIndexer *This,
        DWORD *pcByteStreams);

    HRESULT (STDMETHODCALLTYPE *GetIndexStatus)(
        IMFASFIndexer *This,
        ASF_INDEX_IDENTIFIER *pIndexIdentifier,
        WINBOOL *pfIsIndexed,
        BYTE *pbIndexDescriptor,
        DWORD *pcbIndexDescriptor);

    HRESULT (STDMETHODCALLTYPE *SetIndexStatus)(
        IMFASFIndexer *This,
        BYTE *pbIndexDescriptor,
        DWORD cbIndexDescriptor,
        WINBOOL fGenerateIndex);

    HRESULT (STDMETHODCALLTYPE *GetSeekPositionForValue)(
        IMFASFIndexer *This,
        const PROPVARIANT *pvarValue,
        ASF_INDEX_IDENTIFIER *pIndexIdentifier,
        QWORD *pcbOffsetWithinData,
        MFTIME *phnsApproxTime,
        DWORD *pdwPayloadNumberOfStreamWithinPacket);

    HRESULT (STDMETHODCALLTYPE *GenerateIndexEntries)(
        IMFASFIndexer *This,
        IMFSample *pIASFPacketSample);

    HRESULT (STDMETHODCALLTYPE *CommitIndex)(
        IMFASFIndexer *This,
        IMFASFContentInfo *pIContentInfo);

    HRESULT (STDMETHODCALLTYPE *GetIndexWriteSpace)(
        IMFASFIndexer *This,
        QWORD *pcbIndexWriteSpace);

    HRESULT (STDMETHODCALLTYPE *GetCompletedIndex)(
        IMFASFIndexer *This,
        IMFMediaBuffer *pIIndexBuffer,
        QWORD cbOffsetWithinIndex);

    END_INTERFACE
} IMFASFIndexerVtbl;

interface IMFASFIndexer {
    CONST_VTBL IMFASFIndexerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFIndexer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFIndexer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFIndexer_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFIndexer methods ***/
#define IMFASFIndexer_SetFlags(This,dwFlags) (This)->lpVtbl->SetFlags(This,dwFlags)
#define IMFASFIndexer_GetFlags(This,pdwFlags) (This)->lpVtbl->GetFlags(This,pdwFlags)
#define IMFASFIndexer_Initialize(This,pIContentInfo) (This)->lpVtbl->Initialize(This,pIContentInfo)
#define IMFASFIndexer_GetIndexPosition(This,pIContentInfo,pcbIndexOffset) (This)->lpVtbl->GetIndexPosition(This,pIContentInfo,pcbIndexOffset)
#define IMFASFIndexer_SetIndexByteStreams(This,ppIByteStreams,cByteStreams) (This)->lpVtbl->SetIndexByteStreams(This,ppIByteStreams,cByteStreams)
#define IMFASFIndexer_GetIndexByteStreamCount(This,pcByteStreams) (This)->lpVtbl->GetIndexByteStreamCount(This,pcByteStreams)
#define IMFASFIndexer_GetIndexStatus(This,pIndexIdentifier,pfIsIndexed,pbIndexDescriptor,pcbIndexDescriptor) (This)->lpVtbl->GetIndexStatus(This,pIndexIdentifier,pfIsIndexed,pbIndexDescriptor,pcbIndexDescriptor)
#define IMFASFIndexer_SetIndexStatus(This,pbIndexDescriptor,cbIndexDescriptor,fGenerateIndex) (This)->lpVtbl->SetIndexStatus(This,pbIndexDescriptor,cbIndexDescriptor,fGenerateIndex)
#define IMFASFIndexer_GetSeekPositionForValue(This,pvarValue,pIndexIdentifier,pcbOffsetWithinData,phnsApproxTime,pdwPayloadNumberOfStreamWithinPacket) (This)->lpVtbl->GetSeekPositionForValue(This,pvarValue,pIndexIdentifier,pcbOffsetWithinData,phnsApproxTime,pdwPayloadNumberOfStreamWithinPacket)
#define IMFASFIndexer_GenerateIndexEntries(This,pIASFPacketSample) (This)->lpVtbl->GenerateIndexEntries(This,pIASFPacketSample)
#define IMFASFIndexer_CommitIndex(This,pIContentInfo) (This)->lpVtbl->CommitIndex(This,pIContentInfo)
#define IMFASFIndexer_GetIndexWriteSpace(This,pcbIndexWriteSpace) (This)->lpVtbl->GetIndexWriteSpace(This,pcbIndexWriteSpace)
#define IMFASFIndexer_GetCompletedIndex(This,pIIndexBuffer,cbOffsetWithinIndex) (This)->lpVtbl->GetCompletedIndex(This,pIIndexBuffer,cbOffsetWithinIndex)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFIndexer_QueryInterface(IMFASFIndexer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFIndexer_AddRef(IMFASFIndexer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFIndexer_Release(IMFASFIndexer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFIndexer methods ***/
static FORCEINLINE HRESULT IMFASFIndexer_SetFlags(IMFASFIndexer* This,DWORD dwFlags) {
    return This->lpVtbl->SetFlags(This,dwFlags);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetFlags(IMFASFIndexer* This,DWORD *pdwFlags) {
    return This->lpVtbl->GetFlags(This,pdwFlags);
}
static FORCEINLINE HRESULT IMFASFIndexer_Initialize(IMFASFIndexer* This,IMFASFContentInfo *pIContentInfo) {
    return This->lpVtbl->Initialize(This,pIContentInfo);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetIndexPosition(IMFASFIndexer* This,IMFASFContentInfo *pIContentInfo,QWORD *pcbIndexOffset) {
    return This->lpVtbl->GetIndexPosition(This,pIContentInfo,pcbIndexOffset);
}
static FORCEINLINE HRESULT IMFASFIndexer_SetIndexByteStreams(IMFASFIndexer* This,IMFByteStream **ppIByteStreams,DWORD cByteStreams) {
    return This->lpVtbl->SetIndexByteStreams(This,ppIByteStreams,cByteStreams);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetIndexByteStreamCount(IMFASFIndexer* This,DWORD *pcByteStreams) {
    return This->lpVtbl->GetIndexByteStreamCount(This,pcByteStreams);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetIndexStatus(IMFASFIndexer* This,ASF_INDEX_IDENTIFIER *pIndexIdentifier,WINBOOL *pfIsIndexed,BYTE *pbIndexDescriptor,DWORD *pcbIndexDescriptor) {
    return This->lpVtbl->GetIndexStatus(This,pIndexIdentifier,pfIsIndexed,pbIndexDescriptor,pcbIndexDescriptor);
}
static FORCEINLINE HRESULT IMFASFIndexer_SetIndexStatus(IMFASFIndexer* This,BYTE *pbIndexDescriptor,DWORD cbIndexDescriptor,WINBOOL fGenerateIndex) {
    return This->lpVtbl->SetIndexStatus(This,pbIndexDescriptor,cbIndexDescriptor,fGenerateIndex);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetSeekPositionForValue(IMFASFIndexer* This,const PROPVARIANT *pvarValue,ASF_INDEX_IDENTIFIER *pIndexIdentifier,QWORD *pcbOffsetWithinData,MFTIME *phnsApproxTime,DWORD *pdwPayloadNumberOfStreamWithinPacket) {
    return This->lpVtbl->GetSeekPositionForValue(This,pvarValue,pIndexIdentifier,pcbOffsetWithinData,phnsApproxTime,pdwPayloadNumberOfStreamWithinPacket);
}
static FORCEINLINE HRESULT IMFASFIndexer_GenerateIndexEntries(IMFASFIndexer* This,IMFSample *pIASFPacketSample) {
    return This->lpVtbl->GenerateIndexEntries(This,pIASFPacketSample);
}
static FORCEINLINE HRESULT IMFASFIndexer_CommitIndex(IMFASFIndexer* This,IMFASFContentInfo *pIContentInfo) {
    return This->lpVtbl->CommitIndex(This,pIContentInfo);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetIndexWriteSpace(IMFASFIndexer* This,QWORD *pcbIndexWriteSpace) {
    return This->lpVtbl->GetIndexWriteSpace(This,pcbIndexWriteSpace);
}
static FORCEINLINE HRESULT IMFASFIndexer_GetCompletedIndex(IMFASFIndexer* This,IMFMediaBuffer *pIIndexBuffer,QWORD cbOffsetWithinIndex) {
    return This->lpVtbl->GetCompletedIndex(This,pIIndexBuffer,cbOffsetWithinIndex);
}
#endif
#endif

#endif


#endif  /* __IMFASFIndexer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFStreamSelector interface
 */
#ifndef __IMFASFStreamSelector_INTERFACE_DEFINED__
#define __IMFASFStreamSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFStreamSelector, 0xd01bad4a, 0x4fa0, 0x4a60, 0x93,0x49, 0xc2,0x7e,0x62,0xda,0x9d,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d01bad4a-4fa0-4a60-9349-c27e62da9d41")
IMFASFStreamSelector : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamCount(
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputCount(
        DWORD *pcOutputs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputStreamCount(
        DWORD dwOutputNum,
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputStreamNumbers(
        DWORD dwOutputNum,
        WORD *rgwStreamNumbers) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFromStream(
        WORD wStreamNum,
        DWORD *pdwOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputOverride(
        DWORD dwOutputNum,
        ASF_SELECTION_STATUS *pSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputOverride(
        DWORD dwOutputNum,
        ASF_SELECTION_STATUS Selection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputMutexCount(
        DWORD dwOutputNum,
        DWORD *pcMutexes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputMutex(
        DWORD dwOutputNum,
        DWORD dwMutexNum,
        IUnknown **ppMutex) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputMutexSelection(
        DWORD dwOutputNum,
        DWORD dwMutexNum,
        WORD wSelectedRecord) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandwidthStepCount(
        DWORD *pcStepCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandwidthStep(
        DWORD dwStepNum,
        DWORD *pdwBitrate,
        WORD *rgwStreamNumbers,
        ASF_SELECTION_STATUS *rgSelections) = 0;

    virtual HRESULT STDMETHODCALLTYPE BitrateToStepNumber(
        DWORD dwBitrate,
        DWORD *pdwStepNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamSelectorFlags(
        DWORD dwStreamSelectorFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFStreamSelector, 0xd01bad4a, 0x4fa0, 0x4a60, 0x93,0x49, 0xc2,0x7e,0x62,0xda,0x9d,0x41)
#endif
#else
typedef struct IMFASFStreamSelectorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFStreamSelector *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFStreamSelector *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFStreamSelector *This);

    /*** IMFASFStreamSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IMFASFStreamSelector *This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetOutputCount)(
        IMFASFStreamSelector *This,
        DWORD *pcOutputs);

    HRESULT (STDMETHODCALLTYPE *GetOutputStreamCount)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetOutputStreamNumbers)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        WORD *rgwStreamNumbers);

    HRESULT (STDMETHODCALLTYPE *GetOutputFromStream)(
        IMFASFStreamSelector *This,
        WORD wStreamNum,
        DWORD *pdwOutput);

    HRESULT (STDMETHODCALLTYPE *GetOutputOverride)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        ASF_SELECTION_STATUS *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetOutputOverride)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        ASF_SELECTION_STATUS Selection);

    HRESULT (STDMETHODCALLTYPE *GetOutputMutexCount)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        DWORD *pcMutexes);

    HRESULT (STDMETHODCALLTYPE *GetOutputMutex)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        DWORD dwMutexNum,
        IUnknown **ppMutex);

    HRESULT (STDMETHODCALLTYPE *SetOutputMutexSelection)(
        IMFASFStreamSelector *This,
        DWORD dwOutputNum,
        DWORD dwMutexNum,
        WORD wSelectedRecord);

    HRESULT (STDMETHODCALLTYPE *GetBandwidthStepCount)(
        IMFASFStreamSelector *This,
        DWORD *pcStepCount);

    HRESULT (STDMETHODCALLTYPE *GetBandwidthStep)(
        IMFASFStreamSelector *This,
        DWORD dwStepNum,
        DWORD *pdwBitrate,
        WORD *rgwStreamNumbers,
        ASF_SELECTION_STATUS *rgSelections);

    HRESULT (STDMETHODCALLTYPE *BitrateToStepNumber)(
        IMFASFStreamSelector *This,
        DWORD dwBitrate,
        DWORD *pdwStepNum);

    HRESULT (STDMETHODCALLTYPE *SetStreamSelectorFlags)(
        IMFASFStreamSelector *This,
        DWORD dwStreamSelectorFlags);

    END_INTERFACE
} IMFASFStreamSelectorVtbl;

interface IMFASFStreamSelector {
    CONST_VTBL IMFASFStreamSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFStreamSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFStreamSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFStreamSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IMFASFStreamSelector methods ***/
#define IMFASFStreamSelector_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IMFASFStreamSelector_GetOutputCount(This,pcOutputs) (This)->lpVtbl->GetOutputCount(This,pcOutputs)
#define IMFASFStreamSelector_GetOutputStreamCount(This,dwOutputNum,pcStreams) (This)->lpVtbl->GetOutputStreamCount(This,dwOutputNum,pcStreams)
#define IMFASFStreamSelector_GetOutputStreamNumbers(This,dwOutputNum,rgwStreamNumbers) (This)->lpVtbl->GetOutputStreamNumbers(This,dwOutputNum,rgwStreamNumbers)
#define IMFASFStreamSelector_GetOutputFromStream(This,wStreamNum,pdwOutput) (This)->lpVtbl->GetOutputFromStream(This,wStreamNum,pdwOutput)
#define IMFASFStreamSelector_GetOutputOverride(This,dwOutputNum,pSelection) (This)->lpVtbl->GetOutputOverride(This,dwOutputNum,pSelection)
#define IMFASFStreamSelector_SetOutputOverride(This,dwOutputNum,Selection) (This)->lpVtbl->SetOutputOverride(This,dwOutputNum,Selection)
#define IMFASFStreamSelector_GetOutputMutexCount(This,dwOutputNum,pcMutexes) (This)->lpVtbl->GetOutputMutexCount(This,dwOutputNum,pcMutexes)
#define IMFASFStreamSelector_GetOutputMutex(This,dwOutputNum,dwMutexNum,ppMutex) (This)->lpVtbl->GetOutputMutex(This,dwOutputNum,dwMutexNum,ppMutex)
#define IMFASFStreamSelector_SetOutputMutexSelection(This,dwOutputNum,dwMutexNum,wSelectedRecord) (This)->lpVtbl->SetOutputMutexSelection(This,dwOutputNum,dwMutexNum,wSelectedRecord)
#define IMFASFStreamSelector_GetBandwidthStepCount(This,pcStepCount) (This)->lpVtbl->GetBandwidthStepCount(This,pcStepCount)
#define IMFASFStreamSelector_GetBandwidthStep(This,dwStepNum,pdwBitrate,rgwStreamNumbers,rgSelections) (This)->lpVtbl->GetBandwidthStep(This,dwStepNum,pdwBitrate,rgwStreamNumbers,rgSelections)
#define IMFASFStreamSelector_BitrateToStepNumber(This,dwBitrate,pdwStepNum) (This)->lpVtbl->BitrateToStepNumber(This,dwBitrate,pdwStepNum)
#define IMFASFStreamSelector_SetStreamSelectorFlags(This,dwStreamSelectorFlags) (This)->lpVtbl->SetStreamSelectorFlags(This,dwStreamSelectorFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFStreamSelector_QueryInterface(IMFASFStreamSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFStreamSelector_AddRef(IMFASFStreamSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFStreamSelector_Release(IMFASFStreamSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFASFStreamSelector methods ***/
static FORCEINLINE HRESULT IMFASFStreamSelector_GetStreamCount(IMFASFStreamSelector* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputCount(IMFASFStreamSelector* This,DWORD *pcOutputs) {
    return This->lpVtbl->GetOutputCount(This,pcOutputs);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputStreamCount(IMFASFStreamSelector* This,DWORD dwOutputNum,DWORD *pcStreams) {
    return This->lpVtbl->GetOutputStreamCount(This,dwOutputNum,pcStreams);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputStreamNumbers(IMFASFStreamSelector* This,DWORD dwOutputNum,WORD *rgwStreamNumbers) {
    return This->lpVtbl->GetOutputStreamNumbers(This,dwOutputNum,rgwStreamNumbers);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputFromStream(IMFASFStreamSelector* This,WORD wStreamNum,DWORD *pdwOutput) {
    return This->lpVtbl->GetOutputFromStream(This,wStreamNum,pdwOutput);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputOverride(IMFASFStreamSelector* This,DWORD dwOutputNum,ASF_SELECTION_STATUS *pSelection) {
    return This->lpVtbl->GetOutputOverride(This,dwOutputNum,pSelection);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_SetOutputOverride(IMFASFStreamSelector* This,DWORD dwOutputNum,ASF_SELECTION_STATUS Selection) {
    return This->lpVtbl->SetOutputOverride(This,dwOutputNum,Selection);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputMutexCount(IMFASFStreamSelector* This,DWORD dwOutputNum,DWORD *pcMutexes) {
    return This->lpVtbl->GetOutputMutexCount(This,dwOutputNum,pcMutexes);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetOutputMutex(IMFASFStreamSelector* This,DWORD dwOutputNum,DWORD dwMutexNum,IUnknown **ppMutex) {
    return This->lpVtbl->GetOutputMutex(This,dwOutputNum,dwMutexNum,ppMutex);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_SetOutputMutexSelection(IMFASFStreamSelector* This,DWORD dwOutputNum,DWORD dwMutexNum,WORD wSelectedRecord) {
    return This->lpVtbl->SetOutputMutexSelection(This,dwOutputNum,dwMutexNum,wSelectedRecord);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetBandwidthStepCount(IMFASFStreamSelector* This,DWORD *pcStepCount) {
    return This->lpVtbl->GetBandwidthStepCount(This,pcStepCount);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_GetBandwidthStep(IMFASFStreamSelector* This,DWORD dwStepNum,DWORD *pdwBitrate,WORD *rgwStreamNumbers,ASF_SELECTION_STATUS *rgSelections) {
    return This->lpVtbl->GetBandwidthStep(This,dwStepNum,pdwBitrate,rgwStreamNumbers,rgSelections);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_BitrateToStepNumber(IMFASFStreamSelector* This,DWORD dwBitrate,DWORD *pdwStepNum) {
    return This->lpVtbl->BitrateToStepNumber(This,dwBitrate,pdwStepNum);
}
static FORCEINLINE HRESULT IMFASFStreamSelector_SetStreamSelectorFlags(IMFASFStreamSelector* This,DWORD dwStreamSelectorFlags) {
    return This->lpVtbl->SetStreamSelectorFlags(This,dwStreamSelectorFlags);
}
#endif
#endif

#endif


#endif  /* __IMFASFStreamSelector_INTERFACE_DEFINED__ */

#if WINVER >= 0x0601
/*****************************************************************************
 * IMFDRMNetHelper interface
 */
#ifndef __IMFDRMNetHelper_INTERFACE_DEFINED__
#define __IMFDRMNetHelper_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFDRMNetHelper, 0x3d1ff0ea, 0x679a, 0x4190, 0x8d,0x46, 0x7f,0xa6,0x9e,0x8c,0x7e,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d1ff0ea-679a-4190-8d46-7fa69e8c7e15")
IMFDRMNetHelper : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ProcessLicenseRequest(
        BYTE *pLicenseRequest,
        DWORD cbLicenseRequest,
        BYTE **ppLicenseResponse,
        DWORD *pcbLicenseResponse,
        BSTR *pbstrKID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChainedLicenseResponse(
        BYTE **ppLicenseResponse,
        DWORD *pcbLicenseResponse) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFDRMNetHelper, 0x3d1ff0ea, 0x679a, 0x4190, 0x8d,0x46, 0x7f,0xa6,0x9e,0x8c,0x7e,0x15)
#endif
#else
typedef struct IMFDRMNetHelperVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFDRMNetHelper *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFDRMNetHelper *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFDRMNetHelper *This);

    /*** IMFDRMNetHelper methods ***/
    HRESULT (STDMETHODCALLTYPE *ProcessLicenseRequest)(
        IMFDRMNetHelper *This,
        BYTE *pLicenseRequest,
        DWORD cbLicenseRequest,
        BYTE **ppLicenseResponse,
        DWORD *pcbLicenseResponse,
        BSTR *pbstrKID);

    HRESULT (STDMETHODCALLTYPE *GetChainedLicenseResponse)(
        IMFDRMNetHelper *This,
        BYTE **ppLicenseResponse,
        DWORD *pcbLicenseResponse);

    END_INTERFACE
} IMFDRMNetHelperVtbl;

interface IMFDRMNetHelper {
    CONST_VTBL IMFDRMNetHelperVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFDRMNetHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFDRMNetHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFDRMNetHelper_Release(This) (This)->lpVtbl->Release(This)
/*** IMFDRMNetHelper methods ***/
#define IMFDRMNetHelper_ProcessLicenseRequest(This,pLicenseRequest,cbLicenseRequest,ppLicenseResponse,pcbLicenseResponse,pbstrKID) (This)->lpVtbl->ProcessLicenseRequest(This,pLicenseRequest,cbLicenseRequest,ppLicenseResponse,pcbLicenseResponse,pbstrKID)
#define IMFDRMNetHelper_GetChainedLicenseResponse(This,ppLicenseResponse,pcbLicenseResponse) (This)->lpVtbl->GetChainedLicenseResponse(This,ppLicenseResponse,pcbLicenseResponse)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFDRMNetHelper_QueryInterface(IMFDRMNetHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFDRMNetHelper_AddRef(IMFDRMNetHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFDRMNetHelper_Release(IMFDRMNetHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFDRMNetHelper methods ***/
static FORCEINLINE HRESULT IMFDRMNetHelper_ProcessLicenseRequest(IMFDRMNetHelper* This,BYTE *pLicenseRequest,DWORD cbLicenseRequest,BYTE **ppLicenseResponse,DWORD *pcbLicenseResponse,BSTR *pbstrKID) {
    return This->lpVtbl->ProcessLicenseRequest(This,pLicenseRequest,cbLicenseRequest,ppLicenseResponse,pcbLicenseResponse,pbstrKID);
}
static FORCEINLINE HRESULT IMFDRMNetHelper_GetChainedLicenseResponse(IMFDRMNetHelper* This,BYTE **ppLicenseResponse,DWORD *pcbLicenseResponse) {
    return This->lpVtbl->GetChainedLicenseResponse(This,ppLicenseResponse,pcbLicenseResponse);
}
#endif
#endif

#endif


#endif  /* __IMFDRMNetHelper_INTERFACE_DEFINED__ */

#endif
/*****************************************************************************
 * IMFASFProfile interface
 */
#ifndef __IMFASFProfile_INTERFACE_DEFINED__
#define __IMFASFProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFProfile, 0xd267bf6a, 0x028b, 0x4e0d, 0x90,0x3d, 0x43,0xf0,0xef,0x82,0xd0,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d267bf6a-028b-4e0d-903d-43f0ef82d0d4")
IMFASFProfile : public IMFAttributes
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamCount(
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        DWORD dwStreamIndex,
        WORD *pwStreamNumber,
        IMFASFStreamConfig **ppIStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamByNumber(
        WORD wStreamNumber,
        IMFASFStreamConfig **ppIStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStream(
        IMFASFStreamConfig *pIStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        WORD wStreamNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStream(
        IMFMediaType *pIMediaType,
        IMFASFStreamConfig **ppIStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMutualExclusionCount(
        DWORD *pcMutexs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMutualExclusion(
        DWORD dwMutexIndex,
        IMFASFMutualExclusion **ppIMutex) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMutualExclusion(
        IMFASFMutualExclusion *pIMutex) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMutualExclusion(
        DWORD dwMutexIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMutualExclusion(
        IMFASFMutualExclusion **ppIMutex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamPrioritization(
        IMFASFStreamPrioritization **ppIStreamPrioritization) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStreamPrioritization(
        IMFASFStreamPrioritization *pIStreamPrioritization) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStreamPrioritization(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStreamPrioritization(
        IMFASFStreamPrioritization **ppIStreamPrioritization) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IMFASFProfile **ppIProfile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFProfile, 0xd267bf6a, 0x028b, 0x4e0d, 0x90,0x3d, 0x43,0xf0,0xef,0x82,0xd0,0xd4)
#endif
#else
typedef struct IMFASFProfileVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFProfile *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFProfile *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFProfile *This);

    /*** IMFAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IMFASFProfile *This,
        REFGUID guidKey,
        PROPVARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetItemType)(
        IMFASFProfile *This,
        REFGUID guidKey,
        MF_ATTRIBUTE_TYPE *pType);

    HRESULT (STDMETHODCALLTYPE *CompareItem)(
        IMFASFProfile *This,
        REFGUID guidKey,
        REFPROPVARIANT Value,
        WINBOOL *pbResult);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IMFASFProfile *This,
        IMFAttributes *pTheirs,
        MF_ATTRIBUTES_MATCH_TYPE MatchType,
        WINBOOL *pbResult);

    HRESULT (STDMETHODCALLTYPE *GetUINT32)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT32 *punValue);

    HRESULT (STDMETHODCALLTYPE *GetUINT64)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT64 *punValue);

    HRESULT (STDMETHODCALLTYPE *GetDouble)(
        IMFASFProfile *This,
        REFGUID guidKey,
        double *pfValue);

    HRESULT (STDMETHODCALLTYPE *GetGUID)(
        IMFASFProfile *This,
        REFGUID guidKey,
        GUID *pguidValue);

    HRESULT (STDMETHODCALLTYPE *GetStringLength)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetString)(
        IMFASFProfile *This,
        REFGUID guidKey,
        LPWSTR pwszValue,
        UINT32 cchBufSize,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetAllocatedString)(
        IMFASFProfile *This,
        REFGUID guidKey,
        LPWSTR *ppwszValue,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetBlobSize)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT32 *pcbBlobSize);

    HRESULT (STDMETHODCALLTYPE *GetBlob)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT8 *pBuf,
        UINT32 cbBufSize,
        UINT32 *pcbBlobSize);

    HRESULT (STDMETHODCALLTYPE *GetAllocatedBlob)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT8 **ppBuf,
        UINT32 *pcbSize);

    HRESULT (STDMETHODCALLTYPE *GetUnknown)(
        IMFASFProfile *This,
        REFGUID guidKey,
        REFIID riid,
        LPVOID *ppv);

    HRESULT (STDMETHODCALLTYPE *SetItem)(
        IMFASFProfile *This,
        REFGUID guidKey,
        REFPROPVARIANT Value);

    HRESULT (STDMETHODCALLTYPE *DeleteItem)(
        IMFASFProfile *This,
        REFGUID guidKey);

    HRESULT (STDMETHODCALLTYPE *DeleteAllItems)(
        IMFASFProfile *This);

    HRESULT (STDMETHODCALLTYPE *SetUINT32)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT32 unValue);

    HRESULT (STDMETHODCALLTYPE *SetUINT64)(
        IMFASFProfile *This,
        REFGUID guidKey,
        UINT64 unValue);

    HRESULT (STDMETHODCALLTYPE *SetDouble)(
        IMFASFProfile *This,
        REFGUID guidKey,
        double fValue);

    HRESULT (STDMETHODCALLTYPE *SetGUID)(
        IMFASFProfile *This,
        REFGUID guidKey,
        REFGUID guidValue);

    HRESULT (STDMETHODCALLTYPE *SetString)(
        IMFASFProfile *This,
        REFGUID guidKey,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SetBlob)(
        IMFASFProfile *This,
        REFGUID guidKey,
        const UINT8 *pBuf,
        UINT32 cbBufSize);

    HRESULT (STDMETHODCALLTYPE *SetUnknown)(
        IMFASFProfile *This,
        REFGUID guidKey,
        IUnknown *pUnknown);

    HRESULT (STDMETHODCALLTYPE *LockStore)(
        IMFASFProfile *This);

    HRESULT (STDMETHODCALLTYPE *UnlockStore)(
        IMFASFProfile *This);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IMFASFProfile *This,
        UINT32 *pcItems);

    HRESULT (STDMETHODCALLTYPE *GetItemByIndex)(
        IMFASFProfile *This,
        UINT32 unIndex,
        GUID *pguidKey,
        PROPVARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *CopyAllItems)(
        IMFASFProfile *This,
        IMFAttributes *pDest);

    /*** IMFASFProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IMFASFProfile *This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IMFASFProfile *This,
        DWORD dwStreamIndex,
        WORD *pwStreamNumber,
        IMFASFStreamConfig **ppIStream);

    HRESULT (STDMETHODCALLTYPE *GetStreamByNumber)(
        IMFASFProfile *This,
        WORD wStreamNumber,
        IMFASFStreamConfig **ppIStream);

    HRESULT (STDMETHODCALLTYPE *SetStream)(
        IMFASFProfile *This,
        IMFASFStreamConfig *pIStream);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IMFASFProfile *This,
        WORD wStreamNumber);

    HRESULT (STDMETHODCALLTYPE *CreateStream)(
        IMFASFProfile *This,
        IMFMediaType *pIMediaType,
        IMFASFStreamConfig **ppIStream);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusionCount)(
        IMFASFProfile *This,
        DWORD *pcMutexs);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusion)(
        IMFASFProfile *This,
        DWORD dwMutexIndex,
        IMFASFMutualExclusion **ppIMutex);

    HRESULT (STDMETHODCALLTYPE *AddMutualExclusion)(
        IMFASFProfile *This,
        IMFASFMutualExclusion *pIMutex);

    HRESULT (STDMETHODCALLTYPE *RemoveMutualExclusion)(
        IMFASFProfile *This,
        DWORD dwMutexIndex);

    HRESULT (STDMETHODCALLTYPE *CreateMutualExclusion)(
        IMFASFProfile *This,
        IMFASFMutualExclusion **ppIMutex);

    HRESULT (STDMETHODCALLTYPE *GetStreamPrioritization)(
        IMFASFProfile *This,
        IMFASFStreamPrioritization **ppIStreamPrioritization);

    HRESULT (STDMETHODCALLTYPE *AddStreamPrioritization)(
        IMFASFProfile *This,
        IMFASFStreamPrioritization *pIStreamPrioritization);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamPrioritization)(
        IMFASFProfile *This);

    HRESULT (STDMETHODCALLTYPE *CreateStreamPrioritization)(
        IMFASFProfile *This,
        IMFASFStreamPrioritization **ppIStreamPrioritization);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMFASFProfile *This,
        IMFASFProfile **ppIProfile);

    END_INTERFACE
} IMFASFProfileVtbl;

interface IMFASFProfile {
    CONST_VTBL IMFASFProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IMFAttributes methods ***/
#define IMFASFProfile_GetItem(This,guidKey,pValue) (This)->lpVtbl->GetItem(This,guidKey,pValue)
#define IMFASFProfile_GetItemType(This,guidKey,pType) (This)->lpVtbl->GetItemType(This,guidKey,pType)
#define IMFASFProfile_CompareItem(This,guidKey,Value,pbResult) (This)->lpVtbl->CompareItem(This,guidKey,Value,pbResult)
#define IMFASFProfile_Compare(This,pTheirs,MatchType,pbResult) (This)->lpVtbl->Compare(This,pTheirs,MatchType,pbResult)
#define IMFASFProfile_GetUINT32(This,guidKey,punValue) (This)->lpVtbl->GetUINT32(This,guidKey,punValue)
#define IMFASFProfile_GetUINT64(This,guidKey,punValue) (This)->lpVtbl->GetUINT64(This,guidKey,punValue)
#define IMFASFProfile_GetDouble(This,guidKey,pfValue) (This)->lpVtbl->GetDouble(This,guidKey,pfValue)
#define IMFASFProfile_GetGUID(This,guidKey,pguidValue) (This)->lpVtbl->GetGUID(This,guidKey,pguidValue)
#define IMFASFProfile_GetStringLength(This,guidKey,pcchLength) (This)->lpVtbl->GetStringLength(This,guidKey,pcchLength)
#define IMFASFProfile_GetString(This,guidKey,pwszValue,cchBufSize,pcchLength) (This)->lpVtbl->GetString(This,guidKey,pwszValue,cchBufSize,pcchLength)
#define IMFASFProfile_GetAllocatedString(This,guidKey,ppwszValue,pcchLength) (This)->lpVtbl->GetAllocatedString(This,guidKey,ppwszValue,pcchLength)
#define IMFASFProfile_GetBlobSize(This,guidKey,pcbBlobSize) (This)->lpVtbl->GetBlobSize(This,guidKey,pcbBlobSize)
#define IMFASFProfile_GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize) (This)->lpVtbl->GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize)
#define IMFASFProfile_GetAllocatedBlob(This,guidKey,ppBuf,pcbSize) (This)->lpVtbl->GetAllocatedBlob(This,guidKey,ppBuf,pcbSize)
#define IMFASFProfile_GetUnknown(This,guidKey,riid,ppv) (This)->lpVtbl->GetUnknown(This,guidKey,riid,ppv)
#define IMFASFProfile_SetItem(This,guidKey,Value) (This)->lpVtbl->SetItem(This,guidKey,Value)
#define IMFASFProfile_DeleteItem(This,guidKey) (This)->lpVtbl->DeleteItem(This,guidKey)
#define IMFASFProfile_DeleteAllItems(This) (This)->lpVtbl->DeleteAllItems(This)
#define IMFASFProfile_SetUINT32(This,guidKey,unValue) (This)->lpVtbl->SetUINT32(This,guidKey,unValue)
#define IMFASFProfile_SetUINT64(This,guidKey,unValue) (This)->lpVtbl->SetUINT64(This,guidKey,unValue)
#define IMFASFProfile_SetDouble(This,guidKey,fValue) (This)->lpVtbl->SetDouble(This,guidKey,fValue)
#define IMFASFProfile_SetGUID(This,guidKey,guidValue) (This)->lpVtbl->SetGUID(This,guidKey,guidValue)
#define IMFASFProfile_SetString(This,guidKey,wszValue) (This)->lpVtbl->SetString(This,guidKey,wszValue)
#define IMFASFProfile_SetBlob(This,guidKey,pBuf,cbBufSize) (This)->lpVtbl->SetBlob(This,guidKey,pBuf,cbBufSize)
#define IMFASFProfile_SetUnknown(This,guidKey,pUnknown) (This)->lpVtbl->SetUnknown(This,guidKey,pUnknown)
#define IMFASFProfile_LockStore(This) (This)->lpVtbl->LockStore(This)
#define IMFASFProfile_UnlockStore(This) (This)->lpVtbl->UnlockStore(This)
#define IMFASFProfile_GetCount(This,pcItems) (This)->lpVtbl->GetCount(This,pcItems)
#define IMFASFProfile_GetItemByIndex(This,unIndex,pguidKey,pValue) (This)->lpVtbl->GetItemByIndex(This,unIndex,pguidKey,pValue)
#define IMFASFProfile_CopyAllItems(This,pDest) (This)->lpVtbl->CopyAllItems(This,pDest)
/*** IMFASFProfile methods ***/
#define IMFASFProfile_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IMFASFProfile_GetStream(This,dwStreamIndex,pwStreamNumber,ppIStream) (This)->lpVtbl->GetStream(This,dwStreamIndex,pwStreamNumber,ppIStream)
#define IMFASFProfile_GetStreamByNumber(This,wStreamNumber,ppIStream) (This)->lpVtbl->GetStreamByNumber(This,wStreamNumber,ppIStream)
#define IMFASFProfile_SetStream(This,pIStream) (This)->lpVtbl->SetStream(This,pIStream)
#define IMFASFProfile_RemoveStream(This,wStreamNumber) (This)->lpVtbl->RemoveStream(This,wStreamNumber)
#define IMFASFProfile_CreateStream(This,pIMediaType,ppIStream) (This)->lpVtbl->CreateStream(This,pIMediaType,ppIStream)
#define IMFASFProfile_GetMutualExclusionCount(This,pcMutexs) (This)->lpVtbl->GetMutualExclusionCount(This,pcMutexs)
#define IMFASFProfile_GetMutualExclusion(This,dwMutexIndex,ppIMutex) (This)->lpVtbl->GetMutualExclusion(This,dwMutexIndex,ppIMutex)
#define IMFASFProfile_AddMutualExclusion(This,pIMutex) (This)->lpVtbl->AddMutualExclusion(This,pIMutex)
#define IMFASFProfile_RemoveMutualExclusion(This,dwMutexIndex) (This)->lpVtbl->RemoveMutualExclusion(This,dwMutexIndex)
#define IMFASFProfile_CreateMutualExclusion(This,ppIMutex) (This)->lpVtbl->CreateMutualExclusion(This,ppIMutex)
#define IMFASFProfile_GetStreamPrioritization(This,ppIStreamPrioritization) (This)->lpVtbl->GetStreamPrioritization(This,ppIStreamPrioritization)
#define IMFASFProfile_AddStreamPrioritization(This,pIStreamPrioritization) (This)->lpVtbl->AddStreamPrioritization(This,pIStreamPrioritization)
#define IMFASFProfile_RemoveStreamPrioritization(This) (This)->lpVtbl->RemoveStreamPrioritization(This)
#define IMFASFProfile_CreateStreamPrioritization(This,ppIStreamPrioritization) (This)->lpVtbl->CreateStreamPrioritization(This,ppIStreamPrioritization)
#define IMFASFProfile_Clone(This,ppIProfile) (This)->lpVtbl->Clone(This,ppIProfile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFProfile_QueryInterface(IMFASFProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFProfile_AddRef(IMFASFProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFProfile_Release(IMFASFProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFAttributes methods ***/
static FORCEINLINE HRESULT IMFASFProfile_GetItem(IMFASFProfile* This,REFGUID guidKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetItem(This,guidKey,pValue);
}
static FORCEINLINE HRESULT IMFASFProfile_GetItemType(IMFASFProfile* This,REFGUID guidKey,MF_ATTRIBUTE_TYPE *pType) {
    return This->lpVtbl->GetItemType(This,guidKey,pType);
}
static FORCEINLINE HRESULT IMFASFProfile_CompareItem(IMFASFProfile* This,REFGUID guidKey,REFPROPVARIANT Value,WINBOOL *pbResult) {
    return This->lpVtbl->CompareItem(This,guidKey,Value,pbResult);
}
static FORCEINLINE HRESULT IMFASFProfile_Compare(IMFASFProfile* This,IMFAttributes *pTheirs,MF_ATTRIBUTES_MATCH_TYPE MatchType,WINBOOL *pbResult) {
    return This->lpVtbl->Compare(This,pTheirs,MatchType,pbResult);
}
static FORCEINLINE HRESULT IMFASFProfile_GetUINT32(IMFASFProfile* This,REFGUID guidKey,UINT32 *punValue) {
    return This->lpVtbl->GetUINT32(This,guidKey,punValue);
}
static FORCEINLINE HRESULT IMFASFProfile_GetUINT64(IMFASFProfile* This,REFGUID guidKey,UINT64 *punValue) {
    return This->lpVtbl->GetUINT64(This,guidKey,punValue);
}
static FORCEINLINE HRESULT IMFASFProfile_GetDouble(IMFASFProfile* This,REFGUID guidKey,double *pfValue) {
    return This->lpVtbl->GetDouble(This,guidKey,pfValue);
}
static FORCEINLINE HRESULT IMFASFProfile_GetGUID(IMFASFProfile* This,REFGUID guidKey,GUID *pguidValue) {
    return This->lpVtbl->GetGUID(This,guidKey,pguidValue);
}
static FORCEINLINE HRESULT IMFASFProfile_GetStringLength(IMFASFProfile* This,REFGUID guidKey,UINT32 *pcchLength) {
    return This->lpVtbl->GetStringLength(This,guidKey,pcchLength);
}
static FORCEINLINE HRESULT IMFASFProfile_GetString(IMFASFProfile* This,REFGUID guidKey,LPWSTR pwszValue,UINT32 cchBufSize,UINT32 *pcchLength) {
    return This->lpVtbl->GetString(This,guidKey,pwszValue,cchBufSize,pcchLength);
}
static FORCEINLINE HRESULT IMFASFProfile_GetAllocatedString(IMFASFProfile* This,REFGUID guidKey,LPWSTR *ppwszValue,UINT32 *pcchLength) {
    return This->lpVtbl->GetAllocatedString(This,guidKey,ppwszValue,pcchLength);
}
static FORCEINLINE HRESULT IMFASFProfile_GetBlobSize(IMFASFProfile* This,REFGUID guidKey,UINT32 *pcbBlobSize) {
    return This->lpVtbl->GetBlobSize(This,guidKey,pcbBlobSize);
}
static FORCEINLINE HRESULT IMFASFProfile_GetBlob(IMFASFProfile* This,REFGUID guidKey,UINT8 *pBuf,UINT32 cbBufSize,UINT32 *pcbBlobSize) {
    return This->lpVtbl->GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize);
}
static FORCEINLINE HRESULT IMFASFProfile_GetAllocatedBlob(IMFASFProfile* This,REFGUID guidKey,UINT8 **ppBuf,UINT32 *pcbSize) {
    return This->lpVtbl->GetAllocatedBlob(This,guidKey,ppBuf,pcbSize);
}
static FORCEINLINE HRESULT IMFASFProfile_GetUnknown(IMFASFProfile* This,REFGUID guidKey,REFIID riid,LPVOID *ppv) {
    return This->lpVtbl->GetUnknown(This,guidKey,riid,ppv);
}
static FORCEINLINE HRESULT IMFASFProfile_SetItem(IMFASFProfile* This,REFGUID guidKey,REFPROPVARIANT Value) {
    return This->lpVtbl->SetItem(This,guidKey,Value);
}
static FORCEINLINE HRESULT IMFASFProfile_DeleteItem(IMFASFProfile* This,REFGUID guidKey) {
    return This->lpVtbl->DeleteItem(This,guidKey);
}
static FORCEINLINE HRESULT IMFASFProfile_DeleteAllItems(IMFASFProfile* This) {
    return This->lpVtbl->DeleteAllItems(This);
}
static FORCEINLINE HRESULT IMFASFProfile_SetUINT32(IMFASFProfile* This,REFGUID guidKey,UINT32 unValue) {
    return This->lpVtbl->SetUINT32(This,guidKey,unValue);
}
static FORCEINLINE HRESULT IMFASFProfile_SetUINT64(IMFASFProfile* This,REFGUID guidKey,UINT64 unValue) {
    return This->lpVtbl->SetUINT64(This,guidKey,unValue);
}
static FORCEINLINE HRESULT IMFASFProfile_SetDouble(IMFASFProfile* This,REFGUID guidKey,double fValue) {
    return This->lpVtbl->SetDouble(This,guidKey,fValue);
}
static FORCEINLINE HRESULT IMFASFProfile_SetGUID(IMFASFProfile* This,REFGUID guidKey,REFGUID guidValue) {
    return This->lpVtbl->SetGUID(This,guidKey,guidValue);
}
static FORCEINLINE HRESULT IMFASFProfile_SetString(IMFASFProfile* This,REFGUID guidKey,LPCWSTR wszValue) {
    return This->lpVtbl->SetString(This,guidKey,wszValue);
}
static FORCEINLINE HRESULT IMFASFProfile_SetBlob(IMFASFProfile* This,REFGUID guidKey,const UINT8 *pBuf,UINT32 cbBufSize) {
    return This->lpVtbl->SetBlob(This,guidKey,pBuf,cbBufSize);
}
static FORCEINLINE HRESULT IMFASFProfile_SetUnknown(IMFASFProfile* This,REFGUID guidKey,IUnknown *pUnknown) {
    return This->lpVtbl->SetUnknown(This,guidKey,pUnknown);
}
static FORCEINLINE HRESULT IMFASFProfile_LockStore(IMFASFProfile* This) {
    return This->lpVtbl->LockStore(This);
}
static FORCEINLINE HRESULT IMFASFProfile_UnlockStore(IMFASFProfile* This) {
    return This->lpVtbl->UnlockStore(This);
}
static FORCEINLINE HRESULT IMFASFProfile_GetCount(IMFASFProfile* This,UINT32 *pcItems) {
    return This->lpVtbl->GetCount(This,pcItems);
}
static FORCEINLINE HRESULT IMFASFProfile_GetItemByIndex(IMFASFProfile* This,UINT32 unIndex,GUID *pguidKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetItemByIndex(This,unIndex,pguidKey,pValue);
}
static FORCEINLINE HRESULT IMFASFProfile_CopyAllItems(IMFASFProfile* This,IMFAttributes *pDest) {
    return This->lpVtbl->CopyAllItems(This,pDest);
}
/*** IMFASFProfile methods ***/
static FORCEINLINE HRESULT IMFASFProfile_GetStreamCount(IMFASFProfile* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IMFASFProfile_GetStream(IMFASFProfile* This,DWORD dwStreamIndex,WORD *pwStreamNumber,IMFASFStreamConfig **ppIStream) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,pwStreamNumber,ppIStream);
}
static FORCEINLINE HRESULT IMFASFProfile_GetStreamByNumber(IMFASFProfile* This,WORD wStreamNumber,IMFASFStreamConfig **ppIStream) {
    return This->lpVtbl->GetStreamByNumber(This,wStreamNumber,ppIStream);
}
static FORCEINLINE HRESULT IMFASFProfile_SetStream(IMFASFProfile* This,IMFASFStreamConfig *pIStream) {
    return This->lpVtbl->SetStream(This,pIStream);
}
static FORCEINLINE HRESULT IMFASFProfile_RemoveStream(IMFASFProfile* This,WORD wStreamNumber) {
    return This->lpVtbl->RemoveStream(This,wStreamNumber);
}
static FORCEINLINE HRESULT IMFASFProfile_CreateStream(IMFASFProfile* This,IMFMediaType *pIMediaType,IMFASFStreamConfig **ppIStream) {
    return This->lpVtbl->CreateStream(This,pIMediaType,ppIStream);
}
static FORCEINLINE HRESULT IMFASFProfile_GetMutualExclusionCount(IMFASFProfile* This,DWORD *pcMutexs) {
    return This->lpVtbl->GetMutualExclusionCount(This,pcMutexs);
}
static FORCEINLINE HRESULT IMFASFProfile_GetMutualExclusion(IMFASFProfile* This,DWORD dwMutexIndex,IMFASFMutualExclusion **ppIMutex) {
    return This->lpVtbl->GetMutualExclusion(This,dwMutexIndex,ppIMutex);
}
static FORCEINLINE HRESULT IMFASFProfile_AddMutualExclusion(IMFASFProfile* This,IMFASFMutualExclusion *pIMutex) {
    return This->lpVtbl->AddMutualExclusion(This,pIMutex);
}
static FORCEINLINE HRESULT IMFASFProfile_RemoveMutualExclusion(IMFASFProfile* This,DWORD dwMutexIndex) {
    return This->lpVtbl->RemoveMutualExclusion(This,dwMutexIndex);
}
static FORCEINLINE HRESULT IMFASFProfile_CreateMutualExclusion(IMFASFProfile* This,IMFASFMutualExclusion **ppIMutex) {
    return This->lpVtbl->CreateMutualExclusion(This,ppIMutex);
}
static FORCEINLINE HRESULT IMFASFProfile_GetStreamPrioritization(IMFASFProfile* This,IMFASFStreamPrioritization **ppIStreamPrioritization) {
    return This->lpVtbl->GetStreamPrioritization(This,ppIStreamPrioritization);
}
static FORCEINLINE HRESULT IMFASFProfile_AddStreamPrioritization(IMFASFProfile* This,IMFASFStreamPrioritization *pIStreamPrioritization) {
    return This->lpVtbl->AddStreamPrioritization(This,pIStreamPrioritization);
}
static FORCEINLINE HRESULT IMFASFProfile_RemoveStreamPrioritization(IMFASFProfile* This) {
    return This->lpVtbl->RemoveStreamPrioritization(This);
}
static FORCEINLINE HRESULT IMFASFProfile_CreateStreamPrioritization(IMFASFProfile* This,IMFASFStreamPrioritization **ppIStreamPrioritization) {
    return This->lpVtbl->CreateStreamPrioritization(This,ppIStreamPrioritization);
}
static FORCEINLINE HRESULT IMFASFProfile_Clone(IMFASFProfile* This,IMFASFProfile **ppIProfile) {
    return This->lpVtbl->Clone(This,ppIProfile);
}
#endif
#endif

#endif


#endif  /* __IMFASFProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFASFStreamConfig interface
 */
#ifndef __IMFASFStreamConfig_INTERFACE_DEFINED__
#define __IMFASFStreamConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFASFStreamConfig, 0x9e8ae8d2, 0xdbbd, 0x4200, 0x9a,0xca, 0x06,0xe6,0xdf,0x48,0x49,0x13);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9e8ae8d2-dbbd-4200-9aca-06e6df484913")
IMFASFStreamConfig : public IMFAttributes
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamType(
        GUID *pguidStreamType) = 0;

    virtual WORD STDMETHODCALLTYPE GetStreamNumber(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamNumber(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaType(
        IMFMediaType **ppIMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        IMFMediaType *pIMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPayloadExtensionCount(
        WORD *pcPayloadExtensions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPayloadExtension(
        WORD wPayloadExtensionNumber,
        GUID *pguidExtensionSystemID,
        WORD *pcbExtensionDataSize,
        BYTE *pbExtensionSystemInfo,
        DWORD *pcbExtensionSystemInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPayloadExtension(
        GUID guidExtensionSystemID,
        WORD cbExtensionDataSize,
        BYTE *pbExtensionSystemInfo,
        DWORD cbExtensionSystemInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllPayloadExtensions(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IMFASFStreamConfig **ppIStreamConfig) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFASFStreamConfig, 0x9e8ae8d2, 0xdbbd, 0x4200, 0x9a,0xca, 0x06,0xe6,0xdf,0x48,0x49,0x13)
#endif
#else
typedef struct IMFASFStreamConfigVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMFASFStreamConfig *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMFASFStreamConfig *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMFASFStreamConfig *This);

    /*** IMFAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        PROPVARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetItemType)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        MF_ATTRIBUTE_TYPE *pType);

    HRESULT (STDMETHODCALLTYPE *CompareItem)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        REFPROPVARIANT Value,
        WINBOOL *pbResult);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IMFASFStreamConfig *This,
        IMFAttributes *pTheirs,
        MF_ATTRIBUTES_MATCH_TYPE MatchType,
        WINBOOL *pbResult);

    HRESULT (STDMETHODCALLTYPE *GetUINT32)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT32 *punValue);

    HRESULT (STDMETHODCALLTYPE *GetUINT64)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT64 *punValue);

    HRESULT (STDMETHODCALLTYPE *GetDouble)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        double *pfValue);

    HRESULT (STDMETHODCALLTYPE *GetGUID)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        GUID *pguidValue);

    HRESULT (STDMETHODCALLTYPE *GetStringLength)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetString)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        LPWSTR pwszValue,
        UINT32 cchBufSize,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetAllocatedString)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        LPWSTR *ppwszValue,
        UINT32 *pcchLength);

    HRESULT (STDMETHODCALLTYPE *GetBlobSize)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT32 *pcbBlobSize);

    HRESULT (STDMETHODCALLTYPE *GetBlob)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT8 *pBuf,
        UINT32 cbBufSize,
        UINT32 *pcbBlobSize);

    HRESULT (STDMETHODCALLTYPE *GetAllocatedBlob)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT8 **ppBuf,
        UINT32 *pcbSize);

    HRESULT (STDMETHODCALLTYPE *GetUnknown)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        REFIID riid,
        LPVOID *ppv);

    HRESULT (STDMETHODCALLTYPE *SetItem)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        REFPROPVARIANT Value);

    HRESULT (STDMETHODCALLTYPE *DeleteItem)(
        IMFASFStreamConfig *This,
        REFGUID guidKey);

    HRESULT (STDMETHODCALLTYPE *DeleteAllItems)(
        IMFASFStreamConfig *This);

    HRESULT (STDMETHODCALLTYPE *SetUINT32)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT32 unValue);

    HRESULT (STDMETHODCALLTYPE *SetUINT64)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        UINT64 unValue);

    HRESULT (STDMETHODCALLTYPE *SetDouble)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        double fValue);

    HRESULT (STDMETHODCALLTYPE *SetGUID)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        REFGUID guidValue);

    HRESULT (STDMETHODCALLTYPE *SetString)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SetBlob)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        const UINT8 *pBuf,
        UINT32 cbBufSize);

    HRESULT (STDMETHODCALLTYPE *SetUnknown)(
        IMFASFStreamConfig *This,
        REFGUID guidKey,
        IUnknown *pUnknown);

    HRESULT (STDMETHODCALLTYPE *LockStore)(
        IMFASFStreamConfig *This);

    HRESULT (STDMETHODCALLTYPE *UnlockStore)(
        IMFASFStreamConfig *This);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IMFASFStreamConfig *This,
        UINT32 *pcItems);

    HRESULT (STDMETHODCALLTYPE *GetItemByIndex)(
        IMFASFStreamConfig *This,
        UINT32 unIndex,
        GUID *pguidKey,
        PROPVARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *CopyAllItems)(
        IMFASFStreamConfig *This,
        IMFAttributes *pDest);

    /*** IMFASFStreamConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamType)(
        IMFASFStreamConfig *This,
        GUID *pguidStreamType);

    WORD (STDMETHODCALLTYPE *GetStreamNumber)(
        IMFASFStreamConfig *This);

    HRESULT (STDMETHODCALLTYPE *SetStreamNumber)(
        IMFASFStreamConfig *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IMFASFStreamConfig *This,
        IMFMediaType **ppIMediaType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IMFASFStreamConfig *This,
        IMFMediaType *pIMediaType);

    HRESULT (STDMETHODCALLTYPE *GetPayloadExtensionCount)(
        IMFASFStreamConfig *This,
        WORD *pcPayloadExtensions);

    HRESULT (STDMETHODCALLTYPE *GetPayloadExtension)(
        IMFASFStreamConfig *This,
        WORD wPayloadExtensionNumber,
        GUID *pguidExtensionSystemID,
        WORD *pcbExtensionDataSize,
        BYTE *pbExtensionSystemInfo,
        DWORD *pcbExtensionSystemInfo);

    HRESULT (STDMETHODCALLTYPE *AddPayloadExtension)(
        IMFASFStreamConfig *This,
        GUID guidExtensionSystemID,
        WORD cbExtensionDataSize,
        BYTE *pbExtensionSystemInfo,
        DWORD cbExtensionSystemInfo);

    HRESULT (STDMETHODCALLTYPE *RemoveAllPayloadExtensions)(
        IMFASFStreamConfig *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMFASFStreamConfig *This,
        IMFASFStreamConfig **ppIStreamConfig);

    END_INTERFACE
} IMFASFStreamConfigVtbl;

interface IMFASFStreamConfig {
    CONST_VTBL IMFASFStreamConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFASFStreamConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFASFStreamConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFASFStreamConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IMFAttributes methods ***/
#define IMFASFStreamConfig_GetItem(This,guidKey,pValue) (This)->lpVtbl->GetItem(This,guidKey,pValue)
#define IMFASFStreamConfig_GetItemType(This,guidKey,pType) (This)->lpVtbl->GetItemType(This,guidKey,pType)
#define IMFASFStreamConfig_CompareItem(This,guidKey,Value,pbResult) (This)->lpVtbl->CompareItem(This,guidKey,Value,pbResult)
#define IMFASFStreamConfig_Compare(This,pTheirs,MatchType,pbResult) (This)->lpVtbl->Compare(This,pTheirs,MatchType,pbResult)
#define IMFASFStreamConfig_GetUINT32(This,guidKey,punValue) (This)->lpVtbl->GetUINT32(This,guidKey,punValue)
#define IMFASFStreamConfig_GetUINT64(This,guidKey,punValue) (This)->lpVtbl->GetUINT64(This,guidKey,punValue)
#define IMFASFStreamConfig_GetDouble(This,guidKey,pfValue) (This)->lpVtbl->GetDouble(This,guidKey,pfValue)
#define IMFASFStreamConfig_GetGUID(This,guidKey,pguidValue) (This)->lpVtbl->GetGUID(This,guidKey,pguidValue)
#define IMFASFStreamConfig_GetStringLength(This,guidKey,pcchLength) (This)->lpVtbl->GetStringLength(This,guidKey,pcchLength)
#define IMFASFStreamConfig_GetString(This,guidKey,pwszValue,cchBufSize,pcchLength) (This)->lpVtbl->GetString(This,guidKey,pwszValue,cchBufSize,pcchLength)
#define IMFASFStreamConfig_GetAllocatedString(This,guidKey,ppwszValue,pcchLength) (This)->lpVtbl->GetAllocatedString(This,guidKey,ppwszValue,pcchLength)
#define IMFASFStreamConfig_GetBlobSize(This,guidKey,pcbBlobSize) (This)->lpVtbl->GetBlobSize(This,guidKey,pcbBlobSize)
#define IMFASFStreamConfig_GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize) (This)->lpVtbl->GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize)
#define IMFASFStreamConfig_GetAllocatedBlob(This,guidKey,ppBuf,pcbSize) (This)->lpVtbl->GetAllocatedBlob(This,guidKey,ppBuf,pcbSize)
#define IMFASFStreamConfig_GetUnknown(This,guidKey,riid,ppv) (This)->lpVtbl->GetUnknown(This,guidKey,riid,ppv)
#define IMFASFStreamConfig_SetItem(This,guidKey,Value) (This)->lpVtbl->SetItem(This,guidKey,Value)
#define IMFASFStreamConfig_DeleteItem(This,guidKey) (This)->lpVtbl->DeleteItem(This,guidKey)
#define IMFASFStreamConfig_DeleteAllItems(This) (This)->lpVtbl->DeleteAllItems(This)
#define IMFASFStreamConfig_SetUINT32(This,guidKey,unValue) (This)->lpVtbl->SetUINT32(This,guidKey,unValue)
#define IMFASFStreamConfig_SetUINT64(This,guidKey,unValue) (This)->lpVtbl->SetUINT64(This,guidKey,unValue)
#define IMFASFStreamConfig_SetDouble(This,guidKey,fValue) (This)->lpVtbl->SetDouble(This,guidKey,fValue)
#define IMFASFStreamConfig_SetGUID(This,guidKey,guidValue) (This)->lpVtbl->SetGUID(This,guidKey,guidValue)
#define IMFASFStreamConfig_SetString(This,guidKey,wszValue) (This)->lpVtbl->SetString(This,guidKey,wszValue)
#define IMFASFStreamConfig_SetBlob(This,guidKey,pBuf,cbBufSize) (This)->lpVtbl->SetBlob(This,guidKey,pBuf,cbBufSize)
#define IMFASFStreamConfig_SetUnknown(This,guidKey,pUnknown) (This)->lpVtbl->SetUnknown(This,guidKey,pUnknown)
#define IMFASFStreamConfig_LockStore(This) (This)->lpVtbl->LockStore(This)
#define IMFASFStreamConfig_UnlockStore(This) (This)->lpVtbl->UnlockStore(This)
#define IMFASFStreamConfig_GetCount(This,pcItems) (This)->lpVtbl->GetCount(This,pcItems)
#define IMFASFStreamConfig_GetItemByIndex(This,unIndex,pguidKey,pValue) (This)->lpVtbl->GetItemByIndex(This,unIndex,pguidKey,pValue)
#define IMFASFStreamConfig_CopyAllItems(This,pDest) (This)->lpVtbl->CopyAllItems(This,pDest)
/*** IMFASFStreamConfig methods ***/
#define IMFASFStreamConfig_GetStreamType(This,pguidStreamType) (This)->lpVtbl->GetStreamType(This,pguidStreamType)
#define IMFASFStreamConfig_GetStreamNumber(This) (This)->lpVtbl->GetStreamNumber(This)
#define IMFASFStreamConfig_SetStreamNumber(This,wStreamNum) (This)->lpVtbl->SetStreamNumber(This,wStreamNum)
#define IMFASFStreamConfig_GetMediaType(This,ppIMediaType) (This)->lpVtbl->GetMediaType(This,ppIMediaType)
#define IMFASFStreamConfig_SetMediaType(This,pIMediaType) (This)->lpVtbl->SetMediaType(This,pIMediaType)
#define IMFASFStreamConfig_GetPayloadExtensionCount(This,pcPayloadExtensions) (This)->lpVtbl->GetPayloadExtensionCount(This,pcPayloadExtensions)
#define IMFASFStreamConfig_GetPayloadExtension(This,wPayloadExtensionNumber,pguidExtensionSystemID,pcbExtensionDataSize,pbExtensionSystemInfo,pcbExtensionSystemInfo) (This)->lpVtbl->GetPayloadExtension(This,wPayloadExtensionNumber,pguidExtensionSystemID,pcbExtensionDataSize,pbExtensionSystemInfo,pcbExtensionSystemInfo)
#define IMFASFStreamConfig_AddPayloadExtension(This,guidExtensionSystemID,cbExtensionDataSize,pbExtensionSystemInfo,cbExtensionSystemInfo) (This)->lpVtbl->AddPayloadExtension(This,guidExtensionSystemID,cbExtensionDataSize,pbExtensionSystemInfo,cbExtensionSystemInfo)
#define IMFASFStreamConfig_RemoveAllPayloadExtensions(This) (This)->lpVtbl->RemoveAllPayloadExtensions(This)
#define IMFASFStreamConfig_Clone(This,ppIStreamConfig) (This)->lpVtbl->Clone(This,ppIStreamConfig)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMFASFStreamConfig_QueryInterface(IMFASFStreamConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMFASFStreamConfig_AddRef(IMFASFStreamConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMFASFStreamConfig_Release(IMFASFStreamConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFAttributes methods ***/
static FORCEINLINE HRESULT IMFASFStreamConfig_GetItem(IMFASFStreamConfig* This,REFGUID guidKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetItem(This,guidKey,pValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetItemType(IMFASFStreamConfig* This,REFGUID guidKey,MF_ATTRIBUTE_TYPE *pType) {
    return This->lpVtbl->GetItemType(This,guidKey,pType);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_CompareItem(IMFASFStreamConfig* This,REFGUID guidKey,REFPROPVARIANT Value,WINBOOL *pbResult) {
    return This->lpVtbl->CompareItem(This,guidKey,Value,pbResult);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_Compare(IMFASFStreamConfig* This,IMFAttributes *pTheirs,MF_ATTRIBUTES_MATCH_TYPE MatchType,WINBOOL *pbResult) {
    return This->lpVtbl->Compare(This,pTheirs,MatchType,pbResult);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetUINT32(IMFASFStreamConfig* This,REFGUID guidKey,UINT32 *punValue) {
    return This->lpVtbl->GetUINT32(This,guidKey,punValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetUINT64(IMFASFStreamConfig* This,REFGUID guidKey,UINT64 *punValue) {
    return This->lpVtbl->GetUINT64(This,guidKey,punValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetDouble(IMFASFStreamConfig* This,REFGUID guidKey,double *pfValue) {
    return This->lpVtbl->GetDouble(This,guidKey,pfValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetGUID(IMFASFStreamConfig* This,REFGUID guidKey,GUID *pguidValue) {
    return This->lpVtbl->GetGUID(This,guidKey,pguidValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetStringLength(IMFASFStreamConfig* This,REFGUID guidKey,UINT32 *pcchLength) {
    return This->lpVtbl->GetStringLength(This,guidKey,pcchLength);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetString(IMFASFStreamConfig* This,REFGUID guidKey,LPWSTR pwszValue,UINT32 cchBufSize,UINT32 *pcchLength) {
    return This->lpVtbl->GetString(This,guidKey,pwszValue,cchBufSize,pcchLength);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetAllocatedString(IMFASFStreamConfig* This,REFGUID guidKey,LPWSTR *ppwszValue,UINT32 *pcchLength) {
    return This->lpVtbl->GetAllocatedString(This,guidKey,ppwszValue,pcchLength);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetBlobSize(IMFASFStreamConfig* This,REFGUID guidKey,UINT32 *pcbBlobSize) {
    return This->lpVtbl->GetBlobSize(This,guidKey,pcbBlobSize);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetBlob(IMFASFStreamConfig* This,REFGUID guidKey,UINT8 *pBuf,UINT32 cbBufSize,UINT32 *pcbBlobSize) {
    return This->lpVtbl->GetBlob(This,guidKey,pBuf,cbBufSize,pcbBlobSize);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetAllocatedBlob(IMFASFStreamConfig* This,REFGUID guidKey,UINT8 **ppBuf,UINT32 *pcbSize) {
    return This->lpVtbl->GetAllocatedBlob(This,guidKey,ppBuf,pcbSize);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetUnknown(IMFASFStreamConfig* This,REFGUID guidKey,REFIID riid,LPVOID *ppv) {
    return This->lpVtbl->GetUnknown(This,guidKey,riid,ppv);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetItem(IMFASFStreamConfig* This,REFGUID guidKey,REFPROPVARIANT Value) {
    return This->lpVtbl->SetItem(This,guidKey,Value);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_DeleteItem(IMFASFStreamConfig* This,REFGUID guidKey) {
    return This->lpVtbl->DeleteItem(This,guidKey);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_DeleteAllItems(IMFASFStreamConfig* This) {
    return This->lpVtbl->DeleteAllItems(This);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetUINT32(IMFASFStreamConfig* This,REFGUID guidKey,UINT32 unValue) {
    return This->lpVtbl->SetUINT32(This,guidKey,unValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetUINT64(IMFASFStreamConfig* This,REFGUID guidKey,UINT64 unValue) {
    return This->lpVtbl->SetUINT64(This,guidKey,unValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetDouble(IMFASFStreamConfig* This,REFGUID guidKey,double fValue) {
    return This->lpVtbl->SetDouble(This,guidKey,fValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetGUID(IMFASFStreamConfig* This,REFGUID guidKey,REFGUID guidValue) {
    return This->lpVtbl->SetGUID(This,guidKey,guidValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetString(IMFASFStreamConfig* This,REFGUID guidKey,LPCWSTR wszValue) {
    return This->lpVtbl->SetString(This,guidKey,wszValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetBlob(IMFASFStreamConfig* This,REFGUID guidKey,const UINT8 *pBuf,UINT32 cbBufSize) {
    return This->lpVtbl->SetBlob(This,guidKey,pBuf,cbBufSize);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetUnknown(IMFASFStreamConfig* This,REFGUID guidKey,IUnknown *pUnknown) {
    return This->lpVtbl->SetUnknown(This,guidKey,pUnknown);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_LockStore(IMFASFStreamConfig* This) {
    return This->lpVtbl->LockStore(This);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_UnlockStore(IMFASFStreamConfig* This) {
    return This->lpVtbl->UnlockStore(This);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetCount(IMFASFStreamConfig* This,UINT32 *pcItems) {
    return This->lpVtbl->GetCount(This,pcItems);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetItemByIndex(IMFASFStreamConfig* This,UINT32 unIndex,GUID *pguidKey,PROPVARIANT *pValue) {
    return This->lpVtbl->GetItemByIndex(This,unIndex,pguidKey,pValue);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_CopyAllItems(IMFASFStreamConfig* This,IMFAttributes *pDest) {
    return This->lpVtbl->CopyAllItems(This,pDest);
}
/*** IMFASFStreamConfig methods ***/
static FORCEINLINE HRESULT IMFASFStreamConfig_GetStreamType(IMFASFStreamConfig* This,GUID *pguidStreamType) {
    return This->lpVtbl->GetStreamType(This,pguidStreamType);
}
static FORCEINLINE WORD IMFASFStreamConfig_GetStreamNumber(IMFASFStreamConfig* This) {
    return This->lpVtbl->GetStreamNumber(This);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetStreamNumber(IMFASFStreamConfig* This,WORD wStreamNum) {
    return This->lpVtbl->SetStreamNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetMediaType(IMFASFStreamConfig* This,IMFMediaType **ppIMediaType) {
    return This->lpVtbl->GetMediaType(This,ppIMediaType);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_SetMediaType(IMFASFStreamConfig* This,IMFMediaType *pIMediaType) {
    return This->lpVtbl->SetMediaType(This,pIMediaType);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetPayloadExtensionCount(IMFASFStreamConfig* This,WORD *pcPayloadExtensions) {
    return This->lpVtbl->GetPayloadExtensionCount(This,pcPayloadExtensions);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_GetPayloadExtension(IMFASFStreamConfig* This,WORD wPayloadExtensionNumber,GUID *pguidExtensionSystemID,WORD *pcbExtensionDataSize,BYTE *pbExtensionSystemInfo,DWORD *pcbExtensionSystemInfo) {
    return This->lpVtbl->GetPayloadExtension(This,wPayloadExtensionNumber,pguidExtensionSystemID,pcbExtensionDataSize,pbExtensionSystemInfo,pcbExtensionSystemInfo);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_AddPayloadExtension(IMFASFStreamConfig* This,GUID guidExtensionSystemID,WORD cbExtensionDataSize,BYTE *pbExtensionSystemInfo,DWORD cbExtensionSystemInfo) {
    return This->lpVtbl->AddPayloadExtension(This,guidExtensionSystemID,cbExtensionDataSize,pbExtensionSystemInfo,cbExtensionSystemInfo);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_RemoveAllPayloadExtensions(IMFASFStreamConfig* This) {
    return This->lpVtbl->RemoveAllPayloadExtensions(This);
}
static FORCEINLINE HRESULT IMFASFStreamConfig_Clone(IMFASFStreamConfig* This,IMFASFStreamConfig **ppIStreamConfig) {
    return This->lpVtbl->Clone(This,ppIStreamConfig);
}
#endif
#endif

#endif


#endif  /* __IMFASFStreamConfig_INTERFACE_DEFINED__ */


EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMEDIASINK_BASE_SENDTIME = { { 0xcddcbc82, 0x3411, 0x4119, 0x91, 0x35, 0x84, 0x23, 0xc4, 0x1b, 0x39, 0x57}, 3  };
EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE = { { 0xcddcbc82, 0x3411, 0x4119, 0x91, 0x35, 0x84, 0x23, 0xc4, 0x1b, 0x39, 0x57}, 4  };
EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFMEDIASINK_DRMACTION = { { 0xa1db6f6c, 0x1d0a, 0x4cb6, 0x82, 0x54, 0xcb, 0x36, 0xbe, 0xed, 0xbc, 0x48}, 5  };
EXTERN_C const DECLSPEC_SELECTANY PROPERTYKEY MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET = { { 0xa2f152fb, 0x8ad9, 0x4a11, 0xb3, 0x45, 0x2c, 0xe2, 0xfa, 0xd8, 0x72, 0x3d}, 1  };

STDAPI MFCreateASFContentInfo(IMFASFContentInfo **ppIContentInfo);
STDAPI MFCreateASFIndexer(IMFASFIndexer **ppIIndexer);
STDAPI MFCreateASFIndexerByteStream(IMFByteStream *pIContentByteStream, QWORD cbIndexStartOffset, IMFByteStream **pIIndexByteStream);
STDAPI MFCreateASFMediaSink(IMFByteStream *pIByteStream, IMFMediaSink **ppIMediaSink);
STDAPI MFCreateASFMediaSinkActivate(LPCWSTR pwszFileName, IMFASFContentInfo *pContentInfo, IMFActivate **ppIActivate);
STDAPI MFCreateASFMultiplexer(IMFASFMultiplexer **ppIMultiplexer);
STDAPI MFCreateASFProfile(IMFASFProfile **ppIProfile);
STDAPI MFCreateASFProfileFromPresentationDescriptor(IMFPresentationDescriptor  *pIPD, IMFASFProfile **ppIProfile);
STDAPI MFCreateASFSplitter(IMFASFSplitter **ppISplitter);
STDAPI MFCreateASFStreamingMediaSink(IMFByteStream *pIByteStream, IMFMediaSink **ppIMediaSink);
STDAPI MFCreateASFStreamingMediaSinkActivate(IMFActivate *pByteStreamActivate, IMFASFContentInfo *pContentInfo, IMFActivate **ppIActivate);
STDAPI MFCreateASFStreamSelector(IMFASFProfile *pIASFProfile, IMFASFStreamSelector **ppSelector);
STDAPI MFCreatePresentationDescriptorFromASFProfile(IMFASFProfile *pIProfile, IMFPresentationDescriptor **ppIPD);
HRESULT STDMETHODCALLTYPE MFCreateWMVEncoderActivate(IMFMediaType *pMediaType, IPropertyStore *pEncodingConfigurationProperties, IMFActivate **ppActivate);
HRESULT STDMETHODCALLTYPE MFCreateWMAEncoderActivate(IMFMediaType *pMediaType, IPropertyStore *pEncodingConfigurationProperties, IMFActivate **ppActivate);
#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wmcontainer_h__ */
