/*** Autogenerated by WIDL 1.6 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;
#endif

#ifndef __IMFASFMutualExclusion_FWD_DEFINED__
#define __IMFASFMutualExclusion_FWD_DEFINED__
typedef interface IMFASFMutualExclusion IMFASFMutualExclusion;
#endif

#ifndef __IMFASFStreamPrioritization_FWD_DEFINED__
#define __IMFASFStreamPrioritization_FWD_DEFINED__
typedef interface IMFASFStreamPrioritization IMFASFStreamPrioritization;
#endif

#ifndef __IMFASFSplitter_FWD_DEFINED__
#define __IMFASFSplitter_FWD_DEFINED__
typedef interface IMFASFSplitter IMFASFSplitter;
#endif

#ifndef __IMFASFMultiplexer_FWD_DEFINED__
#define __IMFASFMultiplexer_FWD_DEFINED__
typedef interface IMFASFMultiplexer IMFASFMultiplexer;
#endif

#ifndef __IMFASFIndexer_FWD_DEFINED__
#define __IMFASFIndexer_FWD_DEFINED__
typedef interface IMFASFIndexer IMFASFIndexer;
#endif

#ifndef __IMFASFStreamSelector_FWD_DEFINED__
#define __IMFASFStreamSelector_FWD_DEFINED__
typedef interface IMFASFStreamSelector IMFASFStreamSelector;
#endif

#ifndef __IMFDRMNetHelper_FWD_DEFINED__
#define __IMFDRMNetHelper_FWD_DEFINED__
typedef interface IMFDRMNetHelper IMFDRMNetHelper;
#endif

#ifndef __IMFASFProfile_FWD_DEFINED__
#define __IMFASFProfile_FWD_DEFINED__
typedef interface IMFASFProfile IMFASFProfile;
#endif

#ifndef __IMFASFStreamConfig_FWD_DEFINED__
#define __IMFASFStreamConfig_FWD_DEFINED__
typedef interface IMFASFStreamConfig IMFASFStreamConfig;
#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;
#endif

#ifndef __IMFASFStreamConfig_FWD_DEFINED__
#define __IMFASFStreamConfig_FWD_DEFINED__
typedef interface IMFASFStreamConfig IMFASFStreamConfig;
#endif

#ifndef __IMFASFMutualExclusion_FWD_DEFINED__
#define __IMFASFMutualExclusion_FWD_DEFINED__
typedef interface IMFASFMutualExclusion IMFASFMutualExclusion;
#endif

#ifndef __IMFASFStreamPrioritization_FWD_DEFINED__
#define __IMFASFStreamPrioritization_FWD_DEFINED__
typedef interface IMFASFStreamPrioritization IMFASFStreamPrioritization;
#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

HRESULT STDMETHODCALLTYPE IMFASFContentInfo_GetHeaderSize_Proxy(
    IMFASFContentInfo* This,
    IMFMediaBuffer *pIStartOfContent,
    QWORD *cbHeaderSize);
void __RPC_STUB IMFASFContentInfo_GetHeaderSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_ParseHeader_Proxy(
    IMFASFContentInfo* This,
    IMFMediaBuffer *pIHeaderBuffer,
    QWORD cbOffsetWithinHeader);
void __RPC_STUB IMFASFContentInfo_ParseHeader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_GenerateHeader_Proxy(
    IMFASFContentInfo* This,
    IMFMediaBuffer *pIHeader,
    DWORD *pcbHeader);
void __RPC_STUB IMFASFContentInfo_GenerateHeader_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_GetProfile_Proxy(
    IMFASFContentInfo* This,
    IMFASFProfile **ppIProfile);
void __RPC_STUB IMFASFContentInfo_GetProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_SetProfile_Proxy(
    IMFASFContentInfo* This,
    IMFASFProfile *pIProfile);
void __RPC_STUB IMFASFContentInfo_SetProfile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_GeneratePresentationDescriptor_Proxy(
    IMFASFContentInfo* This,
    IMFPresentationDescriptor **ppIPresentationDescriptor);
void __RPC_STUB IMFASFContentInfo_GeneratePresentationDescriptor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFContentInfo_GetEncodingConfigurationPropertyStore_Proxy(
    IMFASFContentInfo* This,
    WORD wStreamNumber,
    IPropertyStore **ppIStore);
void __RPC_STUB IMFASFContentInfo_GetEncodingConfigurationPropertyStore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_GetType_Proxy(
    IMFASFMutualExclusion* This,
    GUID *pguidType);
void __RPC_STUB IMFASFMutualExclusion_GetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_SetType_Proxy(
    IMFASFMutualExclusion* This,
    REFGUID guidType);
void __RPC_STUB IMFASFMutualExclusion_SetType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_GetRecordCount_Proxy(
    IMFASFMutualExclusion* This,
    DWORD *pdwRecordCount);
void __RPC_STUB IMFASFMutualExclusion_GetRecordCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_GetStreamsForRecord_Proxy(
    IMFASFMutualExclusion* This,
    DWORD dwRecordNumber,
    WORD *pwStreamNumArray,
    DWORD *pcStreams);
void __RPC_STUB IMFASFMutualExclusion_GetStreamsForRecord_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_AddStreamForRecord_Proxy(
    IMFASFMutualExclusion* This,
    DWORD dwRecordNumber,
    WORD wStreamNumber);
void __RPC_STUB IMFASFMutualExclusion_AddStreamForRecord_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_RemoveStreamFromRecord_Proxy(
    IMFASFMutualExclusion* This,
    DWORD dwRecordNumber,
    WORD wStreamNumber);
void __RPC_STUB IMFASFMutualExclusion_RemoveStreamFromRecord_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_RemoveRecord_Proxy(
    IMFASFMutualExclusion* This,
    DWORD dwRecordNumber);
void __RPC_STUB IMFASFMutualExclusion_RemoveRecord_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_AddRecord_Proxy(
    IMFASFMutualExclusion* This,
    DWORD *pdwRecordNumber);
void __RPC_STUB IMFASFMutualExclusion_AddRecord_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMutualExclusion_Clone_Proxy(
    IMFASFMutualExclusion* This,
    IMFASFMutualExclusion **ppIMutex);
void __RPC_STUB IMFASFMutualExclusion_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFStreamPrioritization_GetStreamCount_Proxy(
    IMFASFStreamPrioritization* This,
    DWORD *pdwStreamCount);
void __RPC_STUB IMFASFStreamPrioritization_GetStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamPrioritization_GetStream_Proxy(
    IMFASFStreamPrioritization* This,
    DWORD dwStreamIndex,
    WORD *pwStreamNumber,
    WORD *pwStreamFlags);
void __RPC_STUB IMFASFStreamPrioritization_GetStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamPrioritization_AddStream_Proxy(
    IMFASFStreamPrioritization* This,
    WORD wStreamNumber,
    WORD wStreamFlags);
void __RPC_STUB IMFASFStreamPrioritization_AddStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamPrioritization_RemoveStream_Proxy(
    IMFASFStreamPrioritization* This,
    DWORD dwStreamIndex);
void __RPC_STUB IMFASFStreamPrioritization_RemoveStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamPrioritization_Clone_Proxy(
    IMFASFStreamPrioritization* This,
    IMFASFStreamPrioritization **ppIStreamPrioritization);
void __RPC_STUB IMFASFStreamPrioritization_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFSplitter_Initialize_Proxy(
    IMFASFSplitter* This,
    IMFASFContentInfo *pIContentInfo);
void __RPC_STUB IMFASFSplitter_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_SetFlags_Proxy(
    IMFASFSplitter* This,
    DWORD dwFlags);
void __RPC_STUB IMFASFSplitter_SetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_GetFlags_Proxy(
    IMFASFSplitter* This,
    DWORD *pdwFlags);
void __RPC_STUB IMFASFSplitter_GetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_SelectStreams_Proxy(
    IMFASFSplitter* This,
    WORD *pwStreamNumbers,
    WORD wNumStreams);
void __RPC_STUB IMFASFSplitter_SelectStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_GetSelectedStreams_Proxy(
    IMFASFSplitter* This,
    WORD *pwStreamNumbers,
    WORD *pwNumStreams);
void __RPC_STUB IMFASFSplitter_GetSelectedStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_ParseData_Proxy(
    IMFASFSplitter* This,
    IMFMediaBuffer *pIBuffer,
    DWORD cbBufferOffset,
    DWORD cbLength);
void __RPC_STUB IMFASFSplitter_ParseData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_GetNextSample_Proxy(
    IMFASFSplitter* This,
    DWORD *pdwStatusFlags,
    WORD *pwStreamNumber,
    IMFSample **ppISample);
void __RPC_STUB IMFASFSplitter_GetNextSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_Flush_Proxy(
    IMFASFSplitter* This);
void __RPC_STUB IMFASFSplitter_Flush_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFSplitter_GetLastSendTime_Proxy(
    IMFASFSplitter* This,
    DWORD *pdwLastSendTime);
void __RPC_STUB IMFASFSplitter_GetLastSendTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_Initialize_Proxy(
    IMFASFMultiplexer* This,
    IMFASFContentInfo *pIContentInfo);
void __RPC_STUB IMFASFMultiplexer_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_SetFlags_Proxy(
    IMFASFMultiplexer* This,
    DWORD dwFlags);
void __RPC_STUB IMFASFMultiplexer_SetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_GetFlags_Proxy(
    IMFASFMultiplexer* This,
    DWORD *pdwFlags);
void __RPC_STUB IMFASFMultiplexer_GetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_ProcessSample_Proxy(
    IMFASFMultiplexer* This,
    WORD wStreamNumber,
    IMFSample *pISample,
    LONGLONG hnsTimestampAdjust);
void __RPC_STUB IMFASFMultiplexer_ProcessSample_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_GetNextPacket_Proxy(
    IMFASFMultiplexer* This,
    DWORD *pdwStatusFlags,
    IMFSample **ppIPacket);
void __RPC_STUB IMFASFMultiplexer_GetNextPacket_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_Flush_Proxy(
    IMFASFMultiplexer* This);
void __RPC_STUB IMFASFMultiplexer_Flush_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_End_Proxy(
    IMFASFMultiplexer* This,
    IMFASFContentInfo *pIContentInfo);
void __RPC_STUB IMFASFMultiplexer_End_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_GetStatistics_Proxy(
    IMFASFMultiplexer* This,
    WORD wStreamNumber,
    ASF_MUX_STATISTICS *pMuxStats);
void __RPC_STUB IMFASFMultiplexer_GetStatistics_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFMultiplexer_SetSyncTolerance_Proxy(
    IMFASFMultiplexer* This,
    DWORD msSyncTolerance);
void __RPC_STUB IMFASFMultiplexer_SetSyncTolerance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFIndexer_SetFlags_Proxy(
    IMFASFIndexer* This,
    DWORD dwFlags);
void __RPC_STUB IMFASFIndexer_SetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetFlags_Proxy(
    IMFASFIndexer* This,
    DWORD *pdwFlags);
void __RPC_STUB IMFASFIndexer_GetFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_Initialize_Proxy(
    IMFASFIndexer* This,
    IMFASFContentInfo *pIContentInfo);
void __RPC_STUB IMFASFIndexer_Initialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetIndexPosition_Proxy(
    IMFASFIndexer* This,
    IMFASFContentInfo *pIContentInfo,
    QWORD *pcbIndexOffset);
void __RPC_STUB IMFASFIndexer_GetIndexPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_SetIndexByteStreams_Proxy(
    IMFASFIndexer* This,
    IMFByteStream **ppIByteStreams,
    DWORD cByteStreams);
void __RPC_STUB IMFASFIndexer_SetIndexByteStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetIndexByteStreamCount_Proxy(
    IMFASFIndexer* This,
    DWORD *pcByteStreams);
void __RPC_STUB IMFASFIndexer_GetIndexByteStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetIndexStatus_Proxy(
    IMFASFIndexer* This,
    ASF_INDEX_IDENTIFIER *pIndexIdentifier,
    WINBOOL *pfIsIndexed,
    BYTE *pbIndexDescriptor,
    DWORD *pcbIndexDescriptor);
void __RPC_STUB IMFASFIndexer_GetIndexStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_SetIndexStatus_Proxy(
    IMFASFIndexer* This,
    BYTE *pbIndexDescriptor,
    DWORD cbIndexDescriptor,
    WINBOOL fGenerateIndex);
void __RPC_STUB IMFASFIndexer_SetIndexStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetSeekPositionForValue_Proxy(
    IMFASFIndexer* This,
    const PROPVARIANT *pvarValue,
    ASF_INDEX_IDENTIFIER *pIndexIdentifier,
    QWORD *pcbOffsetWithinData,
    MFTIME *phnsApproxTime,
    DWORD *pdwPayloadNumberOfStreamWithinPacket);
void __RPC_STUB IMFASFIndexer_GetSeekPositionForValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GenerateIndexEntries_Proxy(
    IMFASFIndexer* This,
    IMFSample *pIASFPacketSample);
void __RPC_STUB IMFASFIndexer_GenerateIndexEntries_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_CommitIndex_Proxy(
    IMFASFIndexer* This,
    IMFASFContentInfo *pIContentInfo);
void __RPC_STUB IMFASFIndexer_CommitIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetIndexWriteSpace_Proxy(
    IMFASFIndexer* This,
    QWORD *pcbIndexWriteSpace);
void __RPC_STUB IMFASFIndexer_GetIndexWriteSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFIndexer_GetCompletedIndex_Proxy(
    IMFASFIndexer* This,
    IMFMediaBuffer *pIIndexBuffer,
    QWORD cbOffsetWithinIndex);
void __RPC_STUB IMFASFIndexer_GetCompletedIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetStreamCount_Proxy(
    IMFASFStreamSelector* This,
    DWORD *pcStreams);
void __RPC_STUB IMFASFStreamSelector_GetStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputCount_Proxy(
    IMFASFStreamSelector* This,
    DWORD *pcOutputs);
void __RPC_STUB IMFASFStreamSelector_GetOutputCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputStreamCount_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    DWORD *pcStreams);
void __RPC_STUB IMFASFStreamSelector_GetOutputStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputStreamNumbers_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    WORD *rgwStreamNumbers);
void __RPC_STUB IMFASFStreamSelector_GetOutputStreamNumbers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputFromStream_Proxy(
    IMFASFStreamSelector* This,
    WORD wStreamNum,
    DWORD *pdwOutput);
void __RPC_STUB IMFASFStreamSelector_GetOutputFromStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputOverride_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    ASF_SELECTION_STATUS *pSelection);
void __RPC_STUB IMFASFStreamSelector_GetOutputOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_SetOutputOverride_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    ASF_SELECTION_STATUS Selection);
void __RPC_STUB IMFASFStreamSelector_SetOutputOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputMutexCount_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    DWORD *pcMutexes);
void __RPC_STUB IMFASFStreamSelector_GetOutputMutexCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetOutputMutex_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    DWORD dwMutexNum,
    IUnknown **ppMutex);
void __RPC_STUB IMFASFStreamSelector_GetOutputMutex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_SetOutputMutexSelection_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwOutputNum,
    DWORD dwMutexNum,
    WORD wSelectedRecord);
void __RPC_STUB IMFASFStreamSelector_SetOutputMutexSelection_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetBandwidthStepCount_Proxy(
    IMFASFStreamSelector* This,
    DWORD *pcStepCount);
void __RPC_STUB IMFASFStreamSelector_GetBandwidthStepCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_GetBandwidthStep_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwStepNum,
    DWORD *pdwBitrate,
    WORD *rgwStreamNumbers,
    ASF_SELECTION_STATUS *rgSelections);
void __RPC_STUB IMFASFStreamSelector_GetBandwidthStep_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_BitrateToStepNumber_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwBitrate,
    DWORD *pdwStepNum);
void __RPC_STUB IMFASFStreamSelector_BitrateToStepNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamSelector_SetStreamSelectorFlags_Proxy(
    IMFASFStreamSelector* This,
    DWORD dwStreamSelectorFlags);
void __RPC_STUB IMFASFStreamSelector_SetStreamSelectorFlags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFDRMNetHelper_ProcessLicenseRequest_Proxy(
    IMFDRMNetHelper* This,
    BYTE *pLicenseRequest,
    DWORD cbLicenseRequest,
    BYTE **ppLicenseResponse,
    DWORD *pcbLicenseResponse,
    BSTR *pbstrKID);
void __RPC_STUB IMFDRMNetHelper_ProcessLicenseRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFDRMNetHelper_GetChainedLicenseResponse_Proxy(
    IMFDRMNetHelper* This,
    BYTE **ppLicenseResponse,
    DWORD *pcbLicenseResponse);
void __RPC_STUB IMFDRMNetHelper_GetChainedLicenseResponse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFProfile_GetStreamCount_Proxy(
    IMFASFProfile* This,
    DWORD *pcStreams);
void __RPC_STUB IMFASFProfile_GetStreamCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_GetStream_Proxy(
    IMFASFProfile* This,
    DWORD dwStreamIndex,
    WORD *pwStreamNumber,
    IMFASFStreamConfig **ppIStream);
void __RPC_STUB IMFASFProfile_GetStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_GetStreamByNumber_Proxy(
    IMFASFProfile* This,
    WORD wStreamNumber,
    IMFASFStreamConfig **ppIStream);
void __RPC_STUB IMFASFProfile_GetStreamByNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_SetStream_Proxy(
    IMFASFProfile* This,
    IMFASFStreamConfig *pIStream);
void __RPC_STUB IMFASFProfile_SetStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_RemoveStream_Proxy(
    IMFASFProfile* This,
    WORD wStreamNumber);
void __RPC_STUB IMFASFProfile_RemoveStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_CreateStream_Proxy(
    IMFASFProfile* This,
    IMFMediaType *pIMediaType,
    IMFASFStreamConfig **ppIStream);
void __RPC_STUB IMFASFProfile_CreateStream_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_GetMutualExclusionCount_Proxy(
    IMFASFProfile* This,
    DWORD *pcMutexs);
void __RPC_STUB IMFASFProfile_GetMutualExclusionCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_GetMutualExclusion_Proxy(
    IMFASFProfile* This,
    DWORD dwMutexIndex,
    IMFASFMutualExclusion **ppIMutex);
void __RPC_STUB IMFASFProfile_GetMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_AddMutualExclusion_Proxy(
    IMFASFProfile* This,
    IMFASFMutualExclusion *pIMutex);
void __RPC_STUB IMFASFProfile_AddMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_RemoveMutualExclusion_Proxy(
    IMFASFProfile* This,
    DWORD dwMutexIndex);
void __RPC_STUB IMFASFProfile_RemoveMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_CreateMutualExclusion_Proxy(
    IMFASFProfile* This,
    IMFASFMutualExclusion **ppIMutex);
void __RPC_STUB IMFASFProfile_CreateMutualExclusion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_GetStreamPrioritization_Proxy(
    IMFASFProfile* This,
    IMFASFStreamPrioritization **ppIStreamPrioritization);
void __RPC_STUB IMFASFProfile_GetStreamPrioritization_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_AddStreamPrioritization_Proxy(
    IMFASFProfile* This,
    IMFASFStreamPrioritization *pIStreamPrioritization);
void __RPC_STUB IMFASFProfile_AddStreamPrioritization_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_RemoveStreamPrioritization_Proxy(
    IMFASFProfile* This);
void __RPC_STUB IMFASFProfile_RemoveStreamPrioritization_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_CreateStreamPrioritization_Proxy(
    IMFASFProfile* This,
    IMFASFStreamPrioritization **ppIStreamPrioritization);
void __RPC_STUB IMFASFProfile_CreateStreamPrioritization_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFProfile_Clone_Proxy(
    IMFASFProfile* This,
    IMFASFProfile **ppIProfile);
void __RPC_STUB IMFASFProfile_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_GetStreamType_Proxy(
    IMFASFStreamConfig* This,
    GUID *pguidStreamType);
void __RPC_STUB IMFASFStreamConfig_GetStreamType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
WORD STDMETHODCALLTYPE IMFASFStreamConfig_GetStreamNumber_Proxy(
    IMFASFStreamConfig* This);
void __RPC_STUB IMFASFStreamConfig_GetStreamNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_SetStreamNumber_Proxy(
    IMFASFStreamConfig* This,
    WORD wStreamNum);
void __RPC_STUB IMFASFStreamConfig_SetStreamNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_GetMediaType_Proxy(
    IMFASFStreamConfig* This,
    IMFMediaType **ppIMediaType);
void __RPC_STUB IMFASFStreamConfig_GetMediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_SetMediaType_Proxy(
    IMFASFStreamConfig* This,
    IMFMediaType *pIMediaType);
void __RPC_STUB IMFASFStreamConfig_SetMediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_GetPayloadExtensionCount_Proxy(
    IMFASFStreamConfig* This,
    WORD *pcPayloadExtensions);
void __RPC_STUB IMFASFStreamConfig_GetPayloadExtensionCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_GetPayloadExtension_Proxy(
    IMFASFStreamConfig* This,
    WORD wPayloadExtensionNumber,
    GUID *pguidExtensionSystemID,
    WORD *pcbExtensionDataSize,
    BYTE *pbExtensionSystemInfo,
    DWORD *pcbExtensionSystemInfo);
void __RPC_STUB IMFASFStreamConfig_GetPayloadExtension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_AddPayloadExtension_Proxy(
    IMFASFStreamConfig* This,
    GUID guidExtensionSystemID,
    WORD cbExtensionDataSize,
    BYTE *pbExtensionSystemInfo,
    DWORD cbExtensionSystemInfo);
void __RPC_STUB IMFASFStreamConfig_AddPayloadExtension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_RemoveAllPayloadExtensions_Proxy(
    IMFASFStreamConfig* This);
void __RPC_STUB IMFASFStreamConfig_RemoveAllPayloadExtensions_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMFASFStreamConfig_Clone_Proxy(
    IMFASFStreamConfig* This,
    IMFASFStreamConfig **ppIStreamConfig);
void __RPC_STUB IMFASFStreamConfig_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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__ */
