/*** Autogenerated by WIDL 1.1.44 from vmr9.idl - Do not edit ***/

#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_VMR9_H
#define __WIDL_VMR9_H

#ifdef __cplusplus
extern "C" {
#endif

/* Headers for imported files */

#include <unknwn.h>

/* Forward declarations */

#ifndef __IVMRImagePresenter9_FWD_DEFINED__
#define __IVMRImagePresenter9_FWD_DEFINED__
typedef interface IVMRImagePresenter9 IVMRImagePresenter9;
#endif

#ifndef __IVMRSurfaceAllocator9_FWD_DEFINED__
#define __IVMRSurfaceAllocator9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocator9 IVMRSurfaceAllocator9;
#endif

#ifndef __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorEx9 IVMRSurfaceAllocatorEx9;
#endif

#ifndef __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorNotify9 IVMRSurfaceAllocatorNotify9;
#endif

#ifndef __IVMRWindowlessControl9_FWD_DEFINED__
#define __IVMRWindowlessControl9_FWD_DEFINED__
typedef interface IVMRWindowlessControl9 IVMRWindowlessControl9;
#endif

#ifndef __IVMRMixerControl9_FWD_DEFINED__
#define __IVMRMixerControl9_FWD_DEFINED__
typedef interface IVMRMixerControl9 IVMRMixerControl9;
#endif

#ifndef __IVMRMixerBitmap9_FWD_DEFINED__
#define __IVMRMixerBitmap9_FWD_DEFINED__
typedef interface IVMRMixerBitmap9 IVMRMixerBitmap9;
#endif

#ifndef __IVMRSurface9_FWD_DEFINED__
#define __IVMRSurface9_FWD_DEFINED__
typedef interface IVMRSurface9 IVMRSurface9;
#endif

#ifndef __IVMRImagePresenterConfig9_FWD_DEFINED__
#define __IVMRImagePresenterConfig9_FWD_DEFINED__
typedef interface IVMRImagePresenterConfig9 IVMRImagePresenterConfig9;
#endif

#ifndef __IVMRVideoStreamControl9_FWD_DEFINED__
#define __IVMRVideoStreamControl9_FWD_DEFINED__
typedef interface IVMRVideoStreamControl9 IVMRVideoStreamControl9;
#endif

#ifndef __IVMRFilterConfig9_FWD_DEFINED__
#define __IVMRFilterConfig9_FWD_DEFINED__
typedef interface IVMRFilterConfig9 IVMRFilterConfig9;
#endif

#ifndef __IVMRAspectRatioControl9_FWD_DEFINED__
#define __IVMRAspectRatioControl9_FWD_DEFINED__
typedef interface IVMRAspectRatioControl9 IVMRAspectRatioControl9;
#endif

#ifndef __IVMRMonitorConfig9_FWD_DEFINED__
#define __IVMRMonitorConfig9_FWD_DEFINED__
typedef interface IVMRMonitorConfig9 IVMRMonitorConfig9;
#endif

#ifndef __IVMRDeinterlaceControl9_FWD_DEFINED__
#define __IVMRDeinterlaceControl9_FWD_DEFINED__
typedef interface IVMRDeinterlaceControl9 IVMRDeinterlaceControl9;
#endif

#ifndef __IVMRImageCompositor9_FWD_DEFINED__
#define __IVMRImageCompositor9_FWD_DEFINED__
typedef interface IVMRImageCompositor9 IVMRImageCompositor9;
#endif


#if 0
#ifndef __IDirect3DSurface9_FWD_DEFINED__
#define __IDirect3DSurface9_FWD_DEFINED__
typedef interface IDirect3DSurface9 IDirect3DSurface9;
#endif

#ifndef __IDirect3DDevice9_FWD_DEFINED__
#define __IDirect3DDevice9_FWD_DEFINED__
typedef interface IDirect3DDevice9 IDirect3DDevice9;
#endif

typedef LONGLONG REFERENCE_TIME;
typedef DWORD D3DFORMAT;
typedef DWORD D3DPOOL;
typedef HANDLE HMONITOR;
typedef struct __WIDL_vmr9_generated_name_00000000 {
    char dummy;
} AM_MEDIA_TYPE;
typedef struct __WIDL_vmr9_generated_name_00000001 {
    char dummy;
} D3DCOLOR;
#endif
#ifndef __IVMRSurface9_FWD_DEFINED__
#define __IVMRSurface9_FWD_DEFINED__
typedef interface IVMRSurface9 IVMRSurface9;
#endif

#ifndef __IVMRSurfaceAllocator9_FWD_DEFINED__
#define __IVMRSurfaceAllocator9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocator9 IVMRSurfaceAllocator9;
#endif

#ifndef __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorEx9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorEx9 IVMRSurfaceAllocatorEx9;
#endif

#ifndef __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
#define __IVMRSurfaceAllocatorNotify9_FWD_DEFINED__
typedef interface IVMRSurfaceAllocatorNotify9 IVMRSurfaceAllocatorNotify9;
#endif

#ifndef __IVMRImagePresenter9_FWD_DEFINED__
#define __IVMRImagePresenter9_FWD_DEFINED__
typedef interface IVMRImagePresenter9 IVMRImagePresenter9;
#endif

#ifndef __IVMRImagePresenterConfig9_FWD_DEFINED__
#define __IVMRImagePresenterConfig9_FWD_DEFINED__
typedef interface IVMRImagePresenterConfig9 IVMRImagePresenterConfig9;
#endif

#ifndef __IVMRMonitorConfig9_FWD_DEFINED__
#define __IVMRMonitorConfig9_FWD_DEFINED__
typedef interface IVMRMonitorConfig9 IVMRMonitorConfig9;
#endif

#ifndef __IVMRWindowlessControl9_FWD_DEFINED__
#define __IVMRWindowlessControl9_FWD_DEFINED__
typedef interface IVMRWindowlessControl9 IVMRWindowlessControl9;
#endif

#ifndef __IVMRMixerControl9_FWD_DEFINED__
#define __IVMRMixerControl9_FWD_DEFINED__
typedef interface IVMRMixerControl9 IVMRMixerControl9;
#endif

#ifndef __IVMRImageCompositor9_FWD_DEFINED__
#define __IVMRImageCompositor9_FWD_DEFINED__
typedef interface IVMRImageCompositor9 IVMRImageCompositor9;
#endif

#ifndef __IVMRMixerBitmap9_FWD_DEFINED__
#define __IVMRMixerBitmap9_FWD_DEFINED__
typedef interface IVMRMixerBitmap9 IVMRMixerBitmap9;
#endif

#ifndef __IVMRFilterConfig9_FWD_DEFINED__
#define __IVMRFilterConfig9_FWD_DEFINED__
typedef interface IVMRFilterConfig9 IVMRFilterConfig9;
#endif

#ifndef __IVMRAspectRatioControl9_FWD_DEFINED__
#define __IVMRAspectRatioControl9_FWD_DEFINED__
typedef interface IVMRAspectRatioControl9 IVMRAspectRatioControl9;
#endif

#ifndef __IVMRVideoStreamControl9_FWD_DEFINED__
#define __IVMRVideoStreamControl9_FWD_DEFINED__
typedef interface IVMRVideoStreamControl9 IVMRVideoStreamControl9;
#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRImagePresenter9_StartPresenting_Proxy(
    IVMRImagePresenter9* This,
    DWORD_PTR id);
