/*** Autogenerated by WIDL 0.1 from amstream.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>

#ifndef __WIDL_AMSTREAM_H
#define __WIDL_AMSTREAM_H
#ifdef __cplusplus
extern "C" {
#endif
#include <unknwn.h>
#include <mmstream.h>
#include <strmif.h>
#include <ddraw.h>
#include <mmsystem.h>
#include <mmstream.h>
#include <ddstream.h>
#include <austream.h>
#if 0
#ifndef __IDirectDraw_FWD_DEFINED__
#define __IDirectDraw_FWD_DEFINED__
typedef struct IDirectDraw IDirectDraw;
#endif

#ifndef __IDirectDrawSurface_FWD_DEFINED__
#define __IDirectDrawSurface_FWD_DEFINED__
typedef struct IDirectDrawSurface IDirectDrawSurface;
#endif

#endif
#ifndef __IAMMultiMediaStream_FWD_DEFINED__
#define __IAMMultiMediaStream_FWD_DEFINED__
typedef struct IAMMultiMediaStream IAMMultiMediaStream;
#endif

#ifndef __IAMMediaStream_FWD_DEFINED__
#define __IAMMediaStream_FWD_DEFINED__
typedef struct IAMMediaStream IAMMediaStream;
#endif

#ifndef __IMediaStreamFilter_FWD_DEFINED__
#define __IMediaStreamFilter_FWD_DEFINED__
typedef struct IMediaStreamFilter IMediaStreamFilter;
#endif

#ifndef __IAMMediaTypeStream_FWD_DEFINED__
#define __IAMMediaTypeStream_FWD_DEFINED__
typedef struct IAMMediaTypeStream IAMMediaTypeStream;
#endif

#ifndef __IAMMediaTypeSample_FWD_DEFINED__
#define __IAMMediaTypeSample_FWD_DEFINED__
typedef struct IAMMediaTypeSample IAMMediaTypeSample;
#endif

enum {
    AMMSF_NOGRAPHTHREAD = 0x1
};

enum {
    AMMSF_ADDDEFAULTRENDERER = 0x1,
    AMMSF_CREATEPEER = 0x2
};

enum {
    AMMSF_RENDERTYPEMASK = 0x3,
    AMMSF_RENDERTOEXISTING = 0x0,
    AMMSF_RENDERALLSTREAMS = 0x1,
    AMMSF_NORENDER = 0x2,
    AMMSF_NOCLOCK = 0x4,
    AMMSF_RUN = 0x8
};

typedef enum {
    Disabled = 0,
    ReadData = 1,
    RenderData = 2
} OUTPUT_STATE;

/*****************************************************************************
 * IAMMultiMediaStream interface
 */
#ifndef __IAMMultiMediaStream_INTERFACE_DEFINED__
#define __IAMMultiMediaStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMMultiMediaStream, 0xbebe595c, 0x9a6f, 0x11d0, 0x8f,0xde, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IAMMultiMediaStream : public IMultiMediaStream
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        STREAM_TYPE StreamType,
        DWORD dwFlags,
        IGraphBuilder* pFilterGraph) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFilterGraph(
        IGraphBuilder** ppGraphBuilder) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFilter(
        IMediaStreamFilter** ppFilter) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddMediaStream(
        IUnknown* pStreamObject,
        const MSPID* PurposeId,
        DWORD dwFlags,
        IMediaStream** ppNewStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenFile(
        LPCWSTR pszFileName,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenMoniker(
        IBindCtx* pCtx,
        IMoniker* pMoniker,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Render(
        DWORD dwFlags) = 0;

};
#else
typedef struct IAMMultiMediaStreamVtbl IAMMultiMediaStreamVtbl;
struct IAMMultiMediaStream {
    const IAMMultiMediaStreamVtbl* lpVtbl;
};
struct IAMMultiMediaStreamVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMultiMediaStream methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInformation)(
        IAMMultiMediaStream* This,
        char* pdwFlags,
        STREAM_TYPE* pStreamType);

    HRESULT (STDMETHODCALLTYPE *GetMediaStream)(
        IAMMultiMediaStream* This,
        REFMSPID idPurpose,
        IMediaStream** ppMediaStream);

    HRESULT (STDMETHODCALLTYPE *EnumMediaStreams)(
        IAMMultiMediaStream* This,
        long Index,
        IMediaStream** ppMediaStream);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IAMMultiMediaStream* This,
        STREAM_STATE* pCurrentState);

    HRESULT (STDMETHODCALLTYPE *SetState)(
        IAMMultiMediaStream* This,
        STREAM_STATE NewState);

    HRESULT (STDMETHODCALLTYPE *GetTime)(
        IAMMultiMediaStream* This,
        STREAM_TIME* pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IAMMultiMediaStream* This,
        STREAM_TIME* pDuration);

    HRESULT (STDMETHODCALLTYPE *Seek)(
        IAMMultiMediaStream* This,
        STREAM_TIME SeekTime);

    HRESULT (STDMETHODCALLTYPE *GetEndOfStreamEventHandle)(
        IAMMultiMediaStream* This,
        HANDLE* phEOS);

    /*** IAMMultiMediaStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IAMMultiMediaStream* This,
        STREAM_TYPE StreamType,
        DWORD dwFlags,
        IGraphBuilder* pFilterGraph);

    HRESULT (STDMETHODCALLTYPE *GetFilterGraph)(
        IAMMultiMediaStream* This,
        IGraphBuilder** ppGraphBuilder);

    HRESULT (STDMETHODCALLTYPE *GetFilter)(
        IAMMultiMediaStream* This,
        IMediaStreamFilter** ppFilter);

    HRESULT (STDMETHODCALLTYPE *AddMediaStream)(
        IAMMultiMediaStream* This,
        IUnknown* pStreamObject,
        const MSPID* PurposeId,
        DWORD dwFlags,
        IMediaStream** ppNewStream);

    HRESULT (STDMETHODCALLTYPE *OpenFile)(
        IAMMultiMediaStream* This,
        LPCWSTR pszFileName,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *OpenMoniker)(
        IAMMultiMediaStream* This,
        IBindCtx* pCtx,
        IMoniker* pMoniker,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *Render)(
        IAMMultiMediaStream* This,
        DWORD dwFlags);

};

/*** IUnknown methods ***/
#define IAMMultiMediaStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IAMMultiMediaStream_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IAMMultiMediaStream_Release(p) (p)->lpVtbl->Release(p)
/*** IMultiMediaStream methods ***/
#define IAMMultiMediaStream_GetInformation(p,a,b) (p)->lpVtbl->GetInformation(p,a,b)
#define IAMMultiMediaStream_GetMediaStream(p,a,b) (p)->lpVtbl->GetMediaStream(p,a,b)
#define IAMMultiMediaStream_EnumMediaStreams(p,a,b) (p)->lpVtbl->EnumMediaStreams(p,a,b)
#define IAMMultiMediaStream_GetState(p,a) (p)->lpVtbl->GetState(p,a)
#define IAMMultiMediaStream_SetState(p,a) (p)->lpVtbl->SetState(p,a)
#define IAMMultiMediaStream_GetTime(p,a) (p)->lpVtbl->GetTime(p,a)
#define IAMMultiMediaStream_GetDuration(p,a) (p)->lpVtbl->GetDuration(p,a)
#define IAMMultiMediaStream_Seek(p,a) (p)->lpVtbl->Seek(p,a)
#define IAMMultiMediaStream_GetEndOfStreamEventHandle(p,a) (p)->lpVtbl->GetEndOfStreamEventHandle(p,a)
/*** IAMMultiMediaStream methods ***/
#define IAMMultiMediaStream_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
#define IAMMultiMediaStream_GetFilterGraph(p,a) (p)->lpVtbl->GetFilterGraph(p,a)
#define IAMMultiMediaStream_GetFilter(p,a) (p)->lpVtbl->GetFilter(p,a)
#define IAMMultiMediaStream_AddMediaStream(p,a,b,c,d) (p)->lpVtbl->AddMediaStream(p,a,b,c,d)
#define IAMMultiMediaStream_OpenFile(p,a,b) (p)->lpVtbl->OpenFile(p,a,b)
#define IAMMultiMediaStream_OpenMoniker(p,a,b,c) (p)->lpVtbl->OpenMoniker(p,a,b,c)
#define IAMMultiMediaStream_Render(p,a) (p)->lpVtbl->Render(p,a)

