/*** Autogenerated by WIDL 8.17 from include/mfcaptureengine.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 __mfcaptureengine_h__
#define __mfcaptureengine_h__

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

/* Forward declarations */

#ifndef __IMFCaptureEngineOnEventCallback_FWD_DEFINED__
#define __IMFCaptureEngineOnEventCallback_FWD_DEFINED__
typedef interface IMFCaptureEngineOnEventCallback IMFCaptureEngineOnEventCallback;
#ifdef __cplusplus
interface IMFCaptureEngineOnEventCallback;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureEngineOnSampleCallback_FWD_DEFINED__
#define __IMFCaptureEngineOnSampleCallback_FWD_DEFINED__
typedef interface IMFCaptureEngineOnSampleCallback IMFCaptureEngineOnSampleCallback;
#ifdef __cplusplus
interface IMFCaptureEngineOnSampleCallback;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureSink_FWD_DEFINED__
#define __IMFCaptureSink_FWD_DEFINED__
typedef interface IMFCaptureSink IMFCaptureSink;
#ifdef __cplusplus
interface IMFCaptureSink;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureRecordSink_FWD_DEFINED__
#define __IMFCaptureRecordSink_FWD_DEFINED__
typedef interface IMFCaptureRecordSink IMFCaptureRecordSink;
#ifdef __cplusplus
interface IMFCaptureRecordSink;
#endif /* __cplusplus */
#endif

#ifndef __IMFCapturePreviewSink_FWD_DEFINED__
#define __IMFCapturePreviewSink_FWD_DEFINED__
typedef interface IMFCapturePreviewSink IMFCapturePreviewSink;
#ifdef __cplusplus
interface IMFCapturePreviewSink;
#endif /* __cplusplus */
#endif

#ifndef __IMFCapturePhotoSink_FWD_DEFINED__
#define __IMFCapturePhotoSink_FWD_DEFINED__
typedef interface IMFCapturePhotoSink IMFCapturePhotoSink;
#ifdef __cplusplus
interface IMFCapturePhotoSink;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureSource_FWD_DEFINED__
#define __IMFCaptureSource_FWD_DEFINED__
typedef interface IMFCaptureSource IMFCaptureSource;
#ifdef __cplusplus
interface IMFCaptureSource;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureEngine_FWD_DEFINED__
#define __IMFCaptureEngine_FWD_DEFINED__
typedef interface IMFCaptureEngine IMFCaptureEngine;
#ifdef __cplusplus
interface IMFCaptureEngine;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureEngineClassFactory_FWD_DEFINED__
#define __IMFCaptureEngineClassFactory_FWD_DEFINED__
typedef interface IMFCaptureEngineClassFactory IMFCaptureEngineClassFactory;
#ifdef __cplusplus
interface IMFCaptureEngineClassFactory;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureEngineOnSampleCallback2_FWD_DEFINED__
#define __IMFCaptureEngineOnSampleCallback2_FWD_DEFINED__
typedef interface IMFCaptureEngineOnSampleCallback2 IMFCaptureEngineOnSampleCallback2;
#ifdef __cplusplus
interface IMFCaptureEngineOnSampleCallback2;
#endif /* __cplusplus */
#endif