void __RPC_STUB IVMRImagePresenter9_StartPresenting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRImagePresenter9_StopPresenting_Proxy(
    IVMRImagePresenter9* This,
    DWORD_PTR id);
void __RPC_STUB IVMRImagePresenter9_StopPresenting_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRImagePresenter9_PresentImage_Proxy(
    IVMRImagePresenter9* This,
    DWORD_PTR id,
    VMR9PresentationInfo *info);
void __RPC_STUB IVMRImagePresenter9_PresentImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator9_InitializeDevice_Proxy(
    IVMRSurfaceAllocator9* This,
    DWORD_PTR id,
    VMR9AllocationInfo *allocinfo,
    DWORD *numbuffers);
void __RPC_STUB IVMRSurfaceAllocator9_InitializeDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator9_TerminateDevice_Proxy(
    IVMRSurfaceAllocator9* This,
    DWORD_PTR id);
void __RPC_STUB IVMRSurfaceAllocator9_TerminateDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator9_GetSurface_Proxy(
    IVMRSurfaceAllocator9* This,
    DWORD_PTR id,
    DWORD surfaceindex,
    DWORD flags,
    IDirect3DSurface9 **surface);
void __RPC_STUB IVMRSurfaceAllocator9_GetSurface_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocator9_AdviseNotify_Proxy(
    IVMRSurfaceAllocator9* This,
    IVMRSurfaceAllocatorNotify9 *allocnotify);
