/*** Autogenerated by WIDL 8.21 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 *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 *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,protected) (This)->lpVtbl->IsProtected(This,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 *protected) {
    return This->lpVtbl->IsProtected(This,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__ */
