/*** Autogenerated by WIDL 3.20 from direct-x/include/qedit.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

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

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

#ifndef __qedit_h__
#define __qedit_h__

/* Forward declarations */

#ifndef __ISampleGrabberCB_FWD_DEFINED__
#define __ISampleGrabberCB_FWD_DEFINED__
typedef interface ISampleGrabberCB ISampleGrabberCB;
#ifdef __cplusplus
interface ISampleGrabberCB;
#endif /* __cplusplus */
#endif

#ifndef __ISampleGrabber_FWD_DEFINED__
#define __ISampleGrabber_FWD_DEFINED__
typedef interface ISampleGrabber ISampleGrabber;
#ifdef __cplusplus
interface ISampleGrabber;
#endif /* __cplusplus */
#endif

#ifndef __IMediaDet_FWD_DEFINED__
#define __IMediaDet_FWD_DEFINED__
typedef interface IMediaDet IMediaDet;
#ifdef __cplusplus
interface IMediaDet;
#endif /* __cplusplus */
#endif

#ifndef __MediaDet_FWD_DEFINED__
#define __MediaDet_FWD_DEFINED__
#ifdef __cplusplus
typedef class MediaDet MediaDet;
#else
typedef struct MediaDet MediaDet;
#endif /* defined __cplusplus */
#endif /* defined __MediaDet_FWD_DEFINED__ */

#ifndef __IMediaLocator_FWD_DEFINED__
#define __IMediaLocator_FWD_DEFINED__
typedef interface IMediaLocator IMediaLocator;
#ifdef __cplusplus
interface IMediaLocator;
#endif /* __cplusplus */
#endif

#ifndef __IPropertySetter_FWD_DEFINED__
#define __IPropertySetter_FWD_DEFINED__
typedef interface IPropertySetter IPropertySetter;
#ifdef __cplusplus
interface IPropertySetter;
#endif /* __cplusplus */
#endif

#ifndef __IAMErrorLog_FWD_DEFINED__
#define __IAMErrorLog_FWD_DEFINED__
typedef interface IAMErrorLog IAMErrorLog;
#ifdef __cplusplus
interface IAMErrorLog;
#endif /* __cplusplus */
#endif

#ifndef __IAMSetErrorLog_FWD_DEFINED__
#define __IAMSetErrorLog_FWD_DEFINED__
typedef interface IAMSetErrorLog IAMSetErrorLog;
#ifdef __cplusplus
interface IAMSetErrorLog;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimeline_FWD_DEFINED__
#define __IAMTimeline_FWD_DEFINED__
typedef interface IAMTimeline IAMTimeline;
#ifdef __cplusplus
interface IAMTimeline;
#endif /* __cplusplus */
#endif

#ifndef __AMTimeline_FWD_DEFINED__
#define __AMTimeline_FWD_DEFINED__
#ifdef __cplusplus
typedef class AMTimeline AMTimeline;
#else
typedef struct AMTimeline AMTimeline;
#endif /* defined __cplusplus */
#endif /* defined __AMTimeline_FWD_DEFINED__ */

#ifndef __IAMTimelineGroup_FWD_DEFINED__
#define __IAMTimelineGroup_FWD_DEFINED__
typedef interface IAMTimelineGroup IAMTimelineGroup;
#ifdef __cplusplus
interface IAMTimelineGroup;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimelineObj_FWD_DEFINED__
#define __IAMTimelineObj_FWD_DEFINED__
typedef interface IAMTimelineObj IAMTimelineObj;
#ifdef __cplusplus
interface IAMTimelineObj;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimelineSrc_FWD_DEFINED__
#define __IAMTimelineSrc_FWD_DEFINED__
typedef interface IAMTimelineSrc IAMTimelineSrc;
#ifdef __cplusplus
interface IAMTimelineSrc;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <amstream.h>
#include <msxml.h>

#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************
 * ISampleGrabberCB interface
 */
#ifndef __ISampleGrabberCB_INTERFACE_DEFINED__
#define __ISampleGrabberCB_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISampleGrabberCB, 0x0579154a, 0x2b53, 0x4994, 0xb0,0xd0, 0xe7,0x73,0x14,0x8e,0xff,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0579154a-2b53-4994-b0d0-e773148eff85")
ISampleGrabberCB : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SampleCB(
        double SampleTime,
        IMediaSample *pSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE BufferCB(
        double SampleTime,
        BYTE *pBuffer,
        LONG BufferLen) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISampleGrabberCB, 0x0579154a, 0x2b53, 0x4994, 0xb0,0xd0, 0xe7,0x73,0x14,0x8e,0xff,0x85)
#endif
#else
typedef struct ISampleGrabberCBVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISampleGrabberCB methods ***/
    HRESULT (STDMETHODCALLTYPE *SampleCB)(
        ISampleGrabberCB *This,
        double SampleTime,
        IMediaSample *pSample);

    HRESULT (STDMETHODCALLTYPE *BufferCB)(
        ISampleGrabberCB *This,
        double SampleTime,
        BYTE *pBuffer,
        LONG BufferLen);

    END_INTERFACE
} ISampleGrabberCBVtbl;

interface ISampleGrabberCB {
    CONST_VTBL ISampleGrabberCBVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISampleGrabberCB_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISampleGrabberCB_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISampleGrabberCB_Release(This) (This)->lpVtbl->Release(This)
/*** ISampleGrabberCB methods ***/
#define ISampleGrabberCB_SampleCB(This,SampleTime,pSample) (This)->lpVtbl->SampleCB(This,SampleTime,pSample)
#define ISampleGrabberCB_BufferCB(This,SampleTime,pBuffer,BufferLen) (This)->lpVtbl->BufferCB(This,SampleTime,pBuffer,BufferLen)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISampleGrabberCB_QueryInterface(ISampleGrabberCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISampleGrabberCB_AddRef(ISampleGrabberCB* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISampleGrabberCB_Release(ISampleGrabberCB* This) {
    return This->lpVtbl->Release(This);
}
/*** ISampleGrabberCB methods ***/
static FORCEINLINE HRESULT ISampleGrabberCB_SampleCB(ISampleGrabberCB* This,double SampleTime,IMediaSample *pSample) {
    return This->lpVtbl->SampleCB(This,SampleTime,pSample);
}
static FORCEINLINE HRESULT ISampleGrabberCB_BufferCB(ISampleGrabberCB* This,double SampleTime,BYTE *pBuffer,LONG BufferLen) {
    return This->lpVtbl->BufferCB(This,SampleTime,pBuffer,BufferLen);
}
#endif
#endif

#endif


#endif  /* __ISampleGrabberCB_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISampleGrabber interface
 */
#ifndef __ISampleGrabber_INTERFACE_DEFINED__
#define __ISampleGrabber_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92,0xad, 0x02,0x66,0xb5,0xd7,0xc7,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6b652fff-11fe-4fce-92ad-0266b5d7c78f")
ISampleGrabber : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetOneShot(
        WINBOOL OneShot) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        const AM_MEDIA_TYPE *pType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType(
        AM_MEDIA_TYPE *pType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBufferSamples(
        WINBOOL BufferThem) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(
        LONG *pBufferSize,
        LONG *pBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSample(
        IMediaSample **ppSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCallback(
        ISampleGrabberCB *pCallback,
        LONG WhichMethodToCallback) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92,0xad, 0x02,0x66,0xb5,0xd7,0xc7,0x8f)
#endif
#else
typedef struct ISampleGrabberVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISampleGrabber methods ***/
    HRESULT (STDMETHODCALLTYPE *SetOneShot)(
        ISampleGrabber *This,
        WINBOOL OneShot);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        ISampleGrabber *This,
        const AM_MEDIA_TYPE *pType);

    HRESULT (STDMETHODCALLTYPE *GetConnectedMediaType)(
        ISampleGrabber *This,
        AM_MEDIA_TYPE *pType);

    HRESULT (STDMETHODCALLTYPE *SetBufferSamples)(
        ISampleGrabber *This,
        WINBOOL BufferThem);

    HRESULT (STDMETHODCALLTYPE *GetCurrentBuffer)(
        ISampleGrabber *This,
        LONG *pBufferSize,
        LONG *pBuffer);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSample)(
        ISampleGrabber *This,
        IMediaSample **ppSample);

    HRESULT (STDMETHODCALLTYPE *SetCallback)(
        ISampleGrabber *This,
        ISampleGrabberCB *pCallback,
        LONG WhichMethodToCallback);

    END_INTERFACE
} ISampleGrabberVtbl;