#ifndef __IMFCaptureSink2_FWD_DEFINED__
#define __IMFCaptureSink2_FWD_DEFINED__
typedef interface IMFCaptureSink2 IMFCaptureSink2;
#ifdef __cplusplus
interface IMFCaptureSink2;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <mfobjects.h>
#include <mfidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINVER >= _WIN32_WINNT_WIN7
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef _MFVideoNormalizedRect_
#define _MFVideoNormalizedRect_
typedef struct MFVideoNormalizedRect {
    float left;
    float top;
    float right;
    float bottom;
} MFVideoNormalizedRect;
#endif
typedef enum MF_CAPTURE_ENGINE_DEVICE_TYPE {
    MF_CAPTURE_ENGINE_DEVICE_TYPE_AUDIO = 0x0,
    MF_CAPTURE_ENGINE_DEVICE_TYPE_VIDEO = 0x1
} MF_CAPTURE_ENGINE_DEVICE_TYPE;
typedef enum MF_CAPTURE_ENGINE_SINK_TYPE {
    MF_CAPTURE_ENGINE_SINK_TYPE_RECORD = 0x0,
    MF_CAPTURE_ENGINE_SINK_TYPE_PREVIEW = 0x1,
    MF_CAPTURE_ENGINE_SINK_TYPE_PHOTO = 0x2
} MF_CAPTURE_ENGINE_SINK_TYPE;
enum {
    MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_PREVIEW = 0xfffffffa,
    MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_VIDEO_RECORD = 0xfffffff9,
    MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_PHOTO = 0xfffffff8,
    MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_AUDIO = 0xfffffff7,
    MF_CAPTURE_ENGINE_PREFERRED_SOURCE_STREAM_FOR_METADATA = 0xfffffff6,
    MF_CAPTURE_ENGINE_MEDIASOURCE = 0xffffffff
};
typedef enum MF_CAPTURE_ENGINE_STREAM_CATEGORY {
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_VIDEO_PREVIEW = 0x0,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_VIDEO_CAPTURE = 0x1,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_INDEPENDENT = 0x2,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_PHOTO_DEPENDENT = 0x3,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_AUDIO = 0x4,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_UNSUPPORTED = 0x5,
    MF_CAPTURE_ENGINE_STREAM_CATEGORY_METADATA = 0x6
} MF_CAPTURE_ENGINE_STREAM_CATEGORY;
typedef enum MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE {
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_OTHER = 0,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_COMMUNICATIONS = 1,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_MEDIA = 2,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_GAMECHAT = 3,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_SPEECH = 4,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_FARFIELDSPEECH = 5,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_UNIFORMSPEECH = 6,
    MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE_VOICETYPING = 7
} MF_CAPTURE_ENGINE_MEDIA_CATEGORY_TYPE;
typedef enum MF_CAPTURE_ENGINE_AUDIO_PROCESSING_MODE {
    MF_CAPTURE_ENGINE_AUDIO_PROCESSING_DEFAULT = 0,
    MF_CAPTURE_ENGINE_AUDIO_PROCESSING_RAW = 1
} MF_CAPTURE_ENGINE_AUDIO_PROCESSING_MODE;
EXTERN_GUID(MF_CAPTURE_ENGINE_INITIALIZED, 0x219992bc, 0xcf92, 0x4531, 0xa1, 0xae, 0x96, 0xe1, 0xe8, 0x86, 0xc8, 0xf1);
EXTERN_GUID(MF_CAPTURE_ENGINE_PREVIEW_STARTED, 0xa416df21, 0xf9d3, 0x4a74, 0x99, 0x1b, 0xb8, 0x17, 0x29, 0x89, 0x52, 0xc4);
EXTERN_GUID(MF_CAPTURE_ENGINE_PREVIEW_STOPPED, 0x13d5143c, 0x1edd, 0x4e50,0xa2, 0xef, 0x35, 0x0a, 0x47, 0x67, 0x80, 0x60);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_STARTED, 0xac2b027b, 0xddf9, 0x48a0,0x89, 0xbe, 0x38, 0xab, 0x35, 0xef, 0x45, 0xc0);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_STOPPED, 0x55e5200a, 0xf98f, 0x4c0d, 0xa9, 0xec, 0x9e, 0xb2, 0x5e, 0xd3, 0xd7, 0x73);
EXTERN_GUID(MF_CAPTURE_ENGINE_PHOTO_TAKEN, 0x3c50c445, 0x7304, 0x48eb,0x86, 0x5d, 0xbb, 0xa1, 0x9b, 0xa3, 0xaf, 0x5c);
EXTERN_GUID(MF_CAPTURE_SOURCE_CURRENT_DEVICE_MEDIA_TYPE_SET, 0xe7e75e4c, 0x039c, 0x4410, 0x81, 0x5b, 0x87, 0x41, 0x30, 0x7b, 0x63, 0xaa);
EXTERN_GUID(MF_CAPTURE_ENGINE_ERROR, 0x46b89fc6, 0x33cc, 0x4399,0x9d, 0xad, 0x78, 0x4d, 0xe7, 0x7d, 0x58, 0x7c);
EXTERN_GUID(MF_CAPTURE_ENGINE_EFFECT_ADDED, 0xaa8dc7b5, 0xa048, 0x4e13, 0x8e, 0xbe, 0xf2, 0x3c, 0x46, 0xc8, 0x30, 0xc1);
EXTERN_GUID(MF_CAPTURE_ENGINE_EFFECT_REMOVED, 0xc6e8db07, 0xfb09, 0x4a48, 0x89, 0xc6, 0xbf, 0x92, 0xa0, 0x42, 0x22, 0xc9);
EXTERN_GUID(MF_CAPTURE_ENGINE_ALL_EFFECTS_REMOVED, 0xfded7521, 0x8ed8, 0x431a, 0xa9, 0x6b, 0xf3, 0xe2, 0x56, 0x5e, 0x98, 0x1c);
EXTERN_GUID(MF_CAPTURE_SINK_PREPARED, 0x7bfce257, 0x12b1, 0x4409, 0x8c, 0x34, 0xd4, 0x45, 0xda, 0xab, 0x75, 0x78);
EXTERN_GUID(MF_CAPTURE_ENGINE_OUTPUT_MEDIA_TYPE_SET, 0xcaaad994, 0x83ec, 0x45e9,0xa3, 0x0a, 0x1f, 0x20, 0xaa, 0xdb, 0x98, 0x31);
EXTERN_GUID(MF_CAPTURE_ENGINE_CAMERA_STREAM_BLOCKED, 0xa4209417, 0x8d39, 0x46f3, 0xb7, 0x59, 0x59, 0x12, 0x52, 0x8f, 0x42, 0x07);
EXTERN_GUID(MF_CAPTURE_ENGINE_CAMERA_STREAM_UNBLOCKED, 0x9be9eef0, 0xcdaf, 0x4717, 0x85, 0x64, 0x83, 0x4a, 0xae, 0x66, 0x41, 0x5c);
EXTERN_GUID(MF_CAPTURE_ENGINE_D3D_MANAGER, 0x76e25e7b, 0xd595, 0x4283, 0x96, 0x2c, 0xc5, 0x94, 0xaf, 0xd7, 0x8d, 0xdf);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_SINK_VIDEO_MAX_UNPROCESSED_SAMPLES, 0xb467f705, 0x7913, 0x4894, 0x9d, 0x42, 0xa2, 0x15, 0xfe, 0xa2, 0x3d, 0xa9);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_SINK_AUDIO_MAX_UNPROCESSED_SAMPLES, 0x1cddb141, 0xa7f4, 0x4d58, 0x98, 0x96, 0x4d, 0x15, 0xa5, 0x3c, 0x4e, 0xfe);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_SINK_VIDEO_MAX_PROCESSED_SAMPLES, 0xe7b4a49e, 0x382c, 0x4aef, 0xa9, 0x46, 0xae, 0xd5, 0x49, 0xb, 0x71, 0x11);
EXTERN_GUID(MF_CAPTURE_ENGINE_RECORD_SINK_AUDIO_MAX_PROCESSED_SAMPLES, 0x9896e12a, 0xf707, 0x4500, 0xb6, 0xbd, 0xdb, 0x8e, 0xb8, 0x10, 0xb5, 0xf);
EXTERN_GUID(MF_CAPTURE_ENGINE_USE_AUDIO_DEVICE_ONLY, 0x1c8077da, 0x8466, 0x4dc4, 0x8b, 0x8e, 0x27, 0x6b, 0x3f, 0x85, 0x92, 0x3b);
EXTERN_GUID(MF_CAPTURE_ENGINE_USE_VIDEO_DEVICE_ONLY, 0x7e025171, 0xcf32, 0x4f2e, 0x8f, 0x19, 0x41, 0x5, 0x77, 0xb7, 0x3a, 0x66);
EXTERN_GUID(MF_CAPTURE_ENGINE_DISABLE_HARDWARE_TRANSFORMS, 0xb7c42a6b, 0x3207,  0x4495, 0xb4, 0xe7, 0x81, 0xf9, 0xc3, 0x5d, 0x59, 0x91);
EXTERN_GUID(MF_CAPTURE_ENGINE_DISABLE_DXVA, 0xf9818862, 0x179d, 0x433f, 0xa3, 0x2f, 0x74, 0xcb, 0xcf, 0x74, 0x46, 0x6d);
EXTERN_GUID(MF_CAPTURE_ENGINE_MEDIASOURCE_CONFIG, 0xbc6989d2, 0x0fc1, 0x46e1, 0xa7, 0x4f, 0xef, 0xd3, 0x6b, 0xc7, 0x88, 0xde);
EXTERN_GUID(MF_CAPTURE_ENGINE_DECODER_MFT_FIELDOFUSE_UNLOCK_Attribute, 0x2b8ad2e8, 0x7acb, 0x4321, 0xa6, 0x06, 0x32, 0x5c, 0x42, 0x49, 0xf4, 0xfc);
EXTERN_GUID(MF_CAPTURE_ENGINE_ENCODER_MFT_FIELDOFUSE_UNLOCK_Attribute, 0x54c63a00, 0x78d5, 0x422f, 0xaa, 0x3e, 0x5e, 0x99, 0xac, 0x64, 0x92, 0x69);
EXTERN_GUID(MF_CAPTURE_ENGINE_ENABLE_CAMERA_STREAMSTATE_NOTIFICATION, 0x4c808e9d, 0xaaed, 0x4713, 0x90, 0xfb, 0xcb, 0x24, 0x06, 0x4a, 0xb8, 0xda);
EXTERN_GUID(MF_CAPTURE_ENGINE_MEDIA_CATEGORY, 0x8e3f5bd5, 0xdbbf, 0x42f0, 0x85, 0x42, 0xd0, 0x7a, 0x39, 0x71, 0x76, 0x2a);
EXTERN_GUID(MF_CAPTURE_ENGINE_AUDIO_PROCESSING, 0x10f1be5e, 0x7e11, 0x410b, 0x97, 0x3d, 0xf4, 0xb6, 0x10, 0x90, 0x0, 0xfe);
EXTERN_GUID(MF_CAPTURE_ENGINE_EVENT_GENERATOR_GUID, 0xabfa8ad5, 0xfc6d, 0x4911, 0x87, 0xe0, 0x96, 0x19, 0x45, 0xf8, 0xf7, 0xce);
EXTERN_GUID(MF_CAPTURE_ENGINE_EVENT_STREAM_INDEX, 0x82697f44, 0xb1cf, 0x42eb, 0x97, 0x53, 0xf8, 0x6d, 0x64, 0x9c, 0x88, 0x65);
EXTERN_GUID(MF_CAPTURE_ENGINE_SELECTEDCAMERAPROFILE, 0x03160b7e, 0x1c6f, 0x4db2, 0xad, 0x56, 0xa7, 0xc4, 0x30, 0xf8, 0x23, 0x92);
EXTERN_GUID(MF_CAPTURE_ENGINE_SELECTEDCAMERAPROFILE_INDEX, 0x3ce88613, 0x2214, 0x46c3, 0xb4, 0x17, 0x82, 0xf8, 0xa3, 0x13, 0xc9, 0xc3);
/*****************************************************************************
 * IMFCaptureEngineOnEventCallback interface
 */
#ifndef __IMFCaptureEngineOnEventCallback_INTERFACE_DEFINED__
#define __IMFCaptureEngineOnEventCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureEngineOnEventCallback, 0xaeda51c0, 0x9025, 0x4983, 0x90,0x12, 0xde,0x59,0x7b,0x88,0xb0,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aeda51c0-9025-4983-9012-de597b88b089")
IMFCaptureEngineOnEventCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnEvent(
        IMFMediaEvent *pEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureEngineOnEventCallback, 0xaeda51c0, 0x9025, 0x4983, 0x90,0x12, 0xde,0x59,0x7b,0x88,0xb0,0x89)
#endif
#else
typedef struct IMFCaptureEngineOnEventCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureEngineOnEventCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnEvent)(
        IMFCaptureEngineOnEventCallback *This,
        IMFMediaEvent *pEvent);

    END_INTERFACE
} IMFCaptureEngineOnEventCallbackVtbl;

