/*** Autogenerated by WIDL 3.1 from include/wmsdkidl.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 __wmsdkidl_h__
#define __wmsdkidl_h__

/* Forward declarations */

#ifndef __IWMStatusCallback_FWD_DEFINED__
#define __IWMStatusCallback_FWD_DEFINED__
typedef interface IWMStatusCallback IWMStatusCallback;
#ifdef __cplusplus
interface IWMStatusCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderCallback_FWD_DEFINED__
#define __IWMReaderCallback_FWD_DEFINED__
typedef interface IWMReaderCallback IWMReaderCallback;
#ifdef __cplusplus
interface IWMReaderCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWMStreamList_FWD_DEFINED__
#define __IWMStreamList_FWD_DEFINED__
typedef interface IWMStreamList IWMStreamList;
#ifdef __cplusplus
interface IWMStreamList;
#endif /* __cplusplus */
#endif

#ifndef __IWMMutualExclusion_FWD_DEFINED__
#define __IWMMutualExclusion_FWD_DEFINED__
typedef interface IWMMutualExclusion IWMMutualExclusion;
#ifdef __cplusplus
interface IWMMutualExclusion;
#endif /* __cplusplus */
#endif

#ifndef __IWMBandwidthSharing_FWD_DEFINED__
#define __IWMBandwidthSharing_FWD_DEFINED__
typedef interface IWMBandwidthSharing IWMBandwidthSharing;
#ifdef __cplusplus
interface IWMBandwidthSharing;
#endif /* __cplusplus */
#endif

#ifndef __IWMStreamPrioritization_FWD_DEFINED__
#define __IWMStreamPrioritization_FWD_DEFINED__
typedef interface IWMStreamPrioritization IWMStreamPrioritization;
#ifdef __cplusplus
interface IWMStreamPrioritization;
#endif /* __cplusplus */
#endif

#ifndef __IWMStreamConfig_FWD_DEFINED__
#define __IWMStreamConfig_FWD_DEFINED__
typedef interface IWMStreamConfig IWMStreamConfig;
#ifdef __cplusplus
interface IWMStreamConfig;
#endif /* __cplusplus */
#endif

#ifndef __IWMProfile_FWD_DEFINED__
#define __IWMProfile_FWD_DEFINED__
typedef interface IWMProfile IWMProfile;
#ifdef __cplusplus
interface IWMProfile;
#endif /* __cplusplus */
#endif

#ifndef __IWMProfile2_FWD_DEFINED__
#define __IWMProfile2_FWD_DEFINED__
typedef interface IWMProfile2 IWMProfile2;
#ifdef __cplusplus
interface IWMProfile2;
#endif /* __cplusplus */
#endif

#ifndef __IWMProfile3_FWD_DEFINED__
#define __IWMProfile3_FWD_DEFINED__
typedef interface IWMProfile3 IWMProfile3;
#ifdef __cplusplus
interface IWMProfile3;
#endif /* __cplusplus */
#endif

#ifndef __IWMProfileManager_FWD_DEFINED__
#define __IWMProfileManager_FWD_DEFINED__
typedef interface IWMProfileManager IWMProfileManager;
#ifdef __cplusplus
interface IWMProfileManager;
#endif /* __cplusplus */
#endif

#ifndef __IWMProfileManager2_FWD_DEFINED__
#define __IWMProfileManager2_FWD_DEFINED__
typedef interface IWMProfileManager2 IWMProfileManager2;
#ifdef __cplusplus
interface IWMProfileManager2;
#endif /* __cplusplus */
#endif

#ifndef __IWMCodecInfo_FWD_DEFINED__
#define __IWMCodecInfo_FWD_DEFINED__
typedef interface IWMCodecInfo IWMCodecInfo;
#ifdef __cplusplus
interface IWMCodecInfo;
#endif /* __cplusplus */
#endif

#ifndef __IWMCodecInfo2_FWD_DEFINED__
#define __IWMCodecInfo2_FWD_DEFINED__
typedef interface IWMCodecInfo2 IWMCodecInfo2;
#ifdef __cplusplus
interface IWMCodecInfo2;
#endif /* __cplusplus */
#endif

#ifndef __IWMCodecInfo3_FWD_DEFINED__
#define __IWMCodecInfo3_FWD_DEFINED__
typedef interface IWMCodecInfo3 IWMCodecInfo3;
#ifdef __cplusplus
interface IWMCodecInfo3;
#endif /* __cplusplus */
#endif

#ifndef __IWMMediaProps_FWD_DEFINED__
#define __IWMMediaProps_FWD_DEFINED__
typedef interface IWMMediaProps IWMMediaProps;
#ifdef __cplusplus
interface IWMMediaProps;
#endif /* __cplusplus */
#endif

#ifndef __IWMOutputMediaProps_FWD_DEFINED__
#define __IWMOutputMediaProps_FWD_DEFINED__
typedef interface IWMOutputMediaProps IWMOutputMediaProps;
#ifdef __cplusplus
interface IWMOutputMediaProps;
#endif /* __cplusplus */
#endif

#ifndef __IWMMetadataEditor_FWD_DEFINED__
#define __IWMMetadataEditor_FWD_DEFINED__
typedef interface IWMMetadataEditor IWMMetadataEditor;
#ifdef __cplusplus
interface IWMMetadataEditor;
#endif /* __cplusplus */
#endif

#ifndef __IWMReader_FWD_DEFINED__
#define __IWMReader_FWD_DEFINED__
typedef interface IWMReader IWMReader;
#ifdef __cplusplus
interface IWMReader;
#endif /* __cplusplus */
#endif

#ifndef __IWMPlayerHook_FWD_DEFINED__
#define __IWMPlayerHook_FWD_DEFINED__
typedef interface IWMPlayerHook IWMPlayerHook;
#ifdef __cplusplus
interface IWMPlayerHook;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced_FWD_DEFINED__
#define __IWMReaderAdvanced_FWD_DEFINED__
typedef interface IWMReaderAdvanced IWMReaderAdvanced;
#ifdef __cplusplus
interface IWMReaderAdvanced;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced2_FWD_DEFINED__
#define __IWMReaderAdvanced2_FWD_DEFINED__
typedef interface IWMReaderAdvanced2 IWMReaderAdvanced2;
#ifdef __cplusplus
interface IWMReaderAdvanced2;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced3_FWD_DEFINED__
#define __IWMReaderAdvanced3_FWD_DEFINED__
typedef interface IWMReaderAdvanced3 IWMReaderAdvanced3;
#ifdef __cplusplus
interface IWMReaderAdvanced3;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced4_FWD_DEFINED__
#define __IWMReaderAdvanced4_FWD_DEFINED__
typedef interface IWMReaderAdvanced4 IWMReaderAdvanced4;
#ifdef __cplusplus
interface IWMReaderAdvanced4;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced5_FWD_DEFINED__
#define __IWMReaderAdvanced5_FWD_DEFINED__
typedef interface IWMReaderAdvanced5 IWMReaderAdvanced5;
#ifdef __cplusplus
interface IWMReaderAdvanced5;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAdvanced6_FWD_DEFINED__
#define __IWMReaderAdvanced6_FWD_DEFINED__
typedef interface IWMReaderAdvanced6 IWMReaderAdvanced6;
#ifdef __cplusplus
interface IWMReaderAdvanced6;
#endif /* __cplusplus */
#endif

#ifndef __IWMSyncReader_FWD_DEFINED__
#define __IWMSyncReader_FWD_DEFINED__
typedef interface IWMSyncReader IWMSyncReader;
#ifdef __cplusplus
interface IWMSyncReader;
#endif /* __cplusplus */
#endif

#ifndef __IWMInputMediaProps_FWD_DEFINED__
#define __IWMInputMediaProps_FWD_DEFINED__
typedef interface IWMInputMediaProps IWMInputMediaProps;
#ifdef __cplusplus
interface IWMInputMediaProps;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriterSink_FWD_DEFINED__
#define __IWMWriterSink_FWD_DEFINED__
typedef interface IWMWriterSink IWMWriterSink;
#ifdef __cplusplus
interface IWMWriterSink;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriter_FWD_DEFINED__
#define __IWMWriter_FWD_DEFINED__
typedef interface IWMWriter IWMWriter;
#ifdef __cplusplus
interface IWMWriter;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriterAdvanced_FWD_DEFINED__
#define __IWMWriterAdvanced_FWD_DEFINED__
typedef interface IWMWriterAdvanced IWMWriterAdvanced;
#ifdef __cplusplus
interface IWMWriterAdvanced;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriterAdvanced2_FWD_DEFINED__
#define __IWMWriterAdvanced2_FWD_DEFINED__
typedef interface IWMWriterAdvanced2 IWMWriterAdvanced2;
#ifdef __cplusplus
interface IWMWriterAdvanced2;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriterAdvanced3_FWD_DEFINED__
#define __IWMWriterAdvanced3_FWD_DEFINED__
typedef interface IWMWriterAdvanced3 IWMWriterAdvanced3;
#ifdef __cplusplus
interface IWMWriterAdvanced3;
#endif /* __cplusplus */
#endif

#ifndef __IWMHeaderInfo_FWD_DEFINED__
#define __IWMHeaderInfo_FWD_DEFINED__
typedef interface IWMHeaderInfo IWMHeaderInfo;
#ifdef __cplusplus
interface IWMHeaderInfo;
#endif /* __cplusplus */
#endif

#ifndef __IWMHeaderInfo2_FWD_DEFINED__
#define __IWMHeaderInfo2_FWD_DEFINED__
typedef interface IWMHeaderInfo2 IWMHeaderInfo2;
#ifdef __cplusplus
interface IWMHeaderInfo2;
#endif /* __cplusplus */
#endif

#ifndef __IWMHeaderInfo3_FWD_DEFINED__
#define __IWMHeaderInfo3_FWD_DEFINED__
typedef interface IWMHeaderInfo3 IWMHeaderInfo3;
#ifdef __cplusplus
interface IWMHeaderInfo3;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderNetworkConfig_FWD_DEFINED__
#define __IWMReaderNetworkConfig_FWD_DEFINED__
typedef interface IWMReaderNetworkConfig IWMReaderNetworkConfig;
#ifdef __cplusplus
interface IWMReaderNetworkConfig;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderNetworkConfig2_FWD_DEFINED__
#define __IWMReaderNetworkConfig2_FWD_DEFINED__
typedef interface IWMReaderNetworkConfig2 IWMReaderNetworkConfig2;
#ifdef __cplusplus
interface IWMReaderNetworkConfig2;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderStreamClock_FWD_DEFINED__
#define __IWMReaderStreamClock_FWD_DEFINED__
typedef interface IWMReaderStreamClock IWMReaderStreamClock;
#ifdef __cplusplus
interface IWMReaderStreamClock;
#endif /* __cplusplus */
#endif

#ifndef __IWMPacketSize_FWD_DEFINED__
#define __IWMPacketSize_FWD_DEFINED__
typedef interface IWMPacketSize IWMPacketSize;
#ifdef __cplusplus
interface IWMPacketSize;
#endif /* __cplusplus */
#endif

#ifndef __IWMPacketSize2_FWD_DEFINED__
#define __IWMPacketSize2_FWD_DEFINED__
typedef interface IWMPacketSize2 IWMPacketSize2;
#ifdef __cplusplus
interface IWMPacketSize2;
#endif /* __cplusplus */
#endif

#ifndef __IWMDRMReader_FWD_DEFINED__
#define __IWMDRMReader_FWD_DEFINED__
typedef interface IWMDRMReader IWMDRMReader;
#ifdef __cplusplus
interface IWMDRMReader;
#endif /* __cplusplus */
#endif

#ifndef __IWMDRMReader2_FWD_DEFINED__
#define __IWMDRMReader2_FWD_DEFINED__
typedef interface IWMDRMReader2 IWMDRMReader2;
#ifdef __cplusplus
interface IWMDRMReader2;
#endif /* __cplusplus */
#endif

#ifndef __IWMDRMReader3_FWD_DEFINED__
#define __IWMDRMReader3_FWD_DEFINED__
typedef interface IWMDRMReader3 IWMDRMReader3;
#ifdef __cplusplus
interface IWMDRMReader3;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderAccelerator_FWD_DEFINED__
#define __IWMReaderAccelerator_FWD_DEFINED__
typedef interface IWMReaderAccelerator IWMReaderAccelerator;
#ifdef __cplusplus
interface IWMReaderAccelerator;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderTimecode_FWD_DEFINED__
#define __IWMReaderTimecode_FWD_DEFINED__
typedef interface IWMReaderTimecode IWMReaderTimecode;
#ifdef __cplusplus
interface IWMReaderTimecode;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderTypeNegotiation_FWD_DEFINED__
#define __IWMReaderTypeNegotiation_FWD_DEFINED__
typedef interface IWMReaderTypeNegotiation IWMReaderTypeNegotiation;
#ifdef __cplusplus
interface IWMReaderTypeNegotiation;
#endif /* __cplusplus */
#endif

#ifndef __IWMLanguageList_FWD_DEFINED__
#define __IWMLanguageList_FWD_DEFINED__
typedef interface IWMLanguageList IWMLanguageList;
#ifdef __cplusplus
interface IWMLanguageList;
#endif /* __cplusplus */
#endif

#ifndef __IWMReaderPlaylistBurn_FWD_DEFINED__
#define __IWMReaderPlaylistBurn_FWD_DEFINED__
typedef interface IWMReaderPlaylistBurn IWMReaderPlaylistBurn;
#ifdef __cplusplus
interface IWMReaderPlaylistBurn;
#endif /* __cplusplus */
#endif

#ifndef __IWMPropertyVault_FWD_DEFINED__
#define __IWMPropertyVault_FWD_DEFINED__
typedef interface IWMPropertyVault IWMPropertyVault;
#ifdef __cplusplus
interface IWMPropertyVault;
#endif /* __cplusplus */
#endif

#ifndef __IWMWriterPreprocess_FWD_DEFINED__
#define __IWMWriterPreprocess_FWD_DEFINED__
typedef interface IWMWriterPreprocess IWMWriterPreprocess;
#ifdef __cplusplus
interface IWMWriterPreprocess;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <wmsbuffer.h>
#include <drmexternals.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _WMMediaType {
    GUID majortype;
    GUID subtype;
    WINBOOL bFixedSizeSamples;
    WINBOOL bTemporalCompression;
    ULONG lSampleSize;
    GUID formattype;
    IUnknown *pUnk;
    ULONG cbFormat;
    BYTE *pbFormat;
} WM_MEDIA_TYPE;
typedef struct _WMWriterStatistics {
    QWORD qwSampleCount;
    QWORD qwByteCount;
    QWORD qwDroppedSampleCount;
    QWORD qwDroppedByteCount;
    DWORD dwCurrentBitrate;
    DWORD dwAverageBitrate;
    DWORD dwExpectedBitrate;
    DWORD dwCurrentSampleRate;
    DWORD dwAverageSampleRate;
    DWORD dwExpectedSampleRate;
} WM_WRITER_STATISTICS;
typedef struct _WMWriterStatisticsEx {
    DWORD dwBitratePlusOverhead;
    DWORD dwCurrentSampleDropRateInQueue;
    DWORD dwCurrentSampleDropRateInCodec;
    DWORD dwCurrentSampleDropRateInMultiplexer;
    DWORD dwTotalSampleDropsInQueue;
    DWORD dwTotalSampleDropsInCodec;
    DWORD dwTotalSampleDropsInMultiplexer;
} WM_WRITER_STATISTICS_EX;
typedef struct _WMReaderStatistics {
    DWORD cbSize;
    DWORD dwBandwidth;
    DWORD cPacketsReceived;
    DWORD cPacketsRecovered;
    DWORD cPacketsLost;
    WORD wQuality;
} WM_READER_STATISTICS;
typedef struct _WMReaderClientInfo {
    DWORD cbSize;
    WCHAR *wszLang;
    WCHAR *wszBrowserUserAgent;
    WCHAR *wszBrowserWebPage;
    QWORD qwReserved;
    LPARAM *pReserved;
    WCHAR *wszHostExe;
    QWORD qwHostVersion;
    WCHAR *wszPlayerUserAgent;
} WM_READER_CLIENTINFO;
typedef enum WMT_ATTR_DATATYPE {
    WMT_TYPE_DWORD = 0,
    WMT_TYPE_STRING = 1,
    WMT_TYPE_BINARY = 2,
    WMT_TYPE_BOOL = 3,
    WMT_TYPE_QWORD = 4,
    WMT_TYPE_WORD = 5,
    WMT_TYPE_GUID = 6
} WMT_ATTR_DATATYPE;
typedef enum WMT_STATUS {
    WMT_ERROR = 0,
    WMT_OPENED = 1,
    WMT_BUFFERING_START = 2,
    WMT_BUFFERING_STOP = 3,
    WMT_EOF = 4,
    WMT_END_OF_FILE = 4,
    WMT_END_OF_SEGMENT = 5,
    WMT_END_OF_STREAMING = 6,
    WMT_LOCATING = 7,
    WMT_CONNECTING = 8,
    WMT_NO_RIGHTS = 9,
    WMT_MISSING_CODEC = 10,
    WMT_STARTED = 11,
    WMT_STOPPED = 12,
    WMT_CLOSED = 13,
    WMT_STRIDING = 14,
    WMT_TIMER = 15,
    WMT_INDEX_PROGRESS = 16,
    WMT_SAVEAS_START = 17,
    WMT_SAVEAS_STOP = 18,
    WMT_NEW_SOURCEFLAGS = 19,
    WMT_NEW_METADATA = 20,
    WMT_BACKUPRESTORE_BEGIN = 21,
    WMT_SOURCE_SWITCH = 22,
    WMT_ACQUIRE_LICENSE = 23,
    WMT_INDIVIDUALIZE = 24,
    WMT_NEEDS_INDIVIDUALIZATION = 25,
    WMT_NO_RIGHTS_EX = 26,
    WMT_BACKUPRESTORE_END = 27,
    WMT_BACKUPRESTORE_CONNECTING = 28,
    WMT_BACKUPRESTORE_DISCONNECTING = 29,
    WMT_ERROR_WITHURL = 30,
    WMT_RESTRICTED_LICENSE = 31,
    WMT_CLIENT_CONNECT = 32,
    WMT_CLIENT_DISCONNECT = 33,
    WMT_NATIVE_OUTPUT_PROPS_CHANGED = 34,
    WMT_RECONNECT_START = 35,
    WMT_RECONNECT_END = 36,
    WMT_CLIENT_CONNECT_EX = 37,
    WMT_CLIENT_DISCONNECT_EX = 38,
    WMT_SET_FEC_SPAN = 39,
    WMT_PREROLL_READY = 40,
    WMT_PREROLL_COMPLETE = 41,
    WMT_CLIENT_PROPERTIES = 42,
    WMT_LICENSEURL_SIGNATURE_STATE = 43,
    WMT_INIT_PLAYLIST_BURN = 44,
    WMT_TRANSCRYPTOR_INIT = 45,
    WMT_TRANSCRYPTOR_SEEKED = 46,
    WMT_TRANSCRYPTOR_READ = 47,
    WMT_TRANSCRYPTOR_CLOSED = 48,
    WMT_PROXIMITY_RESULT = 49,
    WMT_PROXIMITY_COMPLETED = 50,
    WMT_CONTENT_ENABLER = 51
} WMT_STATUS;
typedef enum WMT_STREAM_SELECTION {
    WMT_OFF = 0,
    WMT_CLEANPOINT_ONLY = 1,
    WMT_ON = 2
} WMT_STREAM_SELECTION;
typedef enum WMT_VERSION {
    WMT_VER_4_0 = 0x40000,
    WMT_VER_7_0 = 0x70000,
    WMT_VER_8_0 = 0x80000,
    WMT_VER_9_0 = 0x90000
} WMT_VERSION;
typedef enum WMT_PLAY_MODE {
    WMT_PLAY_MODE_AUTOSELECT = 0,
    WMT_PLAY_MODE_LOCAL = 1,
    WMT_PLAY_MODE_DOWNLOAD = 2,
    WMT_PLAY_MODE_STREAMING = 3
} WMT_PLAY_MODE;
typedef enum tagWMT_OFFSET_FORMAT {
    WMT_OFFSET_FORMAT_100NS = 0,
    WMT_OFFSET_FORMAT_FRAME_NUMBERS = 1,
    WMT_OFFSET_FORMAT_PLAYLIST_OFFSET = 2,
    WMT_OFFSET_FORMAT_TIMECODE = 3,
    WMT_OFFSET_FORMAT_100NS_APPROXIMATE = 4
} WMT_OFFSET_FORMAT;
typedef enum WMT_CODEC_INFO_TYPE {
    WMT_CODECINFO_AUDIO = 0,
    WMT_CODECINFO_VIDEO = 1,
    WMT_CODECINFO_UNKNOWN = 0xffffffff
} WMT_CODEC_INFO_TYPE;
typedef enum WMT_PROXY_SETTINGS {
    WMT_PROXY_SETTING_NONE = 0,
    WMT_PROXY_SETTING_MANUAL = 1,
    WMT_PROXY_SETTING_AUTO = 2,
    WMT_PROXY_SETTING_BROWSER = 3,
    WMT_PROXY_SETTING_MAX = 4
} WMT_PROXY_SETTINGS;
typedef enum tagWMT_STORAGE_FORMAT {
    WMT_Storage_Format_MP3 = 0,
    WMT_Storage_Format_V1 = 1
} WMT_STORAGE_FORMAT;
typedef struct _WMStreamPrioritizationRecord {
    WORD wStreamNumber;
    WINBOOL fMandatory;
} WM_STREAM_PRIORITY_RECORD;
typedef struct _WM_PORT_NUMBER_RANGE {
    WORD wPortBegin;
    WORD wPortEnd;
} WM_PORT_NUMBER_RANGE;
typedef LPCWSTR LPCWSTR_WMSDK_TYPE_SAFE;
/*****************************************************************************
 * IWMStatusCallback interface
 */
#ifndef __IWMStatusCallback_INTERFACE_DEFINED__
#define __IWMStatusCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStatusCallback, 0x6d7cdc70, 0x9888, 0x11d3, 0x8e,0xdc, 0x00,0xc0,0x4f,0x61,0x09,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d7cdc70-9888-11d3-8edc-00c04f6109cf")
IWMStatusCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStatus(
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStatusCallback, 0x6d7cdc70, 0x9888, 0x11d3, 0x8e,0xdc, 0x00,0xc0,0x4f,0x61,0x09,0xcf)
#endif
#else
typedef struct IWMStatusCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStatusCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStatus)(
        IWMStatusCallback *This,
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext);

    END_INTERFACE
} IWMStatusCallbackVtbl;

interface IWMStatusCallback {
    CONST_VTBL IWMStatusCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStatusCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStatusCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStatusCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStatusCallback methods ***/
#define IWMStatusCallback_OnStatus(This,Status,hr,dwType,pValue,pvContext) (This)->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStatusCallback_QueryInterface(IWMStatusCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStatusCallback_AddRef(IWMStatusCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStatusCallback_Release(IWMStatusCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStatusCallback methods ***/
static FORCEINLINE HRESULT IWMStatusCallback_OnStatus(IWMStatusCallback* This,WMT_STATUS Status,HRESULT hr,WMT_ATTR_DATATYPE dwType,BYTE *pValue,void *pvContext) {
    return This->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext);
}
#endif
#endif

#endif


#endif  /* __IWMStatusCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderCallback interface
 */
#ifndef __IWMReaderCallback_INTERFACE_DEFINED__
#define __IWMReaderCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderCallback, 0x96406bd8, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd8-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderCallback : public IWMStatusCallback
{
    virtual HRESULT STDMETHODCALLTYPE OnSample(
        DWORD dwOutputNum,
        QWORD cnsSampleTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderCallback, 0x96406bd8, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStatusCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStatus)(
        IWMReaderCallback *This,
        WMT_STATUS Status,
        HRESULT hr,
        WMT_ATTR_DATATYPE dwType,
        BYTE *pValue,
        void *pvContext);

    /*** IWMReaderCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSample)(
        IWMReaderCallback *This,
        DWORD dwOutputNum,
        QWORD cnsSampleTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample,
        void *pvContext);

    END_INTERFACE
} IWMReaderCallbackVtbl;

interface IWMReaderCallback {
    CONST_VTBL IWMReaderCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStatusCallback methods ***/
#define IWMReaderCallback_OnStatus(This,Status,hr,dwType,pValue,pvContext) (This)->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext)
/*** IWMReaderCallback methods ***/
#define IWMReaderCallback_OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext) (This)->lpVtbl->OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_QueryInterface(IWMReaderCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderCallback_AddRef(IWMReaderCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderCallback_Release(IWMReaderCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStatusCallback methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_OnStatus(IWMReaderCallback* This,WMT_STATUS Status,HRESULT hr,WMT_ATTR_DATATYPE dwType,BYTE *pValue,void *pvContext) {
    return This->lpVtbl->OnStatus(This,Status,hr,dwType,pValue,pvContext);
}
/*** IWMReaderCallback methods ***/
static FORCEINLINE HRESULT IWMReaderCallback_OnSample(IWMReaderCallback* This,DWORD dwOutputNum,QWORD cnsSampleTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample,void *pvContext) {
    return This->lpVtbl->OnSample(This,dwOutputNum,cnsSampleTime,cnsSampleDuration,dwFlags,pSample,pvContext);
}
#endif
#endif

#endif


#endif  /* __IWMReaderCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMStreamList interface
 */
#ifndef __IWMStreamList_INTERFACE_DEFINED__
#define __IWMStreamList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStreamList, 0x96406bdd, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdd-2b2b-11d3-b36b-00c04f6108ff")
IWMStreamList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreams(
        WORD *pwStreamNumArray,
        WORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        WORD wStreamNum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStreamList, 0x96406bdd, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMStreamListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreams)(
        IWMStreamList *This,
        WORD *pwStreamNumArray,
        WORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMStreamList *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMStreamList *This,
        WORD wStreamNum);

    END_INTERFACE
} IWMStreamListVtbl;