interface ISampleGrabber {
    CONST_VTBL ISampleGrabberVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISampleGrabber_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISampleGrabber_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISampleGrabber_Release(This) (This)->lpVtbl->Release(This)
/*** ISampleGrabber methods ***/
#define ISampleGrabber_SetOneShot(This,OneShot) (This)->lpVtbl->SetOneShot(This,OneShot)
#define ISampleGrabber_SetMediaType(This,pType) (This)->lpVtbl->SetMediaType(This,pType)
#define ISampleGrabber_GetConnectedMediaType(This,pType) (This)->lpVtbl->GetConnectedMediaType(This,pType)
#define ISampleGrabber_SetBufferSamples(This,BufferThem) (This)->lpVtbl->SetBufferSamples(This,BufferThem)
#define ISampleGrabber_GetCurrentBuffer(This,pBufferSize,pBuffer) (This)->lpVtbl->GetCurrentBuffer(This,pBufferSize,pBuffer)
#define ISampleGrabber_GetCurrentSample(This,ppSample) (This)->lpVtbl->GetCurrentSample(This,ppSample)
#define ISampleGrabber_SetCallback(This,pCallback,WhichMethodToCallback) (This)->lpVtbl->SetCallback(This,pCallback,WhichMethodToCallback)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISampleGrabber_QueryInterface(ISampleGrabber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISampleGrabber_AddRef(ISampleGrabber* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISampleGrabber_Release(ISampleGrabber* This) {
    return This->lpVtbl->Release(This);
}
/*** ISampleGrabber methods ***/
static FORCEINLINE HRESULT ISampleGrabber_SetOneShot(ISampleGrabber* This,WINBOOL OneShot) {
    return This->lpVtbl->SetOneShot(This,OneShot);
}
static FORCEINLINE HRESULT ISampleGrabber_SetMediaType(ISampleGrabber* This,const AM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
static FORCEINLINE HRESULT ISampleGrabber_GetConnectedMediaType(ISampleGrabber* This,AM_MEDIA_TYPE *pType) {
    return This->lpVtbl->GetConnectedMediaType(This,pType);
}
static FORCEINLINE HRESULT ISampleGrabber_SetBufferSamples(ISampleGrabber* This,WINBOOL BufferThem) {
    return This->lpVtbl->SetBufferSamples(This,BufferThem);
}
static FORCEINLINE HRESULT ISampleGrabber_GetCurrentBuffer(ISampleGrabber* This,LONG *pBufferSize,LONG *pBuffer) {
    return This->lpVtbl->GetCurrentBuffer(This,pBufferSize,pBuffer);
}
static FORCEINLINE HRESULT ISampleGrabber_GetCurrentSample(ISampleGrabber* This,IMediaSample **ppSample) {
    return This->lpVtbl->GetCurrentSample(This,ppSample);
}
static FORCEINLINE HRESULT ISampleGrabber_SetCallback(ISampleGrabber* This,ISampleGrabberCB *pCallback,LONG WhichMethodToCallback) {
    return This->lpVtbl->SetCallback(This,pCallback,WhichMethodToCallback);
}
#endif
#endif

#endif


#endif  /* __ISampleGrabber_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMediaDet interface
 */
#ifndef __IMediaDet_INTERFACE_DEFINED__
#define __IMediaDet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMediaDet, 0x65bd0710, 0x24d2, 0x4ff7, 0x93,0x24, 0xed,0x2e,0x5d,0x3a,0xba,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("65bd0710-24d2-4ff7-9324-ed2e5d3abafa")
IMediaDet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Filter(
        IUnknown **pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Filter(
        IUnknown *newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OutputStreams(
        LONG *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentStream(
        LONG *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CurrentStream(
        LONG newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StreamType(
        GUID *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StreamTypeB(
        BSTR *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StreamLength(
        double *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Filename(
        BSTR *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Filename(
        BSTR newVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBitmapBits(
        double StreamTime,
        LONG *pBufferSize,
        char *pBuffer,
        LONG Width,
        LONG Height) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteBitmapBits(
        double StreamTime,
        LONG Width,
        LONG Height,
        BSTR Filename) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StreamMediaType(
        AM_MEDIA_TYPE *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSampleGrabber(
        ISampleGrabber **ppVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FrameRate(
        double *pVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnterBitmapGrabMode(
        double SeekTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMediaDet, 0x65bd0710, 0x24d2, 0x4ff7, 0x93,0x24, 0xed,0x2e,0x5d,0x3a,0xba,0xfa)
#endif
#else
typedef struct IMediaDetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMediaDet methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Filter)(
        IMediaDet *This,
        IUnknown **pVal);

    HRESULT (STDMETHODCALLTYPE *put_Filter)(
        IMediaDet *This,
        IUnknown *newVal);

    HRESULT (STDMETHODCALLTYPE *get_OutputStreams)(
        IMediaDet *This,
        LONG *pVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentStream)(
        IMediaDet *This,
        LONG *pVal);

    HRESULT (STDMETHODCALLTYPE *put_CurrentStream)(
        IMediaDet *This,
        LONG newVal);

    HRESULT (STDMETHODCALLTYPE *get_StreamType)(
        IMediaDet *This,
        GUID *pVal);

    HRESULT (STDMETHODCALLTYPE *get_StreamTypeB)(
        IMediaDet *This,
        BSTR *pVal);

    HRESULT (STDMETHODCALLTYPE *get_StreamLength)(
        IMediaDet *This,
        double *pVal);

    HRESULT (STDMETHODCALLTYPE *get_Filename)(
        IMediaDet *This,
        BSTR *pVal);

    HRESULT (STDMETHODCALLTYPE *put_Filename)(
        IMediaDet *This,
        BSTR newVal);

    HRESULT (STDMETHODCALLTYPE *GetBitmapBits)(
        IMediaDet *This,
        double StreamTime,
        LONG *pBufferSize,
        char *pBuffer,
        LONG Width,
        LONG Height);

    HRESULT (STDMETHODCALLTYPE *WriteBitmapBits)(
        IMediaDet *This,
        double StreamTime,
        LONG Width,
        LONG Height,
        BSTR Filename);

    HRESULT (STDMETHODCALLTYPE *get_StreamMediaType)(
        IMediaDet *This,
        AM_MEDIA_TYPE *pVal);

    HRESULT (STDMETHODCALLTYPE *GetSampleGrabber)(
        IMediaDet *This,
        ISampleGrabber **ppVal);

    HRESULT (STDMETHODCALLTYPE *get_FrameRate)(
        IMediaDet *This,
        double *pVal);

    HRESULT (STDMETHODCALLTYPE *EnterBitmapGrabMode)(
        IMediaDet *This,
        double SeekTime);

    END_INTERFACE
} IMediaDetVtbl;

interface IMediaDet {
    CONST_VTBL IMediaDetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMediaDet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMediaDet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMediaDet_Release(This) (This)->lpVtbl->Release(This)
/*** IMediaDet methods ***/
#define IMediaDet_get_Filter(This,pVal) (This)->lpVtbl->get_Filter(This,pVal)
#define IMediaDet_put_Filter(This,newVal) (This)->lpVtbl->put_Filter(This,newVal)
#define IMediaDet_get_OutputStreams(This,pVal) (This)->lpVtbl->get_OutputStreams(This,pVal)
#define IMediaDet_get_CurrentStream(This,pVal) (This)->lpVtbl->get_CurrentStream(This,pVal)
#define IMediaDet_put_CurrentStream(This,newVal) (This)->lpVtbl->put_CurrentStream(This,newVal)
#define IMediaDet_get_StreamType(This,pVal) (This)->lpVtbl->get_StreamType(This,pVal)
#define IMediaDet_get_StreamTypeB(This,pVal) (This)->lpVtbl->get_StreamTypeB(This,pVal)
#define IMediaDet_get_StreamLength(This,pVal) (This)->lpVtbl->get_StreamLength(This,pVal)
#define IMediaDet_get_Filename(This,pVal) (This)->lpVtbl->get_Filename(This,pVal)
#define IMediaDet_put_Filename(This,newVal) (This)->lpVtbl->put_Filename(This,newVal)
#define IMediaDet_GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height) (This)->lpVtbl->GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height)
#define IMediaDet_WriteBitmapBits(This,StreamTime,Width,Height,Filename) (This)->lpVtbl->WriteBitmapBits(This,StreamTime,Width,Height,Filename)
#define IMediaDet_get_StreamMediaType(This,pVal) (This)->lpVtbl->get_StreamMediaType(This,pVal)
#define IMediaDet_GetSampleGrabber(This,ppVal) (This)->lpVtbl->GetSampleGrabber(This,ppVal)
#define IMediaDet_get_FrameRate(This,pVal) (This)->lpVtbl->get_FrameRate(This,pVal)
#define IMediaDet_EnterBitmapGrabMode(This,SeekTime) (This)->lpVtbl->EnterBitmapGrabMode(This,SeekTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMediaDet_QueryInterface(IMediaDet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMediaDet_AddRef(IMediaDet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMediaDet_Release(IMediaDet* This) {
    return This->lpVtbl->Release(This);
}
/*** IMediaDet methods ***/
static FORCEINLINE HRESULT IMediaDet_get_Filter(IMediaDet* This,IUnknown **pVal) {
    return This->lpVtbl->get_Filter(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_put_Filter(IMediaDet* This,IUnknown *newVal) {
    return This->lpVtbl->put_Filter(This,newVal);
}
static FORCEINLINE HRESULT IMediaDet_get_OutputStreams(IMediaDet* This,LONG *pVal) {
    return This->lpVtbl->get_OutputStreams(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_get_CurrentStream(IMediaDet* This,LONG *pVal) {
    return This->lpVtbl->get_CurrentStream(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_put_CurrentStream(IMediaDet* This,LONG newVal) {
    return This->lpVtbl->put_CurrentStream(This,newVal);
}
static FORCEINLINE HRESULT IMediaDet_get_StreamType(IMediaDet* This,GUID *pVal) {
    return This->lpVtbl->get_StreamType(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_get_StreamTypeB(IMediaDet* This,BSTR *pVal) {
    return This->lpVtbl->get_StreamTypeB(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_get_StreamLength(IMediaDet* This,double *pVal) {
    return This->lpVtbl->get_StreamLength(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_get_Filename(IMediaDet* This,BSTR *pVal) {
    return This->lpVtbl->get_Filename(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_put_Filename(IMediaDet* This,BSTR newVal) {
    return This->lpVtbl->put_Filename(This,newVal);
}
static FORCEINLINE HRESULT IMediaDet_GetBitmapBits(IMediaDet* This,double StreamTime,LONG *pBufferSize,char *pBuffer,LONG Width,LONG Height) {
    return This->lpVtbl->GetBitmapBits(This,StreamTime,pBufferSize,pBuffer,Width,Height);
}
static FORCEINLINE HRESULT IMediaDet_WriteBitmapBits(IMediaDet* This,double StreamTime,LONG Width,LONG Height,BSTR Filename) {
    return This->lpVtbl->WriteBitmapBits(This,StreamTime,Width,Height,Filename);
}
static FORCEINLINE HRESULT IMediaDet_get_StreamMediaType(IMediaDet* This,AM_MEDIA_TYPE *pVal) {
    return This->lpVtbl->get_StreamMediaType(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_GetSampleGrabber(IMediaDet* This,ISampleGrabber **ppVal) {
    return This->lpVtbl->GetSampleGrabber(This,ppVal);
}
static FORCEINLINE HRESULT IMediaDet_get_FrameRate(IMediaDet* This,double *pVal) {
    return This->lpVtbl->get_FrameRate(This,pVal);
}
static FORCEINLINE HRESULT IMediaDet_EnterBitmapGrabMode(IMediaDet* This,double SeekTime) {
    return This->lpVtbl->EnterBitmapGrabMode(This,SeekTime);
}
#endif
#endif

#endif


#endif  /* __IMediaDet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * MediaDet coclass
 */

DEFINE_GUID(CLSID_MediaDet, 0x65bd0711, 0x24d2, 0x4ff7, 0x93,0x24, 0xed,0x2e,0x5d,0x3a,0xba,0xfa);

#ifdef __cplusplus
class DECLSPEC_UUID("65bd0711-24d2-4ff7-9324-ed2e5d3abafa") MediaDet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MediaDet, 0x65bd0711, 0x24d2, 0x4ff7, 0x93,0x24, 0xed,0x2e,0x5d,0x3a,0xba,0xfa)
#endif
#endif

/*****************************************************************************
 * IMediaLocator interface
 */
#ifndef __IMediaLocator_INTERFACE_DEFINED__
#define __IMediaLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMediaLocator, 0x288581e0, 0x66ce, 0x11d2, 0x91,0x8f, 0x00,0xc0,0xdf,0x10,0xd4,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("288581e0-66ce-11d2-918f-00c0df10d434")
IMediaLocator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindMediaFile(
        BSTR input,
        BSTR filter,
        BSTR *output,
        LONG flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFoundLocation(
        BSTR dir) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMediaLocator, 0x288581e0, 0x66ce, 0x11d2, 0x91,0x8f, 0x00,0xc0,0xdf,0x10,0xd4,0x34)
#endif
#else
typedef struct IMediaLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMediaLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *FindMediaFile)(
        IMediaLocator *This,
        BSTR input,
        BSTR filter,
        BSTR *output,
        LONG flags);

    HRESULT (STDMETHODCALLTYPE *AddFoundLocation)(
        IMediaLocator *This,
        BSTR dir);

    END_INTERFACE
} IMediaLocatorVtbl;

interface IMediaLocator {
    CONST_VTBL IMediaLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMediaLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMediaLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMediaLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IMediaLocator methods ***/
#define IMediaLocator_FindMediaFile(This,input,filter,output,flags) (This)->lpVtbl->FindMediaFile(This,input,filter,output,flags)
#define IMediaLocator_AddFoundLocation(This,dir) (This)->lpVtbl->AddFoundLocation(This,dir)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMediaLocator_QueryInterface(IMediaLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMediaLocator_AddRef(IMediaLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMediaLocator_Release(IMediaLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IMediaLocator methods ***/
static FORCEINLINE HRESULT IMediaLocator_FindMediaFile(IMediaLocator* This,BSTR input,BSTR filter,BSTR *output,LONG flags) {
    return This->lpVtbl->FindMediaFile(This,input,filter,output,flags);
}
static FORCEINLINE HRESULT IMediaLocator_AddFoundLocation(IMediaLocator* This,BSTR dir) {
    return This->lpVtbl->AddFoundLocation(This,dir);
}
#endif
#endif

#endif


#endif  /* __IMediaLocator_INTERFACE_DEFINED__ */

typedef struct __WIDL_qedit_generated_name_0000001E {
    BSTR name;
    DISPID dispID;
    LONG nValues;
} DEXTER_PARAM;
typedef struct __WIDL_qedit_generated_name_0000001F {
    VARIANT v;
    REFERENCE_TIME rt;
    DWORD dwInterp;
} DEXTER_VALUE;
/*****************************************************************************
 * IPropertySetter interface
 */
#ifndef __IPropertySetter_INTERFACE_DEFINED__
#define __IPropertySetter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPropertySetter, 0xae9472bd, 0xb0c3, 0x11d2, 0x8d,0x24, 0x00,0xa0,0xc9,0x44,0x1e,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae9472bd-b0c3-11d2-8d24-00a0c9441e20")
IPropertySetter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LoadXML(
        IUnknown *pxml) = 0;

    virtual HRESULT STDMETHODCALLTYPE PrintXML(
        char *xml,
        int size,
        int *printed,
        int indent) = 0;

    virtual HRESULT STDMETHODCALLTYPE CloneProps(
        IPropertySetter **setter,
        REFERENCE_TIME start,
        REFERENCE_TIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddProp(
        DEXTER_PARAM param,
        DEXTER_VALUE *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProps(
        LONG *params,
        DEXTER_PARAM **param,
        DEXTER_VALUE **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE FreeProps(
        LONG params,
        DEXTER_PARAM *param,
        DEXTER_VALUE *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearProps(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SaveToBlob(
        LONG *size,
        BYTE **blob) = 0;

    virtual HRESULT STDMETHODCALLTYPE LoadFromBlob(
        LONG size,
        BYTE *blob) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProps(
        IUnknown *target,
        REFERENCE_TIME now) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPropertySetter, 0xae9472bd, 0xb0c3, 0x11d2, 0x8d,0x24, 0x00,0xa0,0xc9,0x44,0x1e,0x20)
#endif
#else
typedef struct IPropertySetterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPropertySetter methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadXML)(
        IPropertySetter *This,
        IUnknown *pxml);

    HRESULT (STDMETHODCALLTYPE *PrintXML)(
        IPropertySetter *This,
        char *xml,
        int size,
        int *printed,
        int indent);

    HRESULT (STDMETHODCALLTYPE *CloneProps)(
        IPropertySetter *This,
        IPropertySetter **setter,
        REFERENCE_TIME start,
        REFERENCE_TIME stop);

    HRESULT (STDMETHODCALLTYPE *AddProp)(
        IPropertySetter *This,
        DEXTER_PARAM param,
        DEXTER_VALUE *value);

    HRESULT (STDMETHODCALLTYPE *GetProps)(
        IPropertySetter *This,
        LONG *params,
        DEXTER_PARAM **param,
        DEXTER_VALUE **value);

    HRESULT (STDMETHODCALLTYPE *FreeProps)(
        IPropertySetter *This,
        LONG params,
        DEXTER_PARAM *param,
        DEXTER_VALUE *value);

    HRESULT (STDMETHODCALLTYPE *ClearProps)(
        IPropertySetter *This);

    HRESULT (STDMETHODCALLTYPE *SaveToBlob)(
        IPropertySetter *This,
        LONG *size,
        BYTE **blob);

    HRESULT (STDMETHODCALLTYPE *LoadFromBlob)(
        IPropertySetter *This,
        LONG size,
        BYTE *blob);

    HRESULT (STDMETHODCALLTYPE *SetProps)(
        IPropertySetter *This,
        IUnknown *target,
        REFERENCE_TIME now);

    END_INTERFACE
} IPropertySetterVtbl;

interface IPropertySetter {
    CONST_VTBL IPropertySetterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPropertySetter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPropertySetter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPropertySetter_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertySetter methods ***/
#define IPropertySetter_LoadXML(This,pxml) (This)->lpVtbl->LoadXML(This,pxml)
#define IPropertySetter_PrintXML(This,xml,size,printed,indent) (This)->lpVtbl->PrintXML(This,xml,size,printed,indent)
#define IPropertySetter_CloneProps(This,setter,start,stop) (This)->lpVtbl->CloneProps(This,setter,start,stop)
#define IPropertySetter_AddProp(This,param,value) (This)->lpVtbl->AddProp(This,param,value)
#define IPropertySetter_GetProps(This,params,param,value) (This)->lpVtbl->GetProps(This,params,param,value)
#define IPropertySetter_FreeProps(This,params,param,value) (This)->lpVtbl->FreeProps(This,params,param,value)
#define IPropertySetter_ClearProps(This) (This)->lpVtbl->ClearProps(This)
#define IPropertySetter_SaveToBlob(This,size,blob) (This)->lpVtbl->SaveToBlob(This,size,blob)
#define IPropertySetter_LoadFromBlob(This,size,blob) (This)->lpVtbl->LoadFromBlob(This,size,blob)
#define IPropertySetter_SetProps(This,target,now) (This)->lpVtbl->SetProps(This,target,now)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPropertySetter_QueryInterface(IPropertySetter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPropertySetter_AddRef(IPropertySetter* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPropertySetter_Release(IPropertySetter* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertySetter methods ***/
static FORCEINLINE HRESULT IPropertySetter_LoadXML(IPropertySetter* This,IUnknown *pxml) {
    return This->lpVtbl->LoadXML(This,pxml);
}
static FORCEINLINE HRESULT IPropertySetter_PrintXML(IPropertySetter* This,char *xml,int size,int *printed,int indent) {
    return This->lpVtbl->PrintXML(This,xml,size,printed,indent);
}
static FORCEINLINE HRESULT IPropertySetter_CloneProps(IPropertySetter* This,IPropertySetter **setter,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->CloneProps(This,setter,start,stop);
}
static FORCEINLINE HRESULT IPropertySetter_AddProp(IPropertySetter* This,DEXTER_PARAM param,DEXTER_VALUE *value) {
    return This->lpVtbl->AddProp(This,param,value);
}
static FORCEINLINE HRESULT IPropertySetter_GetProps(IPropertySetter* This,LONG *params,DEXTER_PARAM **param,DEXTER_VALUE **value) {
    return This->lpVtbl->GetProps(This,params,param,value);
}
static FORCEINLINE HRESULT IPropertySetter_FreeProps(IPropertySetter* This,LONG params,DEXTER_PARAM *param,DEXTER_VALUE *value) {
    return This->lpVtbl->FreeProps(This,params,param,value);
}
static FORCEINLINE HRESULT IPropertySetter_ClearProps(IPropertySetter* This) {
    return This->lpVtbl->ClearProps(This);
}
static FORCEINLINE HRESULT IPropertySetter_SaveToBlob(IPropertySetter* This,LONG *size,BYTE **blob) {
    return This->lpVtbl->SaveToBlob(This,size,blob);
}
static FORCEINLINE HRESULT IPropertySetter_LoadFromBlob(IPropertySetter* This,LONG size,BYTE *blob) {
    return This->lpVtbl->LoadFromBlob(This,size,blob);
}
static FORCEINLINE HRESULT IPropertySetter_SetProps(IPropertySetter* This,IUnknown *target,REFERENCE_TIME now) {
    return This->lpVtbl->SetProps(This,target,now);
}
#endif
#endif

#endif


#endif  /* __IPropertySetter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMErrorLog interface
 */
#ifndef __IAMErrorLog_INTERFACE_DEFINED__
#define __IAMErrorLog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMErrorLog, 0xe43e73a2, 0x0efa, 0x11d3, 0x96,0x01, 0x00,0xa0,0xc9,0x44,0x1e,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e43e73a2-0efa-11d3-9601-00a0c9441e20")
IAMErrorLog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE LogError(
        LONG severity,
        BSTR error_str,
        LONG error_code,
        LONG hresult,
        VARIANT *extra) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMErrorLog, 0xe43e73a2, 0x0efa, 0x11d3, 0x96,0x01, 0x00,0xa0,0xc9,0x44,0x1e,0x20)
#endif
#else
typedef struct IAMErrorLogVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMErrorLog methods ***/
    HRESULT (STDMETHODCALLTYPE *LogError)(
        IAMErrorLog *This,
        LONG severity,
        BSTR error_str,
        LONG error_code,
        LONG hresult,
        VARIANT *extra);

    END_INTERFACE
} IAMErrorLogVtbl;

interface IAMErrorLog {
    CONST_VTBL IAMErrorLogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMErrorLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMErrorLog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMErrorLog_Release(This) (This)->lpVtbl->Release(This)
/*** IAMErrorLog methods ***/
#define IAMErrorLog_LogError(This,severity,error_str,error_code,hresult,extra) (This)->lpVtbl->LogError(This,severity,error_str,error_code,hresult,extra)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMErrorLog_QueryInterface(IAMErrorLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMErrorLog_AddRef(IAMErrorLog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMErrorLog_Release(IAMErrorLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMErrorLog methods ***/
static FORCEINLINE HRESULT IAMErrorLog_LogError(IAMErrorLog* This,LONG severity,BSTR error_str,LONG error_code,LONG hresult,VARIANT *extra) {
    return This->lpVtbl->LogError(This,severity,error_str,error_code,hresult,extra);
}
#endif
#endif

#endif


#endif  /* __IAMErrorLog_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMSetErrorLog interface
 */
#ifndef __IAMSetErrorLog_INTERFACE_DEFINED__
#define __IAMSetErrorLog_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMSetErrorLog, 0x963566da, 0xbe21, 0x4eaf, 0x88,0xe9, 0x35,0x70,0x4f,0x8f,0x52,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("963566da-be21-4eaf-88e9-35704f8f52a1")
IAMSetErrorLog : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_ErrorLog(
        IAMErrorLog **log) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ErrorLog(
        IAMErrorLog *log) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMSetErrorLog, 0x963566da, 0xbe21, 0x4eaf, 0x88,0xe9, 0x35,0x70,0x4f,0x8f,0x52,0xa1)
#endif
#else
typedef struct IAMSetErrorLogVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMSetErrorLog methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ErrorLog)(
        IAMSetErrorLog *This,
        IAMErrorLog **log);

    HRESULT (STDMETHODCALLTYPE *put_ErrorLog)(
        IAMSetErrorLog *This,
        IAMErrorLog *log);

    END_INTERFACE
} IAMSetErrorLogVtbl;

interface IAMSetErrorLog {
    CONST_VTBL IAMSetErrorLogVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMSetErrorLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMSetErrorLog_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMSetErrorLog_Release(This) (This)->lpVtbl->Release(This)
/*** IAMSetErrorLog methods ***/
#define IAMSetErrorLog_get_ErrorLog(This,log) (This)->lpVtbl->get_ErrorLog(This,log)
#define IAMSetErrorLog_put_ErrorLog(This,log) (This)->lpVtbl->put_ErrorLog(This,log)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMSetErrorLog_QueryInterface(IAMSetErrorLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMSetErrorLog_AddRef(IAMSetErrorLog* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMSetErrorLog_Release(IAMSetErrorLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMSetErrorLog methods ***/
static FORCEINLINE HRESULT IAMSetErrorLog_get_ErrorLog(IAMSetErrorLog* This,IAMErrorLog **log) {
    return This->lpVtbl->get_ErrorLog(This,log);
}
static FORCEINLINE HRESULT IAMSetErrorLog_put_ErrorLog(IAMSetErrorLog* This,IAMErrorLog *log) {
    return This->lpVtbl->put_ErrorLog(This,log);
}
#endif
#endif

#endif


#endif  /* __IAMSetErrorLog_INTERFACE_DEFINED__ */

#ifndef __IAMTimeline_FWD_DEFINED__
#define __IAMTimeline_FWD_DEFINED__
typedef interface IAMTimeline IAMTimeline;
#ifdef __cplusplus
interface IAMTimeline;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimelineGroup_FWD_DEFINED__
#define __IAMTimelineGroup_FWD_DEFINED__
typedef interface IAMTimelineGroup IAMTimelineGroup;
#ifdef __cplusplus
interface IAMTimelineGroup;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimelineObj_FWD_DEFINED__
#define __IAMTimelineObj_FWD_DEFINED__
typedef interface IAMTimelineObj IAMTimelineObj;
#ifdef __cplusplus
interface IAMTimelineObj;
#endif /* __cplusplus */
#endif

#ifndef __IAMTimelineSrc_FWD_DEFINED__
#define __IAMTimelineSrc_FWD_DEFINED__
typedef interface IAMTimelineSrc IAMTimelineSrc;
#ifdef __cplusplus
interface IAMTimelineSrc;
#endif /* __cplusplus */
#endif

typedef enum __WIDL_qedit_generated_name_00000020 {
    TIMELINE_MAJOR_TYPE_COMPOSITE = 1,
    TIMELINE_MAJOR_TYPE_TRACK = 2,
    TIMELINE_MAJOR_TYPE_SOURCE = 4,
    TIMELINE_MAJOR_TYPE_TRANSITION = 8,
    TIMELINE_MAJOR_TYPE_EFFECT = 16,
    TIMELINE_MAJOR_TYPE_GROUP = 128
} TIMELINE_MAJOR_TYPE;
/*****************************************************************************
 * IAMTimeline interface
 */
#ifndef __IAMTimeline_INTERFACE_DEFINED__
#define __IAMTimeline_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMTimeline, 0x78530b74, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("78530b74-61f9-11d2-8cad-00a024580902")
IAMTimeline : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateEmptyNode(
        IAMTimelineObj **obj,
        TIMELINE_MAJOR_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddGroup(
        IAMTimelineObj *group) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemGroupFromList(
        IAMTimelineObj *group) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroup(
        IAMTimelineObj **group,
        LONG index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupCount(
        LONG *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearAllGroups(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInsertMode(
        LONG *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInsertMode(
        LONG mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableTransitions(
        WINBOOL enabled) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE EnableEffects(
        WINBOOL enabled) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE SetInterestRange(
        REFERENCE_TIME start,
        REFERENCE_TIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration(
        REFERENCE_TIME *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration2(
        double *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultFPS(
        double fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultFPS(
        double *fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsDirty(
        WINBOOL *dirty) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDirtyRange(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCountOfType(
        LONG group,
        LONG *value,
        LONG *value_with_comps,
        TIMELINE_MAJOR_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE ValidateSourceNames(
        LONG flags,
        IMediaLocator *override,
        LONG_PTR notify_event) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultTransition(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultTransition(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultEffect(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultEffect(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultTransitionB(
        BSTR guidb) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultTransitionB(
        BSTR *guidb) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultEffectB(
        BSTR guidb) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultEffectB(
        BSTR *guidb) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMTimeline, 0x78530b74, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02)
#endif
#else
typedef struct IAMTimelineVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMTimeline methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEmptyNode)(
        IAMTimeline *This,
        IAMTimelineObj **obj,
        TIMELINE_MAJOR_TYPE type);

    HRESULT (STDMETHODCALLTYPE *AddGroup)(
        IAMTimeline *This,
        IAMTimelineObj *group);

    HRESULT (STDMETHODCALLTYPE *RemGroupFromList)(
        IAMTimeline *This,
        IAMTimelineObj *group);

    HRESULT (STDMETHODCALLTYPE *GetGroup)(
        IAMTimeline *This,
        IAMTimelineObj **group,
        LONG index);

    HRESULT (STDMETHODCALLTYPE *GetGroupCount)(
        IAMTimeline *This,
        LONG *count);

    HRESULT (STDMETHODCALLTYPE *ClearAllGroups)(
        IAMTimeline *This);

    HRESULT (STDMETHODCALLTYPE *GetInsertMode)(
        IAMTimeline *This,
        LONG *mode);

    HRESULT (STDMETHODCALLTYPE *SetInsertMode)(
        IAMTimeline *This,
        LONG mode);

    HRESULT (STDMETHODCALLTYPE *EnableTransitions)(
        IAMTimeline *This,
        WINBOOL enabled);

    HRESULT (STDMETHODCALLTYPE *TransitionsEnabled)(
        IAMTimeline *This,
        WINBOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *EnableEffects)(
        IAMTimeline *This,
        WINBOOL enabled);

    HRESULT (STDMETHODCALLTYPE *EffectsEnabled)(
        IAMTimeline *This,
        WINBOOL *enabled);

    HRESULT (STDMETHODCALLTYPE *SetInterestRange)(
        IAMTimeline *This,
        REFERENCE_TIME start,
        REFERENCE_TIME stop);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IAMTimeline *This,
        REFERENCE_TIME *duration);

    HRESULT (STDMETHODCALLTYPE *GetDuration2)(
        IAMTimeline *This,
        double *duration);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFPS)(
        IAMTimeline *This,
        double fps);

    HRESULT (STDMETHODCALLTYPE *GetDefaultFPS)(
        IAMTimeline *This,
        double *fps);

    HRESULT (STDMETHODCALLTYPE *IsDirty)(
        IAMTimeline *This,
        WINBOOL *dirty);

    HRESULT (STDMETHODCALLTYPE *GetDirtyRange)(
        IAMTimeline *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *GetCountOfType)(
        IAMTimeline *This,
        LONG group,
        LONG *value,
        LONG *value_with_comps,
        TIMELINE_MAJOR_TYPE type);

    HRESULT (STDMETHODCALLTYPE *ValidateSourceNames)(
        IAMTimeline *This,
        LONG flags,
        IMediaLocator *override,
        LONG_PTR notify_event);

    HRESULT (STDMETHODCALLTYPE *SetDefaultTransition)(
        IAMTimeline *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *GetDefaultTransition)(
        IAMTimeline *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *SetDefaultEffect)(
        IAMTimeline *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *GetDefaultEffect)(
        IAMTimeline *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *SetDefaultTransitionB)(
        IAMTimeline *This,
        BSTR guidb);

    HRESULT (STDMETHODCALLTYPE *GetDefaultTransitionB)(
        IAMTimeline *This,
        BSTR *guidb);

    HRESULT (STDMETHODCALLTYPE *SetDefaultEffectB)(
        IAMTimeline *This,
        BSTR guidb);

    HRESULT (STDMETHODCALLTYPE *GetDefaultEffectB)(
        IAMTimeline *This,
        BSTR *guidb);

    END_INTERFACE
} IAMTimelineVtbl;

interface IAMTimeline {
    CONST_VTBL IAMTimelineVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMTimeline_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMTimeline_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMTimeline_Release(This) (This)->lpVtbl->Release(This)
/*** IAMTimeline methods ***/
#define IAMTimeline_CreateEmptyNode(This,obj,type) (This)->lpVtbl->CreateEmptyNode(This,obj,type)
#define IAMTimeline_AddGroup(This,group) (This)->lpVtbl->AddGroup(This,group)
#define IAMTimeline_RemGroupFromList(This,group) (This)->lpVtbl->RemGroupFromList(This,group)
#define IAMTimeline_GetGroup(This,group,index) (This)->lpVtbl->GetGroup(This,group,index)
#define IAMTimeline_GetGroupCount(This,count) (This)->lpVtbl->GetGroupCount(This,count)
#define IAMTimeline_ClearAllGroups(This) (This)->lpVtbl->ClearAllGroups(This)
#define IAMTimeline_GetInsertMode(This,mode) (This)->lpVtbl->GetInsertMode(This,mode)
#define IAMTimeline_SetInsertMode(This,mode) (This)->lpVtbl->SetInsertMode(This,mode)
#define IAMTimeline_EnableTransitions(This,enabled) (This)->lpVtbl->EnableTransitions(This,enabled)
#define IAMTimeline_TransitionsEnabled(This,enabled) (This)->lpVtbl->TransitionsEnabled(This,enabled)
#define IAMTimeline_EnableEffects(This,enabled) (This)->lpVtbl->EnableEffects(This,enabled)
#define IAMTimeline_EffectsEnabled(This,enabled) (This)->lpVtbl->EffectsEnabled(This,enabled)
#define IAMTimeline_SetInterestRange(This,start,stop) (This)->lpVtbl->SetInterestRange(This,start,stop)
#define IAMTimeline_GetDuration(This,duration) (This)->lpVtbl->GetDuration(This,duration)
#define IAMTimeline_GetDuration2(This,duration) (This)->lpVtbl->GetDuration2(This,duration)
#define IAMTimeline_SetDefaultFPS(This,fps) (This)->lpVtbl->SetDefaultFPS(This,fps)
#define IAMTimeline_GetDefaultFPS(This,fps) (This)->lpVtbl->GetDefaultFPS(This,fps)
#define IAMTimeline_IsDirty(This,dirty) (This)->lpVtbl->IsDirty(This,dirty)
#define IAMTimeline_GetDirtyRange(This,start,stop) (This)->lpVtbl->GetDirtyRange(This,start,stop)
#define IAMTimeline_GetCountOfType(This,group,value,value_with_comps,type) (This)->lpVtbl->GetCountOfType(This,group,value,value_with_comps,type)
#define IAMTimeline_ValidateSourceNames(This,flags,override,notify_event) (This)->lpVtbl->ValidateSourceNames(This,flags,override,notify_event)
#define IAMTimeline_SetDefaultTransition(This,guid) (This)->lpVtbl->SetDefaultTransition(This,guid)
#define IAMTimeline_GetDefaultTransition(This,guid) (This)->lpVtbl->GetDefaultTransition(This,guid)
#define IAMTimeline_SetDefaultEffect(This,guid) (This)->lpVtbl->SetDefaultEffect(This,guid)
#define IAMTimeline_GetDefaultEffect(This,guid) (This)->lpVtbl->GetDefaultEffect(This,guid)
#define IAMTimeline_SetDefaultTransitionB(This,guidb) (This)->lpVtbl->SetDefaultTransitionB(This,guidb)
#define IAMTimeline_GetDefaultTransitionB(This,guidb) (This)->lpVtbl->GetDefaultTransitionB(This,guidb)
#define IAMTimeline_SetDefaultEffectB(This,guidb) (This)->lpVtbl->SetDefaultEffectB(This,guidb)
#define IAMTimeline_GetDefaultEffectB(This,guidb) (This)->lpVtbl->GetDefaultEffectB(This,guidb)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMTimeline_QueryInterface(IAMTimeline* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMTimeline_AddRef(IAMTimeline* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMTimeline_Release(IAMTimeline* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimeline methods ***/
static FORCEINLINE HRESULT IAMTimeline_CreateEmptyNode(IAMTimeline* This,IAMTimelineObj **obj,TIMELINE_MAJOR_TYPE type) {
    return This->lpVtbl->CreateEmptyNode(This,obj,type);
}
static FORCEINLINE HRESULT IAMTimeline_AddGroup(IAMTimeline* This,IAMTimelineObj *group) {
    return This->lpVtbl->AddGroup(This,group);
}
static FORCEINLINE HRESULT IAMTimeline_RemGroupFromList(IAMTimeline* This,IAMTimelineObj *group) {
    return This->lpVtbl->RemGroupFromList(This,group);
}
static FORCEINLINE HRESULT IAMTimeline_GetGroup(IAMTimeline* This,IAMTimelineObj **group,LONG index) {
    return This->lpVtbl->GetGroup(This,group,index);
}
static FORCEINLINE HRESULT IAMTimeline_GetGroupCount(IAMTimeline* This,LONG *count) {
    return This->lpVtbl->GetGroupCount(This,count);
}
static FORCEINLINE HRESULT IAMTimeline_ClearAllGroups(IAMTimeline* This) {
    return This->lpVtbl->ClearAllGroups(This);
}
static FORCEINLINE HRESULT IAMTimeline_GetInsertMode(IAMTimeline* This,LONG *mode) {
    return This->lpVtbl->GetInsertMode(This,mode);
}
static FORCEINLINE HRESULT IAMTimeline_SetInsertMode(IAMTimeline* This,LONG mode) {
    return This->lpVtbl->SetInsertMode(This,mode);
}
static FORCEINLINE HRESULT IAMTimeline_EnableTransitions(IAMTimeline* This,WINBOOL enabled) {
    return This->lpVtbl->EnableTransitions(This,enabled);
}
static FORCEINLINE HRESULT IAMTimeline_TransitionsEnabled(IAMTimeline* This,WINBOOL *enabled) {
    return This->lpVtbl->TransitionsEnabled(This,enabled);
}
static FORCEINLINE HRESULT IAMTimeline_EnableEffects(IAMTimeline* This,WINBOOL enabled) {
    return This->lpVtbl->EnableEffects(This,enabled);
}
static FORCEINLINE HRESULT IAMTimeline_EffectsEnabled(IAMTimeline* This,WINBOOL *enabled) {
    return This->lpVtbl->EffectsEnabled(This,enabled);
}
static FORCEINLINE HRESULT IAMTimeline_SetInterestRange(IAMTimeline* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetInterestRange(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimeline_GetDuration(IAMTimeline* This,REFERENCE_TIME *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
static FORCEINLINE HRESULT IAMTimeline_GetDuration2(IAMTimeline* This,double *duration) {
    return This->lpVtbl->GetDuration2(This,duration);
}
static FORCEINLINE HRESULT IAMTimeline_SetDefaultFPS(IAMTimeline* This,double fps) {
    return This->lpVtbl->SetDefaultFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimeline_GetDefaultFPS(IAMTimeline* This,double *fps) {
    return This->lpVtbl->GetDefaultFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimeline_IsDirty(IAMTimeline* This,WINBOOL *dirty) {
    return This->lpVtbl->IsDirty(This,dirty);
}
static FORCEINLINE HRESULT IAMTimeline_GetDirtyRange(IAMTimeline* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetDirtyRange(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimeline_GetCountOfType(IAMTimeline* This,LONG group,LONG *value,LONG *value_with_comps,TIMELINE_MAJOR_TYPE type) {
    return This->lpVtbl->GetCountOfType(This,group,value,value_with_comps,type);
}
static FORCEINLINE HRESULT IAMTimeline_ValidateSourceNames(IAMTimeline* This,LONG flags,IMediaLocator *override,LONG_PTR notify_event) {
    return This->lpVtbl->ValidateSourceNames(This,flags,override,notify_event);
}
static FORCEINLINE HRESULT IAMTimeline_SetDefaultTransition(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->SetDefaultTransition(This,guid);
}
static FORCEINLINE HRESULT IAMTimeline_GetDefaultTransition(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->GetDefaultTransition(This,guid);
}
static FORCEINLINE HRESULT IAMTimeline_SetDefaultEffect(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->SetDefaultEffect(This,guid);
}
static FORCEINLINE HRESULT IAMTimeline_GetDefaultEffect(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->GetDefaultEffect(This,guid);
}
static FORCEINLINE HRESULT IAMTimeline_SetDefaultTransitionB(IAMTimeline* This,BSTR guidb) {
    return This->lpVtbl->SetDefaultTransitionB(This,guidb);
}
static FORCEINLINE HRESULT IAMTimeline_GetDefaultTransitionB(IAMTimeline* This,BSTR *guidb) {
    return This->lpVtbl->GetDefaultTransitionB(This,guidb);
}
static FORCEINLINE HRESULT IAMTimeline_SetDefaultEffectB(IAMTimeline* This,BSTR guidb) {
    return This->lpVtbl->SetDefaultEffectB(This,guidb);
}
static FORCEINLINE HRESULT IAMTimeline_GetDefaultEffectB(IAMTimeline* This,BSTR *guidb) {
    return This->lpVtbl->GetDefaultEffectB(This,guidb);
}
#endif
#endif

#endif


#endif  /* __IAMTimeline_INTERFACE_DEFINED__ */

/*****************************************************************************
 * AMTimeline coclass
 */

DEFINE_GUID(CLSID_AMTimeline, 0x78530b75, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02);

#ifdef __cplusplus
class DECLSPEC_UUID("78530b75-61f9-11d2-8cad-00a024580902") AMTimeline;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AMTimeline, 0x78530b75, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02)
#endif
#endif

/*****************************************************************************
 * IAMTimelineGroup interface
 */
#ifndef __IAMTimelineGroup_INTERFACE_DEFINED__
#define __IAMTimelineGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMTimelineGroup, 0x9eed4f00, 0xb8a6, 0x11d2, 0x80,0x23, 0x00,0xc0,0xdf,0x10,0xd4,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9eed4f00-b8a6-11d2-8023-00c0df10d434")
IAMTimelineGroup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetTimeline(
        IAMTimeline *timeline) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimeline(
        IAMTimeline **timeline) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPriority(
        LONG *priority) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaType(
        AM_MEDIA_TYPE *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaType(
        AM_MEDIA_TYPE *a) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputFPS(
        double fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputFPS(
        double *fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGroupName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreviewMode(
        WINBOOL preview) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviewMode(
        WINBOOL *preview) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaTypeForVB(
        LONG type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputBuffering(
        int *buffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOutputBuffering(
        int buffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSmartRecompressFormat(
        LONG *format) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSmartRecompressFormat(
        LONG **format) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSmartRecompressFormatSet(
        WINBOOL *set) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRecompressFormatDirty(
        WINBOOL *dirty) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearRecompressFormatDirty(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRecompFormatFromSource(
        IAMTimelineSrc *source) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMTimelineGroup, 0x9eed4f00, 0xb8a6, 0x11d2, 0x80,0x23, 0x00,0xc0,0xdf,0x10,0xd4,0x34)
#endif
#else
typedef struct IAMTimelineGroupVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMTimelineGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *SetTimeline)(
        IAMTimelineGroup *This,
        IAMTimeline *timeline);

    HRESULT (STDMETHODCALLTYPE *GetTimeline)(
        IAMTimelineGroup *This,
        IAMTimeline **timeline);

    HRESULT (STDMETHODCALLTYPE *GetPriority)(
        IAMTimelineGroup *This,
        LONG *priority);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IAMTimelineGroup *This,
        AM_MEDIA_TYPE *a);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IAMTimelineGroup *This,
        AM_MEDIA_TYPE *a);

    HRESULT (STDMETHODCALLTYPE *SetOutputFPS)(
        IAMTimelineGroup *This,
        double fps);

    HRESULT (STDMETHODCALLTYPE *GetOutputFPS)(
        IAMTimelineGroup *This,
        double *fps);

    HRESULT (STDMETHODCALLTYPE *SetGroupName)(
        IAMTimelineGroup *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *GetGroupName)(
        IAMTimelineGroup *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetPreviewMode)(
        IAMTimelineGroup *This,
        WINBOOL preview);

    HRESULT (STDMETHODCALLTYPE *GetPreviewMode)(
        IAMTimelineGroup *This,
        WINBOOL *preview);

    HRESULT (STDMETHODCALLTYPE *SetMediaTypeForVB)(
        IAMTimelineGroup *This,
        LONG type);

    HRESULT (STDMETHODCALLTYPE *GetOutputBuffering)(
        IAMTimelineGroup *This,
        int *buffer);

    HRESULT (STDMETHODCALLTYPE *SetOutputBuffering)(
        IAMTimelineGroup *This,
        int buffer);

    HRESULT (STDMETHODCALLTYPE *SetSmartRecompressFormat)(
        IAMTimelineGroup *This,
        LONG *format);

    HRESULT (STDMETHODCALLTYPE *GetSmartRecompressFormat)(
        IAMTimelineGroup *This,
        LONG **format);

    HRESULT (STDMETHODCALLTYPE *IsSmartRecompressFormatSet)(
        IAMTimelineGroup *This,
        WINBOOL *set);

    HRESULT (STDMETHODCALLTYPE *IsRecompressFormatDirty)(
        IAMTimelineGroup *This,
        WINBOOL *dirty);

    HRESULT (STDMETHODCALLTYPE *ClearRecompressFormatDirty)(
        IAMTimelineGroup *This);

    HRESULT (STDMETHODCALLTYPE *SetRecompFormatFromSource)(
        IAMTimelineGroup *This,
        IAMTimelineSrc *source);

    END_INTERFACE
} IAMTimelineGroupVtbl;

interface IAMTimelineGroup {
    CONST_VTBL IAMTimelineGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMTimelineGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMTimelineGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMTimelineGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IAMTimelineGroup methods ***/
#define IAMTimelineGroup_SetTimeline(This,timeline) (This)->lpVtbl->SetTimeline(This,timeline)
#define IAMTimelineGroup_GetTimeline(This,timeline) (This)->lpVtbl->GetTimeline(This,timeline)
#define IAMTimelineGroup_GetPriority(This,priority) (This)->lpVtbl->GetPriority(This,priority)
#define IAMTimelineGroup_GetMediaType(This,a) (This)->lpVtbl->GetMediaType(This,a)
#define IAMTimelineGroup_SetMediaType(This,a) (This)->lpVtbl->SetMediaType(This,a)
#define IAMTimelineGroup_SetOutputFPS(This,fps) (This)->lpVtbl->SetOutputFPS(This,fps)
#define IAMTimelineGroup_GetOutputFPS(This,fps) (This)->lpVtbl->GetOutputFPS(This,fps)
#define IAMTimelineGroup_SetGroupName(This,name) (This)->lpVtbl->SetGroupName(This,name)
#define IAMTimelineGroup_GetGroupName(This,name) (This)->lpVtbl->GetGroupName(This,name)
#define IAMTimelineGroup_SetPreviewMode(This,preview) (This)->lpVtbl->SetPreviewMode(This,preview)
#define IAMTimelineGroup_GetPreviewMode(This,preview) (This)->lpVtbl->GetPreviewMode(This,preview)
#define IAMTimelineGroup_SetMediaTypeForVB(This,type) (This)->lpVtbl->SetMediaTypeForVB(This,type)
#define IAMTimelineGroup_GetOutputBuffering(This,buffer) (This)->lpVtbl->GetOutputBuffering(This,buffer)
#define IAMTimelineGroup_SetOutputBuffering(This,buffer) (This)->lpVtbl->SetOutputBuffering(This,buffer)
#define IAMTimelineGroup_SetSmartRecompressFormat(This,format) (This)->lpVtbl->SetSmartRecompressFormat(This,format)
#define IAMTimelineGroup_GetSmartRecompressFormat(This,format) (This)->lpVtbl->GetSmartRecompressFormat(This,format)
#define IAMTimelineGroup_IsSmartRecompressFormatSet(This,set) (This)->lpVtbl->IsSmartRecompressFormatSet(This,set)
#define IAMTimelineGroup_IsRecompressFormatDirty(This,dirty) (This)->lpVtbl->IsRecompressFormatDirty(This,dirty)
#define IAMTimelineGroup_ClearRecompressFormatDirty(This) (This)->lpVtbl->ClearRecompressFormatDirty(This)
#define IAMTimelineGroup_SetRecompFormatFromSource(This,source) (This)->lpVtbl->SetRecompFormatFromSource(This,source)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMTimelineGroup_QueryInterface(IAMTimelineGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMTimelineGroup_AddRef(IAMTimelineGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMTimelineGroup_Release(IAMTimelineGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineGroup methods ***/
static FORCEINLINE HRESULT IAMTimelineGroup_SetTimeline(IAMTimelineGroup* This,IAMTimeline *timeline) {
    return This->lpVtbl->SetTimeline(This,timeline);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetTimeline(IAMTimelineGroup* This,IAMTimeline **timeline) {
    return This->lpVtbl->GetTimeline(This,timeline);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetPriority(IAMTimelineGroup* This,LONG *priority) {
    return This->lpVtbl->GetPriority(This,priority);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetMediaType(IAMTimelineGroup* This,AM_MEDIA_TYPE *a) {
    return This->lpVtbl->GetMediaType(This,a);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetMediaType(IAMTimelineGroup* This,AM_MEDIA_TYPE *a) {
    return This->lpVtbl->SetMediaType(This,a);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetOutputFPS(IAMTimelineGroup* This,double fps) {
    return This->lpVtbl->SetOutputFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetOutputFPS(IAMTimelineGroup* This,double *fps) {
    return This->lpVtbl->GetOutputFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetGroupName(IAMTimelineGroup* This,BSTR name) {
    return This->lpVtbl->SetGroupName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetGroupName(IAMTimelineGroup* This,BSTR *name) {
    return This->lpVtbl->GetGroupName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetPreviewMode(IAMTimelineGroup* This,WINBOOL preview) {
    return This->lpVtbl->SetPreviewMode(This,preview);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetPreviewMode(IAMTimelineGroup* This,WINBOOL *preview) {
    return This->lpVtbl->GetPreviewMode(This,preview);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetMediaTypeForVB(IAMTimelineGroup* This,LONG type) {
    return This->lpVtbl->SetMediaTypeForVB(This,type);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetOutputBuffering(IAMTimelineGroup* This,int *buffer) {
    return This->lpVtbl->GetOutputBuffering(This,buffer);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetOutputBuffering(IAMTimelineGroup* This,int buffer) {
    return This->lpVtbl->SetOutputBuffering(This,buffer);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetSmartRecompressFormat(IAMTimelineGroup* This,LONG *format) {
    return This->lpVtbl->SetSmartRecompressFormat(This,format);
}
static FORCEINLINE HRESULT IAMTimelineGroup_GetSmartRecompressFormat(IAMTimelineGroup* This,LONG **format) {
    return This->lpVtbl->GetSmartRecompressFormat(This,format);
}
static FORCEINLINE HRESULT IAMTimelineGroup_IsSmartRecompressFormatSet(IAMTimelineGroup* This,WINBOOL *set) {
    return This->lpVtbl->IsSmartRecompressFormatSet(This,set);
}
static FORCEINLINE HRESULT IAMTimelineGroup_IsRecompressFormatDirty(IAMTimelineGroup* This,WINBOOL *dirty) {
    return This->lpVtbl->IsRecompressFormatDirty(This,dirty);
}
static FORCEINLINE HRESULT IAMTimelineGroup_ClearRecompressFormatDirty(IAMTimelineGroup* This) {
    return This->lpVtbl->ClearRecompressFormatDirty(This);
}
static FORCEINLINE HRESULT IAMTimelineGroup_SetRecompFormatFromSource(IAMTimelineGroup* This,IAMTimelineSrc *source) {
    return This->lpVtbl->SetRecompFormatFromSource(This,source);
}
#endif
#endif

#endif


#endif  /* __IAMTimelineGroup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMTimelineObj interface
 */
#ifndef __IAMTimelineObj_INTERFACE_DEFINED__
#define __IAMTimelineObj_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMTimelineObj, 0x78530b77, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("78530b77-61f9-11d2-8cad-00a024580902")
IAMTimelineObj : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetStartStop(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStartStop2(
        REFTIME *start,
        REFTIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE FixTimes(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE FixTimes2(
        REFTIME *start,
        REFTIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStartStop(
        REFERENCE_TIME start,
        REFERENCE_TIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStartStop2(
        REFTIME start,
        REFTIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertySetter(
        IPropertySetter **setter) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPropertySetter(
        IPropertySetter *setter) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubObject(
        IUnknown **obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubObject(
        IUnknown *obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubObjectGUID(
        GUID guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubObjectGUIDB(
        BSTR guidb) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubObjectGUID(
        GUID *guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubObjectGUIDB(
        BSTR *guidb) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubObjectLoaded(
        WINBOOL *loaded) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimelineType(
        TIMELINE_MAJOR_TYPE *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimelineType(
        TIMELINE_MAJOR_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserID(
        LONG *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUserID(
        LONG id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGenID(
        LONG *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUserName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserData(
        BYTE *data,
        LONG *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUserData(
        BYTE *data,
        LONG size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMuted(
        WINBOOL *muted) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMuted(
        WINBOOL muted) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLocked(
        WINBOOL *locked) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLocked(
        WINBOOL locked) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDirtyRange(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDirtyRange2(
        REFTIME *start,
        REFTIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDirtyRange(
        REFERENCE_TIME start,
        REFERENCE_TIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDirtyRange2(
        REFTIME start,
        REFTIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearDirty(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTimelineNoRef(
        IAMTimeline **timeline) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGroupIBelongTo(
        IAMTimelineGroup **group) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEmbedDepth(
        LONG *depth) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMTimelineObj, 0x78530b77, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02)
#endif
#else
typedef struct IAMTimelineObjVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMTimelineObj methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStartStop)(
        IAMTimelineObj *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *GetStartStop2)(
        IAMTimelineObj *This,
        REFTIME *start,
        REFTIME *stop);

    HRESULT (STDMETHODCALLTYPE *FixTimes)(
        IAMTimelineObj *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *FixTimes2)(
        IAMTimelineObj *This,
        REFTIME *start,
        REFTIME *stop);

    HRESULT (STDMETHODCALLTYPE *SetStartStop)(
        IAMTimelineObj *This,
        REFERENCE_TIME start,
        REFERENCE_TIME stop);

    HRESULT (STDMETHODCALLTYPE *SetStartStop2)(
        IAMTimelineObj *This,
        REFTIME start,
        REFTIME stop);

    HRESULT (STDMETHODCALLTYPE *GetPropertySetter)(
        IAMTimelineObj *This,
        IPropertySetter **setter);

    HRESULT (STDMETHODCALLTYPE *SetPropertySetter)(
        IAMTimelineObj *This,
        IPropertySetter *setter);

    HRESULT (STDMETHODCALLTYPE *GetSubObject)(
        IAMTimelineObj *This,
        IUnknown **obj);

    HRESULT (STDMETHODCALLTYPE *SetSubObject)(
        IAMTimelineObj *This,
        IUnknown *obj);

    HRESULT (STDMETHODCALLTYPE *SetSubObjectGUID)(
        IAMTimelineObj *This,
        GUID guid);

    HRESULT (STDMETHODCALLTYPE *SetSubObjectGUIDB)(
        IAMTimelineObj *This,
        BSTR guidb);

    HRESULT (STDMETHODCALLTYPE *GetSubObjectGUID)(
        IAMTimelineObj *This,
        GUID *guid);

    HRESULT (STDMETHODCALLTYPE *GetSubObjectGUIDB)(
        IAMTimelineObj *This,
        BSTR *guidb);

    HRESULT (STDMETHODCALLTYPE *GetSubObjectLoaded)(
        IAMTimelineObj *This,
        WINBOOL *loaded);

    HRESULT (STDMETHODCALLTYPE *GetTimelineType)(
        IAMTimelineObj *This,
        TIMELINE_MAJOR_TYPE *type);

    HRESULT (STDMETHODCALLTYPE *SetTimelineType)(
        IAMTimelineObj *This,
        TIMELINE_MAJOR_TYPE type);

    HRESULT (STDMETHODCALLTYPE *GetUserID)(
        IAMTimelineObj *This,
        LONG *id);

    HRESULT (STDMETHODCALLTYPE *SetUserID)(
        IAMTimelineObj *This,
        LONG id);

    HRESULT (STDMETHODCALLTYPE *GetGenID)(
        IAMTimelineObj *This,
        LONG *id);

    HRESULT (STDMETHODCALLTYPE *GetUserName)(
        IAMTimelineObj *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetUserName)(
        IAMTimelineObj *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *GetUserData)(
        IAMTimelineObj *This,
        BYTE *data,
        LONG *size);

    HRESULT (STDMETHODCALLTYPE *SetUserData)(
        IAMTimelineObj *This,
        BYTE *data,
        LONG size);

    HRESULT (STDMETHODCALLTYPE *GetMuted)(
        IAMTimelineObj *This,
        WINBOOL *muted);

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

    HRESULT (STDMETHODCALLTYPE *GetLocked)(
        IAMTimelineObj *This,
        WINBOOL *locked);

    HRESULT (STDMETHODCALLTYPE *SetLocked)(
        IAMTimelineObj *This,
        WINBOOL locked);

    HRESULT (STDMETHODCALLTYPE *GetDirtyRange)(
        IAMTimelineObj *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *GetDirtyRange2)(
        IAMTimelineObj *This,
        REFTIME *start,
        REFTIME *stop);

    HRESULT (STDMETHODCALLTYPE *SetDirtyRange)(
        IAMTimelineObj *This,
        REFERENCE_TIME start,
        REFERENCE_TIME stop);

    HRESULT (STDMETHODCALLTYPE *SetDirtyRange2)(
        IAMTimelineObj *This,
        REFTIME start,
        REFTIME stop);

    HRESULT (STDMETHODCALLTYPE *ClearDirty)(
        IAMTimelineObj *This);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IAMTimelineObj *This);

    HRESULT (STDMETHODCALLTYPE *RemoveAll)(
        IAMTimelineObj *This);

    HRESULT (STDMETHODCALLTYPE *GetTimelineNoRef)(
        IAMTimelineObj *This,
        IAMTimeline **timeline);

    HRESULT (STDMETHODCALLTYPE *GetGroupIBelongTo)(
        IAMTimelineObj *This,
        IAMTimelineGroup **group);

    HRESULT (STDMETHODCALLTYPE *GetEmbedDepth)(
        IAMTimelineObj *This,
        LONG *depth);

    END_INTERFACE
} IAMTimelineObjVtbl;

interface IAMTimelineObj {
    CONST_VTBL IAMTimelineObjVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMTimelineObj_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMTimelineObj_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMTimelineObj_Release(This) (This)->lpVtbl->Release(This)
/*** IAMTimelineObj methods ***/
#define IAMTimelineObj_GetStartStop(This,start,stop) (This)->lpVtbl->GetStartStop(This,start,stop)
#define IAMTimelineObj_GetStartStop2(This,start,stop) (This)->lpVtbl->GetStartStop2(This,start,stop)
#define IAMTimelineObj_FixTimes(This,start,stop) (This)->lpVtbl->FixTimes(This,start,stop)
#define IAMTimelineObj_FixTimes2(This,start,stop) (This)->lpVtbl->FixTimes2(This,start,stop)
#define IAMTimelineObj_SetStartStop(This,start,stop) (This)->lpVtbl->SetStartStop(This,start,stop)
#define IAMTimelineObj_SetStartStop2(This,start,stop) (This)->lpVtbl->SetStartStop2(This,start,stop)
#define IAMTimelineObj_GetPropertySetter(This,setter) (This)->lpVtbl->GetPropertySetter(This,setter)
#define IAMTimelineObj_SetPropertySetter(This,setter) (This)->lpVtbl->SetPropertySetter(This,setter)
#define IAMTimelineObj_GetSubObject(This,obj) (This)->lpVtbl->GetSubObject(This,obj)
#define IAMTimelineObj_SetSubObject(This,obj) (This)->lpVtbl->SetSubObject(This,obj)
#define IAMTimelineObj_SetSubObjectGUID(This,guid) (This)->lpVtbl->SetSubObjectGUID(This,guid)
#define IAMTimelineObj_SetSubObjectGUIDB(This,guidb) (This)->lpVtbl->SetSubObjectGUIDB(This,guidb)
#define IAMTimelineObj_GetSubObjectGUID(This,guid) (This)->lpVtbl->GetSubObjectGUID(This,guid)
#define IAMTimelineObj_GetSubObjectGUIDB(This,guidb) (This)->lpVtbl->GetSubObjectGUIDB(This,guidb)
#define IAMTimelineObj_GetSubObjectLoaded(This,loaded) (This)->lpVtbl->GetSubObjectLoaded(This,loaded)
#define IAMTimelineObj_GetTimelineType(This,type) (This)->lpVtbl->GetTimelineType(This,type)
#define IAMTimelineObj_SetTimelineType(This,type) (This)->lpVtbl->SetTimelineType(This,type)
#define IAMTimelineObj_GetUserID(This,id) (This)->lpVtbl->GetUserID(This,id)
#define IAMTimelineObj_SetUserID(This,id) (This)->lpVtbl->SetUserID(This,id)
#define IAMTimelineObj_GetGenID(This,id) (This)->lpVtbl->GetGenID(This,id)
#define IAMTimelineObj_GetUserName(This,name) (This)->lpVtbl->GetUserName(This,name)
#define IAMTimelineObj_SetUserName(This,name) (This)->lpVtbl->SetUserName(This,name)
#define IAMTimelineObj_GetUserData(This,data,size) (This)->lpVtbl->GetUserData(This,data,size)
#define IAMTimelineObj_SetUserData(This,data,size) (This)->lpVtbl->SetUserData(This,data,size)
#define IAMTimelineObj_GetMuted(This,muted) (This)->lpVtbl->GetMuted(This,muted)
#define IAMTimelineObj_SetMuted(This,muted) (This)->lpVtbl->SetMuted(This,muted)
#define IAMTimelineObj_GetLocked(This,locked) (This)->lpVtbl->GetLocked(This,locked)
#define IAMTimelineObj_SetLocked(This,locked) (This)->lpVtbl->SetLocked(This,locked)
#define IAMTimelineObj_GetDirtyRange(This,start,stop) (This)->lpVtbl->GetDirtyRange(This,start,stop)
#define IAMTimelineObj_GetDirtyRange2(This,start,stop) (This)->lpVtbl->GetDirtyRange2(This,start,stop)
#define IAMTimelineObj_SetDirtyRange(This,start,stop) (This)->lpVtbl->SetDirtyRange(This,start,stop)
#define IAMTimelineObj_SetDirtyRange2(This,start,stop) (This)->lpVtbl->SetDirtyRange2(This,start,stop)
#define IAMTimelineObj_ClearDirty(This) (This)->lpVtbl->ClearDirty(This)
#define IAMTimelineObj_Remove(This) (This)->lpVtbl->Remove(This)
#define IAMTimelineObj_RemoveAll(This) (This)->lpVtbl->RemoveAll(This)
#define IAMTimelineObj_GetTimelineNoRef(This,timeline) (This)->lpVtbl->GetTimelineNoRef(This,timeline)
#define IAMTimelineObj_GetGroupIBelongTo(This,group) (This)->lpVtbl->GetGroupIBelongTo(This,group)
#define IAMTimelineObj_GetEmbedDepth(This,depth) (This)->lpVtbl->GetEmbedDepth(This,depth)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMTimelineObj_QueryInterface(IAMTimelineObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMTimelineObj_AddRef(IAMTimelineObj* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMTimelineObj_Release(IAMTimelineObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineObj methods ***/
static FORCEINLINE HRESULT IAMTimelineObj_GetStartStop(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetStartStop(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetStartStop2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetStartStop2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_FixTimes(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->FixTimes(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_FixTimes2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->FixTimes2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetStartStop(IAMTimelineObj* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetStartStop(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetStartStop2(IAMTimelineObj* This,REFTIME start,REFTIME stop) {
    return This->lpVtbl->SetStartStop2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetPropertySetter(IAMTimelineObj* This,IPropertySetter **setter) {
    return This->lpVtbl->GetPropertySetter(This,setter);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetPropertySetter(IAMTimelineObj* This,IPropertySetter *setter) {
    return This->lpVtbl->SetPropertySetter(This,setter);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetSubObject(IAMTimelineObj* This,IUnknown **obj) {
    return This->lpVtbl->GetSubObject(This,obj);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetSubObject(IAMTimelineObj* This,IUnknown *obj) {
    return This->lpVtbl->SetSubObject(This,obj);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetSubObjectGUID(IAMTimelineObj* This,GUID guid) {
    return This->lpVtbl->SetSubObjectGUID(This,guid);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetSubObjectGUIDB(IAMTimelineObj* This,BSTR guidb) {
    return This->lpVtbl->SetSubObjectGUIDB(This,guidb);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetSubObjectGUID(IAMTimelineObj* This,GUID *guid) {
    return This->lpVtbl->GetSubObjectGUID(This,guid);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetSubObjectGUIDB(IAMTimelineObj* This,BSTR *guidb) {
    return This->lpVtbl->GetSubObjectGUIDB(This,guidb);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetSubObjectLoaded(IAMTimelineObj* This,WINBOOL *loaded) {
    return This->lpVtbl->GetSubObjectLoaded(This,loaded);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetTimelineType(IAMTimelineObj* This,TIMELINE_MAJOR_TYPE *type) {
    return This->lpVtbl->GetTimelineType(This,type);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetTimelineType(IAMTimelineObj* This,TIMELINE_MAJOR_TYPE type) {
    return This->lpVtbl->SetTimelineType(This,type);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetUserID(IAMTimelineObj* This,LONG *id) {
    return This->lpVtbl->GetUserID(This,id);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetUserID(IAMTimelineObj* This,LONG id) {
    return This->lpVtbl->SetUserID(This,id);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetGenID(IAMTimelineObj* This,LONG *id) {
    return This->lpVtbl->GetGenID(This,id);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetUserName(IAMTimelineObj* This,BSTR *name) {
    return This->lpVtbl->GetUserName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetUserName(IAMTimelineObj* This,BSTR name) {
    return This->lpVtbl->SetUserName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetUserData(IAMTimelineObj* This,BYTE *data,LONG *size) {
    return This->lpVtbl->GetUserData(This,data,size);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetUserData(IAMTimelineObj* This,BYTE *data,LONG size) {
    return This->lpVtbl->SetUserData(This,data,size);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetMuted(IAMTimelineObj* This,WINBOOL *muted) {
    return This->lpVtbl->GetMuted(This,muted);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetMuted(IAMTimelineObj* This,WINBOOL muted) {
    return This->lpVtbl->SetMuted(This,muted);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetLocked(IAMTimelineObj* This,WINBOOL *locked) {
    return This->lpVtbl->GetLocked(This,locked);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetLocked(IAMTimelineObj* This,WINBOOL locked) {
    return This->lpVtbl->SetLocked(This,locked);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetDirtyRange(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetDirtyRange(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetDirtyRange2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetDirtyRange2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetDirtyRange(IAMTimelineObj* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetDirtyRange(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_SetDirtyRange2(IAMTimelineObj* This,REFTIME start,REFTIME stop) {
    return This->lpVtbl->SetDirtyRange2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineObj_ClearDirty(IAMTimelineObj* This) {
    return This->lpVtbl->ClearDirty(This);
}
static FORCEINLINE HRESULT IAMTimelineObj_Remove(IAMTimelineObj* This) {
    return This->lpVtbl->Remove(This);
}
static FORCEINLINE HRESULT IAMTimelineObj_RemoveAll(IAMTimelineObj* This) {
    return This->lpVtbl->RemoveAll(This);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetTimelineNoRef(IAMTimelineObj* This,IAMTimeline **timeline) {
    return This->lpVtbl->GetTimelineNoRef(This,timeline);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetGroupIBelongTo(IAMTimelineObj* This,IAMTimelineGroup **group) {
    return This->lpVtbl->GetGroupIBelongTo(This,group);
}
static FORCEINLINE HRESULT IAMTimelineObj_GetEmbedDepth(IAMTimelineObj* This,LONG *depth) {
    return This->lpVtbl->GetEmbedDepth(This,depth);
}
#endif
#endif

#endif


#endif  /* __IAMTimelineObj_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMTimelineSrc interface
 */
#ifndef __IAMTimelineSrc_INTERFACE_DEFINED__
#define __IAMTimelineSrc_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMTimelineSrc, 0x78530b79, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("78530b79-61f9-11d2-8cad-00a024580902")
IAMTimelineSrc : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMediaTimes(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaTimes2(
        REFTIME *start,
        REFTIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyStopTime(
        REFERENCE_TIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyStopTime2(
        REFTIME stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE FixMediaTimes(
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE FixMediaTimes2(
        REFTIME *start,
        REFTIME *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaTimes(
        REFERENCE_TIME Start,
        REFERENCE_TIME Stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaTimes2(
        REFTIME Start,
        REFTIME Stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaLength(
        REFERENCE_TIME length) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaLength2(
        REFTIME length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaLength(
        REFERENCE_TIME *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaLength2(
        REFTIME *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SpliceWithNext(
        IAMTimelineObj *next) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamNumber(
        LONG *num) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamNumber(
        LONG num) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsNormalRate(
        WINBOOL *normal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDefaultFPS(
        double *fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultFPS(
        double fps) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStretchMode(
        int *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStretchMode(
        int mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAMTimelineSrc, 0x78530b79, 0x61f9, 0x11d2, 0x8c,0xad, 0x00,0xa0,0x24,0x58,0x09,0x02)
#endif
#else
typedef struct IAMTimelineSrcVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAMTimelineSrc methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMediaTimes)(
        IAMTimelineSrc *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *GetMediaTimes2)(
        IAMTimelineSrc *This,
        REFTIME *start,
        REFTIME *stop);

    HRESULT (STDMETHODCALLTYPE *ModifyStopTime)(
        IAMTimelineSrc *This,
        REFERENCE_TIME stop);

    HRESULT (STDMETHODCALLTYPE *ModifyStopTime2)(
        IAMTimelineSrc *This,
        REFTIME stop);

    HRESULT (STDMETHODCALLTYPE *FixMediaTimes)(
        IAMTimelineSrc *This,
        REFERENCE_TIME *start,
        REFERENCE_TIME *stop);

    HRESULT (STDMETHODCALLTYPE *FixMediaTimes2)(
        IAMTimelineSrc *This,
        REFTIME *start,
        REFTIME *stop);

    HRESULT (STDMETHODCALLTYPE *SetMediaTimes)(
        IAMTimelineSrc *This,
        REFERENCE_TIME Start,
        REFERENCE_TIME Stop);

    HRESULT (STDMETHODCALLTYPE *SetMediaTimes2)(
        IAMTimelineSrc *This,
        REFTIME Start,
        REFTIME Stop);

    HRESULT (STDMETHODCALLTYPE *SetMediaLength)(
        IAMTimelineSrc *This,
        REFERENCE_TIME length);

    HRESULT (STDMETHODCALLTYPE *SetMediaLength2)(
        IAMTimelineSrc *This,
        REFTIME length);

    HRESULT (STDMETHODCALLTYPE *GetMediaLength)(
        IAMTimelineSrc *This,
        REFERENCE_TIME *length);

    HRESULT (STDMETHODCALLTYPE *GetMediaLength2)(
        IAMTimelineSrc *This,
        REFTIME *length);

    HRESULT (STDMETHODCALLTYPE *GetMediaName)(
        IAMTimelineSrc *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetMediaName)(
        IAMTimelineSrc *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *SpliceWithNext)(
        IAMTimelineSrc *This,
        IAMTimelineObj *next);

    HRESULT (STDMETHODCALLTYPE *GetStreamNumber)(
        IAMTimelineSrc *This,
        LONG *num);

    HRESULT (STDMETHODCALLTYPE *SetStreamNumber)(
        IAMTimelineSrc *This,
        LONG num);

    HRESULT (STDMETHODCALLTYPE *IsNormalRate)(
        IAMTimelineSrc *This,
        WINBOOL *normal);

    HRESULT (STDMETHODCALLTYPE *GetDefaultFPS)(
        IAMTimelineSrc *This,
        double *fps);

    HRESULT (STDMETHODCALLTYPE *SetDefaultFPS)(
        IAMTimelineSrc *This,
        double fps);

    HRESULT (STDMETHODCALLTYPE *GetStretchMode)(
        IAMTimelineSrc *This,
        int *mode);

    HRESULT (STDMETHODCALLTYPE *SetStretchMode)(
        IAMTimelineSrc *This,
        int mode);

    END_INTERFACE
} IAMTimelineSrcVtbl;

interface IAMTimelineSrc {
    CONST_VTBL IAMTimelineSrcVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAMTimelineSrc_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAMTimelineSrc_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAMTimelineSrc_Release(This) (This)->lpVtbl->Release(This)
/*** IAMTimelineSrc methods ***/
#define IAMTimelineSrc_GetMediaTimes(This,start,stop) (This)->lpVtbl->GetMediaTimes(This,start,stop)
#define IAMTimelineSrc_GetMediaTimes2(This,start,stop) (This)->lpVtbl->GetMediaTimes2(This,start,stop)
#define IAMTimelineSrc_ModifyStopTime(This,stop) (This)->lpVtbl->ModifyStopTime(This,stop)
#define IAMTimelineSrc_ModifyStopTime2(This,stop) (This)->lpVtbl->ModifyStopTime2(This,stop)
#define IAMTimelineSrc_FixMediaTimes(This,start,stop) (This)->lpVtbl->FixMediaTimes(This,start,stop)
#define IAMTimelineSrc_FixMediaTimes2(This,start,stop) (This)->lpVtbl->FixMediaTimes2(This,start,stop)
#define IAMTimelineSrc_SetMediaTimes(This,Start,Stop) (This)->lpVtbl->SetMediaTimes(This,Start,Stop)
#define IAMTimelineSrc_SetMediaTimes2(This,Start,Stop) (This)->lpVtbl->SetMediaTimes2(This,Start,Stop)
#define IAMTimelineSrc_SetMediaLength(This,length) (This)->lpVtbl->SetMediaLength(This,length)
#define IAMTimelineSrc_SetMediaLength2(This,length) (This)->lpVtbl->SetMediaLength2(This,length)
#define IAMTimelineSrc_GetMediaLength(This,length) (This)->lpVtbl->GetMediaLength(This,length)
#define IAMTimelineSrc_GetMediaLength2(This,length) (This)->lpVtbl->GetMediaLength2(This,length)
#define IAMTimelineSrc_GetMediaName(This,name) (This)->lpVtbl->GetMediaName(This,name)
#define IAMTimelineSrc_SetMediaName(This,name) (This)->lpVtbl->SetMediaName(This,name)
#define IAMTimelineSrc_SpliceWithNext(This,next) (This)->lpVtbl->SpliceWithNext(This,next)
#define IAMTimelineSrc_GetStreamNumber(This,num) (This)->lpVtbl->GetStreamNumber(This,num)
#define IAMTimelineSrc_SetStreamNumber(This,num) (This)->lpVtbl->SetStreamNumber(This,num)
#define IAMTimelineSrc_IsNormalRate(This,normal) (This)->lpVtbl->IsNormalRate(This,normal)
#define IAMTimelineSrc_GetDefaultFPS(This,fps) (This)->lpVtbl->GetDefaultFPS(This,fps)
#define IAMTimelineSrc_SetDefaultFPS(This,fps) (This)->lpVtbl->SetDefaultFPS(This,fps)
#define IAMTimelineSrc_GetStretchMode(This,mode) (This)->lpVtbl->GetStretchMode(This,mode)
#define IAMTimelineSrc_SetStretchMode(This,mode) (This)->lpVtbl->SetStretchMode(This,mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAMTimelineSrc_QueryInterface(IAMTimelineSrc* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAMTimelineSrc_AddRef(IAMTimelineSrc* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAMTimelineSrc_Release(IAMTimelineSrc* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineSrc methods ***/
static FORCEINLINE HRESULT IAMTimelineSrc_GetMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetMediaTimes(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetMediaTimes2(IAMTimelineSrc* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetMediaTimes2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_ModifyStopTime(IAMTimelineSrc* This,REFERENCE_TIME stop) {
    return This->lpVtbl->ModifyStopTime(This,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_ModifyStopTime2(IAMTimelineSrc* This,REFTIME stop) {
    return This->lpVtbl->ModifyStopTime2(This,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_FixMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->FixMediaTimes(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_FixMediaTimes2(IAMTimelineSrc* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->FixMediaTimes2(This,start,stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME Start,REFERENCE_TIME Stop) {
    return This->lpVtbl->SetMediaTimes(This,Start,Stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetMediaTimes2(IAMTimelineSrc* This,REFTIME Start,REFTIME Stop) {
    return This->lpVtbl->SetMediaTimes2(This,Start,Stop);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetMediaLength(IAMTimelineSrc* This,REFERENCE_TIME length) {
    return This->lpVtbl->SetMediaLength(This,length);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetMediaLength2(IAMTimelineSrc* This,REFTIME length) {
    return This->lpVtbl->SetMediaLength2(This,length);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetMediaLength(IAMTimelineSrc* This,REFERENCE_TIME *length) {
    return This->lpVtbl->GetMediaLength(This,length);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetMediaLength2(IAMTimelineSrc* This,REFTIME *length) {
    return This->lpVtbl->GetMediaLength2(This,length);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetMediaName(IAMTimelineSrc* This,BSTR *name) {
    return This->lpVtbl->GetMediaName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetMediaName(IAMTimelineSrc* This,BSTR name) {
    return This->lpVtbl->SetMediaName(This,name);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SpliceWithNext(IAMTimelineSrc* This,IAMTimelineObj *next) {
    return This->lpVtbl->SpliceWithNext(This,next);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetStreamNumber(IAMTimelineSrc* This,LONG *num) {
    return This->lpVtbl->GetStreamNumber(This,num);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetStreamNumber(IAMTimelineSrc* This,LONG num) {
    return This->lpVtbl->SetStreamNumber(This,num);
}
static FORCEINLINE HRESULT IAMTimelineSrc_IsNormalRate(IAMTimelineSrc* This,WINBOOL *normal) {
    return This->lpVtbl->IsNormalRate(This,normal);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetDefaultFPS(IAMTimelineSrc* This,double *fps) {
    return This->lpVtbl->GetDefaultFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetDefaultFPS(IAMTimelineSrc* This,double fps) {
    return This->lpVtbl->SetDefaultFPS(This,fps);
}
static FORCEINLINE HRESULT IAMTimelineSrc_GetStretchMode(IAMTimelineSrc* This,int *mode) {
    return This->lpVtbl->GetStretchMode(This,mode);
}
static FORCEINLINE HRESULT IAMTimelineSrc_SetStretchMode(IAMTimelineSrc* This,int mode) {
    return This->lpVtbl->SetStretchMode(This,mode);
}
#endif
#endif

#endif


#endif  /* __IAMTimelineSrc_INTERFACE_DEFINED__ */

enum {
    E_NOTINTREE = 0x80040400,
    E_RENDER_ENGINE_IS_BROKEN = 0x80040401,
    E_MUST_INIT_RENDERER = 0x80040402,
    E_NOTDETERMINED = 0x80040403,
    E_NO_TIMELINE = 0x80040404,
    S_WARN_OUTPUTRESET = 40404
};
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __qedit_h__ */
