/*** Autogenerated by WIDL 8.5 from include/qedit.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __qedit_h__
#define __qedit_h__

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

/* Forward declarations */

#ifndef __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 __WIDL_INLINE HRESULT ISampleGrabberCB_QueryInterface(ISampleGrabberCB* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISampleGrabberCB_AddRef(ISampleGrabberCB* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISampleGrabberCB_Release(ISampleGrabberCB* This) {
    return This->lpVtbl->Release(This);
}
/*** ISampleGrabberCB methods ***/
static __WIDL_INLINE HRESULT ISampleGrabberCB_SampleCB(ISampleGrabberCB* This,double SampleTime,IMediaSample *pSample) {
    return This->lpVtbl->SampleCB(This,SampleTime,pSample);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISampleGrabber_QueryInterface(ISampleGrabber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISampleGrabber_AddRef(ISampleGrabber* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISampleGrabber_Release(ISampleGrabber* This) {
    return This->lpVtbl->Release(This);
}
/*** ISampleGrabber methods ***/
static __WIDL_INLINE HRESULT ISampleGrabber_SetOneShot(ISampleGrabber* This,WINBOOL OneShot) {
    return This->lpVtbl->SetOneShot(This,OneShot);
}
static __WIDL_INLINE HRESULT ISampleGrabber_SetMediaType(ISampleGrabber* This,const AM_MEDIA_TYPE *pType) {
    return This->lpVtbl->SetMediaType(This,pType);
}
static __WIDL_INLINE HRESULT ISampleGrabber_GetConnectedMediaType(ISampleGrabber* This,AM_MEDIA_TYPE *pType) {
    return This->lpVtbl->GetConnectedMediaType(This,pType);
}
static __WIDL_INLINE HRESULT ISampleGrabber_SetBufferSamples(ISampleGrabber* This,WINBOOL BufferThem) {
    return This->lpVtbl->SetBufferSamples(This,BufferThem);
}
static __WIDL_INLINE HRESULT ISampleGrabber_GetCurrentBuffer(ISampleGrabber* This,LONG *pBufferSize,LONG *pBuffer) {
    return This->lpVtbl->GetCurrentBuffer(This,pBufferSize,pBuffer);
}
static __WIDL_INLINE HRESULT ISampleGrabber_GetCurrentSample(ISampleGrabber* This,IMediaSample **ppSample) {
    return This->lpVtbl->GetCurrentSample(This,ppSample);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMediaDet_QueryInterface(IMediaDet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMediaDet_AddRef(IMediaDet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMediaDet_Release(IMediaDet* This) {
    return This->lpVtbl->Release(This);
}
/*** IMediaDet methods ***/
static __WIDL_INLINE HRESULT IMediaDet_get_Filter(IMediaDet* This,IUnknown **pVal) {
    return This->lpVtbl->get_Filter(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_put_Filter(IMediaDet* This,IUnknown *newVal) {
    return This->lpVtbl->put_Filter(This,newVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_OutputStreams(IMediaDet* This,LONG *pVal) {
    return This->lpVtbl->get_OutputStreams(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_CurrentStream(IMediaDet* This,LONG *pVal) {
    return This->lpVtbl->get_CurrentStream(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_put_CurrentStream(IMediaDet* This,LONG newVal) {
    return This->lpVtbl->put_CurrentStream(This,newVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_StreamType(IMediaDet* This,GUID *pVal) {
    return This->lpVtbl->get_StreamType(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_StreamTypeB(IMediaDet* This,BSTR *pVal) {
    return This->lpVtbl->get_StreamTypeB(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_StreamLength(IMediaDet* This,double *pVal) {
    return This->lpVtbl->get_StreamLength(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_Filename(IMediaDet* This,BSTR *pVal) {
    return This->lpVtbl->get_Filename(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_put_Filename(IMediaDet* This,BSTR newVal) {
    return This->lpVtbl->put_Filename(This,newVal);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMediaDet_WriteBitmapBits(IMediaDet* This,double StreamTime,LONG Width,LONG Height,BSTR Filename) {
    return This->lpVtbl->WriteBitmapBits(This,StreamTime,Width,Height,Filename);
}
static __WIDL_INLINE HRESULT IMediaDet_get_StreamMediaType(IMediaDet* This,AM_MEDIA_TYPE *pVal) {
    return This->lpVtbl->get_StreamMediaType(This,pVal);
}
static __WIDL_INLINE HRESULT IMediaDet_GetSampleGrabber(IMediaDet* This,ISampleGrabber **ppVal) {
    return This->lpVtbl->GetSampleGrabber(This,ppVal);
}
static __WIDL_INLINE HRESULT IMediaDet_get_FrameRate(IMediaDet* This,double *pVal) {
    return This->lpVtbl->get_FrameRate(This,pVal);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMediaLocator_QueryInterface(IMediaLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMediaLocator_AddRef(IMediaLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMediaLocator_Release(IMediaLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IMediaLocator methods ***/
static __WIDL_INLINE HRESULT IMediaLocator_FindMediaFile(IMediaLocator* This,BSTR input,BSTR filter,BSTR *output,LONG flags) {
    return This->lpVtbl->FindMediaFile(This,input,filter,output,flags);
}
static __WIDL_INLINE 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_0000002B {
    BSTR name;
    DISPID dispID;
    LONG nValues;
} DEXTER_PARAM;
typedef struct __WIDL_qedit_generated_name_0000002C {
    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 __WIDL_INLINE HRESULT IPropertySetter_QueryInterface(IPropertySetter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPropertySetter_AddRef(IPropertySetter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPropertySetter_Release(IPropertySetter* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertySetter methods ***/
static __WIDL_INLINE HRESULT IPropertySetter_LoadXML(IPropertySetter* This,IUnknown *pxml) {
    return This->lpVtbl->LoadXML(This,pxml);
}
static __WIDL_INLINE HRESULT IPropertySetter_PrintXML(IPropertySetter* This,char *xml,int size,int *printed,int indent) {
    return This->lpVtbl->PrintXML(This,xml,size,printed,indent);
}
static __WIDL_INLINE HRESULT IPropertySetter_CloneProps(IPropertySetter* This,IPropertySetter **setter,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->CloneProps(This,setter,start,stop);
}
static __WIDL_INLINE HRESULT IPropertySetter_AddProp(IPropertySetter* This,DEXTER_PARAM param,DEXTER_VALUE *value) {
    return This->lpVtbl->AddProp(This,param,value);
}
static __WIDL_INLINE HRESULT IPropertySetter_GetProps(IPropertySetter* This,LONG *params,DEXTER_PARAM **param,DEXTER_VALUE **value) {
    return This->lpVtbl->GetProps(This,params,param,value);
}
static __WIDL_INLINE HRESULT IPropertySetter_FreeProps(IPropertySetter* This,LONG params,DEXTER_PARAM *param,DEXTER_VALUE *value) {
    return This->lpVtbl->FreeProps(This,params,param,value);
}
static __WIDL_INLINE HRESULT IPropertySetter_ClearProps(IPropertySetter* This) {
    return This->lpVtbl->ClearProps(This);
}
static __WIDL_INLINE HRESULT IPropertySetter_SaveToBlob(IPropertySetter* This,LONG *size,BYTE **blob) {
    return This->lpVtbl->SaveToBlob(This,size,blob);
}
static __WIDL_INLINE HRESULT IPropertySetter_LoadFromBlob(IPropertySetter* This,LONG size,BYTE *blob) {
    return This->lpVtbl->LoadFromBlob(This,size,blob);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMErrorLog_QueryInterface(IAMErrorLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMErrorLog_AddRef(IAMErrorLog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMErrorLog_Release(IAMErrorLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMErrorLog methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMSetErrorLog_QueryInterface(IAMSetErrorLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMSetErrorLog_AddRef(IAMSetErrorLog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMSetErrorLog_Release(IAMSetErrorLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMSetErrorLog methods ***/
static __WIDL_INLINE HRESULT IAMSetErrorLog_get_ErrorLog(IAMSetErrorLog* This,IAMErrorLog **log) {
    return This->lpVtbl->get_ErrorLog(This,log);
}
static __WIDL_INLINE 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_0000002D {
    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 __WIDL_INLINE HRESULT IAMTimeline_QueryInterface(IAMTimeline* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMTimeline_AddRef(IAMTimeline* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMTimeline_Release(IAMTimeline* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimeline methods ***/
static __WIDL_INLINE HRESULT IAMTimeline_CreateEmptyNode(IAMTimeline* This,IAMTimelineObj **obj,TIMELINE_MAJOR_TYPE type) {
    return This->lpVtbl->CreateEmptyNode(This,obj,type);
}
static __WIDL_INLINE HRESULT IAMTimeline_AddGroup(IAMTimeline* This,IAMTimelineObj *group) {
    return This->lpVtbl->AddGroup(This,group);
}
static __WIDL_INLINE HRESULT IAMTimeline_RemGroupFromList(IAMTimeline* This,IAMTimelineObj *group) {
    return This->lpVtbl->RemGroupFromList(This,group);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetGroup(IAMTimeline* This,IAMTimelineObj **group,LONG index) {
    return This->lpVtbl->GetGroup(This,group,index);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetGroupCount(IAMTimeline* This,LONG *count) {
    return This->lpVtbl->GetGroupCount(This,count);
}
static __WIDL_INLINE HRESULT IAMTimeline_ClearAllGroups(IAMTimeline* This) {
    return This->lpVtbl->ClearAllGroups(This);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetInsertMode(IAMTimeline* This,LONG *mode) {
    return This->lpVtbl->GetInsertMode(This,mode);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetInsertMode(IAMTimeline* This,LONG mode) {
    return This->lpVtbl->SetInsertMode(This,mode);
}
static __WIDL_INLINE HRESULT IAMTimeline_EnableTransitions(IAMTimeline* This,WINBOOL enabled) {
    return This->lpVtbl->EnableTransitions(This,enabled);
}
static __WIDL_INLINE HRESULT IAMTimeline_TransitionsEnabled(IAMTimeline* This,WINBOOL *enabled) {
    return This->lpVtbl->TransitionsEnabled(This,enabled);
}
static __WIDL_INLINE HRESULT IAMTimeline_EnableEffects(IAMTimeline* This,WINBOOL enabled) {
    return This->lpVtbl->EnableEffects(This,enabled);
}
static __WIDL_INLINE HRESULT IAMTimeline_EffectsEnabled(IAMTimeline* This,WINBOOL *enabled) {
    return This->lpVtbl->EffectsEnabled(This,enabled);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetInterestRange(IAMTimeline* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetInterestRange(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDuration(IAMTimeline* This,REFERENCE_TIME *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDuration2(IAMTimeline* This,double *duration) {
    return This->lpVtbl->GetDuration2(This,duration);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetDefaultFPS(IAMTimeline* This,double fps) {
    return This->lpVtbl->SetDefaultFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDefaultFPS(IAMTimeline* This,double *fps) {
    return This->lpVtbl->GetDefaultFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimeline_IsDirty(IAMTimeline* This,WINBOOL *dirty) {
    return This->lpVtbl->IsDirty(This,dirty);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDirtyRange(IAMTimeline* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetDirtyRange(This,start,stop);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMTimeline_ValidateSourceNames(IAMTimeline* This,LONG flags,IMediaLocator *override,LONG_PTR notify_event) {
    return This->lpVtbl->ValidateSourceNames(This,flags,override,notify_event);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetDefaultTransition(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->SetDefaultTransition(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDefaultTransition(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->GetDefaultTransition(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetDefaultEffect(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->SetDefaultEffect(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDefaultEffect(IAMTimeline* This,GUID *guid) {
    return This->lpVtbl->GetDefaultEffect(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetDefaultTransitionB(IAMTimeline* This,BSTR guidb) {
    return This->lpVtbl->SetDefaultTransitionB(This,guidb);
}
static __WIDL_INLINE HRESULT IAMTimeline_GetDefaultTransitionB(IAMTimeline* This,BSTR *guidb) {
    return This->lpVtbl->GetDefaultTransitionB(This,guidb);
}
static __WIDL_INLINE HRESULT IAMTimeline_SetDefaultEffectB(IAMTimeline* This,BSTR guidb) {
    return This->lpVtbl->SetDefaultEffectB(This,guidb);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMTimelineGroup_QueryInterface(IAMTimelineGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMTimelineGroup_AddRef(IAMTimelineGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMTimelineGroup_Release(IAMTimelineGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineGroup methods ***/
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetTimeline(IAMTimelineGroup* This,IAMTimeline *timeline) {
    return This->lpVtbl->SetTimeline(This,timeline);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetTimeline(IAMTimelineGroup* This,IAMTimeline **timeline) {
    return This->lpVtbl->GetTimeline(This,timeline);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetPriority(IAMTimelineGroup* This,LONG *priority) {
    return This->lpVtbl->GetPriority(This,priority);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetMediaType(IAMTimelineGroup* This,AM_MEDIA_TYPE *a) {
    return This->lpVtbl->GetMediaType(This,a);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetMediaType(IAMTimelineGroup* This,AM_MEDIA_TYPE *a) {
    return This->lpVtbl->SetMediaType(This,a);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetOutputFPS(IAMTimelineGroup* This,double fps) {
    return This->lpVtbl->SetOutputFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetOutputFPS(IAMTimelineGroup* This,double *fps) {
    return This->lpVtbl->GetOutputFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetGroupName(IAMTimelineGroup* This,BSTR name) {
    return This->lpVtbl->SetGroupName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetGroupName(IAMTimelineGroup* This,BSTR *name) {
    return This->lpVtbl->GetGroupName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetPreviewMode(IAMTimelineGroup* This,WINBOOL preview) {
    return This->lpVtbl->SetPreviewMode(This,preview);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetPreviewMode(IAMTimelineGroup* This,WINBOOL *preview) {
    return This->lpVtbl->GetPreviewMode(This,preview);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetMediaTypeForVB(IAMTimelineGroup* This,LONG type) {
    return This->lpVtbl->SetMediaTypeForVB(This,type);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetOutputBuffering(IAMTimelineGroup* This,int *buffer) {
    return This->lpVtbl->GetOutputBuffering(This,buffer);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetOutputBuffering(IAMTimelineGroup* This,int buffer) {
    return This->lpVtbl->SetOutputBuffering(This,buffer);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_SetSmartRecompressFormat(IAMTimelineGroup* This,LONG *format) {
    return This->lpVtbl->SetSmartRecompressFormat(This,format);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_GetSmartRecompressFormat(IAMTimelineGroup* This,LONG **format) {
    return This->lpVtbl->GetSmartRecompressFormat(This,format);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_IsSmartRecompressFormatSet(IAMTimelineGroup* This,WINBOOL *set) {
    return This->lpVtbl->IsSmartRecompressFormatSet(This,set);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_IsRecompressFormatDirty(IAMTimelineGroup* This,WINBOOL *dirty) {
    return This->lpVtbl->IsRecompressFormatDirty(This,dirty);
}
static __WIDL_INLINE HRESULT IAMTimelineGroup_ClearRecompressFormatDirty(IAMTimelineGroup* This) {
    return This->lpVtbl->ClearRecompressFormatDirty(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMTimelineObj_QueryInterface(IAMTimelineObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMTimelineObj_AddRef(IAMTimelineObj* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMTimelineObj_Release(IAMTimelineObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineObj methods ***/
static __WIDL_INLINE HRESULT IAMTimelineObj_GetStartStop(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetStartStop(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetStartStop2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetStartStop2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_FixTimes(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->FixTimes(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_FixTimes2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->FixTimes2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetStartStop(IAMTimelineObj* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetStartStop(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetStartStop2(IAMTimelineObj* This,REFTIME start,REFTIME stop) {
    return This->lpVtbl->SetStartStop2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetPropertySetter(IAMTimelineObj* This,IPropertySetter **setter) {
    return This->lpVtbl->GetPropertySetter(This,setter);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetPropertySetter(IAMTimelineObj* This,IPropertySetter *setter) {
    return This->lpVtbl->SetPropertySetter(This,setter);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetSubObject(IAMTimelineObj* This,IUnknown **obj) {
    return This->lpVtbl->GetSubObject(This,obj);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetSubObject(IAMTimelineObj* This,IUnknown *obj) {
    return This->lpVtbl->SetSubObject(This,obj);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetSubObjectGUID(IAMTimelineObj* This,GUID guid) {
    return This->lpVtbl->SetSubObjectGUID(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetSubObjectGUIDB(IAMTimelineObj* This,BSTR guidb) {
    return This->lpVtbl->SetSubObjectGUIDB(This,guidb);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetSubObjectGUID(IAMTimelineObj* This,GUID *guid) {
    return This->lpVtbl->GetSubObjectGUID(This,guid);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetSubObjectGUIDB(IAMTimelineObj* This,BSTR *guidb) {
    return This->lpVtbl->GetSubObjectGUIDB(This,guidb);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetSubObjectLoaded(IAMTimelineObj* This,WINBOOL *loaded) {
    return This->lpVtbl->GetSubObjectLoaded(This,loaded);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetTimelineType(IAMTimelineObj* This,TIMELINE_MAJOR_TYPE *type) {
    return This->lpVtbl->GetTimelineType(This,type);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetTimelineType(IAMTimelineObj* This,TIMELINE_MAJOR_TYPE type) {
    return This->lpVtbl->SetTimelineType(This,type);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetUserID(IAMTimelineObj* This,LONG *id) {
    return This->lpVtbl->GetUserID(This,id);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetUserID(IAMTimelineObj* This,LONG id) {
    return This->lpVtbl->SetUserID(This,id);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetGenID(IAMTimelineObj* This,LONG *id) {
    return This->lpVtbl->GetGenID(This,id);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetUserName(IAMTimelineObj* This,BSTR *name) {
    return This->lpVtbl->GetUserName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetUserName(IAMTimelineObj* This,BSTR name) {
    return This->lpVtbl->SetUserName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetUserData(IAMTimelineObj* This,BYTE *data,LONG *size) {
    return This->lpVtbl->GetUserData(This,data,size);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetUserData(IAMTimelineObj* This,BYTE *data,LONG size) {
    return This->lpVtbl->SetUserData(This,data,size);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetMuted(IAMTimelineObj* This,WINBOOL *muted) {
    return This->lpVtbl->GetMuted(This,muted);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetMuted(IAMTimelineObj* This,WINBOOL muted) {
    return This->lpVtbl->SetMuted(This,muted);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetLocked(IAMTimelineObj* This,WINBOOL *locked) {
    return This->lpVtbl->GetLocked(This,locked);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetLocked(IAMTimelineObj* This,WINBOOL locked) {
    return This->lpVtbl->SetLocked(This,locked);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetDirtyRange(IAMTimelineObj* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetDirtyRange(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetDirtyRange2(IAMTimelineObj* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetDirtyRange2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetDirtyRange(IAMTimelineObj* This,REFERENCE_TIME start,REFERENCE_TIME stop) {
    return This->lpVtbl->SetDirtyRange(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_SetDirtyRange2(IAMTimelineObj* This,REFTIME start,REFTIME stop) {
    return This->lpVtbl->SetDirtyRange2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_ClearDirty(IAMTimelineObj* This) {
    return This->lpVtbl->ClearDirty(This);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_Remove(IAMTimelineObj* This) {
    return This->lpVtbl->Remove(This);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_RemoveAll(IAMTimelineObj* This) {
    return This->lpVtbl->RemoveAll(This);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetTimelineNoRef(IAMTimelineObj* This,IAMTimeline **timeline) {
    return This->lpVtbl->GetTimelineNoRef(This,timeline);
}
static __WIDL_INLINE HRESULT IAMTimelineObj_GetGroupIBelongTo(IAMTimelineObj* This,IAMTimelineGroup **group) {
    return This->lpVtbl->GetGroupIBelongTo(This,group);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAMTimelineSrc_QueryInterface(IAMTimelineSrc* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAMTimelineSrc_AddRef(IAMTimelineSrc* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAMTimelineSrc_Release(IAMTimelineSrc* This) {
    return This->lpVtbl->Release(This);
}
/*** IAMTimelineSrc methods ***/
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->GetMediaTimes(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetMediaTimes2(IAMTimelineSrc* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->GetMediaTimes2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_ModifyStopTime(IAMTimelineSrc* This,REFERENCE_TIME stop) {
    return This->lpVtbl->ModifyStopTime(This,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_ModifyStopTime2(IAMTimelineSrc* This,REFTIME stop) {
    return This->lpVtbl->ModifyStopTime2(This,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_FixMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME *start,REFERENCE_TIME *stop) {
    return This->lpVtbl->FixMediaTimes(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_FixMediaTimes2(IAMTimelineSrc* This,REFTIME *start,REFTIME *stop) {
    return This->lpVtbl->FixMediaTimes2(This,start,stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetMediaTimes(IAMTimelineSrc* This,REFERENCE_TIME Start,REFERENCE_TIME Stop) {
    return This->lpVtbl->SetMediaTimes(This,Start,Stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetMediaTimes2(IAMTimelineSrc* This,REFTIME Start,REFTIME Stop) {
    return This->lpVtbl->SetMediaTimes2(This,Start,Stop);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetMediaLength(IAMTimelineSrc* This,REFERENCE_TIME length) {
    return This->lpVtbl->SetMediaLength(This,length);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetMediaLength2(IAMTimelineSrc* This,REFTIME length) {
    return This->lpVtbl->SetMediaLength2(This,length);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetMediaLength(IAMTimelineSrc* This,REFERENCE_TIME *length) {
    return This->lpVtbl->GetMediaLength(This,length);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetMediaLength2(IAMTimelineSrc* This,REFTIME *length) {
    return This->lpVtbl->GetMediaLength2(This,length);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetMediaName(IAMTimelineSrc* This,BSTR *name) {
    return This->lpVtbl->GetMediaName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetMediaName(IAMTimelineSrc* This,BSTR name) {
    return This->lpVtbl->SetMediaName(This,name);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SpliceWithNext(IAMTimelineSrc* This,IAMTimelineObj *next) {
    return This->lpVtbl->SpliceWithNext(This,next);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetStreamNumber(IAMTimelineSrc* This,LONG *num) {
    return This->lpVtbl->GetStreamNumber(This,num);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetStreamNumber(IAMTimelineSrc* This,LONG num) {
    return This->lpVtbl->SetStreamNumber(This,num);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_IsNormalRate(IAMTimelineSrc* This,WINBOOL *normal) {
    return This->lpVtbl->IsNormalRate(This,normal);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetDefaultFPS(IAMTimelineSrc* This,double *fps) {
    return This->lpVtbl->GetDefaultFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_SetDefaultFPS(IAMTimelineSrc* This,double fps) {
    return This->lpVtbl->SetDefaultFPS(This,fps);
}
static __WIDL_INLINE HRESULT IAMTimelineSrc_GetStretchMode(IAMTimelineSrc* This,int *mode) {
    return This->lpVtbl->GetStretchMode(This,mode);
}
static __WIDL_INLINE 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__ */