void __RPC_STUB IVMRSurfaceAllocator9_AdviseNotify_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface IVMRSurfaceAllocatorEx9 : public IVMRSurfaceAllocator9
{
    virtual HRESULT STDMETHODCALLTYPE GetSurfaceEx(
        DWORD_PTR id,
        DWORD surfaceindex,
        DWORD flags,
        IDirect3DSurface9 **surface,
        RECT *dest) = 0;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorEx9_GetSurfaceEx_Proxy(
    IVMRSurfaceAllocatorEx9* This,
    DWORD_PTR id,
    DWORD surfaceindex,
    DWORD flags,
    IDirect3DSurface9 **surface,
    RECT *dest);
void __RPC_STUB IVMRSurfaceAllocatorEx9_GetSurfaceEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator_Proxy(
    IVMRSurfaceAllocatorNotify9* This,
    DWORD_PTR id,
    IVMRSurfaceAllocator9 *alloc);
void __RPC_STUB IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify9_SetD3DDevice_Proxy(
    IVMRSurfaceAllocatorNotify9* This,
    IDirect3DDevice9 *device,
    HMONITOR monitor);
void __RPC_STUB IVMRSurfaceAllocatorNotify9_SetD3DDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify9_ChangeD3DDevice_Proxy(
    IVMRSurfaceAllocatorNotify9* This,
    IDirect3DDevice9 *device,
    HMONITOR monitor);
void __RPC_STUB IVMRSurfaceAllocatorNotify9_ChangeD3DDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper_Proxy(
    IVMRSurfaceAllocatorNotify9* This,
    VMR9AllocationInfo *allocinfo,
    DWORD *numbuffers,
    IDirect3DSurface9 **surface);
void __RPC_STUB IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurfaceAllocatorNotify9_NotifyEvent_Proxy(
    IVMRSurfaceAllocatorNotify9* This,
    LONG code,
    LONG_PTR param1,
    LONG_PTR param2);
void __RPC_STUB IVMRSurfaceAllocatorNotify9_NotifyEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetNativeVideoSize_Proxy(
    IVMRWindowlessControl9* This,
    LONG *width,
    LONG *height,
    LONG *arwidth,
    LONG *arheight);
void __RPC_STUB IVMRWindowlessControl9_GetNativeVideoSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetMinIdealVideoSize_Proxy(
    IVMRWindowlessControl9* This,
    LONG *width,
    LONG *height);
void __RPC_STUB IVMRWindowlessControl9_GetMinIdealVideoSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetMaxIdealVideoSize_Proxy(
    IVMRWindowlessControl9* This,
    LONG *width,
    LONG *height);
void __RPC_STUB IVMRWindowlessControl9_GetMaxIdealVideoSize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_SetVideoPosition_Proxy(
    IVMRWindowlessControl9* This,
    const RECT *source,
    const RECT *dest);
void __RPC_STUB IVMRWindowlessControl9_SetVideoPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetVideoPosition_Proxy(
    IVMRWindowlessControl9* This,
    RECT *source,
    RECT *dest);
void __RPC_STUB IVMRWindowlessControl9_GetVideoPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetAspectRatioMode_Proxy(
    IVMRWindowlessControl9* This,
    DWORD *mode);
void __RPC_STUB IVMRWindowlessControl9_GetAspectRatioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_SetAspectRatioMode_Proxy(
    IVMRWindowlessControl9* This,
    DWORD mode);
void __RPC_STUB IVMRWindowlessControl9_SetAspectRatioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_SetVideoClippingWindow_Proxy(
    IVMRWindowlessControl9* This,
    HWND hwnd);
void __RPC_STUB IVMRWindowlessControl9_SetVideoClippingWindow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_RepaintVideo_Proxy(
    IVMRWindowlessControl9* This,
    HWND hwnd,
    HDC hdc);
void __RPC_STUB IVMRWindowlessControl9_RepaintVideo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_DisplayModeChanged_Proxy(
    IVMRWindowlessControl9* This);
void __RPC_STUB IVMRWindowlessControl9_DisplayModeChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetCurrentImage_Proxy(
    IVMRWindowlessControl9* This,
    BYTE **dib);
void __RPC_STUB IVMRWindowlessControl9_GetCurrentImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_SetBorderColor_Proxy(
    IVMRWindowlessControl9* This,
    COLORREF color);
void __RPC_STUB IVMRWindowlessControl9_SetBorderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRWindowlessControl9_GetBorderColor_Proxy(
    IVMRWindowlessControl9* This,
    COLORREF *color);
void __RPC_STUB IVMRWindowlessControl9_GetBorderColor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetAlpha_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    FLOAT alpha);
void __RPC_STUB IVMRMixerControl9_SetAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetAlpha_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    FLOAT *alpha);
void __RPC_STUB IVMRMixerControl9_GetAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetZOrder_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    DWORD zorder);
void __RPC_STUB IVMRMixerControl9_SetZOrder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetZOrder_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    DWORD *zorder);
void __RPC_STUB IVMRMixerControl9_GetZOrder_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetOutputRect_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    const VMR9NormalizedRect *rect);
void __RPC_STUB IVMRMixerControl9_SetOutputRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetOutputRect_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    VMR9NormalizedRect *rect);
void __RPC_STUB IVMRMixerControl9_GetOutputRect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetBackgroundClr_Proxy(
    IVMRMixerControl9* This,
    COLORREF back);