#endif

#define IAMMultiMediaStream_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMultiMediaStream methods ***/ \
    STDMETHOD_(HRESULT,GetInformation)(THIS_ char* pdwFlags, STREAM_TYPE* pStreamType) PURE; \
    STDMETHOD_(HRESULT,GetMediaStream)(THIS_ REFMSPID idPurpose, IMediaStream** ppMediaStream) PURE; \
    STDMETHOD_(HRESULT,EnumMediaStreams)(THIS_ long Index, IMediaStream** ppMediaStream) PURE; \
    STDMETHOD_(HRESULT,GetState)(THIS_ STREAM_STATE* pCurrentState) PURE; \
    STDMETHOD_(HRESULT,SetState)(THIS_ STREAM_STATE NewState) PURE; \
    STDMETHOD_(HRESULT,GetTime)(THIS_ STREAM_TIME* pCurrentTime) PURE; \
    STDMETHOD_(HRESULT,GetDuration)(THIS_ STREAM_TIME* pDuration) PURE; \
    STDMETHOD_(HRESULT,Seek)(THIS_ STREAM_TIME SeekTime) PURE; \
    STDMETHOD_(HRESULT,GetEndOfStreamEventHandle)(THIS_ HANDLE* phEOS) PURE; \
    /*** IAMMultiMediaStream methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ STREAM_TYPE StreamType, DWORD dwFlags, IGraphBuilder* pFilterGraph) PURE; \
    STDMETHOD_(HRESULT,GetFilterGraph)(THIS_ IGraphBuilder** ppGraphBuilder) PURE; \
    STDMETHOD_(HRESULT,GetFilter)(THIS_ IMediaStreamFilter** ppFilter) PURE; \
    STDMETHOD_(HRESULT,AddMediaStream)(THIS_ IUnknown* pStreamObject, const MSPID* PurposeId, DWORD dwFlags, IMediaStream** ppNewStream) PURE; \
    STDMETHOD_(HRESULT,OpenFile)(THIS_ LPCWSTR pszFileName, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,OpenMoniker)(THIS_ IBindCtx* pCtx, IMoniker* pMoniker, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,Render)(THIS_ DWORD dwFlags) PURE;

HRESULT CALLBACK IAMMultiMediaStream_Initialize_Proxy(
    IAMMultiMediaStream* This,
    STREAM_TYPE StreamType,
    DWORD dwFlags,
    IGraphBuilder* pFilterGraph);
void __RPC_STUB IAMMultiMediaStream_Initialize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_GetFilterGraph_Proxy(
    IAMMultiMediaStream* This,
    IGraphBuilder** ppGraphBuilder);
void __RPC_STUB IAMMultiMediaStream_GetFilterGraph_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_GetFilter_Proxy(
    IAMMultiMediaStream* This,
    IMediaStreamFilter** ppFilter);
void __RPC_STUB IAMMultiMediaStream_GetFilter_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_AddMediaStream_Proxy(
    IAMMultiMediaStream* This,
    IUnknown* pStreamObject,
    const MSPID* PurposeId,
    DWORD dwFlags,
    IMediaStream** ppNewStream);
void __RPC_STUB IAMMultiMediaStream_AddMediaStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_OpenFile_Proxy(
    IAMMultiMediaStream* This,
    LPCWSTR pszFileName,
    DWORD dwFlags);
void __RPC_STUB IAMMultiMediaStream_OpenFile_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_OpenMoniker_Proxy(
    IAMMultiMediaStream* This,
    IBindCtx* pCtx,
    IMoniker* pMoniker,
    DWORD dwFlags);
void __RPC_STUB IAMMultiMediaStream_OpenMoniker_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMultiMediaStream_Render_Proxy(
    IAMMultiMediaStream* This,
    DWORD dwFlags);
void __RPC_STUB IAMMultiMediaStream_Render_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAMMultiMediaStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMMediaStream interface
 */
#ifndef __IAMMediaStream_INTERFACE_DEFINED__
#define __IAMMediaStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMMediaStream, 0xbebe595d, 0x9a6f, 0x11d0, 0x8f,0xde, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IAMMediaStream : public IMediaStream
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IUnknown* pSourceObject,
        DWORD dwFlags,
        REFMSPID PurposeId,
        const STREAM_TYPE StreamType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetState(
        FILTER_STATE State) = 0;

    virtual HRESULT STDMETHODCALLTYPE JoinAMMultiMediaStream(
        IAMMultiMediaStream* pAMMultiMediaStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE JoinFilter(
        IMediaStreamFilter* pMediaStreamFilter) = 0;

    virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph(
        IFilterGraph* pFilterGraph) = 0;

};
#else
typedef struct IAMMediaStreamVtbl IAMMediaStreamVtbl;
struct IAMMediaStream {
    const IAMMediaStreamVtbl* lpVtbl;
};
struct IAMMediaStreamVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMediaStream methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMultiMediaStream)(
        IAMMediaStream* This,
        IMultiMediaStream** ppMultiMediaStream);

    HRESULT (STDMETHODCALLTYPE *GetInformation)(
        IAMMediaStream* This,
        MSPID* pPurposeId,
        STREAM_TYPE* pType);

    HRESULT (STDMETHODCALLTYPE *SetSameFormat)(
        IAMMediaStream* This,
        IMediaStream* pStreamThatHasDesiredFormat,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *AllocateSample)(
        IAMMediaStream* This,
        DWORD dwFlags,
        IStreamSample** ppSample);

    HRESULT (STDMETHODCALLTYPE *CreateSharedSample)(
        IAMMediaStream* This,
        IStreamSample* pExistingSample,
        DWORD dwFlags,
        IStreamSample** ppNewSample);

    HRESULT (STDMETHODCALLTYPE *SendEndOfStream)(
        IAMMediaStream* This,
        DWORD dwFlags);

    /*** IAMMediaStream methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IAMMediaStream* This,
        IUnknown* pSourceObject,
        DWORD dwFlags,
        REFMSPID PurposeId,
        const STREAM_TYPE StreamType);

    HRESULT (STDMETHODCALLTYPE *SetState)(
        IAMMediaStream* This,
        FILTER_STATE State);

    HRESULT (STDMETHODCALLTYPE *JoinAMMultiMediaStream)(
        IAMMediaStream* This,
        IAMMultiMediaStream* pAMMultiMediaStream);

    HRESULT (STDMETHODCALLTYPE *JoinFilter)(
        IAMMediaStream* This,
        IMediaStreamFilter* pMediaStreamFilter);

    HRESULT (STDMETHODCALLTYPE *JoinFilterGraph)(
        IAMMediaStream* This,
        IFilterGraph* pFilterGraph);

};

/*** IUnknown methods ***/
#define IAMMediaStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IAMMediaStream_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IAMMediaStream_Release(p) (p)->lpVtbl->Release(p)
/*** IMediaStream methods ***/
#define IAMMediaStream_GetMultiMediaStream(p,a) (p)->lpVtbl->GetMultiMediaStream(p,a)
#define IAMMediaStream_GetInformation(p,a,b) (p)->lpVtbl->GetInformation(p,a,b)
#define IAMMediaStream_SetSameFormat(p,a,b) (p)->lpVtbl->SetSameFormat(p,a,b)
#define IAMMediaStream_AllocateSample(p,a,b) (p)->lpVtbl->AllocateSample(p,a,b)
#define IAMMediaStream_CreateSharedSample(p,a,b,c) (p)->lpVtbl->CreateSharedSample(p,a,b,c)
#define IAMMediaStream_SendEndOfStream(p,a) (p)->lpVtbl->SendEndOfStream(p,a)
/*** IAMMediaStream methods ***/
#define IAMMediaStream_Initialize(p,a,b,c,d) (p)->lpVtbl->Initialize(p,a,b,c,d)
#define IAMMediaStream_SetState(p,a) (p)->lpVtbl->SetState(p,a)
#define IAMMediaStream_JoinAMMultiMediaStream(p,a) (p)->lpVtbl->JoinAMMultiMediaStream(p,a)
#define IAMMediaStream_JoinFilter(p,a) (p)->lpVtbl->JoinFilter(p,a)
#define IAMMediaStream_JoinFilterGraph(p,a) (p)->lpVtbl->JoinFilterGraph(p,a)