interface IMFCaptureEngineOnEventCallback {
    CONST_VTBL IMFCaptureEngineOnEventCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureEngineOnEventCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureEngineOnEventCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureEngineOnEventCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureEngineOnEventCallback methods ***/
#define IMFCaptureEngineOnEventCallback_OnEvent(This,pEvent) (This)->lpVtbl->OnEvent(This,pEvent)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnEventCallback_QueryInterface(IMFCaptureEngineOnEventCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnEventCallback_AddRef(IMFCaptureEngineOnEventCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnEventCallback_Release(IMFCaptureEngineOnEventCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureEngineOnEventCallback methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnEventCallback_OnEvent(IMFCaptureEngineOnEventCallback* This,IMFMediaEvent *pEvent) {
    return This->lpVtbl->OnEvent(This,pEvent);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureEngineOnEventCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCaptureEngineOnSampleCallback interface
 */
#ifndef __IMFCaptureEngineOnSampleCallback_INTERFACE_DEFINED__
#define __IMFCaptureEngineOnSampleCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureEngineOnSampleCallback, 0x52150b82, 0xab39, 0x4467, 0x98,0x0f, 0xe4,0x8b,0xf0,0x82,0x2e,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("52150b82-ab39-4467-980f-e48bf0822ecd")
IMFCaptureEngineOnSampleCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnSample(
        IMFSample *pSample) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureEngineOnSampleCallback, 0x52150b82, 0xab39, 0x4467, 0x98,0x0f, 0xe4,0x8b,0xf0,0x82,0x2e,0xcd)
#endif
#else
typedef struct IMFCaptureEngineOnSampleCallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureEngineOnSampleCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSample)(
        IMFCaptureEngineOnSampleCallback *This,
        IMFSample *pSample);

    END_INTERFACE
} IMFCaptureEngineOnSampleCallbackVtbl;