void __RPC_STUB IVMRMixerControl9_SetBackgroundClr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetBackgroundClr_Proxy(
    IVMRMixerControl9* This,
    COLORREF *back);
void __RPC_STUB IVMRMixerControl9_GetBackgroundClr_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetMixingPrefs_Proxy(
    IVMRMixerControl9* This,
    DWORD mixingprefs);
void __RPC_STUB IVMRMixerControl9_SetMixingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetMixingPrefs_Proxy(
    IVMRMixerControl9* This,
    DWORD *mixingprefs);
void __RPC_STUB IVMRMixerControl9_GetMixingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_SetProcAmpControl_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    VMR9ProcAmpControl *control);
void __RPC_STUB IVMRMixerControl9_SetProcAmpControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetProcAmpControl_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    VMR9ProcAmpControl *control);
void __RPC_STUB IVMRMixerControl9_GetProcAmpControl_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerControl9_GetProcAmpControlRange_Proxy(
    IVMRMixerControl9* This,
    DWORD streamid,
    VMR9ProcAmpControlRange *controlrange);
void __RPC_STUB IVMRMixerControl9_GetProcAmpControlRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRMixerBitmap9_SetAlphaBitmap_Proxy(
    IVMRMixerBitmap9* This,
    const VMR9AlphaBitmap *bitmap);
void __RPC_STUB IVMRMixerBitmap9_SetAlphaBitmap_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerBitmap9_UpdateAlphaBitmapParameters_Proxy(
    IVMRMixerBitmap9* This,
    const VMR9AlphaBitmap *bitmap);
void __RPC_STUB IVMRMixerBitmap9_UpdateAlphaBitmapParameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMixerBitmap9_GetAlphaBitmapParameters_Proxy(
    IVMRMixerBitmap9* This,
    VMR9AlphaBitmap *bitmap);
void __RPC_STUB IVMRMixerBitmap9_GetAlphaBitmapParameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRSurface9_IsSurfaceLocked_Proxy(
    IVMRSurface9* This);