interface IWMStreamList {
    CONST_VTBL IWMStreamListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStreamList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStreamList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStreamList_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamList methods ***/
#define IWMStreamList_GetStreams(This,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams)
#define IWMStreamList_AddStream(This,wStreamNum) (This)->lpVtbl->AddStream(This,wStreamNum)
#define IWMStreamList_RemoveStream(This,wStreamNum) (This)->lpVtbl->RemoveStream(This,wStreamNum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStreamList_QueryInterface(IWMStreamList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStreamList_AddRef(IWMStreamList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStreamList_Release(IWMStreamList* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamList methods ***/
static FORCEINLINE HRESULT IWMStreamList_GetStreams(IWMStreamList* This,WORD *pwStreamNumArray,WORD *pcStreams) {
    return This->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IWMStreamList_AddStream(IWMStreamList* This,WORD wStreamNum) {
    return This->lpVtbl->AddStream(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMStreamList_RemoveStream(IWMStreamList* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStream(This,wStreamNum);
}
#endif
#endif

#endif


#endif  /* __IWMStreamList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMMutualExclusion interface
 */
#ifndef __IWMMutualExclusion_INTERFACE_DEFINED__
#define __IWMMutualExclusion_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMutualExclusion, 0x96406bde, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bde-2b2b-11d3-b36b-00c04f6108ff")
IWMMutualExclusion : public IWMStreamList
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *pguidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetType(
        REFGUID guidType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMutualExclusion, 0x96406bde, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMutualExclusionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreams)(
        IWMMutualExclusion *This,
        WORD *pwStreamNumArray,
        WORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMMutualExclusion *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMMutualExclusion *This,
        WORD wStreamNum);

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

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

    END_INTERFACE
} IWMMutualExclusionVtbl;

interface IWMMutualExclusion {
    CONST_VTBL IWMMutualExclusionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMutualExclusion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMutualExclusion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMutualExclusion_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamList methods ***/
#define IWMMutualExclusion_GetStreams(This,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams)
#define IWMMutualExclusion_AddStream(This,wStreamNum) (This)->lpVtbl->AddStream(This,wStreamNum)
#define IWMMutualExclusion_RemoveStream(This,wStreamNum) (This)->lpVtbl->RemoveStream(This,wStreamNum)
/*** IWMMutualExclusion methods ***/
#define IWMMutualExclusion_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMMutualExclusion_SetType(This,guidType) (This)->lpVtbl->SetType(This,guidType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_QueryInterface(IWMMutualExclusion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMutualExclusion_AddRef(IWMMutualExclusion* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMutualExclusion_Release(IWMMutualExclusion* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamList methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_GetStreams(IWMMutualExclusion* This,WORD *pwStreamNumArray,WORD *pcStreams) {
    return This->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IWMMutualExclusion_AddStream(IWMMutualExclusion* This,WORD wStreamNum) {
    return This->lpVtbl->AddStream(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMMutualExclusion_RemoveStream(IWMMutualExclusion* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStream(This,wStreamNum);
}
/*** IWMMutualExclusion methods ***/
static FORCEINLINE HRESULT IWMMutualExclusion_GetType(IWMMutualExclusion* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMMutualExclusion_SetType(IWMMutualExclusion* This,REFGUID guidType) {
    return This->lpVtbl->SetType(This,guidType);
}
#endif
#endif

#endif


#endif  /* __IWMMutualExclusion_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMBandwidthSharing interface
 */
#ifndef __IWMBandwidthSharing_INTERFACE_DEFINED__
#define __IWMBandwidthSharing_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMBandwidthSharing, 0xad694af1, 0xf8d9, 0x42f8, 0xbc,0x47, 0x70,0x31,0x1b,0x0c,0x4f,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ad694af1-f8d9-42f8-bc47-70311b0c4f9e")
IWMBandwidthSharing : public IWMStreamList
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetType(
        REFGUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandwidth(
        DWORD *bitrate,
        DWORD *buffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBandwidth(
        DWORD bitrate,
        DWORD buffer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMBandwidthSharing, 0xad694af1, 0xf8d9, 0x42f8, 0xbc,0x47, 0x70,0x31,0x1b,0x0c,0x4f,0x9e)
#endif
#else
typedef struct IWMBandwidthSharingVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreams)(
        IWMBandwidthSharing *This,
        WORD *pwStreamNumArray,
        WORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMBandwidthSharing *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMBandwidthSharing *This,
        WORD wStreamNum);

    /*** IWMBandwidthSharing methods ***/
    HRESULT (STDMETHODCALLTYPE *GetType)(
        IWMBandwidthSharing *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *SetType)(
        IWMBandwidthSharing *This,
        REFGUID guid);

    HRESULT (STDMETHODCALLTYPE *GetBandwidth)(
        IWMBandwidthSharing *This,
        DWORD *bitrate,
        DWORD *buffer);

    HRESULT (STDMETHODCALLTYPE *SetBandwidth)(
        IWMBandwidthSharing *This,
        DWORD bitrate,
        DWORD buffer);

    END_INTERFACE
} IWMBandwidthSharingVtbl;

interface IWMBandwidthSharing {
    CONST_VTBL IWMBandwidthSharingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMBandwidthSharing_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMBandwidthSharing_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMBandwidthSharing_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamList methods ***/
#define IWMBandwidthSharing_GetStreams(This,pwStreamNumArray,pcStreams) (This)->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams)
#define IWMBandwidthSharing_AddStream(This,wStreamNum) (This)->lpVtbl->AddStream(This,wStreamNum)
#define IWMBandwidthSharing_RemoveStream(This,wStreamNum) (This)->lpVtbl->RemoveStream(This,wStreamNum)
/*** IWMBandwidthSharing methods ***/
#define IWMBandwidthSharing_GetType(This,guid) (This)->lpVtbl->GetType(This,guid)
#define IWMBandwidthSharing_SetType(This,guid) (This)->lpVtbl->SetType(This,guid)
#define IWMBandwidthSharing_GetBandwidth(This,bitrate,buffer) (This)->lpVtbl->GetBandwidth(This,bitrate,buffer)
#define IWMBandwidthSharing_SetBandwidth(This,bitrate,buffer) (This)->lpVtbl->SetBandwidth(This,bitrate,buffer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMBandwidthSharing_QueryInterface(IWMBandwidthSharing* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMBandwidthSharing_AddRef(IWMBandwidthSharing* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMBandwidthSharing_Release(IWMBandwidthSharing* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamList methods ***/
static FORCEINLINE HRESULT IWMBandwidthSharing_GetStreams(IWMBandwidthSharing* This,WORD *pwStreamNumArray,WORD *pcStreams) {
    return This->lpVtbl->GetStreams(This,pwStreamNumArray,pcStreams);
}
static FORCEINLINE HRESULT IWMBandwidthSharing_AddStream(IWMBandwidthSharing* This,WORD wStreamNum) {
    return This->lpVtbl->AddStream(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMBandwidthSharing_RemoveStream(IWMBandwidthSharing* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStream(This,wStreamNum);
}
/*** IWMBandwidthSharing methods ***/
static FORCEINLINE HRESULT IWMBandwidthSharing_GetType(IWMBandwidthSharing* This,GUID *guid) {
    return This->lpVtbl->GetType(This,guid);
}
static FORCEINLINE HRESULT IWMBandwidthSharing_SetType(IWMBandwidthSharing* This,REFGUID guid) {
    return This->lpVtbl->SetType(This,guid);
}
static FORCEINLINE HRESULT IWMBandwidthSharing_GetBandwidth(IWMBandwidthSharing* This,DWORD *bitrate,DWORD *buffer) {
    return This->lpVtbl->GetBandwidth(This,bitrate,buffer);
}
static FORCEINLINE HRESULT IWMBandwidthSharing_SetBandwidth(IWMBandwidthSharing* This,DWORD bitrate,DWORD buffer) {
    return This->lpVtbl->SetBandwidth(This,bitrate,buffer);
}
#endif
#endif

#endif


#endif  /* __IWMBandwidthSharing_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMStreamPrioritization interface
 */
#ifndef __IWMStreamPrioritization_INTERFACE_DEFINED__
#define __IWMStreamPrioritization_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStreamPrioritization, 0x8c1c6090, 0xf9a8, 0x4748, 0x8e,0xc3, 0xdd,0x11,0x08,0xba,0x1e,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8c1c6090-f9a8-4748-8ec3-dd1108ba1e77")
IWMStreamPrioritization : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPriorityRecords(
        WM_STREAM_PRIORITY_RECORD *array,
        WORD *records) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPriorityRecords(
        WM_STREAM_PRIORITY_RECORD *array,
        WORD records) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStreamPrioritization, 0x8c1c6090, 0xf9a8, 0x4748, 0x8e,0xc3, 0xdd,0x11,0x08,0xba,0x1e,0x77)
#endif
#else
typedef struct IWMStreamPrioritizationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMStreamPrioritization methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPriorityRecords)(
        IWMStreamPrioritization *This,
        WM_STREAM_PRIORITY_RECORD *array,
        WORD *records);

    HRESULT (STDMETHODCALLTYPE *SetPriorityRecords)(
        IWMStreamPrioritization *This,
        WM_STREAM_PRIORITY_RECORD *array,
        WORD records);

    END_INTERFACE
} IWMStreamPrioritizationVtbl;

interface IWMStreamPrioritization {
    CONST_VTBL IWMStreamPrioritizationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStreamPrioritization_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStreamPrioritization_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStreamPrioritization_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamPrioritization methods ***/
#define IWMStreamPrioritization_GetPriorityRecords(This,array,records) (This)->lpVtbl->GetPriorityRecords(This,array,records)
#define IWMStreamPrioritization_SetPriorityRecords(This,array,records) (This)->lpVtbl->SetPriorityRecords(This,array,records)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStreamPrioritization_QueryInterface(IWMStreamPrioritization* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStreamPrioritization_AddRef(IWMStreamPrioritization* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStreamPrioritization_Release(IWMStreamPrioritization* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamPrioritization methods ***/
static FORCEINLINE HRESULT IWMStreamPrioritization_GetPriorityRecords(IWMStreamPrioritization* This,WM_STREAM_PRIORITY_RECORD *array,WORD *records) {
    return This->lpVtbl->GetPriorityRecords(This,array,records);
}
static FORCEINLINE HRESULT IWMStreamPrioritization_SetPriorityRecords(IWMStreamPrioritization* This,WM_STREAM_PRIORITY_RECORD *array,WORD records) {
    return This->lpVtbl->SetPriorityRecords(This,array,records);
}
#endif
#endif

#endif


#endif  /* __IWMStreamPrioritization_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMStreamConfig interface
 */
#ifndef __IWMStreamConfig_INTERFACE_DEFINED__
#define __IWMStreamConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMStreamConfig, 0x96406bdc, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdc-2b2b-11d3-b36b-00c04f6108ff")
IWMStreamConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamType(
        GUID *pguidStreamType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamNumber(
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamNumber(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamName(
        WCHAR *pwszStreamName,
        WORD *pcchStreamName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamName(
        LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszInputName,
        WORD *pcchInputName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConnectionName(
        LPCWSTR_WMSDK_TYPE_SAFE pwszInputName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitrate(
        DWORD *pdwBitrate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBitrate(
        DWORD pdwBitrate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBufferWindow(
        DWORD *pmsBufferWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBufferWindow(
        DWORD msBufferWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMStreamConfig, 0x96406bdc, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMStreamConfigVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetStreamNumber)(
        IWMStreamConfig *This,
        WORD *pwStreamNum);

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

    HRESULT (STDMETHODCALLTYPE *GetStreamName)(
        IWMStreamConfig *This,
        WCHAR *pwszStreamName,
        WORD *pcchStreamName);

    HRESULT (STDMETHODCALLTYPE *SetStreamName)(
        IWMStreamConfig *This,
        LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName);

    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMStreamConfig *This,
        WCHAR *pwszInputName,
        WORD *pcchInputName);

    HRESULT (STDMETHODCALLTYPE *SetConnectionName)(
        IWMStreamConfig *This,
        LPCWSTR_WMSDK_TYPE_SAFE pwszInputName);

    HRESULT (STDMETHODCALLTYPE *GetBitrate)(
        IWMStreamConfig *This,
        DWORD *pdwBitrate);

    HRESULT (STDMETHODCALLTYPE *SetBitrate)(
        IWMStreamConfig *This,
        DWORD pdwBitrate);

    HRESULT (STDMETHODCALLTYPE *GetBufferWindow)(
        IWMStreamConfig *This,
        DWORD *pmsBufferWindow);

    HRESULT (STDMETHODCALLTYPE *SetBufferWindow)(
        IWMStreamConfig *This,
        DWORD msBufferWindow);

    END_INTERFACE
} IWMStreamConfigVtbl;

interface IWMStreamConfig {
    CONST_VTBL IWMStreamConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMStreamConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMStreamConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMStreamConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IWMStreamConfig methods ***/
#define IWMStreamConfig_GetStreamType(This,pguidStreamType) (This)->lpVtbl->GetStreamType(This,pguidStreamType)
#define IWMStreamConfig_GetStreamNumber(This,pwStreamNum) (This)->lpVtbl->GetStreamNumber(This,pwStreamNum)
#define IWMStreamConfig_SetStreamNumber(This,wStreamNum) (This)->lpVtbl->SetStreamNumber(This,wStreamNum)
#define IWMStreamConfig_GetStreamName(This,pwszStreamName,pcchStreamName) (This)->lpVtbl->GetStreamName(This,pwszStreamName,pcchStreamName)
#define IWMStreamConfig_SetStreamName(This,pwszStreamName) (This)->lpVtbl->SetStreamName(This,pwszStreamName)
#define IWMStreamConfig_GetConnectionName(This,pwszInputName,pcchInputName) (This)->lpVtbl->GetConnectionName(This,pwszInputName,pcchInputName)
#define IWMStreamConfig_SetConnectionName(This,pwszInputName) (This)->lpVtbl->SetConnectionName(This,pwszInputName)
#define IWMStreamConfig_GetBitrate(This,pdwBitrate) (This)->lpVtbl->GetBitrate(This,pdwBitrate)
#define IWMStreamConfig_SetBitrate(This,pdwBitrate) (This)->lpVtbl->SetBitrate(This,pdwBitrate)
#define IWMStreamConfig_GetBufferWindow(This,pmsBufferWindow) (This)->lpVtbl->GetBufferWindow(This,pmsBufferWindow)
#define IWMStreamConfig_SetBufferWindow(This,msBufferWindow) (This)->lpVtbl->SetBufferWindow(This,msBufferWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMStreamConfig_QueryInterface(IWMStreamConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMStreamConfig_AddRef(IWMStreamConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMStreamConfig_Release(IWMStreamConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMStreamConfig methods ***/
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamType(IWMStreamConfig* This,GUID *pguidStreamType) {
    return This->lpVtbl->GetStreamType(This,pguidStreamType);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamNumber(IWMStreamConfig* This,WORD *pwStreamNum) {
    return This->lpVtbl->GetStreamNumber(This,pwStreamNum);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetStreamNumber(IWMStreamConfig* This,WORD wStreamNum) {
    return This->lpVtbl->SetStreamNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetStreamName(IWMStreamConfig* This,WCHAR *pwszStreamName,WORD *pcchStreamName) {
    return This->lpVtbl->GetStreamName(This,pwszStreamName,pcchStreamName);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetStreamName(IWMStreamConfig* This,LPCWSTR_WMSDK_TYPE_SAFE pwszStreamName) {
    return This->lpVtbl->SetStreamName(This,pwszStreamName);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetConnectionName(IWMStreamConfig* This,WCHAR *pwszInputName,WORD *pcchInputName) {
    return This->lpVtbl->GetConnectionName(This,pwszInputName,pcchInputName);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetConnectionName(IWMStreamConfig* This,LPCWSTR_WMSDK_TYPE_SAFE pwszInputName) {
    return This->lpVtbl->SetConnectionName(This,pwszInputName);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetBitrate(IWMStreamConfig* This,DWORD *pdwBitrate) {
    return This->lpVtbl->GetBitrate(This,pdwBitrate);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetBitrate(IWMStreamConfig* This,DWORD pdwBitrate) {
    return This->lpVtbl->SetBitrate(This,pdwBitrate);
}
static FORCEINLINE HRESULT IWMStreamConfig_GetBufferWindow(IWMStreamConfig* This,DWORD *pmsBufferWindow) {
    return This->lpVtbl->GetBufferWindow(This,pmsBufferWindow);
}
static FORCEINLINE HRESULT IWMStreamConfig_SetBufferWindow(IWMStreamConfig* This,DWORD msBufferWindow) {
    return This->lpVtbl->SetBufferWindow(This,msBufferWindow);
}
#endif
#endif

#endif


#endif  /* __IWMStreamConfig_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfile interface
 */
#ifndef __IWMProfile_INTERFACE_DEFINED__
#define __IWMProfile_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfile, 0x96406bdb, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bdb-2b2b-11d3-b36b-00c04f6108ff")
IWMProfile : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        WMT_VERSION *pdwVersion) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        WCHAR *pwszName,
        DWORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        const WCHAR *pwszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        WCHAR *pwszDescription,
        DWORD *pcchDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        const WCHAR *pwszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamCount(
        DWORD *pcStreams) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamByNumber(
        WORD wStreamNum,
        IWMStreamConfig **ppConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStreamByNumber(
        WORD wStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReconfigStream(
        IWMStreamConfig *pConfig) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewStream(
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetMutualExclusion(
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMutualExclusion(
        IWMMutualExclusion *pME) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMutualExclusion(
        IWMMutualExclusion *pME) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewMutualExclusion(
        IWMMutualExclusion **ppME) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfile, 0x96406bdb, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMProfileVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWMProfile *This,
        WMT_VERSION *pdwVersion);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IWMProfile *This,
        WCHAR *pwszName,
        DWORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IWMProfile *This,
        const WCHAR *pwszName);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IWMProfile *This,
        WCHAR *pwszDescription,
        DWORD *pcchDescription);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IWMProfile *This,
        const WCHAR *pwszDescription);

    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IWMProfile *This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IWMProfile *This,
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetStreamByNumber)(
        IWMProfile *This,
        WORD wStreamNum,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMProfile *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamByNumber)(
        IWMProfile *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMProfile *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *ReconfigStream)(
        IWMProfile *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *CreateNewStream)(
        IWMProfile *This,
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusionCount)(
        IWMProfile *This,
        DWORD *pcME);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusion)(
        IWMProfile *This,
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME);

    HRESULT (STDMETHODCALLTYPE *RemoveMutualExclusion)(
        IWMProfile *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *AddMutualExclusion)(
        IWMProfile *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *CreateNewMutualExclusion)(
        IWMProfile *This,
        IWMMutualExclusion **ppME);

    END_INTERFACE
} IWMProfileVtbl;

interface IWMProfile {
    CONST_VTBL IWMProfileVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfile_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfile_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfile_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfile methods ***/
#define IWMProfile_GetVersion(This,pdwVersion) (This)->lpVtbl->GetVersion(This,pdwVersion)
#define IWMProfile_GetName(This,pwszName,pcchName) (This)->lpVtbl->GetName(This,pwszName,pcchName)
#define IWMProfile_SetName(This,pwszName) (This)->lpVtbl->SetName(This,pwszName)
#define IWMProfile_GetDescription(This,pwszDescription,pcchDescription) (This)->lpVtbl->GetDescription(This,pwszDescription,pcchDescription)
#define IWMProfile_SetDescription(This,pwszDescription) (This)->lpVtbl->SetDescription(This,pwszDescription)
#define IWMProfile_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IWMProfile_GetStream(This,dwStreamIndex,ppConfig) (This)->lpVtbl->GetStream(This,dwStreamIndex,ppConfig)
#define IWMProfile_GetStreamByNumber(This,wStreamNum,ppConfig) (This)->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig)
#define IWMProfile_RemoveStream(This,pConfig) (This)->lpVtbl->RemoveStream(This,pConfig)
#define IWMProfile_RemoveStreamByNumber(This,wStreamNum) (This)->lpVtbl->RemoveStreamByNumber(This,wStreamNum)
#define IWMProfile_AddStream(This,pConfig) (This)->lpVtbl->AddStream(This,pConfig)
#define IWMProfile_ReconfigStream(This,pConfig) (This)->lpVtbl->ReconfigStream(This,pConfig)
#define IWMProfile_CreateNewStream(This,guidStreamType,ppConfig) (This)->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig)
#define IWMProfile_GetMutualExclusionCount(This,pcME) (This)->lpVtbl->GetMutualExclusionCount(This,pcME)
#define IWMProfile_GetMutualExclusion(This,dwMEIndex,ppME) (This)->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME)
#define IWMProfile_RemoveMutualExclusion(This,pME) (This)->lpVtbl->RemoveMutualExclusion(This,pME)
#define IWMProfile_AddMutualExclusion(This,pME) (This)->lpVtbl->AddMutualExclusion(This,pME)
#define IWMProfile_CreateNewMutualExclusion(This,ppME) (This)->lpVtbl->CreateNewMutualExclusion(This,ppME)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfile_QueryInterface(IWMProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfile_AddRef(IWMProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfile_Release(IWMProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfile methods ***/
static FORCEINLINE HRESULT IWMProfile_GetVersion(IWMProfile* This,WMT_VERSION *pdwVersion) {
    return This->lpVtbl->GetVersion(This,pdwVersion);
}
static FORCEINLINE HRESULT IWMProfile_GetName(IWMProfile* This,WCHAR *pwszName,DWORD *pcchName) {
    return This->lpVtbl->GetName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMProfile_SetName(IWMProfile* This,const WCHAR *pwszName) {
    return This->lpVtbl->SetName(This,pwszName);
}
static FORCEINLINE HRESULT IWMProfile_GetDescription(IWMProfile* This,WCHAR *pwszDescription,DWORD *pcchDescription) {
    return This->lpVtbl->GetDescription(This,pwszDescription,pcchDescription);
}
static FORCEINLINE HRESULT IWMProfile_SetDescription(IWMProfile* This,const WCHAR *pwszDescription) {
    return This->lpVtbl->SetDescription(This,pwszDescription);
}
static FORCEINLINE HRESULT IWMProfile_GetStreamCount(IWMProfile* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IWMProfile_GetStream(IWMProfile* This,DWORD dwStreamIndex,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_GetStreamByNumber(IWMProfile* This,WORD wStreamNum,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_RemoveStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->RemoveStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_RemoveStreamByNumber(IWMProfile* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStreamByNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMProfile_AddStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->AddStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_ReconfigStream(IWMProfile* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->ReconfigStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile_CreateNewStream(IWMProfile* This,REFGUID guidStreamType,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile_GetMutualExclusionCount(IWMProfile* This,DWORD *pcME) {
    return This->lpVtbl->GetMutualExclusionCount(This,pcME);
}
static FORCEINLINE HRESULT IWMProfile_GetMutualExclusion(IWMProfile* This,DWORD dwMEIndex,IWMMutualExclusion **ppME) {
    return This->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME);
}
static FORCEINLINE HRESULT IWMProfile_RemoveMutualExclusion(IWMProfile* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->RemoveMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile_AddMutualExclusion(IWMProfile* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->AddMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile_CreateNewMutualExclusion(IWMProfile* This,IWMMutualExclusion **ppME) {
    return This->lpVtbl->CreateNewMutualExclusion(This,ppME);
}
#endif
#endif

#endif


#endif  /* __IWMProfile_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfile2 interface
 */
#ifndef __IWMProfile2_INTERFACE_DEFINED__
#define __IWMProfile2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfile2, 0x07e72d33, 0xd94e, 0x4be7, 0x88,0x43, 0x60,0xae,0x5f,0xf7,0xe5,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("07e72d33-d94e-4be7-8843-60ae5ff7e5f5")
IWMProfile2 : public IWMProfile
{
    virtual HRESULT STDMETHODCALLTYPE GetProfileID(
        GUID *guid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfile2, 0x07e72d33, 0xd94e, 0x4be7, 0x88,0x43, 0x60,0xae,0x5f,0xf7,0xe5,0xf5)
#endif
#else
typedef struct IWMProfile2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWMProfile2 *This,
        WMT_VERSION *pdwVersion);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IWMProfile2 *This,
        WCHAR *pwszName,
        DWORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IWMProfile2 *This,
        const WCHAR *pwszName);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IWMProfile2 *This,
        WCHAR *pwszDescription,
        DWORD *pcchDescription);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IWMProfile2 *This,
        const WCHAR *pwszDescription);

    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IWMProfile2 *This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IWMProfile2 *This,
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetStreamByNumber)(
        IWMProfile2 *This,
        WORD wStreamNum,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMProfile2 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamByNumber)(
        IWMProfile2 *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMProfile2 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *ReconfigStream)(
        IWMProfile2 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *CreateNewStream)(
        IWMProfile2 *This,
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusionCount)(
        IWMProfile2 *This,
        DWORD *pcME);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusion)(
        IWMProfile2 *This,
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME);

    HRESULT (STDMETHODCALLTYPE *RemoveMutualExclusion)(
        IWMProfile2 *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *AddMutualExclusion)(
        IWMProfile2 *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *CreateNewMutualExclusion)(
        IWMProfile2 *This,
        IWMMutualExclusion **ppME);

    /*** IWMProfile2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProfileID)(
        IWMProfile2 *This,
        GUID *guid);

    END_INTERFACE
} IWMProfile2Vtbl;

interface IWMProfile2 {
    CONST_VTBL IWMProfile2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfile2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfile2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfile2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfile methods ***/
#define IWMProfile2_GetVersion(This,pdwVersion) (This)->lpVtbl->GetVersion(This,pdwVersion)
#define IWMProfile2_GetName(This,pwszName,pcchName) (This)->lpVtbl->GetName(This,pwszName,pcchName)
#define IWMProfile2_SetName(This,pwszName) (This)->lpVtbl->SetName(This,pwszName)
#define IWMProfile2_GetDescription(This,pwszDescription,pcchDescription) (This)->lpVtbl->GetDescription(This,pwszDescription,pcchDescription)
#define IWMProfile2_SetDescription(This,pwszDescription) (This)->lpVtbl->SetDescription(This,pwszDescription)
#define IWMProfile2_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IWMProfile2_GetStream(This,dwStreamIndex,ppConfig) (This)->lpVtbl->GetStream(This,dwStreamIndex,ppConfig)
#define IWMProfile2_GetStreamByNumber(This,wStreamNum,ppConfig) (This)->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig)
#define IWMProfile2_RemoveStream(This,pConfig) (This)->lpVtbl->RemoveStream(This,pConfig)
#define IWMProfile2_RemoveStreamByNumber(This,wStreamNum) (This)->lpVtbl->RemoveStreamByNumber(This,wStreamNum)
#define IWMProfile2_AddStream(This,pConfig) (This)->lpVtbl->AddStream(This,pConfig)
#define IWMProfile2_ReconfigStream(This,pConfig) (This)->lpVtbl->ReconfigStream(This,pConfig)
#define IWMProfile2_CreateNewStream(This,guidStreamType,ppConfig) (This)->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig)
#define IWMProfile2_GetMutualExclusionCount(This,pcME) (This)->lpVtbl->GetMutualExclusionCount(This,pcME)
#define IWMProfile2_GetMutualExclusion(This,dwMEIndex,ppME) (This)->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME)
#define IWMProfile2_RemoveMutualExclusion(This,pME) (This)->lpVtbl->RemoveMutualExclusion(This,pME)
#define IWMProfile2_AddMutualExclusion(This,pME) (This)->lpVtbl->AddMutualExclusion(This,pME)
#define IWMProfile2_CreateNewMutualExclusion(This,ppME) (This)->lpVtbl->CreateNewMutualExclusion(This,ppME)
/*** IWMProfile2 methods ***/
#define IWMProfile2_GetProfileID(This,guid) (This)->lpVtbl->GetProfileID(This,guid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfile2_QueryInterface(IWMProfile2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfile2_AddRef(IWMProfile2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfile2_Release(IWMProfile2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfile methods ***/
static FORCEINLINE HRESULT IWMProfile2_GetVersion(IWMProfile2* This,WMT_VERSION *pdwVersion) {
    return This->lpVtbl->GetVersion(This,pdwVersion);
}
static FORCEINLINE HRESULT IWMProfile2_GetName(IWMProfile2* This,WCHAR *pwszName,DWORD *pcchName) {
    return This->lpVtbl->GetName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMProfile2_SetName(IWMProfile2* This,const WCHAR *pwszName) {
    return This->lpVtbl->SetName(This,pwszName);
}
static FORCEINLINE HRESULT IWMProfile2_GetDescription(IWMProfile2* This,WCHAR *pwszDescription,DWORD *pcchDescription) {
    return This->lpVtbl->GetDescription(This,pwszDescription,pcchDescription);
}
static FORCEINLINE HRESULT IWMProfile2_SetDescription(IWMProfile2* This,const WCHAR *pwszDescription) {
    return This->lpVtbl->SetDescription(This,pwszDescription);
}
static FORCEINLINE HRESULT IWMProfile2_GetStreamCount(IWMProfile2* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IWMProfile2_GetStream(IWMProfile2* This,DWORD dwStreamIndex,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile2_GetStreamByNumber(IWMProfile2* This,WORD wStreamNum,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile2_RemoveStream(IWMProfile2* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->RemoveStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile2_RemoveStreamByNumber(IWMProfile2* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStreamByNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMProfile2_AddStream(IWMProfile2* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->AddStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile2_ReconfigStream(IWMProfile2* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->ReconfigStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile2_CreateNewStream(IWMProfile2* This,REFGUID guidStreamType,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile2_GetMutualExclusionCount(IWMProfile2* This,DWORD *pcME) {
    return This->lpVtbl->GetMutualExclusionCount(This,pcME);
}
static FORCEINLINE HRESULT IWMProfile2_GetMutualExclusion(IWMProfile2* This,DWORD dwMEIndex,IWMMutualExclusion **ppME) {
    return This->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME);
}
static FORCEINLINE HRESULT IWMProfile2_RemoveMutualExclusion(IWMProfile2* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->RemoveMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile2_AddMutualExclusion(IWMProfile2* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->AddMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile2_CreateNewMutualExclusion(IWMProfile2* This,IWMMutualExclusion **ppME) {
    return This->lpVtbl->CreateNewMutualExclusion(This,ppME);
}
/*** IWMProfile2 methods ***/
static FORCEINLINE HRESULT IWMProfile2_GetProfileID(IWMProfile2* This,GUID *guid) {
    return This->lpVtbl->GetProfileID(This,guid);
}
#endif
#endif

#endif


#endif  /* __IWMProfile2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfile3 interface
 */
#ifndef __IWMProfile3_INTERFACE_DEFINED__
#define __IWMProfile3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfile3, 0x00ef96cc, 0xa461, 0x4546, 0x8b,0xcd, 0xc9,0xa2,0x8f,0x0e,0x06,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00ef96cc-a461-4546-8bcd-c9a28f0e06f5")
IWMProfile3 : public IWMProfile2
{
    virtual HRESULT STDMETHODCALLTYPE GetStorageFormat(
        WMT_STORAGE_FORMAT *storage) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStorageFormat(
        WMT_STORAGE_FORMAT storage) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandwidthSharingCount(
        DWORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBandwidthSharing(
        DWORD index,
        IWMBandwidthSharing **bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveBandwidthSharing(
        IWMBandwidthSharing *bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddBandwidthSharing(
        IWMBandwidthSharing *bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewBandwidthSharing(
        IWMBandwidthSharing **bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamPrioritization(
        IWMStreamPrioritization **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamPrioritization(
        IWMStreamPrioritization *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStreamPrioritization(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNewStreamPrioritization(
        IWMStreamPrioritization **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExpectedPacketCount(
        QWORD duration,
        QWORD *packets) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfile3, 0x00ef96cc, 0xa461, 0x4546, 0x8b,0xcd, 0xc9,0xa2,0x8f,0x0e,0x06,0xf5)
#endif
#else
typedef struct IWMProfile3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfile methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IWMProfile3 *This,
        WMT_VERSION *pdwVersion);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IWMProfile3 *This,
        WCHAR *pwszName,
        DWORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IWMProfile3 *This,
        const WCHAR *pwszName);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IWMProfile3 *This,
        WCHAR *pwszDescription,
        DWORD *pcchDescription);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IWMProfile3 *This,
        const WCHAR *pwszDescription);

    HRESULT (STDMETHODCALLTYPE *GetStreamCount)(
        IWMProfile3 *This,
        DWORD *pcStreams);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IWMProfile3 *This,
        DWORD dwStreamIndex,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetStreamByNumber)(
        IWMProfile3 *This,
        WORD wStreamNum,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStream)(
        IWMProfile3 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *RemoveStreamByNumber)(
        IWMProfile3 *This,
        WORD wStreamNum);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IWMProfile3 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *ReconfigStream)(
        IWMProfile3 *This,
        IWMStreamConfig *pConfig);

    HRESULT (STDMETHODCALLTYPE *CreateNewStream)(
        IWMProfile3 *This,
        REFGUID guidStreamType,
        IWMStreamConfig **ppConfig);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusionCount)(
        IWMProfile3 *This,
        DWORD *pcME);

    HRESULT (STDMETHODCALLTYPE *GetMutualExclusion)(
        IWMProfile3 *This,
        DWORD dwMEIndex,
        IWMMutualExclusion **ppME);

    HRESULT (STDMETHODCALLTYPE *RemoveMutualExclusion)(
        IWMProfile3 *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *AddMutualExclusion)(
        IWMProfile3 *This,
        IWMMutualExclusion *pME);

    HRESULT (STDMETHODCALLTYPE *CreateNewMutualExclusion)(
        IWMProfile3 *This,
        IWMMutualExclusion **ppME);

    /*** IWMProfile2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProfileID)(
        IWMProfile3 *This,
        GUID *guid);

    /*** IWMProfile3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStorageFormat)(
        IWMProfile3 *This,
        WMT_STORAGE_FORMAT *storage);

    HRESULT (STDMETHODCALLTYPE *SetStorageFormat)(
        IWMProfile3 *This,
        WMT_STORAGE_FORMAT storage);

    HRESULT (STDMETHODCALLTYPE *GetBandwidthSharingCount)(
        IWMProfile3 *This,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *GetBandwidthSharing)(
        IWMProfile3 *This,
        DWORD index,
        IWMBandwidthSharing **bandwidth);

    HRESULT (STDMETHODCALLTYPE *RemoveBandwidthSharing)(
        IWMProfile3 *This,
        IWMBandwidthSharing *bandwidth);

    HRESULT (STDMETHODCALLTYPE *AddBandwidthSharing)(
        IWMProfile3 *This,
        IWMBandwidthSharing *bandwidth);

    HRESULT (STDMETHODCALLTYPE *CreateNewBandwidthSharing)(
        IWMProfile3 *This,
        IWMBandwidthSharing **bandwidth);

    HRESULT (STDMETHODCALLTYPE *GetStreamPrioritization)(
        IWMProfile3 *This,
        IWMStreamPrioritization **stream);

    HRESULT (STDMETHODCALLTYPE *SetStreamPrioritization)(
        IWMProfile3 *This,
        IWMStreamPrioritization *stream);

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

    HRESULT (STDMETHODCALLTYPE *CreateNewStreamPrioritization)(
        IWMProfile3 *This,
        IWMStreamPrioritization **stream);

    HRESULT (STDMETHODCALLTYPE *GetExpectedPacketCount)(
        IWMProfile3 *This,
        QWORD duration,
        QWORD *packets);

    END_INTERFACE
} IWMProfile3Vtbl;

interface IWMProfile3 {
    CONST_VTBL IWMProfile3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfile3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfile3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfile3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfile methods ***/
#define IWMProfile3_GetVersion(This,pdwVersion) (This)->lpVtbl->GetVersion(This,pdwVersion)
#define IWMProfile3_GetName(This,pwszName,pcchName) (This)->lpVtbl->GetName(This,pwszName,pcchName)
#define IWMProfile3_SetName(This,pwszName) (This)->lpVtbl->SetName(This,pwszName)
#define IWMProfile3_GetDescription(This,pwszDescription,pcchDescription) (This)->lpVtbl->GetDescription(This,pwszDescription,pcchDescription)
#define IWMProfile3_SetDescription(This,pwszDescription) (This)->lpVtbl->SetDescription(This,pwszDescription)
#define IWMProfile3_GetStreamCount(This,pcStreams) (This)->lpVtbl->GetStreamCount(This,pcStreams)
#define IWMProfile3_GetStream(This,dwStreamIndex,ppConfig) (This)->lpVtbl->GetStream(This,dwStreamIndex,ppConfig)
#define IWMProfile3_GetStreamByNumber(This,wStreamNum,ppConfig) (This)->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig)
#define IWMProfile3_RemoveStream(This,pConfig) (This)->lpVtbl->RemoveStream(This,pConfig)
#define IWMProfile3_RemoveStreamByNumber(This,wStreamNum) (This)->lpVtbl->RemoveStreamByNumber(This,wStreamNum)
#define IWMProfile3_AddStream(This,pConfig) (This)->lpVtbl->AddStream(This,pConfig)
#define IWMProfile3_ReconfigStream(This,pConfig) (This)->lpVtbl->ReconfigStream(This,pConfig)
#define IWMProfile3_CreateNewStream(This,guidStreamType,ppConfig) (This)->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig)
#define IWMProfile3_GetMutualExclusionCount(This,pcME) (This)->lpVtbl->GetMutualExclusionCount(This,pcME)
#define IWMProfile3_GetMutualExclusion(This,dwMEIndex,ppME) (This)->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME)
#define IWMProfile3_RemoveMutualExclusion(This,pME) (This)->lpVtbl->RemoveMutualExclusion(This,pME)
#define IWMProfile3_AddMutualExclusion(This,pME) (This)->lpVtbl->AddMutualExclusion(This,pME)
#define IWMProfile3_CreateNewMutualExclusion(This,ppME) (This)->lpVtbl->CreateNewMutualExclusion(This,ppME)
/*** IWMProfile2 methods ***/
#define IWMProfile3_GetProfileID(This,guid) (This)->lpVtbl->GetProfileID(This,guid)
/*** IWMProfile3 methods ***/
#define IWMProfile3_GetStorageFormat(This,storage) (This)->lpVtbl->GetStorageFormat(This,storage)
#define IWMProfile3_SetStorageFormat(This,storage) (This)->lpVtbl->SetStorageFormat(This,storage)
#define IWMProfile3_GetBandwidthSharingCount(This,count) (This)->lpVtbl->GetBandwidthSharingCount(This,count)
#define IWMProfile3_GetBandwidthSharing(This,index,bandwidth) (This)->lpVtbl->GetBandwidthSharing(This,index,bandwidth)
#define IWMProfile3_RemoveBandwidthSharing(This,bandwidth) (This)->lpVtbl->RemoveBandwidthSharing(This,bandwidth)
#define IWMProfile3_AddBandwidthSharing(This,bandwidth) (This)->lpVtbl->AddBandwidthSharing(This,bandwidth)
#define IWMProfile3_CreateNewBandwidthSharing(This,bandwidth) (This)->lpVtbl->CreateNewBandwidthSharing(This,bandwidth)
#define IWMProfile3_GetStreamPrioritization(This,stream) (This)->lpVtbl->GetStreamPrioritization(This,stream)
#define IWMProfile3_SetStreamPrioritization(This,stream) (This)->lpVtbl->SetStreamPrioritization(This,stream)
#define IWMProfile3_RemoveStreamPrioritization(This) (This)->lpVtbl->RemoveStreamPrioritization(This)
#define IWMProfile3_CreateNewStreamPrioritization(This,stream) (This)->lpVtbl->CreateNewStreamPrioritization(This,stream)
#define IWMProfile3_GetExpectedPacketCount(This,duration,packets) (This)->lpVtbl->GetExpectedPacketCount(This,duration,packets)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfile3_QueryInterface(IWMProfile3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfile3_AddRef(IWMProfile3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfile3_Release(IWMProfile3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfile methods ***/
static FORCEINLINE HRESULT IWMProfile3_GetVersion(IWMProfile3* This,WMT_VERSION *pdwVersion) {
    return This->lpVtbl->GetVersion(This,pdwVersion);
}
static FORCEINLINE HRESULT IWMProfile3_GetName(IWMProfile3* This,WCHAR *pwszName,DWORD *pcchName) {
    return This->lpVtbl->GetName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMProfile3_SetName(IWMProfile3* This,const WCHAR *pwszName) {
    return This->lpVtbl->SetName(This,pwszName);
}
static FORCEINLINE HRESULT IWMProfile3_GetDescription(IWMProfile3* This,WCHAR *pwszDescription,DWORD *pcchDescription) {
    return This->lpVtbl->GetDescription(This,pwszDescription,pcchDescription);
}
static FORCEINLINE HRESULT IWMProfile3_SetDescription(IWMProfile3* This,const WCHAR *pwszDescription) {
    return This->lpVtbl->SetDescription(This,pwszDescription);
}
static FORCEINLINE HRESULT IWMProfile3_GetStreamCount(IWMProfile3* This,DWORD *pcStreams) {
    return This->lpVtbl->GetStreamCount(This,pcStreams);
}
static FORCEINLINE HRESULT IWMProfile3_GetStream(IWMProfile3* This,DWORD dwStreamIndex,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStream(This,dwStreamIndex,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile3_GetStreamByNumber(IWMProfile3* This,WORD wStreamNum,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->GetStreamByNumber(This,wStreamNum,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile3_RemoveStream(IWMProfile3* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->RemoveStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile3_RemoveStreamByNumber(IWMProfile3* This,WORD wStreamNum) {
    return This->lpVtbl->RemoveStreamByNumber(This,wStreamNum);
}
static FORCEINLINE HRESULT IWMProfile3_AddStream(IWMProfile3* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->AddStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile3_ReconfigStream(IWMProfile3* This,IWMStreamConfig *pConfig) {
    return This->lpVtbl->ReconfigStream(This,pConfig);
}
static FORCEINLINE HRESULT IWMProfile3_CreateNewStream(IWMProfile3* This,REFGUID guidStreamType,IWMStreamConfig **ppConfig) {
    return This->lpVtbl->CreateNewStream(This,guidStreamType,ppConfig);
}
static FORCEINLINE HRESULT IWMProfile3_GetMutualExclusionCount(IWMProfile3* This,DWORD *pcME) {
    return This->lpVtbl->GetMutualExclusionCount(This,pcME);
}
static FORCEINLINE HRESULT IWMProfile3_GetMutualExclusion(IWMProfile3* This,DWORD dwMEIndex,IWMMutualExclusion **ppME) {
    return This->lpVtbl->GetMutualExclusion(This,dwMEIndex,ppME);
}
static FORCEINLINE HRESULT IWMProfile3_RemoveMutualExclusion(IWMProfile3* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->RemoveMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile3_AddMutualExclusion(IWMProfile3* This,IWMMutualExclusion *pME) {
    return This->lpVtbl->AddMutualExclusion(This,pME);
}
static FORCEINLINE HRESULT IWMProfile3_CreateNewMutualExclusion(IWMProfile3* This,IWMMutualExclusion **ppME) {
    return This->lpVtbl->CreateNewMutualExclusion(This,ppME);
}
/*** IWMProfile2 methods ***/
static FORCEINLINE HRESULT IWMProfile3_GetProfileID(IWMProfile3* This,GUID *guid) {
    return This->lpVtbl->GetProfileID(This,guid);
}
/*** IWMProfile3 methods ***/
static FORCEINLINE HRESULT IWMProfile3_GetStorageFormat(IWMProfile3* This,WMT_STORAGE_FORMAT *storage) {
    return This->lpVtbl->GetStorageFormat(This,storage);
}
static FORCEINLINE HRESULT IWMProfile3_SetStorageFormat(IWMProfile3* This,WMT_STORAGE_FORMAT storage) {
    return This->lpVtbl->SetStorageFormat(This,storage);
}
static FORCEINLINE HRESULT IWMProfile3_GetBandwidthSharingCount(IWMProfile3* This,DWORD *count) {
    return This->lpVtbl->GetBandwidthSharingCount(This,count);
}
static FORCEINLINE HRESULT IWMProfile3_GetBandwidthSharing(IWMProfile3* This,DWORD index,IWMBandwidthSharing **bandwidth) {
    return This->lpVtbl->GetBandwidthSharing(This,index,bandwidth);
}
static FORCEINLINE HRESULT IWMProfile3_RemoveBandwidthSharing(IWMProfile3* This,IWMBandwidthSharing *bandwidth) {
    return This->lpVtbl->RemoveBandwidthSharing(This,bandwidth);
}
static FORCEINLINE HRESULT IWMProfile3_AddBandwidthSharing(IWMProfile3* This,IWMBandwidthSharing *bandwidth) {
    return This->lpVtbl->AddBandwidthSharing(This,bandwidth);
}
static FORCEINLINE HRESULT IWMProfile3_CreateNewBandwidthSharing(IWMProfile3* This,IWMBandwidthSharing **bandwidth) {
    return This->lpVtbl->CreateNewBandwidthSharing(This,bandwidth);
}
static FORCEINLINE HRESULT IWMProfile3_GetStreamPrioritization(IWMProfile3* This,IWMStreamPrioritization **stream) {
    return This->lpVtbl->GetStreamPrioritization(This,stream);
}
static FORCEINLINE HRESULT IWMProfile3_SetStreamPrioritization(IWMProfile3* This,IWMStreamPrioritization *stream) {
    return This->lpVtbl->SetStreamPrioritization(This,stream);
}
static FORCEINLINE HRESULT IWMProfile3_RemoveStreamPrioritization(IWMProfile3* This) {
    return This->lpVtbl->RemoveStreamPrioritization(This);
}
static FORCEINLINE HRESULT IWMProfile3_CreateNewStreamPrioritization(IWMProfile3* This,IWMStreamPrioritization **stream) {
    return This->lpVtbl->CreateNewStreamPrioritization(This,stream);
}
static FORCEINLINE HRESULT IWMProfile3_GetExpectedPacketCount(IWMProfile3* This,QWORD duration,QWORD *packets) {
    return This->lpVtbl->GetExpectedPacketCount(This,duration,packets);
}
#endif
#endif

#endif


#endif  /* __IWMProfile3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfileManager interface
 */
#ifndef __IWMProfileManager_INTERFACE_DEFINED__
#define __IWMProfileManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfileManager, 0xd16679f2, 0x6ca0, 0x472d, 0x8d,0x31, 0x2f,0x5d,0x55,0xae,0xe1,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d16679f2-6ca0-472d-8d31-2f5d55aee155")
IWMProfileManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateEmptyProfile(
        WMT_VERSION dwVersion,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadProfileByID(
        REFGUID guidProfile,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadProfileByData(
        const WCHAR *pwszProfile,
        IWMProfile **ppProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveProfile(
        IWMProfile *pIWMProfile,
        WCHAR *pwszProfile,
        DWORD *pdwLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSystemProfileCount(
        DWORD *pcProfiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadSystemProfile(
        DWORD dwProfileIndex,
        IWMProfile **ppProfile) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfileManager, 0xd16679f2, 0x6ca0, 0x472d, 0x8d,0x31, 0x2f,0x5d,0x55,0xae,0xe1,0x55)
#endif
#else
typedef struct IWMProfileManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfileManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEmptyProfile)(
        IWMProfileManager *This,
        WMT_VERSION dwVersion,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByID)(
        IWMProfileManager *This,
        REFGUID guidProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByData)(
        IWMProfileManager *This,
        const WCHAR *pwszProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *SaveProfile)(
        IWMProfileManager *This,
        IWMProfile *pIWMProfile,
        WCHAR *pwszProfile,
        DWORD *pdwLength);

    HRESULT (STDMETHODCALLTYPE *GetSystemProfileCount)(
        IWMProfileManager *This,
        DWORD *pcProfiles);

    HRESULT (STDMETHODCALLTYPE *LoadSystemProfile)(
        IWMProfileManager *This,
        DWORD dwProfileIndex,
        IWMProfile **ppProfile);

    END_INTERFACE
} IWMProfileManagerVtbl;

interface IWMProfileManager {
    CONST_VTBL IWMProfileManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfileManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfileManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfileManager_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfileManager methods ***/
#define IWMProfileManager_CreateEmptyProfile(This,dwVersion,ppProfile) (This)->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile)
#define IWMProfileManager_LoadProfileByID(This,guidProfile,ppProfile) (This)->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile)
#define IWMProfileManager_LoadProfileByData(This,pwszProfile,ppProfile) (This)->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile)
#define IWMProfileManager_SaveProfile(This,pIWMProfile,pwszProfile,pdwLength) (This)->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength)
#define IWMProfileManager_GetSystemProfileCount(This,pcProfiles) (This)->lpVtbl->GetSystemProfileCount(This,pcProfiles)
#define IWMProfileManager_LoadSystemProfile(This,dwProfileIndex,ppProfile) (This)->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfileManager_QueryInterface(IWMProfileManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfileManager_AddRef(IWMProfileManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfileManager_Release(IWMProfileManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfileManager methods ***/
static FORCEINLINE HRESULT IWMProfileManager_CreateEmptyProfile(IWMProfileManager* This,WMT_VERSION dwVersion,IWMProfile **ppProfile) {
    return This->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadProfileByID(IWMProfileManager* This,REFGUID guidProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadProfileByData(IWMProfileManager* This,const WCHAR *pwszProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager_SaveProfile(IWMProfileManager* This,IWMProfile *pIWMProfile,WCHAR *pwszProfile,DWORD *pdwLength) {
    return This->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength);
}
static FORCEINLINE HRESULT IWMProfileManager_GetSystemProfileCount(IWMProfileManager* This,DWORD *pcProfiles) {
    return This->lpVtbl->GetSystemProfileCount(This,pcProfiles);
}
static FORCEINLINE HRESULT IWMProfileManager_LoadSystemProfile(IWMProfileManager* This,DWORD dwProfileIndex,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile);
}
#endif
#endif

#endif


#endif  /* __IWMProfileManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMProfileManager2 interface
 */
#ifndef __IWMProfileManager2_INTERFACE_DEFINED__
#define __IWMProfileManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMProfileManager2, 0x7a924e51, 0x73c1, 0x494d, 0x80,0x19, 0x23,0xd3,0x7e,0xd9,0xb8,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7a924e51-73c1-494d-8019-23d37ed9b89a")
IWMProfileManager2 : public IWMProfileManager
{
    virtual HRESULT STDMETHODCALLTYPE GetSystemProfileVersion(
        WMT_VERSION *version) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSystemProfileVersion(
        WMT_VERSION version) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMProfileManager2, 0x7a924e51, 0x73c1, 0x494d, 0x80,0x19, 0x23,0xd3,0x7e,0xd9,0xb8,0x9a)
#endif
#else
typedef struct IWMProfileManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMProfileManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEmptyProfile)(
        IWMProfileManager2 *This,
        WMT_VERSION dwVersion,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByID)(
        IWMProfileManager2 *This,
        REFGUID guidProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *LoadProfileByData)(
        IWMProfileManager2 *This,
        const WCHAR *pwszProfile,
        IWMProfile **ppProfile);

    HRESULT (STDMETHODCALLTYPE *SaveProfile)(
        IWMProfileManager2 *This,
        IWMProfile *pIWMProfile,
        WCHAR *pwszProfile,
        DWORD *pdwLength);

    HRESULT (STDMETHODCALLTYPE *GetSystemProfileCount)(
        IWMProfileManager2 *This,
        DWORD *pcProfiles);

    HRESULT (STDMETHODCALLTYPE *LoadSystemProfile)(
        IWMProfileManager2 *This,
        DWORD dwProfileIndex,
        IWMProfile **ppProfile);

    /*** IWMProfileManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSystemProfileVersion)(
        IWMProfileManager2 *This,
        WMT_VERSION *version);

    HRESULT (STDMETHODCALLTYPE *SetSystemProfileVersion)(
        IWMProfileManager2 *This,
        WMT_VERSION version);

    END_INTERFACE
} IWMProfileManager2Vtbl;

interface IWMProfileManager2 {
    CONST_VTBL IWMProfileManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMProfileManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMProfileManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMProfileManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMProfileManager methods ***/
#define IWMProfileManager2_CreateEmptyProfile(This,dwVersion,ppProfile) (This)->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile)
#define IWMProfileManager2_LoadProfileByID(This,guidProfile,ppProfile) (This)->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile)
#define IWMProfileManager2_LoadProfileByData(This,pwszProfile,ppProfile) (This)->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile)
#define IWMProfileManager2_SaveProfile(This,pIWMProfile,pwszProfile,pdwLength) (This)->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength)
#define IWMProfileManager2_GetSystemProfileCount(This,pcProfiles) (This)->lpVtbl->GetSystemProfileCount(This,pcProfiles)
#define IWMProfileManager2_LoadSystemProfile(This,dwProfileIndex,ppProfile) (This)->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile)
/*** IWMProfileManager2 methods ***/
#define IWMProfileManager2_GetSystemProfileVersion(This,version) (This)->lpVtbl->GetSystemProfileVersion(This,version)
#define IWMProfileManager2_SetSystemProfileVersion(This,version) (This)->lpVtbl->SetSystemProfileVersion(This,version)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMProfileManager2_QueryInterface(IWMProfileManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMProfileManager2_AddRef(IWMProfileManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMProfileManager2_Release(IWMProfileManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMProfileManager methods ***/
static FORCEINLINE HRESULT IWMProfileManager2_CreateEmptyProfile(IWMProfileManager2* This,WMT_VERSION dwVersion,IWMProfile **ppProfile) {
    return This->lpVtbl->CreateEmptyProfile(This,dwVersion,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager2_LoadProfileByID(IWMProfileManager2* This,REFGUID guidProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByID(This,guidProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager2_LoadProfileByData(IWMProfileManager2* This,const WCHAR *pwszProfile,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadProfileByData(This,pwszProfile,ppProfile);
}
static FORCEINLINE HRESULT IWMProfileManager2_SaveProfile(IWMProfileManager2* This,IWMProfile *pIWMProfile,WCHAR *pwszProfile,DWORD *pdwLength) {
    return This->lpVtbl->SaveProfile(This,pIWMProfile,pwszProfile,pdwLength);
}
static FORCEINLINE HRESULT IWMProfileManager2_GetSystemProfileCount(IWMProfileManager2* This,DWORD *pcProfiles) {
    return This->lpVtbl->GetSystemProfileCount(This,pcProfiles);
}
static FORCEINLINE HRESULT IWMProfileManager2_LoadSystemProfile(IWMProfileManager2* This,DWORD dwProfileIndex,IWMProfile **ppProfile) {
    return This->lpVtbl->LoadSystemProfile(This,dwProfileIndex,ppProfile);
}
/*** IWMProfileManager2 methods ***/
static FORCEINLINE HRESULT IWMProfileManager2_GetSystemProfileVersion(IWMProfileManager2* This,WMT_VERSION *version) {
    return This->lpVtbl->GetSystemProfileVersion(This,version);
}
static FORCEINLINE HRESULT IWMProfileManager2_SetSystemProfileVersion(IWMProfileManager2* This,WMT_VERSION version) {
    return This->lpVtbl->SetSystemProfileVersion(This,version);
}
#endif
#endif

#endif


#endif  /* __IWMProfileManager2_INTERFACE_DEFINED__ */

HRESULT WINAPI WMCreateProfileManager(IWMProfileManager**);
/*****************************************************************************
 * IWMCodecInfo interface
 */
#ifndef __IWMCodecInfo_INTERFACE_DEFINED__
#define __IWMCodecInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMCodecInfo, 0xa970f41e, 0x34de, 0x4a98, 0xb3,0xba, 0xe4,0xb3,0xca,0x75,0x28,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a970f41e-34de-4a98-b3ba-e4b3ca7528f0")
IWMCodecInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCodecInfoCount(
        REFGUID guid,
        DWORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecFormatCount(
        REFGUID guid,
        DWORD codecindex,
        DWORD *formatcount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecFormat(
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMCodecInfo, 0xa970f41e, 0x34de, 0x4a98, 0xb3,0xba, 0xe4,0xb3,0xca,0x75,0x28,0xf0)
#endif
#else
typedef struct IWMCodecInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInfoCount)(
        IWMCodecInfo *This,
        REFGUID guid,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormatCount)(
        IWMCodecInfo *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD *formatcount);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormat)(
        IWMCodecInfo *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig);

    END_INTERFACE
} IWMCodecInfoVtbl;

interface IWMCodecInfo {
    CONST_VTBL IWMCodecInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMCodecInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMCodecInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMCodecInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWMCodecInfo methods ***/
#define IWMCodecInfo_GetCodecInfoCount(This,guid,count) (This)->lpVtbl->GetCodecInfoCount(This,guid,count)
#define IWMCodecInfo_GetCodecFormatCount(This,guid,codecindex,formatcount) (This)->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount)
#define IWMCodecInfo_GetCodecFormat(This,guid,codecindex,formatindex,streamconfig) (This)->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMCodecInfo_QueryInterface(IWMCodecInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMCodecInfo_AddRef(IWMCodecInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMCodecInfo_Release(IWMCodecInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMCodecInfo methods ***/
static FORCEINLINE HRESULT IWMCodecInfo_GetCodecInfoCount(IWMCodecInfo* This,REFGUID guid,DWORD *count) {
    return This->lpVtbl->GetCodecInfoCount(This,guid,count);
}
static FORCEINLINE HRESULT IWMCodecInfo_GetCodecFormatCount(IWMCodecInfo* This,REFGUID guid,DWORD codecindex,DWORD *formatcount) {
    return This->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount);
}
static FORCEINLINE HRESULT IWMCodecInfo_GetCodecFormat(IWMCodecInfo* This,REFGUID guid,DWORD codecindex,DWORD formatindex,IWMStreamConfig **streamconfig) {
    return This->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig);
}
#endif
#endif

#endif


#endif  /* __IWMCodecInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMCodecInfo2 interface
 */
#ifndef __IWMCodecInfo2_INTERFACE_DEFINED__
#define __IWMCodecInfo2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMCodecInfo2, 0xaa65e273, 0xb686, 0x4056, 0x91,0xec, 0xdd,0x76,0x8d,0x4d,0xf7,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa65e273-b686-4056-91ec-dd768d4df710")
IWMCodecInfo2 : public IWMCodecInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetCodecName(
        REFGUID guid,
        DWORD codecindex,
        WCHAR *name,
        DWORD *namesize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecFormatDesc(
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig,
        WCHAR *description,
        DWORD *descrsize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMCodecInfo2, 0xaa65e273, 0xb686, 0x4056, 0x91,0xec, 0xdd,0x76,0x8d,0x4d,0xf7,0x10)
#endif
#else
typedef struct IWMCodecInfo2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInfoCount)(
        IWMCodecInfo2 *This,
        REFGUID guid,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormatCount)(
        IWMCodecInfo2 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD *formatcount);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormat)(
        IWMCodecInfo2 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig);

    /*** IWMCodecInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecName)(
        IWMCodecInfo2 *This,
        REFGUID guid,
        DWORD codecindex,
        WCHAR *name,
        DWORD *namesize);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormatDesc)(
        IWMCodecInfo2 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig,
        WCHAR *description,
        DWORD *descrsize);

    END_INTERFACE
} IWMCodecInfo2Vtbl;

interface IWMCodecInfo2 {
    CONST_VTBL IWMCodecInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMCodecInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMCodecInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMCodecInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMCodecInfo methods ***/
#define IWMCodecInfo2_GetCodecInfoCount(This,guid,count) (This)->lpVtbl->GetCodecInfoCount(This,guid,count)
#define IWMCodecInfo2_GetCodecFormatCount(This,guid,codecindex,formatcount) (This)->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount)
#define IWMCodecInfo2_GetCodecFormat(This,guid,codecindex,formatindex,streamconfig) (This)->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig)
/*** IWMCodecInfo2 methods ***/
#define IWMCodecInfo2_GetCodecName(This,guid,codecindex,name,namesize) (This)->lpVtbl->GetCodecName(This,guid,codecindex,name,namesize)
#define IWMCodecInfo2_GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize) (This)->lpVtbl->GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMCodecInfo2_QueryInterface(IWMCodecInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMCodecInfo2_AddRef(IWMCodecInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMCodecInfo2_Release(IWMCodecInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMCodecInfo methods ***/
static FORCEINLINE HRESULT IWMCodecInfo2_GetCodecInfoCount(IWMCodecInfo2* This,REFGUID guid,DWORD *count) {
    return This->lpVtbl->GetCodecInfoCount(This,guid,count);
}
static FORCEINLINE HRESULT IWMCodecInfo2_GetCodecFormatCount(IWMCodecInfo2* This,REFGUID guid,DWORD codecindex,DWORD *formatcount) {
    return This->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount);
}
static FORCEINLINE HRESULT IWMCodecInfo2_GetCodecFormat(IWMCodecInfo2* This,REFGUID guid,DWORD codecindex,DWORD formatindex,IWMStreamConfig **streamconfig) {
    return This->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig);
}
/*** IWMCodecInfo2 methods ***/
static FORCEINLINE HRESULT IWMCodecInfo2_GetCodecName(IWMCodecInfo2* This,REFGUID guid,DWORD codecindex,WCHAR *name,DWORD *namesize) {
    return This->lpVtbl->GetCodecName(This,guid,codecindex,name,namesize);
}
static FORCEINLINE HRESULT IWMCodecInfo2_GetCodecFormatDesc(IWMCodecInfo2* This,REFGUID guid,DWORD codecindex,DWORD formatindex,IWMStreamConfig **streamconfig,WCHAR *description,DWORD *descrsize) {
    return This->lpVtbl->GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize);
}
#endif
#endif

#endif


#endif  /* __IWMCodecInfo2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMCodecInfo3 interface
 */
#ifndef __IWMCodecInfo3_INTERFACE_DEFINED__
#define __IWMCodecInfo3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMCodecInfo3, 0x7e51f487, 0x4d93, 0x4f98, 0x8a,0xb4, 0x27,0xd0,0x56,0x5a,0xdc,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7e51f487-4d93-4f98-8ab4-27d0565adc51")
IWMCodecInfo3 : public IWMCodecInfo2
{
    virtual HRESULT STDMETHODCALLTYPE GetCodecFormatProp(
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecProp(
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCodecEnumerationSetting(
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        DWORD size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecEnumerationSetting(
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMCodecInfo3, 0x7e51f487, 0x4d93, 0x4f98, 0x8a,0xb4, 0x27,0xd0,0x56,0x5a,0xdc,0x51)
#endif
#else
typedef struct IWMCodecInfo3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMCodecInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInfoCount)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormatCount)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD *formatcount);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormat)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig);

    /*** IWMCodecInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecName)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        WCHAR *name,
        DWORD *namesize);

    HRESULT (STDMETHODCALLTYPE *GetCodecFormatDesc)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        IWMStreamConfig **streamconfig,
        WCHAR *description,
        DWORD *descrsize);

    /*** IWMCodecInfo3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecFormatProp)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        DWORD formatindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *GetCodecProp)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetCodecEnumerationSetting)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        DWORD size);

    HRESULT (STDMETHODCALLTYPE *GetCodecEnumerationSetting)(
        IWMCodecInfo3 *This,
        REFGUID guid,
        DWORD codecindex,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size);

    END_INTERFACE
} IWMCodecInfo3Vtbl;

interface IWMCodecInfo3 {
    CONST_VTBL IWMCodecInfo3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMCodecInfo3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMCodecInfo3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMCodecInfo3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMCodecInfo methods ***/
#define IWMCodecInfo3_GetCodecInfoCount(This,guid,count) (This)->lpVtbl->GetCodecInfoCount(This,guid,count)
#define IWMCodecInfo3_GetCodecFormatCount(This,guid,codecindex,formatcount) (This)->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount)
#define IWMCodecInfo3_GetCodecFormat(This,guid,codecindex,formatindex,streamconfig) (This)->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig)
/*** IWMCodecInfo2 methods ***/
#define IWMCodecInfo3_GetCodecName(This,guid,codecindex,name,namesize) (This)->lpVtbl->GetCodecName(This,guid,codecindex,name,namesize)
#define IWMCodecInfo3_GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize) (This)->lpVtbl->GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize)
/*** IWMCodecInfo3 methods ***/
#define IWMCodecInfo3_GetCodecFormatProp(This,guid,codecindex,formatindex,name,type,value,size) (This)->lpVtbl->GetCodecFormatProp(This,guid,codecindex,formatindex,name,type,value,size)
#define IWMCodecInfo3_GetCodecProp(This,guid,codecindex,name,type,value,size) (This)->lpVtbl->GetCodecProp(This,guid,codecindex,name,type,value,size)
#define IWMCodecInfo3_SetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size) (This)->lpVtbl->SetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size)
#define IWMCodecInfo3_GetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size) (This)->lpVtbl->GetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMCodecInfo3_QueryInterface(IWMCodecInfo3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMCodecInfo3_AddRef(IWMCodecInfo3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMCodecInfo3_Release(IWMCodecInfo3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMCodecInfo methods ***/
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecInfoCount(IWMCodecInfo3* This,REFGUID guid,DWORD *count) {
    return This->lpVtbl->GetCodecInfoCount(This,guid,count);
}
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecFormatCount(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,DWORD *formatcount) {
    return This->lpVtbl->GetCodecFormatCount(This,guid,codecindex,formatcount);
}
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecFormat(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,DWORD formatindex,IWMStreamConfig **streamconfig) {
    return This->lpVtbl->GetCodecFormat(This,guid,codecindex,formatindex,streamconfig);
}
/*** IWMCodecInfo2 methods ***/
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecName(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,WCHAR *name,DWORD *namesize) {
    return This->lpVtbl->GetCodecName(This,guid,codecindex,name,namesize);
}
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecFormatDesc(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,DWORD formatindex,IWMStreamConfig **streamconfig,WCHAR *description,DWORD *descrsize) {
    return This->lpVtbl->GetCodecFormatDesc(This,guid,codecindex,formatindex,streamconfig,description,descrsize);
}
/*** IWMCodecInfo3 methods ***/
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecFormatProp(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,DWORD formatindex,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,DWORD *size) {
    return This->lpVtbl->GetCodecFormatProp(This,guid,codecindex,formatindex,name,type,value,size);
}
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecProp(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,DWORD *size) {
    return This->lpVtbl->GetCodecProp(This,guid,codecindex,name,type,value,size);
}
static FORCEINLINE HRESULT IWMCodecInfo3_SetCodecEnumerationSetting(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,const WCHAR *name,WMT_ATTR_DATATYPE type,const BYTE *value,DWORD size) {
    return This->lpVtbl->SetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size);
}
static FORCEINLINE HRESULT IWMCodecInfo3_GetCodecEnumerationSetting(IWMCodecInfo3* This,REFGUID guid,DWORD codecindex,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,DWORD *size) {
    return This->lpVtbl->GetCodecEnumerationSetting(This,guid,codecindex,name,type,value,size);
}
#endif
#endif

#endif


#endif  /* __IWMCodecInfo3_INTERFACE_DEFINED__ */

static const WCHAR g_wszNumPasses[] = {'_','P','A','S','S','E','S','U','S','E','D',0};
static const WCHAR g_wszVBREnabled[] = {'_','V','B','R','E','N','A','B','L','E','D',0};
/*****************************************************************************
 * IWMMediaProps interface
 */
#ifndef __IWMMediaProps_INTERFACE_DEFINED__
#define __IWMMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMediaProps, 0x96406bce, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bce-2b2b-11d3-b36b-00c04f6108ff")
IWMMediaProps : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetType(
        GUID *pguidType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaType(
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        WM_MEDIA_TYPE *pType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMediaProps, 0x96406bce, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMMediaProps *This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMMediaProps *This,
        WM_MEDIA_TYPE *pType);

    END_INTERFACE
} IWMMediaPropsVtbl;

interface IWMMediaProps {
    CONST_VTBL IWMMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMediaProps_QueryInterface(IWMMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMediaProps_AddRef(IWMMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMediaProps_Release(IWMMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMMediaProps_GetType(IWMMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMMediaProps_GetMediaType(IWMMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMMediaProps_SetMediaType(IWMMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
#endif
#endif

#endif


#endif  /* __IWMMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMOutputMediaProps interface
 */
#ifndef __IWMOutputMediaProps_INTERFACE_DEFINED__
#define __IWMOutputMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMOutputMediaProps, 0x96406bd7, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd7-2b2b-11d3-b36b-00c04f6108ff")
IWMOutputMediaProps : public IWMMediaProps
{
    virtual HRESULT STDMETHODCALLTYPE GetStreamGroupName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMOutputMediaProps, 0x96406bd7, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMOutputMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMOutputMediaProps *This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMOutputMediaProps *This,
        WM_MEDIA_TYPE *pType);

    /*** IWMOutputMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStreamGroupName)(
        IWMOutputMediaProps *This,
        WCHAR *pwszName,
        WORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMOutputMediaProps *This,
        WCHAR *pwszName,
        WORD *pcchName);

    END_INTERFACE
} IWMOutputMediaPropsVtbl;

interface IWMOutputMediaProps {
    CONST_VTBL IWMOutputMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMOutputMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMOutputMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMOutputMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMOutputMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMOutputMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMOutputMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
/*** IWMOutputMediaProps methods ***/
#define IWMOutputMediaProps_GetStreamGroupName(This,pwszName,pcchName) (This)->lpVtbl->GetStreamGroupName(This,pwszName,pcchName)
#define IWMOutputMediaProps_GetConnectionName(This,pwszName,pcchName) (This)->lpVtbl->GetConnectionName(This,pwszName,pcchName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_QueryInterface(IWMOutputMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMOutputMediaProps_AddRef(IWMOutputMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMOutputMediaProps_Release(IWMOutputMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_GetType(IWMOutputMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_GetMediaType(IWMOutputMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_SetMediaType(IWMOutputMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
/*** IWMOutputMediaProps methods ***/
static FORCEINLINE HRESULT IWMOutputMediaProps_GetStreamGroupName(IWMOutputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetStreamGroupName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMOutputMediaProps_GetConnectionName(IWMOutputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetConnectionName(This,pwszName,pcchName);
}
#endif
#endif

#endif


#endif  /* __IWMOutputMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMMetadataEditor interface
 */
#ifndef __IWMMetadataEditor_INTERFACE_DEFINED__
#define __IWMMetadataEditor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMMetadataEditor, 0x96406bd9, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd9-2b2b-11d3-b36b-00c04f6108ff")
IWMMetadataEditor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMMetadataEditor, 0x96406bd9, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMMetadataEditorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMMetadataEditor methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMMetadataEditor *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMMetadataEditor *This);

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

    END_INTERFACE
} IWMMetadataEditorVtbl;

interface IWMMetadataEditor {
    CONST_VTBL IWMMetadataEditorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMMetadataEditor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMMetadataEditor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMMetadataEditor_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMetadataEditor methods ***/
#define IWMMetadataEditor_Open(This,pwszFilename) (This)->lpVtbl->Open(This,pwszFilename)
#define IWMMetadataEditor_Close(This) (This)->lpVtbl->Close(This)
#define IWMMetadataEditor_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMMetadataEditor_QueryInterface(IWMMetadataEditor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMMetadataEditor_AddRef(IWMMetadataEditor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMMetadataEditor_Release(IWMMetadataEditor* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMetadataEditor methods ***/
static FORCEINLINE HRESULT IWMMetadataEditor_Open(IWMMetadataEditor* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->Open(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMMetadataEditor_Close(IWMMetadataEditor* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMMetadataEditor_Flush(IWMMetadataEditor* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif


#endif  /* __IWMMetadataEditor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReader interface
 */
#ifndef __IWMReader_INTERFACE_DEFINED__
#define __IWMReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReader, 0x96406bd6, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd6-2b2b-11d3-b36b-00c04f6108ff")
IWMReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszURL,
        IWMReaderCallback *pCallback,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormatCount(
        DWORD dwOutputNumber,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormat(
        DWORD dwOutputNumber,
        DWORD dwFormatNumber,
        IWMOutputMediaProps **ppProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE Start(
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReader, 0x96406bd6, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReader methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMReader *This,
        const WCHAR *pwszURL,
        IWMReaderCallback *pCallback,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMReader *This);

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

    HRESULT (STDMETHODCALLTYPE *GetOutputProps)(
        IWMReader *This,
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput);

    HRESULT (STDMETHODCALLTYPE *SetOutputProps)(
        IWMReader *This,
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormatCount)(
        IWMReader *This,
        DWORD dwOutputNumber,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormat)(
        IWMReader *This,
        DWORD dwOutputNumber,
        DWORD dwFormatNumber,
        IWMOutputMediaProps **ppProps);

    HRESULT (STDMETHODCALLTYPE *Start)(
        IWMReader *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IWMReader *This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IWMReader *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IWMReader *This);

    END_INTERFACE
} IWMReaderVtbl;

interface IWMReader {
    CONST_VTBL IWMReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReader methods ***/
#define IWMReader_Open(This,pwszURL,pCallback,pvContext) (This)->lpVtbl->Open(This,pwszURL,pCallback,pvContext)
#define IWMReader_Close(This) (This)->lpVtbl->Close(This)
#define IWMReader_GetOutputCount(This,pcOutputs) (This)->lpVtbl->GetOutputCount(This,pcOutputs)
#define IWMReader_GetOutputProps(This,dwOutputNum,ppOutput) (This)->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput)
#define IWMReader_SetOutputProps(This,dwOutputNum,pOutput) (This)->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput)
#define IWMReader_GetOutputFormatCount(This,dwOutputNumber,pcFormats) (This)->lpVtbl->GetOutputFormatCount(This,dwOutputNumber,pcFormats)
#define IWMReader_GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps) (This)->lpVtbl->GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps)
#define IWMReader_Start(This,cnsStart,cnsDuration,fRate,pvContext) (This)->lpVtbl->Start(This,cnsStart,cnsDuration,fRate,pvContext)
#define IWMReader_Stop(This) (This)->lpVtbl->Stop(This)
#define IWMReader_Pause(This) (This)->lpVtbl->Pause(This)
#define IWMReader_Resume(This) (This)->lpVtbl->Resume(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReader_QueryInterface(IWMReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReader_AddRef(IWMReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReader_Release(IWMReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReader methods ***/
static FORCEINLINE HRESULT IWMReader_Open(IWMReader* This,const WCHAR *pwszURL,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->Open(This,pwszURL,pCallback,pvContext);
}
static FORCEINLINE HRESULT IWMReader_Close(IWMReader* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMReader_GetOutputCount(IWMReader* This,DWORD *pcOutputs) {
    return This->lpVtbl->GetOutputCount(This,pcOutputs);
}
static FORCEINLINE HRESULT IWMReader_GetOutputProps(IWMReader* This,DWORD dwOutputNum,IWMOutputMediaProps **ppOutput) {
    return This->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput);
}
static FORCEINLINE HRESULT IWMReader_SetOutputProps(IWMReader* This,DWORD dwOutputNum,IWMOutputMediaProps *pOutput) {
    return This->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput);
}
static FORCEINLINE HRESULT IWMReader_GetOutputFormatCount(IWMReader* This,DWORD dwOutputNumber,DWORD *pcFormats) {
    return This->lpVtbl->GetOutputFormatCount(This,dwOutputNumber,pcFormats);
}
static FORCEINLINE HRESULT IWMReader_GetOutputFormat(IWMReader* This,DWORD dwOutputNumber,DWORD dwFormatNumber,IWMOutputMediaProps **ppProps) {
    return This->lpVtbl->GetOutputFormat(This,dwOutputNumber,dwFormatNumber,ppProps);
}
static FORCEINLINE HRESULT IWMReader_Start(IWMReader* This,QWORD cnsStart,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->Start(This,cnsStart,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReader_Stop(IWMReader* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IWMReader_Pause(IWMReader* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IWMReader_Resume(IWMReader* This) {
    return This->lpVtbl->Resume(This);
}
#endif
#endif

#endif


#endif  /* __IWMReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPlayerHook interface
 */
#ifndef __IWMPlayerHook_INTERFACE_DEFINED__
#define __IWMPlayerHook_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPlayerHook, 0xe5b7ca9a, 0x0f1c, 0x4f66, 0x90,0x02, 0x74,0xec,0x50,0xd8,0xb3,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e5b7ca9a-0f1c-4f66-9002-74ec50d8b304")
IWMPlayerHook : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE PreDecode(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPlayerHook, 0xe5b7ca9a, 0x0f1c, 0x4f66, 0x90,0x02, 0x74,0xec,0x50,0xd8,0xb3,0x04)
#endif
#else
typedef struct IWMPlayerHookVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPlayerHook methods ***/
    HRESULT (STDMETHODCALLTYPE *PreDecode)(
        IWMPlayerHook *This);

    END_INTERFACE
} IWMPlayerHookVtbl;

interface IWMPlayerHook {
    CONST_VTBL IWMPlayerHookVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPlayerHook_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPlayerHook_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPlayerHook_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPlayerHook methods ***/
#define IWMPlayerHook_PreDecode(This) (This)->lpVtbl->PreDecode(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMPlayerHook_QueryInterface(IWMPlayerHook* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPlayerHook_AddRef(IWMPlayerHook* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPlayerHook_Release(IWMPlayerHook* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPlayerHook methods ***/
static FORCEINLINE HRESULT IWMPlayerHook_PreDecode(IWMPlayerHook* This) {
    return This->lpVtbl->PreDecode(This);
}
#endif
#endif

#endif


#endif  /* __IWMPlayerHook_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced interface
 */
#ifndef __IWMReaderAdvanced_INTERFACE_DEFINED__
#define __IWMReaderAdvanced_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced, 0x96406bea, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bea-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderAdvanced : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetUserProvidedClock(
        WINBOOL fUserClock) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserProvidedClock(
        WINBOOL *pfUserClock) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeliverTime(
        QWORD cnsTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManualStreamSelection(
        WINBOOL fSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetManualStreamSelection(
        WINBOOL *pfSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamsSelected(
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamSelected(
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReceiveSelectionCallbacks(
        WINBOOL fGetCallbacks) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReceiveSelectionCallbacks(
        WINBOOL *pfGetCallbacks) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReceiveStreamSamples(
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReceiveStreamSamples(
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAllocateForOutput(
        DWORD dwOutputNum,
        WINBOOL fAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllocateForOutput(
        DWORD dwOutputNum,
        WINBOOL *pfAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAllocateForStream(
        WORD wStreamNum,
        WINBOOL fAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllocateForStream(
        WORD dwStreamNum,
        WINBOOL *pfAllocate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        WM_READER_STATISTICS *pStatistics) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClientInfo(
        WM_READER_CLIENTINFO *pClientInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxOutputSampleSize(
        DWORD dwOutput,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxStreamSampleSize(
        WORD wStream,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyLateDelivery(
        QWORD cnsLateness) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced, 0x96406bea, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderAdvancedVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced *This,
        QWORD cnsLateness);

    END_INTERFACE
} IWMReaderAdvancedVtbl;

interface IWMReaderAdvanced {
    CONST_VTBL IWMReaderAdvancedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced_QueryInterface(IWMReaderAdvanced* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced_AddRef(IWMReaderAdvanced* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced_Release(IWMReaderAdvanced* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced_SetUserProvidedClock(IWMReaderAdvanced* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetUserProvidedClock(IWMReaderAdvanced* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_DeliverTime(IWMReaderAdvanced* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetManualStreamSelection(IWMReaderAdvanced* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetManualStreamSelection(IWMReaderAdvanced* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetStreamsSelected(IWMReaderAdvanced* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetStreamSelected(IWMReaderAdvanced* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetReceiveSelectionCallbacks(IWMReaderAdvanced* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetReceiveSelectionCallbacks(IWMReaderAdvanced* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetReceiveStreamSamples(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetReceiveStreamSamples(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetAllocateForOutput(IWMReaderAdvanced* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetAllocateForOutput(IWMReaderAdvanced* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetAllocateForStream(IWMReaderAdvanced* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetAllocateForStream(IWMReaderAdvanced* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetStatistics(IWMReaderAdvanced* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_SetClientInfo(IWMReaderAdvanced* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetMaxOutputSampleSize(IWMReaderAdvanced* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_GetMaxStreamSampleSize(IWMReaderAdvanced* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced_NotifyLateDelivery(IWMReaderAdvanced* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced2 interface
 */
#ifndef __IWMReaderAdvanced2_INTERFACE_DEFINED__
#define __IWMReaderAdvanced2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced2, 0xae14a945, 0xb90c, 0x4d0d, 0x91,0x27, 0x80,0xd6,0x65,0xf7,0xd7,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae14a945-b90c-4d0d-9127-80d665f7d73e")
IWMReaderAdvanced2 : public IWMReaderAdvanced
{
    virtual HRESULT STDMETHODCALLTYPE SetPlayMode(
        WMT_PLAY_MODE Mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayMode(
        WMT_PLAY_MODE *pMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBufferProgress(
        DWORD *pdwPercent,
        QWORD *pcnsBuffering) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDownloadProgress(
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSaveAsProgress(
        DWORD *pdwPercent) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveFileAs(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProtocolName(
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartAtMarker(
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE Preroll(
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLogClientID(
        WINBOOL fLogClientID) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLogClientID(
        WINBOOL *pfLogClientID) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopBuffering(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenStream(
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced2, 0xae14a945, 0xb90c, 0x4d0d, 0x91,0x27, 0x80,0xd6,0x65,0xf7,0xd7,0x3e)
#endif
#else
typedef struct IWMReaderAdvanced2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced2 *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced2 *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced2 *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced2 *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced2 *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced2 *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced2 *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced2 *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced2 *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced2 *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced2 *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced2 *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced2 *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced2 *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced2 *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced2 *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced2 *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced2 *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced2 *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced2 *This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced2 *This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced2 *This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced2 *This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced2 *This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced2 *This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced2 *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced2 *This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced2 *This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced2 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced2 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced2 *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced2 *This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced2 *This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced2 *This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced2 *This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    END_INTERFACE
} IWMReaderAdvanced2Vtbl;

interface IWMReaderAdvanced2 {
    CONST_VTBL IWMReaderAdvanced2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced2_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced2_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced2_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced2_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced2_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced2_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced2_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced2_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced2_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced2_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced2_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced2_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced2_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced2_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced2_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced2_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced2_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced2_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced2_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced2_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced2_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced2_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced2_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced2_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced2_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced2_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced2_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced2_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced2_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced2_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced2_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced2_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced2_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced2_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced2_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_QueryInterface(IWMReaderAdvanced2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced2_AddRef(IWMReaderAdvanced2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced2_Release(IWMReaderAdvanced2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetUserProvidedClock(IWMReaderAdvanced2* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetUserProvidedClock(IWMReaderAdvanced2* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_DeliverTime(IWMReaderAdvanced2* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetManualStreamSelection(IWMReaderAdvanced2* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetManualStreamSelection(IWMReaderAdvanced2* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetStreamsSelected(IWMReaderAdvanced2* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetStreamSelected(IWMReaderAdvanced2* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetReceiveSelectionCallbacks(IWMReaderAdvanced2* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetReceiveSelectionCallbacks(IWMReaderAdvanced2* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetReceiveStreamSamples(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetReceiveStreamSamples(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetAllocateForOutput(IWMReaderAdvanced2* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetAllocateForOutput(IWMReaderAdvanced2* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetAllocateForStream(IWMReaderAdvanced2* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetAllocateForStream(IWMReaderAdvanced2* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetStatistics(IWMReaderAdvanced2* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetClientInfo(IWMReaderAdvanced2* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetMaxOutputSampleSize(IWMReaderAdvanced2* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetMaxStreamSampleSize(IWMReaderAdvanced2* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_NotifyLateDelivery(IWMReaderAdvanced2* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetPlayMode(IWMReaderAdvanced2* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetPlayMode(IWMReaderAdvanced2* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetBufferProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetDownloadProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetSaveAsProgress(IWMReaderAdvanced2* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SaveFileAs(IWMReaderAdvanced2* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetProtocolName(IWMReaderAdvanced2* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_StartAtMarker(IWMReaderAdvanced2* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetOutputSetting(IWMReaderAdvanced2* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetOutputSetting(IWMReaderAdvanced2* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_Preroll(IWMReaderAdvanced2* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_SetLogClientID(IWMReaderAdvanced2* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_GetLogClientID(IWMReaderAdvanced2* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_StopBuffering(IWMReaderAdvanced2* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced2_OpenStream(IWMReaderAdvanced2* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced3 interface
 */
#ifndef __IWMReaderAdvanced3_INTERFACE_DEFINED__
#define __IWMReaderAdvanced3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced3, 0x5dc0674b, 0xf04b, 0x4a4e, 0x9f,0x2a, 0xb1,0xaf,0xde,0x2c,0x81,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5dc0674b-f04b-4a4e-9f2a-b1afde2c8100")
IWMReaderAdvanced3 : public IWMReaderAdvanced2
{
    virtual HRESULT STDMETHODCALLTYPE StopNetStreaming(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartAtPosition(
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced3, 0x5dc0674b, 0xf04b, 0x4a4e, 0x9f,0x2a, 0xb1,0xaf,0xde,0x2c,0x81,0x00)
#endif
#else
typedef struct IWMReaderAdvanced3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced3 *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced3 *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced3 *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced3 *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced3 *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced3 *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced3 *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced3 *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced3 *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced3 *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced3 *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced3 *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced3 *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced3 *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced3 *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced3 *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced3 *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced3 *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced3 *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced3 *This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced3 *This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced3 *This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced3 *This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced3 *This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced3 *This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced3 *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced3 *This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced3 *This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced3 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced3 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced3 *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced3 *This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced3 *This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced3 *This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced3 *This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced3 *This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced3 *This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    END_INTERFACE
} IWMReaderAdvanced3Vtbl;

interface IWMReaderAdvanced3 {
    CONST_VTBL IWMReaderAdvanced3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced3_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced3_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced3_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced3_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced3_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced3_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced3_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced3_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced3_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced3_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced3_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced3_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced3_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced3_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced3_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced3_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced3_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced3_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced3_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced3_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced3_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced3_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced3_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced3_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced3_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced3_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced3_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced3_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced3_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced3_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced3_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced3_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced3_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced3_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced3_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced3_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced3_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_QueryInterface(IWMReaderAdvanced3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced3_AddRef(IWMReaderAdvanced3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced3_Release(IWMReaderAdvanced3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetUserProvidedClock(IWMReaderAdvanced3* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetUserProvidedClock(IWMReaderAdvanced3* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_DeliverTime(IWMReaderAdvanced3* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetManualStreamSelection(IWMReaderAdvanced3* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetManualStreamSelection(IWMReaderAdvanced3* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetStreamsSelected(IWMReaderAdvanced3* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetStreamSelected(IWMReaderAdvanced3* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetReceiveSelectionCallbacks(IWMReaderAdvanced3* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetReceiveSelectionCallbacks(IWMReaderAdvanced3* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetReceiveStreamSamples(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetReceiveStreamSamples(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetAllocateForOutput(IWMReaderAdvanced3* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetAllocateForOutput(IWMReaderAdvanced3* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetAllocateForStream(IWMReaderAdvanced3* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetAllocateForStream(IWMReaderAdvanced3* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetStatistics(IWMReaderAdvanced3* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetClientInfo(IWMReaderAdvanced3* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetMaxOutputSampleSize(IWMReaderAdvanced3* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetMaxStreamSampleSize(IWMReaderAdvanced3* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_NotifyLateDelivery(IWMReaderAdvanced3* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetPlayMode(IWMReaderAdvanced3* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetPlayMode(IWMReaderAdvanced3* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetBufferProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetDownloadProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetSaveAsProgress(IWMReaderAdvanced3* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SaveFileAs(IWMReaderAdvanced3* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetProtocolName(IWMReaderAdvanced3* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StartAtMarker(IWMReaderAdvanced3* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetOutputSetting(IWMReaderAdvanced3* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetOutputSetting(IWMReaderAdvanced3* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_Preroll(IWMReaderAdvanced3* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_SetLogClientID(IWMReaderAdvanced3* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_GetLogClientID(IWMReaderAdvanced3* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StopBuffering(IWMReaderAdvanced3* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_OpenStream(IWMReaderAdvanced3* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced3_StopNetStreaming(IWMReaderAdvanced3* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced3_StartAtPosition(IWMReaderAdvanced3* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced4 interface
 */
#ifndef __IWMReaderAdvanced4_INTERFACE_DEFINED__
#define __IWMReaderAdvanced4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced4, 0x945a76a2, 0x12ae, 0x4d48, 0xbd,0x3c, 0xcd,0x1d,0x90,0x39,0x9b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("945a76a2-12ae-4d48-bd3c-cd1d90399b85")
IWMReaderAdvanced4 : public IWMReaderAdvanced3
{
    virtual HRESULT STDMETHODCALLTYPE GetLanguageCount(
        DWORD dwOutputNum,
        WORD *pwLanguageCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguage(
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxSpeedFactor(
        double *pdblFactor) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsUsingFastCache(
        WINBOOL *pfUsingFastCache) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddLogParam(
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendLogParams(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanSaveFileAs(
        WINBOOL *pfCanSave) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelSaveFileAs(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetURL(
        WCHAR *pwszURL,
        DWORD *pcchURL) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced4, 0x945a76a2, 0x12ae, 0x4d48, 0xbd,0x3c, 0xcd,0x1d,0x90,0x39,0x9b,0x85)
#endif
#else
typedef struct IWMReaderAdvanced4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced4 *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced4 *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced4 *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced4 *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced4 *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced4 *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced4 *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced4 *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced4 *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced4 *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced4 *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced4 *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced4 *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced4 *This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced4 *This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced4 *This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced4 *This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced4 *This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced4 *This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced4 *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced4 *This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced4 *This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced4 *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced4 *This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced4 *This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced4 *This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced4 *This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced4 *This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced4 *This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced4 *This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced4 *This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced4 *This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced4 *This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced4 *This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced4 *This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    END_INTERFACE
} IWMReaderAdvanced4Vtbl;

interface IWMReaderAdvanced4 {
    CONST_VTBL IWMReaderAdvanced4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced4_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced4_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced4_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced4_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced4_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced4_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced4_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced4_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced4_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced4_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced4_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced4_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced4_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced4_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced4_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced4_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced4_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced4_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced4_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced4_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced4_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced4_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced4_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced4_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced4_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced4_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced4_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced4_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced4_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced4_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced4_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced4_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced4_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced4_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced4_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced4_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced4_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced4_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced4_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced4_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced4_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced4_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced4_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced4_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced4_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced4_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced4_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_QueryInterface(IWMReaderAdvanced4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced4_AddRef(IWMReaderAdvanced4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced4_Release(IWMReaderAdvanced4* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetUserProvidedClock(IWMReaderAdvanced4* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetUserProvidedClock(IWMReaderAdvanced4* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_DeliverTime(IWMReaderAdvanced4* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetManualStreamSelection(IWMReaderAdvanced4* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetManualStreamSelection(IWMReaderAdvanced4* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetStreamsSelected(IWMReaderAdvanced4* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetStreamSelected(IWMReaderAdvanced4* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetReceiveSelectionCallbacks(IWMReaderAdvanced4* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetReceiveSelectionCallbacks(IWMReaderAdvanced4* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetReceiveStreamSamples(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetReceiveStreamSamples(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetAllocateForOutput(IWMReaderAdvanced4* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetAllocateForOutput(IWMReaderAdvanced4* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetAllocateForStream(IWMReaderAdvanced4* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetAllocateForStream(IWMReaderAdvanced4* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetStatistics(IWMReaderAdvanced4* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetClientInfo(IWMReaderAdvanced4* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxOutputSampleSize(IWMReaderAdvanced4* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxStreamSampleSize(IWMReaderAdvanced4* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_NotifyLateDelivery(IWMReaderAdvanced4* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetPlayMode(IWMReaderAdvanced4* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetPlayMode(IWMReaderAdvanced4* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetBufferProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetDownloadProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetSaveAsProgress(IWMReaderAdvanced4* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SaveFileAs(IWMReaderAdvanced4* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetProtocolName(IWMReaderAdvanced4* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StartAtMarker(IWMReaderAdvanced4* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetOutputSetting(IWMReaderAdvanced4* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetOutputSetting(IWMReaderAdvanced4* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_Preroll(IWMReaderAdvanced4* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SetLogClientID(IWMReaderAdvanced4* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLogClientID(IWMReaderAdvanced4* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StopBuffering(IWMReaderAdvanced4* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_OpenStream(IWMReaderAdvanced4* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_StopNetStreaming(IWMReaderAdvanced4* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_StartAtPosition(IWMReaderAdvanced4* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLanguageCount(IWMReaderAdvanced4* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetLanguage(IWMReaderAdvanced4* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetMaxSpeedFactor(IWMReaderAdvanced4* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_IsUsingFastCache(IWMReaderAdvanced4* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_AddLogParam(IWMReaderAdvanced4* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_SendLogParams(IWMReaderAdvanced4* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_CanSaveFileAs(IWMReaderAdvanced4* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_CancelSaveFileAs(IWMReaderAdvanced4* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced4_GetURL(IWMReaderAdvanced4* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced5 interface
 */
#ifndef __IWMReaderAdvanced5_INTERFACE_DEFINED__
#define __IWMReaderAdvanced5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced5, 0x24c44db0, 0x55d1, 0x49ae, 0xa5,0xcc, 0xf1,0x38,0x15,0xe3,0x63,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24c44db0-55d1-49ae-a5cc-f13815e36363")
IWMReaderAdvanced5 : public IWMReaderAdvanced4
{
    virtual HRESULT STDMETHODCALLTYPE SetPlayerHook(
        DWORD dwOutputNum,
        IWMPlayerHook *pHook) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced5, 0x24c44db0, 0x55d1, 0x49ae, 0xa5,0xcc, 0xf1,0x38,0x15,0xe3,0x63,0x63)
#endif
#else
typedef struct IWMReaderAdvanced5Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced5 *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced5 *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced5 *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced5 *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced5 *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced5 *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced5 *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced5 *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced5 *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced5 *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced5 *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced5 *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced5 *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced5 *This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced5 *This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced5 *This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced5 *This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced5 *This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced5 *This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced5 *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced5 *This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced5 *This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced5 *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced5 *This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced5 *This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced5 *This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced5 *This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced5 *This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced5 *This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced5 *This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced5 *This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced5 *This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced5 *This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced5 *This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    /*** IWMReaderAdvanced5 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayerHook)(
        IWMReaderAdvanced5 *This,
        DWORD dwOutputNum,
        IWMPlayerHook *pHook);

    END_INTERFACE
} IWMReaderAdvanced5Vtbl;

interface IWMReaderAdvanced5 {
    CONST_VTBL IWMReaderAdvanced5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced5_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced5_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced5_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced5_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced5_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced5_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced5_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced5_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced5_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced5_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced5_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced5_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced5_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced5_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced5_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced5_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced5_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced5_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced5_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced5_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced5_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced5_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced5_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced5_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced5_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced5_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced5_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced5_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced5_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced5_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced5_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced5_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced5_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced5_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced5_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced5_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced5_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced5_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced5_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced5_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced5_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced5_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced5_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced5_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced5_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced5_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced5_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
/*** IWMReaderAdvanced5 methods ***/
#define IWMReaderAdvanced5_SetPlayerHook(This,dwOutputNum,pHook) (This)->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_QueryInterface(IWMReaderAdvanced5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced5_AddRef(IWMReaderAdvanced5* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced5_Release(IWMReaderAdvanced5* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetUserProvidedClock(IWMReaderAdvanced5* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetUserProvidedClock(IWMReaderAdvanced5* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_DeliverTime(IWMReaderAdvanced5* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetManualStreamSelection(IWMReaderAdvanced5* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetManualStreamSelection(IWMReaderAdvanced5* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetStreamsSelected(IWMReaderAdvanced5* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetStreamSelected(IWMReaderAdvanced5* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetReceiveSelectionCallbacks(IWMReaderAdvanced5* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetReceiveSelectionCallbacks(IWMReaderAdvanced5* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetReceiveStreamSamples(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetReceiveStreamSamples(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetAllocateForOutput(IWMReaderAdvanced5* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetAllocateForOutput(IWMReaderAdvanced5* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetAllocateForStream(IWMReaderAdvanced5* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetAllocateForStream(IWMReaderAdvanced5* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetStatistics(IWMReaderAdvanced5* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetClientInfo(IWMReaderAdvanced5* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxOutputSampleSize(IWMReaderAdvanced5* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxStreamSampleSize(IWMReaderAdvanced5* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_NotifyLateDelivery(IWMReaderAdvanced5* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetPlayMode(IWMReaderAdvanced5* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetPlayMode(IWMReaderAdvanced5* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetBufferProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetDownloadProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetSaveAsProgress(IWMReaderAdvanced5* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SaveFileAs(IWMReaderAdvanced5* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetProtocolName(IWMReaderAdvanced5* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StartAtMarker(IWMReaderAdvanced5* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetOutputSetting(IWMReaderAdvanced5* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetOutputSetting(IWMReaderAdvanced5* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_Preroll(IWMReaderAdvanced5* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetLogClientID(IWMReaderAdvanced5* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLogClientID(IWMReaderAdvanced5* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StopBuffering(IWMReaderAdvanced5* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_OpenStream(IWMReaderAdvanced5* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_StopNetStreaming(IWMReaderAdvanced5* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_StartAtPosition(IWMReaderAdvanced5* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLanguageCount(IWMReaderAdvanced5* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetLanguage(IWMReaderAdvanced5* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetMaxSpeedFactor(IWMReaderAdvanced5* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_IsUsingFastCache(IWMReaderAdvanced5* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_AddLogParam(IWMReaderAdvanced5* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_SendLogParams(IWMReaderAdvanced5* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_CanSaveFileAs(IWMReaderAdvanced5* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_CancelSaveFileAs(IWMReaderAdvanced5* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced5_GetURL(IWMReaderAdvanced5* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
/*** IWMReaderAdvanced5 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced5_SetPlayerHook(IWMReaderAdvanced5* This,DWORD dwOutputNum,IWMPlayerHook *pHook) {
    return This->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAdvanced6 interface
 */
#ifndef __IWMReaderAdvanced6_INTERFACE_DEFINED__
#define __IWMReaderAdvanced6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAdvanced6, 0x18a2e7f8, 0x428f, 0x4acd, 0x8a,0x00, 0xe6,0x46,0x39,0xbc,0x93,0xde);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18a2e7f8-428f-4acd-8a00-e64639bc93de")
IWMReaderAdvanced6 : public IWMReaderAdvanced5
{
    virtual HRESULT STDMETHODCALLTYPE SetProtectStreamSamples(
        BYTE *pbCertificate,
        DWORD cbCertificate,
        DWORD dwCertificateType,
        DWORD dwFlags,
        BYTE *pbInitializationVector,
        DWORD *pcbInitializationVector) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAdvanced6, 0x18a2e7f8, 0x428f, 0x4acd, 0x8a,0x00, 0xe6,0x46,0x39,0xbc,0x93,0xde)
#endif
#else
typedef struct IWMReaderAdvanced6Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *SetUserProvidedClock)(
        IWMReaderAdvanced6 *This,
        WINBOOL fUserClock);

    HRESULT (STDMETHODCALLTYPE *GetUserProvidedClock)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfUserClock);

    HRESULT (STDMETHODCALLTYPE *DeliverTime)(
        IWMReaderAdvanced6 *This,
        QWORD cnsTime);

    HRESULT (STDMETHODCALLTYPE *SetManualStreamSelection)(
        IWMReaderAdvanced6 *This,
        WINBOOL fSelection);

    HRESULT (STDMETHODCALLTYPE *GetManualStreamSelection)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfSelection);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMReaderAdvanced6 *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMReaderAdvanced6 *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReceiveSelectionCallbacks)(
        IWMReaderAdvanced6 *This,
        WINBOOL fGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *GetReceiveSelectionCallbacks)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfGetCallbacks);

    HRESULT (STDMETHODCALLTYPE *SetReceiveStreamSamples)(
        IWMReaderAdvanced6 *This,
        WORD wStreamNum,
        WINBOOL fReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *GetReceiveStreamSamples)(
        IWMReaderAdvanced6 *This,
        WORD wStreamNum,
        WINBOOL *pfReceiveStreamSamples);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForOutput)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForOutput)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *SetAllocateForStream)(
        IWMReaderAdvanced6 *This,
        WORD wStreamNum,
        WINBOOL fAllocate);

    HRESULT (STDMETHODCALLTYPE *GetAllocateForStream)(
        IWMReaderAdvanced6 *This,
        WORD dwStreamNum,
        WINBOOL *pfAllocate);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMReaderAdvanced6 *This,
        WM_READER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *SetClientInfo)(
        IWMReaderAdvanced6 *This,
        WM_READER_CLIENTINFO *pClientInfo);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMReaderAdvanced6 *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *NotifyLateDelivery)(
        IWMReaderAdvanced6 *This,
        QWORD cnsLateness);

    /*** IWMReaderAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayMode)(
        IWMReaderAdvanced6 *This,
        WMT_PLAY_MODE Mode);

    HRESULT (STDMETHODCALLTYPE *GetPlayMode)(
        IWMReaderAdvanced6 *This,
        WMT_PLAY_MODE *pMode);

    HRESULT (STDMETHODCALLTYPE *GetBufferProgress)(
        IWMReaderAdvanced6 *This,
        DWORD *pdwPercent,
        QWORD *pcnsBuffering);

    HRESULT (STDMETHODCALLTYPE *GetDownloadProgress)(
        IWMReaderAdvanced6 *This,
        DWORD *pdwPercent,
        QWORD *pqwBytesDownloaded,
        QWORD *pcnsDownload);

    HRESULT (STDMETHODCALLTYPE *GetSaveAsProgress)(
        IWMReaderAdvanced6 *This,
        DWORD *pdwPercent);

    HRESULT (STDMETHODCALLTYPE *SaveFileAs)(
        IWMReaderAdvanced6 *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetProtocolName)(
        IWMReaderAdvanced6 *This,
        WCHAR *pwszProtocol,
        DWORD *pcchProtocol);

    HRESULT (STDMETHODCALLTYPE *StartAtMarker)(
        IWMReaderAdvanced6 *This,
        WORD wMarkerIndex,
        QWORD cnsDuration,
        float fRate,
        void *pvContext);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    HRESULT (STDMETHODCALLTYPE *Preroll)(
        IWMReaderAdvanced6 *This,
        QWORD cnsStart,
        QWORD cnsDuration,
        float fRate);

    HRESULT (STDMETHODCALLTYPE *SetLogClientID)(
        IWMReaderAdvanced6 *This,
        WINBOOL fLogClientID);

    HRESULT (STDMETHODCALLTYPE *GetLogClientID)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfLogClientID);

    HRESULT (STDMETHODCALLTYPE *StopBuffering)(
        IWMReaderAdvanced6 *This);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMReaderAdvanced6 *This,
        IStream *pStream,
        IWMReaderCallback *pCallback,
        void *pvContext);

    /*** IWMReaderAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *StopNetStreaming)(
        IWMReaderAdvanced6 *This);

    HRESULT (STDMETHODCALLTYPE *StartAtPosition)(
        IWMReaderAdvanced6 *This,
        WORD wStreamNum,
        void *pvOffsetStart,
        void *pvDuration,
        WMT_OFFSET_FORMAT dwOffsetFormat,
        float fRate,
        void *pvContext);

    /*** IWMReaderAdvanced4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        WORD *pwLanguageCount);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        WORD wLanguage,
        WCHAR *pwszLanguageString,
        WORD *pcchLanguageStringLength);

    HRESULT (STDMETHODCALLTYPE *GetMaxSpeedFactor)(
        IWMReaderAdvanced6 *This,
        double *pdblFactor);

    HRESULT (STDMETHODCALLTYPE *IsUsingFastCache)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfUsingFastCache);

    HRESULT (STDMETHODCALLTYPE *AddLogParam)(
        IWMReaderAdvanced6 *This,
        LPCWSTR wszNameSpace,
        LPCWSTR wszName,
        LPCWSTR wszValue);

    HRESULT (STDMETHODCALLTYPE *SendLogParams)(
        IWMReaderAdvanced6 *This);

    HRESULT (STDMETHODCALLTYPE *CanSaveFileAs)(
        IWMReaderAdvanced6 *This,
        WINBOOL *pfCanSave);

    HRESULT (STDMETHODCALLTYPE *CancelSaveFileAs)(
        IWMReaderAdvanced6 *This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IWMReaderAdvanced6 *This,
        WCHAR *pwszURL,
        DWORD *pcchURL);

    /*** IWMReaderAdvanced5 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPlayerHook)(
        IWMReaderAdvanced6 *This,
        DWORD dwOutputNum,
        IWMPlayerHook *pHook);

    /*** IWMReaderAdvanced6 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProtectStreamSamples)(
        IWMReaderAdvanced6 *This,
        BYTE *pbCertificate,
        DWORD cbCertificate,
        DWORD dwCertificateType,
        DWORD dwFlags,
        BYTE *pbInitializationVector,
        DWORD *pcbInitializationVector);

    END_INTERFACE
} IWMReaderAdvanced6Vtbl;

interface IWMReaderAdvanced6 {
    CONST_VTBL IWMReaderAdvanced6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAdvanced6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAdvanced6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAdvanced6_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAdvanced methods ***/
#define IWMReaderAdvanced6_SetUserProvidedClock(This,fUserClock) (This)->lpVtbl->SetUserProvidedClock(This,fUserClock)
#define IWMReaderAdvanced6_GetUserProvidedClock(This,pfUserClock) (This)->lpVtbl->GetUserProvidedClock(This,pfUserClock)
#define IWMReaderAdvanced6_DeliverTime(This,cnsTime) (This)->lpVtbl->DeliverTime(This,cnsTime)
#define IWMReaderAdvanced6_SetManualStreamSelection(This,fSelection) (This)->lpVtbl->SetManualStreamSelection(This,fSelection)
#define IWMReaderAdvanced6_GetManualStreamSelection(This,pfSelection) (This)->lpVtbl->GetManualStreamSelection(This,pfSelection)
#define IWMReaderAdvanced6_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMReaderAdvanced6_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMReaderAdvanced6_SetReceiveSelectionCallbacks(This,fGetCallbacks) (This)->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks)
#define IWMReaderAdvanced6_GetReceiveSelectionCallbacks(This,pfGetCallbacks) (This)->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks)
#define IWMReaderAdvanced6_SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples) (This)->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples)
#define IWMReaderAdvanced6_GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples) (This)->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples)
#define IWMReaderAdvanced6_SetAllocateForOutput(This,dwOutputNum,fAllocate) (This)->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate)
#define IWMReaderAdvanced6_GetAllocateForOutput(This,dwOutputNum,pfAllocate) (This)->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate)
#define IWMReaderAdvanced6_SetAllocateForStream(This,wStreamNum,fAllocate) (This)->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate)
#define IWMReaderAdvanced6_GetAllocateForStream(This,dwStreamNum,pfAllocate) (This)->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate)
#define IWMReaderAdvanced6_GetStatistics(This,pStatistics) (This)->lpVtbl->GetStatistics(This,pStatistics)
#define IWMReaderAdvanced6_SetClientInfo(This,pClientInfo) (This)->lpVtbl->SetClientInfo(This,pClientInfo)
#define IWMReaderAdvanced6_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMReaderAdvanced6_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMReaderAdvanced6_NotifyLateDelivery(This,cnsLateness) (This)->lpVtbl->NotifyLateDelivery(This,cnsLateness)
/*** IWMReaderAdvanced2 methods ***/
#define IWMReaderAdvanced6_SetPlayMode(This,Mode) (This)->lpVtbl->SetPlayMode(This,Mode)
#define IWMReaderAdvanced6_GetPlayMode(This,pMode) (This)->lpVtbl->GetPlayMode(This,pMode)
#define IWMReaderAdvanced6_GetBufferProgress(This,pdwPercent,pcnsBuffering) (This)->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering)
#define IWMReaderAdvanced6_GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload) (This)->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload)
#define IWMReaderAdvanced6_GetSaveAsProgress(This,pdwPercent) (This)->lpVtbl->GetSaveAsProgress(This,pdwPercent)
#define IWMReaderAdvanced6_SaveFileAs(This,pwszFilename) (This)->lpVtbl->SaveFileAs(This,pwszFilename)
#define IWMReaderAdvanced6_GetProtocolName(This,pwszProtocol,pcchProtocol) (This)->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol)
#define IWMReaderAdvanced6_StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext) (This)->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext)
#define IWMReaderAdvanced6_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMReaderAdvanced6_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMReaderAdvanced6_Preroll(This,cnsStart,cnsDuration,fRate) (This)->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate)
#define IWMReaderAdvanced6_SetLogClientID(This,fLogClientID) (This)->lpVtbl->SetLogClientID(This,fLogClientID)
#define IWMReaderAdvanced6_GetLogClientID(This,pfLogClientID) (This)->lpVtbl->GetLogClientID(This,pfLogClientID)
#define IWMReaderAdvanced6_StopBuffering(This) (This)->lpVtbl->StopBuffering(This)
#define IWMReaderAdvanced6_OpenStream(This,pStream,pCallback,pvContext) (This)->lpVtbl->OpenStream(This,pStream,pCallback,pvContext)
/*** IWMReaderAdvanced3 methods ***/
#define IWMReaderAdvanced6_StopNetStreaming(This) (This)->lpVtbl->StopNetStreaming(This)
#define IWMReaderAdvanced6_StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext) (This)->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext)
/*** IWMReaderAdvanced4 methods ***/
#define IWMReaderAdvanced6_GetLanguageCount(This,dwOutputNum,pwLanguageCount) (This)->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount)
#define IWMReaderAdvanced6_GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength) (This)->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength)
#define IWMReaderAdvanced6_GetMaxSpeedFactor(This,pdblFactor) (This)->lpVtbl->GetMaxSpeedFactor(This,pdblFactor)
#define IWMReaderAdvanced6_IsUsingFastCache(This,pfUsingFastCache) (This)->lpVtbl->IsUsingFastCache(This,pfUsingFastCache)
#define IWMReaderAdvanced6_AddLogParam(This,wszNameSpace,wszName,wszValue) (This)->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue)
#define IWMReaderAdvanced6_SendLogParams(This) (This)->lpVtbl->SendLogParams(This)
#define IWMReaderAdvanced6_CanSaveFileAs(This,pfCanSave) (This)->lpVtbl->CanSaveFileAs(This,pfCanSave)
#define IWMReaderAdvanced6_CancelSaveFileAs(This) (This)->lpVtbl->CancelSaveFileAs(This)
#define IWMReaderAdvanced6_GetURL(This,pwszURL,pcchURL) (This)->lpVtbl->GetURL(This,pwszURL,pcchURL)
/*** IWMReaderAdvanced5 methods ***/
#define IWMReaderAdvanced6_SetPlayerHook(This,dwOutputNum,pHook) (This)->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook)
/*** IWMReaderAdvanced6 methods ***/
#define IWMReaderAdvanced6_SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector) (This)->lpVtbl->SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_QueryInterface(IWMReaderAdvanced6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAdvanced6_AddRef(IWMReaderAdvanced6* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAdvanced6_Release(IWMReaderAdvanced6* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAdvanced methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetUserProvidedClock(IWMReaderAdvanced6* This,WINBOOL fUserClock) {
    return This->lpVtbl->SetUserProvidedClock(This,fUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetUserProvidedClock(IWMReaderAdvanced6* This,WINBOOL *pfUserClock) {
    return This->lpVtbl->GetUserProvidedClock(This,pfUserClock);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_DeliverTime(IWMReaderAdvanced6* This,QWORD cnsTime) {
    return This->lpVtbl->DeliverTime(This,cnsTime);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetManualStreamSelection(IWMReaderAdvanced6* This,WINBOOL fSelection) {
    return This->lpVtbl->SetManualStreamSelection(This,fSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetManualStreamSelection(IWMReaderAdvanced6* This,WINBOOL *pfSelection) {
    return This->lpVtbl->GetManualStreamSelection(This,pfSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetStreamsSelected(IWMReaderAdvanced6* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetStreamSelected(IWMReaderAdvanced6* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetReceiveSelectionCallbacks(IWMReaderAdvanced6* This,WINBOOL fGetCallbacks) {
    return This->lpVtbl->SetReceiveSelectionCallbacks(This,fGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetReceiveSelectionCallbacks(IWMReaderAdvanced6* This,WINBOOL *pfGetCallbacks) {
    return This->lpVtbl->GetReceiveSelectionCallbacks(This,pfGetCallbacks);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetReceiveStreamSamples(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL fReceiveStreamSamples) {
    return This->lpVtbl->SetReceiveStreamSamples(This,wStreamNum,fReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetReceiveStreamSamples(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL *pfReceiveStreamSamples) {
    return This->lpVtbl->GetReceiveStreamSamples(This,wStreamNum,pfReceiveStreamSamples);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetAllocateForOutput(IWMReaderAdvanced6* This,DWORD dwOutputNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForOutput(This,dwOutputNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetAllocateForOutput(IWMReaderAdvanced6* This,DWORD dwOutputNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForOutput(This,dwOutputNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetAllocateForStream(IWMReaderAdvanced6* This,WORD wStreamNum,WINBOOL fAllocate) {
    return This->lpVtbl->SetAllocateForStream(This,wStreamNum,fAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetAllocateForStream(IWMReaderAdvanced6* This,WORD dwStreamNum,WINBOOL *pfAllocate) {
    return This->lpVtbl->GetAllocateForStream(This,dwStreamNum,pfAllocate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetStatistics(IWMReaderAdvanced6* This,WM_READER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetStatistics(This,pStatistics);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetClientInfo(IWMReaderAdvanced6* This,WM_READER_CLIENTINFO *pClientInfo) {
    return This->lpVtbl->SetClientInfo(This,pClientInfo);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxOutputSampleSize(IWMReaderAdvanced6* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxStreamSampleSize(IWMReaderAdvanced6* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_NotifyLateDelivery(IWMReaderAdvanced6* This,QWORD cnsLateness) {
    return This->lpVtbl->NotifyLateDelivery(This,cnsLateness);
}
/*** IWMReaderAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetPlayMode(IWMReaderAdvanced6* This,WMT_PLAY_MODE Mode) {
    return This->lpVtbl->SetPlayMode(This,Mode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetPlayMode(IWMReaderAdvanced6* This,WMT_PLAY_MODE *pMode) {
    return This->lpVtbl->GetPlayMode(This,pMode);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetBufferProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent,QWORD *pcnsBuffering) {
    return This->lpVtbl->GetBufferProgress(This,pdwPercent,pcnsBuffering);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetDownloadProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent,QWORD *pqwBytesDownloaded,QWORD *pcnsDownload) {
    return This->lpVtbl->GetDownloadProgress(This,pdwPercent,pqwBytesDownloaded,pcnsDownload);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetSaveAsProgress(IWMReaderAdvanced6* This,DWORD *pdwPercent) {
    return This->lpVtbl->GetSaveAsProgress(This,pdwPercent);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SaveFileAs(IWMReaderAdvanced6* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SaveFileAs(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetProtocolName(IWMReaderAdvanced6* This,WCHAR *pwszProtocol,DWORD *pcchProtocol) {
    return This->lpVtbl->GetProtocolName(This,pwszProtocol,pcchProtocol);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StartAtMarker(IWMReaderAdvanced6* This,WORD wMarkerIndex,QWORD cnsDuration,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtMarker(This,wMarkerIndex,cnsDuration,fRate,pvContext);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetOutputSetting(IWMReaderAdvanced6* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetOutputSetting(IWMReaderAdvanced6* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_Preroll(IWMReaderAdvanced6* This,QWORD cnsStart,QWORD cnsDuration,float fRate) {
    return This->lpVtbl->Preroll(This,cnsStart,cnsDuration,fRate);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetLogClientID(IWMReaderAdvanced6* This,WINBOOL fLogClientID) {
    return This->lpVtbl->SetLogClientID(This,fLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLogClientID(IWMReaderAdvanced6* This,WINBOOL *pfLogClientID) {
    return This->lpVtbl->GetLogClientID(This,pfLogClientID);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StopBuffering(IWMReaderAdvanced6* This) {
    return This->lpVtbl->StopBuffering(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_OpenStream(IWMReaderAdvanced6* This,IStream *pStream,IWMReaderCallback *pCallback,void *pvContext) {
    return This->lpVtbl->OpenStream(This,pStream,pCallback,pvContext);
}
/*** IWMReaderAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_StopNetStreaming(IWMReaderAdvanced6* This) {
    return This->lpVtbl->StopNetStreaming(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_StartAtPosition(IWMReaderAdvanced6* This,WORD wStreamNum,void *pvOffsetStart,void *pvDuration,WMT_OFFSET_FORMAT dwOffsetFormat,float fRate,void *pvContext) {
    return This->lpVtbl->StartAtPosition(This,wStreamNum,pvOffsetStart,pvDuration,dwOffsetFormat,fRate,pvContext);
}
/*** IWMReaderAdvanced4 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLanguageCount(IWMReaderAdvanced6* This,DWORD dwOutputNum,WORD *pwLanguageCount) {
    return This->lpVtbl->GetLanguageCount(This,dwOutputNum,pwLanguageCount);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetLanguage(IWMReaderAdvanced6* This,DWORD dwOutputNum,WORD wLanguage,WCHAR *pwszLanguageString,WORD *pcchLanguageStringLength) {
    return This->lpVtbl->GetLanguage(This,dwOutputNum,wLanguage,pwszLanguageString,pcchLanguageStringLength);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetMaxSpeedFactor(IWMReaderAdvanced6* This,double *pdblFactor) {
    return This->lpVtbl->GetMaxSpeedFactor(This,pdblFactor);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_IsUsingFastCache(IWMReaderAdvanced6* This,WINBOOL *pfUsingFastCache) {
    return This->lpVtbl->IsUsingFastCache(This,pfUsingFastCache);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_AddLogParam(IWMReaderAdvanced6* This,LPCWSTR wszNameSpace,LPCWSTR wszName,LPCWSTR wszValue) {
    return This->lpVtbl->AddLogParam(This,wszNameSpace,wszName,wszValue);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_SendLogParams(IWMReaderAdvanced6* This) {
    return This->lpVtbl->SendLogParams(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_CanSaveFileAs(IWMReaderAdvanced6* This,WINBOOL *pfCanSave) {
    return This->lpVtbl->CanSaveFileAs(This,pfCanSave);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_CancelSaveFileAs(IWMReaderAdvanced6* This) {
    return This->lpVtbl->CancelSaveFileAs(This);
}
static FORCEINLINE HRESULT IWMReaderAdvanced6_GetURL(IWMReaderAdvanced6* This,WCHAR *pwszURL,DWORD *pcchURL) {
    return This->lpVtbl->GetURL(This,pwszURL,pcchURL);
}
/*** IWMReaderAdvanced5 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetPlayerHook(IWMReaderAdvanced6* This,DWORD dwOutputNum,IWMPlayerHook *pHook) {
    return This->lpVtbl->SetPlayerHook(This,dwOutputNum,pHook);
}
/*** IWMReaderAdvanced6 methods ***/
static FORCEINLINE HRESULT IWMReaderAdvanced6_SetProtectStreamSamples(IWMReaderAdvanced6* This,BYTE *pbCertificate,DWORD cbCertificate,DWORD dwCertificateType,DWORD dwFlags,BYTE *pbInitializationVector,DWORD *pcbInitializationVector) {
    return This->lpVtbl->SetProtectStreamSamples(This,pbCertificate,cbCertificate,dwCertificateType,dwFlags,pbInitializationVector,pcbInitializationVector);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAdvanced6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMSyncReader interface
 */
#ifndef __IWMSyncReader_INTERFACE_DEFINED__
#define __IWMSyncReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMSyncReader, 0x9397f121, 0x7705, 0x4dc9, 0xb0,0x49, 0x98,0xb6,0x98,0x18,0x84,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9397f121-7705-4dc9-b049-98b698188414")
IWMSyncReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRange(
        QWORD cnsStartTime,
        LONGLONG cnsDuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRangeByFrame(
        WORD wStreamNum,
        QWORD qwFrameNumber,
        LONGLONG cFramesToRead) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextSample(
        WORD wStreamNum,
        INSSBuffer **ppSample,
        QWORD *pcnsSampleTime,
        QWORD *pcnsDuration,
        DWORD *pdwFlags,
        DWORD *pdwOutputNum,
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamsSelected(
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamSelected(
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetReadStreamSamples(
        WORD wStreamNum,
        WINBOOL fCompressed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReadStreamSamples(
        WORD wStreamNum,
        WINBOOL *pfCompressed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputSetting(
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputProps(
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormatCount(
        DWORD dwOutputNum,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFormat(
        DWORD dwOutputNum,
        DWORD dwFormatNum,
        IWMOutputMediaProps **ppProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputNumberForStream(
        WORD wStreamNum,
        DWORD *pdwOutputNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamNumberForOutput(
        DWORD dwOutputNum,
        WORD *pwStreamNum) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxOutputSampleSize(
        DWORD dwOutput,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxStreamSampleSize(
        WORD wStream,
        DWORD *pcbMax) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenStream(
        IStream *pStream) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMSyncReader, 0x9397f121, 0x7705, 0x4dc9, 0xb0,0x49, 0x98,0xb6,0x98,0x18,0x84,0x14)
#endif
#else
typedef struct IWMSyncReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMSyncReader methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IWMSyncReader *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWMSyncReader *This);

    HRESULT (STDMETHODCALLTYPE *SetRange)(
        IWMSyncReader *This,
        QWORD cnsStartTime,
        LONGLONG cnsDuration);

    HRESULT (STDMETHODCALLTYPE *SetRangeByFrame)(
        IWMSyncReader *This,
        WORD wStreamNum,
        QWORD qwFrameNumber,
        LONGLONG cFramesToRead);

    HRESULT (STDMETHODCALLTYPE *GetNextSample)(
        IWMSyncReader *This,
        WORD wStreamNum,
        INSSBuffer **ppSample,
        QWORD *pcnsSampleTime,
        QWORD *pcnsDuration,
        DWORD *pdwFlags,
        DWORD *pdwOutputNum,
        WORD *pwStreamNum);

    HRESULT (STDMETHODCALLTYPE *SetStreamsSelected)(
        IWMSyncReader *This,
        WORD cStreamCount,
        WORD *pwStreamNumbers,
        WMT_STREAM_SELECTION *pSelections);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelected)(
        IWMSyncReader *This,
        WORD wStreamNum,
        WMT_STREAM_SELECTION *pSelection);

    HRESULT (STDMETHODCALLTYPE *SetReadStreamSamples)(
        IWMSyncReader *This,
        WORD wStreamNum,
        WINBOOL fCompressed);

    HRESULT (STDMETHODCALLTYPE *GetReadStreamSamples)(
        IWMSyncReader *This,
        WORD wStreamNum,
        WINBOOL *pfCompressed);

    HRESULT (STDMETHODCALLTYPE *GetOutputSetting)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetOutputSetting)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

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

    HRESULT (STDMETHODCALLTYPE *GetOutputProps)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        IWMOutputMediaProps **ppOutput);

    HRESULT (STDMETHODCALLTYPE *SetOutputProps)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        IWMOutputMediaProps *pOutput);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormatCount)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetOutputFormat)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        DWORD dwFormatNum,
        IWMOutputMediaProps **ppProps);

    HRESULT (STDMETHODCALLTYPE *GetOutputNumberForStream)(
        IWMSyncReader *This,
        WORD wStreamNum,
        DWORD *pdwOutputNum);

    HRESULT (STDMETHODCALLTYPE *GetStreamNumberForOutput)(
        IWMSyncReader *This,
        DWORD dwOutputNum,
        WORD *pwStreamNum);

    HRESULT (STDMETHODCALLTYPE *GetMaxOutputSampleSize)(
        IWMSyncReader *This,
        DWORD dwOutput,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *GetMaxStreamSampleSize)(
        IWMSyncReader *This,
        WORD wStream,
        DWORD *pcbMax);

    HRESULT (STDMETHODCALLTYPE *OpenStream)(
        IWMSyncReader *This,
        IStream *pStream);

    END_INTERFACE
} IWMSyncReaderVtbl;

interface IWMSyncReader {
    CONST_VTBL IWMSyncReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMSyncReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMSyncReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMSyncReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWMSyncReader methods ***/
#define IWMSyncReader_Open(This,pwszFilename) (This)->lpVtbl->Open(This,pwszFilename)
#define IWMSyncReader_Close(This) (This)->lpVtbl->Close(This)
#define IWMSyncReader_SetRange(This,cnsStartTime,cnsDuration) (This)->lpVtbl->SetRange(This,cnsStartTime,cnsDuration)
#define IWMSyncReader_SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead) (This)->lpVtbl->SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead)
#define IWMSyncReader_GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum) (This)->lpVtbl->GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum)
#define IWMSyncReader_SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections) (This)->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections)
#define IWMSyncReader_GetStreamSelected(This,wStreamNum,pSelection) (This)->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection)
#define IWMSyncReader_SetReadStreamSamples(This,wStreamNum,fCompressed) (This)->lpVtbl->SetReadStreamSamples(This,wStreamNum,fCompressed)
#define IWMSyncReader_GetReadStreamSamples(This,wStreamNum,pfCompressed) (This)->lpVtbl->GetReadStreamSamples(This,wStreamNum,pfCompressed)
#define IWMSyncReader_GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength)
#define IWMSyncReader_SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength)
#define IWMSyncReader_GetOutputCount(This,pcOutputs) (This)->lpVtbl->GetOutputCount(This,pcOutputs)
#define IWMSyncReader_GetOutputProps(This,dwOutputNum,ppOutput) (This)->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput)
#define IWMSyncReader_SetOutputProps(This,dwOutputNum,pOutput) (This)->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput)
#define IWMSyncReader_GetOutputFormatCount(This,dwOutputNum,pcFormats) (This)->lpVtbl->GetOutputFormatCount(This,dwOutputNum,pcFormats)
#define IWMSyncReader_GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps) (This)->lpVtbl->GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps)
#define IWMSyncReader_GetOutputNumberForStream(This,wStreamNum,pdwOutputNum) (This)->lpVtbl->GetOutputNumberForStream(This,wStreamNum,pdwOutputNum)
#define IWMSyncReader_GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum) (This)->lpVtbl->GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum)
#define IWMSyncReader_GetMaxOutputSampleSize(This,dwOutput,pcbMax) (This)->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax)
#define IWMSyncReader_GetMaxStreamSampleSize(This,wStream,pcbMax) (This)->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax)
#define IWMSyncReader_OpenStream(This,pStream) (This)->lpVtbl->OpenStream(This,pStream)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMSyncReader_QueryInterface(IWMSyncReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMSyncReader_AddRef(IWMSyncReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMSyncReader_Release(IWMSyncReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMSyncReader methods ***/
static FORCEINLINE HRESULT IWMSyncReader_Open(IWMSyncReader* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->Open(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMSyncReader_Close(IWMSyncReader* This) {
    return This->lpVtbl->Close(This);
}
static FORCEINLINE HRESULT IWMSyncReader_SetRange(IWMSyncReader* This,QWORD cnsStartTime,LONGLONG cnsDuration) {
    return This->lpVtbl->SetRange(This,cnsStartTime,cnsDuration);
}
static FORCEINLINE HRESULT IWMSyncReader_SetRangeByFrame(IWMSyncReader* This,WORD wStreamNum,QWORD qwFrameNumber,LONGLONG cFramesToRead) {
    return This->lpVtbl->SetRangeByFrame(This,wStreamNum,qwFrameNumber,cFramesToRead);
}
static FORCEINLINE HRESULT IWMSyncReader_GetNextSample(IWMSyncReader* This,WORD wStreamNum,INSSBuffer **ppSample,QWORD *pcnsSampleTime,QWORD *pcnsDuration,DWORD *pdwFlags,DWORD *pdwOutputNum,WORD *pwStreamNum) {
    return This->lpVtbl->GetNextSample(This,wStreamNum,ppSample,pcnsSampleTime,pcnsDuration,pdwFlags,pdwOutputNum,pwStreamNum);
}
static FORCEINLINE HRESULT IWMSyncReader_SetStreamsSelected(IWMSyncReader* This,WORD cStreamCount,WORD *pwStreamNumbers,WMT_STREAM_SELECTION *pSelections) {
    return This->lpVtbl->SetStreamsSelected(This,cStreamCount,pwStreamNumbers,pSelections);
}
static FORCEINLINE HRESULT IWMSyncReader_GetStreamSelected(IWMSyncReader* This,WORD wStreamNum,WMT_STREAM_SELECTION *pSelection) {
    return This->lpVtbl->GetStreamSelected(This,wStreamNum,pSelection);
}
static FORCEINLINE HRESULT IWMSyncReader_SetReadStreamSamples(IWMSyncReader* This,WORD wStreamNum,WINBOOL fCompressed) {
    return This->lpVtbl->SetReadStreamSamples(This,wStreamNum,fCompressed);
}
static FORCEINLINE HRESULT IWMSyncReader_GetReadStreamSamples(IWMSyncReader* This,WORD wStreamNum,WINBOOL *pfCompressed) {
    return This->lpVtbl->GetReadStreamSamples(This,wStreamNum,pfCompressed);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputSetting(IWMSyncReader* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetOutputSetting(This,dwOutputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMSyncReader_SetOutputSetting(IWMSyncReader* This,DWORD dwOutputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetOutputSetting(This,dwOutputNum,pszName,Type,pValue,cbLength);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputCount(IWMSyncReader* This,DWORD *pcOutputs) {
    return This->lpVtbl->GetOutputCount(This,pcOutputs);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputProps(IWMSyncReader* This,DWORD dwOutputNum,IWMOutputMediaProps **ppOutput) {
    return This->lpVtbl->GetOutputProps(This,dwOutputNum,ppOutput);
}
static FORCEINLINE HRESULT IWMSyncReader_SetOutputProps(IWMSyncReader* This,DWORD dwOutputNum,IWMOutputMediaProps *pOutput) {
    return This->lpVtbl->SetOutputProps(This,dwOutputNum,pOutput);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputFormatCount(IWMSyncReader* This,DWORD dwOutputNum,DWORD *pcFormats) {
    return This->lpVtbl->GetOutputFormatCount(This,dwOutputNum,pcFormats);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputFormat(IWMSyncReader* This,DWORD dwOutputNum,DWORD dwFormatNum,IWMOutputMediaProps **ppProps) {
    return This->lpVtbl->GetOutputFormat(This,dwOutputNum,dwFormatNum,ppProps);
}
static FORCEINLINE HRESULT IWMSyncReader_GetOutputNumberForStream(IWMSyncReader* This,WORD wStreamNum,DWORD *pdwOutputNum) {
    return This->lpVtbl->GetOutputNumberForStream(This,wStreamNum,pdwOutputNum);
}
static FORCEINLINE HRESULT IWMSyncReader_GetStreamNumberForOutput(IWMSyncReader* This,DWORD dwOutputNum,WORD *pwStreamNum) {
    return This->lpVtbl->GetStreamNumberForOutput(This,dwOutputNum,pwStreamNum);
}
static FORCEINLINE HRESULT IWMSyncReader_GetMaxOutputSampleSize(IWMSyncReader* This,DWORD dwOutput,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxOutputSampleSize(This,dwOutput,pcbMax);
}
static FORCEINLINE HRESULT IWMSyncReader_GetMaxStreamSampleSize(IWMSyncReader* This,WORD wStream,DWORD *pcbMax) {
    return This->lpVtbl->GetMaxStreamSampleSize(This,wStream,pcbMax);
}
static FORCEINLINE HRESULT IWMSyncReader_OpenStream(IWMSyncReader* This,IStream *pStream) {
    return This->lpVtbl->OpenStream(This,pStream);
}
#endif
#endif

#endif


#endif  /* __IWMSyncReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMInputMediaProps interface
 */
#ifndef __IWMInputMediaProps_INTERFACE_DEFINED__
#define __IWMInputMediaProps_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd5-2b2b-11d3-b36b-00c04f6108ff")
IWMInputMediaProps : public IWMMediaProps
{
    virtual HRESULT STDMETHODCALLTYPE GetConnectionName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupName(
        WCHAR *pwszName,
        WORD *pcchName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMInputMediaProps, 0x96406bd5, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMInputMediaPropsVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IWMInputMediaProps *This,
        WM_MEDIA_TYPE *pType,
        DWORD *pcbType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IWMInputMediaProps *This,
        WM_MEDIA_TYPE *pType);

    /*** IWMInputMediaProps methods ***/
    HRESULT (STDMETHODCALLTYPE *GetConnectionName)(
        IWMInputMediaProps *This,
        WCHAR *pwszName,
        WORD *pcchName);

    HRESULT (STDMETHODCALLTYPE *GetGroupName)(
        IWMInputMediaProps *This,
        WCHAR *pwszName,
        WORD *pcchName);

    END_INTERFACE
} IWMInputMediaPropsVtbl;

interface IWMInputMediaProps {
    CONST_VTBL IWMInputMediaPropsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMInputMediaProps_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMInputMediaProps_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMInputMediaProps_Release(This) (This)->lpVtbl->Release(This)
/*** IWMMediaProps methods ***/
#define IWMInputMediaProps_GetType(This,pguidType) (This)->lpVtbl->GetType(This,pguidType)
#define IWMInputMediaProps_GetMediaType(This,pType,pcbType) (This)->lpVtbl->GetMediaType(This,pType,pcbType)
#define IWMInputMediaProps_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
/*** IWMInputMediaProps methods ***/
#define IWMInputMediaProps_GetConnectionName(This,pwszName,pcchName) (This)->lpVtbl->GetConnectionName(This,pwszName,pcchName)
#define IWMInputMediaProps_GetGroupName(This,pwszName,pcchName) (This)->lpVtbl->GetGroupName(This,pwszName,pcchName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_QueryInterface(IWMInputMediaProps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMInputMediaProps_AddRef(IWMInputMediaProps* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMInputMediaProps_Release(IWMInputMediaProps* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMMediaProps methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_GetType(IWMInputMediaProps* This,GUID *pguidType) {
    return This->lpVtbl->GetType(This,pguidType);
}
static FORCEINLINE HRESULT IWMInputMediaProps_GetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType,DWORD *pcbType) {
    return This->lpVtbl->GetMediaType(This,pType,pcbType);
}
static FORCEINLINE HRESULT IWMInputMediaProps_SetMediaType(IWMInputMediaProps* This,WM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
/*** IWMInputMediaProps methods ***/
static FORCEINLINE HRESULT IWMInputMediaProps_GetConnectionName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetConnectionName(This,pwszName,pcchName);
}
static FORCEINLINE HRESULT IWMInputMediaProps_GetGroupName(IWMInputMediaProps* This,WCHAR *pwszName,WORD *pcchName) {
    return This->lpVtbl->GetGroupName(This,pwszName,pcchName);
}
#endif
#endif

#endif


#endif  /* __IWMInputMediaProps_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterSink interface
 */
#ifndef __IWMWriterSink_INTERFACE_DEFINED__
#define __IWMWriterSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406be4-2b2b-11d3-b36b-00c04f6108ff")
IWMWriterSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnHeader(
        INSSBuffer *pHeader) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
        WINBOOL *pfRealTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE AllocateDataUnit(
        DWORD cbDataUnit,
        INSSBuffer **ppDataUnit) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDataUnit(
        INSSBuffer *pDataUnit) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnEndWriting(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterSink, 0x96406be4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterSink methods ***/
    HRESULT (STDMETHODCALLTYPE *OnHeader)(
        IWMWriterSink *This,
        INSSBuffer *pHeader);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterSink *This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *AllocateDataUnit)(
        IWMWriterSink *This,
        DWORD cbDataUnit,
        INSSBuffer **ppDataUnit);

    HRESULT (STDMETHODCALLTYPE *OnDataUnit)(
        IWMWriterSink *This,
        INSSBuffer *pDataUnit);

    HRESULT (STDMETHODCALLTYPE *OnEndWriting)(
        IWMWriterSink *This);

    END_INTERFACE
} IWMWriterSinkVtbl;

interface IWMWriterSink {
    CONST_VTBL IWMWriterSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterSink methods ***/
#define IWMWriterSink_OnHeader(This,pHeader) (This)->lpVtbl->OnHeader(This,pHeader)
#define IWMWriterSink_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterSink_AllocateDataUnit(This,cbDataUnit,ppDataUnit) (This)->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit)
#define IWMWriterSink_OnDataUnit(This,pDataUnit) (This)->lpVtbl->OnDataUnit(This,pDataUnit)
#define IWMWriterSink_OnEndWriting(This) (This)->lpVtbl->OnEndWriting(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterSink_QueryInterface(IWMWriterSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterSink_AddRef(IWMWriterSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterSink_Release(IWMWriterSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterSink methods ***/
static FORCEINLINE HRESULT IWMWriterSink_OnHeader(IWMWriterSink* This,INSSBuffer *pHeader) {
    return This->lpVtbl->OnHeader(This,pHeader);
}
static FORCEINLINE HRESULT IWMWriterSink_IsRealTime(IWMWriterSink* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterSink_AllocateDataUnit(IWMWriterSink* This,DWORD cbDataUnit,INSSBuffer **ppDataUnit) {
    return This->lpVtbl->AllocateDataUnit(This,cbDataUnit,ppDataUnit);
}
static FORCEINLINE HRESULT IWMWriterSink_OnDataUnit(IWMWriterSink* This,INSSBuffer *pDataUnit) {
    return This->lpVtbl->OnDataUnit(This,pDataUnit);
}
static FORCEINLINE HRESULT IWMWriterSink_OnEndWriting(IWMWriterSink* This) {
    return This->lpVtbl->OnEndWriting(This);
}
#endif
#endif

#endif


#endif  /* __IWMWriterSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriter interface
 */
#ifndef __IWMWriter_INTERFACE_DEFINED__
#define __IWMWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bd4-2b2b-11d3-b36b-00c04f6108ff")
IWMWriter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetProfileByID(
        REFGUID guidProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProfile(
        IWMProfile *pProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFilename(
        const WCHAR *pwszFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputCount(
        DWORD *pcInputs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputProps(
        DWORD dwInputNum,
        IWMInputMediaProps **ppInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputProps(
        DWORD dwInputNum,
        IWMInputMediaProps *pInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputFormatCount(
        DWORD dwInputNumber,
        DWORD *pcFormats) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputFormat(
        DWORD dwInputNumber,
        DWORD dwFormatNumber,
        IWMInputMediaProps **pProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginWriting(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndWriting(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AllocateSample(
        DWORD dwSampleSize,
        INSSBuffer **ppSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteSample(
        DWORD dwInputNum,
        QWORD cnsSampleTime,
        DWORD dwFlags,
        INSSBuffer *pSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriter, 0x96406bd4, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProfileByID)(
        IWMWriter *This,
        REFGUID guidProfile);

    HRESULT (STDMETHODCALLTYPE *SetProfile)(
        IWMWriter *This,
        IWMProfile *pProfile);

    HRESULT (STDMETHODCALLTYPE *SetOutputFilename)(
        IWMWriter *This,
        const WCHAR *pwszFilename);

    HRESULT (STDMETHODCALLTYPE *GetInputCount)(
        IWMWriter *This,
        DWORD *pcInputs);

    HRESULT (STDMETHODCALLTYPE *GetInputProps)(
        IWMWriter *This,
        DWORD dwInputNum,
        IWMInputMediaProps **ppInput);

    HRESULT (STDMETHODCALLTYPE *SetInputProps)(
        IWMWriter *This,
        DWORD dwInputNum,
        IWMInputMediaProps *pInput);

    HRESULT (STDMETHODCALLTYPE *GetInputFormatCount)(
        IWMWriter *This,
        DWORD dwInputNumber,
        DWORD *pcFormats);

    HRESULT (STDMETHODCALLTYPE *GetInputFormat)(
        IWMWriter *This,
        DWORD dwInputNumber,
        DWORD dwFormatNumber,
        IWMInputMediaProps **pProps);

    HRESULT (STDMETHODCALLTYPE *BeginWriting)(
        IWMWriter *This);

    HRESULT (STDMETHODCALLTYPE *EndWriting)(
        IWMWriter *This);

    HRESULT (STDMETHODCALLTYPE *AllocateSample)(
        IWMWriter *This,
        DWORD dwSampleSize,
        INSSBuffer **ppSample);

    HRESULT (STDMETHODCALLTYPE *WriteSample)(
        IWMWriter *This,
        DWORD dwInputNum,
        QWORD cnsSampleTime,
        DWORD dwFlags,
        INSSBuffer *pSample);

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

    END_INTERFACE
} IWMWriterVtbl;

interface IWMWriter {
    CONST_VTBL IWMWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriter methods ***/
#define IWMWriter_SetProfileByID(This,guidProfile) (This)->lpVtbl->SetProfileByID(This,guidProfile)
#define IWMWriter_SetProfile(This,pProfile) (This)->lpVtbl->SetProfile(This,pProfile)
#define IWMWriter_SetOutputFilename(This,pwszFilename) (This)->lpVtbl->SetOutputFilename(This,pwszFilename)
#define IWMWriter_GetInputCount(This,pcInputs) (This)->lpVtbl->GetInputCount(This,pcInputs)
#define IWMWriter_GetInputProps(This,dwInputNum,ppInput) (This)->lpVtbl->GetInputProps(This,dwInputNum,ppInput)
#define IWMWriter_SetInputProps(This,dwInputNum,pInput) (This)->lpVtbl->SetInputProps(This,dwInputNum,pInput)
#define IWMWriter_GetInputFormatCount(This,dwInputNumber,pcFormats) (This)->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats)
#define IWMWriter_GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps) (This)->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps)
#define IWMWriter_BeginWriting(This) (This)->lpVtbl->BeginWriting(This)
#define IWMWriter_EndWriting(This) (This)->lpVtbl->EndWriting(This)
#define IWMWriter_AllocateSample(This,dwSampleSize,ppSample) (This)->lpVtbl->AllocateSample(This,dwSampleSize,ppSample)
#define IWMWriter_WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample) (This)->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample)
#define IWMWriter_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriter_QueryInterface(IWMWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriter_AddRef(IWMWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriter_Release(IWMWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriter methods ***/
static FORCEINLINE HRESULT IWMWriter_SetProfileByID(IWMWriter* This,REFGUID guidProfile) {
    return This->lpVtbl->SetProfileByID(This,guidProfile);
}
static FORCEINLINE HRESULT IWMWriter_SetProfile(IWMWriter* This,IWMProfile *pProfile) {
    return This->lpVtbl->SetProfile(This,pProfile);
}
static FORCEINLINE HRESULT IWMWriter_SetOutputFilename(IWMWriter* This,const WCHAR *pwszFilename) {
    return This->lpVtbl->SetOutputFilename(This,pwszFilename);
}
static FORCEINLINE HRESULT IWMWriter_GetInputCount(IWMWriter* This,DWORD *pcInputs) {
    return This->lpVtbl->GetInputCount(This,pcInputs);
}
static FORCEINLINE HRESULT IWMWriter_GetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps **ppInput) {
    return This->lpVtbl->GetInputProps(This,dwInputNum,ppInput);
}
static FORCEINLINE HRESULT IWMWriter_SetInputProps(IWMWriter* This,DWORD dwInputNum,IWMInputMediaProps *pInput) {
    return This->lpVtbl->SetInputProps(This,dwInputNum,pInput);
}
static FORCEINLINE HRESULT IWMWriter_GetInputFormatCount(IWMWriter* This,DWORD dwInputNumber,DWORD *pcFormats) {
    return This->lpVtbl->GetInputFormatCount(This,dwInputNumber,pcFormats);
}
static FORCEINLINE HRESULT IWMWriter_GetInputFormat(IWMWriter* This,DWORD dwInputNumber,DWORD dwFormatNumber,IWMInputMediaProps **pProps) {
    return This->lpVtbl->GetInputFormat(This,dwInputNumber,dwFormatNumber,pProps);
}
static FORCEINLINE HRESULT IWMWriter_BeginWriting(IWMWriter* This) {
    return This->lpVtbl->BeginWriting(This);
}
static FORCEINLINE HRESULT IWMWriter_EndWriting(IWMWriter* This) {
    return This->lpVtbl->EndWriting(This);
}
static FORCEINLINE HRESULT IWMWriter_AllocateSample(IWMWriter* This,DWORD dwSampleSize,INSSBuffer **ppSample) {
    return This->lpVtbl->AllocateSample(This,dwSampleSize,ppSample);
}
static FORCEINLINE HRESULT IWMWriter_WriteSample(IWMWriter* This,DWORD dwInputNum,QWORD cnsSampleTime,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteSample(This,dwInputNum,cnsSampleTime,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriter_Flush(IWMWriter* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif


#endif  /* __IWMWriter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced interface
 */
#ifndef __IWMWriterAdvanced_INTERFACE_DEFINED__
#define __IWMWriterAdvanced_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406be3-2b2b-11d3-b36b-00c04f6108ff")
IWMWriterAdvanced : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSinkCount(
        DWORD *pcSinks) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSink(
        DWORD dwSinkNum,
        IWMWriterSink **ppSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSink(
        IWMWriterSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveSink(
        IWMWriterSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteStreamSample(
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLiveSource(
        WINBOOL fIsLiveSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRealTime(
        WINBOOL *pfRealTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWriterTime(
        QWORD *pCurrentTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSyncTolerance(
        DWORD msWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSyncTolerance(
        DWORD *pmsWindow) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced, 0x96406be3, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMWriterAdvancedVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced *This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced *This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced *This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced *This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced *This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced *This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced *This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced *This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced *This,
        DWORD *pmsWindow);

    END_INTERFACE
} IWMWriterAdvancedVtbl;

interface IWMWriterAdvanced {
    CONST_VTBL IWMWriterAdvancedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced_QueryInterface(IWMWriterAdvanced* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced_AddRef(IWMWriterAdvanced* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced_Release(IWMWriterAdvanced* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSinkCount(IWMWriterAdvanced* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSink(IWMWriterAdvanced* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_AddSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_RemoveSink(IWMWriterAdvanced* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_WriteStreamSample(IWMWriterAdvanced* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_SetLiveSource(IWMWriterAdvanced* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_IsRealTime(IWMWriterAdvanced* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetWriterTime(IWMWriterAdvanced* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetStatistics(IWMWriterAdvanced* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_SetSyncTolerance(IWMWriterAdvanced* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced_GetSyncTolerance(IWMWriterAdvanced* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
#endif
#endif

#endif


#endif  /* __IWMWriterAdvanced_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced2 interface
 */
#ifndef __IWMWriterAdvanced2_INTERFACE_DEFINED__
#define __IWMWriterAdvanced2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("962dc1ec-c046-4db8-9cc7-26ceae500817")
IWMWriterAdvanced2 : public IWMWriterAdvanced
{
    virtual HRESULT STDMETHODCALLTYPE GetInputSetting(
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputSetting(
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced2, 0x962dc1ec, 0xc046, 0x4db8, 0x9c,0xc7, 0x26,0xce,0xae,0x50,0x08,0x17)
#endif
#else
typedef struct IWMWriterAdvanced2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced2 *This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced2 *This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced2 *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced2 *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced2 *This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced2 *This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced2 *This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced2 *This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced2 *This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced2 *This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced2 *This,
        DWORD *pmsWindow);

    /*** IWMWriterAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
        IWMWriterAdvanced2 *This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
        IWMWriterAdvanced2 *This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    END_INTERFACE
} IWMWriterAdvanced2Vtbl;

interface IWMWriterAdvanced2 {
    CONST_VTBL IWMWriterAdvanced2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced2_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced2_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced2_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced2_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced2_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced2_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced2_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced2_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced2_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced2_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced2_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
/*** IWMWriterAdvanced2 methods ***/
#define IWMWriterAdvanced2_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
#define IWMWriterAdvanced2_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_QueryInterface(IWMWriterAdvanced2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced2_AddRef(IWMWriterAdvanced2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced2_Release(IWMWriterAdvanced2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSinkCount(IWMWriterAdvanced2* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSink(IWMWriterAdvanced2* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_AddSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_RemoveSink(IWMWriterAdvanced2* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_WriteStreamSample(IWMWriterAdvanced2* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetLiveSource(IWMWriterAdvanced2* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_IsRealTime(IWMWriterAdvanced2* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetWriterTime(IWMWriterAdvanced2* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetStatistics(IWMWriterAdvanced2* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetSyncTolerance(IWMWriterAdvanced2* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetSyncTolerance(IWMWriterAdvanced2* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
/*** IWMWriterAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced2_GetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMWriterAdvanced2_SetInputSetting(IWMWriterAdvanced2* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
}
#endif
#endif

#endif


#endif  /* __IWMWriterAdvanced2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterAdvanced3 interface
 */
#ifndef __IWMWriterAdvanced3_INTERFACE_DEFINED__
#define __IWMWriterAdvanced3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2cd6492d-7c37-4e76-9d3b-59261183a22e")
IWMWriterAdvanced3 : public IWMWriterAdvanced2
{
    virtual HRESULT STDMETHODCALLTYPE GetStatisticsEx(
        WORD wStreamNum,
        WM_WRITER_STATISTICS_EX *pStats) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNonBlocking(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterAdvanced3, 0x2cd6492d, 0x7c37, 0x4e76, 0x9d,0x3b, 0x59,0x26,0x11,0x83,0xa2,0x2e)
#endif
#else
typedef struct IWMWriterAdvanced3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterAdvanced methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSinkCount)(
        IWMWriterAdvanced3 *This,
        DWORD *pcSinks);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWMWriterAdvanced3 *This,
        DWORD dwSinkNum,
        IWMWriterSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *AddSink)(
        IWMWriterAdvanced3 *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *RemoveSink)(
        IWMWriterAdvanced3 *This,
        IWMWriterSink *pSink);

    HRESULT (STDMETHODCALLTYPE *WriteStreamSample)(
        IWMWriterAdvanced3 *This,
        WORD wStreamNum,
        QWORD cnsSampleTime,
        DWORD msSampleSendTime,
        QWORD cnsSampleDuration,
        DWORD dwFlags,
        INSSBuffer *pSample);

    HRESULT (STDMETHODCALLTYPE *SetLiveSource)(
        IWMWriterAdvanced3 *This,
        WINBOOL fIsLiveSource);

    HRESULT (STDMETHODCALLTYPE *IsRealTime)(
        IWMWriterAdvanced3 *This,
        WINBOOL *pfRealTime);

    HRESULT (STDMETHODCALLTYPE *GetWriterTime)(
        IWMWriterAdvanced3 *This,
        QWORD *pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IWMWriterAdvanced3 *This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS *pStats);

    HRESULT (STDMETHODCALLTYPE *SetSyncTolerance)(
        IWMWriterAdvanced3 *This,
        DWORD msWindow);

    HRESULT (STDMETHODCALLTYPE *GetSyncTolerance)(
        IWMWriterAdvanced3 *This,
        DWORD *pmsWindow);

    /*** IWMWriterAdvanced2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInputSetting)(
        IWMWriterAdvanced3 *This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE *pType,
        BYTE *pValue,
        WORD *pcbLength);

    HRESULT (STDMETHODCALLTYPE *SetInputSetting)(
        IWMWriterAdvanced3 *This,
        DWORD dwInputNum,
        LPCWSTR pszName,
        WMT_ATTR_DATATYPE Type,
        const BYTE *pValue,
        WORD cbLength);

    /*** IWMWriterAdvanced3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStatisticsEx)(
        IWMWriterAdvanced3 *This,
        WORD wStreamNum,
        WM_WRITER_STATISTICS_EX *pStats);

    HRESULT (STDMETHODCALLTYPE *SetNonBlocking)(
        IWMWriterAdvanced3 *This);

    END_INTERFACE
} IWMWriterAdvanced3Vtbl;

interface IWMWriterAdvanced3 {
    CONST_VTBL IWMWriterAdvanced3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterAdvanced3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterAdvanced3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterAdvanced3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterAdvanced methods ***/
#define IWMWriterAdvanced3_GetSinkCount(This,pcSinks) (This)->lpVtbl->GetSinkCount(This,pcSinks)
#define IWMWriterAdvanced3_GetSink(This,dwSinkNum,ppSink) (This)->lpVtbl->GetSink(This,dwSinkNum,ppSink)
#define IWMWriterAdvanced3_AddSink(This,pSink) (This)->lpVtbl->AddSink(This,pSink)
#define IWMWriterAdvanced3_RemoveSink(This,pSink) (This)->lpVtbl->RemoveSink(This,pSink)
#define IWMWriterAdvanced3_WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample) (This)->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample)
#define IWMWriterAdvanced3_SetLiveSource(This,fIsLiveSource) (This)->lpVtbl->SetLiveSource(This,fIsLiveSource)
#define IWMWriterAdvanced3_IsRealTime(This,pfRealTime) (This)->lpVtbl->IsRealTime(This,pfRealTime)
#define IWMWriterAdvanced3_GetWriterTime(This,pCurrentTime) (This)->lpVtbl->GetWriterTime(This,pCurrentTime)
#define IWMWriterAdvanced3_GetStatistics(This,wStreamNum,pStats) (This)->lpVtbl->GetStatistics(This,wStreamNum,pStats)
#define IWMWriterAdvanced3_SetSyncTolerance(This,msWindow) (This)->lpVtbl->SetSyncTolerance(This,msWindow)
#define IWMWriterAdvanced3_GetSyncTolerance(This,pmsWindow) (This)->lpVtbl->GetSyncTolerance(This,pmsWindow)
/*** IWMWriterAdvanced2 methods ***/
#define IWMWriterAdvanced3_GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength) (This)->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength)
#define IWMWriterAdvanced3_SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength) (This)->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength)
/*** IWMWriterAdvanced3 methods ***/
#define IWMWriterAdvanced3_GetStatisticsEx(This,wStreamNum,pStats) (This)->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats)
#define IWMWriterAdvanced3_SetNonBlocking(This) (This)->lpVtbl->SetNonBlocking(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_QueryInterface(IWMWriterAdvanced3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterAdvanced3_AddRef(IWMWriterAdvanced3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterAdvanced3_Release(IWMWriterAdvanced3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterAdvanced methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSinkCount(IWMWriterAdvanced3* This,DWORD *pcSinks) {
    return This->lpVtbl->GetSinkCount(This,pcSinks);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSink(IWMWriterAdvanced3* This,DWORD dwSinkNum,IWMWriterSink **ppSink) {
    return This->lpVtbl->GetSink(This,dwSinkNum,ppSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_AddSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
    return This->lpVtbl->AddSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_RemoveSink(IWMWriterAdvanced3* This,IWMWriterSink *pSink) {
    return This->lpVtbl->RemoveSink(This,pSink);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_WriteStreamSample(IWMWriterAdvanced3* This,WORD wStreamNum,QWORD cnsSampleTime,DWORD msSampleSendTime,QWORD cnsSampleDuration,DWORD dwFlags,INSSBuffer *pSample) {
    return This->lpVtbl->WriteStreamSample(This,wStreamNum,cnsSampleTime,msSampleSendTime,cnsSampleDuration,dwFlags,pSample);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetLiveSource(IWMWriterAdvanced3* This,WINBOOL fIsLiveSource) {
    return This->lpVtbl->SetLiveSource(This,fIsLiveSource);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_IsRealTime(IWMWriterAdvanced3* This,WINBOOL *pfRealTime) {
    return This->lpVtbl->IsRealTime(This,pfRealTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetWriterTime(IWMWriterAdvanced3* This,QWORD *pCurrentTime) {
    return This->lpVtbl->GetWriterTime(This,pCurrentTime);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatistics(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS *pStats) {
    return This->lpVtbl->GetStatistics(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetSyncTolerance(IWMWriterAdvanced3* This,DWORD msWindow) {
    return This->lpVtbl->SetSyncTolerance(This,msWindow);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetSyncTolerance(IWMWriterAdvanced3* This,DWORD *pmsWindow) {
    return This->lpVtbl->GetSyncTolerance(This,pmsWindow);
}
/*** IWMWriterAdvanced2 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE *pType,BYTE *pValue,WORD *pcbLength) {
    return This->lpVtbl->GetInputSetting(This,dwInputNum,pszName,pType,pValue,pcbLength);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetInputSetting(IWMWriterAdvanced3* This,DWORD dwInputNum,LPCWSTR pszName,WMT_ATTR_DATATYPE Type,const BYTE *pValue,WORD cbLength) {
    return This->lpVtbl->SetInputSetting(This,dwInputNum,pszName,Type,pValue,cbLength);
}
/*** IWMWriterAdvanced3 methods ***/
static FORCEINLINE HRESULT IWMWriterAdvanced3_GetStatisticsEx(IWMWriterAdvanced3* This,WORD wStreamNum,WM_WRITER_STATISTICS_EX *pStats) {
    return This->lpVtbl->GetStatisticsEx(This,wStreamNum,pStats);
}
static FORCEINLINE HRESULT IWMWriterAdvanced3_SetNonBlocking(IWMWriterAdvanced3* This) {
    return This->lpVtbl->SetNonBlocking(This);
}
#endif
#endif

#endif


#endif  /* __IWMWriterAdvanced3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMHeaderInfo interface
 */
#ifndef __IWMHeaderInfo_INTERFACE_DEFINED__
#define __IWMHeaderInfo_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMHeaderInfo, 0x96406bda, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bda-2b2b-11d3-b36b-00c04f6108ff")
IWMHeaderInfo : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAttributeCount(
        WORD stream_num,
        WORD *attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributeByIndex(
        WORD index,
        WORD *stream_num,
        WCHAR *name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributeByName(
        WORD *stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAttribute(
        WORD stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMarkerCount(
        WORD *markers) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMarker(
        WORD index,
        WCHAR *marker_name,
        WORD *marker_len,
        QWORD *marker_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMarker(
        LPCWSTR_WMSDK_TYPE_SAFE marker_name,
        QWORD marker_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMarker(
        WORD index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptCount(
        WORD *scripts) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScript(
        WORD index,
        WCHAR *type,
        WORD *type_len,
        WCHAR *command,
        WORD *command_len,
        QWORD *script_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddScript(
        LPCWSTR_WMSDK_TYPE_SAFE type,
        LPCWSTR_WMSDK_TYPE_SAFE command,
        QWORD script_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveScript(
        WORD index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMHeaderInfo, 0x96406bda, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMHeaderInfoVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMHeaderInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAttributeCount)(
        IWMHeaderInfo *This,
        WORD stream_num,
        WORD *attributes);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByIndex)(
        IWMHeaderInfo *This,
        WORD index,
        WORD *stream_num,
        WCHAR *name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByName)(
        IWMHeaderInfo *This,
        WORD *stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
        IWMHeaderInfo *This,
        WORD stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetMarkerCount)(
        IWMHeaderInfo *This,
        WORD *markers);

    HRESULT (STDMETHODCALLTYPE *GetMarker)(
        IWMHeaderInfo *This,
        WORD index,
        WCHAR *marker_name,
        WORD *marker_len,
        QWORD *marker_time);

    HRESULT (STDMETHODCALLTYPE *AddMarker)(
        IWMHeaderInfo *This,
        LPCWSTR_WMSDK_TYPE_SAFE marker_name,
        QWORD marker_time);

    HRESULT (STDMETHODCALLTYPE *RemoveMarker)(
        IWMHeaderInfo *This,
        WORD index);

    HRESULT (STDMETHODCALLTYPE *GetScriptCount)(
        IWMHeaderInfo *This,
        WORD *scripts);

    HRESULT (STDMETHODCALLTYPE *GetScript)(
        IWMHeaderInfo *This,
        WORD index,
        WCHAR *type,
        WORD *type_len,
        WCHAR *command,
        WORD *command_len,
        QWORD *script_time);

    HRESULT (STDMETHODCALLTYPE *AddScript)(
        IWMHeaderInfo *This,
        LPCWSTR_WMSDK_TYPE_SAFE type,
        LPCWSTR_WMSDK_TYPE_SAFE command,
        QWORD script_time);

    HRESULT (STDMETHODCALLTYPE *RemoveScript)(
        IWMHeaderInfo *This,
        WORD index);

    END_INTERFACE
} IWMHeaderInfoVtbl;

interface IWMHeaderInfo {
    CONST_VTBL IWMHeaderInfoVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMHeaderInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMHeaderInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMHeaderInfo_Release(This) (This)->lpVtbl->Release(This)
/*** IWMHeaderInfo methods ***/
#define IWMHeaderInfo_GetAttributeCount(This,stream_num,attributes) (This)->lpVtbl->GetAttributeCount(This,stream_num,attributes)
#define IWMHeaderInfo_GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length) (This)->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length)
#define IWMHeaderInfo_GetAttributeByName(This,stream_num,name,type,value,length) (This)->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length)
#define IWMHeaderInfo_SetAttribute(This,stream_num,name,type,value,length) (This)->lpVtbl->SetAttribute(This,stream_num,name,type,value,length)
#define IWMHeaderInfo_GetMarkerCount(This,markers) (This)->lpVtbl->GetMarkerCount(This,markers)
#define IWMHeaderInfo_GetMarker(This,index,marker_name,marker_len,marker_time) (This)->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time)
#define IWMHeaderInfo_AddMarker(This,marker_name,marker_time) (This)->lpVtbl->AddMarker(This,marker_name,marker_time)
#define IWMHeaderInfo_RemoveMarker(This,index) (This)->lpVtbl->RemoveMarker(This,index)
#define IWMHeaderInfo_GetScriptCount(This,scripts) (This)->lpVtbl->GetScriptCount(This,scripts)
#define IWMHeaderInfo_GetScript(This,index,type,type_len,command,command_len,script_time) (This)->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time)
#define IWMHeaderInfo_AddScript(This,type,command,script_time) (This)->lpVtbl->AddScript(This,type,command,script_time)
#define IWMHeaderInfo_RemoveScript(This,index) (This)->lpVtbl->RemoveScript(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo_QueryInterface(IWMHeaderInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMHeaderInfo_AddRef(IWMHeaderInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMHeaderInfo_Release(IWMHeaderInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMHeaderInfo methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo_GetAttributeCount(IWMHeaderInfo* This,WORD stream_num,WORD *attributes) {
    return This->lpVtbl->GetAttributeCount(This,stream_num,attributes);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetAttributeByIndex(IWMHeaderInfo* This,WORD index,WORD *stream_num,WCHAR *name,WORD *name_len,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetAttributeByName(IWMHeaderInfo* This,WORD *stream_num,LPCWSTR name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo_SetAttribute(IWMHeaderInfo* This,WORD stream_num,LPCWSTR name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetAttribute(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetMarkerCount(IWMHeaderInfo* This,WORD *markers) {
    return This->lpVtbl->GetMarkerCount(This,markers);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetMarker(IWMHeaderInfo* This,WORD index,WCHAR *marker_name,WORD *marker_len,QWORD *marker_time) {
    return This->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo_AddMarker(IWMHeaderInfo* This,LPCWSTR_WMSDK_TYPE_SAFE marker_name,QWORD marker_time) {
    return This->lpVtbl->AddMarker(This,marker_name,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo_RemoveMarker(IWMHeaderInfo* This,WORD index) {
    return This->lpVtbl->RemoveMarker(This,index);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetScriptCount(IWMHeaderInfo* This,WORD *scripts) {
    return This->lpVtbl->GetScriptCount(This,scripts);
}
static FORCEINLINE HRESULT IWMHeaderInfo_GetScript(IWMHeaderInfo* This,WORD index,WCHAR *type,WORD *type_len,WCHAR *command,WORD *command_len,QWORD *script_time) {
    return This->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo_AddScript(IWMHeaderInfo* This,LPCWSTR_WMSDK_TYPE_SAFE type,LPCWSTR_WMSDK_TYPE_SAFE command,QWORD script_time) {
    return This->lpVtbl->AddScript(This,type,command,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo_RemoveScript(IWMHeaderInfo* This,WORD index) {
    return This->lpVtbl->RemoveScript(This,index);
}
#endif
#endif

#endif


#endif  /* __IWMHeaderInfo_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMHeaderInfo2 interface
 */
#ifndef __IWMHeaderInfo2_INTERFACE_DEFINED__
#define __IWMHeaderInfo2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMHeaderInfo2, 0x15cf9781, 0x454e, 0x482e, 0xb3,0x93, 0x85,0xfa,0xe4,0x87,0xa8,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("15cf9781-454e-482e-b393-85fae487a810")
IWMHeaderInfo2 : public IWMHeaderInfo
{
    virtual HRESULT STDMETHODCALLTYPE GetCodecInfoCount(
        DWORD *codec_infos) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCodecInfo(
        DWORD index,
        WORD *name_len,
        WCHAR *name,
        WORD *description_len,
        WCHAR *description,
        WMT_CODEC_INFO_TYPE *codec_type,
        WORD *codec_info_cnt,
        BYTE *codec_info) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMHeaderInfo2, 0x15cf9781, 0x454e, 0x482e, 0xb3,0x93, 0x85,0xfa,0xe4,0x87,0xa8,0x10)
#endif
#else
typedef struct IWMHeaderInfo2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMHeaderInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAttributeCount)(
        IWMHeaderInfo2 *This,
        WORD stream_num,
        WORD *attributes);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByIndex)(
        IWMHeaderInfo2 *This,
        WORD index,
        WORD *stream_num,
        WCHAR *name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByName)(
        IWMHeaderInfo2 *This,
        WORD *stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
        IWMHeaderInfo2 *This,
        WORD stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetMarkerCount)(
        IWMHeaderInfo2 *This,
        WORD *markers);

    HRESULT (STDMETHODCALLTYPE *GetMarker)(
        IWMHeaderInfo2 *This,
        WORD index,
        WCHAR *marker_name,
        WORD *marker_len,
        QWORD *marker_time);

    HRESULT (STDMETHODCALLTYPE *AddMarker)(
        IWMHeaderInfo2 *This,
        LPCWSTR_WMSDK_TYPE_SAFE marker_name,
        QWORD marker_time);

    HRESULT (STDMETHODCALLTYPE *RemoveMarker)(
        IWMHeaderInfo2 *This,
        WORD index);

    HRESULT (STDMETHODCALLTYPE *GetScriptCount)(
        IWMHeaderInfo2 *This,
        WORD *scripts);

    HRESULT (STDMETHODCALLTYPE *GetScript)(
        IWMHeaderInfo2 *This,
        WORD index,
        WCHAR *type,
        WORD *type_len,
        WCHAR *command,
        WORD *command_len,
        QWORD *script_time);

    HRESULT (STDMETHODCALLTYPE *AddScript)(
        IWMHeaderInfo2 *This,
        LPCWSTR_WMSDK_TYPE_SAFE type,
        LPCWSTR_WMSDK_TYPE_SAFE command,
        QWORD script_time);

    HRESULT (STDMETHODCALLTYPE *RemoveScript)(
        IWMHeaderInfo2 *This,
        WORD index);

    /*** IWMHeaderInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInfoCount)(
        IWMHeaderInfo2 *This,
        DWORD *codec_infos);

    HRESULT (STDMETHODCALLTYPE *GetCodecInfo)(
        IWMHeaderInfo2 *This,
        DWORD index,
        WORD *name_len,
        WCHAR *name,
        WORD *description_len,
        WCHAR *description,
        WMT_CODEC_INFO_TYPE *codec_type,
        WORD *codec_info_cnt,
        BYTE *codec_info);

    END_INTERFACE
} IWMHeaderInfo2Vtbl;

interface IWMHeaderInfo2 {
    CONST_VTBL IWMHeaderInfo2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMHeaderInfo2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMHeaderInfo2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMHeaderInfo2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMHeaderInfo methods ***/
#define IWMHeaderInfo2_GetAttributeCount(This,stream_num,attributes) (This)->lpVtbl->GetAttributeCount(This,stream_num,attributes)
#define IWMHeaderInfo2_GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length) (This)->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length)
#define IWMHeaderInfo2_GetAttributeByName(This,stream_num,name,type,value,length) (This)->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length)
#define IWMHeaderInfo2_SetAttribute(This,stream_num,name,type,value,length) (This)->lpVtbl->SetAttribute(This,stream_num,name,type,value,length)
#define IWMHeaderInfo2_GetMarkerCount(This,markers) (This)->lpVtbl->GetMarkerCount(This,markers)
#define IWMHeaderInfo2_GetMarker(This,index,marker_name,marker_len,marker_time) (This)->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time)
#define IWMHeaderInfo2_AddMarker(This,marker_name,marker_time) (This)->lpVtbl->AddMarker(This,marker_name,marker_time)
#define IWMHeaderInfo2_RemoveMarker(This,index) (This)->lpVtbl->RemoveMarker(This,index)
#define IWMHeaderInfo2_GetScriptCount(This,scripts) (This)->lpVtbl->GetScriptCount(This,scripts)
#define IWMHeaderInfo2_GetScript(This,index,type,type_len,command,command_len,script_time) (This)->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time)
#define IWMHeaderInfo2_AddScript(This,type,command,script_time) (This)->lpVtbl->AddScript(This,type,command,script_time)
#define IWMHeaderInfo2_RemoveScript(This,index) (This)->lpVtbl->RemoveScript(This,index)
/*** IWMHeaderInfo2 methods ***/
#define IWMHeaderInfo2_GetCodecInfoCount(This,codec_infos) (This)->lpVtbl->GetCodecInfoCount(This,codec_infos)
#define IWMHeaderInfo2_GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info) (This)->lpVtbl->GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo2_QueryInterface(IWMHeaderInfo2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMHeaderInfo2_AddRef(IWMHeaderInfo2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMHeaderInfo2_Release(IWMHeaderInfo2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMHeaderInfo methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo2_GetAttributeCount(IWMHeaderInfo2* This,WORD stream_num,WORD *attributes) {
    return This->lpVtbl->GetAttributeCount(This,stream_num,attributes);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetAttributeByIndex(IWMHeaderInfo2* This,WORD index,WORD *stream_num,WCHAR *name,WORD *name_len,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetAttributeByName(IWMHeaderInfo2* This,WORD *stream_num,LPCWSTR name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_SetAttribute(IWMHeaderInfo2* This,WORD stream_num,LPCWSTR name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetAttribute(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetMarkerCount(IWMHeaderInfo2* This,WORD *markers) {
    return This->lpVtbl->GetMarkerCount(This,markers);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetMarker(IWMHeaderInfo2* This,WORD index,WCHAR *marker_name,WORD *marker_len,QWORD *marker_time) {
    return This->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_AddMarker(IWMHeaderInfo2* This,LPCWSTR_WMSDK_TYPE_SAFE marker_name,QWORD marker_time) {
    return This->lpVtbl->AddMarker(This,marker_name,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_RemoveMarker(IWMHeaderInfo2* This,WORD index) {
    return This->lpVtbl->RemoveMarker(This,index);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetScriptCount(IWMHeaderInfo2* This,WORD *scripts) {
    return This->lpVtbl->GetScriptCount(This,scripts);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetScript(IWMHeaderInfo2* This,WORD index,WCHAR *type,WORD *type_len,WCHAR *command,WORD *command_len,QWORD *script_time) {
    return This->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_AddScript(IWMHeaderInfo2* This,LPCWSTR_WMSDK_TYPE_SAFE type,LPCWSTR_WMSDK_TYPE_SAFE command,QWORD script_time) {
    return This->lpVtbl->AddScript(This,type,command,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_RemoveScript(IWMHeaderInfo2* This,WORD index) {
    return This->lpVtbl->RemoveScript(This,index);
}
/*** IWMHeaderInfo2 methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo2_GetCodecInfoCount(IWMHeaderInfo2* This,DWORD *codec_infos) {
    return This->lpVtbl->GetCodecInfoCount(This,codec_infos);
}
static FORCEINLINE HRESULT IWMHeaderInfo2_GetCodecInfo(IWMHeaderInfo2* This,DWORD index,WORD *name_len,WCHAR *name,WORD *description_len,WCHAR *description,WMT_CODEC_INFO_TYPE *codec_type,WORD *codec_info_cnt,BYTE *codec_info) {
    return This->lpVtbl->GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info);
}
#endif
#endif

#endif


#endif  /* __IWMHeaderInfo2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMHeaderInfo3 interface
 */
#ifndef __IWMHeaderInfo3_INTERFACE_DEFINED__
#define __IWMHeaderInfo3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMHeaderInfo3, 0x15cc68e3, 0x27cc, 0x4ecd, 0xb2,0x22, 0x3f,0x5d,0x02,0xd8,0x0b,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("15cc68e3-27cc-4ecd-b222-3f5d02d80bd5")
IWMHeaderInfo3 : public IWMHeaderInfo2
{
    virtual HRESULT STDMETHODCALLTYPE GetAttributeCountEx(
        WORD stream_num,
        WORD *attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributeIndices(
        WORD stream_num,
        LPCWSTR name,
        WORD *lang_index,
        WORD *indices,
        WORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributeByIndexEx(
        WORD stream_num,
        WORD index,
        LPWSTR name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        WORD *lang_index,
        BYTE *value,
        DWORD *data_len) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyAttribute(
        WORD stream_num,
        WORD index,
        WMT_ATTR_DATATYPE type,
        WORD lang_index,
        const BYTE *value,
        DWORD length) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAttribute(
        WORD stream_num,
        LPCWSTR name,
        WORD *index,
        WMT_ATTR_DATATYPE type,
        WORD lang_index,
        const BYTE *value,
        DWORD length) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAttribute(
        WORD stream_num,
        WORD index) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddCodecInfo(
        LPCWSTR_WMSDK_TYPE_SAFE name,
        LPCWSTR_WMSDK_TYPE_SAFE description,
        WMT_CODEC_INFO_TYPE codec_type,
        WORD codec_info_cnt,
        BYTE *codec_info) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMHeaderInfo3, 0x15cc68e3, 0x27cc, 0x4ecd, 0xb2,0x22, 0x3f,0x5d,0x02,0xd8,0x0b,0xd5)
#endif
#else
typedef struct IWMHeaderInfo3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMHeaderInfo methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAttributeCount)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        WORD *attributes);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByIndex)(
        IWMHeaderInfo3 *This,
        WORD index,
        WORD *stream_num,
        WCHAR *name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByName)(
        IWMHeaderInfo3 *This,
        WORD *stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        LPCWSTR name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetMarkerCount)(
        IWMHeaderInfo3 *This,
        WORD *markers);

    HRESULT (STDMETHODCALLTYPE *GetMarker)(
        IWMHeaderInfo3 *This,
        WORD index,
        WCHAR *marker_name,
        WORD *marker_len,
        QWORD *marker_time);

    HRESULT (STDMETHODCALLTYPE *AddMarker)(
        IWMHeaderInfo3 *This,
        LPCWSTR_WMSDK_TYPE_SAFE marker_name,
        QWORD marker_time);

    HRESULT (STDMETHODCALLTYPE *RemoveMarker)(
        IWMHeaderInfo3 *This,
        WORD index);

    HRESULT (STDMETHODCALLTYPE *GetScriptCount)(
        IWMHeaderInfo3 *This,
        WORD *scripts);

    HRESULT (STDMETHODCALLTYPE *GetScript)(
        IWMHeaderInfo3 *This,
        WORD index,
        WCHAR *type,
        WORD *type_len,
        WCHAR *command,
        WORD *command_len,
        QWORD *script_time);

    HRESULT (STDMETHODCALLTYPE *AddScript)(
        IWMHeaderInfo3 *This,
        LPCWSTR_WMSDK_TYPE_SAFE type,
        LPCWSTR_WMSDK_TYPE_SAFE command,
        QWORD script_time);

    HRESULT (STDMETHODCALLTYPE *RemoveScript)(
        IWMHeaderInfo3 *This,
        WORD index);

    /*** IWMHeaderInfo2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInfoCount)(
        IWMHeaderInfo3 *This,
        DWORD *codec_infos);

    HRESULT (STDMETHODCALLTYPE *GetCodecInfo)(
        IWMHeaderInfo3 *This,
        DWORD index,
        WORD *name_len,
        WCHAR *name,
        WORD *description_len,
        WCHAR *description,
        WMT_CODEC_INFO_TYPE *codec_type,
        WORD *codec_info_cnt,
        BYTE *codec_info);

    /*** IWMHeaderInfo3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAttributeCountEx)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        WORD *attributes);

    HRESULT (STDMETHODCALLTYPE *GetAttributeIndices)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        LPCWSTR name,
        WORD *lang_index,
        WORD *indices,
        WORD *count);

    HRESULT (STDMETHODCALLTYPE *GetAttributeByIndexEx)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        WORD index,
        LPWSTR name,
        WORD *name_len,
        WMT_ATTR_DATATYPE *type,
        WORD *lang_index,
        BYTE *value,
        DWORD *data_len);

    HRESULT (STDMETHODCALLTYPE *ModifyAttribute)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        WORD index,
        WMT_ATTR_DATATYPE type,
        WORD lang_index,
        const BYTE *value,
        DWORD length);

    HRESULT (STDMETHODCALLTYPE *AddAttribute)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        LPCWSTR name,
        WORD *index,
        WMT_ATTR_DATATYPE type,
        WORD lang_index,
        const BYTE *value,
        DWORD length);

    HRESULT (STDMETHODCALLTYPE *DeleteAttribute)(
        IWMHeaderInfo3 *This,
        WORD stream_num,
        WORD index);

    HRESULT (STDMETHODCALLTYPE *AddCodecInfo)(
        IWMHeaderInfo3 *This,
        LPCWSTR_WMSDK_TYPE_SAFE name,
        LPCWSTR_WMSDK_TYPE_SAFE description,
        WMT_CODEC_INFO_TYPE codec_type,
        WORD codec_info_cnt,
        BYTE *codec_info);

    END_INTERFACE
} IWMHeaderInfo3Vtbl;

interface IWMHeaderInfo3 {
    CONST_VTBL IWMHeaderInfo3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMHeaderInfo3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMHeaderInfo3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMHeaderInfo3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMHeaderInfo methods ***/
#define IWMHeaderInfo3_GetAttributeCount(This,stream_num,attributes) (This)->lpVtbl->GetAttributeCount(This,stream_num,attributes)
#define IWMHeaderInfo3_GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length) (This)->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length)
#define IWMHeaderInfo3_GetAttributeByName(This,stream_num,name,type,value,length) (This)->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length)
#define IWMHeaderInfo3_SetAttribute(This,stream_num,name,type,value,length) (This)->lpVtbl->SetAttribute(This,stream_num,name,type,value,length)
#define IWMHeaderInfo3_GetMarkerCount(This,markers) (This)->lpVtbl->GetMarkerCount(This,markers)
#define IWMHeaderInfo3_GetMarker(This,index,marker_name,marker_len,marker_time) (This)->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time)
#define IWMHeaderInfo3_AddMarker(This,marker_name,marker_time) (This)->lpVtbl->AddMarker(This,marker_name,marker_time)
#define IWMHeaderInfo3_RemoveMarker(This,index) (This)->lpVtbl->RemoveMarker(This,index)
#define IWMHeaderInfo3_GetScriptCount(This,scripts) (This)->lpVtbl->GetScriptCount(This,scripts)
#define IWMHeaderInfo3_GetScript(This,index,type,type_len,command,command_len,script_time) (This)->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time)
#define IWMHeaderInfo3_AddScript(This,type,command,script_time) (This)->lpVtbl->AddScript(This,type,command,script_time)
#define IWMHeaderInfo3_RemoveScript(This,index) (This)->lpVtbl->RemoveScript(This,index)
/*** IWMHeaderInfo2 methods ***/
#define IWMHeaderInfo3_GetCodecInfoCount(This,codec_infos) (This)->lpVtbl->GetCodecInfoCount(This,codec_infos)
#define IWMHeaderInfo3_GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info) (This)->lpVtbl->GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info)
/*** IWMHeaderInfo3 methods ***/
#define IWMHeaderInfo3_GetAttributeCountEx(This,stream_num,attributes) (This)->lpVtbl->GetAttributeCountEx(This,stream_num,attributes)
#define IWMHeaderInfo3_GetAttributeIndices(This,stream_num,name,lang_index,indices,count) (This)->lpVtbl->GetAttributeIndices(This,stream_num,name,lang_index,indices,count)
#define IWMHeaderInfo3_GetAttributeByIndexEx(This,stream_num,index,name,name_len,type,lang_index,value,data_len) (This)->lpVtbl->GetAttributeByIndexEx(This,stream_num,index,name,name_len,type,lang_index,value,data_len)
#define IWMHeaderInfo3_ModifyAttribute(This,stream_num,index,type,lang_index,value,length) (This)->lpVtbl->ModifyAttribute(This,stream_num,index,type,lang_index,value,length)
#define IWMHeaderInfo3_AddAttribute(This,stream_num,name,index,type,lang_index,value,length) (This)->lpVtbl->AddAttribute(This,stream_num,name,index,type,lang_index,value,length)
#define IWMHeaderInfo3_DeleteAttribute(This,stream_num,index) (This)->lpVtbl->DeleteAttribute(This,stream_num,index)
#define IWMHeaderInfo3_AddCodecInfo(This,name,description,codec_type,codec_info_cnt,codec_info) (This)->lpVtbl->AddCodecInfo(This,name,description,codec_type,codec_info_cnt,codec_info)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo3_QueryInterface(IWMHeaderInfo3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMHeaderInfo3_AddRef(IWMHeaderInfo3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMHeaderInfo3_Release(IWMHeaderInfo3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMHeaderInfo methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeCount(IWMHeaderInfo3* This,WORD stream_num,WORD *attributes) {
    return This->lpVtbl->GetAttributeCount(This,stream_num,attributes);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeByIndex(IWMHeaderInfo3* This,WORD index,WORD *stream_num,WCHAR *name,WORD *name_len,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByIndex(This,index,stream_num,name,name_len,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeByName(IWMHeaderInfo3* This,WORD *stream_num,LPCWSTR name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetAttributeByName(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_SetAttribute(IWMHeaderInfo3* This,WORD stream_num,LPCWSTR name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetAttribute(This,stream_num,name,type,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetMarkerCount(IWMHeaderInfo3* This,WORD *markers) {
    return This->lpVtbl->GetMarkerCount(This,markers);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetMarker(IWMHeaderInfo3* This,WORD index,WCHAR *marker_name,WORD *marker_len,QWORD *marker_time) {
    return This->lpVtbl->GetMarker(This,index,marker_name,marker_len,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_AddMarker(IWMHeaderInfo3* This,LPCWSTR_WMSDK_TYPE_SAFE marker_name,QWORD marker_time) {
    return This->lpVtbl->AddMarker(This,marker_name,marker_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_RemoveMarker(IWMHeaderInfo3* This,WORD index) {
    return This->lpVtbl->RemoveMarker(This,index);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetScriptCount(IWMHeaderInfo3* This,WORD *scripts) {
    return This->lpVtbl->GetScriptCount(This,scripts);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetScript(IWMHeaderInfo3* This,WORD index,WCHAR *type,WORD *type_len,WCHAR *command,WORD *command_len,QWORD *script_time) {
    return This->lpVtbl->GetScript(This,index,type,type_len,command,command_len,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_AddScript(IWMHeaderInfo3* This,LPCWSTR_WMSDK_TYPE_SAFE type,LPCWSTR_WMSDK_TYPE_SAFE command,QWORD script_time) {
    return This->lpVtbl->AddScript(This,type,command,script_time);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_RemoveScript(IWMHeaderInfo3* This,WORD index) {
    return This->lpVtbl->RemoveScript(This,index);
}
/*** IWMHeaderInfo2 methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo3_GetCodecInfoCount(IWMHeaderInfo3* This,DWORD *codec_infos) {
    return This->lpVtbl->GetCodecInfoCount(This,codec_infos);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetCodecInfo(IWMHeaderInfo3* This,DWORD index,WORD *name_len,WCHAR *name,WORD *description_len,WCHAR *description,WMT_CODEC_INFO_TYPE *codec_type,WORD *codec_info_cnt,BYTE *codec_info) {
    return This->lpVtbl->GetCodecInfo(This,index,name_len,name,description_len,description,codec_type,codec_info_cnt,codec_info);
}
/*** IWMHeaderInfo3 methods ***/
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeCountEx(IWMHeaderInfo3* This,WORD stream_num,WORD *attributes) {
    return This->lpVtbl->GetAttributeCountEx(This,stream_num,attributes);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeIndices(IWMHeaderInfo3* This,WORD stream_num,LPCWSTR name,WORD *lang_index,WORD *indices,WORD *count) {
    return This->lpVtbl->GetAttributeIndices(This,stream_num,name,lang_index,indices,count);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_GetAttributeByIndexEx(IWMHeaderInfo3* This,WORD stream_num,WORD index,LPWSTR name,WORD *name_len,WMT_ATTR_DATATYPE *type,WORD *lang_index,BYTE *value,DWORD *data_len) {
    return This->lpVtbl->GetAttributeByIndexEx(This,stream_num,index,name,name_len,type,lang_index,value,data_len);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_ModifyAttribute(IWMHeaderInfo3* This,WORD stream_num,WORD index,WMT_ATTR_DATATYPE type,WORD lang_index,const BYTE *value,DWORD length) {
    return This->lpVtbl->ModifyAttribute(This,stream_num,index,type,lang_index,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_AddAttribute(IWMHeaderInfo3* This,WORD stream_num,LPCWSTR name,WORD *index,WMT_ATTR_DATATYPE type,WORD lang_index,const BYTE *value,DWORD length) {
    return This->lpVtbl->AddAttribute(This,stream_num,name,index,type,lang_index,value,length);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_DeleteAttribute(IWMHeaderInfo3* This,WORD stream_num,WORD index) {
    return This->lpVtbl->DeleteAttribute(This,stream_num,index);
}
static FORCEINLINE HRESULT IWMHeaderInfo3_AddCodecInfo(IWMHeaderInfo3* This,LPCWSTR_WMSDK_TYPE_SAFE name,LPCWSTR_WMSDK_TYPE_SAFE description,WMT_CODEC_INFO_TYPE codec_type,WORD codec_info_cnt,BYTE *codec_info) {
    return This->lpVtbl->AddCodecInfo(This,name,description,codec_type,codec_info_cnt,codec_info);
}
#endif
#endif

#endif


#endif  /* __IWMHeaderInfo3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderNetworkConfig interface
 */
#ifndef __IWMReaderNetworkConfig_INTERFACE_DEFINED__
#define __IWMReaderNetworkConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderNetworkConfig, 0x96406bec, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bec-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderNetworkConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetBufferingTime(
        QWORD *buffering_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBufferingTime(
        QWORD buffering_time) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUDPPortRanges(
        WM_PORT_NUMBER_RANGE *array,
        DWORD *ranges) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUDPPortRanges(
        WM_PORT_NUMBER_RANGE *array,
        DWORD ranges) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProxySettings(
        const WCHAR *protocol,
        WMT_PROXY_SETTINGS *proxy) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProxySettings(
        LPCWSTR protocol,
        WMT_PROXY_SETTINGS proxy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProxyHostName(
        const WCHAR *protocol,
        WCHAR *hostname,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProxyHostName(
        const WCHAR *protocol,
        const WCHAR *hostname) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProxyPort(
        const WCHAR *protocol,
        DWORD *port) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProxyPort(
        const WCHAR *protocol,
        DWORD port) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProxyExceptionList(
        const WCHAR *protocol,
        WCHAR *exceptions,
        DWORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProxyExceptionList(
        const WCHAR *protocol,
        const WCHAR *exceptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProxyBypassForLocal(
        const WCHAR *protocol,
        WINBOOL *bypass) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProxyBypassForLocal(
        const WCHAR *protocol,
        WINBOOL bypass) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetForceRerunAutoProxyDetection(
        WINBOOL *detection) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetForceRerunAutoProxyDetection(
        WINBOOL detection) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableMulticast(
        WINBOOL *multicast) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableMulticast(
        WINBOOL multicast) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableHTTP(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableHTTP(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableUDP(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableUDP(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableTCP(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableTCP(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetProtocolRollover(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectionBandwidth(
        DWORD *bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConnectionBandwidth(
        DWORD bandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumProtocolsSupported(
        DWORD *protocols) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedProtocolName(
        DWORD protocol_num,
        WCHAR *protocol,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddLoggingUrl(
        const WCHAR *url) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLoggingUrl(
        DWORD index,
        WCHAR *url,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLoggingUrlCount(
        DWORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetLoggingUrlList(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderNetworkConfig, 0x96406bec, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderNetworkConfigVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderNetworkConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBufferingTime)(
        IWMReaderNetworkConfig *This,
        QWORD *buffering_time);

    HRESULT (STDMETHODCALLTYPE *SetBufferingTime)(
        IWMReaderNetworkConfig *This,
        QWORD buffering_time);

    HRESULT (STDMETHODCALLTYPE *GetUDPPortRanges)(
        IWMReaderNetworkConfig *This,
        WM_PORT_NUMBER_RANGE *array,
        DWORD *ranges);

    HRESULT (STDMETHODCALLTYPE *SetUDPPortRanges)(
        IWMReaderNetworkConfig *This,
        WM_PORT_NUMBER_RANGE *array,
        DWORD ranges);

    HRESULT (STDMETHODCALLTYPE *GetProxySettings)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        WMT_PROXY_SETTINGS *proxy);

    HRESULT (STDMETHODCALLTYPE *SetProxySettings)(
        IWMReaderNetworkConfig *This,
        LPCWSTR protocol,
        WMT_PROXY_SETTINGS proxy);

    HRESULT (STDMETHODCALLTYPE *GetProxyHostName)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        WCHAR *hostname,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetProxyHostName)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        const WCHAR *hostname);

    HRESULT (STDMETHODCALLTYPE *GetProxyPort)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        DWORD *port);

    HRESULT (STDMETHODCALLTYPE *SetProxyPort)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        DWORD port);

    HRESULT (STDMETHODCALLTYPE *GetProxyExceptionList)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        WCHAR *exceptions,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *SetProxyExceptionList)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        const WCHAR *exceptions);

    HRESULT (STDMETHODCALLTYPE *GetProxyBypassForLocal)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        WINBOOL *bypass);

    HRESULT (STDMETHODCALLTYPE *SetProxyBypassForLocal)(
        IWMReaderNetworkConfig *This,
        const WCHAR *protocol,
        WINBOOL bypass);

    HRESULT (STDMETHODCALLTYPE *GetForceRerunAutoProxyDetection)(
        IWMReaderNetworkConfig *This,
        WINBOOL *detection);

    HRESULT (STDMETHODCALLTYPE *SetForceRerunAutoProxyDetection)(
        IWMReaderNetworkConfig *This,
        WINBOOL detection);

    HRESULT (STDMETHODCALLTYPE *GetEnableMulticast)(
        IWMReaderNetworkConfig *This,
        WINBOOL *multicast);

    HRESULT (STDMETHODCALLTYPE *SetEnableMulticast)(
        IWMReaderNetworkConfig *This,
        WINBOOL multicast);

    HRESULT (STDMETHODCALLTYPE *GetEnableHTTP)(
        IWMReaderNetworkConfig *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableHTTP)(
        IWMReaderNetworkConfig *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableUDP)(
        IWMReaderNetworkConfig *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableUDP)(
        IWMReaderNetworkConfig *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableTCP)(
        IWMReaderNetworkConfig *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableTCP)(
        IWMReaderNetworkConfig *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *ResetProtocolRollover)(
        IWMReaderNetworkConfig *This);

    HRESULT (STDMETHODCALLTYPE *GetConnectionBandwidth)(
        IWMReaderNetworkConfig *This,
        DWORD *bandwidth);

    HRESULT (STDMETHODCALLTYPE *SetConnectionBandwidth)(
        IWMReaderNetworkConfig *This,
        DWORD bandwidth);

    HRESULT (STDMETHODCALLTYPE *GetNumProtocolsSupported)(
        IWMReaderNetworkConfig *This,
        DWORD *protocols);

    HRESULT (STDMETHODCALLTYPE *GetSupportedProtocolName)(
        IWMReaderNetworkConfig *This,
        DWORD protocol_num,
        WCHAR *protocol,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *AddLoggingUrl)(
        IWMReaderNetworkConfig *This,
        const WCHAR *url);

    HRESULT (STDMETHODCALLTYPE *GetLoggingUrl)(
        IWMReaderNetworkConfig *This,
        DWORD index,
        WCHAR *url,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *GetLoggingUrlCount)(
        IWMReaderNetworkConfig *This,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *ResetLoggingUrlList)(
        IWMReaderNetworkConfig *This);

    END_INTERFACE
} IWMReaderNetworkConfigVtbl;

interface IWMReaderNetworkConfig {
    CONST_VTBL IWMReaderNetworkConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderNetworkConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderNetworkConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderNetworkConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderNetworkConfig methods ***/
#define IWMReaderNetworkConfig_GetBufferingTime(This,buffering_time) (This)->lpVtbl->GetBufferingTime(This,buffering_time)
#define IWMReaderNetworkConfig_SetBufferingTime(This,buffering_time) (This)->lpVtbl->SetBufferingTime(This,buffering_time)
#define IWMReaderNetworkConfig_GetUDPPortRanges(This,array,ranges) (This)->lpVtbl->GetUDPPortRanges(This,array,ranges)
#define IWMReaderNetworkConfig_SetUDPPortRanges(This,array,ranges) (This)->lpVtbl->SetUDPPortRanges(This,array,ranges)
#define IWMReaderNetworkConfig_GetProxySettings(This,protocol,proxy) (This)->lpVtbl->GetProxySettings(This,protocol,proxy)
#define IWMReaderNetworkConfig_SetProxySettings(This,protocol,proxy) (This)->lpVtbl->SetProxySettings(This,protocol,proxy)
#define IWMReaderNetworkConfig_GetProxyHostName(This,protocol,hostname,size) (This)->lpVtbl->GetProxyHostName(This,protocol,hostname,size)
#define IWMReaderNetworkConfig_SetProxyHostName(This,protocol,hostname) (This)->lpVtbl->SetProxyHostName(This,protocol,hostname)
#define IWMReaderNetworkConfig_GetProxyPort(This,protocol,port) (This)->lpVtbl->GetProxyPort(This,protocol,port)
#define IWMReaderNetworkConfig_SetProxyPort(This,protocol,port) (This)->lpVtbl->SetProxyPort(This,protocol,port)
#define IWMReaderNetworkConfig_GetProxyExceptionList(This,protocol,exceptions,count) (This)->lpVtbl->GetProxyExceptionList(This,protocol,exceptions,count)
#define IWMReaderNetworkConfig_SetProxyExceptionList(This,protocol,exceptions) (This)->lpVtbl->SetProxyExceptionList(This,protocol,exceptions)
#define IWMReaderNetworkConfig_GetProxyBypassForLocal(This,protocol,bypass) (This)->lpVtbl->GetProxyBypassForLocal(This,protocol,bypass)
#define IWMReaderNetworkConfig_SetProxyBypassForLocal(This,protocol,bypass) (This)->lpVtbl->SetProxyBypassForLocal(This,protocol,bypass)
#define IWMReaderNetworkConfig_GetForceRerunAutoProxyDetection(This,detection) (This)->lpVtbl->GetForceRerunAutoProxyDetection(This,detection)
#define IWMReaderNetworkConfig_SetForceRerunAutoProxyDetection(This,detection) (This)->lpVtbl->SetForceRerunAutoProxyDetection(This,detection)
#define IWMReaderNetworkConfig_GetEnableMulticast(This,multicast) (This)->lpVtbl->GetEnableMulticast(This,multicast)
#define IWMReaderNetworkConfig_SetEnableMulticast(This,multicast) (This)->lpVtbl->SetEnableMulticast(This,multicast)
#define IWMReaderNetworkConfig_GetEnableHTTP(This,enable) (This)->lpVtbl->GetEnableHTTP(This,enable)
#define IWMReaderNetworkConfig_SetEnableHTTP(This,enable) (This)->lpVtbl->SetEnableHTTP(This,enable)
#define IWMReaderNetworkConfig_GetEnableUDP(This,enable) (This)->lpVtbl->GetEnableUDP(This,enable)
#define IWMReaderNetworkConfig_SetEnableUDP(This,enable) (This)->lpVtbl->SetEnableUDP(This,enable)
#define IWMReaderNetworkConfig_GetEnableTCP(This,enable) (This)->lpVtbl->GetEnableTCP(This,enable)
#define IWMReaderNetworkConfig_SetEnableTCP(This,enable) (This)->lpVtbl->SetEnableTCP(This,enable)
#define IWMReaderNetworkConfig_ResetProtocolRollover(This) (This)->lpVtbl->ResetProtocolRollover(This)
#define IWMReaderNetworkConfig_GetConnectionBandwidth(This,bandwidth) (This)->lpVtbl->GetConnectionBandwidth(This,bandwidth)
#define IWMReaderNetworkConfig_SetConnectionBandwidth(This,bandwidth) (This)->lpVtbl->SetConnectionBandwidth(This,bandwidth)
#define IWMReaderNetworkConfig_GetNumProtocolsSupported(This,protocols) (This)->lpVtbl->GetNumProtocolsSupported(This,protocols)
#define IWMReaderNetworkConfig_GetSupportedProtocolName(This,protocol_num,protocol,size) (This)->lpVtbl->GetSupportedProtocolName(This,protocol_num,protocol,size)
#define IWMReaderNetworkConfig_AddLoggingUrl(This,url) (This)->lpVtbl->AddLoggingUrl(This,url)
#define IWMReaderNetworkConfig_GetLoggingUrl(This,index,url,size) (This)->lpVtbl->GetLoggingUrl(This,index,url,size)
#define IWMReaderNetworkConfig_GetLoggingUrlCount(This,count) (This)->lpVtbl->GetLoggingUrlCount(This,count)
#define IWMReaderNetworkConfig_ResetLoggingUrlList(This) (This)->lpVtbl->ResetLoggingUrlList(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderNetworkConfig_QueryInterface(IWMReaderNetworkConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderNetworkConfig_AddRef(IWMReaderNetworkConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderNetworkConfig_Release(IWMReaderNetworkConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderNetworkConfig methods ***/
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetBufferingTime(IWMReaderNetworkConfig* This,QWORD *buffering_time) {
    return This->lpVtbl->GetBufferingTime(This,buffering_time);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetBufferingTime(IWMReaderNetworkConfig* This,QWORD buffering_time) {
    return This->lpVtbl->SetBufferingTime(This,buffering_time);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetUDPPortRanges(IWMReaderNetworkConfig* This,WM_PORT_NUMBER_RANGE *array,DWORD *ranges) {
    return This->lpVtbl->GetUDPPortRanges(This,array,ranges);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetUDPPortRanges(IWMReaderNetworkConfig* This,WM_PORT_NUMBER_RANGE *array,DWORD ranges) {
    return This->lpVtbl->SetUDPPortRanges(This,array,ranges);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetProxySettings(IWMReaderNetworkConfig* This,const WCHAR *protocol,WMT_PROXY_SETTINGS *proxy) {
    return This->lpVtbl->GetProxySettings(This,protocol,proxy);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetProxySettings(IWMReaderNetworkConfig* This,LPCWSTR protocol,WMT_PROXY_SETTINGS proxy) {
    return This->lpVtbl->SetProxySettings(This,protocol,proxy);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetProxyHostName(IWMReaderNetworkConfig* This,const WCHAR *protocol,WCHAR *hostname,DWORD *size) {
    return This->lpVtbl->GetProxyHostName(This,protocol,hostname,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetProxyHostName(IWMReaderNetworkConfig* This,const WCHAR *protocol,const WCHAR *hostname) {
    return This->lpVtbl->SetProxyHostName(This,protocol,hostname);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetProxyPort(IWMReaderNetworkConfig* This,const WCHAR *protocol,DWORD *port) {
    return This->lpVtbl->GetProxyPort(This,protocol,port);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetProxyPort(IWMReaderNetworkConfig* This,const WCHAR *protocol,DWORD port) {
    return This->lpVtbl->SetProxyPort(This,protocol,port);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetProxyExceptionList(IWMReaderNetworkConfig* This,const WCHAR *protocol,WCHAR *exceptions,DWORD *count) {
    return This->lpVtbl->GetProxyExceptionList(This,protocol,exceptions,count);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetProxyExceptionList(IWMReaderNetworkConfig* This,const WCHAR *protocol,const WCHAR *exceptions) {
    return This->lpVtbl->SetProxyExceptionList(This,protocol,exceptions);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetProxyBypassForLocal(IWMReaderNetworkConfig* This,const WCHAR *protocol,WINBOOL *bypass) {
    return This->lpVtbl->GetProxyBypassForLocal(This,protocol,bypass);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetProxyBypassForLocal(IWMReaderNetworkConfig* This,const WCHAR *protocol,WINBOOL bypass) {
    return This->lpVtbl->SetProxyBypassForLocal(This,protocol,bypass);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetForceRerunAutoProxyDetection(IWMReaderNetworkConfig* This,WINBOOL *detection) {
    return This->lpVtbl->GetForceRerunAutoProxyDetection(This,detection);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetForceRerunAutoProxyDetection(IWMReaderNetworkConfig* This,WINBOOL detection) {
    return This->lpVtbl->SetForceRerunAutoProxyDetection(This,detection);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetEnableMulticast(IWMReaderNetworkConfig* This,WINBOOL *multicast) {
    return This->lpVtbl->GetEnableMulticast(This,multicast);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetEnableMulticast(IWMReaderNetworkConfig* This,WINBOOL multicast) {
    return This->lpVtbl->SetEnableMulticast(This,multicast);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetEnableHTTP(IWMReaderNetworkConfig* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableHTTP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetEnableHTTP(IWMReaderNetworkConfig* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableHTTP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetEnableUDP(IWMReaderNetworkConfig* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableUDP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetEnableUDP(IWMReaderNetworkConfig* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableUDP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetEnableTCP(IWMReaderNetworkConfig* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableTCP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetEnableTCP(IWMReaderNetworkConfig* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableTCP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_ResetProtocolRollover(IWMReaderNetworkConfig* This) {
    return This->lpVtbl->ResetProtocolRollover(This);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetConnectionBandwidth(IWMReaderNetworkConfig* This,DWORD *bandwidth) {
    return This->lpVtbl->GetConnectionBandwidth(This,bandwidth);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_SetConnectionBandwidth(IWMReaderNetworkConfig* This,DWORD bandwidth) {
    return This->lpVtbl->SetConnectionBandwidth(This,bandwidth);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetNumProtocolsSupported(IWMReaderNetworkConfig* This,DWORD *protocols) {
    return This->lpVtbl->GetNumProtocolsSupported(This,protocols);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetSupportedProtocolName(IWMReaderNetworkConfig* This,DWORD protocol_num,WCHAR *protocol,DWORD *size) {
    return This->lpVtbl->GetSupportedProtocolName(This,protocol_num,protocol,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_AddLoggingUrl(IWMReaderNetworkConfig* This,const WCHAR *url) {
    return This->lpVtbl->AddLoggingUrl(This,url);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetLoggingUrl(IWMReaderNetworkConfig* This,DWORD index,WCHAR *url,DWORD *size) {
    return This->lpVtbl->GetLoggingUrl(This,index,url,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_GetLoggingUrlCount(IWMReaderNetworkConfig* This,DWORD *count) {
    return This->lpVtbl->GetLoggingUrlCount(This,count);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig_ResetLoggingUrlList(IWMReaderNetworkConfig* This) {
    return This->lpVtbl->ResetLoggingUrlList(This);
}
#endif
#endif

#endif


#endif  /* __IWMReaderNetworkConfig_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderNetworkConfig2 interface
 */
#ifndef __IWMReaderNetworkConfig2_INTERFACE_DEFINED__
#define __IWMReaderNetworkConfig2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderNetworkConfig2, 0xd979a853, 0x042b, 0x4050, 0x83,0x87, 0xc9,0x39,0xdb,0x22,0x01,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d979a853-042b-4050-8387-c939db22013f")
IWMReaderNetworkConfig2 : public IWMReaderNetworkConfig
{
    virtual HRESULT STDMETHODCALLTYPE GetEnableContentCaching(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableContentCaching(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableFastCache(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableFastCache(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAcceleratedStreamingDuration(
        QWORD *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAcceleratedStreamingDuration(
        QWORD duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAutoReconnectLimit(
        DWORD *limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAutoReconnectLimit(
        DWORD limit) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableResends(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableResends(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnableThinning(
        WINBOOL *enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEnableThinning(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxNetPacketSize(
        DWORD *packet_size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderNetworkConfig2, 0xd979a853, 0x042b, 0x4050, 0x83,0x87, 0xc9,0x39,0xdb,0x22,0x01,0x3f)
#endif
#else
typedef struct IWMReaderNetworkConfig2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderNetworkConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBufferingTime)(
        IWMReaderNetworkConfig2 *This,
        QWORD *buffering_time);

    HRESULT (STDMETHODCALLTYPE *SetBufferingTime)(
        IWMReaderNetworkConfig2 *This,
        QWORD buffering_time);

    HRESULT (STDMETHODCALLTYPE *GetUDPPortRanges)(
        IWMReaderNetworkConfig2 *This,
        WM_PORT_NUMBER_RANGE *array,
        DWORD *ranges);

    HRESULT (STDMETHODCALLTYPE *SetUDPPortRanges)(
        IWMReaderNetworkConfig2 *This,
        WM_PORT_NUMBER_RANGE *array,
        DWORD ranges);

    HRESULT (STDMETHODCALLTYPE *GetProxySettings)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        WMT_PROXY_SETTINGS *proxy);

    HRESULT (STDMETHODCALLTYPE *SetProxySettings)(
        IWMReaderNetworkConfig2 *This,
        LPCWSTR protocol,
        WMT_PROXY_SETTINGS proxy);

    HRESULT (STDMETHODCALLTYPE *GetProxyHostName)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        WCHAR *hostname,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetProxyHostName)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        const WCHAR *hostname);

    HRESULT (STDMETHODCALLTYPE *GetProxyPort)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        DWORD *port);

    HRESULT (STDMETHODCALLTYPE *SetProxyPort)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        DWORD port);

    HRESULT (STDMETHODCALLTYPE *GetProxyExceptionList)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        WCHAR *exceptions,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *SetProxyExceptionList)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        const WCHAR *exceptions);

    HRESULT (STDMETHODCALLTYPE *GetProxyBypassForLocal)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        WINBOOL *bypass);

    HRESULT (STDMETHODCALLTYPE *SetProxyBypassForLocal)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *protocol,
        WINBOOL bypass);

    HRESULT (STDMETHODCALLTYPE *GetForceRerunAutoProxyDetection)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *detection);

    HRESULT (STDMETHODCALLTYPE *SetForceRerunAutoProxyDetection)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL detection);

    HRESULT (STDMETHODCALLTYPE *GetEnableMulticast)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *multicast);

    HRESULT (STDMETHODCALLTYPE *SetEnableMulticast)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL multicast);

    HRESULT (STDMETHODCALLTYPE *GetEnableHTTP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableHTTP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableUDP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableUDP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableTCP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableTCP)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *ResetProtocolRollover)(
        IWMReaderNetworkConfig2 *This);

    HRESULT (STDMETHODCALLTYPE *GetConnectionBandwidth)(
        IWMReaderNetworkConfig2 *This,
        DWORD *bandwidth);

    HRESULT (STDMETHODCALLTYPE *SetConnectionBandwidth)(
        IWMReaderNetworkConfig2 *This,
        DWORD bandwidth);

    HRESULT (STDMETHODCALLTYPE *GetNumProtocolsSupported)(
        IWMReaderNetworkConfig2 *This,
        DWORD *protocols);

    HRESULT (STDMETHODCALLTYPE *GetSupportedProtocolName)(
        IWMReaderNetworkConfig2 *This,
        DWORD protocol_num,
        WCHAR *protocol,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *AddLoggingUrl)(
        IWMReaderNetworkConfig2 *This,
        const WCHAR *url);

    HRESULT (STDMETHODCALLTYPE *GetLoggingUrl)(
        IWMReaderNetworkConfig2 *This,
        DWORD index,
        WCHAR *url,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *GetLoggingUrlCount)(
        IWMReaderNetworkConfig2 *This,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *ResetLoggingUrlList)(
        IWMReaderNetworkConfig2 *This);

    /*** IWMReaderNetworkConfig2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEnableContentCaching)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableContentCaching)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableFastCache)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableFastCache)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetAcceleratedStreamingDuration)(
        IWMReaderNetworkConfig2 *This,
        QWORD *duration);

    HRESULT (STDMETHODCALLTYPE *SetAcceleratedStreamingDuration)(
        IWMReaderNetworkConfig2 *This,
        QWORD duration);

    HRESULT (STDMETHODCALLTYPE *GetAutoReconnectLimit)(
        IWMReaderNetworkConfig2 *This,
        DWORD *limit);

    HRESULT (STDMETHODCALLTYPE *SetAutoReconnectLimit)(
        IWMReaderNetworkConfig2 *This,
        DWORD limit);

    HRESULT (STDMETHODCALLTYPE *GetEnableResends)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableResends)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetEnableThinning)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL *enable);

    HRESULT (STDMETHODCALLTYPE *SetEnableThinning)(
        IWMReaderNetworkConfig2 *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetMaxNetPacketSize)(
        IWMReaderNetworkConfig2 *This,
        DWORD *packet_size);

    END_INTERFACE
} IWMReaderNetworkConfig2Vtbl;

interface IWMReaderNetworkConfig2 {
    CONST_VTBL IWMReaderNetworkConfig2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderNetworkConfig2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderNetworkConfig2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderNetworkConfig2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderNetworkConfig methods ***/
#define IWMReaderNetworkConfig2_GetBufferingTime(This,buffering_time) (This)->lpVtbl->GetBufferingTime(This,buffering_time)
#define IWMReaderNetworkConfig2_SetBufferingTime(This,buffering_time) (This)->lpVtbl->SetBufferingTime(This,buffering_time)
#define IWMReaderNetworkConfig2_GetUDPPortRanges(This,array,ranges) (This)->lpVtbl->GetUDPPortRanges(This,array,ranges)
#define IWMReaderNetworkConfig2_SetUDPPortRanges(This,array,ranges) (This)->lpVtbl->SetUDPPortRanges(This,array,ranges)
#define IWMReaderNetworkConfig2_GetProxySettings(This,protocol,proxy) (This)->lpVtbl->GetProxySettings(This,protocol,proxy)
#define IWMReaderNetworkConfig2_SetProxySettings(This,protocol,proxy) (This)->lpVtbl->SetProxySettings(This,protocol,proxy)
#define IWMReaderNetworkConfig2_GetProxyHostName(This,protocol,hostname,size) (This)->lpVtbl->GetProxyHostName(This,protocol,hostname,size)
#define IWMReaderNetworkConfig2_SetProxyHostName(This,protocol,hostname) (This)->lpVtbl->SetProxyHostName(This,protocol,hostname)
#define IWMReaderNetworkConfig2_GetProxyPort(This,protocol,port) (This)->lpVtbl->GetProxyPort(This,protocol,port)
#define IWMReaderNetworkConfig2_SetProxyPort(This,protocol,port) (This)->lpVtbl->SetProxyPort(This,protocol,port)
#define IWMReaderNetworkConfig2_GetProxyExceptionList(This,protocol,exceptions,count) (This)->lpVtbl->GetProxyExceptionList(This,protocol,exceptions,count)
#define IWMReaderNetworkConfig2_SetProxyExceptionList(This,protocol,exceptions) (This)->lpVtbl->SetProxyExceptionList(This,protocol,exceptions)
#define IWMReaderNetworkConfig2_GetProxyBypassForLocal(This,protocol,bypass) (This)->lpVtbl->GetProxyBypassForLocal(This,protocol,bypass)
#define IWMReaderNetworkConfig2_SetProxyBypassForLocal(This,protocol,bypass) (This)->lpVtbl->SetProxyBypassForLocal(This,protocol,bypass)
#define IWMReaderNetworkConfig2_GetForceRerunAutoProxyDetection(This,detection) (This)->lpVtbl->GetForceRerunAutoProxyDetection(This,detection)
#define IWMReaderNetworkConfig2_SetForceRerunAutoProxyDetection(This,detection) (This)->lpVtbl->SetForceRerunAutoProxyDetection(This,detection)
#define IWMReaderNetworkConfig2_GetEnableMulticast(This,multicast) (This)->lpVtbl->GetEnableMulticast(This,multicast)
#define IWMReaderNetworkConfig2_SetEnableMulticast(This,multicast) (This)->lpVtbl->SetEnableMulticast(This,multicast)
#define IWMReaderNetworkConfig2_GetEnableHTTP(This,enable) (This)->lpVtbl->GetEnableHTTP(This,enable)
#define IWMReaderNetworkConfig2_SetEnableHTTP(This,enable) (This)->lpVtbl->SetEnableHTTP(This,enable)
#define IWMReaderNetworkConfig2_GetEnableUDP(This,enable) (This)->lpVtbl->GetEnableUDP(This,enable)
#define IWMReaderNetworkConfig2_SetEnableUDP(This,enable) (This)->lpVtbl->SetEnableUDP(This,enable)
#define IWMReaderNetworkConfig2_GetEnableTCP(This,enable) (This)->lpVtbl->GetEnableTCP(This,enable)
#define IWMReaderNetworkConfig2_SetEnableTCP(This,enable) (This)->lpVtbl->SetEnableTCP(This,enable)
#define IWMReaderNetworkConfig2_ResetProtocolRollover(This) (This)->lpVtbl->ResetProtocolRollover(This)
#define IWMReaderNetworkConfig2_GetConnectionBandwidth(This,bandwidth) (This)->lpVtbl->GetConnectionBandwidth(This,bandwidth)
#define IWMReaderNetworkConfig2_SetConnectionBandwidth(This,bandwidth) (This)->lpVtbl->SetConnectionBandwidth(This,bandwidth)
#define IWMReaderNetworkConfig2_GetNumProtocolsSupported(This,protocols) (This)->lpVtbl->GetNumProtocolsSupported(This,protocols)
#define IWMReaderNetworkConfig2_GetSupportedProtocolName(This,protocol_num,protocol,size) (This)->lpVtbl->GetSupportedProtocolName(This,protocol_num,protocol,size)
#define IWMReaderNetworkConfig2_AddLoggingUrl(This,url) (This)->lpVtbl->AddLoggingUrl(This,url)
#define IWMReaderNetworkConfig2_GetLoggingUrl(This,index,url,size) (This)->lpVtbl->GetLoggingUrl(This,index,url,size)
#define IWMReaderNetworkConfig2_GetLoggingUrlCount(This,count) (This)->lpVtbl->GetLoggingUrlCount(This,count)
#define IWMReaderNetworkConfig2_ResetLoggingUrlList(This) (This)->lpVtbl->ResetLoggingUrlList(This)
/*** IWMReaderNetworkConfig2 methods ***/
#define IWMReaderNetworkConfig2_GetEnableContentCaching(This,enable) (This)->lpVtbl->GetEnableContentCaching(This,enable)
#define IWMReaderNetworkConfig2_SetEnableContentCaching(This,enable) (This)->lpVtbl->SetEnableContentCaching(This,enable)
#define IWMReaderNetworkConfig2_GetEnableFastCache(This,enable) (This)->lpVtbl->GetEnableFastCache(This,enable)
#define IWMReaderNetworkConfig2_SetEnableFastCache(This,enable) (This)->lpVtbl->SetEnableFastCache(This,enable)
#define IWMReaderNetworkConfig2_GetAcceleratedStreamingDuration(This,duration) (This)->lpVtbl->GetAcceleratedStreamingDuration(This,duration)
#define IWMReaderNetworkConfig2_SetAcceleratedStreamingDuration(This,duration) (This)->lpVtbl->SetAcceleratedStreamingDuration(This,duration)
#define IWMReaderNetworkConfig2_GetAutoReconnectLimit(This,limit) (This)->lpVtbl->GetAutoReconnectLimit(This,limit)
#define IWMReaderNetworkConfig2_SetAutoReconnectLimit(This,limit) (This)->lpVtbl->SetAutoReconnectLimit(This,limit)
#define IWMReaderNetworkConfig2_GetEnableResends(This,enable) (This)->lpVtbl->GetEnableResends(This,enable)
#define IWMReaderNetworkConfig2_SetEnableResends(This,enable) (This)->lpVtbl->SetEnableResends(This,enable)
#define IWMReaderNetworkConfig2_GetEnableThinning(This,enable) (This)->lpVtbl->GetEnableThinning(This,enable)
#define IWMReaderNetworkConfig2_SetEnableThinning(This,enable) (This)->lpVtbl->SetEnableThinning(This,enable)
#define IWMReaderNetworkConfig2_GetMaxNetPacketSize(This,packet_size) (This)->lpVtbl->GetMaxNetPacketSize(This,packet_size)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_QueryInterface(IWMReaderNetworkConfig2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderNetworkConfig2_AddRef(IWMReaderNetworkConfig2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderNetworkConfig2_Release(IWMReaderNetworkConfig2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderNetworkConfig methods ***/
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetBufferingTime(IWMReaderNetworkConfig2* This,QWORD *buffering_time) {
    return This->lpVtbl->GetBufferingTime(This,buffering_time);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetBufferingTime(IWMReaderNetworkConfig2* This,QWORD buffering_time) {
    return This->lpVtbl->SetBufferingTime(This,buffering_time);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetUDPPortRanges(IWMReaderNetworkConfig2* This,WM_PORT_NUMBER_RANGE *array,DWORD *ranges) {
    return This->lpVtbl->GetUDPPortRanges(This,array,ranges);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetUDPPortRanges(IWMReaderNetworkConfig2* This,WM_PORT_NUMBER_RANGE *array,DWORD ranges) {
    return This->lpVtbl->SetUDPPortRanges(This,array,ranges);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetProxySettings(IWMReaderNetworkConfig2* This,const WCHAR *protocol,WMT_PROXY_SETTINGS *proxy) {
    return This->lpVtbl->GetProxySettings(This,protocol,proxy);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetProxySettings(IWMReaderNetworkConfig2* This,LPCWSTR protocol,WMT_PROXY_SETTINGS proxy) {
    return This->lpVtbl->SetProxySettings(This,protocol,proxy);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetProxyHostName(IWMReaderNetworkConfig2* This,const WCHAR *protocol,WCHAR *hostname,DWORD *size) {
    return This->lpVtbl->GetProxyHostName(This,protocol,hostname,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetProxyHostName(IWMReaderNetworkConfig2* This,const WCHAR *protocol,const WCHAR *hostname) {
    return This->lpVtbl->SetProxyHostName(This,protocol,hostname);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetProxyPort(IWMReaderNetworkConfig2* This,const WCHAR *protocol,DWORD *port) {
    return This->lpVtbl->GetProxyPort(This,protocol,port);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetProxyPort(IWMReaderNetworkConfig2* This,const WCHAR *protocol,DWORD port) {
    return This->lpVtbl->SetProxyPort(This,protocol,port);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetProxyExceptionList(IWMReaderNetworkConfig2* This,const WCHAR *protocol,WCHAR *exceptions,DWORD *count) {
    return This->lpVtbl->GetProxyExceptionList(This,protocol,exceptions,count);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetProxyExceptionList(IWMReaderNetworkConfig2* This,const WCHAR *protocol,const WCHAR *exceptions) {
    return This->lpVtbl->SetProxyExceptionList(This,protocol,exceptions);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetProxyBypassForLocal(IWMReaderNetworkConfig2* This,const WCHAR *protocol,WINBOOL *bypass) {
    return This->lpVtbl->GetProxyBypassForLocal(This,protocol,bypass);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetProxyBypassForLocal(IWMReaderNetworkConfig2* This,const WCHAR *protocol,WINBOOL bypass) {
    return This->lpVtbl->SetProxyBypassForLocal(This,protocol,bypass);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetForceRerunAutoProxyDetection(IWMReaderNetworkConfig2* This,WINBOOL *detection) {
    return This->lpVtbl->GetForceRerunAutoProxyDetection(This,detection);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetForceRerunAutoProxyDetection(IWMReaderNetworkConfig2* This,WINBOOL detection) {
    return This->lpVtbl->SetForceRerunAutoProxyDetection(This,detection);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableMulticast(IWMReaderNetworkConfig2* This,WINBOOL *multicast) {
    return This->lpVtbl->GetEnableMulticast(This,multicast);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableMulticast(IWMReaderNetworkConfig2* This,WINBOOL multicast) {
    return This->lpVtbl->SetEnableMulticast(This,multicast);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableHTTP(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableHTTP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableHTTP(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableHTTP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableUDP(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableUDP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableUDP(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableUDP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableTCP(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableTCP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableTCP(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableTCP(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_ResetProtocolRollover(IWMReaderNetworkConfig2* This) {
    return This->lpVtbl->ResetProtocolRollover(This);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetConnectionBandwidth(IWMReaderNetworkConfig2* This,DWORD *bandwidth) {
    return This->lpVtbl->GetConnectionBandwidth(This,bandwidth);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetConnectionBandwidth(IWMReaderNetworkConfig2* This,DWORD bandwidth) {
    return This->lpVtbl->SetConnectionBandwidth(This,bandwidth);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetNumProtocolsSupported(IWMReaderNetworkConfig2* This,DWORD *protocols) {
    return This->lpVtbl->GetNumProtocolsSupported(This,protocols);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetSupportedProtocolName(IWMReaderNetworkConfig2* This,DWORD protocol_num,WCHAR *protocol,DWORD *size) {
    return This->lpVtbl->GetSupportedProtocolName(This,protocol_num,protocol,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_AddLoggingUrl(IWMReaderNetworkConfig2* This,const WCHAR *url) {
    return This->lpVtbl->AddLoggingUrl(This,url);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetLoggingUrl(IWMReaderNetworkConfig2* This,DWORD index,WCHAR *url,DWORD *size) {
    return This->lpVtbl->GetLoggingUrl(This,index,url,size);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetLoggingUrlCount(IWMReaderNetworkConfig2* This,DWORD *count) {
    return This->lpVtbl->GetLoggingUrlCount(This,count);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_ResetLoggingUrlList(IWMReaderNetworkConfig2* This) {
    return This->lpVtbl->ResetLoggingUrlList(This);
}
/*** IWMReaderNetworkConfig2 methods ***/
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableContentCaching(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableContentCaching(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableContentCaching(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableContentCaching(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableFastCache(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableFastCache(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableFastCache(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableFastCache(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetAcceleratedStreamingDuration(IWMReaderNetworkConfig2* This,QWORD *duration) {
    return This->lpVtbl->GetAcceleratedStreamingDuration(This,duration);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetAcceleratedStreamingDuration(IWMReaderNetworkConfig2* This,QWORD duration) {
    return This->lpVtbl->SetAcceleratedStreamingDuration(This,duration);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetAutoReconnectLimit(IWMReaderNetworkConfig2* This,DWORD *limit) {
    return This->lpVtbl->GetAutoReconnectLimit(This,limit);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetAutoReconnectLimit(IWMReaderNetworkConfig2* This,DWORD limit) {
    return This->lpVtbl->SetAutoReconnectLimit(This,limit);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableResends(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableResends(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableResends(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableResends(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetEnableThinning(IWMReaderNetworkConfig2* This,WINBOOL *enable) {
    return This->lpVtbl->GetEnableThinning(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_SetEnableThinning(IWMReaderNetworkConfig2* This,WINBOOL enable) {
    return This->lpVtbl->SetEnableThinning(This,enable);
}
static FORCEINLINE HRESULT IWMReaderNetworkConfig2_GetMaxNetPacketSize(IWMReaderNetworkConfig2* This,DWORD *packet_size) {
    return This->lpVtbl->GetMaxNetPacketSize(This,packet_size);
}
#endif
#endif

#endif


#endif  /* __IWMReaderNetworkConfig2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderStreamClock interface
 */
#ifndef __IWMReaderStreamClock_INTERFACE_DEFINED__
#define __IWMReaderStreamClock_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderStreamClock, 0x96406bed, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("96406bed-2b2b-11d3-b36b-00c04f6108ff")
IWMReaderStreamClock : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTime(
        QWORD *now) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimer(
        QWORD when,
        void *param,
        DWORD *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE KillTimer(
        DWORD id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderStreamClock, 0x96406bed, 0x2b2b, 0x11d3, 0xb3,0x6b, 0x00,0xc0,0x4f,0x61,0x08,0xff)
#endif
#else
typedef struct IWMReaderStreamClockVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderStreamClock methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTime)(
        IWMReaderStreamClock *This,
        QWORD *now);

    HRESULT (STDMETHODCALLTYPE *SetTimer)(
        IWMReaderStreamClock *This,
        QWORD when,
        void *param,
        DWORD *id);

    HRESULT (STDMETHODCALLTYPE *KillTimer)(
        IWMReaderStreamClock *This,
        DWORD id);

    END_INTERFACE
} IWMReaderStreamClockVtbl;

interface IWMReaderStreamClock {
    CONST_VTBL IWMReaderStreamClockVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderStreamClock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderStreamClock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderStreamClock_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderStreamClock methods ***/
#define IWMReaderStreamClock_GetTime(This,now) (This)->lpVtbl->GetTime(This,now)
#define IWMReaderStreamClock_SetTimer(This,when,param,id) (This)->lpVtbl->SetTimer(This,when,param,id)
#define IWMReaderStreamClock_KillTimer(This,id) (This)->lpVtbl->KillTimer(This,id)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderStreamClock_QueryInterface(IWMReaderStreamClock* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderStreamClock_AddRef(IWMReaderStreamClock* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderStreamClock_Release(IWMReaderStreamClock* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderStreamClock methods ***/
static FORCEINLINE HRESULT IWMReaderStreamClock_GetTime(IWMReaderStreamClock* This,QWORD *now) {
    return This->lpVtbl->GetTime(This,now);
}
static FORCEINLINE HRESULT IWMReaderStreamClock_SetTimer(IWMReaderStreamClock* This,QWORD when,void *param,DWORD *id) {
    return This->lpVtbl->SetTimer(This,when,param,id);
}
static FORCEINLINE HRESULT IWMReaderStreamClock_KillTimer(IWMReaderStreamClock* This,DWORD id) {
    return This->lpVtbl->KillTimer(This,id);
}
#endif
#endif

#endif


#endif  /* __IWMReaderStreamClock_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPacketSize interface
 */
#ifndef __IWMPacketSize_INTERFACE_DEFINED__
#define __IWMPacketSize_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPacketSize, 0xcdfb97ab, 0x188f, 0x40b3, 0xb6,0x43, 0x5b,0x79,0x03,0x97,0x5c,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cdfb97ab-188f-40b3-b643-5b7903975c59")
IWMPacketSize : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMaxPacketSize(
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMaxPacketSize(
        DWORD size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPacketSize, 0xcdfb97ab, 0x188f, 0x40b3, 0xb6,0x43, 0x5b,0x79,0x03,0x97,0x5c,0x59)
#endif
#else
typedef struct IWMPacketSizeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPacketSize methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMaxPacketSize)(
        IWMPacketSize *This,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetMaxPacketSize)(
        IWMPacketSize *This,
        DWORD size);

    END_INTERFACE
} IWMPacketSizeVtbl;

interface IWMPacketSize {
    CONST_VTBL IWMPacketSizeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPacketSize_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPacketSize_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPacketSize_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPacketSize methods ***/
#define IWMPacketSize_GetMaxPacketSize(This,size) (This)->lpVtbl->GetMaxPacketSize(This,size)
#define IWMPacketSize_SetMaxPacketSize(This,size) (This)->lpVtbl->SetMaxPacketSize(This,size)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMPacketSize_QueryInterface(IWMPacketSize* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPacketSize_AddRef(IWMPacketSize* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPacketSize_Release(IWMPacketSize* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPacketSize methods ***/
static FORCEINLINE HRESULT IWMPacketSize_GetMaxPacketSize(IWMPacketSize* This,DWORD *size) {
    return This->lpVtbl->GetMaxPacketSize(This,size);
}
static FORCEINLINE HRESULT IWMPacketSize_SetMaxPacketSize(IWMPacketSize* This,DWORD size) {
    return This->lpVtbl->SetMaxPacketSize(This,size);
}
#endif
#endif

#endif


#endif  /* __IWMPacketSize_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPacketSize2 interface
 */
#ifndef __IWMPacketSize2_INTERFACE_DEFINED__
#define __IWMPacketSize2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPacketSize2, 0x8bfc2b9e, 0xb646, 0x4233, 0xa8,0x77, 0x1c,0x6a,0x07,0x96,0x69,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bfc2b9e-b646-4233-a877-1c6a079669dc")
IWMPacketSize2 : public IWMPacketSize
{
    virtual HRESULT STDMETHODCALLTYPE GetMinPacketSize(
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMinPacketSize(
        DWORD size) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPacketSize2, 0x8bfc2b9e, 0xb646, 0x4233, 0xa8,0x77, 0x1c,0x6a,0x07,0x96,0x69,0xdc)
#endif
#else
typedef struct IWMPacketSize2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPacketSize methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMaxPacketSize)(
        IWMPacketSize2 *This,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetMaxPacketSize)(
        IWMPacketSize2 *This,
        DWORD size);

    /*** IWMPacketSize2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMinPacketSize)(
        IWMPacketSize2 *This,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetMinPacketSize)(
        IWMPacketSize2 *This,
        DWORD size);

    END_INTERFACE
} IWMPacketSize2Vtbl;

interface IWMPacketSize2 {
    CONST_VTBL IWMPacketSize2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPacketSize2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPacketSize2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPacketSize2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPacketSize methods ***/
#define IWMPacketSize2_GetMaxPacketSize(This,size) (This)->lpVtbl->GetMaxPacketSize(This,size)
#define IWMPacketSize2_SetMaxPacketSize(This,size) (This)->lpVtbl->SetMaxPacketSize(This,size)
/*** IWMPacketSize2 methods ***/
#define IWMPacketSize2_GetMinPacketSize(This,size) (This)->lpVtbl->GetMinPacketSize(This,size)
#define IWMPacketSize2_SetMinPacketSize(This,size) (This)->lpVtbl->SetMinPacketSize(This,size)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMPacketSize2_QueryInterface(IWMPacketSize2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPacketSize2_AddRef(IWMPacketSize2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPacketSize2_Release(IWMPacketSize2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPacketSize methods ***/
static FORCEINLINE HRESULT IWMPacketSize2_GetMaxPacketSize(IWMPacketSize2* This,DWORD *size) {
    return This->lpVtbl->GetMaxPacketSize(This,size);
}
static FORCEINLINE HRESULT IWMPacketSize2_SetMaxPacketSize(IWMPacketSize2* This,DWORD size) {
    return This->lpVtbl->SetMaxPacketSize(This,size);
}
/*** IWMPacketSize2 methods ***/
static FORCEINLINE HRESULT IWMPacketSize2_GetMinPacketSize(IWMPacketSize2* This,DWORD *size) {
    return This->lpVtbl->GetMinPacketSize(This,size);
}
static FORCEINLINE HRESULT IWMPacketSize2_SetMinPacketSize(IWMPacketSize2* This,DWORD size) {
    return This->lpVtbl->SetMinPacketSize(This,size);
}
#endif
#endif

#endif


#endif  /* __IWMPacketSize2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMDRMReader interface
 */
#ifndef __IWMDRMReader_INTERFACE_DEFINED__
#define __IWMDRMReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMDRMReader, 0xd2827540, 0x3ee7, 0x432c, 0xb1,0x4c, 0xdc,0x17,0xf0,0x85,0xd3,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2827540-3ee7-432c-b14c-dc17f085d3b3")
IWMDRMReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AcquireLicense(
        DWORD flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelLicenseAcquisition(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Individualize(
        DWORD flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelIndividualization(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE MonitorLicenseAcquisition(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelMonitorLicenseAcquisition(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDRMProperty(
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDRMProperty(
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMDRMReader, 0xd2827540, 0x3ee7, 0x432c, 0xb1,0x4c, 0xdc,0x17,0xf0,0x85,0xd3,0xb3)
#endif
#else
typedef struct IWMDRMReaderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMDRMReader methods ***/
    HRESULT (STDMETHODCALLTYPE *AcquireLicense)(
        IWMDRMReader *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelLicenseAcquisition)(
        IWMDRMReader *This);

    HRESULT (STDMETHODCALLTYPE *Individualize)(
        IWMDRMReader *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelIndividualization)(
        IWMDRMReader *This);

    HRESULT (STDMETHODCALLTYPE *MonitorLicenseAcquisition)(
        IWMDRMReader *This);

    HRESULT (STDMETHODCALLTYPE *CancelMonitorLicenseAcquisition)(
        IWMDRMReader *This);

    HRESULT (STDMETHODCALLTYPE *SetDRMProperty)(
        IWMDRMReader *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetDRMProperty)(
        IWMDRMReader *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    END_INTERFACE
} IWMDRMReaderVtbl;

interface IWMDRMReader {
    CONST_VTBL IWMDRMReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMDRMReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMDRMReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMDRMReader_Release(This) (This)->lpVtbl->Release(This)
/*** IWMDRMReader methods ***/
#define IWMDRMReader_AcquireLicense(This,flags) (This)->lpVtbl->AcquireLicense(This,flags)
#define IWMDRMReader_CancelLicenseAcquisition(This) (This)->lpVtbl->CancelLicenseAcquisition(This)
#define IWMDRMReader_Individualize(This,flags) (This)->lpVtbl->Individualize(This,flags)
#define IWMDRMReader_CancelIndividualization(This) (This)->lpVtbl->CancelIndividualization(This)
#define IWMDRMReader_MonitorLicenseAcquisition(This) (This)->lpVtbl->MonitorLicenseAcquisition(This)
#define IWMDRMReader_CancelMonitorLicenseAcquisition(This) (This)->lpVtbl->CancelMonitorLicenseAcquisition(This)
#define IWMDRMReader_SetDRMProperty(This,name,type,value,length) (This)->lpVtbl->SetDRMProperty(This,name,type,value,length)
#define IWMDRMReader_GetDRMProperty(This,name,type,value,length) (This)->lpVtbl->GetDRMProperty(This,name,type,value,length)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMDRMReader_QueryInterface(IWMDRMReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMDRMReader_AddRef(IWMDRMReader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMDRMReader_Release(IWMDRMReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMDRMReader methods ***/
static FORCEINLINE HRESULT IWMDRMReader_AcquireLicense(IWMDRMReader* This,DWORD flags) {
    return This->lpVtbl->AcquireLicense(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader_CancelLicenseAcquisition(IWMDRMReader* This) {
    return This->lpVtbl->CancelLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader_Individualize(IWMDRMReader* This,DWORD flags) {
    return This->lpVtbl->Individualize(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader_CancelIndividualization(IWMDRMReader* This) {
    return This->lpVtbl->CancelIndividualization(This);
}
static FORCEINLINE HRESULT IWMDRMReader_MonitorLicenseAcquisition(IWMDRMReader* This) {
    return This->lpVtbl->MonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader_CancelMonitorLicenseAcquisition(IWMDRMReader* This) {
    return This->lpVtbl->CancelMonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader_SetDRMProperty(IWMDRMReader* This,const WCHAR *name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetDRMProperty(This,name,type,value,length);
}
static FORCEINLINE HRESULT IWMDRMReader_GetDRMProperty(IWMDRMReader* This,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetDRMProperty(This,name,type,value,length);
}
#endif
#endif

#endif


#endif  /* __IWMDRMReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMDRMReader2 interface
 */
#ifndef __IWMDRMReader2_INTERFACE_DEFINED__
#define __IWMDRMReader2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMDRMReader2, 0xbefe7a75, 0x9f1d, 0x4075, 0xb9,0xd9, 0xa3,0xc3,0x7b,0xda,0x49,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("befe7a75-9f1d-4075-b9d9-a3c37bda49a0")
IWMDRMReader2 : public IWMDRMReader
{
    virtual HRESULT STDMETHODCALLTYPE SetEvaluateOutputLevelLicenses(
        WINBOOL evaluate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayOutputLevels(
        DRM_PLAY_OPL *play,
        DWORD *length,
        DWORD *level) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCopyOutputLevels(
        DRM_COPY_OPL *copy,
        DWORD *length,
        DWORD *level) = 0;

    virtual HRESULT STDMETHODCALLTYPE TryNextLicense(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMDRMReader2, 0xbefe7a75, 0x9f1d, 0x4075, 0xb9,0xd9, 0xa3,0xc3,0x7b,0xda,0x49,0xa0)
#endif
#else
typedef struct IWMDRMReader2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMDRMReader methods ***/
    HRESULT (STDMETHODCALLTYPE *AcquireLicense)(
        IWMDRMReader2 *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelLicenseAcquisition)(
        IWMDRMReader2 *This);

    HRESULT (STDMETHODCALLTYPE *Individualize)(
        IWMDRMReader2 *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelIndividualization)(
        IWMDRMReader2 *This);

    HRESULT (STDMETHODCALLTYPE *MonitorLicenseAcquisition)(
        IWMDRMReader2 *This);

    HRESULT (STDMETHODCALLTYPE *CancelMonitorLicenseAcquisition)(
        IWMDRMReader2 *This);

    HRESULT (STDMETHODCALLTYPE *SetDRMProperty)(
        IWMDRMReader2 *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetDRMProperty)(
        IWMDRMReader2 *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    /*** IWMDRMReader2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetEvaluateOutputLevelLicenses)(
        IWMDRMReader2 *This,
        WINBOOL evaluate);

    HRESULT (STDMETHODCALLTYPE *GetPlayOutputLevels)(
        IWMDRMReader2 *This,
        DRM_PLAY_OPL *play,
        DWORD *length,
        DWORD *level);

    HRESULT (STDMETHODCALLTYPE *GetCopyOutputLevels)(
        IWMDRMReader2 *This,
        DRM_COPY_OPL *copy,
        DWORD *length,
        DWORD *level);

    HRESULT (STDMETHODCALLTYPE *TryNextLicense)(
        IWMDRMReader2 *This);

    END_INTERFACE
} IWMDRMReader2Vtbl;

interface IWMDRMReader2 {
    CONST_VTBL IWMDRMReader2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMDRMReader2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMDRMReader2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMDRMReader2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMDRMReader methods ***/
#define IWMDRMReader2_AcquireLicense(This,flags) (This)->lpVtbl->AcquireLicense(This,flags)
#define IWMDRMReader2_CancelLicenseAcquisition(This) (This)->lpVtbl->CancelLicenseAcquisition(This)
#define IWMDRMReader2_Individualize(This,flags) (This)->lpVtbl->Individualize(This,flags)
#define IWMDRMReader2_CancelIndividualization(This) (This)->lpVtbl->CancelIndividualization(This)
#define IWMDRMReader2_MonitorLicenseAcquisition(This) (This)->lpVtbl->MonitorLicenseAcquisition(This)
#define IWMDRMReader2_CancelMonitorLicenseAcquisition(This) (This)->lpVtbl->CancelMonitorLicenseAcquisition(This)
#define IWMDRMReader2_SetDRMProperty(This,name,type,value,length) (This)->lpVtbl->SetDRMProperty(This,name,type,value,length)
#define IWMDRMReader2_GetDRMProperty(This,name,type,value,length) (This)->lpVtbl->GetDRMProperty(This,name,type,value,length)
/*** IWMDRMReader2 methods ***/
#define IWMDRMReader2_SetEvaluateOutputLevelLicenses(This,evaluate) (This)->lpVtbl->SetEvaluateOutputLevelLicenses(This,evaluate)
#define IWMDRMReader2_GetPlayOutputLevels(This,play,length,level) (This)->lpVtbl->GetPlayOutputLevels(This,play,length,level)
#define IWMDRMReader2_GetCopyOutputLevels(This,copy,length,level) (This)->lpVtbl->GetCopyOutputLevels(This,copy,length,level)
#define IWMDRMReader2_TryNextLicense(This) (This)->lpVtbl->TryNextLicense(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMDRMReader2_QueryInterface(IWMDRMReader2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMDRMReader2_AddRef(IWMDRMReader2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMDRMReader2_Release(IWMDRMReader2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMDRMReader methods ***/
static FORCEINLINE HRESULT IWMDRMReader2_AcquireLicense(IWMDRMReader2* This,DWORD flags) {
    return This->lpVtbl->AcquireLicense(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader2_CancelLicenseAcquisition(IWMDRMReader2* This) {
    return This->lpVtbl->CancelLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader2_Individualize(IWMDRMReader2* This,DWORD flags) {
    return This->lpVtbl->Individualize(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader2_CancelIndividualization(IWMDRMReader2* This) {
    return This->lpVtbl->CancelIndividualization(This);
}
static FORCEINLINE HRESULT IWMDRMReader2_MonitorLicenseAcquisition(IWMDRMReader2* This) {
    return This->lpVtbl->MonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader2_CancelMonitorLicenseAcquisition(IWMDRMReader2* This) {
    return This->lpVtbl->CancelMonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader2_SetDRMProperty(IWMDRMReader2* This,const WCHAR *name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetDRMProperty(This,name,type,value,length);
}
static FORCEINLINE HRESULT IWMDRMReader2_GetDRMProperty(IWMDRMReader2* This,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetDRMProperty(This,name,type,value,length);
}
/*** IWMDRMReader2 methods ***/
static FORCEINLINE HRESULT IWMDRMReader2_SetEvaluateOutputLevelLicenses(IWMDRMReader2* This,WINBOOL evaluate) {
    return This->lpVtbl->SetEvaluateOutputLevelLicenses(This,evaluate);
}
static FORCEINLINE HRESULT IWMDRMReader2_GetPlayOutputLevels(IWMDRMReader2* This,DRM_PLAY_OPL *play,DWORD *length,DWORD *level) {
    return This->lpVtbl->GetPlayOutputLevels(This,play,length,level);
}
static FORCEINLINE HRESULT IWMDRMReader2_GetCopyOutputLevels(IWMDRMReader2* This,DRM_COPY_OPL *copy,DWORD *length,DWORD *level) {
    return This->lpVtbl->GetCopyOutputLevels(This,copy,length,level);
}
static FORCEINLINE HRESULT IWMDRMReader2_TryNextLicense(IWMDRMReader2* This) {
    return This->lpVtbl->TryNextLicense(This);
}
#endif
#endif

#endif


#endif  /* __IWMDRMReader2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMDRMReader3 interface
 */
#ifndef __IWMDRMReader3_INTERFACE_DEFINED__
#define __IWMDRMReader3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMDRMReader3, 0xe08672de, 0xf1e7, 0x4ff4, 0xa0,0xa3, 0xfc,0x4b,0x08,0xe4,0xca,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e08672de-f1e7-4ff4-a0a3-fc4b08e4caf8")
IWMDRMReader3 : public IWMDRMReader2
{
    virtual HRESULT STDMETHODCALLTYPE GetInclusionList(
        GUID **guids,
        DWORD *count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMDRMReader3, 0xe08672de, 0xf1e7, 0x4ff4, 0xa0,0xa3, 0xfc,0x4b,0x08,0xe4,0xca,0xf8)
#endif
#else
typedef struct IWMDRMReader3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMDRMReader methods ***/
    HRESULT (STDMETHODCALLTYPE *AcquireLicense)(
        IWMDRMReader3 *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelLicenseAcquisition)(
        IWMDRMReader3 *This);

    HRESULT (STDMETHODCALLTYPE *Individualize)(
        IWMDRMReader3 *This,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *CancelIndividualization)(
        IWMDRMReader3 *This);

    HRESULT (STDMETHODCALLTYPE *MonitorLicenseAcquisition)(
        IWMDRMReader3 *This);

    HRESULT (STDMETHODCALLTYPE *CancelMonitorLicenseAcquisition)(
        IWMDRMReader3 *This);

    HRESULT (STDMETHODCALLTYPE *SetDRMProperty)(
        IWMDRMReader3 *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        const BYTE *value,
        WORD length);

    HRESULT (STDMETHODCALLTYPE *GetDRMProperty)(
        IWMDRMReader3 *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        WORD *length);

    /*** IWMDRMReader2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetEvaluateOutputLevelLicenses)(
        IWMDRMReader3 *This,
        WINBOOL evaluate);

    HRESULT (STDMETHODCALLTYPE *GetPlayOutputLevels)(
        IWMDRMReader3 *This,
        DRM_PLAY_OPL *play,
        DWORD *length,
        DWORD *level);

    HRESULT (STDMETHODCALLTYPE *GetCopyOutputLevels)(
        IWMDRMReader3 *This,
        DRM_COPY_OPL *copy,
        DWORD *length,
        DWORD *level);

    HRESULT (STDMETHODCALLTYPE *TryNextLicense)(
        IWMDRMReader3 *This);

    /*** IWMDRMReader3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInclusionList)(
        IWMDRMReader3 *This,
        GUID **guids,
        DWORD *count);

    END_INTERFACE
} IWMDRMReader3Vtbl;

interface IWMDRMReader3 {
    CONST_VTBL IWMDRMReader3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMDRMReader3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMDRMReader3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMDRMReader3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMDRMReader methods ***/
#define IWMDRMReader3_AcquireLicense(This,flags) (This)->lpVtbl->AcquireLicense(This,flags)
#define IWMDRMReader3_CancelLicenseAcquisition(This) (This)->lpVtbl->CancelLicenseAcquisition(This)
#define IWMDRMReader3_Individualize(This,flags) (This)->lpVtbl->Individualize(This,flags)
#define IWMDRMReader3_CancelIndividualization(This) (This)->lpVtbl->CancelIndividualization(This)
#define IWMDRMReader3_MonitorLicenseAcquisition(This) (This)->lpVtbl->MonitorLicenseAcquisition(This)
#define IWMDRMReader3_CancelMonitorLicenseAcquisition(This) (This)->lpVtbl->CancelMonitorLicenseAcquisition(This)
#define IWMDRMReader3_SetDRMProperty(This,name,type,value,length) (This)->lpVtbl->SetDRMProperty(This,name,type,value,length)
#define IWMDRMReader3_GetDRMProperty(This,name,type,value,length) (This)->lpVtbl->GetDRMProperty(This,name,type,value,length)
/*** IWMDRMReader2 methods ***/
#define IWMDRMReader3_SetEvaluateOutputLevelLicenses(This,evaluate) (This)->lpVtbl->SetEvaluateOutputLevelLicenses(This,evaluate)
#define IWMDRMReader3_GetPlayOutputLevels(This,play,length,level) (This)->lpVtbl->GetPlayOutputLevels(This,play,length,level)
#define IWMDRMReader3_GetCopyOutputLevels(This,copy,length,level) (This)->lpVtbl->GetCopyOutputLevels(This,copy,length,level)
#define IWMDRMReader3_TryNextLicense(This) (This)->lpVtbl->TryNextLicense(This)
/*** IWMDRMReader3 methods ***/
#define IWMDRMReader3_GetInclusionList(This,guids,count) (This)->lpVtbl->GetInclusionList(This,guids,count)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMDRMReader3_QueryInterface(IWMDRMReader3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMDRMReader3_AddRef(IWMDRMReader3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMDRMReader3_Release(IWMDRMReader3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMDRMReader methods ***/
static FORCEINLINE HRESULT IWMDRMReader3_AcquireLicense(IWMDRMReader3* This,DWORD flags) {
    return This->lpVtbl->AcquireLicense(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader3_CancelLicenseAcquisition(IWMDRMReader3* This) {
    return This->lpVtbl->CancelLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader3_Individualize(IWMDRMReader3* This,DWORD flags) {
    return This->lpVtbl->Individualize(This,flags);
}
static FORCEINLINE HRESULT IWMDRMReader3_CancelIndividualization(IWMDRMReader3* This) {
    return This->lpVtbl->CancelIndividualization(This);
}
static FORCEINLINE HRESULT IWMDRMReader3_MonitorLicenseAcquisition(IWMDRMReader3* This) {
    return This->lpVtbl->MonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader3_CancelMonitorLicenseAcquisition(IWMDRMReader3* This) {
    return This->lpVtbl->CancelMonitorLicenseAcquisition(This);
}
static FORCEINLINE HRESULT IWMDRMReader3_SetDRMProperty(IWMDRMReader3* This,const WCHAR *name,WMT_ATTR_DATATYPE type,const BYTE *value,WORD length) {
    return This->lpVtbl->SetDRMProperty(This,name,type,value,length);
}
static FORCEINLINE HRESULT IWMDRMReader3_GetDRMProperty(IWMDRMReader3* This,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,WORD *length) {
    return This->lpVtbl->GetDRMProperty(This,name,type,value,length);
}
/*** IWMDRMReader2 methods ***/
static FORCEINLINE HRESULT IWMDRMReader3_SetEvaluateOutputLevelLicenses(IWMDRMReader3* This,WINBOOL evaluate) {
    return This->lpVtbl->SetEvaluateOutputLevelLicenses(This,evaluate);
}
static FORCEINLINE HRESULT IWMDRMReader3_GetPlayOutputLevels(IWMDRMReader3* This,DRM_PLAY_OPL *play,DWORD *length,DWORD *level) {
    return This->lpVtbl->GetPlayOutputLevels(This,play,length,level);
}
static FORCEINLINE HRESULT IWMDRMReader3_GetCopyOutputLevels(IWMDRMReader3* This,DRM_COPY_OPL *copy,DWORD *length,DWORD *level) {
    return This->lpVtbl->GetCopyOutputLevels(This,copy,length,level);
}
static FORCEINLINE HRESULT IWMDRMReader3_TryNextLicense(IWMDRMReader3* This) {
    return This->lpVtbl->TryNextLicense(This);
}
/*** IWMDRMReader3 methods ***/
static FORCEINLINE HRESULT IWMDRMReader3_GetInclusionList(IWMDRMReader3* This,GUID **guids,DWORD *count) {
    return This->lpVtbl->GetInclusionList(This,guids,count);
}
#endif
#endif

#endif


#endif  /* __IWMDRMReader3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderAccelerator interface
 */
#ifndef __IWMReaderAccelerator_INTERFACE_DEFINED__
#define __IWMReaderAccelerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderAccelerator, 0xbddc4d08, 0x944d, 0x4d52, 0xa6,0x12, 0x46,0xc3,0xfd,0xa0,0x7d,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bddc4d08-944d-4d52-a612-46c3fda07dd4")
IWMReaderAccelerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCodecInterface(
        DWORD output,
        REFIID riid,
        void **codec) = 0;

    virtual HRESULT STDMETHODCALLTYPE Notify(
        DWORD output,
        WM_MEDIA_TYPE *subtype) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderAccelerator, 0xbddc4d08, 0x944d, 0x4d52, 0xa6,0x12, 0x46,0xc3,0xfd,0xa0,0x7d,0xd4)
#endif
#else
typedef struct IWMReaderAcceleratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderAccelerator methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCodecInterface)(
        IWMReaderAccelerator *This,
        DWORD output,
        REFIID riid,
        void **codec);

    HRESULT (STDMETHODCALLTYPE *Notify)(
        IWMReaderAccelerator *This,
        DWORD output,
        WM_MEDIA_TYPE *subtype);

    END_INTERFACE
} IWMReaderAcceleratorVtbl;

interface IWMReaderAccelerator {
    CONST_VTBL IWMReaderAcceleratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderAccelerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderAccelerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderAccelerator_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderAccelerator methods ***/
#define IWMReaderAccelerator_GetCodecInterface(This,output,riid,codec) (This)->lpVtbl->GetCodecInterface(This,output,riid,codec)
#define IWMReaderAccelerator_Notify(This,output,subtype) (This)->lpVtbl->Notify(This,output,subtype)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderAccelerator_QueryInterface(IWMReaderAccelerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderAccelerator_AddRef(IWMReaderAccelerator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderAccelerator_Release(IWMReaderAccelerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderAccelerator methods ***/
static FORCEINLINE HRESULT IWMReaderAccelerator_GetCodecInterface(IWMReaderAccelerator* This,DWORD output,REFIID riid,void **codec) {
    return This->lpVtbl->GetCodecInterface(This,output,riid,codec);
}
static FORCEINLINE HRESULT IWMReaderAccelerator_Notify(IWMReaderAccelerator* This,DWORD output,WM_MEDIA_TYPE *subtype) {
    return This->lpVtbl->Notify(This,output,subtype);
}
#endif
#endif

#endif


#endif  /* __IWMReaderAccelerator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderTimecode interface
 */
#ifndef __IWMReaderTimecode_INTERFACE_DEFINED__
#define __IWMReaderTimecode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderTimecode, 0xf369e2f0, 0xe081, 0x4fe6, 0x84,0x50, 0xb8,0x10,0xb2,0xf4,0x10,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f369e2f0-e081-4fe6-8450-b810b2f410d1")
IWMReaderTimecode : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetTimecodeRangeCount(
        WORD num,
        WORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimecodeRangeBounds(
        WORD stream,
        WORD range,
        DWORD *start_timecode,
        DWORD *end_timecode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderTimecode, 0xf369e2f0, 0xe081, 0x4fe6, 0x84,0x50, 0xb8,0x10,0xb2,0xf4,0x10,0xd1)
#endif
#else
typedef struct IWMReaderTimecodeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderTimecode methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTimecodeRangeCount)(
        IWMReaderTimecode *This,
        WORD num,
        WORD *count);

    HRESULT (STDMETHODCALLTYPE *GetTimecodeRangeBounds)(
        IWMReaderTimecode *This,
        WORD stream,
        WORD range,
        DWORD *start_timecode,
        DWORD *end_timecode);

    END_INTERFACE
} IWMReaderTimecodeVtbl;

interface IWMReaderTimecode {
    CONST_VTBL IWMReaderTimecodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderTimecode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderTimecode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderTimecode_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderTimecode methods ***/
#define IWMReaderTimecode_GetTimecodeRangeCount(This,num,count) (This)->lpVtbl->GetTimecodeRangeCount(This,num,count)
#define IWMReaderTimecode_GetTimecodeRangeBounds(This,stream,range,start_timecode,end_timecode) (This)->lpVtbl->GetTimecodeRangeBounds(This,stream,range,start_timecode,end_timecode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderTimecode_QueryInterface(IWMReaderTimecode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderTimecode_AddRef(IWMReaderTimecode* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderTimecode_Release(IWMReaderTimecode* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderTimecode methods ***/
static FORCEINLINE HRESULT IWMReaderTimecode_GetTimecodeRangeCount(IWMReaderTimecode* This,WORD num,WORD *count) {
    return This->lpVtbl->GetTimecodeRangeCount(This,num,count);
}
static FORCEINLINE HRESULT IWMReaderTimecode_GetTimecodeRangeBounds(IWMReaderTimecode* This,WORD stream,WORD range,DWORD *start_timecode,DWORD *end_timecode) {
    return This->lpVtbl->GetTimecodeRangeBounds(This,stream,range,start_timecode,end_timecode);
}
#endif
#endif

#endif


#endif  /* __IWMReaderTimecode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderTypeNegotiation interface
 */
#ifndef __IWMReaderTypeNegotiation_INTERFACE_DEFINED__
#define __IWMReaderTypeNegotiation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderTypeNegotiation, 0xfdbe5592, 0x81a1, 0x41ea, 0x93,0xbd, 0x73,0x5c,0xad,0x1a,0xdc,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fdbe5592-81a1-41ea-93bd-735cad1adc05")
IWMReaderTypeNegotiation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE TryOutputProps(
        DWORD output,
        IWMOutputMediaProps *props) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderTypeNegotiation, 0xfdbe5592, 0x81a1, 0x41ea, 0x93,0xbd, 0x73,0x5c,0xad,0x1a,0xdc,0x05)
#endif
#else
typedef struct IWMReaderTypeNegotiationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderTypeNegotiation methods ***/
    HRESULT (STDMETHODCALLTYPE *TryOutputProps)(
        IWMReaderTypeNegotiation *This,
        DWORD output,
        IWMOutputMediaProps *props);

    END_INTERFACE
} IWMReaderTypeNegotiationVtbl;

interface IWMReaderTypeNegotiation {
    CONST_VTBL IWMReaderTypeNegotiationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderTypeNegotiation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderTypeNegotiation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderTypeNegotiation_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderTypeNegotiation methods ***/
#define IWMReaderTypeNegotiation_TryOutputProps(This,output,props) (This)->lpVtbl->TryOutputProps(This,output,props)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderTypeNegotiation_QueryInterface(IWMReaderTypeNegotiation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderTypeNegotiation_AddRef(IWMReaderTypeNegotiation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderTypeNegotiation_Release(IWMReaderTypeNegotiation* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderTypeNegotiation methods ***/
static FORCEINLINE HRESULT IWMReaderTypeNegotiation_TryOutputProps(IWMReaderTypeNegotiation* This,DWORD output,IWMOutputMediaProps *props) {
    return This->lpVtbl->TryOutputProps(This,output,props);
}
#endif
#endif

#endif


#endif  /* __IWMReaderTypeNegotiation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMLanguageList interface
 */
#ifndef __IWMLanguageList_INTERFACE_DEFINED__
#define __IWMLanguageList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMLanguageList, 0xdf683f00, 0x2d49, 0x4d8e, 0x92,0xb7, 0xfb,0x19,0xf6,0xa0,0xdc,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("df683f00-2d49-4d8e-92b7-fb19f6a0dc57")
IWMLanguageList : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLanguageCount(
        WORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguageDetails(
        WORD index,
        WCHAR *language,
        WORD *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddLanguageByRFC1766String(
        LPCWSTR_WMSDK_TYPE_SAFE language,
        WORD *index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMLanguageList, 0xdf683f00, 0x2d49, 0x4d8e, 0x92,0xb7, 0xfb,0x19,0xf6,0xa0,0xdc,0x57)
#endif
#else
typedef struct IWMLanguageListVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMLanguageList methods ***/
    HRESULT (STDMETHODCALLTYPE *GetLanguageCount)(
        IWMLanguageList *This,
        WORD *count);

    HRESULT (STDMETHODCALLTYPE *GetLanguageDetails)(
        IWMLanguageList *This,
        WORD index,
        WCHAR *language,
        WORD *length);

    HRESULT (STDMETHODCALLTYPE *AddLanguageByRFC1766String)(
        IWMLanguageList *This,
        LPCWSTR_WMSDK_TYPE_SAFE language,
        WORD *index);

    END_INTERFACE
} IWMLanguageListVtbl;

interface IWMLanguageList {
    CONST_VTBL IWMLanguageListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMLanguageList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMLanguageList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMLanguageList_Release(This) (This)->lpVtbl->Release(This)
/*** IWMLanguageList methods ***/
#define IWMLanguageList_GetLanguageCount(This,count) (This)->lpVtbl->GetLanguageCount(This,count)
#define IWMLanguageList_GetLanguageDetails(This,index,language,length) (This)->lpVtbl->GetLanguageDetails(This,index,language,length)
#define IWMLanguageList_AddLanguageByRFC1766String(This,language,index) (This)->lpVtbl->AddLanguageByRFC1766String(This,language,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMLanguageList_QueryInterface(IWMLanguageList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMLanguageList_AddRef(IWMLanguageList* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMLanguageList_Release(IWMLanguageList* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMLanguageList methods ***/
static FORCEINLINE HRESULT IWMLanguageList_GetLanguageCount(IWMLanguageList* This,WORD *count) {
    return This->lpVtbl->GetLanguageCount(This,count);
}
static FORCEINLINE HRESULT IWMLanguageList_GetLanguageDetails(IWMLanguageList* This,WORD index,WCHAR *language,WORD *length) {
    return This->lpVtbl->GetLanguageDetails(This,index,language,length);
}
static FORCEINLINE HRESULT IWMLanguageList_AddLanguageByRFC1766String(IWMLanguageList* This,LPCWSTR_WMSDK_TYPE_SAFE language,WORD *index) {
    return This->lpVtbl->AddLanguageByRFC1766String(This,language,index);
}
#endif
#endif

#endif


#endif  /* __IWMLanguageList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMReaderPlaylistBurn interface
 */
#ifndef __IWMReaderPlaylistBurn_INTERFACE_DEFINED__
#define __IWMReaderPlaylistBurn_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMReaderPlaylistBurn, 0xf28c0300, 0x9baa, 0x4477, 0xa8,0x46, 0x17,0x44,0xd9,0xcb,0xf5,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f28c0300-9baa-4477-a846-1744d9cbf533")
IWMReaderPlaylistBurn : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitPlaylistBurn(
        DWORD count,
        LPCWSTR_WMSDK_TYPE_SAFE *filenames,
        IWMStatusCallback *callback,
        void *context) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInitResults(
        DWORD count,
        HRESULT *stat) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndPlaylistBurn(
        HRESULT result) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMReaderPlaylistBurn, 0xf28c0300, 0x9baa, 0x4477, 0xa8,0x46, 0x17,0x44,0xd9,0xcb,0xf5,0x33)
#endif
#else
typedef struct IWMReaderPlaylistBurnVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMReaderPlaylistBurn methods ***/
    HRESULT (STDMETHODCALLTYPE *InitPlaylistBurn)(
        IWMReaderPlaylistBurn *This,
        DWORD count,
        LPCWSTR_WMSDK_TYPE_SAFE *filenames,
        IWMStatusCallback *callback,
        void *context);

    HRESULT (STDMETHODCALLTYPE *GetInitResults)(
        IWMReaderPlaylistBurn *This,
        DWORD count,
        HRESULT *stat);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        IWMReaderPlaylistBurn *This);

    HRESULT (STDMETHODCALLTYPE *EndPlaylistBurn)(
        IWMReaderPlaylistBurn *This,
        HRESULT result);

    END_INTERFACE
} IWMReaderPlaylistBurnVtbl;

interface IWMReaderPlaylistBurn {
    CONST_VTBL IWMReaderPlaylistBurnVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMReaderPlaylistBurn_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMReaderPlaylistBurn_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMReaderPlaylistBurn_Release(This) (This)->lpVtbl->Release(This)
/*** IWMReaderPlaylistBurn methods ***/
#define IWMReaderPlaylistBurn_InitPlaylistBurn(This,count,filenames,callback,context) (This)->lpVtbl->InitPlaylistBurn(This,count,filenames,callback,context)
#define IWMReaderPlaylistBurn_GetInitResults(This,count,stat) (This)->lpVtbl->GetInitResults(This,count,stat)
#define IWMReaderPlaylistBurn_Cancel(This) (This)->lpVtbl->Cancel(This)
#define IWMReaderPlaylistBurn_EndPlaylistBurn(This,result) (This)->lpVtbl->EndPlaylistBurn(This,result)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMReaderPlaylistBurn_QueryInterface(IWMReaderPlaylistBurn* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMReaderPlaylistBurn_AddRef(IWMReaderPlaylistBurn* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMReaderPlaylistBurn_Release(IWMReaderPlaylistBurn* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMReaderPlaylistBurn methods ***/
static FORCEINLINE HRESULT IWMReaderPlaylistBurn_InitPlaylistBurn(IWMReaderPlaylistBurn* This,DWORD count,LPCWSTR_WMSDK_TYPE_SAFE *filenames,IWMStatusCallback *callback,void *context) {
    return This->lpVtbl->InitPlaylistBurn(This,count,filenames,callback,context);
}
static FORCEINLINE HRESULT IWMReaderPlaylistBurn_GetInitResults(IWMReaderPlaylistBurn* This,DWORD count,HRESULT *stat) {
    return This->lpVtbl->GetInitResults(This,count,stat);
}
static FORCEINLINE HRESULT IWMReaderPlaylistBurn_Cancel(IWMReaderPlaylistBurn* This) {
    return This->lpVtbl->Cancel(This);
}
static FORCEINLINE HRESULT IWMReaderPlaylistBurn_EndPlaylistBurn(IWMReaderPlaylistBurn* This,HRESULT result) {
    return This->lpVtbl->EndPlaylistBurn(This,result);
}
#endif
#endif

#endif


#endif  /* __IWMReaderPlaylistBurn_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPropertyVault interface
 */
#ifndef __IWMPropertyVault_INTERFACE_DEFINED__
#define __IWMPropertyVault_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPropertyVault, 0x72995a79, 0x5090, 0x42a4, 0x9c,0x8c, 0xd9,0xd0,0xb6,0xd3,0x4b,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("72995a79-5090-42a4-9c8c-d9d0b6d34be5")
IWMPropertyVault : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPropertyCount(
        DWORD *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyByName(
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperty(
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        BYTE *value,
        DWORD size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyByIndex(
        DWORD index,
        WCHAR *name,
        DWORD *length,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyPropertiesFrom(
        IWMPropertyVault *vault) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPropertyVault, 0x72995a79, 0x5090, 0x42a4, 0x9c,0x8c, 0xd9,0xd0,0xb6,0xd3,0x4b,0xe5)
#endif
#else
typedef struct IWMPropertyVaultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPropertyVault methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyCount)(
        IWMPropertyVault *This,
        DWORD *count);

    HRESULT (STDMETHODCALLTYPE *GetPropertyByName)(
        IWMPropertyVault *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IWMPropertyVault *This,
        const WCHAR *name,
        WMT_ATTR_DATATYPE type,
        BYTE *value,
        DWORD size);

    HRESULT (STDMETHODCALLTYPE *GetPropertyByIndex)(
        IWMPropertyVault *This,
        DWORD index,
        WCHAR *name,
        DWORD *length,
        WMT_ATTR_DATATYPE *type,
        BYTE *value,
        DWORD *size);

    HRESULT (STDMETHODCALLTYPE *CopyPropertiesFrom)(
        IWMPropertyVault *This,
        IWMPropertyVault *vault);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IWMPropertyVault *This);

    END_INTERFACE
} IWMPropertyVaultVtbl;

interface IWMPropertyVault {
    CONST_VTBL IWMPropertyVaultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPropertyVault_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPropertyVault_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPropertyVault_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPropertyVault methods ***/
#define IWMPropertyVault_GetPropertyCount(This,count) (This)->lpVtbl->GetPropertyCount(This,count)
#define IWMPropertyVault_GetPropertyByName(This,name,type,value,size) (This)->lpVtbl->GetPropertyByName(This,name,type,value,size)
#define IWMPropertyVault_SetProperty(This,name,type,value,size) (This)->lpVtbl->SetProperty(This,name,type,value,size)
#define IWMPropertyVault_GetPropertyByIndex(This,index,name,length,type,value,size) (This)->lpVtbl->GetPropertyByIndex(This,index,name,length,type,value,size)
#define IWMPropertyVault_CopyPropertiesFrom(This,vault) (This)->lpVtbl->CopyPropertiesFrom(This,vault)
#define IWMPropertyVault_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMPropertyVault_QueryInterface(IWMPropertyVault* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPropertyVault_AddRef(IWMPropertyVault* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPropertyVault_Release(IWMPropertyVault* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPropertyVault methods ***/
static FORCEINLINE HRESULT IWMPropertyVault_GetPropertyCount(IWMPropertyVault* This,DWORD *count) {
    return This->lpVtbl->GetPropertyCount(This,count);
}
static FORCEINLINE HRESULT IWMPropertyVault_GetPropertyByName(IWMPropertyVault* This,const WCHAR *name,WMT_ATTR_DATATYPE *type,BYTE *value,DWORD *size) {
    return This->lpVtbl->GetPropertyByName(This,name,type,value,size);
}
static FORCEINLINE HRESULT IWMPropertyVault_SetProperty(IWMPropertyVault* This,const WCHAR *name,WMT_ATTR_DATATYPE type,BYTE *value,DWORD size) {
    return This->lpVtbl->SetProperty(This,name,type,value,size);
}
static FORCEINLINE HRESULT IWMPropertyVault_GetPropertyByIndex(IWMPropertyVault* This,DWORD index,WCHAR *name,DWORD *length,WMT_ATTR_DATATYPE *type,BYTE *value,DWORD *size) {
    return This->lpVtbl->GetPropertyByIndex(This,index,name,length,type,value,size);
}
static FORCEINLINE HRESULT IWMPropertyVault_CopyPropertiesFrom(IWMPropertyVault* This,IWMPropertyVault *vault) {
    return This->lpVtbl->CopyPropertiesFrom(This,vault);
}
static FORCEINLINE HRESULT IWMPropertyVault_Clear(IWMPropertyVault* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif


#endif  /* __IWMPropertyVault_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMWriterPreprocess interface
 */
#ifndef __IWMWriterPreprocess_INTERFACE_DEFINED__
#define __IWMWriterPreprocess_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMWriterPreprocess, 0xfc54a285, 0x38c4, 0x45b5, 0xaa,0x23, 0x85,0xb9,0xf7,0xcb,0x42,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fc54a285-38c4-45b5-aa23-85b9f7cb424b")
IWMWriterPreprocess : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMaxPreprocessingPasses(
        DWORD input,
        DWORD flags,
        DWORD *passes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNumPreprocessingPasses(
        DWORD input,
        DWORD flags,
        DWORD passes) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginPreprocessingPass(
        DWORD input,
        DWORD flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE PreprocessSample(
        DWORD input,
        QWORD sample_time,
        DWORD flags,
        INSSBuffer *sample) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndPreprocessingPass(
        DWORD input,
        DWORD flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMWriterPreprocess, 0xfc54a285, 0x38c4, 0x45b5, 0xaa,0x23, 0x85,0xb9,0xf7,0xcb,0x42,0x4b)
#endif
#else
typedef struct IWMWriterPreprocessVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMWriterPreprocess methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMaxPreprocessingPasses)(
        IWMWriterPreprocess *This,
        DWORD input,
        DWORD flags,
        DWORD *passes);

    HRESULT (STDMETHODCALLTYPE *SetNumPreprocessingPasses)(
        IWMWriterPreprocess *This,
        DWORD input,
        DWORD flags,
        DWORD passes);

    HRESULT (STDMETHODCALLTYPE *BeginPreprocessingPass)(
        IWMWriterPreprocess *This,
        DWORD input,
        DWORD flags);

    HRESULT (STDMETHODCALLTYPE *PreprocessSample)(
        IWMWriterPreprocess *This,
        DWORD input,
        QWORD sample_time,
        DWORD flags,
        INSSBuffer *sample);

    HRESULT (STDMETHODCALLTYPE *EndPreprocessingPass)(
        IWMWriterPreprocess *This,
        DWORD input,
        DWORD flags);

    END_INTERFACE
} IWMWriterPreprocessVtbl;

interface IWMWriterPreprocess {
    CONST_VTBL IWMWriterPreprocessVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMWriterPreprocess_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMWriterPreprocess_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMWriterPreprocess_Release(This) (This)->lpVtbl->Release(This)
/*** IWMWriterPreprocess methods ***/
#define IWMWriterPreprocess_GetMaxPreprocessingPasses(This,input,flags,passes) (This)->lpVtbl->GetMaxPreprocessingPasses(This,input,flags,passes)
#define IWMWriterPreprocess_SetNumPreprocessingPasses(This,input,flags,passes) (This)->lpVtbl->SetNumPreprocessingPasses(This,input,flags,passes)
#define IWMWriterPreprocess_BeginPreprocessingPass(This,input,flags) (This)->lpVtbl->BeginPreprocessingPass(This,input,flags)
#define IWMWriterPreprocess_PreprocessSample(This,input,sample_time,flags,sample) (This)->lpVtbl->PreprocessSample(This,input,sample_time,flags,sample)
#define IWMWriterPreprocess_EndPreprocessingPass(This,input,flags) (This)->lpVtbl->EndPreprocessingPass(This,input,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWMWriterPreprocess_QueryInterface(IWMWriterPreprocess* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMWriterPreprocess_AddRef(IWMWriterPreprocess* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMWriterPreprocess_Release(IWMWriterPreprocess* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMWriterPreprocess methods ***/
static FORCEINLINE HRESULT IWMWriterPreprocess_GetMaxPreprocessingPasses(IWMWriterPreprocess* This,DWORD input,DWORD flags,DWORD *passes) {
    return This->lpVtbl->GetMaxPreprocessingPasses(This,input,flags,passes);
}
static FORCEINLINE HRESULT IWMWriterPreprocess_SetNumPreprocessingPasses(IWMWriterPreprocess* This,DWORD input,DWORD flags,DWORD passes) {
    return This->lpVtbl->SetNumPreprocessingPasses(This,input,flags,passes);
}
static FORCEINLINE HRESULT IWMWriterPreprocess_BeginPreprocessingPass(IWMWriterPreprocess* This,DWORD input,DWORD flags) {
    return This->lpVtbl->BeginPreprocessingPass(This,input,flags);
}
static FORCEINLINE HRESULT IWMWriterPreprocess_PreprocessSample(IWMWriterPreprocess* This,DWORD input,QWORD sample_time,DWORD flags,INSSBuffer *sample) {
    return This->lpVtbl->PreprocessSample(This,input,sample_time,flags,sample);
}
static FORCEINLINE HRESULT IWMWriterPreprocess_EndPreprocessingPass(IWMWriterPreprocess* This,DWORD input,DWORD flags) {
    return This->lpVtbl->EndPreprocessingPass(This,input,flags);
}
#endif
#endif

#endif


#endif  /* __IWMWriterPreprocess_INTERFACE_DEFINED__ */

HRESULT WINAPI WMCreateWriter(IUnknown*,IWMWriter**);
HRESULT WINAPI WMCreateReader(IUnknown*,DWORD,IWMReader**);
EXTERN_GUID(WMMEDIASUBTYPE_Base,   0x00000000,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIATYPE_Video,     0x73646976,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_RGB1,   0xe436eb78,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB4,   0xe436eb79,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB8,   0xe436eb7a,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB565, 0xe436eb7b,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB555, 0xe436eb7c,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB24,  0xe436eb7d,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_RGB32,  0xe436eb7e,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70);
EXTERN_GUID(WMMEDIASUBTYPE_I420,   0x30323449,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_IYUV,   0x56555949,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YV12,   0x32315659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YUY2,   0x32595559,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_P422,   0x32323450,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_UYVY,   0x59565955,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YVYU,   0x55595659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_YVU9,   0x39555659,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_VIDEOIMAGE, 0x1d4a45f2,0xe5f6,0x4b44,0x83,0x88,0xf0,0xae,0x5c,0x0e,0x0c,0x37);
EXTERN_GUID(WMMEDIASUBTYPE_MP43,   0x3334504d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MP4S,   0x5334504d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_M4S2,   0x3253344d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV1,   0x31564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV2,   0x32564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MSS1,   0x3153534d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MPEG2_VIDEO, 0xe06d8026,0xdb46,0x11cf,0xb4,0xd1,0x00,0x80,0x5f,0x6c,0xbb,0xea);
EXTERN_GUID(WMMEDIATYPE_Audio,     0x73647561,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_PCM,    0x00000001,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_DRM,    0x00000009,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMAudioV9,        0x00000162,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMAudio_Lossless, 0x00000163,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_MSS2,   0x3253534d,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMSP1,  0x0000000a,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMSP2,  0x0000000b,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMV3,   0x33564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMVP,   0x50564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WVP2,   0x32505657,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WMVA,   0x41564d57,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
EXTERN_GUID(WMMEDIASUBTYPE_WVC1,   0x31435657,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wmsdkidl_h__ */
