/*** Autogenerated by WIDL 6.4 from include/vmr9.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 __vmr9_h__
#define __vmr9_h__

/* Forward declarations */

#ifndef __IVMRImagePresenter9_FWD_DEFINED__
#define __IVMRImagePresenter9_FWD_DEFINED__
typedef interface IVMRImagePresenter9 IVMRImagePresenter9;
#ifdef __cplusplus
interface IVMRImagePresenter9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocator9_FWD_DEFINED__
#define __IVMRSurfaceAllocator9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocator9 IVMRSurfaceAllocator9;
#ifdef __cplusplus
interface IVMRSurfaceAllocator9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorEx9 IVMRSurfaceAllocatorEx9;
#ifdef __cplusplus
interface IVMRSurfaceAllocatorEx9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorNotify9 IVMRSurfaceAllocatorNotify9;
#ifdef __cplusplus
interface IVMRSurfaceAllocatorNotify9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRWindowlessControl9_FWD_DEFINED__
#define __IVMRWindowlessControl9_FWD_DEFINED__
typedef interface IVMRWindowlessControl9 IVMRWindowlessControl9;
#ifdef __cplusplus
interface IVMRWindowlessControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMixerControl9_FWD_DEFINED__
#define __IVMRMixerControl9_FWD_DEFINED__
typedef interface IVMRMixerControl9 IVMRMixerControl9;
#ifdef __cplusplus
interface IVMRMixerControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMixerBitmap9_FWD_DEFINED__
#define __IVMRMixerBitmap9_FWD_DEFINED__
typedef interface IVMRMixerBitmap9 IVMRMixerBitmap9;
#ifdef __cplusplus
interface IVMRMixerBitmap9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurface9_FWD_DEFINED__
#define __IVMRSurface9_FWD_DEFINED__
typedef interface IVMRSurface9 IVMRSurface9;
#ifdef __cplusplus
interface IVMRSurface9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRImagePresenterConfig9_FWD_DEFINED__
#define __IVMRImagePresenterConfig9_FWD_DEFINED__
typedef interface IVMRImagePresenterConfig9 IVMRImagePresenterConfig9;
#ifdef __cplusplus
interface IVMRImagePresenterConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRVideoStreamControl9_FWD_DEFINED__
#define __IVMRVideoStreamControl9_FWD_DEFINED__
typedef interface IVMRVideoStreamControl9 IVMRVideoStreamControl9;
#ifdef __cplusplus
interface IVMRVideoStreamControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRFilterConfig9_FWD_DEFINED__
#define __IVMRFilterConfig9_FWD_DEFINED__
typedef interface IVMRFilterConfig9 IVMRFilterConfig9;
#ifdef __cplusplus
interface IVMRFilterConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRAspectRatioControl9_FWD_DEFINED__
#define __IVMRAspectRatioControl9_FWD_DEFINED__
typedef interface IVMRAspectRatioControl9 IVMRAspectRatioControl9;
#ifdef __cplusplus
interface IVMRAspectRatioControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMonitorConfig9_FWD_DEFINED__
#define __IVMRMonitorConfig9_FWD_DEFINED__
typedef interface IVMRMonitorConfig9 IVMRMonitorConfig9;
#ifdef __cplusplus
interface IVMRMonitorConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRDeinterlaceControl9_FWD_DEFINED__
#define __IVMRDeinterlaceControl9_FWD_DEFINED__
typedef interface IVMRDeinterlaceControl9 IVMRDeinterlaceControl9;
#ifdef __cplusplus
interface IVMRDeinterlaceControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRImageCompositor9_FWD_DEFINED__
#define __IVMRImageCompositor9_FWD_DEFINED__
typedef interface IVMRImageCompositor9 IVMRImageCompositor9;
#ifdef __cplusplus
interface IVMRImageCompositor9;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#if 0
#ifndef __IDirect3DSurface9_FWD_DEFINED__
#define __IDirect3DSurface9_FWD_DEFINED__
typedef interface IDirect3DSurface9 IDirect3DSurface9;
#ifdef __cplusplus
interface IDirect3DSurface9;
#endif /* __cplusplus */
#endif

#ifndef __IDirect3DDevice9_FWD_DEFINED__
#define __IDirect3DDevice9_FWD_DEFINED__
typedef interface IDirect3DDevice9 IDirect3DDevice9;
#ifdef __cplusplus
interface IDirect3DDevice9;
#endif /* __cplusplus */
#endif

typedef LONGLONG REFERENCE_TIME;
typedef DWORD D3DFORMAT;
typedef DWORD D3DPOOL;
typedef HANDLE HMONITOR;
typedef struct __WIDL_vmr9_generated_name_0000000C {
    char dummy;
} AM_MEDIA_TYPE;
typedef struct __WIDL_vmr9_generated_name_0000000D {
    char dummy;
} D3DCOLOR;
#endif
#ifndef __IVMRSurface9_FWD_DEFINED__
#define __IVMRSurface9_FWD_DEFINED__
typedef interface IVMRSurface9 IVMRSurface9;
#ifdef __cplusplus
interface IVMRSurface9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocator9_FWD_DEFINED__
#define __IVMRSurfaceAllocator9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocator9 IVMRSurfaceAllocator9;
#ifdef __cplusplus
interface IVMRSurfaceAllocator9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorEx9 IVMRSurfaceAllocatorEx9;
#ifdef __cplusplus
interface IVMRSurfaceAllocatorEx9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorNotify9 IVMRSurfaceAllocatorNotify9;
#ifdef __cplusplus
interface IVMRSurfaceAllocatorNotify9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRImagePresenter9_FWD_DEFINED__
#define __IVMRImagePresenter9_FWD_DEFINED__
typedef interface IVMRImagePresenter9 IVMRImagePresenter9;
#ifdef __cplusplus
interface IVMRImagePresenter9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRImagePresenterConfig9_FWD_DEFINED__
#define __IVMRImagePresenterConfig9_FWD_DEFINED__
typedef interface IVMRImagePresenterConfig9 IVMRImagePresenterConfig9;
#ifdef __cplusplus
interface IVMRImagePresenterConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMonitorConfig9_FWD_DEFINED__
#define __IVMRMonitorConfig9_FWD_DEFINED__
typedef interface IVMRMonitorConfig9 IVMRMonitorConfig9;
#ifdef __cplusplus
interface IVMRMonitorConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRWindowlessControl9_FWD_DEFINED__
#define __IVMRWindowlessControl9_FWD_DEFINED__
typedef interface IVMRWindowlessControl9 IVMRWindowlessControl9;
#ifdef __cplusplus
interface IVMRWindowlessControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMixerControl9_FWD_DEFINED__
#define __IVMRMixerControl9_FWD_DEFINED__
typedef interface IVMRMixerControl9 IVMRMixerControl9;
#ifdef __cplusplus
interface IVMRMixerControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRImageCompositor9_FWD_DEFINED__
#define __IVMRImageCompositor9_FWD_DEFINED__
typedef interface IVMRImageCompositor9 IVMRImageCompositor9;
#ifdef __cplusplus
interface IVMRImageCompositor9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRMixerBitmap9_FWD_DEFINED__
#define __IVMRMixerBitmap9_FWD_DEFINED__
typedef interface IVMRMixerBitmap9 IVMRMixerBitmap9;
#ifdef __cplusplus
interface IVMRMixerBitmap9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRFilterConfig9_FWD_DEFINED__
#define __IVMRFilterConfig9_FWD_DEFINED__
typedef interface IVMRFilterConfig9 IVMRFilterConfig9;
#ifdef __cplusplus
interface IVMRFilterConfig9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRAspectRatioControl9_FWD_DEFINED__
#define __IVMRAspectRatioControl9_FWD_DEFINED__
typedef interface IVMRAspectRatioControl9 IVMRAspectRatioControl9;
#ifdef __cplusplus
interface IVMRAspectRatioControl9;
#endif /* __cplusplus */
#endif

#ifndef __IVMRVideoStreamControl9_FWD_DEFINED__
#define __IVMRVideoStreamControl9_FWD_DEFINED__
typedef interface IVMRVideoStreamControl9 IVMRVideoStreamControl9;
#ifdef __cplusplus
interface IVMRVideoStreamControl9;
#endif /* __cplusplus */
#endif

typedef enum _VMR9PresentationFlags {
    VMR9Sample_SyncPoint = 0x1,
    VMR9Sample_Preroll = 0x2,
    VMR9Sample_Discontinuity = 0x4,
    VMR9Sample_TimeValid = 0x8,
    VMR9Sample_SrcDstRectsValid = 0x10
} VMR9PresentationFlags;
typedef struct _VMR9PresentationInfo {
    DWORD dwFlags;
    IDirect3DSurface9 *lpSurf;
    REFERENCE_TIME rtStart;
    REFERENCE_TIME rtEnd;
    SIZE szAspectRatio;
    RECT rcSrc;
    RECT rcDst;
    DWORD dwReserved1;
    DWORD dwReserved2;
} VMR9PresentationInfo;
/*****************************************************************************
 * IVMRImagePresenter9 interface
 */
#ifndef __IVMRImagePresenter9_INTERFACE_DEFINED__
#define __IVMRImagePresenter9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRImagePresenter9, 0x69188c61, 0x12a3, 0x40f0, 0x8f,0xfc, 0x34,0x2e,0x7b,0x43,0x3f,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("69188c61-12a3-40f0-8ffc-342e7b433fd7")
IVMRImagePresenter9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartPresenting(
        DWORD_PTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopPresenting(
        DWORD_PTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE PresentImage(
        DWORD_PTR id,
        VMR9PresentationInfo *info) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRImagePresenter9, 0x69188c61, 0x12a3, 0x40f0, 0x8f,0xfc, 0x34,0x2e,0x7b,0x43,0x3f,0xd7)
#endif
#else
typedef struct IVMRImagePresenter9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRImagePresenter9 methods ***/
    HRESULT (STDMETHODCALLTYPE *StartPresenting)(
        IVMRImagePresenter9 *This,
        DWORD_PTR id);

    HRESULT (STDMETHODCALLTYPE *StopPresenting)(
        IVMRImagePresenter9 *This,
        DWORD_PTR id);

    HRESULT (STDMETHODCALLTYPE *PresentImage)(
        IVMRImagePresenter9 *This,
        DWORD_PTR id,
        VMR9PresentationInfo *info);

    END_INTERFACE
} IVMRImagePresenter9Vtbl;

