/*** Autogenerated by WIDL 9.8 from include/mfmediaengine.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __mfmediaengine_h__
#define __mfmediaengine_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IMFMediaError_FWD_DEFINED__
#define __IMFMediaError_FWD_DEFINED__
typedef interface IMFMediaError IMFMediaError;
#ifdef __cplusplus
interface IMFMediaError;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineSrcElements_FWD_DEFINED__
#define __IMFMediaEngineSrcElements_FWD_DEFINED__
typedef interface IMFMediaEngineSrcElements IMFMediaEngineSrcElements;
#ifdef __cplusplus
interface IMFMediaEngineSrcElements;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaTimeRange_FWD_DEFINED__
#define __IMFMediaTimeRange_FWD_DEFINED__
typedef interface IMFMediaTimeRange IMFMediaTimeRange;
#ifdef __cplusplus
interface IMFMediaTimeRange;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngine_FWD_DEFINED__
#define __IMFMediaEngine_FWD_DEFINED__
typedef interface IMFMediaEngine IMFMediaEngine;
#ifdef __cplusplus
interface IMFMediaEngine;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineEx_FWD_DEFINED__
#define __IMFMediaEngineEx_FWD_DEFINED__
typedef interface IMFMediaEngineEx IMFMediaEngineEx;
#ifdef __cplusplus
interface IMFMediaEngineEx;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineClassFactory_FWD_DEFINED__
#define __IMFMediaEngineClassFactory_FWD_DEFINED__
typedef interface IMFMediaEngineClassFactory IMFMediaEngineClassFactory;
#ifdef __cplusplus
interface IMFMediaEngineClassFactory;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineNotify_FWD_DEFINED__
#define __IMFMediaEngineNotify_FWD_DEFINED__
typedef interface IMFMediaEngineNotify IMFMediaEngineNotify;
#ifdef __cplusplus
interface IMFMediaEngineNotify;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineAudioEndpointId_FWD_DEFINED__
#define __IMFMediaEngineAudioEndpointId_FWD_DEFINED__
typedef interface IMFMediaEngineAudioEndpointId IMFMediaEngineAudioEndpointId;
#ifdef __cplusplus
interface IMFMediaEngineAudioEndpointId;
#endif /* __cplusplus */
#endif

#ifndef __IMFMediaEngineExtension_FWD_DEFINED__
#define __IMFMediaEngineExtension_FWD_DEFINED__
typedef interface IMFMediaEngineExtension IMFMediaEngineExtension;
#ifdef __cplusplus
interface IMFMediaEngineExtension;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <mfidl.h>