void __RPC_STUB IVMRSurface9_IsSurfaceLocked_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurface9_LockSurface_Proxy(
    IVMRSurface9* This,
    BYTE **surface);
void __RPC_STUB IVMRSurface9_LockSurface_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurface9_UnlockSurface_Proxy(
    IVMRSurface9* This);
void __RPC_STUB IVMRSurface9_UnlockSurface_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRSurface9_GetSurface_Proxy(
    IVMRSurface9* This,
    IDirect3DSurface9 **surface);
void __RPC_STUB IVMRSurface9_GetSurface_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface IVMRImagePresenterConfig9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetRenderingPrefs(
        DWORD renderflags) = 0;

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

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRImagePresenterConfig9_SetRenderingPrefs_Proxy(
    IVMRImagePresenterConfig9* This,
    DWORD renderflags);
void __RPC_STUB IVMRImagePresenterConfig9_SetRenderingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRImagePresenterConfig9_GetRenderingPrefs_Proxy(
    IVMRImagePresenterConfig9* This,
    DWORD *renderflags);
void __RPC_STUB IVMRImagePresenterConfig9_GetRenderingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface IVMRVideoStreamControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetStreamActiveState(
        BOOL active) = 0;

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

};
#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,
        BOOL active);

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

    END_INTERFACE
} IVMRVideoStreamControl9Vtbl;
interface IVMRVideoStreamControl9 {
    CONST_VTBL IVMRVideoStreamControl9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl9_SetStreamActiveState_Proxy(
    IVMRVideoStreamControl9* This,
    BOOL active);
void __RPC_STUB IVMRVideoStreamControl9_SetStreamActiveState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRVideoStreamControl9_GetStreamActiveState_Proxy(
    IVMRVideoStreamControl9* This,
    BOOL *active);
void __RPC_STUB IVMRVideoStreamControl9_GetStreamActiveState_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_SetImageCompositor_Proxy(
    IVMRFilterConfig9* This,
    IVMRImageCompositor9 *compositor);
void __RPC_STUB IVMRFilterConfig9_SetImageCompositor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_SetNumberOfStreams_Proxy(
    IVMRFilterConfig9* This,
    DWORD max);
void __RPC_STUB IVMRFilterConfig9_SetNumberOfStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_GetNumberOfStreams_Proxy(
    IVMRFilterConfig9* This,
    DWORD *max);
void __RPC_STUB IVMRFilterConfig9_GetNumberOfStreams_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_SetRenderingPrefs_Proxy(
    IVMRFilterConfig9* This,
    DWORD renderflags);
void __RPC_STUB IVMRFilterConfig9_SetRenderingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_GetRenderingPrefs_Proxy(
    IVMRFilterConfig9* This,
    DWORD *renderflags);
void __RPC_STUB IVMRFilterConfig9_GetRenderingPrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_SetRenderingMode_Proxy(
    IVMRFilterConfig9* This,
    DWORD mode);
void __RPC_STUB IVMRFilterConfig9_SetRenderingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRFilterConfig9_GetRenderingMode_Proxy(
    IVMRFilterConfig9* This,
    DWORD *mode);
void __RPC_STUB IVMRFilterConfig9_GetRenderingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface IVMRAspectRatioControl9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAspectRatioMode(
        DWORD *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAspectRatioMode(
        DWORD mode) = 0;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRAspectRatioControl9_GetAspectRatioMode_Proxy(
    IVMRAspectRatioControl9* This,
    DWORD *mode);
void __RPC_STUB IVMRAspectRatioControl9_GetAspectRatioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRAspectRatioControl9_SetAspectRatioMode_Proxy(
    IVMRAspectRatioControl9* This,
    DWORD mode);
void __RPC_STUB IVMRAspectRatioControl9_SetAspectRatioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRMonitorConfig9_SetMonitor_Proxy(
    IVMRMonitorConfig9* This,
    UINT uDev);
void __RPC_STUB IVMRMonitorConfig9_SetMonitor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMonitorConfig9_GetMonitor_Proxy(
    IVMRMonitorConfig9* This,
    UINT *uDev);
void __RPC_STUB IVMRMonitorConfig9_GetMonitor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMonitorConfig9_SetDefaultMonitor_Proxy(
    IVMRMonitorConfig9* This,
    UINT uDev);
void __RPC_STUB IVMRMonitorConfig9_SetDefaultMonitor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMonitorConfig9_GetDefaultMonitor_Proxy(
    IVMRMonitorConfig9* This,
    UINT *uDev);
void __RPC_STUB IVMRMonitorConfig9_GetDefaultMonitor_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRMonitorConfig9_GetAvailableMonitors_Proxy(
    IVMRMonitorConfig9* This,
    VMR9MonitorInfo *info,
    DWORD arraysize,
    DWORD *numdev);
void __RPC_STUB IVMRMonitorConfig9_GetAvailableMonitors_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface 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;

};
#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
/*** 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)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes_Proxy(
    IVMRDeinterlaceControl9* This,
    VMR9VideoDesc *desc,
    DWORD *nummodes,
    GUID *modes);
void __RPC_STUB IVMRDeinterlaceControl9_GetNumberOfDeinterlaceModes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_GetDeinterlaceModeCaps_Proxy(
    IVMRDeinterlaceControl9* This,
    GUID *mode,
    VMR9VideoDesc *desc,
    VMR9DeinterlaceCaps *caps);
void __RPC_STUB IVMRDeinterlaceControl9_GetDeinterlaceModeCaps_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_GetDeinterlaceMode_Proxy(
    IVMRDeinterlaceControl9* This,
    DWORD streamid,
    GUID *mode);
void __RPC_STUB IVMRDeinterlaceControl9_GetDeinterlaceMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_SetDeinterlaceMode_Proxy(
    IVMRDeinterlaceControl9* This,
    DWORD streamid,
    GUID *mode);
void __RPC_STUB IVMRDeinterlaceControl9_SetDeinterlaceMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_GetDeinterlacePrefs_Proxy(
    IVMRDeinterlaceControl9* This,
    DWORD *prefs);
void __RPC_STUB IVMRDeinterlaceControl9_GetDeinterlacePrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_SetDeinterlacePrefs_Proxy(
    IVMRDeinterlaceControl9* This,
    DWORD prefs);
void __RPC_STUB IVMRDeinterlaceControl9_SetDeinterlacePrefs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRDeinterlaceControl9_GetActualDeinterlaceMode_Proxy(
    IVMRDeinterlaceControl9* This,
    DWORD streamid,
    GUID *mode);
void __RPC_STUB IVMRDeinterlaceControl9_GetActualDeinterlaceMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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)
interface IVMRImageCompositor9 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE InitCompositionDevice(
        IUnknown *d3ddev) = 0;

    virtual HRESULT STDMETHODCALLTYPE TermCompositionDevice(
        IUnknown *d3ddev) = 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;

};
#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 *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
/*** 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_CompositeImage(This,d3ddev,d3dtarget,mttarget,start,stop,back,info,streams) (This)->lpVtbl->CompositeImage(This,d3ddev,d3dtarget,mttarget,start,stop,back,info,streams)
#endif

#endif

HRESULT STDMETHODCALLTYPE IVMRImageCompositor9_InitCompositionDevice_Proxy(
    IVMRImageCompositor9* This,
    IUnknown *d3ddev);
void __RPC_STUB IVMRImageCompositor9_InitCompositionDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRImageCompositor9_TermCompositionDevice_Proxy(
    IVMRImageCompositor9* This,
    IUnknown *d3ddev);
void __RPC_STUB IVMRImageCompositor9_TermCompositionDevice_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IVMRImageCompositor9_CompositeImage_Proxy(
    IVMRImageCompositor9* This,
    IUnknown *d3ddev,
    IDirect3DSurface9 *d3dtarget,
    AM_MEDIA_TYPE *mttarget,
    REFERENCE_TIME start,
    REFERENCE_TIME stop,
    D3DCOLOR back,
    VMR9VideoStreamInfo *info,
    UINT streams);
void __RPC_STUB IVMRImageCompositor9_CompositeImage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IVMRImageCompositor9_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __WIDL_VMR9_H */