interface IMFCaptureEngineOnSampleCallback {
    CONST_VTBL IMFCaptureEngineOnSampleCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureEngineOnSampleCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureEngineOnSampleCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureEngineOnSampleCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureEngineOnSampleCallback methods ***/
#define IMFCaptureEngineOnSampleCallback_OnSample(This,pSample) (This)->lpVtbl->OnSample(This,pSample)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnSampleCallback_QueryInterface(IMFCaptureEngineOnSampleCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnSampleCallback_AddRef(IMFCaptureEngineOnSampleCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnSampleCallback_Release(IMFCaptureEngineOnSampleCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureEngineOnSampleCallback methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnSampleCallback_OnSample(IMFCaptureEngineOnSampleCallback* This,IMFSample *pSample) {
    return This->lpVtbl->OnSample(This,pSample);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureEngineOnSampleCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCaptureSink interface
 */
#ifndef __IMFCaptureSink_INTERFACE_DEFINED__
#define __IMFCaptureSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureSink, 0x72d6135b, 0x35e9, 0x412c, 0xb9,0x26, 0xfd,0x52,0x65,0xf2,0xa8,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("72d6135b-35e9-412c-b926-fd5265f2a885")
IMFCaptureSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOutputMediaType(
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetService(
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStream(
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Prepare(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllStreams(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureSink, 0x72d6135b, 0x35e9, 0x412c, 0xb9,0x26, 0xfd,0x52,0x65,0xf2,0xa8,0x85)
#endif
#else
typedef struct IMFCaptureSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOutputMediaType)(
        IMFCaptureSink *This,
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCaptureSink *This,
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFCaptureSink *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Prepare)(
        IMFCaptureSink *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAllStreams)(
        IMFCaptureSink *This);

    END_INTERFACE
} IMFCaptureSinkVtbl;

interface IMFCaptureSink {
    CONST_VTBL IMFCaptureSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureSink_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSink methods ***/
#define IMFCaptureSink_GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType) (This)->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType)
#define IMFCaptureSink_GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown)
#define IMFCaptureSink_AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex) (This)->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex)
#define IMFCaptureSink_Prepare(This) (This)->lpVtbl->Prepare(This)
#define IMFCaptureSink_RemoveAllStreams(This) (This)->lpVtbl->RemoveAllStreams(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSink_QueryInterface(IMFCaptureSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureSink_AddRef(IMFCaptureSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureSink_Release(IMFCaptureSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSink methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSink_GetOutputMediaType(IMFCaptureSink* This,DWORD dwSinkStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureSink_GetService(IMFCaptureSink* This,DWORD dwSinkStreamIndex,REFGUID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureSink_AddStream(IMFCaptureSink* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pAttributes,DWORD *pdwSinkStreamIndex) {
    return This->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCaptureSink_Prepare(IMFCaptureSink* This) {
    return This->lpVtbl->Prepare(This);
}
static __WIDL_INLINE HRESULT IMFCaptureSink_RemoveAllStreams(IMFCaptureSink* This) {
    return This->lpVtbl->RemoveAllStreams(This);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCaptureRecordSink interface
 */
#ifndef __IMFCaptureRecordSink_INTERFACE_DEFINED__
#define __IMFCaptureRecordSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureRecordSink, 0x3323b55a, 0xf92a, 0x4fe2, 0x8e,0xdc, 0xe9,0xbf,0xc0,0x63,0x4d,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3323b55a-f92a-4fe2-8edc-e9bfc0634d77")
IMFCaptureRecordSink : public IMFCaptureSink
{
    virtual HRESULT STDMETHODCALLTYPE SetOutputByteStream(
        IMFByteStream *pByteStream,
        REFGUID guidContainerType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFileName(
        LPCWSTR fileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSampleCallback(
        DWORD dwStreamSinkIndex,
        IMFCaptureEngineOnSampleCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustomSink(
        IMFMediaSink *pMediaSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRotation(
        DWORD dwStreamIndex,
        DWORD *pdwRotationValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRotation(
        DWORD dwStreamIndex,
        DWORD dwRotationValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureRecordSink, 0x3323b55a, 0xf92a, 0x4fe2, 0x8e,0xdc, 0xe9,0xbf,0xc0,0x63,0x4d,0x77)
#endif
#else
typedef struct IMFCaptureRecordSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOutputMediaType)(
        IMFCaptureRecordSink *This,
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCaptureRecordSink *This,
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFCaptureRecordSink *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Prepare)(
        IMFCaptureRecordSink *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAllStreams)(
        IMFCaptureRecordSink *This);

    /*** IMFCaptureRecordSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SetOutputByteStream)(
        IMFCaptureRecordSink *This,
        IMFByteStream *pByteStream,
        REFGUID guidContainerType);

    HRESULT (STDMETHODCALLTYPE *SetOutputFileName)(
        IMFCaptureRecordSink *This,
        LPCWSTR fileName);

    HRESULT (STDMETHODCALLTYPE *SetSampleCallback)(
        IMFCaptureRecordSink *This,
        DWORD dwStreamSinkIndex,
        IMFCaptureEngineOnSampleCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *SetCustomSink)(
        IMFCaptureRecordSink *This,
        IMFMediaSink *pMediaSink);

    HRESULT (STDMETHODCALLTYPE *GetRotation)(
        IMFCaptureRecordSink *This,
        DWORD dwStreamIndex,
        DWORD *pdwRotationValue);

    HRESULT (STDMETHODCALLTYPE *SetRotation)(
        IMFCaptureRecordSink *This,
        DWORD dwStreamIndex,
        DWORD dwRotationValue);

    END_INTERFACE
} IMFCaptureRecordSinkVtbl;

interface IMFCaptureRecordSink {
    CONST_VTBL IMFCaptureRecordSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureRecordSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureRecordSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureRecordSink_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSink methods ***/
#define IMFCaptureRecordSink_GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType) (This)->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType)
#define IMFCaptureRecordSink_GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown)
#define IMFCaptureRecordSink_AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex) (This)->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex)
#define IMFCaptureRecordSink_Prepare(This) (This)->lpVtbl->Prepare(This)
#define IMFCaptureRecordSink_RemoveAllStreams(This) (This)->lpVtbl->RemoveAllStreams(This)
/*** IMFCaptureRecordSink methods ***/
#define IMFCaptureRecordSink_SetOutputByteStream(This,pByteStream,guidContainerType) (This)->lpVtbl->SetOutputByteStream(This,pByteStream,guidContainerType)
#define IMFCaptureRecordSink_SetOutputFileName(This,fileName) (This)->lpVtbl->SetOutputFileName(This,fileName)
#define IMFCaptureRecordSink_SetSampleCallback(This,dwStreamSinkIndex,pCallback) (This)->lpVtbl->SetSampleCallback(This,dwStreamSinkIndex,pCallback)
#define IMFCaptureRecordSink_SetCustomSink(This,pMediaSink) (This)->lpVtbl->SetCustomSink(This,pMediaSink)
#define IMFCaptureRecordSink_GetRotation(This,dwStreamIndex,pdwRotationValue) (This)->lpVtbl->GetRotation(This,dwStreamIndex,pdwRotationValue)
#define IMFCaptureRecordSink_SetRotation(This,dwStreamIndex,dwRotationValue) (This)->lpVtbl->SetRotation(This,dwStreamIndex,dwRotationValue)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_QueryInterface(IMFCaptureRecordSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureRecordSink_AddRef(IMFCaptureRecordSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureRecordSink_Release(IMFCaptureRecordSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSink methods ***/
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_GetOutputMediaType(IMFCaptureRecordSink* This,DWORD dwSinkStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_GetService(IMFCaptureRecordSink* This,DWORD dwSinkStreamIndex,REFGUID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_AddStream(IMFCaptureRecordSink* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pAttributes,DWORD *pdwSinkStreamIndex) {
    return This->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_Prepare(IMFCaptureRecordSink* This) {
    return This->lpVtbl->Prepare(This);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_RemoveAllStreams(IMFCaptureRecordSink* This) {
    return This->lpVtbl->RemoveAllStreams(This);
}
/*** IMFCaptureRecordSink methods ***/
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_SetOutputByteStream(IMFCaptureRecordSink* This,IMFByteStream *pByteStream,REFGUID guidContainerType) {
    return This->lpVtbl->SetOutputByteStream(This,pByteStream,guidContainerType);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_SetOutputFileName(IMFCaptureRecordSink* This,LPCWSTR fileName) {
    return This->lpVtbl->SetOutputFileName(This,fileName);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_SetSampleCallback(IMFCaptureRecordSink* This,DWORD dwStreamSinkIndex,IMFCaptureEngineOnSampleCallback *pCallback) {
    return This->lpVtbl->SetSampleCallback(This,dwStreamSinkIndex,pCallback);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_SetCustomSink(IMFCaptureRecordSink* This,IMFMediaSink *pMediaSink) {
    return This->lpVtbl->SetCustomSink(This,pMediaSink);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_GetRotation(IMFCaptureRecordSink* This,DWORD dwStreamIndex,DWORD *pdwRotationValue) {
    return This->lpVtbl->GetRotation(This,dwStreamIndex,pdwRotationValue);
}
static __WIDL_INLINE HRESULT IMFCaptureRecordSink_SetRotation(IMFCaptureRecordSink* This,DWORD dwStreamIndex,DWORD dwRotationValue) {
    return This->lpVtbl->SetRotation(This,dwStreamIndex,dwRotationValue);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureRecordSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCapturePreviewSink interface
 */
#ifndef __IMFCapturePreviewSink_INTERFACE_DEFINED__
#define __IMFCapturePreviewSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCapturePreviewSink, 0x77346cfd, 0x5b49, 0x4d73, 0xac,0xe0, 0x5b,0x52,0xa8,0x59,0xf2,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("77346cfd-5b49-4d73-ace0-5b52a859f2e0")
IMFCapturePreviewSink : public IMFCaptureSink
{
    virtual HRESULT STDMETHODCALLTYPE SetRenderHandle(
        HANDLE handle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRenderSurface(
        IUnknown *pSurface) = 0;

    virtual HRESULT STDMETHODCALLTYPE UpdateVideo(
        const MFVideoNormalizedRect *pSrc,
        const RECT *pDst,
        const COLORREF *pBorderClr) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSampleCallback(
        DWORD dwStreamSinkIndex,
        IMFCaptureEngineOnSampleCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMirrorState(
        WINBOOL *pfMirrorState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMirrorState(
        WINBOOL fMirrorState) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRotation(
        DWORD dwStreamIndex,
        DWORD *pdwRotationValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRotation(
        DWORD dwStreamIndex,
        DWORD dwRotationValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustomSink(
        IMFMediaSink *pMediaSink) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCapturePreviewSink, 0x77346cfd, 0x5b49, 0x4d73, 0xac,0xe0, 0x5b,0x52,0xa8,0x59,0xf2,0xe0)
#endif
#else
typedef struct IMFCapturePreviewSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOutputMediaType)(
        IMFCapturePreviewSink *This,
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCapturePreviewSink *This,
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFCapturePreviewSink *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Prepare)(
        IMFCapturePreviewSink *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAllStreams)(
        IMFCapturePreviewSink *This);

    /*** IMFCapturePreviewSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRenderHandle)(
        IMFCapturePreviewSink *This,
        HANDLE handle);

    HRESULT (STDMETHODCALLTYPE *SetRenderSurface)(
        IMFCapturePreviewSink *This,
        IUnknown *pSurface);

    HRESULT (STDMETHODCALLTYPE *UpdateVideo)(
        IMFCapturePreviewSink *This,
        const MFVideoNormalizedRect *pSrc,
        const RECT *pDst,
        const COLORREF *pBorderClr);

    HRESULT (STDMETHODCALLTYPE *SetSampleCallback)(
        IMFCapturePreviewSink *This,
        DWORD dwStreamSinkIndex,
        IMFCaptureEngineOnSampleCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *GetMirrorState)(
        IMFCapturePreviewSink *This,
        WINBOOL *pfMirrorState);

    HRESULT (STDMETHODCALLTYPE *SetMirrorState)(
        IMFCapturePreviewSink *This,
        WINBOOL fMirrorState);

    HRESULT (STDMETHODCALLTYPE *GetRotation)(
        IMFCapturePreviewSink *This,
        DWORD dwStreamIndex,
        DWORD *pdwRotationValue);

    HRESULT (STDMETHODCALLTYPE *SetRotation)(
        IMFCapturePreviewSink *This,
        DWORD dwStreamIndex,
        DWORD dwRotationValue);

    HRESULT (STDMETHODCALLTYPE *SetCustomSink)(
        IMFCapturePreviewSink *This,
        IMFMediaSink *pMediaSink);

    END_INTERFACE
} IMFCapturePreviewSinkVtbl;

interface IMFCapturePreviewSink {
    CONST_VTBL IMFCapturePreviewSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCapturePreviewSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCapturePreviewSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCapturePreviewSink_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSink methods ***/
#define IMFCapturePreviewSink_GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType) (This)->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType)
#define IMFCapturePreviewSink_GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown)
#define IMFCapturePreviewSink_AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex) (This)->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex)
#define IMFCapturePreviewSink_Prepare(This) (This)->lpVtbl->Prepare(This)
#define IMFCapturePreviewSink_RemoveAllStreams(This) (This)->lpVtbl->RemoveAllStreams(This)
/*** IMFCapturePreviewSink methods ***/
#define IMFCapturePreviewSink_SetRenderHandle(This,handle) (This)->lpVtbl->SetRenderHandle(This,handle)
#define IMFCapturePreviewSink_SetRenderSurface(This,pSurface) (This)->lpVtbl->SetRenderSurface(This,pSurface)
#define IMFCapturePreviewSink_UpdateVideo(This,pSrc,pDst,pBorderClr) (This)->lpVtbl->UpdateVideo(This,pSrc,pDst,pBorderClr)
#define IMFCapturePreviewSink_SetSampleCallback(This,dwStreamSinkIndex,pCallback) (This)->lpVtbl->SetSampleCallback(This,dwStreamSinkIndex,pCallback)
#define IMFCapturePreviewSink_GetMirrorState(This,pfMirrorState) (This)->lpVtbl->GetMirrorState(This,pfMirrorState)
#define IMFCapturePreviewSink_SetMirrorState(This,fMirrorState) (This)->lpVtbl->SetMirrorState(This,fMirrorState)
#define IMFCapturePreviewSink_GetRotation(This,dwStreamIndex,pdwRotationValue) (This)->lpVtbl->GetRotation(This,dwStreamIndex,pdwRotationValue)
#define IMFCapturePreviewSink_SetRotation(This,dwStreamIndex,dwRotationValue) (This)->lpVtbl->SetRotation(This,dwStreamIndex,dwRotationValue)
#define IMFCapturePreviewSink_SetCustomSink(This,pMediaSink) (This)->lpVtbl->SetCustomSink(This,pMediaSink)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_QueryInterface(IMFCapturePreviewSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCapturePreviewSink_AddRef(IMFCapturePreviewSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCapturePreviewSink_Release(IMFCapturePreviewSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSink methods ***/
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_GetOutputMediaType(IMFCapturePreviewSink* This,DWORD dwSinkStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_GetService(IMFCapturePreviewSink* This,DWORD dwSinkStreamIndex,REFGUID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_AddStream(IMFCapturePreviewSink* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pAttributes,DWORD *pdwSinkStreamIndex) {
    return This->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_Prepare(IMFCapturePreviewSink* This) {
    return This->lpVtbl->Prepare(This);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_RemoveAllStreams(IMFCapturePreviewSink* This) {
    return This->lpVtbl->RemoveAllStreams(This);
}
/*** IMFCapturePreviewSink methods ***/
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetRenderHandle(IMFCapturePreviewSink* This,HANDLE handle) {
    return This->lpVtbl->SetRenderHandle(This,handle);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetRenderSurface(IMFCapturePreviewSink* This,IUnknown *pSurface) {
    return This->lpVtbl->SetRenderSurface(This,pSurface);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_UpdateVideo(IMFCapturePreviewSink* This,const MFVideoNormalizedRect *pSrc,const RECT *pDst,const COLORREF *pBorderClr) {
    return This->lpVtbl->UpdateVideo(This,pSrc,pDst,pBorderClr);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetSampleCallback(IMFCapturePreviewSink* This,DWORD dwStreamSinkIndex,IMFCaptureEngineOnSampleCallback *pCallback) {
    return This->lpVtbl->SetSampleCallback(This,dwStreamSinkIndex,pCallback);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_GetMirrorState(IMFCapturePreviewSink* This,WINBOOL *pfMirrorState) {
    return This->lpVtbl->GetMirrorState(This,pfMirrorState);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetMirrorState(IMFCapturePreviewSink* This,WINBOOL fMirrorState) {
    return This->lpVtbl->SetMirrorState(This,fMirrorState);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_GetRotation(IMFCapturePreviewSink* This,DWORD dwStreamIndex,DWORD *pdwRotationValue) {
    return This->lpVtbl->GetRotation(This,dwStreamIndex,pdwRotationValue);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetRotation(IMFCapturePreviewSink* This,DWORD dwStreamIndex,DWORD dwRotationValue) {
    return This->lpVtbl->SetRotation(This,dwStreamIndex,dwRotationValue);
}
static __WIDL_INLINE HRESULT IMFCapturePreviewSink_SetCustomSink(IMFCapturePreviewSink* This,IMFMediaSink *pMediaSink) {
    return This->lpVtbl->SetCustomSink(This,pMediaSink);
}
#endif
#endif

#endif


#endif  /* __IMFCapturePreviewSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCapturePhotoSink interface
 */
#ifndef __IMFCapturePhotoSink_INTERFACE_DEFINED__
#define __IMFCapturePhotoSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCapturePhotoSink, 0xd2d43cc8, 0x48bb, 0x4aa7, 0x95,0xdb, 0x10,0xc0,0x69,0x77,0xe7,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2d43cc8-48bb-4aa7-95db-10c06977e777")
IMFCapturePhotoSink : public IMFCaptureSink
{
    virtual HRESULT STDMETHODCALLTYPE SetOutputFileName(
        LPCWSTR fileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSampleCallback(
        IMFCaptureEngineOnSampleCallback *pCallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputByteStream(
        IMFByteStream *pByteStream) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCapturePhotoSink, 0xd2d43cc8, 0x48bb, 0x4aa7, 0x95,0xdb, 0x10,0xc0,0x69,0x77,0xe7,0x77)
#endif
#else
typedef struct IMFCapturePhotoSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOutputMediaType)(
        IMFCapturePhotoSink *This,
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCapturePhotoSink *This,
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFCapturePhotoSink *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Prepare)(
        IMFCapturePhotoSink *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAllStreams)(
        IMFCapturePhotoSink *This);

    /*** IMFCapturePhotoSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SetOutputFileName)(
        IMFCapturePhotoSink *This,
        LPCWSTR fileName);

    HRESULT (STDMETHODCALLTYPE *SetSampleCallback)(
        IMFCapturePhotoSink *This,
        IMFCaptureEngineOnSampleCallback *pCallback);

    HRESULT (STDMETHODCALLTYPE *SetOutputByteStream)(
        IMFCapturePhotoSink *This,
        IMFByteStream *pByteStream);

    END_INTERFACE
} IMFCapturePhotoSinkVtbl;

interface IMFCapturePhotoSink {
    CONST_VTBL IMFCapturePhotoSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCapturePhotoSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCapturePhotoSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCapturePhotoSink_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSink methods ***/
#define IMFCapturePhotoSink_GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType) (This)->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType)
#define IMFCapturePhotoSink_GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown)
#define IMFCapturePhotoSink_AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex) (This)->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex)
#define IMFCapturePhotoSink_Prepare(This) (This)->lpVtbl->Prepare(This)
#define IMFCapturePhotoSink_RemoveAllStreams(This) (This)->lpVtbl->RemoveAllStreams(This)
/*** IMFCapturePhotoSink methods ***/
#define IMFCapturePhotoSink_SetOutputFileName(This,fileName) (This)->lpVtbl->SetOutputFileName(This,fileName)
#define IMFCapturePhotoSink_SetSampleCallback(This,pCallback) (This)->lpVtbl->SetSampleCallback(This,pCallback)
#define IMFCapturePhotoSink_SetOutputByteStream(This,pByteStream) (This)->lpVtbl->SetOutputByteStream(This,pByteStream)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_QueryInterface(IMFCapturePhotoSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCapturePhotoSink_AddRef(IMFCapturePhotoSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCapturePhotoSink_Release(IMFCapturePhotoSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSink methods ***/
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_GetOutputMediaType(IMFCapturePhotoSink* This,DWORD dwSinkStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_GetService(IMFCapturePhotoSink* This,DWORD dwSinkStreamIndex,REFGUID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_AddStream(IMFCapturePhotoSink* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pAttributes,DWORD *pdwSinkStreamIndex) {
    return This->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_Prepare(IMFCapturePhotoSink* This) {
    return This->lpVtbl->Prepare(This);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_RemoveAllStreams(IMFCapturePhotoSink* This) {
    return This->lpVtbl->RemoveAllStreams(This);
}
/*** IMFCapturePhotoSink methods ***/
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_SetOutputFileName(IMFCapturePhotoSink* This,LPCWSTR fileName) {
    return This->lpVtbl->SetOutputFileName(This,fileName);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_SetSampleCallback(IMFCapturePhotoSink* This,IMFCaptureEngineOnSampleCallback *pCallback) {
    return This->lpVtbl->SetSampleCallback(This,pCallback);
}
static __WIDL_INLINE HRESULT IMFCapturePhotoSink_SetOutputByteStream(IMFCapturePhotoSink* This,IMFByteStream *pByteStream) {
    return This->lpVtbl->SetOutputByteStream(This,pByteStream);
}
#endif
#endif

#endif


#endif  /* __IMFCapturePhotoSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCaptureSource interface
 */
#ifndef __IMFCaptureSource_INTERFACE_DEFINED__
#define __IMFCaptureSource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureSource, 0x439a42a8, 0x0d2c, 0x4505, 0xbe,0x83, 0xf7,0x9b,0x2a,0x05,0xd5,0xc4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("439a42a8-0d2c-4505-be83-f79b2a05d5c4")
IMFCaptureSource : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCaptureDeviceSource(
        MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,
        IMFMediaSource **ppMediaSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCaptureDeviceActivate(
        MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,
        IMFActivate **ppActivate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetService(
        REFIID rguidService,
        REFIID riid,
        IUnknown **ppUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEffect(
        DWORD dwSourceStreamIndex,
        IUnknown *pUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveEffect(
        DWORD dwSourceStreamIndex,
        IUnknown *pUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllEffects(
        DWORD dwSourceStreamIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAvailableDeviceMediaType(
        DWORD dwSourceStreamIndex,
        DWORD dwMediaTypeIndex,
        IMFMediaType **ppMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentDeviceMediaType(
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentDeviceMediaType(
        DWORD dwSourceStreamIndex,
        IMFMediaType **ppMediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceStreamCount(
        DWORD *pdwStreamCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceStreamCategory(
        DWORD dwSourceStreamIndex,
        MF_CAPTURE_ENGINE_STREAM_CATEGORY *pStreamCategory) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMirrorState(
        DWORD dwStreamIndex,
        WINBOOL *pfMirrorState) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMirrorState(
        DWORD dwStreamIndex,
        WINBOOL fMirrorState) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamIndexFromFriendlyName(
        UINT32 uifriendlyName,
        DWORD *pdwActualStreamIndex) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureSource, 0x439a42a8, 0x0d2c, 0x4505, 0xbe,0x83, 0xf7,0x9b,0x2a,0x05,0xd5,0xc4)
#endif
#else
typedef struct IMFCaptureSourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCaptureDeviceSource)(
        IMFCaptureSource *This,
        MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,
        IMFMediaSource **ppMediaSource);

    HRESULT (STDMETHODCALLTYPE *GetCaptureDeviceActivate)(
        IMFCaptureSource *This,
        MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,
        IMFActivate **ppActivate);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCaptureSource *This,
        REFIID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddEffect)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        IUnknown *pUnknown);

    HRESULT (STDMETHODCALLTYPE *RemoveEffect)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        IUnknown *pUnknown);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEffects)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex);

    HRESULT (STDMETHODCALLTYPE *GetAvailableDeviceMediaType)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        DWORD dwMediaTypeIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *SetCurrentDeviceMediaType)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType);

    HRESULT (STDMETHODCALLTYPE *GetCurrentDeviceMediaType)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetDeviceStreamCount)(
        IMFCaptureSource *This,
        DWORD *pdwStreamCount);

    HRESULT (STDMETHODCALLTYPE *GetDeviceStreamCategory)(
        IMFCaptureSource *This,
        DWORD dwSourceStreamIndex,
        MF_CAPTURE_ENGINE_STREAM_CATEGORY *pStreamCategory);

    HRESULT (STDMETHODCALLTYPE *GetMirrorState)(
        IMFCaptureSource *This,
        DWORD dwStreamIndex,
        WINBOOL *pfMirrorState);

    HRESULT (STDMETHODCALLTYPE *SetMirrorState)(
        IMFCaptureSource *This,
        DWORD dwStreamIndex,
        WINBOOL fMirrorState);

    HRESULT (STDMETHODCALLTYPE *GetStreamIndexFromFriendlyName)(
        IMFCaptureSource *This,
        UINT32 uifriendlyName,
        DWORD *pdwActualStreamIndex);

    END_INTERFACE
} IMFCaptureSourceVtbl;

interface IMFCaptureSource {
    CONST_VTBL IMFCaptureSourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureSource_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSource methods ***/
#define IMFCaptureSource_GetCaptureDeviceSource(This,mfCaptureEngineDeviceType,ppMediaSource) (This)->lpVtbl->GetCaptureDeviceSource(This,mfCaptureEngineDeviceType,ppMediaSource)
#define IMFCaptureSource_GetCaptureDeviceActivate(This,mfCaptureEngineDeviceType,ppActivate) (This)->lpVtbl->GetCaptureDeviceActivate(This,mfCaptureEngineDeviceType,ppActivate)
#define IMFCaptureSource_GetService(This,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,rguidService,riid,ppUnknown)
#define IMFCaptureSource_AddEffect(This,dwSourceStreamIndex,pUnknown) (This)->lpVtbl->AddEffect(This,dwSourceStreamIndex,pUnknown)
#define IMFCaptureSource_RemoveEffect(This,dwSourceStreamIndex,pUnknown) (This)->lpVtbl->RemoveEffect(This,dwSourceStreamIndex,pUnknown)
#define IMFCaptureSource_RemoveAllEffects(This,dwSourceStreamIndex) (This)->lpVtbl->RemoveAllEffects(This,dwSourceStreamIndex)
#define IMFCaptureSource_GetAvailableDeviceMediaType(This,dwSourceStreamIndex,dwMediaTypeIndex,ppMediaType) (This)->lpVtbl->GetAvailableDeviceMediaType(This,dwSourceStreamIndex,dwMediaTypeIndex,ppMediaType)
#define IMFCaptureSource_SetCurrentDeviceMediaType(This,dwSourceStreamIndex,pMediaType) (This)->lpVtbl->SetCurrentDeviceMediaType(This,dwSourceStreamIndex,pMediaType)
#define IMFCaptureSource_GetCurrentDeviceMediaType(This,dwSourceStreamIndex,ppMediaType) (This)->lpVtbl->GetCurrentDeviceMediaType(This,dwSourceStreamIndex,ppMediaType)
#define IMFCaptureSource_GetDeviceStreamCount(This,pdwStreamCount) (This)->lpVtbl->GetDeviceStreamCount(This,pdwStreamCount)
#define IMFCaptureSource_GetDeviceStreamCategory(This,dwSourceStreamIndex,pStreamCategory) (This)->lpVtbl->GetDeviceStreamCategory(This,dwSourceStreamIndex,pStreamCategory)
#define IMFCaptureSource_GetMirrorState(This,dwStreamIndex,pfMirrorState) (This)->lpVtbl->GetMirrorState(This,dwStreamIndex,pfMirrorState)
#define IMFCaptureSource_SetMirrorState(This,dwStreamIndex,fMirrorState) (This)->lpVtbl->SetMirrorState(This,dwStreamIndex,fMirrorState)
#define IMFCaptureSource_GetStreamIndexFromFriendlyName(This,uifriendlyName,pdwActualStreamIndex) (This)->lpVtbl->GetStreamIndexFromFriendlyName(This,uifriendlyName,pdwActualStreamIndex)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSource_QueryInterface(IMFCaptureSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureSource_AddRef(IMFCaptureSource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureSource_Release(IMFCaptureSource* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSource methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSource_GetCaptureDeviceSource(IMFCaptureSource* This,MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,IMFMediaSource **ppMediaSource) {
    return This->lpVtbl->GetCaptureDeviceSource(This,mfCaptureEngineDeviceType,ppMediaSource);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetCaptureDeviceActivate(IMFCaptureSource* This,MF_CAPTURE_ENGINE_DEVICE_TYPE mfCaptureEngineDeviceType,IMFActivate **ppActivate) {
    return This->lpVtbl->GetCaptureDeviceActivate(This,mfCaptureEngineDeviceType,ppActivate);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetService(IMFCaptureSource* This,REFIID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_AddEffect(IMFCaptureSource* This,DWORD dwSourceStreamIndex,IUnknown *pUnknown) {
    return This->lpVtbl->AddEffect(This,dwSourceStreamIndex,pUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_RemoveEffect(IMFCaptureSource* This,DWORD dwSourceStreamIndex,IUnknown *pUnknown) {
    return This->lpVtbl->RemoveEffect(This,dwSourceStreamIndex,pUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_RemoveAllEffects(IMFCaptureSource* This,DWORD dwSourceStreamIndex) {
    return This->lpVtbl->RemoveAllEffects(This,dwSourceStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetAvailableDeviceMediaType(IMFCaptureSource* This,DWORD dwSourceStreamIndex,DWORD dwMediaTypeIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetAvailableDeviceMediaType(This,dwSourceStreamIndex,dwMediaTypeIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_SetCurrentDeviceMediaType(IMFCaptureSource* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType) {
    return This->lpVtbl->SetCurrentDeviceMediaType(This,dwSourceStreamIndex,pMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetCurrentDeviceMediaType(IMFCaptureSource* This,DWORD dwSourceStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetCurrentDeviceMediaType(This,dwSourceStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetDeviceStreamCount(IMFCaptureSource* This,DWORD *pdwStreamCount) {
    return This->lpVtbl->GetDeviceStreamCount(This,pdwStreamCount);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetDeviceStreamCategory(IMFCaptureSource* This,DWORD dwSourceStreamIndex,MF_CAPTURE_ENGINE_STREAM_CATEGORY *pStreamCategory) {
    return This->lpVtbl->GetDeviceStreamCategory(This,dwSourceStreamIndex,pStreamCategory);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetMirrorState(IMFCaptureSource* This,DWORD dwStreamIndex,WINBOOL *pfMirrorState) {
    return This->lpVtbl->GetMirrorState(This,dwStreamIndex,pfMirrorState);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_SetMirrorState(IMFCaptureSource* This,DWORD dwStreamIndex,WINBOOL fMirrorState) {
    return This->lpVtbl->SetMirrorState(This,dwStreamIndex,fMirrorState);
}
static __WIDL_INLINE HRESULT IMFCaptureSource_GetStreamIndexFromFriendlyName(IMFCaptureSource* This,UINT32 uifriendlyName,DWORD *pdwActualStreamIndex) {
    return This->lpVtbl->GetStreamIndexFromFriendlyName(This,uifriendlyName,pdwActualStreamIndex);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureSource_INTERFACE_DEFINED__ */

EXTERN_GUID(CLSID_MFCaptureEngine, 0xefce38d3, 0x8914, 0x4674,0xa7, 0xdf, 0xae, 0x1b, 0x3d, 0x65, 0x4b, 0x8a);
/*****************************************************************************
 * IMFCaptureEngine interface
 */
#ifndef __IMFCaptureEngine_INTERFACE_DEFINED__
#define __IMFCaptureEngine_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureEngine, 0xa6bba433, 0x176b, 0x48b2, 0xb3,0x75, 0x53,0xaa,0x03,0x47,0x32,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a6bba433-176b-48b2-b375-53aa03473207")
IMFCaptureEngine : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IMFCaptureEngineOnEventCallback *pEventCallback,
        IMFAttributes *pAttributes,
        IUnknown *pAudioSource,
        IUnknown *pVideoSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartPreview(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopPreview(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartRecord(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopRecord(
        WINBOOL bFinalize,
        WINBOOL bFlushUnprocessedSamples) = 0;

    virtual HRESULT STDMETHODCALLTYPE TakePhoto(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSink(
        MF_CAPTURE_ENGINE_SINK_TYPE mfCaptureEngineSinkType,
        IMFCaptureSink **ppSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSource(
        IMFCaptureSource **ppSource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureEngine, 0xa6bba433, 0x176b, 0x48b2, 0xb3,0x75, 0x53,0xaa,0x03,0x47,0x32,0x07)
#endif
#else
typedef struct IMFCaptureEngineVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureEngine methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IMFCaptureEngine *This,
        IMFCaptureEngineOnEventCallback *pEventCallback,
        IMFAttributes *pAttributes,
        IUnknown *pAudioSource,
        IUnknown *pVideoSource);

    HRESULT (STDMETHODCALLTYPE *StartPreview)(
        IMFCaptureEngine *This);

    HRESULT (STDMETHODCALLTYPE *StopPreview)(
        IMFCaptureEngine *This);

    HRESULT (STDMETHODCALLTYPE *StartRecord)(
        IMFCaptureEngine *This);

    HRESULT (STDMETHODCALLTYPE *StopRecord)(
        IMFCaptureEngine *This,
        WINBOOL bFinalize,
        WINBOOL bFlushUnprocessedSamples);

    HRESULT (STDMETHODCALLTYPE *TakePhoto)(
        IMFCaptureEngine *This);

    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IMFCaptureEngine *This,
        MF_CAPTURE_ENGINE_SINK_TYPE mfCaptureEngineSinkType,
        IMFCaptureSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *GetSource)(
        IMFCaptureEngine *This,
        IMFCaptureSource **ppSource);

    END_INTERFACE
} IMFCaptureEngineVtbl;

interface IMFCaptureEngine {
    CONST_VTBL IMFCaptureEngineVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureEngine_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureEngine_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureEngine_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureEngine methods ***/
#define IMFCaptureEngine_Initialize(This,pEventCallback,pAttributes,pAudioSource,pVideoSource) (This)->lpVtbl->Initialize(This,pEventCallback,pAttributes,pAudioSource,pVideoSource)
#define IMFCaptureEngine_StartPreview(This) (This)->lpVtbl->StartPreview(This)
#define IMFCaptureEngine_StopPreview(This) (This)->lpVtbl->StopPreview(This)
#define IMFCaptureEngine_StartRecord(This) (This)->lpVtbl->StartRecord(This)
#define IMFCaptureEngine_StopRecord(This,bFinalize,bFlushUnprocessedSamples) (This)->lpVtbl->StopRecord(This,bFinalize,bFlushUnprocessedSamples)
#define IMFCaptureEngine_TakePhoto(This) (This)->lpVtbl->TakePhoto(This)
#define IMFCaptureEngine_GetSink(This,mfCaptureEngineSinkType,ppSink) (This)->lpVtbl->GetSink(This,mfCaptureEngineSinkType,ppSink)
#define IMFCaptureEngine_GetSource(This,ppSource) (This)->lpVtbl->GetSource(This,ppSource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngine_QueryInterface(IMFCaptureEngine* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureEngine_AddRef(IMFCaptureEngine* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureEngine_Release(IMFCaptureEngine* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureEngine methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngine_Initialize(IMFCaptureEngine* This,IMFCaptureEngineOnEventCallback *pEventCallback,IMFAttributes *pAttributes,IUnknown *pAudioSource,IUnknown *pVideoSource) {
    return This->lpVtbl->Initialize(This,pEventCallback,pAttributes,pAudioSource,pVideoSource);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_StartPreview(IMFCaptureEngine* This) {
    return This->lpVtbl->StartPreview(This);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_StopPreview(IMFCaptureEngine* This) {
    return This->lpVtbl->StopPreview(This);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_StartRecord(IMFCaptureEngine* This) {
    return This->lpVtbl->StartRecord(This);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_StopRecord(IMFCaptureEngine* This,WINBOOL bFinalize,WINBOOL bFlushUnprocessedSamples) {
    return This->lpVtbl->StopRecord(This,bFinalize,bFlushUnprocessedSamples);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_TakePhoto(IMFCaptureEngine* This) {
    return This->lpVtbl->TakePhoto(This);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_GetSink(IMFCaptureEngine* This,MF_CAPTURE_ENGINE_SINK_TYPE mfCaptureEngineSinkType,IMFCaptureSink **ppSink) {
    return This->lpVtbl->GetSink(This,mfCaptureEngineSinkType,ppSink);
}
static __WIDL_INLINE HRESULT IMFCaptureEngine_GetSource(IMFCaptureEngine* This,IMFCaptureSource **ppSource) {
    return This->lpVtbl->GetSource(This,ppSource);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureEngine_INTERFACE_DEFINED__ */

EXTERN_GUID(CLSID_MFCaptureEngineClassFactory, 0xefce38d3, 0x8914, 0x4674,0xa7, 0xdf, 0xae, 0x1b, 0x3d, 0x65, 0x4b, 0x8a);
/*****************************************************************************
 * IMFCaptureEngineClassFactory interface
 */
#ifndef __IMFCaptureEngineClassFactory_INTERFACE_DEFINED__
#define __IMFCaptureEngineClassFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureEngineClassFactory, 0x8f02d140, 0x56fc, 0x4302, 0xa7,0x05, 0x3a,0x97,0xc7,0x8b,0xe7,0x79);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8f02d140-56fc-4302-a705-3a97c78be779")
IMFCaptureEngineClassFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
        REFCLSID clsid,
        REFIID riid,
        LPVOID *ppvObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureEngineClassFactory, 0x8f02d140, 0x56fc, 0x4302, 0xa7,0x05, 0x3a,0x97,0xc7,0x8b,0xe7,0x79)
#endif
#else
typedef struct IMFCaptureEngineClassFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureEngineClassFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        IMFCaptureEngineClassFactory *This,
        REFCLSID clsid,
        REFIID riid,
        LPVOID *ppvObject);

    END_INTERFACE
} IMFCaptureEngineClassFactoryVtbl;

interface IMFCaptureEngineClassFactory {
    CONST_VTBL IMFCaptureEngineClassFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureEngineClassFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureEngineClassFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureEngineClassFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureEngineClassFactory methods ***/
#define IMFCaptureEngineClassFactory_CreateInstance(This,clsid,riid,ppvObject) (This)->lpVtbl->CreateInstance(This,clsid,riid,ppvObject)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineClassFactory_QueryInterface(IMFCaptureEngineClassFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureEngineClassFactory_AddRef(IMFCaptureEngineClassFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureEngineClassFactory_Release(IMFCaptureEngineClassFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureEngineClassFactory methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineClassFactory_CreateInstance(IMFCaptureEngineClassFactory* This,REFCLSID clsid,REFIID riid,LPVOID *ppvObject) {
    return This->lpVtbl->CreateInstance(This,clsid,riid,ppvObject);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureEngineClassFactory_INTERFACE_DEFINED__ */

EXTERN_GUID(MFSampleExtension_DeviceReferenceSystemTime, 0x6523775a, 0xba2d, 0x405f,0xb2, 0xc5, 0x01, 0xff, 0x88, 0xe2, 0xe8, 0xf6);
/*****************************************************************************
 * IMFCaptureEngineOnSampleCallback2 interface
 */
#ifndef __IMFCaptureEngineOnSampleCallback2_INTERFACE_DEFINED__
#define __IMFCaptureEngineOnSampleCallback2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureEngineOnSampleCallback2, 0xe37ceed7, 0x340f, 0x4514, 0x9f,0x4d, 0x9c,0x2a,0xe0,0x26,0x10,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e37ceed7-340f-4514-9f4d-9c2ae026100b")
IMFCaptureEngineOnSampleCallback2 : public IMFCaptureEngineOnSampleCallback
{
    virtual HRESULT STDMETHODCALLTYPE OnSynchronizedEvent(
        IMFMediaEvent *pEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureEngineOnSampleCallback2, 0xe37ceed7, 0x340f, 0x4514, 0x9f,0x4d, 0x9c,0x2a,0xe0,0x26,0x10,0x0b)
#endif
#else
typedef struct IMFCaptureEngineOnSampleCallback2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureEngineOnSampleCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSample)(
        IMFCaptureEngineOnSampleCallback2 *This,
        IMFSample *pSample);

    /*** IMFCaptureEngineOnSampleCallback2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnSynchronizedEvent)(
        IMFCaptureEngineOnSampleCallback2 *This,
        IMFMediaEvent *pEvent);

    END_INTERFACE
} IMFCaptureEngineOnSampleCallback2Vtbl;

interface IMFCaptureEngineOnSampleCallback2 {
    CONST_VTBL IMFCaptureEngineOnSampleCallback2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureEngineOnSampleCallback2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureEngineOnSampleCallback2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureEngineOnSampleCallback2_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureEngineOnSampleCallback methods ***/
#define IMFCaptureEngineOnSampleCallback2_OnSample(This,pSample) (This)->lpVtbl->OnSample(This,pSample)
/*** IMFCaptureEngineOnSampleCallback2 methods ***/
#define IMFCaptureEngineOnSampleCallback2_OnSynchronizedEvent(This,pEvent) (This)->lpVtbl->OnSynchronizedEvent(This,pEvent)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnSampleCallback2_QueryInterface(IMFCaptureEngineOnSampleCallback2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnSampleCallback2_AddRef(IMFCaptureEngineOnSampleCallback2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureEngineOnSampleCallback2_Release(IMFCaptureEngineOnSampleCallback2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureEngineOnSampleCallback methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnSampleCallback2_OnSample(IMFCaptureEngineOnSampleCallback2* This,IMFSample *pSample) {
    return This->lpVtbl->OnSample(This,pSample);
}
/*** IMFCaptureEngineOnSampleCallback2 methods ***/
static __WIDL_INLINE HRESULT IMFCaptureEngineOnSampleCallback2_OnSynchronizedEvent(IMFCaptureEngineOnSampleCallback2* This,IMFMediaEvent *pEvent) {
    return This->lpVtbl->OnSynchronizedEvent(This,pEvent);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureEngineOnSampleCallback2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMFCaptureSink2 interface
 */
#ifndef __IMFCaptureSink2_INTERFACE_DEFINED__
#define __IMFCaptureSink2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMFCaptureSink2, 0xf9e4219e, 0x6197, 0x4b5e, 0xb8,0x88, 0xbe,0xe3,0x10,0xab,0x2c,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f9e4219e-6197-4b5e-b888-bee310ab2c59")
IMFCaptureSink2 : public IMFCaptureSink
{
    virtual HRESULT STDMETHODCALLTYPE SetOutputMediaType(
        DWORD dwStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pEncodingAttributes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMFCaptureSink2, 0xf9e4219e, 0x6197, 0x4b5e, 0xb8,0x88, 0xbe,0xe3,0x10,0xab,0x2c,0x59)
#endif
#else
typedef struct IMFCaptureSink2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMFCaptureSink methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOutputMediaType)(
        IMFCaptureSink2 *This,
        DWORD dwSinkStreamIndex,
        IMFMediaType **ppMediaType);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IMFCaptureSink2 *This,
        DWORD dwSinkStreamIndex,
        REFGUID rguidService,
        REFIID riid,
        IUnknown **ppUnknown);

    HRESULT (STDMETHODCALLTYPE *AddStream)(
        IMFCaptureSink2 *This,
        DWORD dwSourceStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pAttributes,
        DWORD *pdwSinkStreamIndex);

    HRESULT (STDMETHODCALLTYPE *Prepare)(
        IMFCaptureSink2 *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAllStreams)(
        IMFCaptureSink2 *This);

    /*** IMFCaptureSink2 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetOutputMediaType)(
        IMFCaptureSink2 *This,
        DWORD dwStreamIndex,
        IMFMediaType *pMediaType,
        IMFAttributes *pEncodingAttributes);

    END_INTERFACE
} IMFCaptureSink2Vtbl;

interface IMFCaptureSink2 {
    CONST_VTBL IMFCaptureSink2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMFCaptureSink2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMFCaptureSink2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMFCaptureSink2_Release(This) (This)->lpVtbl->Release(This)
/*** IMFCaptureSink methods ***/
#define IMFCaptureSink2_GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType) (This)->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType)
#define IMFCaptureSink2_GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown) (This)->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown)
#define IMFCaptureSink2_AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex) (This)->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex)
#define IMFCaptureSink2_Prepare(This) (This)->lpVtbl->Prepare(This)
#define IMFCaptureSink2_RemoveAllStreams(This) (This)->lpVtbl->RemoveAllStreams(This)
/*** IMFCaptureSink2 methods ***/
#define IMFCaptureSink2_SetOutputMediaType(This,dwStreamIndex,pMediaType,pEncodingAttributes) (This)->lpVtbl->SetOutputMediaType(This,dwStreamIndex,pMediaType,pEncodingAttributes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSink2_QueryInterface(IMFCaptureSink2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMFCaptureSink2_AddRef(IMFCaptureSink2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMFCaptureSink2_Release(IMFCaptureSink2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMFCaptureSink methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSink2_GetOutputMediaType(IMFCaptureSink2* This,DWORD dwSinkStreamIndex,IMFMediaType **ppMediaType) {
    return This->lpVtbl->GetOutputMediaType(This,dwSinkStreamIndex,ppMediaType);
}
static __WIDL_INLINE HRESULT IMFCaptureSink2_GetService(IMFCaptureSink2* This,DWORD dwSinkStreamIndex,REFGUID rguidService,REFIID riid,IUnknown **ppUnknown) {
    return This->lpVtbl->GetService(This,dwSinkStreamIndex,rguidService,riid,ppUnknown);
}
static __WIDL_INLINE HRESULT IMFCaptureSink2_AddStream(IMFCaptureSink2* This,DWORD dwSourceStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pAttributes,DWORD *pdwSinkStreamIndex) {
    return This->lpVtbl->AddStream(This,dwSourceStreamIndex,pMediaType,pAttributes,pdwSinkStreamIndex);
}
static __WIDL_INLINE HRESULT IMFCaptureSink2_Prepare(IMFCaptureSink2* This) {
    return This->lpVtbl->Prepare(This);
}
static __WIDL_INLINE HRESULT IMFCaptureSink2_RemoveAllStreams(IMFCaptureSink2* This) {
    return This->lpVtbl->RemoveAllStreams(This);
}
/*** IMFCaptureSink2 methods ***/
static __WIDL_INLINE HRESULT IMFCaptureSink2_SetOutputMediaType(IMFCaptureSink2* This,DWORD dwStreamIndex,IMFMediaType *pMediaType,IMFAttributes *pEncodingAttributes) {
    return This->lpVtbl->SetOutputMediaType(This,dwStreamIndex,pMediaType,pEncodingAttributes);
}
#endif
#endif

#endif


#endif  /* __IMFCaptureSink2_INTERFACE_DEFINED__ */

#endif /* WINAPI_PARTITION_DESKTOP */
#endif /* WINVER >= _WIN32_WINNT_WIN7 */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __mfcaptureengine_h__ */