interface IVMRImagePresenter9 {
    CONST_VTBL IVMRImagePresenter9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRImagePresenter9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRImagePresenter9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRImagePresenter9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRImagePresenter9 methods ***/
#define IVMRImagePresenter9_StartPresenting(This,id) (This)->lpVtbl->StartPresenting(This,id)
#define IVMRImagePresenter9_StopPresenting(This,id) (This)->lpVtbl->StopPresenting(This,id)
#define IVMRImagePresenter9_PresentImage(This,id,info) (This)->lpVtbl->PresentImage(This,id,info)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRImagePresenter9_QueryInterface(IVMRImagePresenter9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRImagePresenter9_AddRef(IVMRImagePresenter9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRImagePresenter9_Release(IVMRImagePresenter9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRImagePresenter9 methods ***/
static FORCEINLINE HRESULT IVMRImagePresenter9_StartPresenting(IVMRImagePresenter9* This,DWORD_PTR id) {
    return This->lpVtbl->StartPresenting(This,id);
}
static FORCEINLINE HRESULT IVMRImagePresenter9_StopPresenting(IVMRImagePresenter9* This,DWORD_PTR id) {
    return This->lpVtbl->StopPresenting(This,id);
}
static FORCEINLINE HRESULT IVMRImagePresenter9_PresentImage(IVMRImagePresenter9* This,DWORD_PTR id,VMR9PresentationInfo *info) {
    return This->lpVtbl->PresentImage(This,id,info);
}
#endif
#endif

#endif


#endif  /* __IVMRImagePresenter9_INTERFACE_DEFINED__ */

typedef enum _VMR9SurfaceAllocationFlags {
    VMR9AllocFlag_3DRenderTarget = 0x1,
    VMR9AllocFlag_DXVATarget = 0x2,
    VMR9AllocFlag_TextureSurface = 0x4,
    VMR9AllocFlag_OffscreenSurface = 0x8,
    VMR9AllocFlag_RGBDynamicSwitch = 0x10,
    VMR9AllocFlag_UsageReserved = 0xe0,
    VMR9AllocFlag_UsageMask = 0xff
} VMR9SurfaceAllocationFlags;
typedef struct _VMR9AllocationInfo {
    DWORD dwFlags;
    DWORD dwWidth;
    DWORD dwHeight;
    D3DFORMAT Format;
    D3DPOOL Pool;
    DWORD MinBuffers;
    SIZE szAspectRatio;
    SIZE szNativeSize;
} VMR9AllocationInfo;
/*****************************************************************************
 * IVMRSurfaceAllocator9 interface
 */
#ifndef __IVMRSurfaceAllocator9_INTERFACE_DEFINED__
#define __IVMRSurfaceAllocator9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRSurfaceAllocator9, 0x8d5148ea, 0x3f5d, 0x46cf, 0x9d,0xf1, 0xd1,0xb8,0x96,0xee,0xdb,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8d5148ea-3f5d-46cf-9df1-d1b896eedb1f")
IVMRSurfaceAllocator9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitializeDevice(
        DWORD_PTR id,
        VMR9AllocationInfo *allocinfo,
        DWORD *numbuffers) = 0;

    virtual HRESULT STDMETHODCALLTYPE TerminateDevice(
        DWORD_PTR id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSurface(
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface) = 0;

    virtual HRESULT STDMETHODCALLTYPE AdviseNotify(
        IVMRSurfaceAllocatorNotify9 *allocnotify) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRSurfaceAllocator9, 0x8d5148ea, 0x3f5d, 0x46cf, 0x9d,0xf1, 0xd1,0xb8,0x96,0xee,0xdb,0x1f)
#endif
#else
typedef struct IVMRSurfaceAllocator9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRSurfaceAllocator9 methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeDevice)(
        IVMRSurfaceAllocator9 *This,
        DWORD_PTR id,
        VMR9AllocationInfo *allocinfo,
        DWORD *numbuffers);

    HRESULT (STDMETHODCALLTYPE *TerminateDevice)(
        IVMRSurfaceAllocator9 *This,
        DWORD_PTR id);

    HRESULT (STDMETHODCALLTYPE *GetSurface)(
        IVMRSurfaceAllocator9 *This,
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface);

    HRESULT (STDMETHODCALLTYPE *AdviseNotify)(
        IVMRSurfaceAllocator9 *This,
        IVMRSurfaceAllocatorNotify9 *allocnotify);

    END_INTERFACE
} IVMRSurfaceAllocator9Vtbl;