#endif

#define IAMMediaStream_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMediaStream methods ***/ \
    STDMETHOD_(HRESULT,GetMultiMediaStream)(THIS_ IMultiMediaStream** ppMultiMediaStream) PURE; \
    STDMETHOD_(HRESULT,GetInformation)(THIS_ MSPID* pPurposeId, STREAM_TYPE* pType) PURE; \
    STDMETHOD_(HRESULT,SetSameFormat)(THIS_ IMediaStream* pStreamThatHasDesiredFormat, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,AllocateSample)(THIS_ DWORD dwFlags, IStreamSample** ppSample) PURE; \
    STDMETHOD_(HRESULT,CreateSharedSample)(THIS_ IStreamSample* pExistingSample, DWORD dwFlags, IStreamSample** ppNewSample) PURE; \
    STDMETHOD_(HRESULT,SendEndOfStream)(THIS_ DWORD dwFlags) PURE; \
    /*** IAMMediaStream methods ***/ \
    STDMETHOD_(HRESULT,Initialize)(THIS_ IUnknown* pSourceObject, DWORD dwFlags, REFMSPID PurposeId, const STREAM_TYPE StreamType) PURE; \
    STDMETHOD_(HRESULT,SetState)(THIS_ FILTER_STATE State) PURE; \
    STDMETHOD_(HRESULT,JoinAMMultiMediaStream)(THIS_ IAMMultiMediaStream* pAMMultiMediaStream) PURE; \
    STDMETHOD_(HRESULT,JoinFilter)(THIS_ IMediaStreamFilter* pMediaStreamFilter) PURE; \
    STDMETHOD_(HRESULT,JoinFilterGraph)(THIS_ IFilterGraph* pFilterGraph) PURE;

HRESULT CALLBACK IAMMediaStream_Initialize_Proxy(
    IAMMediaStream* This,
    IUnknown* pSourceObject,
    DWORD dwFlags,
    REFMSPID PurposeId,
    const STREAM_TYPE StreamType);
void __RPC_STUB IAMMediaStream_Initialize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaStream_SetState_Proxy(
    IAMMediaStream* This,
    FILTER_STATE State);
void __RPC_STUB IAMMediaStream_SetState_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaStream_JoinAMMultiMediaStream_Proxy(
    IAMMediaStream* This,
    IAMMultiMediaStream* pAMMultiMediaStream);
void __RPC_STUB IAMMediaStream_JoinAMMultiMediaStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaStream_JoinFilter_Proxy(
    IAMMediaStream* This,
    IMediaStreamFilter* pMediaStreamFilter);
void __RPC_STUB IAMMediaStream_JoinFilter_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaStream_JoinFilterGraph_Proxy(
    IAMMediaStream* This,
    IFilterGraph* pFilterGraph);
void __RPC_STUB IAMMediaStream_JoinFilterGraph_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAMMediaStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMediaStreamFilter interface
 */