#ifdef __cplusplus
extern "C" {
#endif

EXTERN_GUID(CLSID_MFMediaEngineClassFactory, 0xb44392da, 0x499b, 0x446b, 0xa4, 0xcb, 0x00, 0x5f, 0xea, 0xd0, 0xe6, 0xd5);
EXTERN_GUID(MF_MEDIA_ENGINE_AUDIO_CATEGORY,                     0xc8d4c51d, 0x350e, 0x41f2, 0xba, 0x46, 0xfa, 0xeb, 0xbb, 0x08, 0x57, 0xf6);
EXTERN_GUID(MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE,                0xd2cb93d1, 0x116a, 0x44f2, 0x93, 0x85, 0xf7, 0xd0, 0xfd, 0xa2, 0xfb, 0x46);
EXTERN_GUID(MF_MEDIA_ENGINE_BROWSER_COMPATIBILITY_MODE,         0x4e0212e2, 0xe18f, 0x41e1, 0x95, 0xe5, 0xc0, 0xe7, 0xe9, 0x23, 0x5b, 0xc3);
EXTERN_GUID(MF_MEDIA_ENGINE_BROWSER_COMPATIBILITY_MODE_IE9,     0x052c2d39, 0x40c0, 0x4188, 0xab, 0x86, 0xf8, 0x28, 0x27, 0x3b, 0x75, 0x22);
EXTERN_GUID(MF_MEDIA_ENGINE_BROWSER_COMPATIBILITY_MODE_IE10,    0x11a47afd, 0x6589, 0x4124, 0xb3, 0x12, 0x61, 0x58, 0xec, 0x51, 0x7f, 0xc3);
EXTERN_GUID(MF_MEDIA_ENGINE_BROWSER_COMPATIBILITY_MODE_IE11,    0x1cf1315f, 0xce3f, 0x4035, 0x93, 0x91, 0x16, 0x14, 0x2f, 0x77, 0x51, 0x89);
EXTERN_GUID(MF_MEDIA_ENGINE_BROWSER_COMPATIBILITY_MODE_IE_EDGE, 0xa6f3e465, 0x3aca, 0x442c, 0xa3, 0xf0, 0xad, 0x6d, 0xda, 0xd8, 0x39, 0xae);
EXTERN_GUID(MF_MEDIA_ENGINE_CALLBACK,                           0xc60381b8, 0x83a4, 0x41f8, 0xa3, 0xd0, 0xde, 0x05, 0x07, 0x68, 0x49, 0xa9);
EXTERN_GUID(MF_MEDIA_ENGINE_COMPATIBILITY_MODE,                 0x3ef26ad4, 0xdc54, 0x45de, 0xb9, 0xaf, 0x76, 0xc8, 0xc6, 0x6b, 0xfa, 0x8e);
EXTERN_GUID(MF_MEDIA_ENGINE_COMPATIBILITY_MODE_WIN10,           0x5b25e089, 0x6ca7, 0x4139, 0xa2, 0xcb, 0xfc, 0xaa, 0xb3, 0x95, 0x52, 0xa3);
EXTERN_GUID(MF_MEDIA_ENGINE_COMPATIBILITY_MODE_WWA_EDGE,        0x15b29098, 0x9f01, 0x4e4d, 0xb6, 0x5a, 0xc0, 0x6c, 0x6c, 0x89, 0xda, 0x2a);
EXTERN_GUID(MF_MEDIA_ENGINE_CONTENT_PROTECTION_FLAGS,           0xe0350223, 0x5aaf, 0x4d76, 0xa7, 0xc3, 0x06, 0xde, 0x70, 0x89, 0x4d, 0xb4);
EXTERN_GUID(MF_MEDIA_ENGINE_CONTENT_PROTECTION_MANAGER,         0xfdd6dfaa, 0xbd85, 0x4af3, 0x9e, 0x0f, 0xa0, 0x1d, 0x53, 0x9d, 0x87, 0x6a);
EXTERN_GUID(MF_MEDIA_ENGINE_CONTINUE_ON_CODEC_ERROR,            0xdbcdb7f9, 0x48e4, 0x4295, 0xb7, 0x0d, 0xd5, 0x18, 0x23, 0x4e, 0xeb, 0x38);
EXTERN_GUID(MF_MEDIA_ENGINE_COREWINDOW,                         0xfccae4dc, 0x0b7f, 0x41c2, 0x9f, 0x96, 0x46, 0x59, 0x94, 0x8a, 0xcd, 0xdc);
EXTERN_GUID(MF_MEDIA_ENGINE_DXGI_MANAGER,                       0x065702da, 0x1094, 0x486d, 0x86, 0x17, 0xee, 0x7c, 0xc4, 0xee, 0x46, 0x48);
EXTERN_GUID(MF_MEDIA_ENGINE_EME_CALLBACK,                       0x494553a7, 0xa481, 0x4cb7, 0xbe, 0xc5, 0x38, 0x09, 0x03, 0x51, 0x37, 0x31);
EXTERN_GUID(MF_MEDIA_ENGINE_EXTENSION,                          0x3109fd46, 0x060d, 0x4b62, 0x8d, 0xcf, 0xfa, 0xff, 0x81, 0x13, 0x18, 0xd2);
EXTERN_GUID(MF_MEDIA_ENGINE_MEDIA_PLAYER_MODE,                  0x3ddd8d45, 0x5aa1, 0x4112, 0x82, 0xe5, 0x36, 0xf6, 0xa2, 0x19, 0x7e, 0x6e);
EXTERN_GUID(MF_MEDIA_ENGINE_NEEDKEY_CALLBACK,                   0x7ea80843, 0xb6e4, 0x432c, 0x8e, 0xa4, 0x78, 0x48, 0xff, 0xe4, 0x22, 0x0e);
EXTERN_GUID(MF_MEDIA_ENGINE_OPM_HWND,                           0xa0be8ee7, 0x0572, 0x4f2c, 0xa8, 0x01, 0x2a, 0x15, 0x1b, 0xd3, 0xe7, 0x26);
EXTERN_GUID(MF_MEDIA_ENGINE_PLAYBACK_HWND,                      0xd988879b, 0x67c9, 0x4d92, 0xba, 0xa7, 0x6e, 0xad, 0xd4, 0x46, 0x03, 0x9d);
EXTERN_GUID(MF_MEDIA_ENGINE_PLAYBACK_VISUAL,                    0x6debd26f, 0x6ab9, 0x4d7e, 0xb0, 0xee, 0xc6, 0x1a, 0x73, 0xff, 0xad, 0x15);
EXTERN_GUID(MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE,       0x0ac0c497, 0xb3c4, 0x48c9, 0x9c, 0xde, 0xbb, 0x8c, 0xa2, 0x44, 0x2c, 0xa3);
EXTERN_GUID(MF_MEDIA_ENGINE_STREAM_CONTAINS_ALPHA_CHANNEL,      0x5cbfaf44, 0xd2b2, 0x4cfb, 0x80, 0xa7, 0xd4, 0x29, 0xc7, 0x4c, 0x78, 0x9d);
EXTERN_GUID(MF_MEDIA_ENGINE_SYNCHRONOUS_CLOSE,                  0xc3c2e12f, 0x7e0e, 0x4e43, 0xb9, 0x1c, 0xdc, 0x99, 0x2c, 0xcd, 0xfa, 0x5e);
EXTERN_GUID(MF_MEDIA_ENGINE_TELEMETRY_APPLICATION_ID,           0x1e7b273b, 0xa7e4, 0x402a, 0x8f, 0x51, 0xc4, 0x8e, 0x88, 0xa2, 0xca, 0xbc);
EXTERN_GUID(MF_MEDIA_ENGINE_TRACK_ID,                           0x65bea312, 0x4043, 0x4815, 0x8e, 0xab, 0x44, 0xdc, 0xe2, 0xef, 0x8f, 0x2a);
EXTERN_GUID(MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT,                0x5066893c, 0x8cf9, 0x42bc, 0x8b, 0x8a, 0x47, 0x22, 0x12, 0xe5, 0x27, 0x26);
typedef enum MF_MEDIA_ENGINE_NETWORK {
    MF_MEDIA_ENGINE_NETWORK_EMPTY = 0,
    MF_MEDIA_ENGINE_NETWORK_IDLE = 1,
    MF_MEDIA_ENGINE_NETWORK_LOADING = 2,
    MF_MEDIA_ENGINE_NETWORK_NO_SOURCE = 3
} MF_MEDIA_ENGINE_NETWORK;
typedef enum MF_MEDIA_ENGINE_ERR {
    MF_MEDIA_ENGINE_ERR_NOERROR = 0,
    MF_MEDIA_ENGINE_ERR_ABORTED = 1,
    MF_MEDIA_ENGINE_ERR_NETWORK = 2,
    MF_MEDIA_ENGINE_ERR_DECODE = 3,
    MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED = 4,
    MF_MEDIA_ENGINE_ERR_ENCRYPTED = 5
} MF_MEDIA_ENGINE_ERR;
typedef enum MF_MEDIA_ENGINE_PRELOAD {
    MF_MEDIA_ENGINE_PRELOAD_MISSING = 0,
    MF_MEDIA_ENGINE_PRELOAD_EMPTY = 1,
    MF_MEDIA_ENGINE_PRELOAD_NONE = 2,
    MF_MEDIA_ENGINE_PRELOAD_METADATA = 3,
    MF_MEDIA_ENGINE_PRELOAD_AUTOMATIC = 4
} MF_MEDIA_ENGINE_PRELOAD;
typedef enum MF_MEDIA_ENGINE_CANPLAY {
    MF_MEDIA_ENGINE_CANPLAY_NOT_SUPPORTED = 0,
    MF_MEDIA_ENGINE_CANPLAY_MAYBE = 1,
    MF_MEDIA_ENGINE_CANPLAY_PROBABLY = 2
} MF_MEDIA_ENGINE_CANPLAY;
#ifndef _MFVideoNormalizedRect_
#define _MFVideoNormalizedRect_
typedef struct MFVideoNormalizedRect {
    float left;
    float top;
    float right;
    float bottom;
} MFVideoNormalizedRect;
#endif
typedef enum MF_MEDIA_ENGINE_CREATEFLAGS {
    MF_MEDIA_ENGINE_AUDIOONLY = 0x1,
    MF_MEDIA_ENGINE_WAITFORSTABLE_STATE = 0x2,
    MF_MEDIA_ENGINE_FORCEMUTE = 0x4,
    MF_MEDIA_ENGINE_REAL_TIME_MODE = 0x8,
    MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS = 0x10,
    MF_MEDIA_ENGINE_CREATEFLAGS_MASK = 0x1f
} MF_MEDIA_ENGINE_CREATEFLAGS;
typedef enum MF_MEDIA_ENGINE_EVENT {
    MF_MEDIA_ENGINE_EVENT_LOADSTART = 1,
    MF_MEDIA_ENGINE_EVENT_PROGRESS = 2,
    MF_MEDIA_ENGINE_EVENT_SUSPEND = 3,
    MF_MEDIA_ENGINE_EVENT_ABORT = 4,
    MF_MEDIA_ENGINE_EVENT_ERROR = 5,
    MF_MEDIA_ENGINE_EVENT_EMPTIED = 6,
    MF_MEDIA_ENGINE_EVENT_STALLED = 7,
    MF_MEDIA_ENGINE_EVENT_PLAY = 8,
    MF_MEDIA_ENGINE_EVENT_PAUSE = 9,
    MF_MEDIA_ENGINE_EVENT_LOADEDMETADATA = 10,
    MF_MEDIA_ENGINE_EVENT_LOADEDDATA = 11,
    MF_MEDIA_ENGINE_EVENT_WAITING = 12,
    MF_MEDIA_ENGINE_EVENT_PLAYING = 13,
    MF_MEDIA_ENGINE_EVENT_CANPLAY = 14,
    MF_MEDIA_ENGINE_EVENT_CANPLAYTHROUGH = 15,
    MF_MEDIA_ENGINE_EVENT_SEEKING = 16,
    MF_MEDIA_ENGINE_EVENT_SEEKED = 17,
    MF_MEDIA_ENGINE_EVENT_TIMEUPDATE = 18,
    MF_MEDIA_ENGINE_EVENT_ENDED = 19,
    MF_MEDIA_ENGINE_EVENT_RATECHANGE = 20,
    MF_MEDIA_ENGINE_EVENT_DURATIONCHANGE = 21,
    MF_MEDIA_ENGINE_EVENT_VOLUMECHANGE = 22,
    MF_MEDIA_ENGINE_EVENT_FORMATCHANGE = 1000,
    MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS = 1001,
    MF_MEDIA_ENGINE_EVENT_TIMELINE_MARKER = 1002,
    MF_MEDIA_ENGINE_EVENT_BALANCECHANGE = 1003,
    MF_MEDIA_ENGINE_EVENT_DOWNLOADCOMPLETE = 1004,
    MF_MEDIA_ENGINE_EVENT_BUFFERINGSTARTED = 1005,
    MF_MEDIA_ENGINE_EVENT_BUFFERINGENDED = 1006,
    MF_MEDIA_ENGINE_EVENT_FRAMESTEPCOMPLETED = 1007,
    MF_MEDIA_ENGINE_EVENT_NOTIFYSTABLESTATE = 1008,
    MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY = 1009,
    MF_MEDIA_ENGINE_EVENT_TRACKSCHANGE = 1010,
    MF_MEDIA_ENGINE_EVENT_OPMINFO = 1011,
    MF_MEDIA_ENGINE_EVENT_RESOURCELOST = 1012,
    MF_MEDIA_ENGINE_EVENT_DELAYLOADEVENT_CHANGED = 1013,
    MF_MEDIA_ENGINE_EVENT_STREAMRENDERINGERROR = 1014,
    MF_MEDIA_ENGINE_EVENT_SUPPORTEDRATES_CHANGED = 1015,
    MF_MEDIA_ENGINE_EVENT_AUDIOENDPOINTCHANGE = 1016
} MF_MEDIA_ENGINE_EVENT;
typedef enum MF_MEDIA_ENGINE_READY {
    MF_MEDIA_ENGINE_READY_HAVE_NOTHING = 0,
    MF_MEDIA_ENGINE_READY_HAVE_METADATA = 1,
    MF_MEDIA_ENGINE_READY_HAVE_CURRENT_DATA = 2,
    MF_MEDIA_ENGINE_READY_HAVE_FUTURE_DATA = 3,
    MF_MEDIA_ENGINE_READY_HAVE_ENOUGH_DATA = 4
} MF_MEDIA_ENGINE_READY;
/*****************************************************************************
 * IMFMediaError interface
 */
#ifndef __IMFMediaError_INTERFACE_DEFINED__
#define __IMFMediaError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaError, 0xfc0e10d2, 0xab2a, 0x4501, 0xa9,0x51, 0x06,0xbb,0x10,0x75,0x18,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fc0e10d2-ab2a-4501-a951-06bb1075184c")
IMFMediaError : public IUnknown
{
    virtual USHORT STDMETHODCALLTYPE GetErrorCode(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExtendedErrorCode(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetErrorCode(
        MF_MEDIA_ENGINE_ERR error) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetExtendedErrorCode(
        HRESULT error) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaError, 0xfc0e10d2, 0xab2a, 0x4501, 0xa9,0x51, 0x06,0xbb,0x10,0x75,0x18,0x4c)
#endif
#else
typedef struct IMFMediaErrorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaError methods ***/
    USHORT (STDMETHODCALLTYPE *GetErrorCode)(
        IMFMediaError *This);

    HRESULT (STDMETHODCALLTYPE *GetExtendedErrorCode)(
        IMFMediaError *This);

    HRESULT (STDMETHODCALLTYPE *SetErrorCode)(
        IMFMediaError *This,
        MF_MEDIA_ENGINE_ERR error);

    HRESULT (STDMETHODCALLTYPE *SetExtendedErrorCode)(
        IMFMediaError *This,
        HRESULT error);

    END_INTERFACE
} IMFMediaErrorVtbl;

interface IMFMediaError {
    CONST_VTBL IMFMediaErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaError_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaError methods ***/
#define IMFMediaError_GetErrorCode(This) (This)->lpVtbl->GetErrorCode(This)
#define IMFMediaError_GetExtendedErrorCode(This) (This)->lpVtbl->GetExtendedErrorCode(This)
#define IMFMediaError_SetErrorCode(This,error) (This)->lpVtbl->SetErrorCode(This,error)
#define IMFMediaError_SetExtendedErrorCode(This,error) (This)->lpVtbl->SetExtendedErrorCode(This,error)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaError_QueryInterface(IMFMediaError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaError_AddRef(IMFMediaError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaError_Release(IMFMediaError* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaError methods ***/
static __WIDL_INLINE USHORT IMFMediaError_GetErrorCode(IMFMediaError* This) {
    return This->lpVtbl->GetErrorCode(This);
}
static __WIDL_INLINE HRESULT IMFMediaError_GetExtendedErrorCode(IMFMediaError* This) {
    return This->lpVtbl->GetExtendedErrorCode(This);
}
static __WIDL_INLINE HRESULT IMFMediaError_SetErrorCode(IMFMediaError* This,MF_MEDIA_ENGINE_ERR error) {
    return This->lpVtbl->SetErrorCode(This,error);
}
static __WIDL_INLINE HRESULT IMFMediaError_SetExtendedErrorCode(IMFMediaError* This,HRESULT error) {
    return This->lpVtbl->SetExtendedErrorCode(This,error);
}
#endif
#endif

#endif


#endif  /* __IMFMediaError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngineSrcElements interface
 */
#ifndef __IMFMediaEngineSrcElements_INTERFACE_DEFINED__
#define __IMFMediaEngineSrcElements_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineSrcElements, 0x7a5e5354, 0xb114, 0x4c72, 0xb9,0x91, 0x31,0x31,0xd7,0x50,0x32,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7a5e5354-b114-4c72-b991-3131d75032ea")
IMFMediaEngineSrcElements : public IUnknown
{
    virtual DWORD STDMETHODCALLTYPE GetLength(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetURL(
        DWORD index,
        BSTR *url) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        DWORD index,
        BSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMedia(
        DWORD index,
        BSTR *media) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddElement(
        BSTR url,
        BSTR type,
        BSTR media) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllElements(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineSrcElements, 0x7a5e5354, 0xb114, 0x4c72, 0xb9,0x91, 0x31,0x31,0xd7,0x50,0x32,0xea)
#endif
#else
typedef struct IMFMediaEngineSrcElementsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngineSrcElements methods ***/
    DWORD (STDMETHODCALLTYPE *GetLength)(
        IMFMediaEngineSrcElements *This);

    HRESULT (STDMETHODCALLTYPE *GetURL)(
        IMFMediaEngineSrcElements *This,
        DWORD index,
        BSTR *url);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IMFMediaEngineSrcElements *This,
        DWORD index,
        BSTR *type);

    HRESULT (STDMETHODCALLTYPE *GetMedia)(
        IMFMediaEngineSrcElements *This,
        DWORD index,
        BSTR *media);

    HRESULT (STDMETHODCALLTYPE *AddElement)(
        IMFMediaEngineSrcElements *This,
        BSTR url,
        BSTR type,
        BSTR media);

    HRESULT (STDMETHODCALLTYPE *RemoveAllElements)(
        IMFMediaEngineSrcElements *This);

    END_INTERFACE
} IMFMediaEngineSrcElementsVtbl;

interface IMFMediaEngineSrcElements {
    CONST_VTBL IMFMediaEngineSrcElementsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineSrcElements_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineSrcElements_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineSrcElements_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngineSrcElements methods ***/
#define IMFMediaEngineSrcElements_GetLength(This) (This)->lpVtbl->GetLength(This)
#define IMFMediaEngineSrcElements_GetURL(This,index,url) (This)->lpVtbl->GetURL(This,index,url)
#define IMFMediaEngineSrcElements_GetType(This,index,type) (This)->lpVtbl->GetType(This,index,type)
#define IMFMediaEngineSrcElements_GetMedia(This,index,media) (This)->lpVtbl->GetMedia(This,index,media)
#define IMFMediaEngineSrcElements_AddElement(This,url,type,media) (This)->lpVtbl->AddElement(This,url,type,media)
#define IMFMediaEngineSrcElements_RemoveAllElements(This) (This)->lpVtbl->RemoveAllElements(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_QueryInterface(IMFMediaEngineSrcElements* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineSrcElements_AddRef(IMFMediaEngineSrcElements* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineSrcElements_Release(IMFMediaEngineSrcElements* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngineSrcElements methods ***/
static __WIDL_INLINE DWORD IMFMediaEngineSrcElements_GetLength(IMFMediaEngineSrcElements* This) {
    return This->lpVtbl->GetLength(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_GetURL(IMFMediaEngineSrcElements* This,DWORD index,BSTR *url) {
    return This->lpVtbl->GetURL(This,index,url);
}
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_GetType(IMFMediaEngineSrcElements* This,DWORD index,BSTR *type) {
    return This->lpVtbl->GetType(This,index,type);
}
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_GetMedia(IMFMediaEngineSrcElements* This,DWORD index,BSTR *media) {
    return This->lpVtbl->GetMedia(This,index,media);
}
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_AddElement(IMFMediaEngineSrcElements* This,BSTR url,BSTR type,BSTR media) {
    return This->lpVtbl->AddElement(This,url,type,media);
}
static __WIDL_INLINE HRESULT IMFMediaEngineSrcElements_RemoveAllElements(IMFMediaEngineSrcElements* This) {
    return This->lpVtbl->RemoveAllElements(This);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineSrcElements_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaTimeRange interface
 */
#ifndef __IMFMediaTimeRange_INTERFACE_DEFINED__
#define __IMFMediaTimeRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaTimeRange, 0xdb71a2fc, 0x078a, 0x414e, 0x9d,0xf9, 0x8c,0x25,0x31,0xb0,0xaa,0x6c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("db71a2fc-078a-414e-9df9-8c2531b0aa6c")
IMFMediaTimeRange : public IUnknown
{
    virtual DWORD STDMETHODCALLTYPE GetLength(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStart(
        DWORD index,
        double *start) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnd(
        DWORD index,
        double *end) = 0;

    virtual WINBOOL STDMETHODCALLTYPE ContainsTime(
        double time) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRange(
        double start,
        double end) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaTimeRange, 0xdb71a2fc, 0x078a, 0x414e, 0x9d,0xf9, 0x8c,0x25,0x31,0xb0,0xaa,0x6c)
#endif
#else
typedef struct IMFMediaTimeRangeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaTimeRange methods ***/
    DWORD (STDMETHODCALLTYPE *GetLength)(
        IMFMediaTimeRange *This);

    HRESULT (STDMETHODCALLTYPE *GetStart)(
        IMFMediaTimeRange *This,
        DWORD index,
        double *start);

    HRESULT (STDMETHODCALLTYPE *GetEnd)(
        IMFMediaTimeRange *This,
        DWORD index,
        double *end);

    WINBOOL (STDMETHODCALLTYPE *ContainsTime)(
        IMFMediaTimeRange *This,
        double time);

    HRESULT (STDMETHODCALLTYPE *AddRange)(
        IMFMediaTimeRange *This,
        double start,
        double end);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IMFMediaTimeRange *This);

    END_INTERFACE
} IMFMediaTimeRangeVtbl;

interface IMFMediaTimeRange {
    CONST_VTBL IMFMediaTimeRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaTimeRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaTimeRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaTimeRange_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaTimeRange methods ***/
#define IMFMediaTimeRange_GetLength(This) (This)->lpVtbl->GetLength(This)
#define IMFMediaTimeRange_GetStart(This,index,start) (This)->lpVtbl->GetStart(This,index,start)
#define IMFMediaTimeRange_GetEnd(This,index,end) (This)->lpVtbl->GetEnd(This,index,end)
#define IMFMediaTimeRange_ContainsTime(This,time) (This)->lpVtbl->ContainsTime(This,time)
#define IMFMediaTimeRange_AddRange(This,start,end) (This)->lpVtbl->AddRange(This,start,end)
#define IMFMediaTimeRange_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaTimeRange_QueryInterface(IMFMediaTimeRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaTimeRange_AddRef(IMFMediaTimeRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaTimeRange_Release(IMFMediaTimeRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaTimeRange methods ***/
static __WIDL_INLINE DWORD IMFMediaTimeRange_GetLength(IMFMediaTimeRange* This) {
    return This->lpVtbl->GetLength(This);
}
static __WIDL_INLINE HRESULT IMFMediaTimeRange_GetStart(IMFMediaTimeRange* This,DWORD index,double *start) {
    return This->lpVtbl->GetStart(This,index,start);
}
static __WIDL_INLINE HRESULT IMFMediaTimeRange_GetEnd(IMFMediaTimeRange* This,DWORD index,double *end) {
    return This->lpVtbl->GetEnd(This,index,end);
}
static __WIDL_INLINE WINBOOL IMFMediaTimeRange_ContainsTime(IMFMediaTimeRange* This,double time) {
    return This->lpVtbl->ContainsTime(This,time);
}
static __WIDL_INLINE HRESULT IMFMediaTimeRange_AddRange(IMFMediaTimeRange* This,double start,double end) {
    return This->lpVtbl->AddRange(This,start,end);
}
static __WIDL_INLINE HRESULT IMFMediaTimeRange_Clear(IMFMediaTimeRange* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif


#endif  /* __IMFMediaTimeRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngine interface
 */
#ifndef __IMFMediaEngine_INTERFACE_DEFINED__
#define __IMFMediaEngine_INTERFACE_DEFINED__

#undef GetCurrentTime
DEFINE_GUID(IID_IMFMediaEngine, 0x98a1b0bb, 0x03eb, 0x4935, 0xae,0x7c, 0x93,0xc1,0xfa,0x0e,0x1c,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("98a1b0bb-03eb-4935-ae7c-93c1fa0e1c93")
IMFMediaEngine : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetError(
        IMFMediaError **error) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetErrorCode(
        MF_MEDIA_ENGINE_ERR error) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSourceElements(
        IMFMediaEngineSrcElements *elements) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSource(
        BSTR url) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSource(
        BSTR *url) = 0;

    virtual USHORT STDMETHODCALLTYPE GetNetworkState(
        ) = 0;

    virtual MF_MEDIA_ENGINE_PRELOAD STDMETHODCALLTYPE GetPreload(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreload(
        MF_MEDIA_ENGINE_PRELOAD preload) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBuffered(
        IMFMediaTimeRange **buffered) = 0;

    virtual HRESULT STDMETHODCALLTYPE Load(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanPlayType(
        BSTR type,
        MF_MEDIA_ENGINE_CANPLAY *answer) = 0;

    virtual USHORT STDMETHODCALLTYPE GetReadyState(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsSeeking(
        ) = 0;

    virtual double STDMETHODCALLTYPE GetCurrentTime(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentTime(
        double time) = 0;

    virtual double STDMETHODCALLTYPE GetStartTime(
        ) = 0;

    virtual double STDMETHODCALLTYPE GetDuration(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsPaused(
        ) = 0;

    virtual double STDMETHODCALLTYPE GetDefaultPlaybackRate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultPlaybackRate(
        double rate) = 0;

    virtual double STDMETHODCALLTYPE GetPlaybackRate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPlaybackRate(
        double rate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPlayed(
        IMFMediaTimeRange **played) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSeekable(
        IMFMediaTimeRange **seekable) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsEnded(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE GetAutoPlay(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAutoPlay(
        WINBOOL autoplay) = 0;

    virtual WINBOOL STDMETHODCALLTYPE GetLoop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLoop(
        WINBOOL loop) = 0;

    virtual HRESULT STDMETHODCALLTYPE Play(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE GetMuted(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMuted(
        WINBOOL muted) = 0;

    virtual double STDMETHODCALLTYPE GetVolume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVolume(
        double volume) = 0;

    virtual WINBOOL STDMETHODCALLTYPE HasVideo(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE HasAudio(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNativeVideoSize(
        DWORD *cx,
        DWORD *cy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVideoAspectRatio(
        DWORD *cx,
        DWORD *cy) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shutdown(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE TransferVideoFrame(
        IUnknown *surface,
        const MFVideoNormalizedRect *src,
        const RECT *dst,
        const MFARGB *color) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnVideoStreamTick(
        LONGLONG *time) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngine, 0x98a1b0bb, 0x03eb, 0x4935, 0xae,0x7c, 0x93,0xc1,0xfa,0x0e,0x1c,0x93)
#endif
#else
typedef struct IMFMediaEngineVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngine methods ***/
    HRESULT (STDMETHODCALLTYPE *GetError)(
        IMFMediaEngine *This,
        IMFMediaError **error);

    HRESULT (STDMETHODCALLTYPE *SetErrorCode)(
        IMFMediaEngine *This,
        MF_MEDIA_ENGINE_ERR error);

    HRESULT (STDMETHODCALLTYPE *SetSourceElements)(
        IMFMediaEngine *This,
        IMFMediaEngineSrcElements *elements);

    HRESULT (STDMETHODCALLTYPE *SetSource)(
        IMFMediaEngine *This,
        BSTR url);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSource)(
        IMFMediaEngine *This,
        BSTR *url);

    USHORT (STDMETHODCALLTYPE *GetNetworkState)(
        IMFMediaEngine *This);

    MF_MEDIA_ENGINE_PRELOAD (STDMETHODCALLTYPE *GetPreload)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetPreload)(
        IMFMediaEngine *This,
        MF_MEDIA_ENGINE_PRELOAD preload);

    HRESULT (STDMETHODCALLTYPE *GetBuffered)(
        IMFMediaEngine *This,
        IMFMediaTimeRange **buffered);

    HRESULT (STDMETHODCALLTYPE *Load)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *CanPlayType)(
        IMFMediaEngine *This,
        BSTR type,
        MF_MEDIA_ENGINE_CANPLAY *answer);

    USHORT (STDMETHODCALLTYPE *GetReadyState)(
        IMFMediaEngine *This);

    WINBOOL (STDMETHODCALLTYPE *IsSeeking)(
        IMFMediaEngine *This);

    double (STDMETHODCALLTYPE *GetCurrentTime)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetCurrentTime)(
        IMFMediaEngine *This,
        double time);

    double (STDMETHODCALLTYPE *GetStartTime)(
        IMFMediaEngine *This);

    double (STDMETHODCALLTYPE *GetDuration)(
        IMFMediaEngine *This);

    WINBOOL (STDMETHODCALLTYPE *IsPaused)(
        IMFMediaEngine *This);

    double (STDMETHODCALLTYPE *GetDefaultPlaybackRate)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetDefaultPlaybackRate)(
        IMFMediaEngine *This,
        double rate);

    double (STDMETHODCALLTYPE *GetPlaybackRate)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetPlaybackRate)(
        IMFMediaEngine *This,
        double rate);

    HRESULT (STDMETHODCALLTYPE *GetPlayed)(
        IMFMediaEngine *This,
        IMFMediaTimeRange **played);

    HRESULT (STDMETHODCALLTYPE *GetSeekable)(
        IMFMediaEngine *This,
        IMFMediaTimeRange **seekable);

    WINBOOL (STDMETHODCALLTYPE *IsEnded)(
        IMFMediaEngine *This);

    WINBOOL (STDMETHODCALLTYPE *GetAutoPlay)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetAutoPlay)(
        IMFMediaEngine *This,
        WINBOOL autoplay);

    WINBOOL (STDMETHODCALLTYPE *GetLoop)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetLoop)(
        IMFMediaEngine *This,
        WINBOOL loop);

    HRESULT (STDMETHODCALLTYPE *Play)(
        IMFMediaEngine *This);

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

    WINBOOL (STDMETHODCALLTYPE *GetMuted)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetMuted)(
        IMFMediaEngine *This,
        WINBOOL muted);

    double (STDMETHODCALLTYPE *GetVolume)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IMFMediaEngine *This,
        double volume);

    WINBOOL (STDMETHODCALLTYPE *HasVideo)(
        IMFMediaEngine *This);

    WINBOOL (STDMETHODCALLTYPE *HasAudio)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *GetNativeVideoSize)(
        IMFMediaEngine *This,
        DWORD *cx,
        DWORD *cy);

    HRESULT (STDMETHODCALLTYPE *GetVideoAspectRatio)(
        IMFMediaEngine *This,
        DWORD *cx,
        DWORD *cy);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IMFMediaEngine *This);

    HRESULT (STDMETHODCALLTYPE *TransferVideoFrame)(
        IMFMediaEngine *This,
        IUnknown *surface,
        const MFVideoNormalizedRect *src,
        const RECT *dst,
        const MFARGB *color);

    HRESULT (STDMETHODCALLTYPE *OnVideoStreamTick)(
        IMFMediaEngine *This,
        LONGLONG *time);

    END_INTERFACE
} IMFMediaEngineVtbl;

interface IMFMediaEngine {
    CONST_VTBL IMFMediaEngineVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngine_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngine_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngine_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngine methods ***/
#define IMFMediaEngine_GetError(This,error) (This)->lpVtbl->GetError(This,error)
#define IMFMediaEngine_SetErrorCode(This,error) (This)->lpVtbl->SetErrorCode(This,error)
#define IMFMediaEngine_SetSourceElements(This,elements) (This)->lpVtbl->SetSourceElements(This,elements)
#define IMFMediaEngine_SetSource(This,url) (This)->lpVtbl->SetSource(This,url)
#define IMFMediaEngine_GetCurrentSource(This,url) (This)->lpVtbl->GetCurrentSource(This,url)
#define IMFMediaEngine_GetNetworkState(This) (This)->lpVtbl->GetNetworkState(This)
#define IMFMediaEngine_GetPreload(This) (This)->lpVtbl->GetPreload(This)
#define IMFMediaEngine_SetPreload(This,preload) (This)->lpVtbl->SetPreload(This,preload)
#define IMFMediaEngine_GetBuffered(This,buffered) (This)->lpVtbl->GetBuffered(This,buffered)
#define IMFMediaEngine_Load(This) (This)->lpVtbl->Load(This)
#define IMFMediaEngine_CanPlayType(This,type,answer) (This)->lpVtbl->CanPlayType(This,type,answer)
#define IMFMediaEngine_GetReadyState(This) (This)->lpVtbl->GetReadyState(This)
#define IMFMediaEngine_IsSeeking(This) (This)->lpVtbl->IsSeeking(This)
#define IMFMediaEngine_GetCurrentTime(This) (This)->lpVtbl->GetCurrentTime(This)
#define IMFMediaEngine_SetCurrentTime(This,time) (This)->lpVtbl->SetCurrentTime(This,time)
#define IMFMediaEngine_GetStartTime(This) (This)->lpVtbl->GetStartTime(This)
#define IMFMediaEngine_GetDuration(This) (This)->lpVtbl->GetDuration(This)
#define IMFMediaEngine_IsPaused(This) (This)->lpVtbl->IsPaused(This)
#define IMFMediaEngine_GetDefaultPlaybackRate(This) (This)->lpVtbl->GetDefaultPlaybackRate(This)
#define IMFMediaEngine_SetDefaultPlaybackRate(This,rate) (This)->lpVtbl->SetDefaultPlaybackRate(This,rate)
#define IMFMediaEngine_GetPlaybackRate(This) (This)->lpVtbl->GetPlaybackRate(This)
#define IMFMediaEngine_SetPlaybackRate(This,rate) (This)->lpVtbl->SetPlaybackRate(This,rate)
#define IMFMediaEngine_GetPlayed(This,played) (This)->lpVtbl->GetPlayed(This,played)
#define IMFMediaEngine_GetSeekable(This,seekable) (This)->lpVtbl->GetSeekable(This,seekable)
#define IMFMediaEngine_IsEnded(This) (This)->lpVtbl->IsEnded(This)
#define IMFMediaEngine_GetAutoPlay(This) (This)->lpVtbl->GetAutoPlay(This)
#define IMFMediaEngine_SetAutoPlay(This,autoplay) (This)->lpVtbl->SetAutoPlay(This,autoplay)
#define IMFMediaEngine_GetLoop(This) (This)->lpVtbl->GetLoop(This)
#define IMFMediaEngine_SetLoop(This,loop) (This)->lpVtbl->SetLoop(This,loop)
#define IMFMediaEngine_Play(This) (This)->lpVtbl->Play(This)
#define IMFMediaEngine_Pause(This) (This)->lpVtbl->Pause(This)
#define IMFMediaEngine_GetMuted(This) (This)->lpVtbl->GetMuted(This)
#define IMFMediaEngine_SetMuted(This,muted) (This)->lpVtbl->SetMuted(This,muted)
#define IMFMediaEngine_GetVolume(This) (This)->lpVtbl->GetVolume(This)
#define IMFMediaEngine_SetVolume(This,volume) (This)->lpVtbl->SetVolume(This,volume)
#define IMFMediaEngine_HasVideo(This) (This)->lpVtbl->HasVideo(This)
#define IMFMediaEngine_HasAudio(This) (This)->lpVtbl->HasAudio(This)
#define IMFMediaEngine_GetNativeVideoSize(This,cx,cy) (This)->lpVtbl->GetNativeVideoSize(This,cx,cy)
#define IMFMediaEngine_GetVideoAspectRatio(This,cx,cy) (This)->lpVtbl->GetVideoAspectRatio(This,cx,cy)
#define IMFMediaEngine_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#define IMFMediaEngine_TransferVideoFrame(This,surface,src,dst,color) (This)->lpVtbl->TransferVideoFrame(This,surface,src,dst,color)
#define IMFMediaEngine_OnVideoStreamTick(This,time) (This)->lpVtbl->OnVideoStreamTick(This,time)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngine_QueryInterface(IMFMediaEngine* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngine_AddRef(IMFMediaEngine* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngine_Release(IMFMediaEngine* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngine methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngine_GetError(IMFMediaEngine* This,IMFMediaError **error) {
    return This->lpVtbl->GetError(This,error);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetErrorCode(IMFMediaEngine* This,MF_MEDIA_ENGINE_ERR error) {
    return This->lpVtbl->SetErrorCode(This,error);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetSourceElements(IMFMediaEngine* This,IMFMediaEngineSrcElements *elements) {
    return This->lpVtbl->SetSourceElements(This,elements);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetSource(IMFMediaEngine* This,BSTR url) {
    return This->lpVtbl->SetSource(This,url);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetCurrentSource(IMFMediaEngine* This,BSTR *url) {
    return This->lpVtbl->GetCurrentSource(This,url);
}
static __WIDL_INLINE USHORT IMFMediaEngine_GetNetworkState(IMFMediaEngine* This) {
    return This->lpVtbl->GetNetworkState(This);
}
static __WIDL_INLINE MF_MEDIA_ENGINE_PRELOAD IMFMediaEngine_GetPreload(IMFMediaEngine* This) {
    return This->lpVtbl->GetPreload(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetPreload(IMFMediaEngine* This,MF_MEDIA_ENGINE_PRELOAD preload) {
    return This->lpVtbl->SetPreload(This,preload);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetBuffered(IMFMediaEngine* This,IMFMediaTimeRange **buffered) {
    return This->lpVtbl->GetBuffered(This,buffered);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_Load(IMFMediaEngine* This) {
    return This->lpVtbl->Load(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_CanPlayType(IMFMediaEngine* This,BSTR type,MF_MEDIA_ENGINE_CANPLAY *answer) {
    return This->lpVtbl->CanPlayType(This,type,answer);
}
static __WIDL_INLINE USHORT IMFMediaEngine_GetReadyState(IMFMediaEngine* This) {
    return This->lpVtbl->GetReadyState(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_IsSeeking(IMFMediaEngine* This) {
    return This->lpVtbl->IsSeeking(This);
}
static __WIDL_INLINE double IMFMediaEngine_GetCurrentTime(IMFMediaEngine* This) {
    return This->lpVtbl->GetCurrentTime(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetCurrentTime(IMFMediaEngine* This,double time) {
    return This->lpVtbl->SetCurrentTime(This,time);
}
static __WIDL_INLINE double IMFMediaEngine_GetStartTime(IMFMediaEngine* This) {
    return This->lpVtbl->GetStartTime(This);
}
static __WIDL_INLINE double IMFMediaEngine_GetDuration(IMFMediaEngine* This) {
    return This->lpVtbl->GetDuration(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_IsPaused(IMFMediaEngine* This) {
    return This->lpVtbl->IsPaused(This);
}
static __WIDL_INLINE double IMFMediaEngine_GetDefaultPlaybackRate(IMFMediaEngine* This) {
    return This->lpVtbl->GetDefaultPlaybackRate(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetDefaultPlaybackRate(IMFMediaEngine* This,double rate) {
    return This->lpVtbl->SetDefaultPlaybackRate(This,rate);
}
static __WIDL_INLINE double IMFMediaEngine_GetPlaybackRate(IMFMediaEngine* This) {
    return This->lpVtbl->GetPlaybackRate(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetPlaybackRate(IMFMediaEngine* This,double rate) {
    return This->lpVtbl->SetPlaybackRate(This,rate);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetPlayed(IMFMediaEngine* This,IMFMediaTimeRange **played) {
    return This->lpVtbl->GetPlayed(This,played);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetSeekable(IMFMediaEngine* This,IMFMediaTimeRange **seekable) {
    return This->lpVtbl->GetSeekable(This,seekable);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_IsEnded(IMFMediaEngine* This) {
    return This->lpVtbl->IsEnded(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_GetAutoPlay(IMFMediaEngine* This) {
    return This->lpVtbl->GetAutoPlay(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetAutoPlay(IMFMediaEngine* This,WINBOOL autoplay) {
    return This->lpVtbl->SetAutoPlay(This,autoplay);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_GetLoop(IMFMediaEngine* This) {
    return This->lpVtbl->GetLoop(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetLoop(IMFMediaEngine* This,WINBOOL loop) {
    return This->lpVtbl->SetLoop(This,loop);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_Play(IMFMediaEngine* This) {
    return This->lpVtbl->Play(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_Pause(IMFMediaEngine* This) {
    return This->lpVtbl->Pause(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_GetMuted(IMFMediaEngine* This) {
    return This->lpVtbl->GetMuted(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetMuted(IMFMediaEngine* This,WINBOOL muted) {
    return This->lpVtbl->SetMuted(This,muted);
}
static __WIDL_INLINE double IMFMediaEngine_GetVolume(IMFMediaEngine* This) {
    return This->lpVtbl->GetVolume(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_SetVolume(IMFMediaEngine* This,double volume) {
    return This->lpVtbl->SetVolume(This,volume);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_HasVideo(IMFMediaEngine* This) {
    return This->lpVtbl->HasVideo(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngine_HasAudio(IMFMediaEngine* This) {
    return This->lpVtbl->HasAudio(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetNativeVideoSize(IMFMediaEngine* This,DWORD *cx,DWORD *cy) {
    return This->lpVtbl->GetNativeVideoSize(This,cx,cy);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_GetVideoAspectRatio(IMFMediaEngine* This,DWORD *cx,DWORD *cy) {
    return This->lpVtbl->GetVideoAspectRatio(This,cx,cy);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_Shutdown(IMFMediaEngine* This) {
    return This->lpVtbl->Shutdown(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_TransferVideoFrame(IMFMediaEngine* This,IUnknown *surface,const MFVideoNormalizedRect *src,const RECT *dst,const MFARGB *color) {
    return This->lpVtbl->TransferVideoFrame(This,surface,src,dst,color);
}
static __WIDL_INLINE HRESULT IMFMediaEngine_OnVideoStreamTick(IMFMediaEngine* This,LONGLONG *time) {
    return This->lpVtbl->OnVideoStreamTick(This,time);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngine_INTERFACE_DEFINED__ */

typedef enum MF_MEDIA_ENGINE_STATISTIC {
    MF_MEDIA_ENGINE_STATISTIC_FRAMES_RENDERED = 0,
    MF_MEDIA_ENGINE_STATISTIC_FRAMES_DROPPED = 1,
    MF_MEDIA_ENGINE_STATISTIC_BYTES_DOWNLOADED = 2,
    MF_MEDIA_ENGINE_STATISTIC_BUFFER_PROGRESS = 3,
    MF_MEDIA_ENGINE_STATISTIC_FRAMES_PER_SECOND = 4,
    MF_MEDIA_ENGINE_STATISTIC_PLAYBACK_JITTER = 5,
    MF_MEDIA_ENGINE_STATISTIC_FRAMES_CORRUPTED = 6,
    MF_MEDIA_ENGINE_STATISTIC_TOTAL_FRAME_DELAY = 7
} MF_MEDIA_ENGINE_STATISTIC;
typedef enum MF_MEDIA_ENGINE_S3D_PACKING_MODE {
    MF_MEDIA_ENGINE_S3D_PACKING_MODE_NONE = 0,
    MF_MEDIA_ENGINE_S3D_PACKING_MODE_SIDE_BY_SIDE = 1,
    MF_MEDIA_ENGINE_S3D_PACKING_MODE_TOP_BOTTOM = 2
} MF_MEDIA_ENGINE_S3D_PACKING_MODE;
typedef enum MF_MEDIA_ENGINE_SEEK_MODE {
    MF_MEDIA_ENGINE_SEEK_MODE_NORMAL = 0,
    MF_MEDIA_ENGINE_SEEK_MODE_APPROXIMATE = 1
} MF_MEDIA_ENGINE_SEEK_MODE;
/*****************************************************************************
 * IMFMediaEngineEx interface
 */
#ifndef __IMFMediaEngineEx_INTERFACE_DEFINED__
#define __IMFMediaEngineEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineEx, 0x83015ead, 0xb1e6, 0x40d0, 0xa9,0x8a, 0x37,0x14,0x5f,0xfe,0x1a,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("83015ead-b1e6-40d0-a98a-37145ffe1ad1")
IMFMediaEngineEx : public IMFMediaEngine
{
    virtual HRESULT STDMETHODCALLTYPE SetSourceFromByteStream(
        IMFByteStream *bytestream,
        BSTR url) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatistics(
        MF_MEDIA_ENGINE_STATISTIC stat_id,
        PROPVARIANT *stat) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateVideoStream(
        const MFVideoNormalizedRect *src,
        const RECT *dst,
        const MFARGB *border_color) = 0;

    virtual double STDMETHODCALLTYPE GetBalance(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBalance(
        double balance) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsPlaybackRateSupported(
        double rate) = 0;

    virtual HRESULT STDMETHODCALLTYPE FrameStep(
        WINBOOL forward) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceCharacteristics(
        DWORD *flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPresentationAttribute(
        REFGUID attribute,
        PROPVARIANT *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNumberOfStreams(
        DWORD *stream_count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamAttribute(
        DWORD stream_index,
        REFGUID attribute,
        PROPVARIANT *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamSelection(
        DWORD stream_index,
        WINBOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamSelection(
        DWORD stream_index,
        WINBOOL enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyStreamSelections(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsProtected(
        WINBOOL *is_protected) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertVideoEffect(
        IUnknown *effect,
        WINBOOL is_optional) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAudioEffect(
        IUnknown *effect,
        WINBOOL is_optional) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllEffects(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimelineMarkerTimer(
        double timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimelineMarkerTimer(
        double *timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelTimelineMarkerTimer(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsStereo3D(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStereo3DFramePackingMode(
        MF_MEDIA_ENGINE_S3D_PACKING_MODE *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStereo3DFramePackingMode(
        MF_MEDIA_ENGINE_S3D_PACKING_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStereo3DRenderMode(
        MF3DVideoOutputType *output_type) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStereo3DRenderMode(
        MF3DVideoOutputType output_type) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableWindowlessSwapchainMode(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVideoSwapchainHandle(
        HANDLE *swapchain) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableHorizontalMirrorMode(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioStreamCategory(
        UINT32 *category) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAudioStreamCategory(
        UINT32 category) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioEndpointRole(
        UINT32 *role) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAudioEndpointRole(
        UINT32 role) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRealTimeMode(
        WINBOOL *enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRealTimeMode(
        WINBOOL enable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentTimeEx(
        double seektime,
        MF_MEDIA_ENGINE_SEEK_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableTimeUpdateTimer(
        WINBOOL enable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineEx, 0x83015ead, 0xb1e6, 0x40d0, 0xa9,0x8a, 0x37,0x14,0x5f,0xfe,0x1a,0xd1)
#endif
#else
typedef struct IMFMediaEngineExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngine methods ***/
    HRESULT (STDMETHODCALLTYPE *GetError)(
        IMFMediaEngineEx *This,
        IMFMediaError **error);

    HRESULT (STDMETHODCALLTYPE *SetErrorCode)(
        IMFMediaEngineEx *This,
        MF_MEDIA_ENGINE_ERR error);

    HRESULT (STDMETHODCALLTYPE *SetSourceElements)(
        IMFMediaEngineEx *This,
        IMFMediaEngineSrcElements *elements);

    HRESULT (STDMETHODCALLTYPE *SetSource)(
        IMFMediaEngineEx *This,
        BSTR url);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSource)(
        IMFMediaEngineEx *This,
        BSTR *url);

    USHORT (STDMETHODCALLTYPE *GetNetworkState)(
        IMFMediaEngineEx *This);

    MF_MEDIA_ENGINE_PRELOAD (STDMETHODCALLTYPE *GetPreload)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetPreload)(
        IMFMediaEngineEx *This,
        MF_MEDIA_ENGINE_PRELOAD preload);

    HRESULT (STDMETHODCALLTYPE *GetBuffered)(
        IMFMediaEngineEx *This,
        IMFMediaTimeRange **buffered);

    HRESULT (STDMETHODCALLTYPE *Load)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *CanPlayType)(
        IMFMediaEngineEx *This,
        BSTR type,
        MF_MEDIA_ENGINE_CANPLAY *answer);

    USHORT (STDMETHODCALLTYPE *GetReadyState)(
        IMFMediaEngineEx *This);

    WINBOOL (STDMETHODCALLTYPE *IsSeeking)(
        IMFMediaEngineEx *This);

    double (STDMETHODCALLTYPE *GetCurrentTime)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetCurrentTime)(
        IMFMediaEngineEx *This,
        double time);

    double (STDMETHODCALLTYPE *GetStartTime)(
        IMFMediaEngineEx *This);

    double (STDMETHODCALLTYPE *GetDuration)(
        IMFMediaEngineEx *This);

    WINBOOL (STDMETHODCALLTYPE *IsPaused)(
        IMFMediaEngineEx *This);

    double (STDMETHODCALLTYPE *GetDefaultPlaybackRate)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetDefaultPlaybackRate)(
        IMFMediaEngineEx *This,
        double rate);

    double (STDMETHODCALLTYPE *GetPlaybackRate)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetPlaybackRate)(
        IMFMediaEngineEx *This,
        double rate);

    HRESULT (STDMETHODCALLTYPE *GetPlayed)(
        IMFMediaEngineEx *This,
        IMFMediaTimeRange **played);

    HRESULT (STDMETHODCALLTYPE *GetSeekable)(
        IMFMediaEngineEx *This,
        IMFMediaTimeRange **seekable);

    WINBOOL (STDMETHODCALLTYPE *IsEnded)(
        IMFMediaEngineEx *This);

    WINBOOL (STDMETHODCALLTYPE *GetAutoPlay)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetAutoPlay)(
        IMFMediaEngineEx *This,
        WINBOOL autoplay);

    WINBOOL (STDMETHODCALLTYPE *GetLoop)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetLoop)(
        IMFMediaEngineEx *This,
        WINBOOL loop);

    HRESULT (STDMETHODCALLTYPE *Play)(
        IMFMediaEngineEx *This);

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

    WINBOOL (STDMETHODCALLTYPE *GetMuted)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetMuted)(
        IMFMediaEngineEx *This,
        WINBOOL muted);

    double (STDMETHODCALLTYPE *GetVolume)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetVolume)(
        IMFMediaEngineEx *This,
        double volume);

    WINBOOL (STDMETHODCALLTYPE *HasVideo)(
        IMFMediaEngineEx *This);

    WINBOOL (STDMETHODCALLTYPE *HasAudio)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *GetNativeVideoSize)(
        IMFMediaEngineEx *This,
        DWORD *cx,
        DWORD *cy);

    HRESULT (STDMETHODCALLTYPE *GetVideoAspectRatio)(
        IMFMediaEngineEx *This,
        DWORD *cx,
        DWORD *cy);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *TransferVideoFrame)(
        IMFMediaEngineEx *This,
        IUnknown *surface,
        const MFVideoNormalizedRect *src,
        const RECT *dst,
        const MFARGB *color);

    HRESULT (STDMETHODCALLTYPE *OnVideoStreamTick)(
        IMFMediaEngineEx *This,
        LONGLONG *time);

    /*** IMFMediaEngineEx methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSourceFromByteStream)(
        IMFMediaEngineEx *This,
        IMFByteStream *bytestream,
        BSTR url);

    HRESULT (STDMETHODCALLTYPE *GetStatistics)(
        IMFMediaEngineEx *This,
        MF_MEDIA_ENGINE_STATISTIC stat_id,
        PROPVARIANT *stat);

    HRESULT (STDMETHODCALLTYPE *UpdateVideoStream)(
        IMFMediaEngineEx *This,
        const MFVideoNormalizedRect *src,
        const RECT *dst,
        const MFARGB *border_color);

    double (STDMETHODCALLTYPE *GetBalance)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetBalance)(
        IMFMediaEngineEx *This,
        double balance);

    WINBOOL (STDMETHODCALLTYPE *IsPlaybackRateSupported)(
        IMFMediaEngineEx *This,
        double rate);

    HRESULT (STDMETHODCALLTYPE *FrameStep)(
        IMFMediaEngineEx *This,
        WINBOOL forward);

    HRESULT (STDMETHODCALLTYPE *GetResourceCharacteristics)(
        IMFMediaEngineEx *This,
        DWORD *flags);

    HRESULT (STDMETHODCALLTYPE *GetPresentationAttribute)(
        IMFMediaEngineEx *This,
        REFGUID attribute,
        PROPVARIANT *value);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfStreams)(
        IMFMediaEngineEx *This,
        DWORD *stream_count);

    HRESULT (STDMETHODCALLTYPE *GetStreamAttribute)(
        IMFMediaEngineEx *This,
        DWORD stream_index,
        REFGUID attribute,
        PROPVARIANT *value);

    HRESULT (STDMETHODCALLTYPE *GetStreamSelection)(
        IMFMediaEngineEx *This,
        DWORD stream_index,
        WINBOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *SetStreamSelection)(
        IMFMediaEngineEx *This,
        DWORD stream_index,
        WINBOOL enabled);

    HRESULT (STDMETHODCALLTYPE *ApplyStreamSelections)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *IsProtected)(
        IMFMediaEngineEx *This,
        WINBOOL *is_protected);

    HRESULT (STDMETHODCALLTYPE *InsertVideoEffect)(
        IMFMediaEngineEx *This,
        IUnknown *effect,
        WINBOOL is_optional);

    HRESULT (STDMETHODCALLTYPE *InsertAudioEffect)(
        IMFMediaEngineEx *This,
        IUnknown *effect,
        WINBOOL is_optional);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEffects)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *SetTimelineMarkerTimer)(
        IMFMediaEngineEx *This,
        double timeout);

    HRESULT (STDMETHODCALLTYPE *GetTimelineMarkerTimer)(
        IMFMediaEngineEx *This,
        double *timeout);

    HRESULT (STDMETHODCALLTYPE *CancelTimelineMarkerTimer)(
        IMFMediaEngineEx *This);

    WINBOOL (STDMETHODCALLTYPE *IsStereo3D)(
        IMFMediaEngineEx *This);

    HRESULT (STDMETHODCALLTYPE *GetStereo3DFramePackingMode)(
        IMFMediaEngineEx *This,
        MF_MEDIA_ENGINE_S3D_PACKING_MODE *mode);

    HRESULT (STDMETHODCALLTYPE *SetStereo3DFramePackingMode)(
        IMFMediaEngineEx *This,
        MF_MEDIA_ENGINE_S3D_PACKING_MODE mode);

    HRESULT (STDMETHODCALLTYPE *GetStereo3DRenderMode)(
        IMFMediaEngineEx *This,
        MF3DVideoOutputType *output_type);

    HRESULT (STDMETHODCALLTYPE *SetStereo3DRenderMode)(
        IMFMediaEngineEx *This,
        MF3DVideoOutputType output_type);

    HRESULT (STDMETHODCALLTYPE *EnableWindowlessSwapchainMode)(
        IMFMediaEngineEx *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetVideoSwapchainHandle)(
        IMFMediaEngineEx *This,
        HANDLE *swapchain);

    HRESULT (STDMETHODCALLTYPE *EnableHorizontalMirrorMode)(
        IMFMediaEngineEx *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *GetAudioStreamCategory)(
        IMFMediaEngineEx *This,
        UINT32 *category);

    HRESULT (STDMETHODCALLTYPE *SetAudioStreamCategory)(
        IMFMediaEngineEx *This,
        UINT32 category);

    HRESULT (STDMETHODCALLTYPE *GetAudioEndpointRole)(
        IMFMediaEngineEx *This,
        UINT32 *role);

    HRESULT (STDMETHODCALLTYPE *SetAudioEndpointRole)(
        IMFMediaEngineEx *This,
        UINT32 role);

    HRESULT (STDMETHODCALLTYPE *GetRealTimeMode)(
        IMFMediaEngineEx *This,
        WINBOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *SetRealTimeMode)(
        IMFMediaEngineEx *This,
        WINBOOL enable);

    HRESULT (STDMETHODCALLTYPE *SetCurrentTimeEx)(
        IMFMediaEngineEx *This,
        double seektime,
        MF_MEDIA_ENGINE_SEEK_MODE mode);

    HRESULT (STDMETHODCALLTYPE *EnableTimeUpdateTimer)(
        IMFMediaEngineEx *This,
        WINBOOL enable);

    END_INTERFACE
} IMFMediaEngineExVtbl;

interface IMFMediaEngineEx {
    CONST_VTBL IMFMediaEngineExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineEx_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngine methods ***/
#define IMFMediaEngineEx_GetError(This,error) (This)->lpVtbl->GetError(This,error)
#define IMFMediaEngineEx_SetErrorCode(This,error) (This)->lpVtbl->SetErrorCode(This,error)
#define IMFMediaEngineEx_SetSourceElements(This,elements) (This)->lpVtbl->SetSourceElements(This,elements)
#define IMFMediaEngineEx_SetSource(This,url) (This)->lpVtbl->SetSource(This,url)
#define IMFMediaEngineEx_GetCurrentSource(This,url) (This)->lpVtbl->GetCurrentSource(This,url)
#define IMFMediaEngineEx_GetNetworkState(This) (This)->lpVtbl->GetNetworkState(This)
#define IMFMediaEngineEx_GetPreload(This) (This)->lpVtbl->GetPreload(This)
#define IMFMediaEngineEx_SetPreload(This,preload) (This)->lpVtbl->SetPreload(This,preload)
#define IMFMediaEngineEx_GetBuffered(This,buffered) (This)->lpVtbl->GetBuffered(This,buffered)
#define IMFMediaEngineEx_Load(This) (This)->lpVtbl->Load(This)
#define IMFMediaEngineEx_CanPlayType(This,type,answer) (This)->lpVtbl->CanPlayType(This,type,answer)
#define IMFMediaEngineEx_GetReadyState(This) (This)->lpVtbl->GetReadyState(This)
#define IMFMediaEngineEx_IsSeeking(This) (This)->lpVtbl->IsSeeking(This)
#define IMFMediaEngineEx_GetCurrentTime(This) (This)->lpVtbl->GetCurrentTime(This)
#define IMFMediaEngineEx_SetCurrentTime(This,time) (This)->lpVtbl->SetCurrentTime(This,time)
#define IMFMediaEngineEx_GetStartTime(This) (This)->lpVtbl->GetStartTime(This)
#define IMFMediaEngineEx_GetDuration(This) (This)->lpVtbl->GetDuration(This)
#define IMFMediaEngineEx_IsPaused(This) (This)->lpVtbl->IsPaused(This)
#define IMFMediaEngineEx_GetDefaultPlaybackRate(This) (This)->lpVtbl->GetDefaultPlaybackRate(This)
#define IMFMediaEngineEx_SetDefaultPlaybackRate(This,rate) (This)->lpVtbl->SetDefaultPlaybackRate(This,rate)
#define IMFMediaEngineEx_GetPlaybackRate(This) (This)->lpVtbl->GetPlaybackRate(This)
#define IMFMediaEngineEx_SetPlaybackRate(This,rate) (This)->lpVtbl->SetPlaybackRate(This,rate)
#define IMFMediaEngineEx_GetPlayed(This,played) (This)->lpVtbl->GetPlayed(This,played)
#define IMFMediaEngineEx_GetSeekable(This,seekable) (This)->lpVtbl->GetSeekable(This,seekable)
#define IMFMediaEngineEx_IsEnded(This) (This)->lpVtbl->IsEnded(This)
#define IMFMediaEngineEx_GetAutoPlay(This) (This)->lpVtbl->GetAutoPlay(This)
#define IMFMediaEngineEx_SetAutoPlay(This,autoplay) (This)->lpVtbl->SetAutoPlay(This,autoplay)
#define IMFMediaEngineEx_GetLoop(This) (This)->lpVtbl->GetLoop(This)
#define IMFMediaEngineEx_SetLoop(This,loop) (This)->lpVtbl->SetLoop(This,loop)
#define IMFMediaEngineEx_Play(This) (This)->lpVtbl->Play(This)
#define IMFMediaEngineEx_Pause(This) (This)->lpVtbl->Pause(This)
#define IMFMediaEngineEx_GetMuted(This) (This)->lpVtbl->GetMuted(This)
#define IMFMediaEngineEx_SetMuted(This,muted) (This)->lpVtbl->SetMuted(This,muted)
#define IMFMediaEngineEx_GetVolume(This) (This)->lpVtbl->GetVolume(This)
#define IMFMediaEngineEx_SetVolume(This,volume) (This)->lpVtbl->SetVolume(This,volume)
#define IMFMediaEngineEx_HasVideo(This) (This)->lpVtbl->HasVideo(This)
#define IMFMediaEngineEx_HasAudio(This) (This)->lpVtbl->HasAudio(This)
#define IMFMediaEngineEx_GetNativeVideoSize(This,cx,cy) (This)->lpVtbl->GetNativeVideoSize(This,cx,cy)
#define IMFMediaEngineEx_GetVideoAspectRatio(This,cx,cy) (This)->lpVtbl->GetVideoAspectRatio(This,cx,cy)
#define IMFMediaEngineEx_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#define IMFMediaEngineEx_TransferVideoFrame(This,surface,src,dst,color) (This)->lpVtbl->TransferVideoFrame(This,surface,src,dst,color)
#define IMFMediaEngineEx_OnVideoStreamTick(This,time) (This)->lpVtbl->OnVideoStreamTick(This,time)
/*** IMFMediaEngineEx methods ***/
#define IMFMediaEngineEx_SetSourceFromByteStream(This,bytestream,url) (This)->lpVtbl->SetSourceFromByteStream(This,bytestream,url)
#define IMFMediaEngineEx_GetStatistics(This,stat_id,stat) (This)->lpVtbl->GetStatistics(This,stat_id,stat)
#define IMFMediaEngineEx_UpdateVideoStream(This,src,dst,border_color) (This)->lpVtbl->UpdateVideoStream(This,src,dst,border_color)
#define IMFMediaEngineEx_GetBalance(This) (This)->lpVtbl->GetBalance(This)
#define IMFMediaEngineEx_SetBalance(This,balance) (This)->lpVtbl->SetBalance(This,balance)
#define IMFMediaEngineEx_IsPlaybackRateSupported(This,rate) (This)->lpVtbl->IsPlaybackRateSupported(This,rate)
#define IMFMediaEngineEx_FrameStep(This,forward) (This)->lpVtbl->FrameStep(This,forward)
#define IMFMediaEngineEx_GetResourceCharacteristics(This,flags) (This)->lpVtbl->GetResourceCharacteristics(This,flags)
#define IMFMediaEngineEx_GetPresentationAttribute(This,attribute,value) (This)->lpVtbl->GetPresentationAttribute(This,attribute,value)
#define IMFMediaEngineEx_GetNumberOfStreams(This,stream_count) (This)->lpVtbl->GetNumberOfStreams(This,stream_count)
#define IMFMediaEngineEx_GetStreamAttribute(This,stream_index,attribute,value) (This)->lpVtbl->GetStreamAttribute(This,stream_index,attribute,value)
#define IMFMediaEngineEx_GetStreamSelection(This,stream_index,enabled) (This)->lpVtbl->GetStreamSelection(This,stream_index,enabled)
#define IMFMediaEngineEx_SetStreamSelection(This,stream_index,enabled) (This)->lpVtbl->SetStreamSelection(This,stream_index,enabled)
#define IMFMediaEngineEx_ApplyStreamSelections(This) (This)->lpVtbl->ApplyStreamSelections(This)
#define IMFMediaEngineEx_IsProtected(This,is_protected) (This)->lpVtbl->IsProtected(This,is_protected)
#define IMFMediaEngineEx_InsertVideoEffect(This,effect,is_optional) (This)->lpVtbl->InsertVideoEffect(This,effect,is_optional)
#define IMFMediaEngineEx_InsertAudioEffect(This,effect,is_optional) (This)->lpVtbl->InsertAudioEffect(This,effect,is_optional)
#define IMFMediaEngineEx_RemoveAllEffects(This) (This)->lpVtbl->RemoveAllEffects(This)
#define IMFMediaEngineEx_SetTimelineMarkerTimer(This,timeout) (This)->lpVtbl->SetTimelineMarkerTimer(This,timeout)
#define IMFMediaEngineEx_GetTimelineMarkerTimer(This,timeout) (This)->lpVtbl->GetTimelineMarkerTimer(This,timeout)
#define IMFMediaEngineEx_CancelTimelineMarkerTimer(This) (This)->lpVtbl->CancelTimelineMarkerTimer(This)
#define IMFMediaEngineEx_IsStereo3D(This) (This)->lpVtbl->IsStereo3D(This)
#define IMFMediaEngineEx_GetStereo3DFramePackingMode(This,mode) (This)->lpVtbl->GetStereo3DFramePackingMode(This,mode)
#define IMFMediaEngineEx_SetStereo3DFramePackingMode(This,mode) (This)->lpVtbl->SetStereo3DFramePackingMode(This,mode)
#define IMFMediaEngineEx_GetStereo3DRenderMode(This,output_type) (This)->lpVtbl->GetStereo3DRenderMode(This,output_type)
#define IMFMediaEngineEx_SetStereo3DRenderMode(This,output_type) (This)->lpVtbl->SetStereo3DRenderMode(This,output_type)
#define IMFMediaEngineEx_EnableWindowlessSwapchainMode(This,enable) (This)->lpVtbl->EnableWindowlessSwapchainMode(This,enable)
#define IMFMediaEngineEx_GetVideoSwapchainHandle(This,swapchain) (This)->lpVtbl->GetVideoSwapchainHandle(This,swapchain)
#define IMFMediaEngineEx_EnableHorizontalMirrorMode(This,enable) (This)->lpVtbl->EnableHorizontalMirrorMode(This,enable)
#define IMFMediaEngineEx_GetAudioStreamCategory(This,category) (This)->lpVtbl->GetAudioStreamCategory(This,category)
#define IMFMediaEngineEx_SetAudioStreamCategory(This,category) (This)->lpVtbl->SetAudioStreamCategory(This,category)
#define IMFMediaEngineEx_GetAudioEndpointRole(This,role) (This)->lpVtbl->GetAudioEndpointRole(This,role)
#define IMFMediaEngineEx_SetAudioEndpointRole(This,role) (This)->lpVtbl->SetAudioEndpointRole(This,role)
#define IMFMediaEngineEx_GetRealTimeMode(This,enabled) (This)->lpVtbl->GetRealTimeMode(This,enabled)
#define IMFMediaEngineEx_SetRealTimeMode(This,enable) (This)->lpVtbl->SetRealTimeMode(This,enable)
#define IMFMediaEngineEx_SetCurrentTimeEx(This,seektime,mode) (This)->lpVtbl->SetCurrentTimeEx(This,seektime,mode)
#define IMFMediaEngineEx_EnableTimeUpdateTimer(This,enable) (This)->lpVtbl->EnableTimeUpdateTimer(This,enable)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineEx_QueryInterface(IMFMediaEngineEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineEx_AddRef(IMFMediaEngineEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineEx_Release(IMFMediaEngineEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngine methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetError(IMFMediaEngineEx* This,IMFMediaError **error) {
    return This->lpVtbl->GetError(This,error);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetErrorCode(IMFMediaEngineEx* This,MF_MEDIA_ENGINE_ERR error) {
    return This->lpVtbl->SetErrorCode(This,error);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetSourceElements(IMFMediaEngineEx* This,IMFMediaEngineSrcElements *elements) {
    return This->lpVtbl->SetSourceElements(This,elements);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetSource(IMFMediaEngineEx* This,BSTR url) {
    return This->lpVtbl->SetSource(This,url);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetCurrentSource(IMFMediaEngineEx* This,BSTR *url) {
    return This->lpVtbl->GetCurrentSource(This,url);
}
static __WIDL_INLINE USHORT IMFMediaEngineEx_GetNetworkState(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetNetworkState(This);
}
static __WIDL_INLINE MF_MEDIA_ENGINE_PRELOAD IMFMediaEngineEx_GetPreload(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetPreload(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetPreload(IMFMediaEngineEx* This,MF_MEDIA_ENGINE_PRELOAD preload) {
    return This->lpVtbl->SetPreload(This,preload);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetBuffered(IMFMediaEngineEx* This,IMFMediaTimeRange **buffered) {
    return This->lpVtbl->GetBuffered(This,buffered);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_Load(IMFMediaEngineEx* This) {
    return This->lpVtbl->Load(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_CanPlayType(IMFMediaEngineEx* This,BSTR type,MF_MEDIA_ENGINE_CANPLAY *answer) {
    return This->lpVtbl->CanPlayType(This,type,answer);
}
static __WIDL_INLINE USHORT IMFMediaEngineEx_GetReadyState(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetReadyState(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_IsSeeking(IMFMediaEngineEx* This) {
    return This->lpVtbl->IsSeeking(This);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetCurrentTime(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetCurrentTime(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetCurrentTime(IMFMediaEngineEx* This,double time) {
    return This->lpVtbl->SetCurrentTime(This,time);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetStartTime(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetStartTime(This);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetDuration(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetDuration(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_IsPaused(IMFMediaEngineEx* This) {
    return This->lpVtbl->IsPaused(This);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetDefaultPlaybackRate(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetDefaultPlaybackRate(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetDefaultPlaybackRate(IMFMediaEngineEx* This,double rate) {
    return This->lpVtbl->SetDefaultPlaybackRate(This,rate);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetPlaybackRate(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetPlaybackRate(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetPlaybackRate(IMFMediaEngineEx* This,double rate) {
    return This->lpVtbl->SetPlaybackRate(This,rate);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetPlayed(IMFMediaEngineEx* This,IMFMediaTimeRange **played) {
    return This->lpVtbl->GetPlayed(This,played);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetSeekable(IMFMediaEngineEx* This,IMFMediaTimeRange **seekable) {
    return This->lpVtbl->GetSeekable(This,seekable);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_IsEnded(IMFMediaEngineEx* This) {
    return This->lpVtbl->IsEnded(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_GetAutoPlay(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetAutoPlay(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetAutoPlay(IMFMediaEngineEx* This,WINBOOL autoplay) {
    return This->lpVtbl->SetAutoPlay(This,autoplay);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_GetLoop(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetLoop(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetLoop(IMFMediaEngineEx* This,WINBOOL loop) {
    return This->lpVtbl->SetLoop(This,loop);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_Play(IMFMediaEngineEx* This) {
    return This->lpVtbl->Play(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_Pause(IMFMediaEngineEx* This) {
    return This->lpVtbl->Pause(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_GetMuted(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetMuted(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetMuted(IMFMediaEngineEx* This,WINBOOL muted) {
    return This->lpVtbl->SetMuted(This,muted);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetVolume(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetVolume(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetVolume(IMFMediaEngineEx* This,double volume) {
    return This->lpVtbl->SetVolume(This,volume);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_HasVideo(IMFMediaEngineEx* This) {
    return This->lpVtbl->HasVideo(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_HasAudio(IMFMediaEngineEx* This) {
    return This->lpVtbl->HasAudio(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetNativeVideoSize(IMFMediaEngineEx* This,DWORD *cx,DWORD *cy) {
    return This->lpVtbl->GetNativeVideoSize(This,cx,cy);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetVideoAspectRatio(IMFMediaEngineEx* This,DWORD *cx,DWORD *cy) {
    return This->lpVtbl->GetVideoAspectRatio(This,cx,cy);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_Shutdown(IMFMediaEngineEx* This) {
    return This->lpVtbl->Shutdown(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_TransferVideoFrame(IMFMediaEngineEx* This,IUnknown *surface,const MFVideoNormalizedRect *src,const RECT *dst,const MFARGB *color) {
    return This->lpVtbl->TransferVideoFrame(This,surface,src,dst,color);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_OnVideoStreamTick(IMFMediaEngineEx* This,LONGLONG *time) {
    return This->lpVtbl->OnVideoStreamTick(This,time);
}
/*** IMFMediaEngineEx methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetSourceFromByteStream(IMFMediaEngineEx* This,IMFByteStream *bytestream,BSTR url) {
    return This->lpVtbl->SetSourceFromByteStream(This,bytestream,url);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetStatistics(IMFMediaEngineEx* This,MF_MEDIA_ENGINE_STATISTIC stat_id,PROPVARIANT *stat) {
    return This->lpVtbl->GetStatistics(This,stat_id,stat);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_UpdateVideoStream(IMFMediaEngineEx* This,const MFVideoNormalizedRect *src,const RECT *dst,const MFARGB *border_color) {
    return This->lpVtbl->UpdateVideoStream(This,src,dst,border_color);
}
static __WIDL_INLINE double IMFMediaEngineEx_GetBalance(IMFMediaEngineEx* This) {
    return This->lpVtbl->GetBalance(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetBalance(IMFMediaEngineEx* This,double balance) {
    return This->lpVtbl->SetBalance(This,balance);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_IsPlaybackRateSupported(IMFMediaEngineEx* This,double rate) {
    return This->lpVtbl->IsPlaybackRateSupported(This,rate);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_FrameStep(IMFMediaEngineEx* This,WINBOOL forward) {
    return This->lpVtbl->FrameStep(This,forward);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetResourceCharacteristics(IMFMediaEngineEx* This,DWORD *flags) {
    return This->lpVtbl->GetResourceCharacteristics(This,flags);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetPresentationAttribute(IMFMediaEngineEx* This,REFGUID attribute,PROPVARIANT *value) {
    return This->lpVtbl->GetPresentationAttribute(This,attribute,value);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetNumberOfStreams(IMFMediaEngineEx* This,DWORD *stream_count) {
    return This->lpVtbl->GetNumberOfStreams(This,stream_count);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetStreamAttribute(IMFMediaEngineEx* This,DWORD stream_index,REFGUID attribute,PROPVARIANT *value) {
    return This->lpVtbl->GetStreamAttribute(This,stream_index,attribute,value);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetStreamSelection(IMFMediaEngineEx* This,DWORD stream_index,WINBOOL *enabled) {
    return This->lpVtbl->GetStreamSelection(This,stream_index,enabled);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetStreamSelection(IMFMediaEngineEx* This,DWORD stream_index,WINBOOL enabled) {
    return This->lpVtbl->SetStreamSelection(This,stream_index,enabled);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_ApplyStreamSelections(IMFMediaEngineEx* This) {
    return This->lpVtbl->ApplyStreamSelections(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_IsProtected(IMFMediaEngineEx* This,WINBOOL *is_protected) {
    return This->lpVtbl->IsProtected(This,is_protected);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_InsertVideoEffect(IMFMediaEngineEx* This,IUnknown *effect,WINBOOL is_optional) {
    return This->lpVtbl->InsertVideoEffect(This,effect,is_optional);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_InsertAudioEffect(IMFMediaEngineEx* This,IUnknown *effect,WINBOOL is_optional) {
    return This->lpVtbl->InsertAudioEffect(This,effect,is_optional);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_RemoveAllEffects(IMFMediaEngineEx* This) {
    return This->lpVtbl->RemoveAllEffects(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetTimelineMarkerTimer(IMFMediaEngineEx* This,double timeout) {
    return This->lpVtbl->SetTimelineMarkerTimer(This,timeout);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetTimelineMarkerTimer(IMFMediaEngineEx* This,double *timeout) {
    return This->lpVtbl->GetTimelineMarkerTimer(This,timeout);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_CancelTimelineMarkerTimer(IMFMediaEngineEx* This) {
    return This->lpVtbl->CancelTimelineMarkerTimer(This);
}
static __WIDL_INLINE WINBOOL IMFMediaEngineEx_IsStereo3D(IMFMediaEngineEx* This) {
    return This->lpVtbl->IsStereo3D(This);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetStereo3DFramePackingMode(IMFMediaEngineEx* This,MF_MEDIA_ENGINE_S3D_PACKING_MODE *mode) {
    return This->lpVtbl->GetStereo3DFramePackingMode(This,mode);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetStereo3DFramePackingMode(IMFMediaEngineEx* This,MF_MEDIA_ENGINE_S3D_PACKING_MODE mode) {
    return This->lpVtbl->SetStereo3DFramePackingMode(This,mode);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetStereo3DRenderMode(IMFMediaEngineEx* This,MF3DVideoOutputType *output_type) {
    return This->lpVtbl->GetStereo3DRenderMode(This,output_type);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetStereo3DRenderMode(IMFMediaEngineEx* This,MF3DVideoOutputType output_type) {
    return This->lpVtbl->SetStereo3DRenderMode(This,output_type);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_EnableWindowlessSwapchainMode(IMFMediaEngineEx* This,WINBOOL enable) {
    return This->lpVtbl->EnableWindowlessSwapchainMode(This,enable);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetVideoSwapchainHandle(IMFMediaEngineEx* This,HANDLE *swapchain) {
    return This->lpVtbl->GetVideoSwapchainHandle(This,swapchain);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_EnableHorizontalMirrorMode(IMFMediaEngineEx* This,WINBOOL enable) {
    return This->lpVtbl->EnableHorizontalMirrorMode(This,enable);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetAudioStreamCategory(IMFMediaEngineEx* This,UINT32 *category) {
    return This->lpVtbl->GetAudioStreamCategory(This,category);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetAudioStreamCategory(IMFMediaEngineEx* This,UINT32 category) {
    return This->lpVtbl->SetAudioStreamCategory(This,category);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetAudioEndpointRole(IMFMediaEngineEx* This,UINT32 *role) {
    return This->lpVtbl->GetAudioEndpointRole(This,role);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetAudioEndpointRole(IMFMediaEngineEx* This,UINT32 role) {
    return This->lpVtbl->SetAudioEndpointRole(This,role);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_GetRealTimeMode(IMFMediaEngineEx* This,WINBOOL *enabled) {
    return This->lpVtbl->GetRealTimeMode(This,enabled);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetRealTimeMode(IMFMediaEngineEx* This,WINBOOL enable) {
    return This->lpVtbl->SetRealTimeMode(This,enable);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_SetCurrentTimeEx(IMFMediaEngineEx* This,double seektime,MF_MEDIA_ENGINE_SEEK_MODE mode) {
    return This->lpVtbl->SetCurrentTimeEx(This,seektime,mode);
}
static __WIDL_INLINE HRESULT IMFMediaEngineEx_EnableTimeUpdateTimer(IMFMediaEngineEx* This,WINBOOL enable) {
    return This->lpVtbl->EnableTimeUpdateTimer(This,enable);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngineClassFactory interface
 */
#ifndef __IMFMediaEngineClassFactory_INTERFACE_DEFINED__
#define __IMFMediaEngineClassFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineClassFactory, 0x4d645ace, 0x26aa, 0x4688, 0x9b,0xe1, 0xdf,0x35,0x16,0x99,0x0b,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4d645ace-26aa-4688-9be1-df3516990b93")
IMFMediaEngineClassFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        DWORD flags,
        IMFAttributes *attributes,
        IMFMediaEngine **engine) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateTimeRange(
        IMFMediaTimeRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateError(
        IMFMediaError **error) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineClassFactory, 0x4d645ace, 0x26aa, 0x4688, 0x9b,0xe1, 0xdf,0x35,0x16,0x99,0x0b,0x93)
#endif
#else
typedef struct IMFMediaEngineClassFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngineClassFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IMFMediaEngineClassFactory *This,
        DWORD flags,
        IMFAttributes *attributes,
        IMFMediaEngine **engine);

    HRESULT (STDMETHODCALLTYPE *CreateTimeRange)(
        IMFMediaEngineClassFactory *This,
        IMFMediaTimeRange **range);

    HRESULT (STDMETHODCALLTYPE *CreateError)(
        IMFMediaEngineClassFactory *This,
        IMFMediaError **error);

    END_INTERFACE
} IMFMediaEngineClassFactoryVtbl;

interface IMFMediaEngineClassFactory {
    CONST_VTBL IMFMediaEngineClassFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineClassFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineClassFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineClassFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngineClassFactory methods ***/
#define IMFMediaEngineClassFactory_CreateInstance(This,flags,attributes,engine) (This)->lpVtbl->CreateInstance(This,flags,attributes,engine)
#define IMFMediaEngineClassFactory_CreateTimeRange(This,range) (This)->lpVtbl->CreateTimeRange(This,range)
#define IMFMediaEngineClassFactory_CreateError(This,error) (This)->lpVtbl->CreateError(This,error)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineClassFactory_QueryInterface(IMFMediaEngineClassFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineClassFactory_AddRef(IMFMediaEngineClassFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineClassFactory_Release(IMFMediaEngineClassFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngineClassFactory methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineClassFactory_CreateInstance(IMFMediaEngineClassFactory* This,DWORD flags,IMFAttributes *attributes,IMFMediaEngine **engine) {
    return This->lpVtbl->CreateInstance(This,flags,attributes,engine);
}
static __WIDL_INLINE HRESULT IMFMediaEngineClassFactory_CreateTimeRange(IMFMediaEngineClassFactory* This,IMFMediaTimeRange **range) {
    return This->lpVtbl->CreateTimeRange(This,range);
}
static __WIDL_INLINE HRESULT IMFMediaEngineClassFactory_CreateError(IMFMediaEngineClassFactory* This,IMFMediaError **error) {
    return This->lpVtbl->CreateError(This,error);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineClassFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngineNotify interface
 */
#ifndef __IMFMediaEngineNotify_INTERFACE_DEFINED__
#define __IMFMediaEngineNotify_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineNotify, 0xfee7c112, 0xe776, 0x42b5, 0x9b,0xbf, 0x00,0x48,0x52,0x4e,0x2b,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fee7c112-e776-42b5-9bbf-0048524e2bd5")
IMFMediaEngineNotify : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE EventNotify(
        DWORD event,
        DWORD_PTR param1,
        DWORD param2) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineNotify, 0xfee7c112, 0xe776, 0x42b5, 0x9b,0xbf, 0x00,0x48,0x52,0x4e,0x2b,0xd5)
#endif
#else
typedef struct IMFMediaEngineNotifyVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngineNotify methods ***/
    HRESULT (STDMETHODCALLTYPE *EventNotify)(
        IMFMediaEngineNotify *This,
        DWORD event,
        DWORD_PTR param1,
        DWORD param2);

    END_INTERFACE
} IMFMediaEngineNotifyVtbl;

interface IMFMediaEngineNotify {
    CONST_VTBL IMFMediaEngineNotifyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineNotify_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngineNotify methods ***/
#define IMFMediaEngineNotify_EventNotify(This,event,param1,param2) (This)->lpVtbl->EventNotify(This,event,param1,param2)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineNotify_QueryInterface(IMFMediaEngineNotify* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineNotify_AddRef(IMFMediaEngineNotify* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineNotify_Release(IMFMediaEngineNotify* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngineNotify methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineNotify_EventNotify(IMFMediaEngineNotify* This,DWORD event,DWORD_PTR param1,DWORD param2) {
    return This->lpVtbl->EventNotify(This,event,param1,param2);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineNotify_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngineAudioEndpointId interface
 */
#ifndef __IMFMediaEngineAudioEndpointId_INTERFACE_DEFINED__
#define __IMFMediaEngineAudioEndpointId_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineAudioEndpointId, 0x7a3bac98, 0x0e76, 0x49fb, 0x8c,0x20, 0x8a,0x86,0xfd,0x98,0xea,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7a3bac98-0e76-49fb-8c20-8a86fd98eaf2")
IMFMediaEngineAudioEndpointId : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAudioEndpointId(
        LPCWSTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAudioEndpointId(
        LPWSTR *id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineAudioEndpointId, 0x7a3bac98, 0x0e76, 0x49fb, 0x8c,0x20, 0x8a,0x86,0xfd,0x98,0xea,0xf2)
#endif
#else
typedef struct IMFMediaEngineAudioEndpointIdVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngineAudioEndpointId methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAudioEndpointId)(
        IMFMediaEngineAudioEndpointId *This,
        LPCWSTR id);

    HRESULT (STDMETHODCALLTYPE *GetAudioEndpointId)(
        IMFMediaEngineAudioEndpointId *This,
        LPWSTR *id);

    END_INTERFACE
} IMFMediaEngineAudioEndpointIdVtbl;

interface IMFMediaEngineAudioEndpointId {
    CONST_VTBL IMFMediaEngineAudioEndpointIdVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineAudioEndpointId_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineAudioEndpointId_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineAudioEndpointId_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngineAudioEndpointId methods ***/
#define IMFMediaEngineAudioEndpointId_SetAudioEndpointId(This,id) (This)->lpVtbl->SetAudioEndpointId(This,id)
#define IMFMediaEngineAudioEndpointId_GetAudioEndpointId(This,id) (This)->lpVtbl->GetAudioEndpointId(This,id)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineAudioEndpointId_QueryInterface(IMFMediaEngineAudioEndpointId* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineAudioEndpointId_AddRef(IMFMediaEngineAudioEndpointId* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineAudioEndpointId_Release(IMFMediaEngineAudioEndpointId* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngineAudioEndpointId methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineAudioEndpointId_SetAudioEndpointId(IMFMediaEngineAudioEndpointId* This,LPCWSTR id) {
    return This->lpVtbl->SetAudioEndpointId(This,id);
}
static __WIDL_INLINE HRESULT IMFMediaEngineAudioEndpointId_GetAudioEndpointId(IMFMediaEngineAudioEndpointId* This,LPWSTR *id) {
    return This->lpVtbl->GetAudioEndpointId(This,id);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineAudioEndpointId_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFMediaEngineExtension interface
 */
#ifndef __IMFMediaEngineExtension_INTERFACE_DEFINED__
#define __IMFMediaEngineExtension_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFMediaEngineExtension, 0x2f69d622, 0x20b5, 0x41e9, 0xaf,0xdf, 0x89,0xce,0xd1,0xdd,0xa0,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2f69d622-20b5-41e9-afdf-89ced1dda04e")
IMFMediaEngineExtension : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CanPlayType(
        WINBOOL audio_only,
        BSTR mime_type,
        MF_MEDIA_ENGINE_CANPLAY *answer) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginCreateObject(
        BSTR url,
        IMFByteStream *bytestream,
        MF_OBJECT_TYPE type,
        IUnknown **cancel_cookie,
        IMFAsyncCallback *callback,
        IUnknown *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelObjectCreation(
        IUnknown *cancel_cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndCreateObject(
        IMFAsyncResult *result,
        IUnknown **object) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFMediaEngineExtension, 0x2f69d622, 0x20b5, 0x41e9, 0xaf,0xdf, 0x89,0xce,0xd1,0xdd,0xa0,0x4e)
#endif
#else
typedef struct IMFMediaEngineExtensionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFMediaEngineExtension methods ***/
    HRESULT (STDMETHODCALLTYPE *CanPlayType)(
        IMFMediaEngineExtension *This,
        WINBOOL audio_only,
        BSTR mime_type,
        MF_MEDIA_ENGINE_CANPLAY *answer);

    HRESULT (STDMETHODCALLTYPE *BeginCreateObject)(
        IMFMediaEngineExtension *This,
        BSTR url,
        IMFByteStream *bytestream,
        MF_OBJECT_TYPE type,
        IUnknown **cancel_cookie,
        IMFAsyncCallback *callback,
        IUnknown *state);

    HRESULT (STDMETHODCALLTYPE *CancelObjectCreation)(
        IMFMediaEngineExtension *This,
        IUnknown *cancel_cookie);

    HRESULT (STDMETHODCALLTYPE *EndCreateObject)(
        IMFMediaEngineExtension *This,
        IMFAsyncResult *result,
        IUnknown **object);

    END_INTERFACE
} IMFMediaEngineExtensionVtbl;

interface IMFMediaEngineExtension {
    CONST_VTBL IMFMediaEngineExtensionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFMediaEngineExtension_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFMediaEngineExtension_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFMediaEngineExtension_Release(This) (This)->lpVtbl->Release(This)
/*** IMFMediaEngineExtension methods ***/
#define IMFMediaEngineExtension_CanPlayType(This,audio_only,mime_type,answer) (This)->lpVtbl->CanPlayType(This,audio_only,mime_type,answer)
#define IMFMediaEngineExtension_BeginCreateObject(This,url,bytestream,type,cancel_cookie,callback,state) (This)->lpVtbl->BeginCreateObject(This,url,bytestream,type,cancel_cookie,callback,state)
#define IMFMediaEngineExtension_CancelObjectCreation(This,cancel_cookie) (This)->lpVtbl->CancelObjectCreation(This,cancel_cookie)
#define IMFMediaEngineExtension_EndCreateObject(This,result,object) (This)->lpVtbl->EndCreateObject(This,result,object)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineExtension_QueryInterface(IMFMediaEngineExtension* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFMediaEngineExtension_AddRef(IMFMediaEngineExtension* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFMediaEngineExtension_Release(IMFMediaEngineExtension* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFMediaEngineExtension methods ***/
static __WIDL_INLINE HRESULT IMFMediaEngineExtension_CanPlayType(IMFMediaEngineExtension* This,WINBOOL audio_only,BSTR mime_type,MF_MEDIA_ENGINE_CANPLAY *answer) {
    return This->lpVtbl->CanPlayType(This,audio_only,mime_type,answer);
}
static __WIDL_INLINE HRESULT IMFMediaEngineExtension_BeginCreateObject(IMFMediaEngineExtension* This,BSTR url,IMFByteStream *bytestream,MF_OBJECT_TYPE type,IUnknown **cancel_cookie,IMFAsyncCallback *callback,IUnknown *state) {
    return This->lpVtbl->BeginCreateObject(This,url,bytestream,type,cancel_cookie,callback,state);
}
static __WIDL_INLINE HRESULT IMFMediaEngineExtension_CancelObjectCreation(IMFMediaEngineExtension* This,IUnknown *cancel_cookie) {
    return This->lpVtbl->CancelObjectCreation(This,cancel_cookie);
}
static __WIDL_INLINE HRESULT IMFMediaEngineExtension_EndCreateObject(IMFMediaEngineExtension* This,IMFAsyncResult *result,IUnknown **object) {
    return This->lpVtbl->EndCreateObject(This,result,object);
}
#endif
#endif

#endif


#endif  /* __IMFMediaEngineExtension_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mfmediaengine_h__ */