interface IVMRSurfaceAllocator9 {
    CONST_VTBL IVMRSurfaceAllocator9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRSurfaceAllocator9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRSurfaceAllocator9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRSurfaceAllocator9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRSurfaceAllocator9 methods ***/
#define IVMRSurfaceAllocator9_InitializeDevice(This,id,allocinfo,numbuffers) (This)->lpVtbl->InitializeDevice(This,id,allocinfo,numbuffers)
#define IVMRSurfaceAllocator9_TerminateDevice(This,id) (This)->lpVtbl->TerminateDevice(This,id)
#define IVMRSurfaceAllocator9_GetSurface(This,id,surfaceindex,flags,surface) (This)->lpVtbl->GetSurface(This,id,surfaceindex,flags,surface)
#define IVMRSurfaceAllocator9_AdviseNotify(This,allocnotify) (This)->lpVtbl->AdviseNotify(This,allocnotify)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocator9_QueryInterface(IVMRSurfaceAllocator9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRSurfaceAllocator9_AddRef(IVMRSurfaceAllocator9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRSurfaceAllocator9_Release(IVMRSurfaceAllocator9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRSurfaceAllocator9 methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocator9_InitializeDevice(IVMRSurfaceAllocator9* This,DWORD_PTR id,VMR9AllocationInfo *allocinfo,DWORD *numbuffers) {
    return This->lpVtbl->InitializeDevice(This,id,allocinfo,numbuffers);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocator9_TerminateDevice(IVMRSurfaceAllocator9* This,DWORD_PTR id) {
    return This->lpVtbl->TerminateDevice(This,id);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocator9_GetSurface(IVMRSurfaceAllocator9* This,DWORD_PTR id,DWORD surfaceindex,DWORD flags,IDirect3DSurface9 **surface) {
    return This->lpVtbl->GetSurface(This,id,surfaceindex,flags,surface);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocator9_AdviseNotify(IVMRSurfaceAllocator9* This,IVMRSurfaceAllocatorNotify9 *allocnotify) {
    return This->lpVtbl->AdviseNotify(This,allocnotify);
}
#endif
#endif

#endif


#endif  /* __IVMRSurfaceAllocator9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVMRSurfaceAllocatorEx9 interface
 */
#ifndef __IVMRSurfaceAllocatorEx9_INTERFACE_DEFINED__
#define __IVMRSurfaceAllocatorEx9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRSurfaceAllocatorEx9, 0x6de9a68a, 0xa928, 0x4522, 0xbf,0x57, 0x65,0x5a,0xe3,0x86,0x64,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6de9a68a-a928-4522-bf57-655ae3866456")
IVMRSurfaceAllocatorEx9 : public IVMRSurfaceAllocator9
{
    virtual HRESULT STDMETHODCALLTYPE GetSurfaceEx(
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface,
        RECT *dest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRSurfaceAllocatorEx9, 0x6de9a68a, 0xa928, 0x4522, 0xbf,0x57, 0x65,0x5a,0xe3,0x86,0x64,0x56)
#endif
#else
typedef struct IVMRSurfaceAllocatorEx9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRSurfaceAllocator9 methods ***/
    HRESULT (STDMETHODCALLTYPE *InitializeDevice)(
        IVMRSurfaceAllocatorEx9 *This,
        DWORD_PTR id,
        VMR9AllocationInfo *allocinfo,
        DWORD *numbuffers);

    HRESULT (STDMETHODCALLTYPE *TerminateDevice)(
        IVMRSurfaceAllocatorEx9 *This,
        DWORD_PTR id);

    HRESULT (STDMETHODCALLTYPE *GetSurface)(
        IVMRSurfaceAllocatorEx9 *This,
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface);

    HRESULT (STDMETHODCALLTYPE *AdviseNotify)(
        IVMRSurfaceAllocatorEx9 *This,
        IVMRSurfaceAllocatorNotify9 *allocnotify);

    /*** IVMRSurfaceAllocatorEx9 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSurfaceEx)(
        IVMRSurfaceAllocatorEx9 *This,
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface,
        RECT *dest);

    END_INTERFACE
} IVMRSurfaceAllocatorEx9Vtbl;

interface IVMRSurfaceAllocatorEx9 {
    CONST_VTBL IVMRSurfaceAllocatorEx9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRSurfaceAllocatorEx9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRSurfaceAllocatorEx9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRSurfaceAllocatorEx9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRSurfaceAllocator9 methods ***/
#define IVMRSurfaceAllocatorEx9_InitializeDevice(This,id,allocinfo,numbuffers) (This)->lpVtbl->InitializeDevice(This,id,allocinfo,numbuffers)
#define IVMRSurfaceAllocatorEx9_TerminateDevice(This,id) (This)->lpVtbl->TerminateDevice(This,id)
#define IVMRSurfaceAllocatorEx9_GetSurface(This,id,surfaceindex,flags,surface) (This)->lpVtbl->GetSurface(This,id,surfaceindex,flags,surface)
#define IVMRSurfaceAllocatorEx9_AdviseNotify(This,allocnotify) (This)->lpVtbl->AdviseNotify(This,allocnotify)
/*** IVMRSurfaceAllocatorEx9 methods ***/
#define IVMRSurfaceAllocatorEx9_GetSurfaceEx(This,id,surfaceindex,flags,surface,dest) (This)->lpVtbl->GetSurfaceEx(This,id,surfaceindex,flags,surface,dest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_QueryInterface(IVMRSurfaceAllocatorEx9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRSurfaceAllocatorEx9_AddRef(IVMRSurfaceAllocatorEx9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRSurfaceAllocatorEx9_Release(IVMRSurfaceAllocatorEx9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRSurfaceAllocator9 methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_InitializeDevice(IVMRSurfaceAllocatorEx9* This,DWORD_PTR id,VMR9AllocationInfo *allocinfo,DWORD *numbuffers) {
    return This->lpVtbl->InitializeDevice(This,id,allocinfo,numbuffers);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_TerminateDevice(IVMRSurfaceAllocatorEx9* This,DWORD_PTR id) {
    return This->lpVtbl->TerminateDevice(This,id);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_GetSurface(IVMRSurfaceAllocatorEx9* This,DWORD_PTR id,DWORD surfaceindex,DWORD flags,IDirect3DSurface9 **surface) {
    return This->lpVtbl->GetSurface(This,id,surfaceindex,flags,surface);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_AdviseNotify(IVMRSurfaceAllocatorEx9* This,IVMRSurfaceAllocatorNotify9 *allocnotify) {
    return This->lpVtbl->AdviseNotify(This,allocnotify);
}
/*** IVMRSurfaceAllocatorEx9 methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocatorEx9_GetSurfaceEx(IVMRSurfaceAllocatorEx9* This,DWORD_PTR id,DWORD surfaceindex,DWORD flags,IDirect3DSurface9 **surface,RECT *dest) {
    return This->lpVtbl->GetSurfaceEx(This,id,surfaceindex,flags,surface,dest);
}
#endif
#endif

#endif


#endif  /* __IVMRSurfaceAllocatorEx9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVMRSurfaceAllocatorNotify9 interface
 */
#ifndef __IVMRSurfaceAllocatorNotify9_INTERFACE_DEFINED__
#define __IVMRSurfaceAllocatorNotify9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRSurfaceAllocatorNotify9, 0xdca3f5df, 0xbb3a, 0x4d03, 0xbd,0x81, 0x84,0x61,0x4b,0xfb,0xfa,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dca3f5df-bb3a-4d03-bd81-84614bfbfa0c")
IVMRSurfaceAllocatorNotify9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AdviseSurfaceAllocator(
        DWORD_PTR id,
        IVMRSurfaceAllocator9 *alloc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetD3DDevice(
        IDirect3DDevice9 *device,
        HMONITOR monitor) = 0;

    virtual HRESULT STDMETHODCALLTYPE ChangeD3DDevice(
        IDirect3DDevice9 *device,
        HMONITOR monitor) = 0;

    virtual HRESULT STDMETHODCALLTYPE AllocateSurfaceHelper(
        VMR9AllocationInfo *allocinfo,
        DWORD *numbuffers,
        IDirect3DSurface9 **surface) = 0;

    virtual HRESULT STDMETHODCALLTYPE NotifyEvent(
        LONG code,
        LONG_PTR param1,
        LONG_PTR param2) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRSurfaceAllocatorNotify9, 0xdca3f5df, 0xbb3a, 0x4d03, 0xbd,0x81, 0x84,0x61,0x4b,0xfb,0xfa,0x0c)
#endif
#else
typedef struct IVMRSurfaceAllocatorNotify9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRSurfaceAllocatorNotify9 methods ***/
    HRESULT (STDMETHODCALLTYPE *AdviseSurfaceAllocator)(
        IVMRSurfaceAllocatorNotify9 *This,
        DWORD_PTR id,
        IVMRSurfaceAllocator9 *alloc);

    HRESULT (STDMETHODCALLTYPE *SetD3DDevice)(
        IVMRSurfaceAllocatorNotify9 *This,
        IDirect3DDevice9 *device,
        HMONITOR monitor);

    HRESULT (STDMETHODCALLTYPE *ChangeD3DDevice)(
        IVMRSurfaceAllocatorNotify9 *This,
        IDirect3DDevice9 *device,
        HMONITOR monitor);

    HRESULT (STDMETHODCALLTYPE *AllocateSurfaceHelper)(
        IVMRSurfaceAllocatorNotify9 *This,
        VMR9AllocationInfo *allocinfo,
        DWORD *numbuffers,
        IDirect3DSurface9 **surface);

    HRESULT (STDMETHODCALLTYPE *NotifyEvent)(
        IVMRSurfaceAllocatorNotify9 *This,
        LONG code,
        LONG_PTR param1,
        LONG_PTR param2);

    END_INTERFACE
} IVMRSurfaceAllocatorNotify9Vtbl;

interface IVMRSurfaceAllocatorNotify9 {
    CONST_VTBL IVMRSurfaceAllocatorNotify9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRSurfaceAllocatorNotify9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRSurfaceAllocatorNotify9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRSurfaceAllocatorNotify9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRSurfaceAllocatorNotify9 methods ***/
#define IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(This,id,alloc) (This)->lpVtbl->AdviseSurfaceAllocator(This,id,alloc)
#define IVMRSurfaceAllocatorNotify9_SetD3DDevice(This,device,monitor) (This)->lpVtbl->SetD3DDevice(This,device,monitor)
#define IVMRSurfaceAllocatorNotify9_ChangeD3DDevice(This,device,monitor) (This)->lpVtbl->ChangeD3DDevice(This,device,monitor)
#define IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(This,allocinfo,numbuffers,surface) (This)->lpVtbl->AllocateSurfaceHelper(This,allocinfo,numbuffers,surface)
#define IVMRSurfaceAllocatorNotify9_NotifyEvent(This,code,param1,param2) (This)->lpVtbl->NotifyEvent(This,code,param1,param2)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_QueryInterface(IVMRSurfaceAllocatorNotify9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRSurfaceAllocatorNotify9_AddRef(IVMRSurfaceAllocatorNotify9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRSurfaceAllocatorNotify9_Release(IVMRSurfaceAllocatorNotify9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRSurfaceAllocatorNotify9 methods ***/
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(IVMRSurfaceAllocatorNotify9* This,DWORD_PTR id,IVMRSurfaceAllocator9 *alloc) {
    return This->lpVtbl->AdviseSurfaceAllocator(This,id,alloc);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_SetD3DDevice(IVMRSurfaceAllocatorNotify9* This,IDirect3DDevice9 *device,HMONITOR monitor) {
    return This->lpVtbl->SetD3DDevice(This,device,monitor);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_ChangeD3DDevice(IVMRSurfaceAllocatorNotify9* This,IDirect3DDevice9 *device,HMONITOR monitor) {
    return This->lpVtbl->ChangeD3DDevice(This,device,monitor);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(IVMRSurfaceAllocatorNotify9* This,VMR9AllocationInfo *allocinfo,DWORD *numbuffers,IDirect3DSurface9 **surface) {
    return This->lpVtbl->AllocateSurfaceHelper(This,allocinfo,numbuffers,surface);
}
static FORCEINLINE HRESULT IVMRSurfaceAllocatorNotify9_NotifyEvent(IVMRSurfaceAllocatorNotify9* This,LONG code,LONG_PTR param1,LONG_PTR param2) {
    return This->lpVtbl->NotifyEvent(This,code,param1,param2);
}
#endif
#endif

#endif


#endif  /* __IVMRSurfaceAllocatorNotify9_INTERFACE_DEFINED__ */

typedef enum _VMR9AspectRatioMode {
    VMR9ARMode_None = 0,
    VMR9ARMode_LetterBox = 1
} VMR9AspectRatioMode;
/*****************************************************************************
 * IVMRWindowlessControl9 interface
 */
#ifndef __IVMRWindowlessControl9_INTERFACE_DEFINED__
#define __IVMRWindowlessControl9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRWindowlessControl9, 0x8f537d09, 0xf85e, 0x4414, 0xb2,0x3b, 0x50,0x2e,0x54,0xc7,0x99,0x27);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8f537d09-f85e-4414-b23b-502e54c79927")
IVMRWindowlessControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNativeVideoSize(
        LONG *width,
        LONG *height,
        LONG *arwidth,
        LONG *arheight) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMinIdealVideoSize(
        LONG *width,
        LONG *height) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxIdealVideoSize(
        LONG *width,
        LONG *height) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVideoPosition(
        const RECT *source,
        const RECT *dest) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVideoPosition(
        RECT *source,
        RECT *dest) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAspectRatioMode(
        DWORD *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAspectRatioMode(
        DWORD mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVideoClippingWindow(
        HWND hwnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE RepaintVideo(
        HWND hwnd,
        HDC hdc) = 0;

    virtual HRESULT STDMETHODCALLTYPE DisplayModeChanged(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentImage(
        BYTE **dib) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBorderColor(
        COLORREF color) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBorderColor(
        COLORREF *color) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRWindowlessControl9, 0x8f537d09, 0xf85e, 0x4414, 0xb2,0x3b, 0x50,0x2e,0x54,0xc7,0x99,0x27)
#endif
#else
typedef struct IVMRWindowlessControl9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRWindowlessControl9 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNativeVideoSize)(
        IVMRWindowlessControl9 *This,
        LONG *width,
        LONG *height,
        LONG *arwidth,
        LONG *arheight);

    HRESULT (STDMETHODCALLTYPE *GetMinIdealVideoSize)(
        IVMRWindowlessControl9 *This,
        LONG *width,
        LONG *height);

    HRESULT (STDMETHODCALLTYPE *GetMaxIdealVideoSize)(
        IVMRWindowlessControl9 *This,
        LONG *width,
        LONG *height);

    HRESULT (STDMETHODCALLTYPE *SetVideoPosition)(
        IVMRWindowlessControl9 *This,
        const RECT *source,
        const RECT *dest);

    HRESULT (STDMETHODCALLTYPE *GetVideoPosition)(
        IVMRWindowlessControl9 *This,
        RECT *source,
        RECT *dest);

    HRESULT (STDMETHODCALLTYPE *GetAspectRatioMode)(
        IVMRWindowlessControl9 *This,
        DWORD *mode);

    HRESULT (STDMETHODCALLTYPE *SetAspectRatioMode)(
        IVMRWindowlessControl9 *This,
        DWORD mode);

    HRESULT (STDMETHODCALLTYPE *SetVideoClippingWindow)(
        IVMRWindowlessControl9 *This,
        HWND hwnd);

    HRESULT (STDMETHODCALLTYPE *RepaintVideo)(
        IVMRWindowlessControl9 *This,
        HWND hwnd,
        HDC hdc);

    HRESULT (STDMETHODCALLTYPE *DisplayModeChanged)(
        IVMRWindowlessControl9 *This);

    HRESULT (STDMETHODCALLTYPE *GetCurrentImage)(
        IVMRWindowlessControl9 *This,
        BYTE **dib);

    HRESULT (STDMETHODCALLTYPE *SetBorderColor)(
        IVMRWindowlessControl9 *This,
        COLORREF color);

    HRESULT (STDMETHODCALLTYPE *GetBorderColor)(
        IVMRWindowlessControl9 *This,
        COLORREF *color);

    END_INTERFACE
} IVMRWindowlessControl9Vtbl;

interface IVMRWindowlessControl9 {
    CONST_VTBL IVMRWindowlessControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRWindowlessControl9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRWindowlessControl9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRWindowlessControl9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRWindowlessControl9 methods ***/
#define IVMRWindowlessControl9_GetNativeVideoSize(This,width,height,arwidth,arheight) (This)->lpVtbl->GetNativeVideoSize(This,width,height,arwidth,arheight)
#define IVMRWindowlessControl9_GetMinIdealVideoSize(This,width,height) (This)->lpVtbl->GetMinIdealVideoSize(This,width,height)
#define IVMRWindowlessControl9_GetMaxIdealVideoSize(This,width,height) (This)->lpVtbl->GetMaxIdealVideoSize(This,width,height)
#define IVMRWindowlessControl9_SetVideoPosition(This,source,dest) (This)->lpVtbl->SetVideoPosition(This,source,dest)
#define IVMRWindowlessControl9_GetVideoPosition(This,source,dest) (This)->lpVtbl->GetVideoPosition(This,source,dest)
#define IVMRWindowlessControl9_GetAspectRatioMode(This,mode) (This)->lpVtbl->GetAspectRatioMode(This,mode)
#define IVMRWindowlessControl9_SetAspectRatioMode(This,mode) (This)->lpVtbl->SetAspectRatioMode(This,mode)
#define IVMRWindowlessControl9_SetVideoClippingWindow(This,hwnd) (This)->lpVtbl->SetVideoClippingWindow(This,hwnd)
#define IVMRWindowlessControl9_RepaintVideo(This,hwnd,hdc) (This)->lpVtbl->RepaintVideo(This,hwnd,hdc)
#define IVMRWindowlessControl9_DisplayModeChanged(This) (This)->lpVtbl->DisplayModeChanged(This)
#define IVMRWindowlessControl9_GetCurrentImage(This,dib) (This)->lpVtbl->GetCurrentImage(This,dib)
#define IVMRWindowlessControl9_SetBorderColor(This,color) (This)->lpVtbl->SetBorderColor(This,color)
#define IVMRWindowlessControl9_GetBorderColor(This,color) (This)->lpVtbl->GetBorderColor(This,color)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRWindowlessControl9_QueryInterface(IVMRWindowlessControl9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRWindowlessControl9_AddRef(IVMRWindowlessControl9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRWindowlessControl9_Release(IVMRWindowlessControl9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRWindowlessControl9 methods ***/
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetNativeVideoSize(IVMRWindowlessControl9* This,LONG *width,LONG *height,LONG *arwidth,LONG *arheight) {
    return This->lpVtbl->GetNativeVideoSize(This,width,height,arwidth,arheight);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetMinIdealVideoSize(IVMRWindowlessControl9* This,LONG *width,LONG *height) {
    return This->lpVtbl->GetMinIdealVideoSize(This,width,height);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetMaxIdealVideoSize(IVMRWindowlessControl9* This,LONG *width,LONG *height) {
    return This->lpVtbl->GetMaxIdealVideoSize(This,width,height);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_SetVideoPosition(IVMRWindowlessControl9* This,const RECT *source,const RECT *dest) {
    return This->lpVtbl->SetVideoPosition(This,source,dest);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetVideoPosition(IVMRWindowlessControl9* This,RECT *source,RECT *dest) {
    return This->lpVtbl->GetVideoPosition(This,source,dest);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetAspectRatioMode(IVMRWindowlessControl9* This,DWORD *mode) {
    return This->lpVtbl->GetAspectRatioMode(This,mode);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_SetAspectRatioMode(IVMRWindowlessControl9* This,DWORD mode) {
    return This->lpVtbl->SetAspectRatioMode(This,mode);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_SetVideoClippingWindow(IVMRWindowlessControl9* This,HWND hwnd) {
    return This->lpVtbl->SetVideoClippingWindow(This,hwnd);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_RepaintVideo(IVMRWindowlessControl9* This,HWND hwnd,HDC hdc) {
    return This->lpVtbl->RepaintVideo(This,hwnd,hdc);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_DisplayModeChanged(IVMRWindowlessControl9* This) {
    return This->lpVtbl->DisplayModeChanged(This);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetCurrentImage(IVMRWindowlessControl9* This,BYTE **dib) {
    return This->lpVtbl->GetCurrentImage(This,dib);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_SetBorderColor(IVMRWindowlessControl9* This,COLORREF color) {
    return This->lpVtbl->SetBorderColor(This,color);
}
static FORCEINLINE HRESULT IVMRWindowlessControl9_GetBorderColor(IVMRWindowlessControl9* This,COLORREF *color) {
    return This->lpVtbl->GetBorderColor(This,color);
}
#endif
#endif

#endif


#endif  /* __IVMRWindowlessControl9_INTERFACE_DEFINED__ */

typedef enum _VMR9MixerPrefs {
    MixerPref9_NoDecimation = 0x1,
    MixerPref9_DecimateOutput = 0x2,
    MixerPref9_ARAdjustXorY = 0x4,
    MixerPref9_NonSquareMixing = 0x8,
    MixerPref9_DecimateMask = 0xf,
    MixerPref9_BiLinearFiltering = 0x10,
    MixerPref9_PointFiltering = 0x20,
    MixerPref9_AnisotropicFiltering = 0x40,
    MixerPref9_PyramidalQuadFiltering = 0x80,
    MixerPref9_GaussianQuadFiltering = 0x100,
    MixerPref9_FilteringReserved = 0xe00,
    MixerPref9_FilteringMask = 0xff0,
    MixerPref9_RenderTargetRGB = 0x1000,
    MixerPref9_RenderTargetYUV = 0x2000,
    MixerPref9_RenderTargetReserved = 0xfc000,
    MixerPref9_DynamicSwitchToBOB = 0x100000,
    MixerPref9_DynamicDecimateBy2 = 0x200000,
    MixerPref9_DynamicReserved = 0xc00000,
    MixerPref9_DynamicMask = 0xf00000
} VMR9MixerPrefs;
typedef struct _VMR9NormalizedRect {
    FLOAT left;
    FLOAT top;
    FLOAT right;
    FLOAT bottom;
} VMR9NormalizedRect;
typedef enum _VMR9ProcAmpControlFlags {
    ProcAmpControl9_Brightness = 0x1,
    ProcAmpControl9_Contrast = 0x2,
    ProcAmpControl9_Hue = 0x4,
    ProcAmpControl9_Saturation = 0x8,
    ProcAmpControl9_Mask = 0xf
} VMR9ProcAmpControlFlags;
typedef struct _VMR9ProcAmpControl {
    DWORD dwSize;
    DWORD dwFlags;
    FLOAT Brightness;
    FLOAT Contrast;
    FLOAT Hue;
    FLOAT Saturation;
} VMR9ProcAmpControl;
typedef struct _VMR9ProcAmpControlRange {
    DWORD dwSize;
    VMR9ProcAmpControlFlags dwProperty;
    FLOAT MinValue;
    FLOAT MaxValue;
    FLOAT DefaultValue;
    FLOAT StepSize;
} VMR9ProcAmpControlRange;
/*****************************************************************************
 * IVMRMixerControl9 interface
 */
#ifndef __IVMRMixerControl9_INTERFACE_DEFINED__
#define __IVMRMixerControl9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRMixerControl9, 0x1a777eaa, 0x47c8, 0x4930, 0xb2,0xc9, 0x8f,0xee,0x1c,0x1b,0x0f,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1a777eaa-47c8-4930-b2c9-8fee1c1b0f3b")
IVMRMixerControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAlpha(
        DWORD streamid,
        FLOAT alpha) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlpha(
        DWORD streamid,
        FLOAT *alpha) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetZOrder(
        DWORD streamid,
        DWORD zorder) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetZOrder(
        DWORD streamid,
        DWORD *zorder) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputRect(
        DWORD streamid,
        const VMR9NormalizedRect *rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputRect(
        DWORD streamid,
        VMR9NormalizedRect *rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBackgroundClr(
        COLORREF back) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackgroundClr(
        COLORREF *back) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMixingPrefs(
        DWORD mixingprefs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMixingPrefs(
        DWORD *mixingprefs) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProcAmpControl(
        DWORD streamid,
        VMR9ProcAmpControl *control) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProcAmpControl(
        DWORD streamid,
        VMR9ProcAmpControl *control) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProcAmpControlRange(
        DWORD streamid,
        VMR9ProcAmpControlRange *controlrange) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRMixerControl9, 0x1a777eaa, 0x47c8, 0x4930, 0xb2,0xc9, 0x8f,0xee,0x1c,0x1b,0x0f,0x3b)
#endif
#else
typedef struct IVMRMixerControl9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRMixerControl9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAlpha)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        FLOAT alpha);

    HRESULT (STDMETHODCALLTYPE *GetAlpha)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        FLOAT *alpha);

    HRESULT (STDMETHODCALLTYPE *SetZOrder)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        DWORD zorder);

    HRESULT (STDMETHODCALLTYPE *GetZOrder)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        DWORD *zorder);

    HRESULT (STDMETHODCALLTYPE *SetOutputRect)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        const VMR9NormalizedRect *rect);

    HRESULT (STDMETHODCALLTYPE *GetOutputRect)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        VMR9NormalizedRect *rect);

    HRESULT (STDMETHODCALLTYPE *SetBackgroundClr)(
        IVMRMixerControl9 *This,
        COLORREF back);

    HRESULT (STDMETHODCALLTYPE *GetBackgroundClr)(
        IVMRMixerControl9 *This,
        COLORREF *back);

    HRESULT (STDMETHODCALLTYPE *SetMixingPrefs)(
        IVMRMixerControl9 *This,
        DWORD mixingprefs);

    HRESULT (STDMETHODCALLTYPE *GetMixingPrefs)(
        IVMRMixerControl9 *This,
        DWORD *mixingprefs);

    HRESULT (STDMETHODCALLTYPE *SetProcAmpControl)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        VMR9ProcAmpControl *control);

    HRESULT (STDMETHODCALLTYPE *GetProcAmpControl)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        VMR9ProcAmpControl *control);

    HRESULT (STDMETHODCALLTYPE *GetProcAmpControlRange)(
        IVMRMixerControl9 *This,
        DWORD streamid,
        VMR9ProcAmpControlRange *controlrange);

    END_INTERFACE
} IVMRMixerControl9Vtbl;

interface IVMRMixerControl9 {
    CONST_VTBL IVMRMixerControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRMixerControl9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRMixerControl9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRMixerControl9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRMixerControl9 methods ***/
#define IVMRMixerControl9_SetAlpha(This,streamid,alpha) (This)->lpVtbl->SetAlpha(This,streamid,alpha)
#define IVMRMixerControl9_GetAlpha(This,streamid,alpha) (This)->lpVtbl->GetAlpha(This,streamid,alpha)
#define IVMRMixerControl9_SetZOrder(This,streamid,zorder) (This)->lpVtbl->SetZOrder(This,streamid,zorder)
#define IVMRMixerControl9_GetZOrder(This,streamid,zorder) (This)->lpVtbl->GetZOrder(This,streamid,zorder)
#define IVMRMixerControl9_SetOutputRect(This,streamid,rect) (This)->lpVtbl->SetOutputRect(This,streamid,rect)
#define IVMRMixerControl9_GetOutputRect(This,streamid,rect) (This)->lpVtbl->GetOutputRect(This,streamid,rect)
#define IVMRMixerControl9_SetBackgroundClr(This,back) (This)->lpVtbl->SetBackgroundClr(This,back)
#define IVMRMixerControl9_GetBackgroundClr(This,back) (This)->lpVtbl->GetBackgroundClr(This,back)
#define IVMRMixerControl9_SetMixingPrefs(This,mixingprefs) (This)->lpVtbl->SetMixingPrefs(This,mixingprefs)
#define IVMRMixerControl9_GetMixingPrefs(This,mixingprefs) (This)->lpVtbl->GetMixingPrefs(This,mixingprefs)
#define IVMRMixerControl9_SetProcAmpControl(This,streamid,control) (This)->lpVtbl->SetProcAmpControl(This,streamid,control)
#define IVMRMixerControl9_GetProcAmpControl(This,streamid,control) (This)->lpVtbl->GetProcAmpControl(This,streamid,control)
#define IVMRMixerControl9_GetProcAmpControlRange(This,streamid,controlrange) (This)->lpVtbl->GetProcAmpControlRange(This,streamid,controlrange)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRMixerControl9_QueryInterface(IVMRMixerControl9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRMixerControl9_AddRef(IVMRMixerControl9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRMixerControl9_Release(IVMRMixerControl9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRMixerControl9 methods ***/
static FORCEINLINE HRESULT IVMRMixerControl9_SetAlpha(IVMRMixerControl9* This,DWORD streamid,FLOAT alpha) {
    return This->lpVtbl->SetAlpha(This,streamid,alpha);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetAlpha(IVMRMixerControl9* This,DWORD streamid,FLOAT *alpha) {
    return This->lpVtbl->GetAlpha(This,streamid,alpha);
}
static FORCEINLINE HRESULT IVMRMixerControl9_SetZOrder(IVMRMixerControl9* This,DWORD streamid,DWORD zorder) {
    return This->lpVtbl->SetZOrder(This,streamid,zorder);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetZOrder(IVMRMixerControl9* This,DWORD streamid,DWORD *zorder) {
    return This->lpVtbl->GetZOrder(This,streamid,zorder);
}
static FORCEINLINE HRESULT IVMRMixerControl9_SetOutputRect(IVMRMixerControl9* This,DWORD streamid,const VMR9NormalizedRect *rect) {
    return This->lpVtbl->SetOutputRect(This,streamid,rect);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetOutputRect(IVMRMixerControl9* This,DWORD streamid,VMR9NormalizedRect *rect) {
    return This->lpVtbl->GetOutputRect(This,streamid,rect);
}
static FORCEINLINE HRESULT IVMRMixerControl9_SetBackgroundClr(IVMRMixerControl9* This,COLORREF back) {
    return This->lpVtbl->SetBackgroundClr(This,back);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetBackgroundClr(IVMRMixerControl9* This,COLORREF *back) {
    return This->lpVtbl->GetBackgroundClr(This,back);
}
static FORCEINLINE HRESULT IVMRMixerControl9_SetMixingPrefs(IVMRMixerControl9* This,DWORD mixingprefs) {
    return This->lpVtbl->SetMixingPrefs(This,mixingprefs);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetMixingPrefs(IVMRMixerControl9* This,DWORD *mixingprefs) {
    return This->lpVtbl->GetMixingPrefs(This,mixingprefs);
}
static FORCEINLINE HRESULT IVMRMixerControl9_SetProcAmpControl(IVMRMixerControl9* This,DWORD streamid,VMR9ProcAmpControl *control) {
    return This->lpVtbl->SetProcAmpControl(This,streamid,control);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetProcAmpControl(IVMRMixerControl9* This,DWORD streamid,VMR9ProcAmpControl *control) {
    return This->lpVtbl->GetProcAmpControl(This,streamid,control);
}
static FORCEINLINE HRESULT IVMRMixerControl9_GetProcAmpControlRange(IVMRMixerControl9* This,DWORD streamid,VMR9ProcAmpControlRange *controlrange) {
    return This->lpVtbl->GetProcAmpControlRange(This,streamid,controlrange);
}
#endif
#endif

#endif


#endif  /* __IVMRMixerControl9_INTERFACE_DEFINED__ */

typedef struct _VMR9AlphaBitmap {
    DWORD dwFlags;
    HDC hdc;
    IDirect3DSurface9 *pDDS;
    RECT rSrc;
    VMR9NormalizedRect rDest;
    FLOAT fAlpha;
    COLORREF clrSrcKey;
    DWORD dwFilterMode;
} VMR9AlphaBitmap;
typedef enum _VMR9AlphaBitmapFlags {
    VMR9AlphaBitmap_Disable = 0x1,
    VMR9AlphaBitmap_hDC = 0x2,
    VMR9AlphaBitmap_EntireDDS = 0x4,
    VMR9AlphaBitmap_SrcColorKey = 0x8,
    VMR9AlphaBitmap_SrcRect = 0x10,
    VMR9AlphaBitmap_FilterMode = 0x20
} VMR9AlphaBitmapFlags;
/*****************************************************************************
 * IVMRMixerBitmap9 interface
 */
#ifndef __IVMRMixerBitmap9_INTERFACE_DEFINED__
#define __IVMRMixerBitmap9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRMixerBitmap9, 0xced175e5, 0x1935, 0x4820, 0x81,0xbd, 0xff,0x6a,0xd0,0x0c,0x91,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ced175e5-1935-4820-81bd-ff6ad00c9108")
IVMRMixerBitmap9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetAlphaBitmap(
        const VMR9AlphaBitmap *bitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateAlphaBitmapParameters(
        const VMR9AlphaBitmap *bitmap) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAlphaBitmapParameters(
        VMR9AlphaBitmap *bitmap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRMixerBitmap9, 0xced175e5, 0x1935, 0x4820, 0x81,0xbd, 0xff,0x6a,0xd0,0x0c,0x91,0x08)
#endif
#else
typedef struct IVMRMixerBitmap9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRMixerBitmap9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetAlphaBitmap)(
        IVMRMixerBitmap9 *This,
        const VMR9AlphaBitmap *bitmap);

    HRESULT (STDMETHODCALLTYPE *UpdateAlphaBitmapParameters)(
        IVMRMixerBitmap9 *This,
        const VMR9AlphaBitmap *bitmap);

    HRESULT (STDMETHODCALLTYPE *GetAlphaBitmapParameters)(
        IVMRMixerBitmap9 *This,
        VMR9AlphaBitmap *bitmap);

    END_INTERFACE
} IVMRMixerBitmap9Vtbl;

interface IVMRMixerBitmap9 {
    CONST_VTBL IVMRMixerBitmap9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRMixerBitmap9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRMixerBitmap9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRMixerBitmap9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRMixerBitmap9 methods ***/
#define IVMRMixerBitmap9_SetAlphaBitmap(This,bitmap) (This)->lpVtbl->SetAlphaBitmap(This,bitmap)
#define IVMRMixerBitmap9_UpdateAlphaBitmapParameters(This,bitmap) (This)->lpVtbl->UpdateAlphaBitmapParameters(This,bitmap)
#define IVMRMixerBitmap9_GetAlphaBitmapParameters(This,bitmap) (This)->lpVtbl->GetAlphaBitmapParameters(This,bitmap)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRMixerBitmap9_QueryInterface(IVMRMixerBitmap9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRMixerBitmap9_AddRef(IVMRMixerBitmap9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRMixerBitmap9_Release(IVMRMixerBitmap9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRMixerBitmap9 methods ***/
static FORCEINLINE HRESULT IVMRMixerBitmap9_SetAlphaBitmap(IVMRMixerBitmap9* This,const VMR9AlphaBitmap *bitmap) {
    return This->lpVtbl->SetAlphaBitmap(This,bitmap);
}
static FORCEINLINE HRESULT IVMRMixerBitmap9_UpdateAlphaBitmapParameters(IVMRMixerBitmap9* This,const VMR9AlphaBitmap *bitmap) {
    return This->lpVtbl->UpdateAlphaBitmapParameters(This,bitmap);
}
static FORCEINLINE HRESULT IVMRMixerBitmap9_GetAlphaBitmapParameters(IVMRMixerBitmap9* This,VMR9AlphaBitmap *bitmap) {
    return This->lpVtbl->GetAlphaBitmapParameters(This,bitmap);
}
#endif
#endif

#endif


#endif  /* __IVMRMixerBitmap9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVMRSurface9 interface
 */
#ifndef __IVMRSurface9_INTERFACE_DEFINED__
#define __IVMRSurface9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRSurface9, 0xdfc581a1, 0x6e1f, 0x4c3a, 0x8d,0x0a, 0x5e,0x97,0x92,0xea,0x2a,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dfc581a1-6e1f-4c3a-8d0a-5e9792ea2afc")
IVMRSurface9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IsSurfaceLocked(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE LockSurface(
        BYTE **surface) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnlockSurface(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSurface(
        IDirect3DSurface9 **surface) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRSurface9, 0xdfc581a1, 0x6e1f, 0x4c3a, 0x8d,0x0a, 0x5e,0x97,0x92,0xea,0x2a,0xfc)
#endif
#else
typedef struct IVMRSurface9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRSurface9 methods ***/
    HRESULT (STDMETHODCALLTYPE *IsSurfaceLocked)(
        IVMRSurface9 *This);

    HRESULT (STDMETHODCALLTYPE *LockSurface)(
        IVMRSurface9 *This,
        BYTE **surface);

    HRESULT (STDMETHODCALLTYPE *UnlockSurface)(
        IVMRSurface9 *This);

    HRESULT (STDMETHODCALLTYPE *GetSurface)(
        IVMRSurface9 *This,
        IDirect3DSurface9 **surface);

    END_INTERFACE
} IVMRSurface9Vtbl;

interface IVMRSurface9 {
    CONST_VTBL IVMRSurface9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRSurface9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRSurface9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRSurface9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRSurface9 methods ***/
#define IVMRSurface9_IsSurfaceLocked(This) (This)->lpVtbl->IsSurfaceLocked(This)
#define IVMRSurface9_LockSurface(This,surface) (This)->lpVtbl->LockSurface(This,surface)
#define IVMRSurface9_UnlockSurface(This) (This)->lpVtbl->UnlockSurface(This)
#define IVMRSurface9_GetSurface(This,surface) (This)->lpVtbl->GetSurface(This,surface)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRSurface9_QueryInterface(IVMRSurface9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRSurface9_AddRef(IVMRSurface9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRSurface9_Release(IVMRSurface9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRSurface9 methods ***/
static FORCEINLINE HRESULT IVMRSurface9_IsSurfaceLocked(IVMRSurface9* This) {
    return This->lpVtbl->IsSurfaceLocked(This);
}
static FORCEINLINE HRESULT IVMRSurface9_LockSurface(IVMRSurface9* This,BYTE **surface) {
    return This->lpVtbl->LockSurface(This,surface);
}
static FORCEINLINE HRESULT IVMRSurface9_UnlockSurface(IVMRSurface9* This) {
    return This->lpVtbl->UnlockSurface(This);
}
static FORCEINLINE HRESULT IVMRSurface9_GetSurface(IVMRSurface9* This,IDirect3DSurface9 **surface) {
    return This->lpVtbl->GetSurface(This,surface);
}
#endif
#endif

#endif


#endif  /* __IVMRSurface9_INTERFACE_DEFINED__ */

typedef enum _VMR9RenderPrefs {
    RenderPrefs9_DoNotRenderBorder = 0x1,
    RenderPrefs9_Mask = 0x1
} VMR9RenderPrefs;
/*****************************************************************************
 * IVMRImagePresenterConfig9 interface
 */
#ifndef __IVMRImagePresenterConfig9_INTERFACE_DEFINED__
#define __IVMRImagePresenterConfig9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRImagePresenterConfig9, 0x45c15cab, 0x6e22, 0x420a, 0x80,0x43, 0xae,0x1f,0x0a,0xc0,0x2c,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("45c15cab-6e22-420a-8043-ae1f0ac02c7d")
IVMRImagePresenterConfig9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetRenderingPrefs(
        DWORD renderflags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderingPrefs(
        DWORD *renderflags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRImagePresenterConfig9, 0x45c15cab, 0x6e22, 0x420a, 0x80,0x43, 0xae,0x1f,0x0a,0xc0,0x2c,0x7d)
#endif
#else
typedef struct IVMRImagePresenterConfig9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRImagePresenterConfig9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRenderingPrefs)(
        IVMRImagePresenterConfig9 *This,
        DWORD renderflags);

    HRESULT (STDMETHODCALLTYPE *GetRenderingPrefs)(
        IVMRImagePresenterConfig9 *This,
        DWORD *renderflags);

    END_INTERFACE
} IVMRImagePresenterConfig9Vtbl;

interface IVMRImagePresenterConfig9 {
    CONST_VTBL IVMRImagePresenterConfig9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRImagePresenterConfig9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRImagePresenterConfig9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRImagePresenterConfig9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRImagePresenterConfig9 methods ***/
#define IVMRImagePresenterConfig9_SetRenderingPrefs(This,renderflags) (This)->lpVtbl->SetRenderingPrefs(This,renderflags)
#define IVMRImagePresenterConfig9_GetRenderingPrefs(This,renderflags) (This)->lpVtbl->GetRenderingPrefs(This,renderflags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRImagePresenterConfig9_QueryInterface(IVMRImagePresenterConfig9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRImagePresenterConfig9_AddRef(IVMRImagePresenterConfig9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRImagePresenterConfig9_Release(IVMRImagePresenterConfig9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRImagePresenterConfig9 methods ***/
static FORCEINLINE HRESULT IVMRImagePresenterConfig9_SetRenderingPrefs(IVMRImagePresenterConfig9* This,DWORD renderflags) {
    return This->lpVtbl->SetRenderingPrefs(This,renderflags);
}
static FORCEINLINE HRESULT IVMRImagePresenterConfig9_GetRenderingPrefs(IVMRImagePresenterConfig9* This,DWORD *renderflags) {
    return This->lpVtbl->GetRenderingPrefs(This,renderflags);
}
#endif
#endif

#endif


#endif  /* __IVMRImagePresenterConfig9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVMRVideoStreamControl9 interface
 */
#ifndef __IVMRVideoStreamControl9_INTERFACE_DEFINED__
#define __IVMRVideoStreamControl9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRVideoStreamControl9, 0xd0cfe38b, 0x93e7, 0x4772, 0x89,0x57, 0x04,0x00,0xc4,0x9a,0x44,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d0cfe38b-93e7-4772-8957-0400c49a4485")
IVMRVideoStreamControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetStreamActiveState(
        WINBOOL active) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamActiveState(
        WINBOOL *active) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRVideoStreamControl9, 0xd0cfe38b, 0x93e7, 0x4772, 0x89,0x57, 0x04,0x00,0xc4,0x9a,0x44,0x85)
#endif
#else
typedef struct IVMRVideoStreamControl9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRVideoStreamControl9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetStreamActiveState)(
        IVMRVideoStreamControl9 *This,
        WINBOOL active);

    HRESULT (STDMETHODCALLTYPE *GetStreamActiveState)(
        IVMRVideoStreamControl9 *This,
        WINBOOL *active);

    END_INTERFACE
} IVMRVideoStreamControl9Vtbl;

interface IVMRVideoStreamControl9 {
    CONST_VTBL IVMRVideoStreamControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRVideoStreamControl9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRVideoStreamControl9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRVideoStreamControl9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRVideoStreamControl9 methods ***/
#define IVMRVideoStreamControl9_SetStreamActiveState(This,active) (This)->lpVtbl->SetStreamActiveState(This,active)
#define IVMRVideoStreamControl9_GetStreamActiveState(This,active) (This)->lpVtbl->GetStreamActiveState(This,active)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRVideoStreamControl9_QueryInterface(IVMRVideoStreamControl9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRVideoStreamControl9_AddRef(IVMRVideoStreamControl9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRVideoStreamControl9_Release(IVMRVideoStreamControl9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRVideoStreamControl9 methods ***/
static FORCEINLINE HRESULT IVMRVideoStreamControl9_SetStreamActiveState(IVMRVideoStreamControl9* This,WINBOOL active) {
    return This->lpVtbl->SetStreamActiveState(This,active);
}
static FORCEINLINE HRESULT IVMRVideoStreamControl9_GetStreamActiveState(IVMRVideoStreamControl9* This,WINBOOL *active) {
    return This->lpVtbl->GetStreamActiveState(This,active);
}
#endif
#endif

#endif


#endif  /* __IVMRVideoStreamControl9_INTERFACE_DEFINED__ */

typedef enum _VMR9Mode {
    VMR9Mode_Windowed = 0x1,
    VMR9Mode_Windowless = 0x2,
    VMR9Mode_Renderless = 0x4,
    VMR9Mode_Mask = 0x7
} VMR9Mode;
/*****************************************************************************
 * IVMRFilterConfig9 interface
 */
#ifndef __IVMRFilterConfig9_INTERFACE_DEFINED__
#define __IVMRFilterConfig9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRFilterConfig9, 0x5a804648, 0x4f66, 0x4867, 0x9c,0x43, 0x4f,0x5c,0x82,0x2c,0xf1,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5a804648-4f66-4867-9c43-4f5c822cf1b8")
IVMRFilterConfig9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetImageCompositor(
        IVMRImageCompositor9 *compositor) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetNumberOfStreams(
        DWORD max) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE SetRenderingPrefs(
        DWORD renderflags) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderingPrefs(
        DWORD *renderflags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRenderingMode(
        DWORD mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderingMode(
        DWORD *mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRFilterConfig9, 0x5a804648, 0x4f66, 0x4867, 0x9c,0x43, 0x4f,0x5c,0x82,0x2c,0xf1,0xb8)
#endif
#else
typedef struct IVMRFilterConfig9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRFilterConfig9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetImageCompositor)(
        IVMRFilterConfig9 *This,
        IVMRImageCompositor9 *compositor);

    HRESULT (STDMETHODCALLTYPE *SetNumberOfStreams)(
        IVMRFilterConfig9 *This,
        DWORD max);

    HRESULT (STDMETHODCALLTYPE *GetNumberOfStreams)(
        IVMRFilterConfig9 *This,
        DWORD *max);

    HRESULT (STDMETHODCALLTYPE *SetRenderingPrefs)(
        IVMRFilterConfig9 *This,
        DWORD renderflags);

    HRESULT (STDMETHODCALLTYPE *GetRenderingPrefs)(
        IVMRFilterConfig9 *This,
        DWORD *renderflags);

    HRESULT (STDMETHODCALLTYPE *SetRenderingMode)(
        IVMRFilterConfig9 *This,
        DWORD mode);

    HRESULT (STDMETHODCALLTYPE *GetRenderingMode)(
        IVMRFilterConfig9 *This,
        DWORD *mode);

    END_INTERFACE
} IVMRFilterConfig9Vtbl;

interface IVMRFilterConfig9 {
    CONST_VTBL IVMRFilterConfig9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRFilterConfig9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRFilterConfig9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRFilterConfig9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRFilterConfig9 methods ***/
#define IVMRFilterConfig9_SetImageCompositor(This,compositor) (This)->lpVtbl->SetImageCompositor(This,compositor)
#define IVMRFilterConfig9_SetNumberOfStreams(This,max) (This)->lpVtbl->SetNumberOfStreams(This,max)
#define IVMRFilterConfig9_GetNumberOfStreams(This,max) (This)->lpVtbl->GetNumberOfStreams(This,max)
#define IVMRFilterConfig9_SetRenderingPrefs(This,renderflags) (This)->lpVtbl->SetRenderingPrefs(This,renderflags)
#define IVMRFilterConfig9_GetRenderingPrefs(This,renderflags) (This)->lpVtbl->GetRenderingPrefs(This,renderflags)
#define IVMRFilterConfig9_SetRenderingMode(This,mode) (This)->lpVtbl->SetRenderingMode(This,mode)
#define IVMRFilterConfig9_GetRenderingMode(This,mode) (This)->lpVtbl->GetRenderingMode(This,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRFilterConfig9_QueryInterface(IVMRFilterConfig9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRFilterConfig9_AddRef(IVMRFilterConfig9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRFilterConfig9_Release(IVMRFilterConfig9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRFilterConfig9 methods ***/
static FORCEINLINE HRESULT IVMRFilterConfig9_SetImageCompositor(IVMRFilterConfig9* This,IVMRImageCompositor9 *compositor) {
    return This->lpVtbl->SetImageCompositor(This,compositor);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_SetNumberOfStreams(IVMRFilterConfig9* This,DWORD max) {
    return This->lpVtbl->SetNumberOfStreams(This,max);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_GetNumberOfStreams(IVMRFilterConfig9* This,DWORD *max) {
    return This->lpVtbl->GetNumberOfStreams(This,max);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_SetRenderingPrefs(IVMRFilterConfig9* This,DWORD renderflags) {
    return This->lpVtbl->SetRenderingPrefs(This,renderflags);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_GetRenderingPrefs(IVMRFilterConfig9* This,DWORD *renderflags) {
    return This->lpVtbl->GetRenderingPrefs(This,renderflags);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_SetRenderingMode(IVMRFilterConfig9* This,DWORD mode) {
    return This->lpVtbl->SetRenderingMode(This,mode);
}
static FORCEINLINE HRESULT IVMRFilterConfig9_GetRenderingMode(IVMRFilterConfig9* This,DWORD *mode) {
    return This->lpVtbl->GetRenderingMode(This,mode);
}
#endif
#endif

#endif


#endif  /* __IVMRFilterConfig9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVMRAspectRatioControl9 interface
 */
#ifndef __IVMRAspectRatioControl9_INTERFACE_DEFINED__
#define __IVMRAspectRatioControl9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRAspectRatioControl9, 0x00d96c29, 0xbbde, 0x4efc, 0x99,0x01, 0xbb,0x50,0x36,0x39,0x21,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00d96c29-bbde-4efc-9901-bb5036392146")
IVMRAspectRatioControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAspectRatioMode(
        DWORD *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAspectRatioMode(
        DWORD mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRAspectRatioControl9, 0x00d96c29, 0xbbde, 0x4efc, 0x99,0x01, 0xbb,0x50,0x36,0x39,0x21,0x46)
#endif
#else
typedef struct IVMRAspectRatioControl9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRAspectRatioControl9 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAspectRatioMode)(
        IVMRAspectRatioControl9 *This,
        DWORD *mode);

    HRESULT (STDMETHODCALLTYPE *SetAspectRatioMode)(
        IVMRAspectRatioControl9 *This,
        DWORD mode);

    END_INTERFACE
} IVMRAspectRatioControl9Vtbl;

interface IVMRAspectRatioControl9 {
    CONST_VTBL IVMRAspectRatioControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRAspectRatioControl9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRAspectRatioControl9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRAspectRatioControl9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRAspectRatioControl9 methods ***/
#define IVMRAspectRatioControl9_GetAspectRatioMode(This,mode) (This)->lpVtbl->GetAspectRatioMode(This,mode)
#define IVMRAspectRatioControl9_SetAspectRatioMode(This,mode) (This)->lpVtbl->SetAspectRatioMode(This,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRAspectRatioControl9_QueryInterface(IVMRAspectRatioControl9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRAspectRatioControl9_AddRef(IVMRAspectRatioControl9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRAspectRatioControl9_Release(IVMRAspectRatioControl9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRAspectRatioControl9 methods ***/
static FORCEINLINE HRESULT IVMRAspectRatioControl9_GetAspectRatioMode(IVMRAspectRatioControl9* This,DWORD *mode) {
    return This->lpVtbl->GetAspectRatioMode(This,mode);
}
static FORCEINLINE HRESULT IVMRAspectRatioControl9_SetAspectRatioMode(IVMRAspectRatioControl9* This,DWORD mode) {
    return This->lpVtbl->SetAspectRatioMode(This,mode);
}
#endif
#endif

#endif


#endif  /* __IVMRAspectRatioControl9_INTERFACE_DEFINED__ */

typedef struct _VMR9MonitorInfo {
    UINT uDevID;
    RECT rcMonitor;
    HMONITOR hMon;
    DWORD dwFlags;
    WCHAR szDevice[32];
    WCHAR szDescription[512];
    LARGE_INTEGER liDriverVersion;
    DWORD dwVendorId;
    DWORD dwDeviceId;
    DWORD dwSubSysId;
    DWORD dwRevision;
} VMR9MonitorInfo;
/*****************************************************************************
 * IVMRMonitorConfig9 interface
 */
#ifndef __IVMRMonitorConfig9_INTERFACE_DEFINED__
#define __IVMRMonitorConfig9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRMonitorConfig9, 0x46c2e457, 0x8ba0, 0x4eef, 0xb8,0x0b, 0x06,0x80,0xf0,0x97,0x87,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("46c2e457-8ba0-4eef-b80b-0680f0978749")
IVMRMonitorConfig9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetMonitor(
        UINT uDev) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMonitor(
        UINT *uDev) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultMonitor(
        UINT uDev) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultMonitor(
        UINT *uDev) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAvailableMonitors(
        VMR9MonitorInfo *info,
        DWORD arraysize,
        DWORD *numdev) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRMonitorConfig9, 0x46c2e457, 0x8ba0, 0x4eef, 0xb8,0x0b, 0x06,0x80,0xf0,0x97,0x87,0x49)
#endif
#else
typedef struct IVMRMonitorConfig9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRMonitorConfig9 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetMonitor)(
        IVMRMonitorConfig9 *This,
        UINT uDev);

    HRESULT (STDMETHODCALLTYPE *GetMonitor)(
        IVMRMonitorConfig9 *This,
        UINT *uDev);

    HRESULT (STDMETHODCALLTYPE *SetDefaultMonitor)(
        IVMRMonitorConfig9 *This,
        UINT uDev);

    HRESULT (STDMETHODCALLTYPE *GetDefaultMonitor)(
        IVMRMonitorConfig9 *This,
        UINT *uDev);

    HRESULT (STDMETHODCALLTYPE *GetAvailableMonitors)(
        IVMRMonitorConfig9 *This,
        VMR9MonitorInfo *info,
        DWORD arraysize,
        DWORD *numdev);

    END_INTERFACE
} IVMRMonitorConfig9Vtbl;

interface IVMRMonitorConfig9 {
    CONST_VTBL IVMRMonitorConfig9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRMonitorConfig9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRMonitorConfig9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRMonitorConfig9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRMonitorConfig9 methods ***/
#define IVMRMonitorConfig9_SetMonitor(This,uDev) (This)->lpVtbl->SetMonitor(This,uDev)
#define IVMRMonitorConfig9_GetMonitor(This,uDev) (This)->lpVtbl->GetMonitor(This,uDev)
#define IVMRMonitorConfig9_SetDefaultMonitor(This,uDev) (This)->lpVtbl->SetDefaultMonitor(This,uDev)
#define IVMRMonitorConfig9_GetDefaultMonitor(This,uDev) (This)->lpVtbl->GetDefaultMonitor(This,uDev)
#define IVMRMonitorConfig9_GetAvailableMonitors(This,info,arraysize,numdev) (This)->lpVtbl->GetAvailableMonitors(This,info,arraysize,numdev)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRMonitorConfig9_QueryInterface(IVMRMonitorConfig9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRMonitorConfig9_AddRef(IVMRMonitorConfig9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRMonitorConfig9_Release(IVMRMonitorConfig9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRMonitorConfig9 methods ***/
static FORCEINLINE HRESULT IVMRMonitorConfig9_SetMonitor(IVMRMonitorConfig9* This,UINT uDev) {
    return This->lpVtbl->SetMonitor(This,uDev);
}
static FORCEINLINE HRESULT IVMRMonitorConfig9_GetMonitor(IVMRMonitorConfig9* This,UINT *uDev) {
    return This->lpVtbl->GetMonitor(This,uDev);
}
static FORCEINLINE HRESULT IVMRMonitorConfig9_SetDefaultMonitor(IVMRMonitorConfig9* This,UINT uDev) {
    return This->lpVtbl->SetDefaultMonitor(This,uDev);
}
static FORCEINLINE HRESULT IVMRMonitorConfig9_GetDefaultMonitor(IVMRMonitorConfig9* This,UINT *uDev) {
    return This->lpVtbl->GetDefaultMonitor(This,uDev);
}
static FORCEINLINE HRESULT IVMRMonitorConfig9_GetAvailableMonitors(IVMRMonitorConfig9* This,VMR9MonitorInfo *info,DWORD arraysize,DWORD *numdev) {
    return This->lpVtbl->GetAvailableMonitors(This,info,arraysize,numdev);
}
#endif
#endif

#endif


#endif  /* __IVMRMonitorConfig9_INTERFACE_DEFINED__ */

typedef enum _VMR9DeinterlacePrefs {
    DeinterlacePref9_NextBest = 0x1,
    DeinterlacePref9_BOB = 0x2,
    DeinterlacePref9_Weave = 0x4,
    DeinterlacePref9_Mask = 0x7
} VMR9DeinterlacePrefs;
typedef enum _VMR9DeinterlaceTech {
    DeinterlaceTech9_Unknown = 0,
    DeinterlaceTech9_BOBLineReplicate = 0x1,
    DeinterlaceTech9_BOBVerticalStretch = 0x2,
    DeinterlaceTech9_MedianFiltering = 0x4,
    DeinterlaceTech9_EdgeFiltering = 0x10,
    DeinterlaceTech9_FieldAdaptive = 0x20,
    DeinterlaceTech9_PixelAdaptive = 0x40,
    DeinterlaceTech9_MotionVectorSteered = 0x80
} VMR9DeinterlaceTech;
typedef struct _VMR9Frequency {
    DWORD dwNumerator;
    DWORD dwDenominator;
} VMR9Frequency;
typedef enum _VMR9_SampleFormat {
    VMR9_SampleReserved = 1,
    VMR9_SampleProgressiveFrame = 2,
    VMR9_SampleFieldInterleavedEvenFirst = 3,
    VMR9_SampleFieldInterleavedOddFirst = 4,
    VMR9_SampleFieldSingleEven = 5,
    VMR9_SampleFieldSingleOdd = 6
} VMR9_SampleFormat;
typedef struct _VMR9VideoDesc {
    DWORD dwSize;
    DWORD dwSampleWidth;
    DWORD dwSampleHeight;
    VMR9_SampleFormat SampleFormat;
    DWORD dwFourCC;
    VMR9Frequency InputSampleFreq;
    VMR9Frequency OutputFrameFreq;
} VMR9VideoDesc;
typedef struct _VMR9DeinterlaceCaps {
    DWORD dwSize;
    DWORD dwNumPreviousOutputFrames;
    DWORD dwNumForwardRefSamples;
    DWORD dwNumBackwardRefSamples;
    VMR9DeinterlaceTech DeinterlaceTechnology;
} VMR9DeinterlaceCaps;
/*****************************************************************************
 * IVMRDeinterlaceControl9 interface
 */
#ifndef __IVMRDeinterlaceControl9_INTERFACE_DEFINED__
#define __IVMRDeinterlaceControl9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRDeinterlaceControl9, 0xa215fb8d, 0x13c2, 0x4f7f, 0x99,0x3c, 0x00,0x3d,0x62,0x71,0xa4,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a215fb8d-13c2-4f7f-993c-003d6271a459")
IVMRDeinterlaceControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNumberOfDeinterlaceModes(
        VMR9VideoDesc *desc,
        DWORD *nummodes,
        GUID *modes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeinterlaceModeCaps(
        GUID *mode,
        VMR9VideoDesc *desc,
        VMR9DeinterlaceCaps *caps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeinterlaceMode(
        DWORD streamid,
        GUID *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDeinterlaceMode(
        DWORD streamid,
        GUID *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeinterlacePrefs(
        DWORD *prefs) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDeinterlacePrefs(
        DWORD prefs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetActualDeinterlaceMode(
        DWORD streamid,
        GUID *mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRDeinterlaceControl9, 0xa215fb8d, 0x13c2, 0x4f7f, 0x99,0x3c, 0x00,0x3d,0x62,0x71,0xa4,0x59)
#endif
#else
typedef struct IVMRDeinterlaceControl9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRDeinterlaceControl9 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNumberOfDeinterlaceModes)(
        IVMRDeinterlaceControl9 *This,
        VMR9VideoDesc *desc,
        DWORD *nummodes,
        GUID *modes);

    HRESULT (STDMETHODCALLTYPE *GetDeinterlaceModeCaps)(
        IVMRDeinterlaceControl9 *This,
        GUID *mode,
        VMR9VideoDesc *desc,
        VMR9DeinterlaceCaps *caps);

    HRESULT (STDMETHODCALLTYPE *GetDeinterlaceMode)(
        IVMRDeinterlaceControl9 *This,
        DWORD streamid,
        GUID *mode);

    HRESULT (STDMETHODCALLTYPE *SetDeinterlaceMode)(
        IVMRDeinterlaceControl9 *This,
        DWORD streamid,
        GUID *mode);

    HRESULT (STDMETHODCALLTYPE *GetDeinterlacePrefs)(
        IVMRDeinterlaceControl9 *This,
        DWORD *prefs);

    HRESULT (STDMETHODCALLTYPE *SetDeinterlacePrefs)(
        IVMRDeinterlaceControl9 *This,
        DWORD prefs);

    HRESULT (STDMETHODCALLTYPE *GetActualDeinterlaceMode)(
        IVMRDeinterlaceControl9 *This,
        DWORD streamid,
        GUID *mode);

    END_INTERFACE
} IVMRDeinterlaceControl9Vtbl;

interface IVMRDeinterlaceControl9 {
    CONST_VTBL IVMRDeinterlaceControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRDeinterlaceControl9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRDeinterlaceControl9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRDeinterlaceControl9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRDeinterlaceControl9 methods ***/
#define IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes(This,desc,nummodes,modes) (This)->lpVtbl->GetNumberOfDeinterlaceModes(This,desc,nummodes,modes)
#define IVMRDeinterlaceControl9_GetDeinterlaceModeCaps(This,mode,desc,caps) (This)->lpVtbl->GetDeinterlaceModeCaps(This,mode,desc,caps)
#define IVMRDeinterlaceControl9_GetDeinterlaceMode(This,streamid,mode) (This)->lpVtbl->GetDeinterlaceMode(This,streamid,mode)
#define IVMRDeinterlaceControl9_SetDeinterlaceMode(This,streamid,mode) (This)->lpVtbl->SetDeinterlaceMode(This,streamid,mode)
#define IVMRDeinterlaceControl9_GetDeinterlacePrefs(This,prefs) (This)->lpVtbl->GetDeinterlacePrefs(This,prefs)
#define IVMRDeinterlaceControl9_SetDeinterlacePrefs(This,prefs) (This)->lpVtbl->SetDeinterlacePrefs(This,prefs)
#define IVMRDeinterlaceControl9_GetActualDeinterlaceMode(This,streamid,mode) (This)->lpVtbl->GetActualDeinterlaceMode(This,streamid,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_QueryInterface(IVMRDeinterlaceControl9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRDeinterlaceControl9_AddRef(IVMRDeinterlaceControl9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRDeinterlaceControl9_Release(IVMRDeinterlaceControl9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRDeinterlaceControl9 methods ***/
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes(IVMRDeinterlaceControl9* This,VMR9VideoDesc *desc,DWORD *nummodes,GUID *modes) {
    return This->lpVtbl->GetNumberOfDeinterlaceModes(This,desc,nummodes,modes);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_GetDeinterlaceModeCaps(IVMRDeinterlaceControl9* This,GUID *mode,VMR9VideoDesc *desc,VMR9DeinterlaceCaps *caps) {
    return This->lpVtbl->GetDeinterlaceModeCaps(This,mode,desc,caps);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_GetDeinterlaceMode(IVMRDeinterlaceControl9* This,DWORD streamid,GUID *mode) {
    return This->lpVtbl->GetDeinterlaceMode(This,streamid,mode);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_SetDeinterlaceMode(IVMRDeinterlaceControl9* This,DWORD streamid,GUID *mode) {
    return This->lpVtbl->SetDeinterlaceMode(This,streamid,mode);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_GetDeinterlacePrefs(IVMRDeinterlaceControl9* This,DWORD *prefs) {
    return This->lpVtbl->GetDeinterlacePrefs(This,prefs);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_SetDeinterlacePrefs(IVMRDeinterlaceControl9* This,DWORD prefs) {
    return This->lpVtbl->SetDeinterlacePrefs(This,prefs);
}
static FORCEINLINE HRESULT IVMRDeinterlaceControl9_GetActualDeinterlaceMode(IVMRDeinterlaceControl9* This,DWORD streamid,GUID *mode) {
    return This->lpVtbl->GetActualDeinterlaceMode(This,streamid,mode);
}
#endif
#endif

#endif


#endif  /* __IVMRDeinterlaceControl9_INTERFACE_DEFINED__ */

typedef struct _VMR9VideoStreamInfo {
    IDirect3DSurface9 *pddsVideoSurface;
    DWORD dwWidth;
    DWORD dwHeight;
    DWORD dwStrmID;
    FLOAT fAlpha;
    VMR9NormalizedRect rNormal;
    REFERENCE_TIME rtStart;
    REFERENCE_TIME rtEnd;
    VMR9_SampleFormat SampleFormat;
} VMR9VideoStreamInfo;
/*****************************************************************************
 * IVMRImageCompositor9 interface
 */
#ifndef __IVMRImageCompositor9_INTERFACE_DEFINED__
#define __IVMRImageCompositor9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVMRImageCompositor9, 0x4a5c89eb, 0xdf51, 0x4654, 0xac,0x2a, 0xe4,0x8e,0x02,0xbb,0xab,0xf6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4a5c89eb-df51-4654-ac2a-e48e02bbabf6")
IVMRImageCompositor9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitCompositionDevice(
        IUnknown *d3ddev) = 0;

    virtual HRESULT STDMETHODCALLTYPE TermCompositionDevice(
        IUnknown *d3ddev) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamMediaType(
        DWORD stream,
        AM_MEDIA_TYPE *mt,
        WINBOOL texture) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompositeImage(
        IUnknown *d3ddev,
        IDirect3DSurface9 *d3dtarget,
        AM_MEDIA_TYPE *mttarget,
        REFERENCE_TIME start,
        REFERENCE_TIME stop,
        D3DCOLOR back,
        VMR9VideoStreamInfo *info,
        UINT streams) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVMRImageCompositor9, 0x4a5c89eb, 0xdf51, 0x4654, 0xac,0x2a, 0xe4,0x8e,0x02,0xbb,0xab,0xf6)
#endif
#else
typedef struct IVMRImageCompositor9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVMRImageCompositor9 methods ***/
    HRESULT (STDMETHODCALLTYPE *InitCompositionDevice)(
        IVMRImageCompositor9 *This,
        IUnknown *d3ddev);

    HRESULT (STDMETHODCALLTYPE *TermCompositionDevice)(
        IVMRImageCompositor9 *This,
        IUnknown *d3ddev);

    HRESULT (STDMETHODCALLTYPE *SetStreamMediaType)(
        IVMRImageCompositor9 *This,
        DWORD stream,
        AM_MEDIA_TYPE *mt,
        WINBOOL texture);

    HRESULT (STDMETHODCALLTYPE *CompositeImage)(
        IVMRImageCompositor9 *This,
        IUnknown *d3ddev,
        IDirect3DSurface9 *d3dtarget,
        AM_MEDIA_TYPE *mttarget,
        REFERENCE_TIME start,
        REFERENCE_TIME stop,
        D3DCOLOR back,
        VMR9VideoStreamInfo *info,
        UINT streams);

    END_INTERFACE
} IVMRImageCompositor9Vtbl;

interface IVMRImageCompositor9 {
    CONST_VTBL IVMRImageCompositor9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVMRImageCompositor9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVMRImageCompositor9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVMRImageCompositor9_Release(This) (This)->lpVtbl->Release(This)
/*** IVMRImageCompositor9 methods ***/
#define IVMRImageCompositor9_InitCompositionDevice(This,d3ddev) (This)->lpVtbl->InitCompositionDevice(This,d3ddev)
#define IVMRImageCompositor9_TermCompositionDevice(This,d3ddev) (This)->lpVtbl->TermCompositionDevice(This,d3ddev)
#define IVMRImageCompositor9_SetStreamMediaType(This,stream,mt,texture) (This)->lpVtbl->SetStreamMediaType(This,stream,mt,texture)
#define IVMRImageCompositor9_CompositeImage(This,d3ddev,d3dtarget,mttarget,start,stop,back,info,streams) (This)->lpVtbl->CompositeImage(This,d3ddev,d3dtarget,mttarget,start,stop,back,info,streams)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IVMRImageCompositor9_QueryInterface(IVMRImageCompositor9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IVMRImageCompositor9_AddRef(IVMRImageCompositor9* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IVMRImageCompositor9_Release(IVMRImageCompositor9* This) {
    return This->lpVtbl->Release(This);
}
/*** IVMRImageCompositor9 methods ***/
static FORCEINLINE HRESULT IVMRImageCompositor9_InitCompositionDevice(IVMRImageCompositor9* This,IUnknown *d3ddev) {
    return This->lpVtbl->InitCompositionDevice(This,d3ddev);
}
static FORCEINLINE HRESULT IVMRImageCompositor9_TermCompositionDevice(IVMRImageCompositor9* This,IUnknown *d3ddev) {
    return This->lpVtbl->TermCompositionDevice(This,d3ddev);
}
static FORCEINLINE HRESULT IVMRImageCompositor9_SetStreamMediaType(IVMRImageCompositor9* This,DWORD stream,AM_MEDIA_TYPE *mt,WINBOOL texture) {
    return This->lpVtbl->SetStreamMediaType(This,stream,mt,texture);
}
static FORCEINLINE HRESULT IVMRImageCompositor9_CompositeImage(IVMRImageCompositor9* This,IUnknown *d3ddev,IDirect3DSurface9 *d3dtarget,AM_MEDIA_TYPE *mttarget,REFERENCE_TIME start,REFERENCE_TIME stop,D3DCOLOR back,VMR9VideoStreamInfo *info,UINT streams) {
    return This->lpVtbl->CompositeImage(This,d3ddev,d3dtarget,mttarget,start,stop,back,info,streams);
}
#endif
#endif

#endif


#endif  /* __IVMRImageCompositor9_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __vmr9_h__ */