#ifndef __IMediaStreamFilter_INTERFACE_DEFINED__
#define __IMediaStreamFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMediaStreamFilter, 0xbebe595e, 0x9a6f, 0x11d0, 0x8f,0xde, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IMediaStreamFilter : public IBaseFilter
{
    virtual HRESULT STDMETHODCALLTYPE AddMediaStream(
        IAMMediaStream* pAMMediaStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaStream(
        REFMSPID idPurpose,
        IMediaStream** ppMediaStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumMediaStreams(
        long Index,
        IMediaStream** ppMediaStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SupportSeeking(
        BOOL bRenderer) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReferenceTimeToStreamTime(
        REFERENCE_TIME* pTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentStreamTime(
        REFERENCE_TIME* pCurrentStreamTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitUntil(
        REFERENCE_TIME WaitStreamTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        BOOL bCancelEOS) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndOfStream(
        ) = 0;

};
#else
typedef struct IMediaStreamFilterVtbl IMediaStreamFilterVtbl;
struct IMediaStreamFilter {
    const IMediaStreamFilterVtbl* lpVtbl;
};
struct IMediaStreamFilterVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IMediaStreamFilter* This,
        CLSID* pClassID);

    /*** IMediaFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *Stop)(
        IMediaStreamFilter* This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IMediaStreamFilter* This);

    HRESULT (STDMETHODCALLTYPE *Run)(
        IMediaStreamFilter* This,
        REFERENCE_TIME tStart);

    HRESULT (STDMETHODCALLTYPE *GetState)(
        IMediaStreamFilter* This,
        DWORD dwMilliSecsTimeout,
        FILTER_STATE* State);

    HRESULT (STDMETHODCALLTYPE *SetSyncSource)(
        IMediaStreamFilter* This,
        IReferenceClock* pClock);

    HRESULT (STDMETHODCALLTYPE *GetSyncSource)(
        IMediaStreamFilter* This,
        IReferenceClock** pClock);

    /*** IBaseFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *EnumPins)(
        IMediaStreamFilter* This,
        IEnumPins** ppEnum);

    HRESULT (STDMETHODCALLTYPE *FindPin)(
        IMediaStreamFilter* This,
        LPCWSTR Id,
        IPin** ppPin);

    HRESULT (STDMETHODCALLTYPE *QueryFilterInfo)(
        IMediaStreamFilter* This,
        FILTER_INFO* pInfo);

    HRESULT (STDMETHODCALLTYPE *JoinFilterGraph)(
        IMediaStreamFilter* This,
        IFilterGraph* pGraph,
        LPCWSTR pName);

    HRESULT (STDMETHODCALLTYPE *QueryVendorInfo)(
        IMediaStreamFilter* This,
        LPWSTR* pVendorInfo);

    /*** IMediaStreamFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *AddMediaStream)(
        IMediaStreamFilter* This,
        IAMMediaStream* pAMMediaStream);

    HRESULT (STDMETHODCALLTYPE *GetMediaStream)(
        IMediaStreamFilter* This,
        REFMSPID idPurpose,
        IMediaStream** ppMediaStream);

    HRESULT (STDMETHODCALLTYPE *EnumMediaStreams)(
        IMediaStreamFilter* This,
        long Index,
        IMediaStream** ppMediaStream);

    HRESULT (STDMETHODCALLTYPE *SupportSeeking)(
        IMediaStreamFilter* This,
        BOOL bRenderer);

    HRESULT (STDMETHODCALLTYPE *ReferenceTimeToStreamTime)(
        IMediaStreamFilter* This,
        REFERENCE_TIME* pTime);

    HRESULT (STDMETHODCALLTYPE *GetCurrentStreamTime)(
        IMediaStreamFilter* This,
        REFERENCE_TIME* pCurrentStreamTime);

    HRESULT (STDMETHODCALLTYPE *WaitUntil)(
        IMediaStreamFilter* This,
        REFERENCE_TIME WaitStreamTime);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IMediaStreamFilter* This,
        BOOL bCancelEOS);

    HRESULT (STDMETHODCALLTYPE *EndOfStream)(
        IMediaStreamFilter* This);

};

/*** IUnknown methods ***/
#define IMediaStreamFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IMediaStreamFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IMediaStreamFilter_Release(p) (p)->lpVtbl->Release(p)
/*** IPersist methods ***/
#define IMediaStreamFilter_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
/*** IMediaFilter methods ***/
#define IMediaStreamFilter_Stop(p) (p)->lpVtbl->Stop(p)
#define IMediaStreamFilter_Pause(p) (p)->lpVtbl->Pause(p)
#define IMediaStreamFilter_Run(p,a) (p)->lpVtbl->Run(p,a)
#define IMediaStreamFilter_GetState(p,a,b) (p)->lpVtbl->GetState(p,a,b)
#define IMediaStreamFilter_SetSyncSource(p,a) (p)->lpVtbl->SetSyncSource(p,a)
#define IMediaStreamFilter_GetSyncSource(p,a) (p)->lpVtbl->GetSyncSource(p,a)
/*** IBaseFilter methods ***/
#define IMediaStreamFilter_EnumPins(p,a) (p)->lpVtbl->EnumPins(p,a)
#define IMediaStreamFilter_FindPin(p,a,b) (p)->lpVtbl->FindPin(p,a,b)
#define IMediaStreamFilter_QueryFilterInfo(p,a) (p)->lpVtbl->QueryFilterInfo(p,a)
#define IMediaStreamFilter_JoinFilterGraph(p,a,b) (p)->lpVtbl->JoinFilterGraph(p,a,b)
#define IMediaStreamFilter_QueryVendorInfo(p,a) (p)->lpVtbl->QueryVendorInfo(p,a)
/*** IMediaStreamFilter methods ***/
#define IMediaStreamFilter_AddMediaStream(p,a) (p)->lpVtbl->AddMediaStream(p,a)
#define IMediaStreamFilter_GetMediaStream(p,a,b) (p)->lpVtbl->GetMediaStream(p,a,b)
#define IMediaStreamFilter_EnumMediaStreams(p,a,b) (p)->lpVtbl->EnumMediaStreams(p,a,b)
#define IMediaStreamFilter_SupportSeeking(p,a) (p)->lpVtbl->SupportSeeking(p,a)
#define IMediaStreamFilter_ReferenceTimeToStreamTime(p,a) (p)->lpVtbl->ReferenceTimeToStreamTime(p,a)
#define IMediaStreamFilter_GetCurrentStreamTime(p,a) (p)->lpVtbl->GetCurrentStreamTime(p,a)
#define IMediaStreamFilter_WaitUntil(p,a) (p)->lpVtbl->WaitUntil(p,a)
#define IMediaStreamFilter_Flush(p,a) (p)->lpVtbl->Flush(p,a)
#define IMediaStreamFilter_EndOfStream(p) (p)->lpVtbl->EndOfStream(p)

#endif

#define IMediaStreamFilter_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IPersist methods ***/ \
    STDMETHOD_(HRESULT,GetClassID)(THIS_ CLSID* pClassID) PURE; \
    /*** IMediaFilter methods ***/ \
    STDMETHOD_(HRESULT,Stop)(THIS) PURE; \
    STDMETHOD_(HRESULT,Pause)(THIS) PURE; \
    STDMETHOD_(HRESULT,Run)(THIS_ REFERENCE_TIME tStart) PURE; \
    STDMETHOD_(HRESULT,GetState)(THIS_ DWORD dwMilliSecsTimeout, FILTER_STATE* State) PURE; \
    STDMETHOD_(HRESULT,SetSyncSource)(THIS_ IReferenceClock* pClock) PURE; \
    STDMETHOD_(HRESULT,GetSyncSource)(THIS_ IReferenceClock** pClock) PURE; \
    /*** IBaseFilter methods ***/ \
    STDMETHOD_(HRESULT,EnumPins)(THIS_ IEnumPins** ppEnum) PURE; \
    STDMETHOD_(HRESULT,FindPin)(THIS_ LPCWSTR Id, IPin** ppPin) PURE; \
    STDMETHOD_(HRESULT,QueryFilterInfo)(THIS_ FILTER_INFO* pInfo) PURE; \
    STDMETHOD_(HRESULT,JoinFilterGraph)(THIS_ IFilterGraph* pGraph, LPCWSTR pName) PURE; \
    STDMETHOD_(HRESULT,QueryVendorInfo)(THIS_ LPWSTR* pVendorInfo) PURE; \
    /*** IMediaStreamFilter methods ***/ \
    STDMETHOD_(HRESULT,AddMediaStream)(THIS_ IAMMediaStream* pAMMediaStream) PURE; \
    STDMETHOD_(HRESULT,GetMediaStream)(THIS_ REFMSPID idPurpose, IMediaStream** ppMediaStream) PURE; \
    STDMETHOD_(HRESULT,EnumMediaStreams)(THIS_ long Index, IMediaStream** ppMediaStream) PURE; \
    STDMETHOD_(HRESULT,SupportSeeking)(THIS_ BOOL bRenderer) PURE; \
    STDMETHOD_(HRESULT,ReferenceTimeToStreamTime)(THIS_ REFERENCE_TIME* pTime) PURE; \
    STDMETHOD_(HRESULT,GetCurrentStreamTime)(THIS_ REFERENCE_TIME* pCurrentStreamTime) PURE; \
    STDMETHOD_(HRESULT,WaitUntil)(THIS_ REFERENCE_TIME WaitStreamTime) PURE; \
    STDMETHOD_(HRESULT,Flush)(THIS_ BOOL bCancelEOS) PURE; \
    STDMETHOD_(HRESULT,EndOfStream)(THIS) PURE;

HRESULT CALLBACK IMediaStreamFilter_AddMediaStream_Proxy(
    IMediaStreamFilter* This,
    IAMMediaStream* pAMMediaStream);
void __RPC_STUB IMediaStreamFilter_AddMediaStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_GetMediaStream_Proxy(
    IMediaStreamFilter* This,
    REFMSPID idPurpose,
    IMediaStream** ppMediaStream);
void __RPC_STUB IMediaStreamFilter_GetMediaStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_EnumMediaStreams_Proxy(
    IMediaStreamFilter* This,
    long Index,
    IMediaStream** ppMediaStream);
void __RPC_STUB IMediaStreamFilter_EnumMediaStreams_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_SupportSeeking_Proxy(
    IMediaStreamFilter* This,
    BOOL bRenderer);
void __RPC_STUB IMediaStreamFilter_SupportSeeking_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_ReferenceTimeToStreamTime_Proxy(
    IMediaStreamFilter* This,
    REFERENCE_TIME* pTime);
void __RPC_STUB IMediaStreamFilter_ReferenceTimeToStreamTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_GetCurrentStreamTime_Proxy(
    IMediaStreamFilter* This,
    REFERENCE_TIME* pCurrentStreamTime);
void __RPC_STUB IMediaStreamFilter_GetCurrentStreamTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_WaitUntil_Proxy(
    IMediaStreamFilter* This,
    REFERENCE_TIME WaitStreamTime);
void __RPC_STUB IMediaStreamFilter_WaitUntil_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_Flush_Proxy(
    IMediaStreamFilter* This,
    BOOL bCancelEOS);
void __RPC_STUB IMediaStreamFilter_Flush_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IMediaStreamFilter_EndOfStream_Proxy(
    IMediaStreamFilter* This);
void __RPC_STUB IMediaStreamFilter_EndOfStream_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMediaStreamFilter_INTERFACE_DEFINED__ */

#ifndef __IDirectDrawMediaSampleAllocator_FWD_DEFINED__
#define __IDirectDrawMediaSampleAllocator_FWD_DEFINED__
typedef struct IDirectDrawMediaSampleAllocator IDirectDrawMediaSampleAllocator;
#endif

/*****************************************************************************
 * IDirectDrawMediaSampleAllocator interface
 */
#ifndef __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__
#define __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectDrawMediaSampleAllocator, 0xab6b4afc, 0xf6e4, 0x11d0, 0x90,0x0d, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IDirectDrawMediaSampleAllocator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDirectDraw(
        IDirectDraw** ppDirectDraw) = 0;

};
#else
typedef struct IDirectDrawMediaSampleAllocatorVtbl IDirectDrawMediaSampleAllocatorVtbl;
struct IDirectDrawMediaSampleAllocator {
    const IDirectDrawMediaSampleAllocatorVtbl* lpVtbl;
};
struct IDirectDrawMediaSampleAllocatorVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IDirectDrawMediaSampleAllocator methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDirectDraw)(
        IDirectDrawMediaSampleAllocator* This,
        IDirectDraw** ppDirectDraw);

};

/*** IUnknown methods ***/
#define IDirectDrawMediaSampleAllocator_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectDrawMediaSampleAllocator_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectDrawMediaSampleAllocator_Release(p) (p)->lpVtbl->Release(p)
/*** IDirectDrawMediaSampleAllocator methods ***/
#define IDirectDrawMediaSampleAllocator_GetDirectDraw(p,a) (p)->lpVtbl->GetDirectDraw(p,a)

#endif

#define IDirectDrawMediaSampleAllocator_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDirectDrawMediaSampleAllocator methods ***/ \
    STDMETHOD_(HRESULT,GetDirectDraw)(THIS_ IDirectDraw** ppDirectDraw) PURE;

HRESULT CALLBACK IDirectDrawMediaSampleAllocator_GetDirectDraw_Proxy(
    IDirectDrawMediaSampleAllocator* This,
    IDirectDraw** ppDirectDraw);
void __RPC_STUB IDirectDrawMediaSampleAllocator_GetDirectDraw_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDirectDrawMediaSampleAllocator_INTERFACE_DEFINED__ */

#ifndef __IDirectDrawMediaSample_FWD_DEFINED__
#define __IDirectDrawMediaSample_FWD_DEFINED__
typedef struct IDirectDrawMediaSample IDirectDrawMediaSample;
#endif

/*****************************************************************************
 * IDirectDrawMediaSample interface
 */
#ifndef __IDirectDrawMediaSample_INTERFACE_DEFINED__
#define __IDirectDrawMediaSample_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectDrawMediaSample, 0xab6b4afe, 0xf6e4, 0x11d0, 0x90,0x0d, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IDirectDrawMediaSample : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSurfaceAndReleaseLock(
        IDirectDrawSurface** ppDirectDrawSurface,
        RECT* pRect) = 0;

    virtual HRESULT STDMETHODCALLTYPE LockMediaSamplePointer(
        ) = 0;

};
#else
typedef struct IDirectDrawMediaSampleVtbl IDirectDrawMediaSampleVtbl;
struct IDirectDrawMediaSample {
    const IDirectDrawMediaSampleVtbl* lpVtbl;
};
struct IDirectDrawMediaSampleVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IDirectDrawMediaSample methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSurfaceAndReleaseLock)(
        IDirectDrawMediaSample* This,
        IDirectDrawSurface** ppDirectDrawSurface,
        RECT* pRect);

    HRESULT (STDMETHODCALLTYPE *LockMediaSamplePointer)(
        IDirectDrawMediaSample* This);

};

/*** IUnknown methods ***/
#define IDirectDrawMediaSample_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IDirectDrawMediaSample_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IDirectDrawMediaSample_Release(p) (p)->lpVtbl->Release(p)
/*** IDirectDrawMediaSample methods ***/
#define IDirectDrawMediaSample_GetSurfaceAndReleaseLock(p,a,b) (p)->lpVtbl->GetSurfaceAndReleaseLock(p,a,b)
#define IDirectDrawMediaSample_LockMediaSamplePointer(p) (p)->lpVtbl->LockMediaSamplePointer(p)

#endif

#define IDirectDrawMediaSample_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IDirectDrawMediaSample methods ***/ \
    STDMETHOD_(HRESULT,GetSurfaceAndReleaseLock)(THIS_ IDirectDrawSurface** ppDirectDrawSurface, RECT* pRect) PURE; \
    STDMETHOD_(HRESULT,LockMediaSamplePointer)(THIS) PURE;

HRESULT CALLBACK IDirectDrawMediaSample_GetSurfaceAndReleaseLock_Proxy(
    IDirectDrawMediaSample* This,
    IDirectDrawSurface** ppDirectDrawSurface,
    RECT* pRect);
void __RPC_STUB IDirectDrawMediaSample_GetSurfaceAndReleaseLock_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IDirectDrawMediaSample_LockMediaSamplePointer_Proxy(
    IDirectDrawMediaSample* This);
void __RPC_STUB IDirectDrawMediaSample_LockMediaSamplePointer_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDirectDrawMediaSample_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMMediaTypeStream interface
 */
#ifndef __IAMMediaTypeStream_INTERFACE_DEFINED__
#define __IAMMediaTypeStream_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMMediaTypeStream, 0xab6b4afa, 0xf6e4, 0x11d0, 0x90,0x0d, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IAMMediaTypeStream : public IMediaStream
{
    virtual HRESULT STDMETHODCALLTYPE GetFormat(
        AM_MEDIA_TYPE* pMediaType,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFormat(
        AM_MEDIA_TYPE* pMediaType,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSample(
        long lSampleSize,
        BYTE* pbBuffer,
        DWORD dwFlags,
        IUnknown* pUnkOuter,
        IAMMediaTypeSample** ppAMMediaTypeSample) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStreamAllocatorRequirements(
        ALLOCATOR_PROPERTIES* pProps) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStreamAllocatorRequirements(
        ALLOCATOR_PROPERTIES* pProps) = 0;

};
#else
typedef struct IAMMediaTypeStreamVtbl IAMMediaTypeStreamVtbl;
struct IAMMediaTypeStream {
    const IAMMediaTypeStreamVtbl* lpVtbl;
};
struct IAMMediaTypeStreamVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IMediaStream methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMultiMediaStream)(
        IAMMediaTypeStream* This,
        IMultiMediaStream** ppMultiMediaStream);

    HRESULT (STDMETHODCALLTYPE *GetInformation)(
        IAMMediaTypeStream* This,
        MSPID* pPurposeId,
        STREAM_TYPE* pType);

    HRESULT (STDMETHODCALLTYPE *SetSameFormat)(
        IAMMediaTypeStream* This,
        IMediaStream* pStreamThatHasDesiredFormat,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *AllocateSample)(
        IAMMediaTypeStream* This,
        DWORD dwFlags,
        IStreamSample** ppSample);

    HRESULT (STDMETHODCALLTYPE *CreateSharedSample)(
        IAMMediaTypeStream* This,
        IStreamSample* pExistingSample,
        DWORD dwFlags,
        IStreamSample** ppNewSample);

    HRESULT (STDMETHODCALLTYPE *SendEndOfStream)(
        IAMMediaTypeStream* This,
        DWORD dwFlags);

    /*** IAMMediaTypeStream methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFormat)(
        IAMMediaTypeStream* This,
        AM_MEDIA_TYPE* pMediaType,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *SetFormat)(
        IAMMediaTypeStream* This,
        AM_MEDIA_TYPE* pMediaType,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *CreateSample)(
        IAMMediaTypeStream* This,
        long lSampleSize,
        BYTE* pbBuffer,
        DWORD dwFlags,
        IUnknown* pUnkOuter,
        IAMMediaTypeSample** ppAMMediaTypeSample);

    HRESULT (STDMETHODCALLTYPE *GetStreamAllocatorRequirements)(
        IAMMediaTypeStream* This,
        ALLOCATOR_PROPERTIES* pProps);

    HRESULT (STDMETHODCALLTYPE *SetStreamAllocatorRequirements)(
        IAMMediaTypeStream* This,
        ALLOCATOR_PROPERTIES* pProps);

};

/*** IUnknown methods ***/
#define IAMMediaTypeStream_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IAMMediaTypeStream_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IAMMediaTypeStream_Release(p) (p)->lpVtbl->Release(p)
/*** IMediaStream methods ***/
#define IAMMediaTypeStream_GetMultiMediaStream(p,a) (p)->lpVtbl->GetMultiMediaStream(p,a)
#define IAMMediaTypeStream_GetInformation(p,a,b) (p)->lpVtbl->GetInformation(p,a,b)
#define IAMMediaTypeStream_SetSameFormat(p,a,b) (p)->lpVtbl->SetSameFormat(p,a,b)
#define IAMMediaTypeStream_AllocateSample(p,a,b) (p)->lpVtbl->AllocateSample(p,a,b)
#define IAMMediaTypeStream_CreateSharedSample(p,a,b,c) (p)->lpVtbl->CreateSharedSample(p,a,b,c)
#define IAMMediaTypeStream_SendEndOfStream(p,a) (p)->lpVtbl->SendEndOfStream(p,a)
/*** IAMMediaTypeStream methods ***/
#define IAMMediaTypeStream_GetFormat(p,a,b) (p)->lpVtbl->GetFormat(p,a,b)
#define IAMMediaTypeStream_SetFormat(p,a,b) (p)->lpVtbl->SetFormat(p,a,b)
#define IAMMediaTypeStream_CreateSample(p,a,b,c,d,e) (p)->lpVtbl->CreateSample(p,a,b,c,d,e)
#define IAMMediaTypeStream_GetStreamAllocatorRequirements(p,a) (p)->lpVtbl->GetStreamAllocatorRequirements(p,a)
#define IAMMediaTypeStream_SetStreamAllocatorRequirements(p,a) (p)->lpVtbl->SetStreamAllocatorRequirements(p,a)

#endif

#define IAMMediaTypeStream_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IMediaStream methods ***/ \
    STDMETHOD_(HRESULT,GetMultiMediaStream)(THIS_ IMultiMediaStream** ppMultiMediaStream) PURE; \
    STDMETHOD_(HRESULT,GetInformation)(THIS_ MSPID* pPurposeId, STREAM_TYPE* pType) PURE; \
    STDMETHOD_(HRESULT,SetSameFormat)(THIS_ IMediaStream* pStreamThatHasDesiredFormat, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,AllocateSample)(THIS_ DWORD dwFlags, IStreamSample** ppSample) PURE; \
    STDMETHOD_(HRESULT,CreateSharedSample)(THIS_ IStreamSample* pExistingSample, DWORD dwFlags, IStreamSample** ppNewSample) PURE; \
    STDMETHOD_(HRESULT,SendEndOfStream)(THIS_ DWORD dwFlags) PURE; \
    /*** IAMMediaTypeStream methods ***/ \
    STDMETHOD_(HRESULT,GetFormat)(THIS_ AM_MEDIA_TYPE* pMediaType, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,SetFormat)(THIS_ AM_MEDIA_TYPE* pMediaType, DWORD dwFlags) PURE; \
    STDMETHOD_(HRESULT,CreateSample)(THIS_ long lSampleSize, BYTE* pbBuffer, DWORD dwFlags, IUnknown* pUnkOuter, IAMMediaTypeSample** ppAMMediaTypeSample) PURE; \
    STDMETHOD_(HRESULT,GetStreamAllocatorRequirements)(THIS_ ALLOCATOR_PROPERTIES* pProps) PURE; \
    STDMETHOD_(HRESULT,SetStreamAllocatorRequirements)(THIS_ ALLOCATOR_PROPERTIES* pProps) PURE;

HRESULT CALLBACK IAMMediaTypeStream_GetFormat_Proxy(
    IAMMediaTypeStream* This,
    AM_MEDIA_TYPE* pMediaType,
    DWORD dwFlags);
void __RPC_STUB IAMMediaTypeStream_GetFormat_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeStream_SetFormat_Proxy(
    IAMMediaTypeStream* This,
    AM_MEDIA_TYPE* pMediaType,
    DWORD dwFlags);
void __RPC_STUB IAMMediaTypeStream_SetFormat_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeStream_CreateSample_Proxy(
    IAMMediaTypeStream* This,
    long lSampleSize,
    BYTE* pbBuffer,
    DWORD dwFlags,
    IUnknown* pUnkOuter,
    IAMMediaTypeSample** ppAMMediaTypeSample);
void __RPC_STUB IAMMediaTypeStream_CreateSample_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeStream_GetStreamAllocatorRequirements_Proxy(
    IAMMediaTypeStream* This,
    ALLOCATOR_PROPERTIES* pProps);
void __RPC_STUB IAMMediaTypeStream_GetStreamAllocatorRequirements_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeStream_SetStreamAllocatorRequirements_Proxy(
    IAMMediaTypeStream* This,
    ALLOCATOR_PROPERTIES* pProps);
void __RPC_STUB IAMMediaTypeStream_SetStreamAllocatorRequirements_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAMMediaTypeStream_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAMMediaTypeSample interface
 */
#ifndef __IAMMediaTypeSample_INTERFACE_DEFINED__
#define __IAMMediaTypeSample_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAMMediaTypeSample, 0xab6b4afb, 0xf6e4, 0x11d0, 0x90,0x0d, 0x00,0xc0,0x4f,0xd9,0x18,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
struct IAMMediaTypeSample : public IStreamSample
{
    virtual HRESULT STDMETHODCALLTYPE SetPointer(
        BYTE* pBuffer,
        long lSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPointer(
        BYTE** ppBuffer) = 0;

    virtual long STDMETHODCALLTYPE GetSize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTime(
        REFERENCE_TIME* pTimeStart,
        REFERENCE_TIME* pTimeEnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTime(
        REFERENCE_TIME* pTimeStart,
        REFERENCE_TIME* pTimeEnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsSyncPoint(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSyncPoint(
        BOOL bIsSyncPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPreroll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPreroll(
        BOOL bIsPreroll) = 0;

    virtual long STDMETHODCALLTYPE GetActualDataLength(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetActualDataLength(
        long Len) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE IsDiscontinuity(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDiscontinuity(
        BOOL bDiscontinuity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMediaTime(
        LONGLONG* pTimeStart,
        LONGLONG* pTimeEnd) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMediaTime(
        LONGLONG* pTimeStart,
        LONGLONG* pTimeEnd) = 0;

};
#else
typedef struct IAMMediaTypeSampleVtbl IAMMediaTypeSampleVtbl;
struct IAMMediaTypeSample {
    const IAMMediaTypeSampleVtbl* lpVtbl;
};
struct IAMMediaTypeSampleVtbl {
    ICOM_MSVTABLE_COMPAT_FIELDS

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

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

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

    /*** IStreamSample methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMediaStream)(
        IAMMediaTypeSample* This,
        IMediaStream** ppMediaStream);

    HRESULT (STDMETHODCALLTYPE *GetSampleTimes)(
        IAMMediaTypeSample* This,
        STREAM_TIME* pStartTime,
        STREAM_TIME* pEndTime,
        STREAM_TIME* pCurrentTime);

    HRESULT (STDMETHODCALLTYPE *SetSampleTimes)(
        IAMMediaTypeSample* This,
        const STREAM_TIME* pStartTime,
        const STREAM_TIME* pEndTime);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IAMMediaTypeSample* This,
        DWORD dwFlags,
        HANDLE hEvent,
        PAPCFUNC pfnAPC,
        DWORD dwAPCData);

    HRESULT (STDMETHODCALLTYPE *CompletionStatus)(
        IAMMediaTypeSample* This,
        DWORD dwFlags,
        DWORD dwMilliseconds);

    /*** IAMMediaTypeSample methods ***/
    HRESULT (STDMETHODCALLTYPE *SetPointer)(
        IAMMediaTypeSample* This,
        BYTE* pBuffer,
        long lSize);

    HRESULT (STDMETHODCALLTYPE *GetPointer)(
        IAMMediaTypeSample* This,
        BYTE** ppBuffer);

    long (STDMETHODCALLTYPE *GetSize)(
        IAMMediaTypeSample* This);

    HRESULT (STDMETHODCALLTYPE *GetTime)(
        IAMMediaTypeSample* This,
        REFERENCE_TIME* pTimeStart,
        REFERENCE_TIME* pTimeEnd);

    HRESULT (STDMETHODCALLTYPE *SetTime)(
        IAMMediaTypeSample* This,
        REFERENCE_TIME* pTimeStart,
        REFERENCE_TIME* pTimeEnd);

    HRESULT (STDMETHODCALLTYPE *IsSyncPoint)(
        IAMMediaTypeSample* This);

    HRESULT (STDMETHODCALLTYPE *SetSyncPoint)(
        IAMMediaTypeSample* This,
        BOOL bIsSyncPoint);

    HRESULT (STDMETHODCALLTYPE *IsPreroll)(
        IAMMediaTypeSample* This);

    HRESULT (STDMETHODCALLTYPE *SetPreroll)(
        IAMMediaTypeSample* This,
        BOOL bIsPreroll);

    long (STDMETHODCALLTYPE *GetActualDataLength)(
        IAMMediaTypeSample* This);

    HRESULT (STDMETHODCALLTYPE *SetActualDataLength)(
        IAMMediaTypeSample* This,
        long Len);

    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
        IAMMediaTypeSample* This,
        AM_MEDIA_TYPE** ppMediaType);

    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
        IAMMediaTypeSample* This,
        AM_MEDIA_TYPE* pMediaType);

    HRESULT (STDMETHODCALLTYPE *IsDiscontinuity)(
        IAMMediaTypeSample* This);

    HRESULT (STDMETHODCALLTYPE *SetDiscontinuity)(
        IAMMediaTypeSample* This,
        BOOL bDiscontinuity);

    HRESULT (STDMETHODCALLTYPE *GetMediaTime)(
        IAMMediaTypeSample* This,
        LONGLONG* pTimeStart,
        LONGLONG* pTimeEnd);

    HRESULT (STDMETHODCALLTYPE *SetMediaTime)(
        IAMMediaTypeSample* This,
        LONGLONG* pTimeStart,
        LONGLONG* pTimeEnd);

};

/*** IUnknown methods ***/
#define IAMMediaTypeSample_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IAMMediaTypeSample_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IAMMediaTypeSample_Release(p) (p)->lpVtbl->Release(p)
/*** IStreamSample methods ***/
#define IAMMediaTypeSample_GetMediaStream(p,a) (p)->lpVtbl->GetMediaStream(p,a)
#define IAMMediaTypeSample_GetSampleTimes(p,a,b,c) (p)->lpVtbl->GetSampleTimes(p,a,b,c)
#define IAMMediaTypeSample_SetSampleTimes(p,a,b) (p)->lpVtbl->SetSampleTimes(p,a,b)
#define IAMMediaTypeSample_Update(p,a,b,c,d) (p)->lpVtbl->Update(p,a,b,c,d)
#define IAMMediaTypeSample_CompletionStatus(p,a,b) (p)->lpVtbl->CompletionStatus(p,a,b)
/*** IAMMediaTypeSample methods ***/
#define IAMMediaTypeSample_SetPointer(p,a,b) (p)->lpVtbl->SetPointer(p,a,b)
#define IAMMediaTypeSample_GetPointer(p,a) (p)->lpVtbl->GetPointer(p,a)
#define IAMMediaTypeSample_GetSize(p) (p)->lpVtbl->GetSize(p)
#define IAMMediaTypeSample_GetTime(p,a,b) (p)->lpVtbl->GetTime(p,a,b)
#define IAMMediaTypeSample_SetTime(p,a,b) (p)->lpVtbl->SetTime(p,a,b)
#define IAMMediaTypeSample_IsSyncPoint(p) (p)->lpVtbl->IsSyncPoint(p)
#define IAMMediaTypeSample_SetSyncPoint(p,a) (p)->lpVtbl->SetSyncPoint(p,a)
#define IAMMediaTypeSample_IsPreroll(p) (p)->lpVtbl->IsPreroll(p)
#define IAMMediaTypeSample_SetPreroll(p,a) (p)->lpVtbl->SetPreroll(p,a)
#define IAMMediaTypeSample_GetActualDataLength(p) (p)->lpVtbl->GetActualDataLength(p)
#define IAMMediaTypeSample_SetActualDataLength(p,a) (p)->lpVtbl->SetActualDataLength(p,a)
#define IAMMediaTypeSample_GetMediaType(p,a) (p)->lpVtbl->GetMediaType(p,a)
#define IAMMediaTypeSample_SetMediaType(p,a) (p)->lpVtbl->SetMediaType(p,a)
#define IAMMediaTypeSample_IsDiscontinuity(p) (p)->lpVtbl->IsDiscontinuity(p)
#define IAMMediaTypeSample_SetDiscontinuity(p,a) (p)->lpVtbl->SetDiscontinuity(p,a)
#define IAMMediaTypeSample_GetMediaTime(p,a,b) (p)->lpVtbl->GetMediaTime(p,a,b)
#define IAMMediaTypeSample_SetMediaTime(p,a,b) (p)->lpVtbl->SetMediaTime(p,a,b)

#endif

#define IAMMediaTypeSample_METHODS \
    ICOM_MSVTABLE_COMPAT_FIELDS \
    /*** IUnknown methods ***/ \
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \
    STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
    STDMETHOD_(ULONG,Release)(THIS) PURE; \
    /*** IStreamSample methods ***/ \
    STDMETHOD_(HRESULT,GetMediaStream)(THIS_ IMediaStream** ppMediaStream) PURE; \
    STDMETHOD_(HRESULT,GetSampleTimes)(THIS_ STREAM_TIME* pStartTime, STREAM_TIME* pEndTime, STREAM_TIME* pCurrentTime) PURE; \
    STDMETHOD_(HRESULT,SetSampleTimes)(THIS_ const STREAM_TIME* pStartTime, const STREAM_TIME* pEndTime) PURE; \
    STDMETHOD_(HRESULT,Update)(THIS_ DWORD dwFlags, HANDLE hEvent, PAPCFUNC pfnAPC, DWORD dwAPCData) PURE; \
    STDMETHOD_(HRESULT,CompletionStatus)(THIS_ DWORD dwFlags, DWORD dwMilliseconds) PURE; \
    /*** IAMMediaTypeSample methods ***/ \
    STDMETHOD_(HRESULT,SetPointer)(THIS_ BYTE* pBuffer, long lSize) PURE; \
    STDMETHOD_(HRESULT,GetPointer)(THIS_ BYTE** ppBuffer) PURE; \
    STDMETHOD_(long,GetSize)(THIS) PURE; \
    STDMETHOD_(HRESULT,GetTime)(THIS_ REFERENCE_TIME* pTimeStart, REFERENCE_TIME* pTimeEnd) PURE; \
    STDMETHOD_(HRESULT,SetTime)(THIS_ REFERENCE_TIME* pTimeStart, REFERENCE_TIME* pTimeEnd) PURE; \
    STDMETHOD_(HRESULT,IsSyncPoint)(THIS) PURE; \
    STDMETHOD_(HRESULT,SetSyncPoint)(THIS_ BOOL bIsSyncPoint) PURE; \
    STDMETHOD_(HRESULT,IsPreroll)(THIS) PURE; \
    STDMETHOD_(HRESULT,SetPreroll)(THIS_ BOOL bIsPreroll) PURE; \
    STDMETHOD_(long,GetActualDataLength)(THIS) PURE; \
    STDMETHOD_(HRESULT,SetActualDataLength)(THIS_ long Len) PURE; \
    STDMETHOD_(HRESULT,GetMediaType)(THIS_ AM_MEDIA_TYPE** ppMediaType) PURE; \
    STDMETHOD_(HRESULT,SetMediaType)(THIS_ AM_MEDIA_TYPE* pMediaType) PURE; \
    STDMETHOD_(HRESULT,IsDiscontinuity)(THIS) PURE; \
    STDMETHOD_(HRESULT,SetDiscontinuity)(THIS_ BOOL bDiscontinuity) PURE; \
    STDMETHOD_(HRESULT,GetMediaTime)(THIS_ LONGLONG* pTimeStart, LONGLONG* pTimeEnd) PURE; \
    STDMETHOD_(HRESULT,SetMediaTime)(THIS_ LONGLONG* pTimeStart, LONGLONG* pTimeEnd) PURE;

HRESULT CALLBACK IAMMediaTypeSample_SetPointer_Proxy(
    IAMMediaTypeSample* This,
    BYTE* pBuffer,
    long lSize);
void __RPC_STUB IAMMediaTypeSample_SetPointer_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_GetPointer_Proxy(
    IAMMediaTypeSample* This,
    BYTE** ppBuffer);
void __RPC_STUB IAMMediaTypeSample_GetPointer_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
long CALLBACK IAMMediaTypeSample_GetSize_Proxy(
    IAMMediaTypeSample* This);
void __RPC_STUB IAMMediaTypeSample_GetSize_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_GetTime_Proxy(
    IAMMediaTypeSample* This,
    REFERENCE_TIME* pTimeStart,
    REFERENCE_TIME* pTimeEnd);
void __RPC_STUB IAMMediaTypeSample_GetTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetTime_Proxy(
    IAMMediaTypeSample* This,
    REFERENCE_TIME* pTimeStart,
    REFERENCE_TIME* pTimeEnd);
void __RPC_STUB IAMMediaTypeSample_SetTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_IsSyncPoint_Proxy(
    IAMMediaTypeSample* This);
void __RPC_STUB IAMMediaTypeSample_IsSyncPoint_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetSyncPoint_Proxy(
    IAMMediaTypeSample* This,
    BOOL bIsSyncPoint);
void __RPC_STUB IAMMediaTypeSample_SetSyncPoint_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_IsPreroll_Proxy(
    IAMMediaTypeSample* This);
void __RPC_STUB IAMMediaTypeSample_IsPreroll_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetPreroll_Proxy(
    IAMMediaTypeSample* This,
    BOOL bIsPreroll);
void __RPC_STUB IAMMediaTypeSample_SetPreroll_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
long CALLBACK IAMMediaTypeSample_GetActualDataLength_Proxy(
    IAMMediaTypeSample* This);
void __RPC_STUB IAMMediaTypeSample_GetActualDataLength_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetActualDataLength_Proxy(
    IAMMediaTypeSample* This,
    long Len);
void __RPC_STUB IAMMediaTypeSample_SetActualDataLength_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_GetMediaType_Proxy(
    IAMMediaTypeSample* This,
    AM_MEDIA_TYPE** ppMediaType);
void __RPC_STUB IAMMediaTypeSample_GetMediaType_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetMediaType_Proxy(
    IAMMediaTypeSample* This,
    AM_MEDIA_TYPE* pMediaType);
void __RPC_STUB IAMMediaTypeSample_SetMediaType_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_IsDiscontinuity_Proxy(
    IAMMediaTypeSample* This);
void __RPC_STUB IAMMediaTypeSample_IsDiscontinuity_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetDiscontinuity_Proxy(
    IAMMediaTypeSample* This,
    BOOL bDiscontinuity);
void __RPC_STUB IAMMediaTypeSample_SetDiscontinuity_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_GetMediaTime_Proxy(
    IAMMediaTypeSample* This,
    LONGLONG* pTimeStart,
    LONGLONG* pTimeEnd);
void __RPC_STUB IAMMediaTypeSample_GetMediaTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT CALLBACK IAMMediaTypeSample_SetMediaTime_Proxy(
    IAMMediaTypeSample* This,
    LONGLONG* pTimeStart,
    LONGLONG* pTimeEnd);
void __RPC_STUB IAMMediaTypeSample_SetMediaTime_Stub(
    struct IRpcStubBuffer* This,
    struct IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAMMediaTypeSample_INTERFACE_DEFINED__ */

DEFINE_GUID(CLSID_AMMultiMediaStream,  0x49c47ce5, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);
DEFINE_GUID(CLSID_AMDirectDrawStream,  0x49c47ce4, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);
DEFINE_GUID(CLSID_AMAudioStream,       0x8496e040, 0xaf4c, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);
DEFINE_GUID(CLSID_AMAudioData,         0xf2468580, 0xaf8a, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45);
DEFINE_GUID(CLSID_AMMediaTypeStream,   0xcf0f2f7c, 0xf7bf, 0x11d0, 0x90, 0x0d, 0x00, 0xc0, 0x4f, 0xd9, 0x18, 0x9d);
#ifdef __cplusplus
}
#endif
#endif /* __WIDL_AMSTREAM_H */
