- Added DShow headers.
- Added needed const's in FilterGraph implementation.

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 78719f5..8b1cc53 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -505,7 +505,7 @@
 }
 
 static HRESULT WINAPI Mediaseeking_IsFormatSupported(IMediaSeeking *iface,
-						     GUID *pFormat) {
+						     const GUID *pFormat) {
     ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
 
     TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pFormat);
@@ -532,7 +532,7 @@
 }
 
 static HRESULT WINAPI Mediaseeking_IsUsingTimeFormat(IMediaSeeking *iface,
-						     GUID *pFormat) {
+						     const GUID *pFormat) {
     ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
 
     TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pFormat);
@@ -541,7 +541,7 @@
 }
 
 static HRESULT WINAPI Mediaseeking_SetTimeFormat(IMediaSeeking *iface,
-						 GUID *pFormat) {
+						 const GUID *pFormat) {
     ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
 
     TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pFormat);
@@ -578,9 +578,9 @@
 
 static HRESULT WINAPI Mediaseeking_ConvertTimeFormat(IMediaSeeking *iface,
 						     LONGLONG *pTarget,
-						     GUID *pTargetFormat,
+						     const GUID *pTargetFormat,
 						     LONGLONG Source,
-						     GUID *pSourceFormat) {
+						     const GUID *pSourceFormat) {
     ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface);
 
     TRACE("(%p/%p)->(%p, %p, %lld, %p): stub !!!\n", This, iface, pTarget, pTargetFormat, Source, pSourceFormat);
diff --git a/include/Makefile.in b/include/Makefile.in
index 8a221f5..ade9121 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -7,9 +7,16 @@
 IDL_SRCS = \
 	oaidl.idl \
 	objidl.idl \
+	strmif.idl \
 	unknwn.idl \
 	wtypes.idl
 
+IDL_INCLUDES = \
+	axcore.idl \
+	axextend.idl \
+	devenum.idl \
+	dyngraph.idl
+
 WINDOWS_INCLUDES = \
 	accctrl.h \
 	audevcod.h \
@@ -188,6 +195,7 @@
 	wshisotp.h \
 	wsipx.h \
 	zmouse.h \
+	$(IDL_INCLUDES) \
 	$(IDL_SRCS) \
 	$(IDL_SRCS:.idl=.h)
 
diff --git a/include/axcore.idl b/include/axcore.idl
new file mode 100644
index 0000000..ecac893
--- /dev/null
+++ b/include/axcore.idl
@@ -0,0 +1,647 @@
+/*
+ * Copyright (C) 2002 Robert Shearman
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define CHARS_IN_GUID 39
+cpp_quote("#define CHARS_IN_GUID 39")
+
+/* GetTimeFormat is defined in winnls.h as
+ * either the W or A suffixed version */
+cpp_quote("#undef GetTimeFormat")
+
+typedef struct _AMMediaType
+{
+    GUID       majortype;
+    GUID       subtype;
+    BOOL       bFixedSizeSamples;
+    BOOL       bTemporalCompression;
+    ULONG      lSampleSize;
+    GUID       formattype;
+    IUnknown * pUnk;
+    ULONG      cbFormat;
+    [size_is(cbFormat)] BYTE * pbFormat;
+} AM_MEDIA_TYPE;
+
+typedef enum _PinDirection
+{
+    PINDIR_INPUT,
+    PINDIR_OUTPUT
+} PIN_DIRECTION;
+
+#define MAX_PIN_NAME    128
+#define MAX_FILTER_NAME 128
+cpp_quote("#define MAX_PIN_NAME    128")
+cpp_quote("#define MAX_FILTER_NAME 128")
+
+typedef LONGLONG REFERENCE_TIME;
+typedef double REFTIME;
+
+typedef DWORD_PTR HSEMAPHORE;
+typedef DWORD_PTR HEVENT;
+
+typedef struct _AllocatorProperties
+{
+    long cBuffers;
+    long cbBuffer;
+    long cbAlign;
+    long cbPrefix;
+} ALLOCATOR_PROPERTIES;
+
+interface IAMovieSetup;
+interface IEnumFilters;
+interface IEnumMediaTypes;
+interface IEnumPins;
+interface IBaseFilter;
+interface IFilterGraph;
+interface IMediaFilter;
+interface IMediaSample;
+interface IMemAllocator;
+interface IMemAllocatorCallbackTemp;
+interface IMemAllocatorNotifyCallbackTemp;
+interface IMemInputPin;
+interface IPin;
+interface IReferenceClock;
+
+[
+object,
+uuid(56a86891-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IPin : IUnknown
+{
+    typedef struct _PinInfo
+    {
+        IBaseFilter *pFilter;
+        PIN_DIRECTION dir;
+        WCHAR achName[MAX_PIN_NAME];
+    } PIN_INFO;
+
+    HRESULT Connect(
+        [in] IPin * pReceivePin,
+        [in] const AM_MEDIA_TYPE * pmt);
+
+    HRESULT ReceiveConnection(
+        [in] IPin * pConnector,
+        [in] const AM_MEDIA_TYPE *pmt);
+
+    HRESULT Disconnect(void);
+
+    HRESULT ConnectedTo(
+        [out] IPin **pPin);
+
+    HRESULT ConnectionMediaType(
+        [out] AM_MEDIA_TYPE *pmt);
+
+    HRESULT QueryPinInfo(
+        [out] PIN_INFO * pInfo);
+
+    HRESULT QueryDirection(
+        [out] PIN_DIRECTION *pPinDir);
+
+    HRESULT QueryId(
+        [out] LPWSTR * Id);
+
+    HRESULT QueryAccept(
+        [in] const AM_MEDIA_TYPE *pmt);
+
+    HRESULT EnumMediaTypes(
+        [out] IEnumMediaTypes **ppEnum);
+
+    HRESULT QueryInternalConnections(
+        [out] IPin* *apPin,
+        [in, out] ULONG *nPin);
+
+    HRESULT EndOfStream(void);
+
+    HRESULT BeginFlush(void);
+
+    HRESULT EndFlush(void);
+    HRESULT NewSegment(
+        [in] REFERENCE_TIME tStart,
+        [in] REFERENCE_TIME tStop,
+        [in] double dRate);
+}
+
+typedef IPin *PPIN;
+
+[
+object,
+uuid(56a86892-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IEnumPins : IUnknown
+{
+
+    HRESULT Next(
+        [in] ULONG cPins,
+        [out, size_is(cPins)] IPin ** ppPins,
+        [out] ULONG * pcFetched);
+
+    HRESULT Skip(
+        [in] ULONG cPins);
+
+    HRESULT Reset(void);
+
+    HRESULT Clone(
+        [out] IEnumPins **ppEnum);
+}
+
+typedef IEnumPins *PENUMPINS;
+
+[
+object,
+uuid(89c31040-846b-11ce-97d3-00aa0055595a),
+pointer_default(unique)
+]
+interface IEnumMediaTypes : IUnknown
+{
+    HRESULT Next(
+        [in] ULONG cMediaTypes,
+        [out, size_is(cMediaTypes)]
+             AM_MEDIA_TYPE ** ppMediaTypes,
+        [out] ULONG * pcFetched
+    );
+
+    HRESULT Skip(
+        [in] ULONG cMediaTypes);
+
+    HRESULT Reset(void);
+
+    HRESULT Clone(
+        [out] IEnumMediaTypes **ppEnum
+    );
+}
+
+typedef IEnumMediaTypes *PENUMMEDIATYPES;
+
+[
+object,
+uuid(56a8689f-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IFilterGraph : IUnknown
+{
+    HRESULT AddFilter(
+        [in] IBaseFilter * pFilter,
+        [in, string] LPCWSTR pName);
+
+    HRESULT RemoveFilter(
+        [in] IBaseFilter * pFilter);
+
+    HRESULT EnumFilters(
+        [out] IEnumFilters **ppEnum);
+
+    HRESULT FindFilterByName(
+        [in, string] LPCWSTR pName,
+        [out] IBaseFilter ** ppFilter);
+
+    HRESULT ConnectDirect(
+        [in] IPin * ppinOut,
+        [in] IPin * ppinIn,
+        [in, unique] const AM_MEDIA_TYPE* pmt);
+
+    HRESULT Reconnect(
+        [in] IPin * ppin);
+
+    HRESULT Disconnect(
+        [in] IPin * ppin);
+
+    HRESULT SetDefaultSyncSource(void);
+}
+
+typedef IFilterGraph *PFILTERGRAPH;
+
+[
+object,
+uuid(56a86893-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IEnumFilters : IUnknown
+{
+    HRESULT Next(
+        [in]  ULONG cFilters,
+        [out] IBaseFilter ** ppFilter,
+        [out] ULONG * pcFetched);
+
+
+    HRESULT Skip(
+        [in] ULONG cFilters);
+
+
+    HRESULT Reset(void);
+
+
+    HRESULT Clone(
+        [out] IEnumFilters **ppEnum);
+}
+
+typedef IEnumFilters *PENUMFILTERS;
+
+[
+object,
+uuid(56a86899-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IMediaFilter : IPersist
+{
+    typedef enum _FilterState
+    {
+        State_Stopped,
+        State_Paused,
+        State_Running
+    } FILTER_STATE;
+
+    HRESULT Stop(void);
+    HRESULT Pause(void);
+
+    HRESULT Run(REFERENCE_TIME tStart);
+
+    HRESULT GetState(
+        [in] DWORD dwMilliSecsTimeout,
+        [out] FILTER_STATE *State);
+
+    HRESULT SetSyncSource(
+        [in] IReferenceClock * pClock);
+
+    HRESULT GetSyncSource(
+        [out] IReferenceClock ** pClock);
+}
+
+typedef IMediaFilter *PMEDIAFILTER;
+
+[
+object,
+uuid(56a86895-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IBaseFilter : IMediaFilter
+{
+    typedef struct _FilterInfo
+    {
+        WCHAR achName[MAX_FILTER_NAME];
+        IFilterGraph * pGraph;
+    } FILTER_INFO;
+
+    HRESULT EnumPins(
+        [out] IEnumPins ** ppEnum);
+
+    HRESULT FindPin(
+        [in, string] LPCWSTR Id,
+        [out] IPin ** ppPin);
+
+    HRESULT QueryFilterInfo(
+        [out] FILTER_INFO * pInfo);
+
+    HRESULT JoinFilterGraph(
+        [in] IFilterGraph * pGraph,
+        [in, string] LPCWSTR pName);
+
+    HRESULT QueryVendorInfo(
+        [out, string] LPWSTR* pVendorInfo);
+}
+
+typedef IBaseFilter *PFILTER;
+
+[
+object,
+uuid(56a86897-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IReferenceClock : IUnknown
+{
+    HRESULT GetTime(
+        [out] REFERENCE_TIME *pTime);
+
+    HRESULT AdviseTime(
+        [in] REFERENCE_TIME baseTime,
+        [in] REFERENCE_TIME streamTime,
+        [in] HEVENT hEvent,
+        [out] DWORD_PTR * pdwAdviseCookie);
+
+    HRESULT AdvisePeriodic(
+        [in] REFERENCE_TIME startTime,
+        [in] REFERENCE_TIME periodTime,
+        [in] HSEMAPHORE hSemaphore,
+        [out] DWORD_PTR * pdwAdviseCookie);
+
+    HRESULT Unadvise(
+        [in] DWORD_PTR dwAdviseCookie);
+}
+
+typedef IReferenceClock *PREFERENCECLOCK;
+
+/*
+[
+object,
+uuid(36b73885-c2c8-11cf-8b46-00805f6cef60),
+pointer_default(unique)
+]
+interface IReferenceClock2 : IReferenceClock
+{
+}
+
+typedef IReferenceClock2 *PREFERENCECLOCK2;
+
+*/
+
+[
+local,
+object,
+uuid(56a8689a-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IMediaSample : IUnknown
+{
+    HRESULT GetPointer([out] BYTE ** ppBuffer);
+
+    long GetSize(void);
+
+    HRESULT GetTime(
+        [out] REFERENCE_TIME * pTimeStart,
+        [out] REFERENCE_TIME * pTimeEnd);
+
+    HRESULT SetTime(
+        [in] REFERENCE_TIME * pTimeStart,
+        [in] REFERENCE_TIME * pTimeEnd);
+
+    HRESULT IsSyncPoint(void);
+
+    HRESULT SetSyncPoint(BOOL bIsSyncPoint);
+
+    HRESULT IsPreroll(void);
+
+    HRESULT SetPreroll(BOOL bIsPreroll);
+
+    long GetActualDataLength(void);
+
+    HRESULT SetActualDataLength(long length);
+
+    HRESULT GetMediaType(AM_MEDIA_TYPE **ppMediaType);
+
+    HRESULT SetMediaType(AM_MEDIA_TYPE *pMediaType);
+
+    HRESULT IsDiscontinuity(void);
+
+    HRESULT SetDiscontinuity(BOOL bDiscontinuity);
+
+    HRESULT GetMediaTime(
+        [out] LONGLONG * pTimeStart,
+        [out] LONGLONG * pTimeEnd);
+
+    HRESULT SetMediaTime(
+        [in] LONGLONG * pTimeStart,
+        [in] LONGLONG * pTimeEnd);
+}
+
+typedef IMediaSample *PMEDIASAMPLE;
+
+enum tagAM_SAMPLE_PROPERTY_FLAGS
+{
+       AM_SAMPLE_SPLICEPOINT        = 0x01,
+       AM_SAMPLE_PREROLL            = 0x02,
+       AM_SAMPLE_DATADISCONTINUITY  = 0x04,
+       AM_SAMPLE_TYPECHANGED        = 0x08,
+       AM_SAMPLE_TIMEVALID          = 0x10,
+       AM_SAMPLE_TIMEDISCONTINUITY  = 0x40,
+       AM_SAMPLE_FLUSH_ON_PAUSE     = 0x80,
+       AM_SAMPLE_STOPVALID          = 0x100,
+       AM_SAMPLE_ENDOFSTREAM        = 0x200,
+       AM_STREAM_MEDIA              = 0,
+       AM_STREAM_CONTROL            = 1
+};
+
+typedef struct tagAM_SAMPLE2_PROPERTIES
+{
+    DWORD    cbData;
+    DWORD    dwTypeSpecificFlags;
+    DWORD    dwSampleFlags;
+    LONG     lActual;
+    REFERENCE_TIME tStart;
+    REFERENCE_TIME tStop;
+    DWORD    dwStreamId;
+    AM_MEDIA_TYPE *pMediaType;
+    BYTE    *pbBuffer;
+    LONG     cbBuffer;
+} AM_SAMPLE2_PROPERTIES;
+
+[
+        local,
+        object,
+        uuid(36b73884-c2c8-11cf-8b46-00805f6cef60),
+        pointer_default(unique)
+]
+interface IMediaSample2 : IMediaSample
+{
+    HRESULT GetProperties(
+        [in] DWORD cbProperties,
+        [out, size_is(cbProperties)] BYTE * pbProperties
+    );
+
+    HRESULT SetProperties(
+        [in] DWORD cbProperties,
+        [in, size_is(cbProperties)] const BYTE * pbProperties
+    );
+}
+
+typedef IMediaSample2 *PMEDIASAMPLE2;
+
+#define AM_GBF_PREVFRAMESKIPPED 1
+#define AM_GBF_NOTASYNCPOINT    2
+cpp_quote("#define AM_GBF_PREVFRAMESKIPPED 1")
+cpp_quote("#define AM_GBF_NOTASYNCPOINT 2")
+
+cpp_quote("#define AM_GBF_NOWAIT 4")
+
+[
+object,
+uuid(56a8689c-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IMemAllocator : IUnknown
+{
+    HRESULT SetProperties(
+        [in] ALLOCATOR_PROPERTIES* pRequest,
+        [out] ALLOCATOR_PROPERTIES* pActual);
+
+    HRESULT GetProperties(
+        [out] ALLOCATOR_PROPERTIES* pProps);
+
+    HRESULT Commit(void);
+
+    HRESULT Decommit(void);
+
+    HRESULT GetBuffer(
+        [out] IMediaSample **ppBuffer,
+        [in] REFERENCE_TIME * pStartTime,
+        [in] REFERENCE_TIME * pEndTime,
+        [in] DWORD dwFlags);
+
+    HRESULT ReleaseBuffer(
+        [in] IMediaSample *pBuffer);
+}
+
+typedef IMemAllocator *PMEMALLOCATOR;
+
+[
+object,
+uuid(379a0cf0-c1de-11d2-abf5-00a0c905f375),
+pointer_default(unique)
+]
+interface IMemAllocatorCallbackTemp : IMemAllocator
+{
+    HRESULT SetNotify(
+        [in] IMemAllocatorNotifyCallbackTemp *pNotify);
+
+    HRESULT GetFreeCount(
+        [out] LONG *plBuffersFree);
+}
+
+[
+object,
+uuid(92980b30-c1de-11d2-abf5-00a0c905f375),
+pointer_default(unique)
+]
+interface IMemAllocatorNotifyCallbackTemp : IUnknown
+{
+    HRESULT NotifyRelease();
+}
+
+[
+object,
+uuid(56a8689d-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IMemInputPin : IUnknown
+{
+    HRESULT GetAllocator(
+        [out] IMemAllocator ** ppAllocator);
+
+    HRESULT NotifyAllocator(
+        [in] IMemAllocator * pAllocator,
+        [in] BOOL bReadOnly);
+
+    HRESULT GetAllocatorRequirements( [out] ALLOCATOR_PROPERTIES*pProps );
+
+    HRESULT Receive(
+        [in] IMediaSample * pSample);
+
+    HRESULT ReceiveMultiple(
+        [in, size_is(nSamples)] IMediaSample **pSamples,
+        [in] long nSamples,
+        [out] long *nSamplesProcessed);
+
+    HRESULT ReceiveCanBlock();
+}
+
+typedef IMemInputPin *PMEMINPUTPIN;
+
+[
+object,
+uuid(a3d8cec0-7e5a-11cf-bbc5-00805f6cef20),
+pointer_default(unique)
+]
+interface IAMovieSetup : IUnknown
+{
+    HRESULT Register( );
+    HRESULT Unregister( );
+}
+
+typedef IAMovieSetup *PAMOVIESETUP;
+
+typedef enum AM_SEEKING_SeekingFlags
+{
+    AM_SEEKING_NoPositioning            = 0x00,
+    AM_SEEKING_AbsolutePositioning      = 0x01,
+    AM_SEEKING_RelativePositioning      = 0x02,
+    AM_SEEKING_IncrementalPositioning   = 0x03,
+    AM_SEEKING_PositioningBitsMask      = 0x03,
+    AM_SEEKING_SeekToKeyFrame           = 0x04,
+    AM_SEEKING_ReturnTime               = 0x08,
+    AM_SEEKING_Segment                  = 0x10,
+    AM_SEEKING_NoFlush                  = 0x20
+} AM_SEEKING_SEEKING_FLAGS;
+
+typedef enum AM_SEEKING_SeekingCapabilities
+{
+    AM_SEEKING_CanSeekAbsolute     = 0x001,
+    AM_SEEKING_CanSeekForwards     = 0x002,
+    AM_SEEKING_CanSeekBackwards    = 0x004,
+    AM_SEEKING_CanGetCurrentPos    = 0x008,
+    AM_SEEKING_CanGetStopPos       = 0x010,
+    AM_SEEKING_CanGetDuration      = 0x020,
+    AM_SEEKING_CanPlayBackwards    = 0x040,
+    AM_SEEKING_CanDoSegments       = 0x080,
+    AM_SEEKING_Source              = 0x100
+} AM_SEEKING_SEEKING_CAPABILITIES;
+
+[
+object,
+uuid(36b73880-c2c8-11cf-8b46-00805f6cef60),
+pointer_default(unique)
+]
+interface IMediaSeeking : IUnknown
+{
+    HRESULT GetCapabilities( [out] DWORD * pCapabilities );
+
+    HRESULT CheckCapabilities( [in,out] DWORD * pCapabilities );
+
+    HRESULT IsFormatSupported([in] const GUID * pFormat);
+
+    HRESULT QueryPreferredFormat([out] GUID * pFormat);
+
+    HRESULT GetTimeFormat([out] GUID *pFormat);
+
+    HRESULT IsUsingTimeFormat([in] const GUID * pFormat);
+
+    HRESULT SetTimeFormat([in] const GUID * pFormat);
+
+    HRESULT GetDuration([out] LONGLONG *pDuration);
+
+    HRESULT GetStopPosition([out] LONGLONG *pStop);
+
+    HRESULT GetCurrentPosition([out] LONGLONG *pCurrent);
+
+    HRESULT ConvertTimeFormat([out] LONGLONG * pTarget, [in] const GUID * pTargetFormat,
+                              [in]  LONGLONG    Source, [in] const GUID * pSourceFormat );
+
+    HRESULT SetPositions(
+        [in,out] LONGLONG * pCurrent,
+        [in] DWORD dwCurrentFlags,
+        [in,out] LONGLONG * pStop,
+        [in] DWORD dwStopFlags);
+
+    HRESULT GetPositions(
+        [out] LONGLONG * pCurrent,
+        [out] LONGLONG * pStop);
+
+    HRESULT GetAvailable(
+        [out] LONGLONG * pEarliest,
+        [out] LONGLONG * pLatest);
+
+    HRESULT SetRate([in]  double dRate);
+
+    HRESULT GetRate([out] double * pdRate);
+
+    HRESULT GetPreroll([out] LONGLONG * pllPreroll);
+}
+
+typedef IMediaSeeking *PMEDIASEEKING;
+
+enum tagAM_MEDIAEVENT_FLAGS
+{
+    AM_MEDIAEVENT_NONOTIFY = 0x01
+};
diff --git a/include/axextend.idl b/include/axextend.idl
new file mode 100644
index 0000000..9466e99
--- /dev/null
+++ b/include/axextend.idl
@@ -0,0 +1,895 @@
+/*
+ * Copyright (C) 2002 Robert Shearman
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+interface IAMAnalogVideoDecoder;
+interface IAMAnalogVideoEncoder;
+interface IAMAudioInputMixer;
+interface IAMAudioRendererStats;
+interface IAMBufferNegotiation;
+interface IAMCameraControl;
+interface IAMCopyCaptureFileProgress;
+interface IAMCrossbar;
+interface IAMDevMemoryAllocator;
+interface IAMDevMemoryControl;
+interface IAMDroppedFrames;
+interface IAMExtDevice;
+interface IAMExtTransport;
+interface IAMGraphStreams;
+interface IAMLatency;
+interface IAMOpenProgress;
+interface IAMOverlayFX;
+interface IAMPhysicalPinInfo;
+interface IAMPushSource;
+interface IAMStreamConfig;
+interface IAMTimecodeDisplay;
+interface IAMTimecodeGenerator;
+interface IAMTimecodeReader;
+interface IAMTVTuner;
+interface IAMVfwCaptureDialogs;
+interface IAMVfwCompressDialogs;
+interface IAMVideoCompression;
+interface IAMVideoDecimationProperties;
+interface IAMVideoProcAmp;
+interface ICaptureGraphBuilder;
+interface ICaptureGraphBuilder2;
+interface IConfigAviMux;
+interface IConfigInterleaving;
+interface IDecimateVideoImage;
+interface IDrawVideoImage;
+interface IEnumRegFilters;
+interface IEnumStreamIdMap;
+interface IFileSourceFilter;
+interface IFileSinkFilter;
+interface IFileSinkFilter2;
+interface IFilterMapper;
+interface IFilterMapper2;
+interface IGraphBuilder;
+interface IKsPropertySet;
+interface IMediaEventSink;
+interface IMpeg2Demultiplexer;
+interface IMPEG2StreamIdMap;
+interface IOverlay;
+interface IOverlayNotify;
+interface IOverlayNotify2;
+interface IQualityControl;
+interface ISeekingPassThru;
+
+typedef struct
+{
+    CLSID Clsid;
+    LPWSTR Name;
+} REGFILTER;
+
+[
+object,
+uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IEnumRegFilters : IUnknown
+{
+    HRESULT Next
+        ( [in]  ULONG cFilters,
+          [out] REGFILTER ** apRegFilter,
+          [out] ULONG * pcFetched
+        );
+
+    HRESULT Skip(
+        [in] ULONG cFilters
+    );
+
+    HRESULT Reset(void);
+
+    HRESULT Clone(
+        [out] IEnumRegFilters **ppEnum
+    );
+}
+
+
+typedef IEnumRegFilters *PENUMREGFILTERS;
+
+[
+object,
+uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IFilterMapper : IUnknown
+{
+    enum { MERIT_PREFERRED     = 0x800000,
+           MERIT_NORMAL        = 0x600000,
+           MERIT_UNLIKELY      = 0x400000,
+           MERIT_DO_NOT_USE    = 0x200000,
+           MERIT_SW_COMPRESSOR = 0x100000,
+           MERIT_HW_COMPRESSOR = 0x100050
+         };
+
+    HRESULT RegisterFilter
+        ( [in] CLSID   clsid,
+          [in] LPCWSTR Name,
+          [in] DWORD   dwMerit
+        );
+
+    HRESULT RegisterFilterInstance
+        ( [in]  CLSID  clsid,
+          [in]  LPCWSTR Name,
+          [out] CLSID *MRId
+        );
+
+
+    HRESULT RegisterPin
+        ( [in] CLSID   Filter,
+          [in] LPCWSTR Name,
+          [in] BOOL    bRendered,
+          [in] BOOL    bOutput,
+          [in] BOOL    bZero,
+          [in] BOOL    bMany,
+          [in] CLSID   ConnectsToFilter,
+          [in] LPCWSTR ConnectsToPin
+        );
+
+    HRESULT RegisterPinType
+        ( [in] CLSID   clsFilter,
+          [in] LPCWSTR strName,
+          [in] CLSID   clsMajorType,
+          [in] CLSID   clsSubType
+        );
+
+
+    HRESULT UnregisterFilter
+        ( [in] CLSID  Filter
+        );
+
+
+    HRESULT UnregisterFilterInstance
+        ( [in] CLSID  MRId
+        );
+
+
+    HRESULT UnregisterPin
+        ( [in] CLSID   Filter,
+          [in] LPCWSTR Name
+        );
+
+    HRESULT EnumMatchingFilters
+       ( [out] IEnumRegFilters **ppEnum,
+         [in]  DWORD dwMerit,
+         [in]  BOOL  bInputNeeded,
+         [in]  CLSID clsInMaj,
+         [in]  CLSID clsInSub,
+         [in]  BOOL  bRender,
+         [in]  BOOL  bOututNeeded,
+         [in]  CLSID clsOutMaj,
+         [in]  CLSID clsOutSub
+       );
+
+}
+
+typedef struct
+{
+    const CLSID * clsMajorType;
+    const CLSID * clsMinorType;
+} REGPINTYPES;
+
+typedef struct
+{
+    LPWSTR           strName;
+    BOOL             bRendered;
+    BOOL             bOutput;
+    BOOL             bZero;
+    BOOL             bMany;
+    const CLSID *    clsConnectsToFilter;
+    const WCHAR *    strConnectsToPin;
+    UINT             nMediaTypes;
+    const REGPINTYPES * lpMediaType;
+} REGFILTERPINS;
+
+typedef struct
+{
+    CLSID clsMedium;
+    DWORD dw1;
+    DWORD dw2;
+} REGPINMEDIUM;
+
+enum
+{
+    REG_PINFLAG_B_ZERO = 0x1,
+    REG_PINFLAG_B_RENDERER = 0x2,
+    REG_PINFLAG_B_MANY = 0x4,
+    REG_PINFLAG_B_OUTPUT = 0x8
+};
+
+
+typedef struct
+{
+    DWORD dwFlags;
+    UINT             cInstances;
+    UINT             nMediaTypes;
+    [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType;
+    UINT             nMediums;
+    [size_is(nMediums)] const REGPINMEDIUM *lpMedium;
+    const CLSID      *clsPinCategory;
+} REGFILTERPINS2;
+
+typedef struct
+{
+    DWORD dwVersion;
+    DWORD dwMerit;
+    [switch_is(dwVersion)] [switch_type(DWORD)] union
+    {
+        [case(1)]
+            struct
+            {
+                ULONG cPins;
+                [size_is(cPins)] const REGFILTERPINS *rgPins;
+            } DUMMYSTRUCTNAME;
+
+        [case(2)]
+            struct
+            {
+                ULONG cPins2;
+                [size_is(cPins2)] const REGFILTERPINS2 *rgPins2;
+            } DUMMYSTRUCTNAME1;
+
+        [default]
+            ;
+    } DUMMYUNIONNAME;
+
+} REGFILTER2;
+
+
+[
+object,
+uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375),
+pointer_default(unique)
+]
+interface IFilterMapper2 : IUnknown
+{
+    HRESULT CreateCategory
+        ( [in] REFCLSID clsidCategory,
+          [in] DWORD dwCategoryMerit,
+          [in] LPCWSTR Description
+          );
+
+    HRESULT UnregisterFilter
+        ( [in] const CLSID *pclsidCategory,
+          [in] const OLECHAR *szInstance,
+          [in] REFCLSID Filter
+        );
+
+    HRESULT RegisterFilter
+        ( [in] REFCLSID clsidFilter,
+          [in] LPCWSTR Name,
+          [in, out] IMoniker **ppMoniker,
+          [in] const CLSID *pclsidCategory,
+          [in] const OLECHAR *szInstance,
+          [in] const REGFILTER2 *prf2
+        );
+
+    HRESULT EnumMatchingFilters
+       ( [out] IEnumMoniker **ppEnum,
+         [in]  DWORD dwFlags,
+         [in]  BOOL bExactMatch,
+         [in]  DWORD dwMerit,
+         [in]  BOOL  bInputNeeded,
+         [in]  DWORD cInputTypes,
+         [size_is(cInputTypes*2)]  const GUID *pInputTypes,
+         [in]  const REGPINMEDIUM *pMedIn,
+         [in]  const CLSID *pPinCategoryIn,
+         [in]  BOOL  bRender,
+         [in]  BOOL  bOutputNeeded,
+         [in]  DWORD cOutputTypes,
+         [size_is(cOutputTypes*2)]  const GUID *pOutputTypes,
+         [in]  const REGPINMEDIUM *pMedOut,
+         [in]  const CLSID *pPinCategoryOut
+       );
+}
+
+[
+object,
+uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375),
+pointer_default(unique)
+]
+interface IFilterMapper3 : IFilterMapper2
+{
+    HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum );
+}
+
+typedef enum tagQualityMessageType
+{
+    Famine,
+    Flood
+} QualityMessageType;
+
+typedef struct tagQuality
+{
+    QualityMessageType Type;
+    long               Proportion;
+    REFERENCE_TIME       Late;
+    REFERENCE_TIME       TimeStamp;
+} Quality;
+
+typedef IQualityControl *PQUALITYCONTROL;
+
+[
+object,
+uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IQualityControl : IUnknown
+{
+    HRESULT Notify
+        ( [in] IBaseFilter * pSelf,
+          [in] Quality q
+        );
+
+    HRESULT SetSink
+        ( [in] IQualityControl * piqc
+        );
+}
+
+enum
+{
+    CK_NOCOLORKEY  = 0x0,
+    CK_INDEX       = 0x1,
+    CK_RGB         = 0x2
+};
+
+typedef struct tagCOLORKEY
+{
+    DWORD    KeyType;
+    DWORD    PaletteIndex;
+    COLORREF LowColorValue;
+    COLORREF HighColorValue;
+} COLORKEY;
+
+enum
+{
+    ADVISE_NONE = 0x0,
+    ADVISE_CLIPPING = 0x1,
+    ADVISE_PALETTE = 0x2,
+    ADVISE_COLORKEY = 0x4,
+    ADVISE_POSITION = 0x8,
+    ADVISE_DISPLAY_CHANGE = 0x10
+};
+
+const DWORD ADVISE_ALL = ADVISE_CLIPPING |
+                         ADVISE_PALETTE  |
+                         ADVISE_COLORKEY |
+                         ADVISE_POSITION;
+
+const DWORD ADVISE_ALL2 = ADVISE_ALL |
+                          ADVISE_DISPLAY_CHANGE;
+
+cpp_quote("#ifndef _WINGDI_")
+
+/* already defined in wingdi.h, but needed for WIDL */
+
+typedef struct _RGNDATAHEADER
+{
+    DWORD dwSize;
+    DWORD iType;
+    DWORD nCount;
+    DWORD nRgnSize;
+    RECT  rcBound;
+} RGNDATAHEADER;
+
+typedef struct _RGNDATA
+{
+    RGNDATAHEADER rdh;
+    char Buffer[1];
+} RGNDATA;
+
+cpp_quote("#endif /* _WINGDI_ */")
+
+[
+object,
+local,
+uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IOverlayNotify : IUnknown
+{
+    HRESULT OnPaletteChange(
+        [in] DWORD dwColors,
+        [in] const PALETTEENTRY *pPalette);
+
+    HRESULT OnClipChange(
+        [in] const RECT *pSourceRect,
+        [in] const RECT *pDestinationRect,
+        [in] const RGNDATA *pRgnData);
+
+    HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey);
+
+    HRESULT OnPositionChange([in] const RECT *pSourceRect,
+                             [in] const RECT *pDestinationRect);
+}
+
+typedef IOverlayNotify *POVERLAYNOTIFY;
+
+cpp_quote("#if 0")
+typedef HANDLE HMONITOR;
+cpp_quote("#endif /* 0 */")
+
+[
+object,
+local,
+uuid(680EFA10-D535-11D1-87C8-00A0C9223196),
+pointer_default(unique)
+]
+interface IOverlayNotify2 : IOverlayNotify
+{
+    HRESULT OnDisplayChange(
+        HMONITOR hMonitor);
+}
+
+typedef IOverlayNotify2 *POVERLAYNOTIFY2;
+
+[
+object,
+local,
+uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IOverlay : IUnknown
+{
+    HRESULT GetPalette(
+        [out] DWORD *pdwColors,
+        [out] PALETTEENTRY **ppPalette);
+
+    HRESULT SetPalette(
+        [in] DWORD dwColors,
+        [in] PALETTEENTRY *pPalette);
+
+    HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey);
+
+    HRESULT GetColorKey([out] COLORKEY *pColorKey);
+
+    HRESULT SetColorKey([in,out] COLORKEY *pColorKey);
+
+    HRESULT GetWindowHandle([out] HWND *pHwnd);
+
+    HRESULT GetClipList([out] RECT *pSourceRect,
+                        [out] RECT *pDestinationRect,
+                        [out] RGNDATA **ppRgnData);
+
+    HRESULT GetVideoPosition([out] RECT *pSourceRect,
+                             [out] RECT *pDestinationRect);
+
+    HRESULT Advise(
+        [in] IOverlayNotify *pOverlayNotify,
+        [in] DWORD dwInterests);
+
+    HRESULT Unadvise();
+}
+
+typedef IOverlay *POVERLAY;
+
+[
+object,
+uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IMediaEventSink : IUnknown
+{
+    HRESULT Notify(
+        [in] long EventCode,
+        [in] LONG_PTR EventParam1,
+        [in] LONG_PTR EventParam2
+    );
+}
+
+typedef IMediaEventSink *PMEDIAEVENTSINK;
+
+[
+object,
+uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IFileSourceFilter : IUnknown
+{
+    HRESULT Load(
+        [in] LPCOLESTR pszFileName,
+        [in, unique] const AM_MEDIA_TYPE *pmt
+    );
+
+    HRESULT GetCurFile(
+        [out] LPOLESTR *ppszFileName,
+        [out] AM_MEDIA_TYPE *pmt
+    );
+}
+
+typedef IFileSourceFilter *PFILTERFILESOURCE;
+
+[
+object,
+uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6),
+pointer_default(unique)
+]
+interface IFileSinkFilter : IUnknown
+{
+    HRESULT SetFileName(
+        [in] LPCOLESTR pszFileName,
+        [in, unique] const AM_MEDIA_TYPE *pmt
+    );
+
+    HRESULT GetCurFile(
+        [out] LPOLESTR *ppszFileName,
+        [out] AM_MEDIA_TYPE *pmt
+    );
+}
+
+typedef IFileSinkFilter *PFILTERFILESINK;
+
+[
+        object,
+        uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86),
+        pointer_default(unique)
+]
+interface IFileSinkFilter2 : IFileSinkFilter
+{
+    HRESULT SetMode(
+        [in] DWORD dwFlags
+    );
+
+    HRESULT GetMode(
+        [out] DWORD *pdwFlags
+    );
+}
+
+typedef IFileSinkFilter2 *PFILESINKFILTER2;
+
+typedef enum
+{
+    AM_FILE_OVERWRITE = 0x00000001,
+} AM_FILESINK_FLAGS;
+
+[
+object,
+uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770),
+pointer_default(unique)
+]
+interface IGraphBuilder : IFilterGraph
+{
+    HRESULT Connect
+        ( [in] IPin * ppinOut,
+          [in] IPin * ppinIn
+        );
+
+    HRESULT Render
+        ( [in] IPin * ppinOut
+        );
+
+    HRESULT RenderFile
+        ( [in] LPCWSTR lpcwstrFile,
+          [in, unique] LPCWSTR lpcwstrPlayList
+        );
+
+    HRESULT AddSourceFilter
+        ( [in]      LPCWSTR lpcwstrFileName,
+          [in, unique]      LPCWSTR lpcwstrFilterName,
+          [out]     IBaseFilter* *ppFilter
+        );
+
+    HRESULT SetLogFile
+        ( [in]      DWORD_PTR hFile
+        );
+
+    HRESULT Abort();
+
+    HRESULT ShouldOperationContinue();
+}
+
+
+[
+    object,
+    uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5),
+    pointer_default(unique)
+]
+interface ICaptureGraphBuilder : IUnknown {
+
+    HRESULT SetFiltergraph(
+        [in] IGraphBuilder *pfg);
+
+    HRESULT GetFiltergraph(
+        [out] IGraphBuilder **ppfg);
+
+    HRESULT SetOutputFileName(
+        [in] const GUID *pType,
+        [in] LPCOLESTR lpstrFile,
+        [out] IBaseFilter **ppf,
+        [out] IFileSinkFilter **ppSink);
+
+    [local] HRESULT FindInterface(
+        [in, unique] const GUID *pCategory,
+        [in] IBaseFilter *pf,
+        [in] REFIID riid,
+        [out] void **ppint);
+
+    [call_as(FindInterface)] HRESULT RemoteFindInterface(
+        [in, unique] const GUID *pCategory,
+        [in] IBaseFilter *pf,
+        [in] REFIID riid,
+        [out] IUnknown **ppint);
+
+    HRESULT RenderStream(
+        [in] const GUID *pCategory,
+        [in] IUnknown *pSource,
+        [in] IBaseFilter *pfCompressor,
+        [in] IBaseFilter *pfRenderer);
+
+    HRESULT ControlStream(
+        [in] const GUID *pCategory,
+        [in] IBaseFilter *pFilter,
+        [in] REFERENCE_TIME *pstart,
+        [in] REFERENCE_TIME *pstop,
+        [in] WORD wStartCookie,
+        [in] WORD wStopCookie);
+
+    HRESULT AllocCapFile(
+        [in] LPCOLESTR lpstr,
+        [in] DWORDLONG dwlSize);
+
+    HRESULT CopyCaptureFile(
+        [in] LPOLESTR lpwstrOld,
+        [in] LPOLESTR lpwstrNew,
+        [in] int fAllowEscAbort,
+        [in] IAMCopyCaptureFileProgress *pCallback);
+}
+
+[
+object,
+uuid(670d1d20-a068-11d0-b3f0-00aa003761c5),
+pointer_default(unique)
+]
+interface IAMCopyCaptureFileProgress : IUnknown
+{
+    HRESULT Progress(
+        [in] int iProgress);
+}
+
+[
+    object,
+    uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D),
+    pointer_default(unique)
+]
+interface ICaptureGraphBuilder2 : IUnknown
+{
+    HRESULT SetFiltergraph(
+        [in] IGraphBuilder *pfg);
+
+    HRESULT GetFiltergraph(
+        [out] IGraphBuilder **ppfg);
+
+    HRESULT SetOutputFileName(
+        [in] const GUID *pType,
+        [in] LPCOLESTR lpstrFile,
+        [out] IBaseFilter **ppf,
+        [out] IFileSinkFilter **ppSink);
+
+    [local] HRESULT FindInterface(
+        [in] const GUID *pCategory,
+        [in] const GUID *pType,
+        [in] IBaseFilter *pf,
+        [in] REFIID riid,
+        [out] void **ppint);
+
+    [call_as(FindInterface)] HRESULT RemoteFindInterface(
+        [in] const GUID *pCategory,
+        [in] const GUID *pType,
+        [in] IBaseFilter *pf,
+        [in] REFIID riid,
+        [out] IUnknown **ppint);
+
+    HRESULT RenderStream(
+        [in] const GUID *pCategory,
+        [in] const GUID *pType,
+        [in] IUnknown *pSource,
+        [in] IBaseFilter *pfCompressor,
+        [in] IBaseFilter *pfRenderer);
+
+    HRESULT ControlStream(
+        [in] const GUID *pCategory,
+        [in] const GUID *pType,
+        [in] IBaseFilter *pFilter,
+        [in] REFERENCE_TIME *pstart,
+        [in] REFERENCE_TIME *pstop,
+        [in] WORD wStartCookie,
+        [in] WORD wStopCookie);
+
+    HRESULT AllocCapFile(
+        [in] LPCOLESTR lpstr,
+        [in] DWORDLONG dwlSize);
+
+    HRESULT CopyCaptureFile(
+        [in] LPOLESTR lpwstrOld,
+        [in] LPOLESTR lpwstrNew,
+        [in] int fAllowEscAbort,
+        [in] IAMCopyCaptureFileProgress *pCallback);
+
+    HRESULT FindPin(
+        [in] IUnknown *pSource,
+        [in] PIN_DIRECTION pindir,
+        [in] const GUID *pCategory,
+        [in] const GUID *pType,
+        [in] BOOL fUnconnected,
+        [in] int num,
+        [out] IPin **ppPin);
+}
+
+enum _AM_RENSDEREXFLAGS
+{
+    AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01
+};
+
+[
+    object,
+    uuid(36b73882-c2c8-11cf-8b46-00805f6cef60),
+    pointer_default(unique)
+]
+interface IFilterGraph2: IGraphBuilder
+{
+    HRESULT AddSourceFilterForMoniker(
+          [in] IMoniker *pMoniker,
+          [in] IBindCtx *pCtx,
+          [in, unique] LPCWSTR lpcwstrFilterName,
+          [out] IBaseFilter **ppFilter
+    );
+
+    HRESULT ReconnectEx
+        ( [in] IPin * ppin,
+          [in, unique] const AM_MEDIA_TYPE *pmt
+        );
+
+    HRESULT RenderEx( [in] IPin *pPinOut,
+                      [in] DWORD dwFlags,
+                      [in, out] DWORD *pvContext
+                    );
+}
+
+[
+    object,
+    local,
+    uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IStreamBuilder : IUnknown
+{
+    HRESULT Render
+        ( [in] IPin * ppinOut,
+          [in] IGraphBuilder * pGraph
+        );
+
+    HRESULT Backout
+        ( [in] IPin * ppinOut,
+          [in] IGraphBuilder * pGraph
+        );
+}
+
+
+[
+        object,
+        uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770),
+        pointer_default(unique)
+]
+interface IAsyncReader : IUnknown
+{
+    HRESULT RequestAllocator(
+                [in]  IMemAllocator* pPreferred,
+                [in]  ALLOCATOR_PROPERTIES* pProps,
+                [out] IMemAllocator ** ppActual);
+
+    HRESULT Request(
+                [in] IMediaSample* pSample,
+                [in] DWORD_PTR dwUser);
+
+    HRESULT WaitForNext(
+                [in]  DWORD dwTimeout,
+                [out] IMediaSample** ppSample,
+                [out] DWORD_PTR * pdwUser);
+
+    HRESULT SyncReadAligned(
+                [in] IMediaSample* pSample);
+
+    HRESULT SyncRead(
+                [in]  LONGLONG llPosition,
+                [in]  LONG lLength,
+                [out, size_is(lLength)]
+                      BYTE* pBuffer);
+
+    HRESULT Length(
+                [out] LONGLONG* pTotal,
+                [out] LONGLONG* pAvailable);
+
+    HRESULT BeginFlush(void);
+
+    HRESULT EndFlush(void);
+}
+
+
+[
+    object,
+    uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IGraphVersion : IUnknown
+{
+    HRESULT QueryVersion(LONG* pVersion);
+}
+
+[
+    object,
+    uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IResourceConsumer : IUnknown
+{
+    HRESULT AcquireResource(
+        [in] LONG idResource);
+
+    HRESULT ReleaseResource(
+        [in] LONG idResource);
+}
+
+
+[
+    object,
+    uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770),
+    pointer_default(unique)
+]
+interface IResourceManager : IUnknown
+{
+    HRESULT Register(
+        [in] LPCWSTR pName,
+        [in] LONG   cResource,
+        [out] LONG* plToken
+        );
+
+    HRESULT RegisterGroup(
+        [in] LPCWSTR pName,
+        [in] LONG cResource,
+        [in, size_is(cResource)]
+             LONG* palTokens,
+        [out] LONG* plToken
+        );
+
+    HRESULT RequestResource(
+        [in] LONG idResource,
+        [in] IUnknown* pFocusObject,
+        [in] IResourceConsumer* pConsumer
+        );
+
+    HRESULT NotifyAcquire(
+        [in] LONG idResource,
+        [in] IResourceConsumer* pConsumer,
+        [in] HRESULT hr);
+
+    HRESULT NotifyRelease(
+        [in] LONG idResource,
+        [in] IResourceConsumer* pConsumer,
+        [in] BOOL bStillWant);
+
+    HRESULT CancelRequest(
+        [in] LONG idResource,
+        [in] IResourceConsumer* pConsumer);
+
+    HRESULT SetFocus(
+        [in] IUnknown* pFocusObject);
+
+    HRESULT ReleaseFocus(
+        [in] IUnknown* pFocusObject);
+
+}
diff --git a/include/devenum.idl b/include/devenum.idl
new file mode 100644
index 0000000..5022a78
--- /dev/null
+++ b/include/devenum.idl
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2002 Robert Shearman
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+import "guiddef.h";
+import "oaidl.idl";
+
+cpp_quote("#define CDEF_CLASS_DEFAULT 0x0001")
+cpp_quote("#define CDEF_BYPASS_CLASS_MANAGER 0x0002")
+cpp_quote("#define CDEF_CLASS_LEGACY  0x0004")
+cpp_quote("#define CDEF_MERIT_ABOVE_DO_NOT_USE 0x0008")
+
+[
+    object,
+    uuid(29840822-5B84-11D0-BD3B-00A0C911CE86),
+    pointer_default(unique)
+]
+interface ICreateDevEnum : IUnknown
+{
+    HRESULT CreateClassEnumerator(
+        [in]  REFCLSID clsidDeviceClass,
+        [out] IEnumMoniker ** ppEnumMoniker,
+        [in]  DWORD dwFlags);
+}
diff --git a/include/dyngraph.idl b/include/dyngraph.idl
new file mode 100644
index 0000000..0138c10
--- /dev/null
+++ b/include/dyngraph.idl
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2002 Robert Shearman
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+interface IPinConnection;
+interface IPinFlowControl;
+interface IGraphConfig;
+interface IGraphConfigCallback;
+
+[
+    local,
+    object,
+    uuid(4a9a62d3-27d4-403d-91e9-89f540e55534),
+    pointer_default(unique)
+]
+interface IPinConnection : IUnknown
+{
+    HRESULT DynamicQueryAccept([in] const AM_MEDIA_TYPE *pmt);
+
+    HRESULT NotifyEndOfStream([in] HANDLE hNotifyEvent);
+
+    HRESULT IsEndPin();
+
+    HRESULT DynamicDisconnect();
+};
+
+[
+    local,
+    object,
+    uuid(c56e9858-dbf3-4f6b-8119-384af2060deb),
+    pointer_default(unique)
+]
+interface IPinFlowControl : IUnknown
+{
+    HRESULT Block([in] DWORD dwBlockFlags, [in] HANDLE hEvent);
+}
+
+enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS
+{
+    AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001,
+};
+
+typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS
+{
+    AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001,
+    AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002,
+    AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004
+} AM_GRAPH_CONFIG_RECONNECT_FLAGS;
+
+enum _REM_FILTER_FLAGS
+{
+    REMFILTERF_LEAVECONNECTED = 0x00000001
+};
+
+typedef enum _AM_FILTER_FLAGS
+{
+     AM_FILTER_FLAGS_REMOVABLE = 0x00000001
+} AM_FILTER_FLAGS;
+
+[
+    local,
+    object,
+    uuid(03A1EB8E-32BF-4245-8502-114D08A9CB88),
+    pointer_default(unique)
+]
+interface IGraphConfig : IUnknown
+{
+    HRESULT Reconnect(
+        [in] IPin *pOutputPin,
+        [in] IPin *pInputPin,
+        [in] const AM_MEDIA_TYPE *pmtFirstConnection,
+        [in] IBaseFilter *pUsingFilter,
+        [in] HANDLE hAbortEvent,
+        [in] DWORD dwFlags);
+
+    HRESULT Reconfigure(
+        [in] IGraphConfigCallback *pCallback,
+        [in] PVOID pvContext,
+        [in] DWORD dwFlags,
+        [in] HANDLE hAbortEvent);
+
+    HRESULT AddFilterToCache([in] IBaseFilter *pFilter);
+
+    HRESULT EnumCacheFilter([out] IEnumFilters **pEnum);
+
+    HRESULT RemoveFilterFromCache([in]IBaseFilter *pFilter);
+
+    HRESULT GetStartTime([out] REFERENCE_TIME *prtStart);
+
+    HRESULT PushThroughData(
+        [in] IPin *pOutputPin,
+        [in] IPinConnection *pConnection,
+        [in] HANDLE hEventAbort);
+
+    HRESULT SetFilterFlags([in] IBaseFilter *pFilter, [in] DWORD dwFlags);
+
+    HRESULT GetFilterFlags([in] IBaseFilter *pFilter, [out] DWORD *pdwFlags);
+
+    HRESULT RemoveFilterEx([in] IBaseFilter *pFilter, DWORD Flags);
+}
+
+[
+    local,
+    object,
+    uuid(ade0fd60-d19d-11d2-abf6-00a0c905f375),
+    pointer_default(unique)
+]
+interface IGraphConfigCallback : IUnknown
+{
+    HRESULT Reconfigure(PVOID pvContext, DWORD dwFlags);
+}
+
+[
+    local,
+    object,
+    uuid(DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29),
+    pointer_default(unique)
+]
+interface IFilterChain : IUnknown
+{
+    HRESULT StartChain(
+        [in] IBaseFilter *pStartFilter,
+        [in] IBaseFilter *pEndFilter);
+
+    HRESULT PauseChain(
+        [in] IBaseFilter *pStartFilter,
+        [in] IBaseFilter *pEndFilter);
+
+    HRESULT StopChain(
+        [in] IBaseFilter *pStartFilter,
+        [in] IBaseFilter *pEndFilter);
+
+    HRESULT RemoveChain(
+        [in] IBaseFilter *pStartFilter,
+        [in] IBaseFilter *pEndFilter);
+}
diff --git a/include/strmif.h b/include/strmif.h
index 66dd8b5..4c7b982 100644
--- a/include/strmif.h
+++ b/include/strmif.h
@@ -1,388 +1,7183 @@
-/*
- * Copyright (C) 2002 Lionel Ulmer
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+/*** Autogenerated by WIDL 0.1 from strmif.idl - Do not edit ***/
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __WIDL_STRMIF_H
+#define __WIDL_STRMIF_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "objidl.h"
+#include "guiddef.h"
+#include "oaidl.h"
+#define CDEF_CLASS_DEFAULT 0x0001
+#define CDEF_BYPASS_CLASS_MANAGER 0x0002
+#define CDEF_CLASS_LEGACY  0x0004
+#define CDEF_MERIT_ABOVE_DO_NOT_USE 0x0008
+typedef struct ICreateDevEnum ICreateDevEnum;
+/*****************************************************************************
+ * ICreateDevEnum interface
  */
+DEFINE_GUID(IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd,0x3b, 0x00,0xa0,0xc9,0x11,0xce,0x86);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct ICreateDevEnum : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateClassEnumerator(
+        REFCLSID clsidDeviceClass,
+        IEnumMoniker** ppEnumMoniker,
+        DWORD dwFlags) = 0;
 
-#ifndef __STRMIF_INCLUDED__
-#define __STRMIF_INCLUDED__
+};
+#else
+typedef struct ICreateDevEnumVtbl ICreateDevEnumVtbl;
+struct ICreateDevEnum {
+    const ICreateDevEnumVtbl* lpVtbl;
+};
+struct ICreateDevEnumVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
 
-#include "windef.h"
-#include "wingdi.h"
-#include "objbase.h"
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ICreateDevEnum* This,
+        REFIID riid,
+        void** ppvObject);
 
-/* FilterGraph object / interface */
-typedef struct IFilterGraph IFilterGraph;
-typedef struct IBaseFilter IBaseFilter;
-typedef struct IEnumFilters IEnumFilters;
-typedef struct IPin IPin;
-typedef struct IEnumPins IEnumPins;
-typedef struct IEnumMediaTypes IEnumMediaTypes;
-typedef struct IMediaFilter IMediaFilter;
-typedef struct IReferenceClock IReferenceClock;
-typedef struct IGraphBuilder IGraphBuilder;
-typedef struct IMediaSeeking IMediaSeeking;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ICreateDevEnum* This);
 
-typedef LONGLONG REFERENCE_TIME;
-typedef double REFTIME;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ICreateDevEnum* This);
 
-typedef struct  _MediaType {
-    GUID      majortype;
-    GUID      subtype;
-    BOOL      bFixedSizeSamples;
-    BOOL      bTemporalCompression;
-    ULONG     lSampleSize;
-    GUID      formattype;
-    IUnknown  *pUnk;
-    ULONG     cbFormat;
-    /* [size_is] */ BYTE *pbFormat;
+    /*** ICreateDevEnum methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateClassEnumerator)(
+        ICreateDevEnum* This,
+        REFCLSID clsidDeviceClass,
+        IEnumMoniker** ppEnumMoniker,
+        DWORD dwFlags);
+
+};
+
+/*** IUnknown methods ***/
+#define ICreateDevEnum_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define ICreateDevEnum_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define ICreateDevEnum_Release(p) (p)->lpVtbl->Release(p)
+/*** ICreateDevEnum methods ***/
+#define ICreateDevEnum_CreateClassEnumerator(p,a,b,c) (p)->lpVtbl->CreateClassEnumerator(p,a,b,c)
+
+#endif
+
+#define ICreateDevEnum_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; \
+    /*** ICreateDevEnum methods ***/ \
+    STDMETHOD_(HRESULT,CreateClassEnumerator)(THIS_ REFCLSID clsidDeviceClass, IEnumMoniker** ppEnumMoniker, DWORD dwFlags) PURE;
+
+HRESULT CALLBACK ICreateDevEnum_CreateClassEnumerator_Proxy(
+    ICreateDevEnum* This,
+    REFCLSID clsidDeviceClass,
+    IEnumMoniker** ppEnumMoniker,
+    DWORD dwFlags);
+void __RPC_STUB ICreateDevEnum_CreateClassEnumerator_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#define CHARS_IN_GUID 39
+#undef GetTimeFormat
+typedef struct _AMMediaType {
+    GUID majortype;
+    GUID subtype;
+    BOOL bFixedSizeSamples;
+    BOOL bTemporalCompression;
+    ULONG lSampleSize;
+    GUID formattype;
+    IUnknown *pUnk;
+    ULONG cbFormat;
+    BYTE *pbFormat;
 } AM_MEDIA_TYPE;
 
-#define MAX_FILTER_NAME  128
-typedef struct _FilterInfo {
-    WCHAR        achName[MAX_FILTER_NAME]; 
-    IFilterGraph *pGraph;
-} FILTER_INFO;
-
-typedef enum _FilterState {
-    State_Stopped   = 0,
-    State_Paused    = 1,
-    State_Running   = 2
-} FILTER_STATE;
-
-typedef enum _PinDirection  {
-    PINDIR_INPUT  = 0,
-    PINDIR_OUTPUT = 1
+typedef enum _PinDirection {
+    PINDIR_INPUT,
+    PINDIR_OUTPUT
 } PIN_DIRECTION;
 
-#define MAX_PIN_NAME 128
+#define MAX_PIN_NAME    128
+#define MAX_FILTER_NAME 128
+typedef LONGLONG REFERENCE_TIME;
+
+typedef double REFTIME;
+
+typedef DWORD_PTR HSEMAPHORE;
+
+typedef DWORD_PTR HEVENT;
+
+typedef struct _AllocatorProperties {
+    long cBuffers;
+    long cbBuffer;
+    long cbAlign;
+    long cbPrefix;
+} ALLOCATOR_PROPERTIES;
+
+typedef struct IAMovieSetup IAMovieSetup;
+typedef struct IEnumFilters IEnumFilters;
+typedef struct IEnumMediaTypes IEnumMediaTypes;
+typedef struct IEnumPins IEnumPins;
+typedef struct IBaseFilter IBaseFilter;
+typedef struct IFilterGraph IFilterGraph;
+typedef struct IMediaFilter IMediaFilter;
+typedef struct IMediaSample IMediaSample;
+typedef struct IMemAllocator IMemAllocator;
+typedef struct IMemAllocatorCallbackTemp IMemAllocatorCallbackTemp;
+typedef struct IMemAllocatorNotifyCallbackTemp IMemAllocatorNotifyCallbackTemp;
+typedef struct IMemInputPin IMemInputPin;
+typedef struct IPin IPin;
+typedef struct IReferenceClock IReferenceClock;
 typedef struct _PinInfo {
     IBaseFilter *pFilter;
     PIN_DIRECTION dir;
-    WCHAR achName[MAX_PIN_NAME];
+    WCHAR achName[128];
 } PIN_INFO;
 
-typedef DWORD_PTR HSEMAPHORE;
-typedef DWORD_PTR HEVENT;
+/*****************************************************************************
+ * IPin interface
+ */
+DEFINE_GUID(IID_IPin, 0x56a86891, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IPin : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Connect(
+        IPin* pReceivePin,
+        const AM_MEDIA_TYPE* pmt) = 0;
 
-#define INTERFACE IPin
-#define IPin_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(Connect)(THIS_  IPin *  pReceivePin, AM_MEDIA_TYPE *  pmt) PURE; \
-    STDMETHOD(ReceiveConnection)(THIS_  IPin *  pConnector, AM_MEDIA_TYPE *  pmt) PURE; \
-    STDMETHOD(Disconnect)(THIS) PURE; \
-    STDMETHOD(ConnectedTo)(THIS_  IPin **  pPin) PURE; \
-    STDMETHOD(ConnectionMediaType)(THIS_  AM_MEDIA_TYPE *  pmt) PURE; \
-    STDMETHOD(QueryPinInfo)(THIS_  PIN_INFO *  pInfo) PURE; \
-    STDMETHOD(QueryDirection)(THIS_  PIN_DIRECTION *  pPinDir) PURE; \
-    STDMETHOD(QueryId)(THIS_  LPWSTR *  Id) PURE; \
-    STDMETHOD(QueryAccept)(THIS_  AM_MEDIA_TYPE *  pmt) PURE; \
-    STDMETHOD(EnumMediaTypes)(THIS_  IEnumMediaTypes **  ppEnum) PURE; \
-    STDMETHOD(QueryInternalConnections)(THIS_  IPin **  apPin, ULONG *  nPin) PURE; \
-    STDMETHOD(EndOfStream)(THIS) PURE; \
-    STDMETHOD(BeginFlush)(THIS) PURE; \
-    STDMETHOD(EndFlush)(THIS) PURE; \
-    STDMETHOD(NewSegment)(THIS_  REFERENCE_TIME   tStart, REFERENCE_TIME   tStop, double   dRate) PURE;
-ICOM_DEFINE(IPin,IUnknown)
-#undef INTERFACE
+    virtual HRESULT STDMETHODCALLTYPE ReceiveConnection(
+        IPin* pConnector,
+        const AM_MEDIA_TYPE* pmt) = 0;
 
-#ifdef COBJMACROS
+    virtual HRESULT STDMETHODCALLTYPE Disconnect(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConnectedTo(
+        IPin** pPin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConnectionMediaType(
+        AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryPinInfo(
+        PIN_INFO* pInfo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryDirection(
+        PIN_DIRECTION* pPinDir) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryId(
+        LPWSTR* Id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryAccept(
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumMediaTypes(
+        IEnumMediaTypes** ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryInternalConnections(
+        IPin** apPin,
+        ULONG* nPin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndOfStream(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginFlush(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndFlush(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NewSegment(
+        REFERENCE_TIME tStart,
+        REFERENCE_TIME tStop,
+        double dRate) = 0;
+
+};
+#else
+typedef struct IPinVtbl IPinVtbl;
+struct IPin {
+    const IPinVtbl* lpVtbl;
+};
+struct IPinVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPin* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPin* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPin* This);
+
+    /*** IPin methods ***/
+    HRESULT (STDMETHODCALLTYPE *Connect)(
+        IPin* This,
+        IPin* pReceivePin,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *ReceiveConnection)(
+        IPin* This,
+        IPin* pConnector,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnect)(
+        IPin* This);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectedTo)(
+        IPin* This,
+        IPin** pPin);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectionMediaType)(
+        IPin* This,
+        AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *QueryPinInfo)(
+        IPin* This,
+        PIN_INFO* pInfo);
+
+    HRESULT (STDMETHODCALLTYPE *QueryDirection)(
+        IPin* This,
+        PIN_DIRECTION* pPinDir);
+
+    HRESULT (STDMETHODCALLTYPE *QueryId)(
+        IPin* This,
+        LPWSTR* Id);
+
+    HRESULT (STDMETHODCALLTYPE *QueryAccept)(
+        IPin* This,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *EnumMediaTypes)(
+        IPin* This,
+        IEnumMediaTypes** ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *QueryInternalConnections)(
+        IPin* This,
+        IPin** apPin,
+        ULONG* nPin);
+
+    HRESULT (STDMETHODCALLTYPE *EndOfStream)(
+        IPin* This);
+
+    HRESULT (STDMETHODCALLTYPE *BeginFlush)(
+        IPin* This);
+
+    HRESULT (STDMETHODCALLTYPE *EndFlush)(
+        IPin* This);
+
+    HRESULT (STDMETHODCALLTYPE *NewSegment)(
+        IPin* This,
+        REFERENCE_TIME tStart,
+        REFERENCE_TIME tStop,
+        double dRate);
+
+};
+
 /*** IUnknown methods ***/
-#define IPin_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IPin_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IPin_Release(p)   (p)->lpVtbl->Release(p)
+#define IPin_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IPin_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IPin_Release(p) (p)->lpVtbl->Release(p)
 /*** IPin methods ***/
-#define IPin_Connect(p,a,b)   (p)->lpVtbl->Connect(p,a,b)
-#define IPin_ReceiveConnection(p,a,b)   (p)->lpVtbl->ReceiveConnection(p,a,b)
-#define IPin_Disconnect(p)   (p)->lpVtbl->Disconnect(p)
-#define IPin_ConnectedTo(p,a)   (p)->lpVtbl->ConnectedTo(p,a)
-#define IPin_ConnectionMediaType(p,a)   (p)->lpVtbl->ConnectionMediaType(p,a)
-#define IPin_QueryPinInfo(p,a)   (p)->lpVtbl->QueryPinInfo(p,a)
-#define IPin_QueryDirection(p,a)   (p)->lpVtbl->QueryDirection(p,a)
-#define IPin_QueryId(p,a)   (p)->lpVtbl->QueryId(p,a)
-#define IPin_QueryAccept(p,a)   (p)->lpVtbl->QueryAccept(p,a)
-#define IPin_EnumMediaTypes(p,a)   (p)->lpVtbl->EnumMediaTypes(p,a)
-#define IPin_QueryInternalConnections(p,a,b)   (p)->lpVtbl->QueryInternalConnections(p,a,b)
-#define IPin_EndOfStream(p)   (p)->lpVtbl->EndOfStream(p)
-#define IPin_BeginFlush(p)   (p)->lpVtbl->BeginFlush(p)
-#define IPin_EndFlush(p)   (p)->lpVtbl->EndFlush(p)
-#define IPin_NewSegment(p,a,b,c)   (p)->lpVtbl->NewSegment(p,a,b,c)
+#define IPin_Connect(p,a,b) (p)->lpVtbl->Connect(p,a,b)
+#define IPin_ReceiveConnection(p,a,b) (p)->lpVtbl->ReceiveConnection(p,a,b)
+#define IPin_Disconnect(p) (p)->lpVtbl->Disconnect(p)
+#define IPin_ConnectedTo(p,a) (p)->lpVtbl->ConnectedTo(p,a)
+#define IPin_ConnectionMediaType(p,a) (p)->lpVtbl->ConnectionMediaType(p,a)
+#define IPin_QueryPinInfo(p,a) (p)->lpVtbl->QueryPinInfo(p,a)
+#define IPin_QueryDirection(p,a) (p)->lpVtbl->QueryDirection(p,a)
+#define IPin_QueryId(p,a) (p)->lpVtbl->QueryId(p,a)
+#define IPin_QueryAccept(p,a) (p)->lpVtbl->QueryAccept(p,a)
+#define IPin_EnumMediaTypes(p,a) (p)->lpVtbl->EnumMediaTypes(p,a)
+#define IPin_QueryInternalConnections(p,a,b) (p)->lpVtbl->QueryInternalConnections(p,a,b)
+#define IPin_EndOfStream(p) (p)->lpVtbl->EndOfStream(p)
+#define IPin_BeginFlush(p) (p)->lpVtbl->BeginFlush(p)
+#define IPin_EndFlush(p) (p)->lpVtbl->EndFlush(p)
+#define IPin_NewSegment(p,a,b,c) (p)->lpVtbl->NewSegment(p,a,b,c)
+
 #endif
 
-#define INTERFACE IEnumPins
-#define IEnumPins_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(Next)(THIS_  ULONG   cPins, IPin **  ppPins, ULONG *  pcFetched) PURE; \
-    STDMETHOD(Skip)(THIS_  ULONG   cPins) PURE; \
-    STDMETHOD(Reset)(THIS) PURE; \
-    STDMETHOD(Clone)(THIS_  IEnumPins **  ppEnum) PURE;
-ICOM_DEFINE(IEnumPins,IUnknown)
-#undef INTERFACE
+#define IPin_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; \
+    /*** IPin methods ***/ \
+    STDMETHOD_(HRESULT,Connect)(THIS_ IPin* pReceivePin, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,ReceiveConnection)(THIS_ IPin* pConnector, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,Disconnect)(THIS) PURE; \
+    STDMETHOD_(HRESULT,ConnectedTo)(THIS_ IPin** pPin) PURE; \
+    STDMETHOD_(HRESULT,ConnectionMediaType)(THIS_ AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,QueryPinInfo)(THIS_ PIN_INFO* pInfo) PURE; \
+    STDMETHOD_(HRESULT,QueryDirection)(THIS_ PIN_DIRECTION* pPinDir) PURE; \
+    STDMETHOD_(HRESULT,QueryId)(THIS_ LPWSTR* Id) PURE; \
+    STDMETHOD_(HRESULT,QueryAccept)(THIS_ const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,EnumMediaTypes)(THIS_ IEnumMediaTypes** ppEnum) PURE; \
+    STDMETHOD_(HRESULT,QueryInternalConnections)(THIS_ IPin** apPin, ULONG* nPin) PURE; \
+    STDMETHOD_(HRESULT,EndOfStream)(THIS) PURE; \
+    STDMETHOD_(HRESULT,BeginFlush)(THIS) PURE; \
+    STDMETHOD_(HRESULT,EndFlush)(THIS) PURE; \
+    STDMETHOD_(HRESULT,NewSegment)(THIS_ REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) PURE;
 
-#ifdef COBJMACROS
+HRESULT CALLBACK IPin_Connect_Proxy(
+    IPin* This,
+    IPin* pReceivePin,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IPin_Connect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_ReceiveConnection_Proxy(
+    IPin* This,
+    IPin* pConnector,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IPin_ReceiveConnection_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_Disconnect_Proxy(
+    IPin* This);
+void __RPC_STUB IPin_Disconnect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_ConnectedTo_Proxy(
+    IPin* This,
+    IPin** pPin);
+void __RPC_STUB IPin_ConnectedTo_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_ConnectionMediaType_Proxy(
+    IPin* This,
+    AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IPin_ConnectionMediaType_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_QueryPinInfo_Proxy(
+    IPin* This,
+    PIN_INFO* pInfo);
+void __RPC_STUB IPin_QueryPinInfo_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_QueryDirection_Proxy(
+    IPin* This,
+    PIN_DIRECTION* pPinDir);
+void __RPC_STUB IPin_QueryDirection_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_QueryId_Proxy(
+    IPin* This,
+    LPWSTR* Id);
+void __RPC_STUB IPin_QueryId_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_QueryAccept_Proxy(
+    IPin* This,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IPin_QueryAccept_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_EnumMediaTypes_Proxy(
+    IPin* This,
+    IEnumMediaTypes** ppEnum);
+void __RPC_STUB IPin_EnumMediaTypes_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_QueryInternalConnections_Proxy(
+    IPin* This,
+    IPin** apPin,
+    ULONG* nPin);
+void __RPC_STUB IPin_QueryInternalConnections_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_EndOfStream_Proxy(
+    IPin* This);
+void __RPC_STUB IPin_EndOfStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_BeginFlush_Proxy(
+    IPin* This);
+void __RPC_STUB IPin_BeginFlush_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_EndFlush_Proxy(
+    IPin* This);
+void __RPC_STUB IPin_EndFlush_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPin_NewSegment_Proxy(
+    IPin* This,
+    REFERENCE_TIME tStart,
+    REFERENCE_TIME tStop,
+    double dRate);
+void __RPC_STUB IPin_NewSegment_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IPin *PPIN;
+
+/*****************************************************************************
+ * IEnumPins interface
+ */
+DEFINE_GUID(IID_IEnumPins, 0x56a86892, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IEnumPins : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cPins,
+        IPin** ppPins,
+        ULONG* pcFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cPins) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumPins** ppEnum) = 0;
+
+};
+#else
+typedef struct IEnumPinsVtbl IEnumPinsVtbl;
+struct IEnumPins {
+    const IEnumPinsVtbl* lpVtbl;
+};
+struct IEnumPinsVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumPins* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumPins* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumPins* This);
+
+    /*** IEnumPins methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumPins* This,
+        ULONG cPins,
+        IPin** ppPins,
+        ULONG* pcFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumPins* This,
+        ULONG cPins);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumPins* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumPins* This,
+        IEnumPins** ppEnum);
+
+};
+
 /*** IUnknown methods ***/
-#define IEnumPins_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IEnumPins_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IEnumPins_Release(p)   (p)->lpVtbl->Release(p)
+#define IEnumPins_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IEnumPins_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IEnumPins_Release(p) (p)->lpVtbl->Release(p)
 /*** IEnumPins methods ***/
-#define IEnumPins_Next(p,a,b,c)   (p)->lpVtbl->Next(p,a,b,c)
-#define IEnumPins_Skip(p,a)   (p)->lpVtbl->Skip(p,a)
-#define IEnumPins_Reset(p)   (p)->lpVtbl->Reset(p)
-#define IEnumPins_Clone(p,a)   (p)->lpVtbl->Clone(p,a)
+#define IEnumPins_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
+#define IEnumPins_Skip(p,a) (p)->lpVtbl->Skip(p,a)
+#define IEnumPins_Reset(p) (p)->lpVtbl->Reset(p)
+#define IEnumPins_Clone(p,a) (p)->lpVtbl->Clone(p,a)
+
 #endif
 
-#define INTERFACE IMediaFilter
-#define IMediaFilter_METHODS \
-    IPersist_METHODS \
-    STDMETHOD(Stop)(THIS) PURE; \
-    STDMETHOD(Pause)(THIS) PURE; \
-    STDMETHOD(Run)(THIS_  REFERENCE_TIME  tStart) PURE; \
-    STDMETHOD(GetState)(THIS_  DWORD   dwMilliSecsTimeout, FILTER_STATE *  State) PURE; \
-    STDMETHOD(SetSyncSource)(THIS_  IReferenceClock *  pClock) PURE; \
-    STDMETHOD(GetSyncSource)(THIS_  IReferenceClock **  pClock) PURE;
-ICOM_DEFINE(IMediaFilter,IPersist)
-#undef INTERFACE
+#define IEnumPins_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; \
+    /*** IEnumPins methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cPins, IPin** ppPins, ULONG* pcFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cPins) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumPins** ppEnum) PURE;
 
-#ifdef COBJMACROS
+HRESULT CALLBACK IEnumPins_Next_Proxy(
+    IEnumPins* This,
+    ULONG cPins,
+    IPin** ppPins,
+    ULONG* pcFetched);
+void __RPC_STUB IEnumPins_Next_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumPins_Skip_Proxy(
+    IEnumPins* This,
+    ULONG cPins);
+void __RPC_STUB IEnumPins_Skip_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumPins_Reset_Proxy(
+    IEnumPins* This);
+void __RPC_STUB IEnumPins_Reset_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumPins_Clone_Proxy(
+    IEnumPins* This,
+    IEnumPins** ppEnum);
+void __RPC_STUB IEnumPins_Clone_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IEnumPins *PENUMPINS;
+
+/*****************************************************************************
+ * IEnumMediaTypes interface
+ */
+DEFINE_GUID(IID_IEnumMediaTypes, 0x89c31040, 0x846b, 0x11ce, 0x97,0xd3, 0x00,0xaa,0x00,0x55,0x59,0x5a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IEnumMediaTypes : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cMediaTypes,
+        AM_MEDIA_TYPE** ppMediaTypes,
+        ULONG* pcFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cMediaTypes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumMediaTypes** ppEnum) = 0;
+
+};
+#else
+typedef struct IEnumMediaTypesVtbl IEnumMediaTypesVtbl;
+struct IEnumMediaTypes {
+    const IEnumMediaTypesVtbl* lpVtbl;
+};
+struct IEnumMediaTypesVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumMediaTypes* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumMediaTypes* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumMediaTypes* This);
+
+    /*** IEnumMediaTypes methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumMediaTypes* This,
+        ULONG cMediaTypes,
+        AM_MEDIA_TYPE** ppMediaTypes,
+        ULONG* pcFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumMediaTypes* This,
+        ULONG cMediaTypes);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumMediaTypes* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumMediaTypes* This,
+        IEnumMediaTypes** ppEnum);
+
+};
+
 /*** IUnknown methods ***/
-#define IMediaFilter_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IMediaFilter_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IMediaFilter_Release(p)   (p)->lpVtbl->Release(p)
-/*** IPersist methods ***/
-#define IMediaFilter_GetClassID(p,a)   (p)->lpVtbl->GetClassID(p,a)
-/*** IMediaFilter methods ***/
-#define IMediaFilter_Stop(p)   (p)->lpVtbl->Stop(p)
-#define IMediaFilter_Pause(p)   (p)->lpVtbl->Pause(p)
-#define IMediaFilter_Run(p,a)   (p)->lpVtbl->Run(p,a)
-#define IMediaFilter_GetState(p,a,b)   (p)->lpVtbl->GetState(p,a,b)
-#define IMediaFilter_SetSyncSource(p,a)   (p)->lpVtbl->SetSyncSource(p,a)
-#define IMediaFilter_GetSyncSource(p,a)   (p)->lpVtbl->GetSyncSource(p,a)
-#endif
-
-#define INTERFACE IBaseFilter
-#define IBaseFilter_METHODS \
-    IMediaFilter_METHODS \
-    STDMETHOD(EnumPins)(THIS_  IEnumPins **  ppEnum) PURE; \
-    STDMETHOD(FindPin)(THIS_  LPCWSTR   Id, IPin **  ppPin) PURE; \
-    STDMETHOD(QueryFilterInfo)(THIS_  FILTER_INFO *  pInfo) PURE; \
-    STDMETHOD(JoinFilterGraph)(THIS_  IFilterGraph *  pGraph, LPCWSTR   pName) PURE; \
-    STDMETHOD(QueryVendorInfo)(THIS_  LPWSTR *  pVendorInfo) PURE;
-ICOM_DEFINE(IBaseFilter,IMediaFilter)
-#undef INTERFACE
-     
-#ifdef COBJMACROS
-/*** IUnknown methods ***/
-#define IBaseFilter_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IBaseFilter_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IBaseFilter_Release(p)   (p)->lpVtbl->Release(p)
-/*** IPersist methods ***/
-#define IBaseFilter_GetClassID(p,a)   (p)->lpVtbl->GetClassID(p,a)
-/*** IMediaFilter methods ***/
-#define IBaseFilter_Stop(p)   (p)->lpVtbl->Stop(p)
-#define IBaseFilter_Pause(p)   (p)->lpVtbl->Pause(p)
-#define IBaseFilter_Run(p,a)   (p)->lpVtbl->Run(p,a)
-#define IBaseFilter_GetState(p,a,b)   (p)->lpVtbl->GetState(p,a,b)
-#define IBaseFilter_SetSyncSource(p,a)   (p)->lpVtbl->SetSyncSource(p,a)
-#define IBaseFilter_GetSyncSource(p,a)   (p)->lpVtbl->GetSyncSource(p,a)
-/*** IBaseFilter methods ***/
-#define IBaseFilter_EnumPins(p,a)   (p)->lpVtbl->EnumPins(p,a)
-#define IBaseFilter_FindPin(p,a,b)   (p)->lpVtbl->FindPin(p,a,b)
-#define IBaseFilter_QueryFilterInfo(p,a)   (p)->lpVtbl->QueryFilterInfo(p,a)
-#define IBaseFilter_JoinFilterGraph(p,a,b)   (p)->lpVtbl->JoinFilterGraph(p,a,b)
-#define IBaseFilter_QueryVendorInfo(p,a)   (p)->lpVtbl->QueryVendorInfo(p,a)
-#endif
-
-#define INTERFACE IFilterGraph
-#define IFilterGraph_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(AddFilter)(THIS_  IBaseFilter *  pFilter, LPCWSTR  pName) PURE; \
-    STDMETHOD(RemoveFilter)(THIS_  IBaseFilter *  pFilter) PURE; \
-    STDMETHOD(EnumFilter)(THIS_  IEnumFilters **  ppEnum) PURE; \
-    STDMETHOD(FindFilterByName)(THIS_  LPCWSTR  pName, IBaseFilter **  ppFilter) PURE; \
-    STDMETHOD(ConnectDirect)(THIS_  IPin *  ppinIn, IPin *  ppinOut, const AM_MEDIA_TYPE *  pmt) PURE; \
-    STDMETHOD(Reconnect)(THIS_  IPin *  ppin) PURE; \
-    STDMETHOD(Disconnect)(THIS_  IPin *  ppin) PURE; \
-    STDMETHOD(SetDefaultSyncSource)(THIS) PURE;
-ICOM_DEFINE(IFilterGraph,IUnknown)
-#undef INTERFACE
-
-#ifdef COBJMACROS
-/*** IUnknown methods ***/
-#define IFilterGraph_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IFilterGraph_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IFilterGraph_Release(p)   (p)->lpVtbl->Release(p)
-/*** IFilterGraph methods ***/
-#define IFilterGraph_AddFilter(p,a,b)   (p)->lpVtbl->AddFilter(p,a,b)
-#define IFilterGraph_RemoveFilter(p,a)   (p)->lpVtbl->RemoveFilter(p,a)
-#define IFilterGraph_EnumFilter(p,a)   (p)->lpVtbl->EnumFilter(p,a)
-#define IFilterGraph_FindFilterByName(p,a,b)   (p)->lpVtbl->FindFilterByName(p,a,b)
-#define IFilterGraph_ConnectDirect(p,a,b,c)   (p)->lpVtbl->ConnectDirect(p,a,b,c)
-#define IFilterGraph_Reconnect(p,a)   (p)->lpVtbl->Reconnect(p,a)
-#define IFilterGraph_Disconnect(p,a)   (p)->lpVtbl->Disconnect(p,a)
-#define IFilterGraph_SetDefaultSyncSource(p)   (p)->lpVtbl->SetDefaultSyncSource(p)
-#endif
-
-#define INTERFACE IEnumFilters
-#define IEnumFilters_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(Next)(THIS_  ULONG   cFilters, IBaseFilter **  ppFilter, ULONG *  pcFetched) PURE; \
-    STDMETHOD(Skip)(THIS_  ULONG   cFilters) PURE; \
-    STDMETHOD(Reset)(THIS) PURE; \
-    STDMETHOD(Clone)(THIS_  IEnumFilters **  ppEnum) PURE;
-ICOM_DEFINE(IEnumFilters,IUnknown)
-#undef INTERFACE
-
-#ifdef COBJMACROS
-/*** IUnknown methods ***/
-#define IEnumFilters_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IEnumFilters_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IEnumFilters_Release(p)   (p)->lpVtbl->Release(p)
-/*** IEnumFilters methods ***/
-#define IEnumFilters_Next(p,a,b,c)   (p)->lpVtbl->Next(p,a,b,c)
-#define IEnumFilters_Skip(p,a)   (p)->lpVtbl->Skip(p,a)
-#define IEnumFilters_Reset(p)   (p)->lpVtbl->Reset(p)
-#define IEnumFilters_Clone(p,a)   (p)->lpVtbl->Clone(p,a)
-#endif
-    
-#define INTERFACE IEnumMediaTypes
-#define IEnumMediaTypes_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(Next)(THIS_  ULONG   cMediaTypes, AM_MEDIA_TYPE **  ppMediaTypes, ULONG *  pcFetched) PURE; \
-    STDMETHOD(Skip)(THIS_  ULONG   cMediaTypes) PURE; \
-    STDMETHOD(Reset)(THIS) PURE; \
-    STDMETHOD(Clone)(THIS_  IEnumMediaTypes **  ppEnum) PURE;
-ICOM_DEFINE(IEnumMediaTypes,IUnknown)
-#undef INTERFACE
-
-#ifdef COBJMACROS
-/*** IUnknown methods ***/
-#define IEnumMediaTypes_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IEnumMediaTypes_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IEnumMediaTypes_Release(p)   (p)->lpVtbl->Release(p)
+#define IEnumMediaTypes_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IEnumMediaTypes_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IEnumMediaTypes_Release(p) (p)->lpVtbl->Release(p)
 /*** IEnumMediaTypes methods ***/
-#define IEnumMediaTypes_Next(p,a,b,c)   (p)->lpVtbl->Next(p,a,b,c)
-#define IEnumMediaTypes_Skip(p,a)   (p)->lpVtbl->Skip(p,a)
-#define IEnumMediaTypes_Reset(p)   (p)->lpVtbl->Reset(p)
-#define IEnumMediaTypes_Clone(p,a)   (p)->lpVtbl->Clone(p,a)
-#endif
-     
-#define INTERFACE IReferenceClock
-#define IReferenceClock_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(GetTime)(THIS_  REFERENCE_TIME *  pTime) PURE; \
-    STDMETHOD(AdviseTime)(THIS_  REFERENCE_TIME   baseTime, REFERENCE_TIME   streamTime, HEVENT   hEvent, DWORD_PTR *  pdwAdviseCookie) PURE; \
-    STDMETHOD(AdvisePeriodic)(THIS_  REFERENCE_TIME   startTime, REFERENCE_TIME   periodTime, HSEMAPHORE   hSemaphore, DWORD_PTR *  pdwAdviseCookie) PURE; \
-    STDMETHOD(Unadvise)(THIS_  DWORD_PTR   dwAdviseCookie) PURE;
-ICOM_DEFINE(IReferenceClock,IUnknown)
-#undef INTERFACE
+#define IEnumMediaTypes_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
+#define IEnumMediaTypes_Skip(p,a) (p)->lpVtbl->Skip(p,a)
+#define IEnumMediaTypes_Reset(p) (p)->lpVtbl->Reset(p)
+#define IEnumMediaTypes_Clone(p,a) (p)->lpVtbl->Clone(p,a)
 
-#ifdef COBJMACROS
-/*** IUnknown methods ***/
-#define IReferenceClock_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IReferenceClock_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IReferenceClock_Release(p)   (p)->lpVtbl->Release(p)
-/*** IReferenceClock methods ***/
-#define IReferenceClock_GetTime(p,a)   (p)->lpVtbl->GetTime(p,a)
-#define IReferenceClock_AdviseTime(p,a,b,c,d)   (p)->lpVtbl->AdviseTime(p,a,b,c,d)
-#define IReferenceClock_AdvisePeriodic(p,a,b,c,d)   (p)->lpVtbl->AdvisePeriodic(p,a,b,c,d)
-#define IReferenceClock_Unadvise(p,a)   (p)->lpVtbl->Unadvise(p,a)
 #endif
-     
-#define INTERFACE IGraphBuilder
-#define IGraphBuilder_METHODS \
-    IFilterGraph_METHODS \
-    STDMETHOD(Connect)(THIS_  IPin *  ppinOut, IPin *  ppinIn) PURE; \
-    STDMETHOD(Render)(THIS_  IPin *  ppinOut) PURE; \
-    STDMETHOD(RenderFile)(THIS_  LPCWSTR   lpcwstrFile, LPCWSTR   lpcwstrPlayList) PURE; \
-    STDMETHOD(AddSourceFilter)(THIS_  LPCWSTR   lpcwstrFileName, LPCWSTR   lpcwstrFilterName, IBaseFilter **  ppFilter) PURE; \
-    STDMETHOD(SetLogFile)(THIS_  DWORD_PTR   hFile) PURE; \
-    STDMETHOD(Abort)(THIS) PURE; \
-    STDMETHOD(ShouldOperationContinue)(THIS) PURE;
-ICOM_DEFINE(IGraphBuilder,IFilterGraph)
-#undef INTERFACE
 
-#ifdef COBJMACROS
+#define IEnumMediaTypes_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; \
+    /*** IEnumMediaTypes methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cMediaTypes, AM_MEDIA_TYPE** ppMediaTypes, ULONG* pcFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cMediaTypes) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumMediaTypes** ppEnum) PURE;
+
+HRESULT CALLBACK IEnumMediaTypes_Next_Proxy(
+    IEnumMediaTypes* This,
+    ULONG cMediaTypes,
+    AM_MEDIA_TYPE** ppMediaTypes,
+    ULONG* pcFetched);
+void __RPC_STUB IEnumMediaTypes_Next_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumMediaTypes_Skip_Proxy(
+    IEnumMediaTypes* This,
+    ULONG cMediaTypes);
+void __RPC_STUB IEnumMediaTypes_Skip_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumMediaTypes_Reset_Proxy(
+    IEnumMediaTypes* This);
+void __RPC_STUB IEnumMediaTypes_Reset_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumMediaTypes_Clone_Proxy(
+    IEnumMediaTypes* This,
+    IEnumMediaTypes** ppEnum);
+void __RPC_STUB IEnumMediaTypes_Clone_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IEnumMediaTypes *PENUMMEDIATYPES;
+
+/*****************************************************************************
+ * IFilterGraph interface
+ */
+DEFINE_GUID(IID_IFilterGraph, 0x56a8689f, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterGraph : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddFilter(
+        IBaseFilter* pFilter,
+        LPCWSTR pName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveFilter(
+        IBaseFilter* pFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumFilters(
+        IEnumFilters** ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindFilterByName(
+        LPCWSTR pName,
+        IBaseFilter** ppFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConnectDirect(
+        IPin* ppinOut,
+        IPin* ppinIn,
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reconnect(
+        IPin* ppin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Disconnect(
+        IPin* ppin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDefaultSyncSource(
+        ) = 0;
+
+};
+#else
+typedef struct IFilterGraphVtbl IFilterGraphVtbl;
+struct IFilterGraph {
+    const IFilterGraphVtbl* lpVtbl;
+};
+struct IFilterGraphVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterGraph* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterGraph* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterGraph* This);
+
+    /*** IFilterGraph methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFilter)(
+        IFilterGraph* This,
+        IBaseFilter* pFilter,
+        LPCWSTR pName);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveFilter)(
+        IFilterGraph* This,
+        IBaseFilter* pFilter);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFilters)(
+        IFilterGraph* This,
+        IEnumFilters** ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *FindFilterByName)(
+        IFilterGraph* This,
+        LPCWSTR pName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDirect)(
+        IFilterGraph* This,
+        IPin* ppinOut,
+        IPin* ppinIn,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *Reconnect)(
+        IFilterGraph* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnect)(
+        IFilterGraph* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultSyncSource)(
+        IFilterGraph* This);
+
+};
+
 /*** IUnknown methods ***/
-#define IGraphBuilder_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IGraphBuilder_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IGraphBuilder_Release(p)   (p)->lpVtbl->Release(p)
+#define IFilterGraph_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterGraph_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterGraph_Release(p) (p)->lpVtbl->Release(p)
 /*** IFilterGraph methods ***/
-#define IGraphBuilder_AddFilter(p,a,b)   (p)->lpVtbl->AddFilter(p,a,b)
-#define IGraphBuilder_RemoveFilter(p,a)   (p)->lpVtbl->RemoveFilter(p,a)
-#define IGraphBuilder_EnumFilter(p,a)   (p)->lpVtbl->EnumFilter(p,a)
-#define IGraphBuilder_FindFilterByName(p,a,b)   (p)->lpVtbl->FindFilterByName(p,a,b)
-#define IGraphBuilder_ConnectDirect(p,a,b,c)   (p)->lpVtbl->ConnectDirect(p,a,b,c)
-#define IGraphBuilder_Reconnect(p,a)   (p)->lpVtbl->Reconnect(p,a)
-#define IGraphBuilder_Disconnect(p,a)   (p)->lpVtbl->Disconnect(p,a)
-#define IGraphBuilder_SetDefaultSyncSource(p)   (p)->lpVtbl->SetDefaultSyncSource(p)
-/*** IGraphBuilder methods ***/
-#define IGraphBuilder_Connect(p,a,b)   (p)->lpVtbl->Connect(p,a,b)
-#define IGraphBuilder_Render(p,a)   (p)->lpVtbl->Render(p,a)
-#define IGraphBuilder_RenderFile(p,a,b)   (p)->lpVtbl->RenderFile(p,a,b)
-#define IGraphBuilder_AddSourceFilter(p,a,b,c)   (p)->lpVtbl->AddSourceFilter(p,a,b,c)
-#define IGraphBuilder_SetLogFile(p,a)   (p)->lpVtbl->SetLogFile(p,a)
-#define IGraphBuilder_Abort(p)   (p)->lpVtbl->Abort(p)
-#define IGraphBuilder_ShouldOperationContinue(p)   (p)->lpVtbl->ShouldOperationContinue(p)
+#define IFilterGraph_AddFilter(p,a,b) (p)->lpVtbl->AddFilter(p,a,b)
+#define IFilterGraph_RemoveFilter(p,a) (p)->lpVtbl->RemoveFilter(p,a)
+#define IFilterGraph_EnumFilters(p,a) (p)->lpVtbl->EnumFilters(p,a)
+#define IFilterGraph_FindFilterByName(p,a,b) (p)->lpVtbl->FindFilterByName(p,a,b)
+#define IFilterGraph_ConnectDirect(p,a,b,c) (p)->lpVtbl->ConnectDirect(p,a,b,c)
+#define IFilterGraph_Reconnect(p,a) (p)->lpVtbl->Reconnect(p,a)
+#define IFilterGraph_Disconnect(p,a) (p)->lpVtbl->Disconnect(p,a)
+#define IFilterGraph_SetDefaultSyncSource(p) (p)->lpVtbl->SetDefaultSyncSource(p)
+
 #endif
 
-#define INTERFACE IMediaSeeking
-#define IMediaSeeking_METHODS \
-    IUnknown_METHODS \
-    STDMETHOD(GetCapabilities)(THIS_  DWORD *  pCapabilities) PURE; \
-    STDMETHOD(CheckCapabilities)(THIS_  DWORD *  pCapabilities) PURE; \
-    STDMETHOD(IsFormatSupported)(THIS_  GUID *  pFormat) PURE; \
-    STDMETHOD(QueryPreferredFormat)(THIS_  GUID *  pFormat) PURE; \
-    STDMETHOD(GetTimeFormat)(THIS_  GUID *  pFormat) PURE; \
-    STDMETHOD(IsUsingTimeFormat)(THIS_  GUID *  pFormat) PURE; \
-    STDMETHOD(SetTimeFormat)(THIS_  GUID *  pFormat) PURE; \
-    STDMETHOD(GetDuration)(THIS_  LONGLONG *  pDuration) PURE; \
-    STDMETHOD(GetStopPosition)(THIS_  LONGLONG *  pStop) PURE; \
-    STDMETHOD(GetCurrentPosition)(THIS_  LONGLONG *  pCurrent) PURE; \
-    STDMETHOD(ConvertTimeFormat)(THIS_  LONGLONG *  pTarget, GUID *  pTargetFormat, LONGLONG   Source, GUID *  pSourceFormat) PURE; \
-    STDMETHOD(SetPositions)(THIS_  LONGLONG *  pCurrent, DWORD   dwCurrentFlags, LONGLONG *  pStop, DWORD   dwStopFlags) PURE; \
-    STDMETHOD(GetPositions)(THIS_  LONGLONG *  pCurrent, LONGLONG *  pStop) PURE; \
-    STDMETHOD(GetAvailable)(THIS_  LONGLONG *  pEarliest, LONGLONG *  pLatest) PURE; \
-    STDMETHOD(SetRate)(THIS_  double   dRate) PURE; \
-    STDMETHOD(GetRate)(THIS_  double *  pdRate) PURE; \
-    STDMETHOD(GetPreroll)(THIS_  LONGLONG *  pllPreroll) PURE;
-ICOM_DEFINE(IMediaSeeking,IUnknown)
-#undef INTERFACE
+#define IFilterGraph_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; \
+    /*** IFilterGraph methods ***/ \
+    STDMETHOD_(HRESULT,AddFilter)(THIS_ IBaseFilter* pFilter, LPCWSTR pName) PURE; \
+    STDMETHOD_(HRESULT,RemoveFilter)(THIS_ IBaseFilter* pFilter) PURE; \
+    STDMETHOD_(HRESULT,EnumFilters)(THIS_ IEnumFilters** ppEnum) PURE; \
+    STDMETHOD_(HRESULT,FindFilterByName)(THIS_ LPCWSTR pName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,ConnectDirect)(THIS_ IPin* ppinOut, IPin* ppinIn, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,Reconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,Disconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,SetDefaultSyncSource)(THIS) PURE;
 
-#ifdef COBJMACROS
+HRESULT CALLBACK IFilterGraph_AddFilter_Proxy(
+    IFilterGraph* This,
+    IBaseFilter* pFilter,
+    LPCWSTR pName);
+void __RPC_STUB IFilterGraph_AddFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_RemoveFilter_Proxy(
+    IFilterGraph* This,
+    IBaseFilter* pFilter);
+void __RPC_STUB IFilterGraph_RemoveFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_EnumFilters_Proxy(
+    IFilterGraph* This,
+    IEnumFilters** ppEnum);
+void __RPC_STUB IFilterGraph_EnumFilters_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_FindFilterByName_Proxy(
+    IFilterGraph* This,
+    LPCWSTR pName,
+    IBaseFilter** ppFilter);
+void __RPC_STUB IFilterGraph_FindFilterByName_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_ConnectDirect_Proxy(
+    IFilterGraph* This,
+    IPin* ppinOut,
+    IPin* ppinIn,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFilterGraph_ConnectDirect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_Reconnect_Proxy(
+    IFilterGraph* This,
+    IPin* ppin);
+void __RPC_STUB IFilterGraph_Reconnect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_Disconnect_Proxy(
+    IFilterGraph* This,
+    IPin* ppin);
+void __RPC_STUB IFilterGraph_Disconnect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph_SetDefaultSyncSource_Proxy(
+    IFilterGraph* This);
+void __RPC_STUB IFilterGraph_SetDefaultSyncSource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IFilterGraph *PFILTERGRAPH;
+
+/*****************************************************************************
+ * IEnumFilters interface
+ */
+DEFINE_GUID(IID_IEnumFilters, 0x56a86893, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IEnumFilters : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cFilters,
+        IBaseFilter** ppFilter,
+        ULONG* pcFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cFilters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumFilters** ppEnum) = 0;
+
+};
+#else
+typedef struct IEnumFiltersVtbl IEnumFiltersVtbl;
+struct IEnumFilters {
+    const IEnumFiltersVtbl* lpVtbl;
+};
+struct IEnumFiltersVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumFilters* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumFilters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumFilters* This);
+
+    /*** IEnumFilters methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumFilters* This,
+        ULONG cFilters,
+        IBaseFilter** ppFilter,
+        ULONG* pcFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumFilters* This,
+        ULONG cFilters);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumFilters* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumFilters* This,
+        IEnumFilters** ppEnum);
+
+};
+
 /*** IUnknown methods ***/
-#define IMediaSeeking_QueryInterface(p,a,b)   (p)->lpVtbl->QueryInterface(p,a,b)
-#define IMediaSeeking_AddRef(p)   (p)->lpVtbl->AddRef(p)
-#define IMediaSeeking_Release(p)   (p)->lpVtbl->Release(p)
-/*** IMediaSeeking methods ***/
-#define IMediaSeeking_GetCapabilities(p,a)   (p)->lpVtbl->GetCapabilities(p,a)
-#define IMediaSeeking_CheckCapabilities(p,a)   (p)->lpVtbl->CheckCapabilities(p,a)
-#define IMediaSeeking_IsFormatSupported(p,a)   (p)->lpVtbl->IsFormatSupported(p,a)
-#define IMediaSeeking_QueryPreferredFormat(p,a)   (p)->lpVtbl->QueryPreferredFormat(p,a)
-#define IMediaSeeking_GetTimeFormat(p,a)   (p)->lpVtbl->GetTimeFormat(p,a)
-#define IMediaSeeking_IsUsingTimeFormat(p,a)   (p)->lpVtbl->IsUsingTimeFormat(p,a)
-#define IMediaSeeking_SetTimeFormat(p,a)   (p)->lpVtbl->SetTimeFormat(p,a)
-#define IMediaSeeking_GetDuration(p,a)   (p)->lpVtbl->GetDuration(p,a)
-#define IMediaSeeking_GetStopPosition(p,a)   (p)->lpVtbl->GetStopPosition(p,a)
-#define IMediaSeeking_GetCurrentPosition(p,a)   (p)->lpVtbl->GetCurrentPosition(p,a)
-#define IMediaSeeking_ConvertTimeFormat(p,a,b,c,d)   (p)->lpVtbl->ConvertTimeFormat(p,a,b,c,d)
-#define IMediaSeeking_SetPositions(p,a,b,c,d)   (p)->lpVtbl->SetPositions(p,a,b,c,d)
-#define IMediaSeeking_GetPositions(p,a,b)   (p)->lpVtbl->GetPositions(p,a,b)
-#define IMediaSeeking_GetAvailable(p,a,b)   (p)->lpVtbl->GetAvailable(p,a,b)
-#define IMediaSeeking_SetRate(p,a)   (p)->lpVtbl->SetRate(p,a)
-#define IMediaSeeking_GetRate(p,a)   (p)->lpVtbl->GetRate(p,a)
-#define IMediaSeeking_GetPreroll(p,a)   (p)->lpVtbl->GetPreroll(p,a)
+#define IEnumFilters_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IEnumFilters_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IEnumFilters_Release(p) (p)->lpVtbl->Release(p)
+/*** IEnumFilters methods ***/
+#define IEnumFilters_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
+#define IEnumFilters_Skip(p,a) (p)->lpVtbl->Skip(p,a)
+#define IEnumFilters_Reset(p) (p)->lpVtbl->Reset(p)
+#define IEnumFilters_Clone(p,a) (p)->lpVtbl->Clone(p,a)
+
 #endif
-     
-#endif /* __STRMIF_INCLUDED__ */
+
+#define IEnumFilters_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; \
+    /*** IEnumFilters methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cFilters, IBaseFilter** ppFilter, ULONG* pcFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cFilters) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumFilters** ppEnum) PURE;
+
+HRESULT CALLBACK IEnumFilters_Next_Proxy(
+    IEnumFilters* This,
+    ULONG cFilters,
+    IBaseFilter** ppFilter,
+    ULONG* pcFetched);
+void __RPC_STUB IEnumFilters_Next_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumFilters_Skip_Proxy(
+    IEnumFilters* This,
+    ULONG cFilters);
+void __RPC_STUB IEnumFilters_Skip_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumFilters_Reset_Proxy(
+    IEnumFilters* This);
+void __RPC_STUB IEnumFilters_Reset_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumFilters_Clone_Proxy(
+    IEnumFilters* This,
+    IEnumFilters** ppEnum);
+void __RPC_STUB IEnumFilters_Clone_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IEnumFilters *PENUMFILTERS;
+
+typedef enum _FilterState {
+    State_Stopped,
+    State_Paused,
+    State_Running
+} FILTER_STATE;
+
+/*****************************************************************************
+ * IMediaFilter interface
+ */
+DEFINE_GUID(IID_IMediaFilter, 0x56a86899, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMediaFilter : public IPersist
+{
+    virtual HRESULT STDMETHODCALLTYPE Stop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Pause(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Run(
+        REFERENCE_TIME tStart) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetState(
+        DWORD dwMilliSecsTimeout,
+        FILTER_STATE* State) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSyncSource(
+        IReferenceClock* pClock) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSyncSource(
+        IReferenceClock** pClock) = 0;
+
+};
+#else
+typedef struct IMediaFilterVtbl IMediaFilterVtbl;
+struct IMediaFilter {
+    const IMediaFilterVtbl* lpVtbl;
+};
+struct IMediaFilterVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMediaFilter* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMediaFilter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMediaFilter* This);
+
+    /*** IPersist methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetClassID)(
+        IMediaFilter* This,
+        CLSID* pClassID);
+
+    /*** IMediaFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IMediaFilter* This);
+
+    HRESULT (STDMETHODCALLTYPE *Pause)(
+        IMediaFilter* This);
+
+    HRESULT (STDMETHODCALLTYPE *Run)(
+        IMediaFilter* This,
+        REFERENCE_TIME tStart);
+
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IMediaFilter* This,
+        DWORD dwMilliSecsTimeout,
+        FILTER_STATE* State);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncSource)(
+        IMediaFilter* This,
+        IReferenceClock* pClock);
+
+    HRESULT (STDMETHODCALLTYPE *GetSyncSource)(
+        IMediaFilter* This,
+        IReferenceClock** pClock);
+
+};
+
+/*** IUnknown methods ***/
+#define IMediaFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMediaFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMediaFilter_Release(p) (p)->lpVtbl->Release(p)
+/*** IPersist methods ***/
+#define IMediaFilter_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
+/*** IMediaFilter methods ***/
+#define IMediaFilter_Stop(p) (p)->lpVtbl->Stop(p)
+#define IMediaFilter_Pause(p) (p)->lpVtbl->Pause(p)
+#define IMediaFilter_Run(p,a) (p)->lpVtbl->Run(p,a)
+#define IMediaFilter_GetState(p,a,b) (p)->lpVtbl->GetState(p,a,b)
+#define IMediaFilter_SetSyncSource(p,a) (p)->lpVtbl->SetSyncSource(p,a)
+#define IMediaFilter_GetSyncSource(p,a) (p)->lpVtbl->GetSyncSource(p,a)
+
+#endif
+
+#define IMediaFilter_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;
+
+HRESULT CALLBACK IMediaFilter_Stop_Proxy(
+    IMediaFilter* This);
+void __RPC_STUB IMediaFilter_Stop_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaFilter_Pause_Proxy(
+    IMediaFilter* This);
+void __RPC_STUB IMediaFilter_Pause_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaFilter_Run_Proxy(
+    IMediaFilter* This,
+    REFERENCE_TIME tStart);
+void __RPC_STUB IMediaFilter_Run_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaFilter_GetState_Proxy(
+    IMediaFilter* This,
+    DWORD dwMilliSecsTimeout,
+    FILTER_STATE* State);
+void __RPC_STUB IMediaFilter_GetState_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaFilter_SetSyncSource_Proxy(
+    IMediaFilter* This,
+    IReferenceClock* pClock);
+void __RPC_STUB IMediaFilter_SetSyncSource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaFilter_GetSyncSource_Proxy(
+    IMediaFilter* This,
+    IReferenceClock** pClock);
+void __RPC_STUB IMediaFilter_GetSyncSource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMediaFilter *PMEDIAFILTER;
+
+typedef struct _FilterInfo {
+    WCHAR achName[128];
+    IFilterGraph *pGraph;
+} FILTER_INFO;
+
+/*****************************************************************************
+ * IBaseFilter interface
+ */
+DEFINE_GUID(IID_IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IBaseFilter : public IMediaFilter
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumPins(
+        IEnumPins** ppEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindPin(
+        LPCWSTR Id,
+        IPin** ppPin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryFilterInfo(
+        FILTER_INFO* pInfo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph(
+        IFilterGraph* pGraph,
+        LPCWSTR pName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryVendorInfo(
+        LPWSTR* pVendorInfo) = 0;
+
+};
+#else
+typedef struct IBaseFilterVtbl IBaseFilterVtbl;
+struct IBaseFilter {
+    const IBaseFilterVtbl* lpVtbl;
+};
+struct IBaseFilterVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IBaseFilter* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IBaseFilter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IBaseFilter* This);
+
+    /*** IPersist methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetClassID)(
+        IBaseFilter* This,
+        CLSID* pClassID);
+
+    /*** IMediaFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *Stop)(
+        IBaseFilter* This);
+
+    HRESULT (STDMETHODCALLTYPE *Pause)(
+        IBaseFilter* This);
+
+    HRESULT (STDMETHODCALLTYPE *Run)(
+        IBaseFilter* This,
+        REFERENCE_TIME tStart);
+
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IBaseFilter* This,
+        DWORD dwMilliSecsTimeout,
+        FILTER_STATE* State);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncSource)(
+        IBaseFilter* This,
+        IReferenceClock* pClock);
+
+    HRESULT (STDMETHODCALLTYPE *GetSyncSource)(
+        IBaseFilter* This,
+        IReferenceClock** pClock);
+
+    /*** IBaseFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumPins)(
+        IBaseFilter* This,
+        IEnumPins** ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *FindPin)(
+        IBaseFilter* This,
+        LPCWSTR Id,
+        IPin** ppPin);
+
+    HRESULT (STDMETHODCALLTYPE *QueryFilterInfo)(
+        IBaseFilter* This,
+        FILTER_INFO* pInfo);
+
+    HRESULT (STDMETHODCALLTYPE *JoinFilterGraph)(
+        IBaseFilter* This,
+        IFilterGraph* pGraph,
+        LPCWSTR pName);
+
+    HRESULT (STDMETHODCALLTYPE *QueryVendorInfo)(
+        IBaseFilter* This,
+        LPWSTR* pVendorInfo);
+
+};
+
+/*** IUnknown methods ***/
+#define IBaseFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IBaseFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IBaseFilter_Release(p) (p)->lpVtbl->Release(p)
+/*** IPersist methods ***/
+#define IBaseFilter_GetClassID(p,a) (p)->lpVtbl->GetClassID(p,a)
+/*** IMediaFilter methods ***/
+#define IBaseFilter_Stop(p) (p)->lpVtbl->Stop(p)
+#define IBaseFilter_Pause(p) (p)->lpVtbl->Pause(p)
+#define IBaseFilter_Run(p,a) (p)->lpVtbl->Run(p,a)
+#define IBaseFilter_GetState(p,a,b) (p)->lpVtbl->GetState(p,a,b)
+#define IBaseFilter_SetSyncSource(p,a) (p)->lpVtbl->SetSyncSource(p,a)
+#define IBaseFilter_GetSyncSource(p,a) (p)->lpVtbl->GetSyncSource(p,a)
+/*** IBaseFilter methods ***/
+#define IBaseFilter_EnumPins(p,a) (p)->lpVtbl->EnumPins(p,a)
+#define IBaseFilter_FindPin(p,a,b) (p)->lpVtbl->FindPin(p,a,b)
+#define IBaseFilter_QueryFilterInfo(p,a) (p)->lpVtbl->QueryFilterInfo(p,a)
+#define IBaseFilter_JoinFilterGraph(p,a,b) (p)->lpVtbl->JoinFilterGraph(p,a,b)
+#define IBaseFilter_QueryVendorInfo(p,a) (p)->lpVtbl->QueryVendorInfo(p,a)
+
+#endif
+
+#define IBaseFilter_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;
+
+HRESULT CALLBACK IBaseFilter_EnumPins_Proxy(
+    IBaseFilter* This,
+    IEnumPins** ppEnum);
+void __RPC_STUB IBaseFilter_EnumPins_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IBaseFilter_FindPin_Proxy(
+    IBaseFilter* This,
+    LPCWSTR Id,
+    IPin** ppPin);
+void __RPC_STUB IBaseFilter_FindPin_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IBaseFilter_QueryFilterInfo_Proxy(
+    IBaseFilter* This,
+    FILTER_INFO* pInfo);
+void __RPC_STUB IBaseFilter_QueryFilterInfo_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IBaseFilter_JoinFilterGraph_Proxy(
+    IBaseFilter* This,
+    IFilterGraph* pGraph,
+    LPCWSTR pName);
+void __RPC_STUB IBaseFilter_JoinFilterGraph_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IBaseFilter_QueryVendorInfo_Proxy(
+    IBaseFilter* This,
+    LPWSTR* pVendorInfo);
+void __RPC_STUB IBaseFilter_QueryVendorInfo_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IBaseFilter *PFILTER;
+
+/*****************************************************************************
+ * IReferenceClock interface
+ */
+DEFINE_GUID(IID_IReferenceClock, 0x56a86897, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IReferenceClock : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetTime(
+        REFERENCE_TIME* pTime) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AdviseTime(
+        REFERENCE_TIME baseTime,
+        REFERENCE_TIME streamTime,
+        HEVENT hEvent,
+        DWORD_PTR* pdwAdviseCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AdvisePeriodic(
+        REFERENCE_TIME startTime,
+        REFERENCE_TIME periodTime,
+        HSEMAPHORE hSemaphore,
+        DWORD_PTR* pdwAdviseCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Unadvise(
+        DWORD_PTR dwAdviseCookie) = 0;
+
+};
+#else
+typedef struct IReferenceClockVtbl IReferenceClockVtbl;
+struct IReferenceClock {
+    const IReferenceClockVtbl* lpVtbl;
+};
+struct IReferenceClockVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IReferenceClock* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IReferenceClock* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IReferenceClock* This);
+
+    /*** IReferenceClock methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTime)(
+        IReferenceClock* This,
+        REFERENCE_TIME* pTime);
+
+    HRESULT (STDMETHODCALLTYPE *AdviseTime)(
+        IReferenceClock* This,
+        REFERENCE_TIME baseTime,
+        REFERENCE_TIME streamTime,
+        HEVENT hEvent,
+        DWORD_PTR* pdwAdviseCookie);
+
+    HRESULT (STDMETHODCALLTYPE *AdvisePeriodic)(
+        IReferenceClock* This,
+        REFERENCE_TIME startTime,
+        REFERENCE_TIME periodTime,
+        HSEMAPHORE hSemaphore,
+        DWORD_PTR* pdwAdviseCookie);
+
+    HRESULT (STDMETHODCALLTYPE *Unadvise)(
+        IReferenceClock* This,
+        DWORD_PTR dwAdviseCookie);
+
+};
+
+/*** IUnknown methods ***/
+#define IReferenceClock_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IReferenceClock_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IReferenceClock_Release(p) (p)->lpVtbl->Release(p)
+/*** IReferenceClock methods ***/
+#define IReferenceClock_GetTime(p,a) (p)->lpVtbl->GetTime(p,a)
+#define IReferenceClock_AdviseTime(p,a,b,c,d) (p)->lpVtbl->AdviseTime(p,a,b,c,d)
+#define IReferenceClock_AdvisePeriodic(p,a,b,c,d) (p)->lpVtbl->AdvisePeriodic(p,a,b,c,d)
+#define IReferenceClock_Unadvise(p,a) (p)->lpVtbl->Unadvise(p,a)
+
+#endif
+
+#define IReferenceClock_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; \
+    /*** IReferenceClock methods ***/ \
+    STDMETHOD_(HRESULT,GetTime)(THIS_ REFERENCE_TIME* pTime) PURE; \
+    STDMETHOD_(HRESULT,AdviseTime)(THIS_ REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HEVENT hEvent, DWORD_PTR* pdwAdviseCookie) PURE; \
+    STDMETHOD_(HRESULT,AdvisePeriodic)(THIS_ REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HSEMAPHORE hSemaphore, DWORD_PTR* pdwAdviseCookie) PURE; \
+    STDMETHOD_(HRESULT,Unadvise)(THIS_ DWORD_PTR dwAdviseCookie) PURE;
+
+HRESULT CALLBACK IReferenceClock_GetTime_Proxy(
+    IReferenceClock* This,
+    REFERENCE_TIME* pTime);
+void __RPC_STUB IReferenceClock_GetTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IReferenceClock_AdviseTime_Proxy(
+    IReferenceClock* This,
+    REFERENCE_TIME baseTime,
+    REFERENCE_TIME streamTime,
+    HEVENT hEvent,
+    DWORD_PTR* pdwAdviseCookie);
+void __RPC_STUB IReferenceClock_AdviseTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IReferenceClock_AdvisePeriodic_Proxy(
+    IReferenceClock* This,
+    REFERENCE_TIME startTime,
+    REFERENCE_TIME periodTime,
+    HSEMAPHORE hSemaphore,
+    DWORD_PTR* pdwAdviseCookie);
+void __RPC_STUB IReferenceClock_AdvisePeriodic_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IReferenceClock_Unadvise_Proxy(
+    IReferenceClock* This,
+    DWORD_PTR dwAdviseCookie);
+void __RPC_STUB IReferenceClock_Unadvise_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IReferenceClock *PREFERENCECLOCK;
+
+/*****************************************************************************
+ * IMediaSample interface
+ */
+DEFINE_GUID(IID_IMediaSample, 0x56a8689a, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMediaSample : public IUnknown
+{
+    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 length) = 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 IMediaSampleVtbl IMediaSampleVtbl;
+struct IMediaSample {
+    const IMediaSampleVtbl* lpVtbl;
+};
+struct IMediaSampleVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMediaSample* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMediaSample* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMediaSample* This);
+
+    /*** IMediaSample methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPointer)(
+        IMediaSample* This,
+        BYTE** ppBuffer);
+
+    long (STDMETHODCALLTYPE *GetSize)(
+        IMediaSample* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTime)(
+        IMediaSample* This,
+        REFERENCE_TIME* pTimeStart,
+        REFERENCE_TIME* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *SetTime)(
+        IMediaSample* This,
+        REFERENCE_TIME* pTimeStart,
+        REFERENCE_TIME* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *IsSyncPoint)(
+        IMediaSample* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncPoint)(
+        IMediaSample* This,
+        BOOL bIsSyncPoint);
+
+    HRESULT (STDMETHODCALLTYPE *IsPreroll)(
+        IMediaSample* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetPreroll)(
+        IMediaSample* This,
+        BOOL bIsPreroll);
+
+    long (STDMETHODCALLTYPE *GetActualDataLength)(
+        IMediaSample* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetActualDataLength)(
+        IMediaSample* This,
+        long length);
+
+    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
+        IMediaSample* This,
+        AM_MEDIA_TYPE** ppMediaType);
+
+    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
+        IMediaSample* This,
+        AM_MEDIA_TYPE* pMediaType);
+
+    HRESULT (STDMETHODCALLTYPE *IsDiscontinuity)(
+        IMediaSample* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetDiscontinuity)(
+        IMediaSample* This,
+        BOOL bDiscontinuity);
+
+    HRESULT (STDMETHODCALLTYPE *GetMediaTime)(
+        IMediaSample* This,
+        LONGLONG* pTimeStart,
+        LONGLONG* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *SetMediaTime)(
+        IMediaSample* This,
+        LONGLONG* pTimeStart,
+        LONGLONG* pTimeEnd);
+
+};
+
+/*** IUnknown methods ***/
+#define IMediaSample_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMediaSample_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMediaSample_Release(p) (p)->lpVtbl->Release(p)
+/*** IMediaSample methods ***/
+#define IMediaSample_GetPointer(p,a) (p)->lpVtbl->GetPointer(p,a)
+#define IMediaSample_GetSize(p) (p)->lpVtbl->GetSize(p)
+#define IMediaSample_GetTime(p,a,b) (p)->lpVtbl->GetTime(p,a,b)
+#define IMediaSample_SetTime(p,a,b) (p)->lpVtbl->SetTime(p,a,b)
+#define IMediaSample_IsSyncPoint(p) (p)->lpVtbl->IsSyncPoint(p)
+#define IMediaSample_SetSyncPoint(p,a) (p)->lpVtbl->SetSyncPoint(p,a)
+#define IMediaSample_IsPreroll(p) (p)->lpVtbl->IsPreroll(p)
+#define IMediaSample_SetPreroll(p,a) (p)->lpVtbl->SetPreroll(p,a)
+#define IMediaSample_GetActualDataLength(p) (p)->lpVtbl->GetActualDataLength(p)
+#define IMediaSample_SetActualDataLength(p,a) (p)->lpVtbl->SetActualDataLength(p,a)
+#define IMediaSample_GetMediaType(p,a) (p)->lpVtbl->GetMediaType(p,a)
+#define IMediaSample_SetMediaType(p,a) (p)->lpVtbl->SetMediaType(p,a)
+#define IMediaSample_IsDiscontinuity(p) (p)->lpVtbl->IsDiscontinuity(p)
+#define IMediaSample_SetDiscontinuity(p,a) (p)->lpVtbl->SetDiscontinuity(p,a)
+#define IMediaSample_GetMediaTime(p,a,b) (p)->lpVtbl->GetMediaTime(p,a,b)
+#define IMediaSample_SetMediaTime(p,a,b) (p)->lpVtbl->SetMediaTime(p,a,b)
+
+#endif
+
+#define IMediaSample_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; \
+    /*** IMediaSample methods ***/ \
+    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 length) 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 IMediaSample_GetPointer_Proxy(
+    IMediaSample* This,
+    BYTE** ppBuffer);
+void __RPC_STUB IMediaSample_GetPointer_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+long CALLBACK IMediaSample_GetSize_Proxy(
+    IMediaSample* This);
+void __RPC_STUB IMediaSample_GetSize_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_GetTime_Proxy(
+    IMediaSample* This,
+    REFERENCE_TIME* pTimeStart,
+    REFERENCE_TIME* pTimeEnd);
+void __RPC_STUB IMediaSample_GetTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetTime_Proxy(
+    IMediaSample* This,
+    REFERENCE_TIME* pTimeStart,
+    REFERENCE_TIME* pTimeEnd);
+void __RPC_STUB IMediaSample_SetTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_IsSyncPoint_Proxy(
+    IMediaSample* This);
+void __RPC_STUB IMediaSample_IsSyncPoint_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetSyncPoint_Proxy(
+    IMediaSample* This,
+    BOOL bIsSyncPoint);
+void __RPC_STUB IMediaSample_SetSyncPoint_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_IsPreroll_Proxy(
+    IMediaSample* This);
+void __RPC_STUB IMediaSample_IsPreroll_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetPreroll_Proxy(
+    IMediaSample* This,
+    BOOL bIsPreroll);
+void __RPC_STUB IMediaSample_SetPreroll_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+long CALLBACK IMediaSample_GetActualDataLength_Proxy(
+    IMediaSample* This);
+void __RPC_STUB IMediaSample_GetActualDataLength_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetActualDataLength_Proxy(
+    IMediaSample* This,
+    long length);
+void __RPC_STUB IMediaSample_SetActualDataLength_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_GetMediaType_Proxy(
+    IMediaSample* This,
+    AM_MEDIA_TYPE** ppMediaType);
+void __RPC_STUB IMediaSample_GetMediaType_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetMediaType_Proxy(
+    IMediaSample* This,
+    AM_MEDIA_TYPE* pMediaType);
+void __RPC_STUB IMediaSample_SetMediaType_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_IsDiscontinuity_Proxy(
+    IMediaSample* This);
+void __RPC_STUB IMediaSample_IsDiscontinuity_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetDiscontinuity_Proxy(
+    IMediaSample* This,
+    BOOL bDiscontinuity);
+void __RPC_STUB IMediaSample_SetDiscontinuity_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_GetMediaTime_Proxy(
+    IMediaSample* This,
+    LONGLONG* pTimeStart,
+    LONGLONG* pTimeEnd);
+void __RPC_STUB IMediaSample_GetMediaTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample_SetMediaTime_Proxy(
+    IMediaSample* This,
+    LONGLONG* pTimeStart,
+    LONGLONG* pTimeEnd);
+void __RPC_STUB IMediaSample_SetMediaTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMediaSample *PMEDIASAMPLE;
+
+enum tagAM_SAMPLE_PROPERTY_FLAGS {
+    AM_SAMPLE_SPLICEPOINT = 0x1,
+    AM_SAMPLE_PREROLL = 0x2,
+    AM_SAMPLE_DATADISCONTINUITY = 0x4,
+    AM_SAMPLE_TYPECHANGED = 0x8,
+    AM_SAMPLE_TIMEVALID = 0x10,
+    AM_SAMPLE_TIMEDISCONTINUITY = 0x40,
+    AM_SAMPLE_FLUSH_ON_PAUSE = 0x80,
+    AM_SAMPLE_STOPVALID = 0x100,
+    AM_SAMPLE_ENDOFSTREAM = 0x200,
+    AM_STREAM_MEDIA = 0,
+    AM_STREAM_CONTROL = 1
+};
+
+typedef struct tagAM_SAMPLE2_PROPERTIES {
+    DWORD cbData;
+    DWORD dwTypeSpecificFlags;
+    DWORD dwSampleFlags;
+    LONG lActual;
+    REFERENCE_TIME tStart;
+    REFERENCE_TIME tStop;
+    DWORD dwStreamId;
+    AM_MEDIA_TYPE *pMediaType;
+    BYTE *pbBuffer;
+    LONG cbBuffer;
+} AM_SAMPLE2_PROPERTIES;
+
+typedef struct IMediaSample2 IMediaSample2;
+/*****************************************************************************
+ * IMediaSample2 interface
+ */
+DEFINE_GUID(IID_IMediaSample2, 0x36b73884, 0xc2c8, 0x11cf, 0x8b,0x46, 0x00,0x80,0x5f,0x6c,0xef,0x60);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMediaSample2 : public IMediaSample
+{
+    virtual HRESULT STDMETHODCALLTYPE GetProperties(
+        DWORD cbProperties,
+        BYTE* pbProperties) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetProperties(
+        DWORD cbProperties,
+        const BYTE* pbProperties) = 0;
+
+};
+#else
+typedef struct IMediaSample2Vtbl IMediaSample2Vtbl;
+struct IMediaSample2 {
+    const IMediaSample2Vtbl* lpVtbl;
+};
+struct IMediaSample2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMediaSample2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMediaSample2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMediaSample2* This);
+
+    /*** IMediaSample methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPointer)(
+        IMediaSample2* This,
+        BYTE** ppBuffer);
+
+    long (STDMETHODCALLTYPE *GetSize)(
+        IMediaSample2* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetTime)(
+        IMediaSample2* This,
+        REFERENCE_TIME* pTimeStart,
+        REFERENCE_TIME* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *SetTime)(
+        IMediaSample2* This,
+        REFERENCE_TIME* pTimeStart,
+        REFERENCE_TIME* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *IsSyncPoint)(
+        IMediaSample2* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetSyncPoint)(
+        IMediaSample2* This,
+        BOOL bIsSyncPoint);
+
+    HRESULT (STDMETHODCALLTYPE *IsPreroll)(
+        IMediaSample2* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetPreroll)(
+        IMediaSample2* This,
+        BOOL bIsPreroll);
+
+    long (STDMETHODCALLTYPE *GetActualDataLength)(
+        IMediaSample2* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetActualDataLength)(
+        IMediaSample2* This,
+        long length);
+
+    HRESULT (STDMETHODCALLTYPE *GetMediaType)(
+        IMediaSample2* This,
+        AM_MEDIA_TYPE** ppMediaType);
+
+    HRESULT (STDMETHODCALLTYPE *SetMediaType)(
+        IMediaSample2* This,
+        AM_MEDIA_TYPE* pMediaType);
+
+    HRESULT (STDMETHODCALLTYPE *IsDiscontinuity)(
+        IMediaSample2* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetDiscontinuity)(
+        IMediaSample2* This,
+        BOOL bDiscontinuity);
+
+    HRESULT (STDMETHODCALLTYPE *GetMediaTime)(
+        IMediaSample2* This,
+        LONGLONG* pTimeStart,
+        LONGLONG* pTimeEnd);
+
+    HRESULT (STDMETHODCALLTYPE *SetMediaTime)(
+        IMediaSample2* This,
+        LONGLONG* pTimeStart,
+        LONGLONG* pTimeEnd);
+
+    /*** IMediaSample2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetProperties)(
+        IMediaSample2* This,
+        DWORD cbProperties,
+        BYTE* pbProperties);
+
+    HRESULT (STDMETHODCALLTYPE *SetProperties)(
+        IMediaSample2* This,
+        DWORD cbProperties,
+        const BYTE* pbProperties);
+
+};
+
+/*** IUnknown methods ***/
+#define IMediaSample2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMediaSample2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMediaSample2_Release(p) (p)->lpVtbl->Release(p)
+/*** IMediaSample methods ***/
+#define IMediaSample2_GetPointer(p,a) (p)->lpVtbl->GetPointer(p,a)
+#define IMediaSample2_GetSize(p) (p)->lpVtbl->GetSize(p)
+#define IMediaSample2_GetTime(p,a,b) (p)->lpVtbl->GetTime(p,a,b)
+#define IMediaSample2_SetTime(p,a,b) (p)->lpVtbl->SetTime(p,a,b)
+#define IMediaSample2_IsSyncPoint(p) (p)->lpVtbl->IsSyncPoint(p)
+#define IMediaSample2_SetSyncPoint(p,a) (p)->lpVtbl->SetSyncPoint(p,a)
+#define IMediaSample2_IsPreroll(p) (p)->lpVtbl->IsPreroll(p)
+#define IMediaSample2_SetPreroll(p,a) (p)->lpVtbl->SetPreroll(p,a)
+#define IMediaSample2_GetActualDataLength(p) (p)->lpVtbl->GetActualDataLength(p)
+#define IMediaSample2_SetActualDataLength(p,a) (p)->lpVtbl->SetActualDataLength(p,a)
+#define IMediaSample2_GetMediaType(p,a) (p)->lpVtbl->GetMediaType(p,a)
+#define IMediaSample2_SetMediaType(p,a) (p)->lpVtbl->SetMediaType(p,a)
+#define IMediaSample2_IsDiscontinuity(p) (p)->lpVtbl->IsDiscontinuity(p)
+#define IMediaSample2_SetDiscontinuity(p,a) (p)->lpVtbl->SetDiscontinuity(p,a)
+#define IMediaSample2_GetMediaTime(p,a,b) (p)->lpVtbl->GetMediaTime(p,a,b)
+#define IMediaSample2_SetMediaTime(p,a,b) (p)->lpVtbl->SetMediaTime(p,a,b)
+/*** IMediaSample2 methods ***/
+#define IMediaSample2_GetProperties(p,a,b) (p)->lpVtbl->GetProperties(p,a,b)
+#define IMediaSample2_SetProperties(p,a,b) (p)->lpVtbl->SetProperties(p,a,b)
+
+#endif
+
+#define IMediaSample2_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; \
+    /*** IMediaSample methods ***/ \
+    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 length) 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; \
+    /*** IMediaSample2 methods ***/ \
+    STDMETHOD_(HRESULT,GetProperties)(THIS_ DWORD cbProperties, BYTE* pbProperties) PURE; \
+    STDMETHOD_(HRESULT,SetProperties)(THIS_ DWORD cbProperties, const BYTE* pbProperties) PURE;
+
+HRESULT CALLBACK IMediaSample2_GetProperties_Proxy(
+    IMediaSample2* This,
+    DWORD cbProperties,
+    BYTE* pbProperties);
+void __RPC_STUB IMediaSample2_GetProperties_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSample2_SetProperties_Proxy(
+    IMediaSample2* This,
+    DWORD cbProperties,
+    const BYTE* pbProperties);
+void __RPC_STUB IMediaSample2_SetProperties_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMediaSample2 *PMEDIASAMPLE2;
+
+#define AM_GBF_PREVFRAMESKIPPED 1
+#define AM_GBF_NOTASYNCPOINT 2
+#define AM_GBF_NOWAIT 4
+/*****************************************************************************
+ * IMemAllocator interface
+ */
+DEFINE_GUID(IID_IMemAllocator, 0x56a8689c, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMemAllocator : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetProperties(
+        ALLOCATOR_PROPERTIES* pRequest,
+        ALLOCATOR_PROPERTIES* pActual) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetProperties(
+        ALLOCATOR_PROPERTIES* pProps) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Commit(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Decommit(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBuffer(
+        IMediaSample** ppBuffer,
+        REFERENCE_TIME* pStartTime,
+        REFERENCE_TIME* pEndTime,
+        DWORD dwFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer(
+        IMediaSample* pBuffer) = 0;
+
+};
+#else
+typedef struct IMemAllocatorVtbl IMemAllocatorVtbl;
+struct IMemAllocator {
+    const IMemAllocatorVtbl* lpVtbl;
+};
+struct IMemAllocatorVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMemAllocator* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMemAllocator* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMemAllocator* This);
+
+    /*** IMemAllocator methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetProperties)(
+        IMemAllocator* This,
+        ALLOCATOR_PROPERTIES* pRequest,
+        ALLOCATOR_PROPERTIES* pActual);
+
+    HRESULT (STDMETHODCALLTYPE *GetProperties)(
+        IMemAllocator* This,
+        ALLOCATOR_PROPERTIES* pProps);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IMemAllocator* This);
+
+    HRESULT (STDMETHODCALLTYPE *Decommit)(
+        IMemAllocator* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetBuffer)(
+        IMemAllocator* This,
+        IMediaSample** ppBuffer,
+        REFERENCE_TIME* pStartTime,
+        REFERENCE_TIME* pEndTime,
+        DWORD dwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseBuffer)(
+        IMemAllocator* This,
+        IMediaSample* pBuffer);
+
+};
+
+/*** IUnknown methods ***/
+#define IMemAllocator_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMemAllocator_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMemAllocator_Release(p) (p)->lpVtbl->Release(p)
+/*** IMemAllocator methods ***/
+#define IMemAllocator_SetProperties(p,a,b) (p)->lpVtbl->SetProperties(p,a,b)
+#define IMemAllocator_GetProperties(p,a) (p)->lpVtbl->GetProperties(p,a)
+#define IMemAllocator_Commit(p) (p)->lpVtbl->Commit(p)
+#define IMemAllocator_Decommit(p) (p)->lpVtbl->Decommit(p)
+#define IMemAllocator_GetBuffer(p,a,b,c,d) (p)->lpVtbl->GetBuffer(p,a,b,c,d)
+#define IMemAllocator_ReleaseBuffer(p,a) (p)->lpVtbl->ReleaseBuffer(p,a)
+
+#endif
+
+#define IMemAllocator_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; \
+    /*** IMemAllocator methods ***/ \
+    STDMETHOD_(HRESULT,SetProperties)(THIS_ ALLOCATOR_PROPERTIES* pRequest, ALLOCATOR_PROPERTIES* pActual) PURE; \
+    STDMETHOD_(HRESULT,GetProperties)(THIS_ ALLOCATOR_PROPERTIES* pProps) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Decommit)(THIS) PURE; \
+    STDMETHOD_(HRESULT,GetBuffer)(THIS_ IMediaSample** ppBuffer, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags) PURE; \
+    STDMETHOD_(HRESULT,ReleaseBuffer)(THIS_ IMediaSample* pBuffer) PURE;
+
+HRESULT CALLBACK IMemAllocator_SetProperties_Proxy(
+    IMemAllocator* This,
+    ALLOCATOR_PROPERTIES* pRequest,
+    ALLOCATOR_PROPERTIES* pActual);
+void __RPC_STUB IMemAllocator_SetProperties_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocator_GetProperties_Proxy(
+    IMemAllocator* This,
+    ALLOCATOR_PROPERTIES* pProps);
+void __RPC_STUB IMemAllocator_GetProperties_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocator_Commit_Proxy(
+    IMemAllocator* This);
+void __RPC_STUB IMemAllocator_Commit_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocator_Decommit_Proxy(
+    IMemAllocator* This);
+void __RPC_STUB IMemAllocator_Decommit_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocator_GetBuffer_Proxy(
+    IMemAllocator* This,
+    IMediaSample** ppBuffer,
+    REFERENCE_TIME* pStartTime,
+    REFERENCE_TIME* pEndTime,
+    DWORD dwFlags);
+void __RPC_STUB IMemAllocator_GetBuffer_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocator_ReleaseBuffer_Proxy(
+    IMemAllocator* This,
+    IMediaSample* pBuffer);
+void __RPC_STUB IMemAllocator_ReleaseBuffer_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMemAllocator *PMEMALLOCATOR;
+
+/*****************************************************************************
+ * IMemAllocatorCallbackTemp interface
+ */
+DEFINE_GUID(IID_IMemAllocatorCallbackTemp, 0x379a0cf0, 0xc1de, 0x11d2, 0xab,0xf5, 0x00,0xa0,0xc9,0x05,0xf3,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMemAllocatorCallbackTemp : public IMemAllocator
+{
+    virtual HRESULT STDMETHODCALLTYPE SetNotify(
+        IMemAllocatorNotifyCallbackTemp* pNotify) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFreeCount(
+        LONG* plBuffersFree) = 0;
+
+};
+#else
+typedef struct IMemAllocatorCallbackTempVtbl IMemAllocatorCallbackTempVtbl;
+struct IMemAllocatorCallbackTemp {
+    const IMemAllocatorCallbackTempVtbl* lpVtbl;
+};
+struct IMemAllocatorCallbackTempVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMemAllocatorCallbackTemp* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMemAllocatorCallbackTemp* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMemAllocatorCallbackTemp* This);
+
+    /*** IMemAllocator methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetProperties)(
+        IMemAllocatorCallbackTemp* This,
+        ALLOCATOR_PROPERTIES* pRequest,
+        ALLOCATOR_PROPERTIES* pActual);
+
+    HRESULT (STDMETHODCALLTYPE *GetProperties)(
+        IMemAllocatorCallbackTemp* This,
+        ALLOCATOR_PROPERTIES* pProps);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IMemAllocatorCallbackTemp* This);
+
+    HRESULT (STDMETHODCALLTYPE *Decommit)(
+        IMemAllocatorCallbackTemp* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetBuffer)(
+        IMemAllocatorCallbackTemp* This,
+        IMediaSample** ppBuffer,
+        REFERENCE_TIME* pStartTime,
+        REFERENCE_TIME* pEndTime,
+        DWORD dwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseBuffer)(
+        IMemAllocatorCallbackTemp* This,
+        IMediaSample* pBuffer);
+
+    /*** IMemAllocatorCallbackTemp methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetNotify)(
+        IMemAllocatorCallbackTemp* This,
+        IMemAllocatorNotifyCallbackTemp* pNotify);
+
+    HRESULT (STDMETHODCALLTYPE *GetFreeCount)(
+        IMemAllocatorCallbackTemp* This,
+        LONG* plBuffersFree);
+
+};
+
+/*** IUnknown methods ***/
+#define IMemAllocatorCallbackTemp_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMemAllocatorCallbackTemp_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMemAllocatorCallbackTemp_Release(p) (p)->lpVtbl->Release(p)
+/*** IMemAllocator methods ***/
+#define IMemAllocatorCallbackTemp_SetProperties(p,a,b) (p)->lpVtbl->SetProperties(p,a,b)
+#define IMemAllocatorCallbackTemp_GetProperties(p,a) (p)->lpVtbl->GetProperties(p,a)
+#define IMemAllocatorCallbackTemp_Commit(p) (p)->lpVtbl->Commit(p)
+#define IMemAllocatorCallbackTemp_Decommit(p) (p)->lpVtbl->Decommit(p)
+#define IMemAllocatorCallbackTemp_GetBuffer(p,a,b,c,d) (p)->lpVtbl->GetBuffer(p,a,b,c,d)
+#define IMemAllocatorCallbackTemp_ReleaseBuffer(p,a) (p)->lpVtbl->ReleaseBuffer(p,a)
+/*** IMemAllocatorCallbackTemp methods ***/
+#define IMemAllocatorCallbackTemp_SetNotify(p,a) (p)->lpVtbl->SetNotify(p,a)
+#define IMemAllocatorCallbackTemp_GetFreeCount(p,a) (p)->lpVtbl->GetFreeCount(p,a)
+
+#endif
+
+#define IMemAllocatorCallbackTemp_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; \
+    /*** IMemAllocator methods ***/ \
+    STDMETHOD_(HRESULT,SetProperties)(THIS_ ALLOCATOR_PROPERTIES* pRequest, ALLOCATOR_PROPERTIES* pActual) PURE; \
+    STDMETHOD_(HRESULT,GetProperties)(THIS_ ALLOCATOR_PROPERTIES* pProps) PURE; \
+    STDMETHOD_(HRESULT,Commit)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Decommit)(THIS) PURE; \
+    STDMETHOD_(HRESULT,GetBuffer)(THIS_ IMediaSample** ppBuffer, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags) PURE; \
+    STDMETHOD_(HRESULT,ReleaseBuffer)(THIS_ IMediaSample* pBuffer) PURE; \
+    /*** IMemAllocatorCallbackTemp methods ***/ \
+    STDMETHOD_(HRESULT,SetNotify)(THIS_ IMemAllocatorNotifyCallbackTemp* pNotify) PURE; \
+    STDMETHOD_(HRESULT,GetFreeCount)(THIS_ LONG* plBuffersFree) PURE;
+
+HRESULT CALLBACK IMemAllocatorCallbackTemp_SetNotify_Proxy(
+    IMemAllocatorCallbackTemp* This,
+    IMemAllocatorNotifyCallbackTemp* pNotify);
+void __RPC_STUB IMemAllocatorCallbackTemp_SetNotify_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemAllocatorCallbackTemp_GetFreeCount_Proxy(
+    IMemAllocatorCallbackTemp* This,
+    LONG* plBuffersFree);
+void __RPC_STUB IMemAllocatorCallbackTemp_GetFreeCount_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * IMemAllocatorNotifyCallbackTemp interface
+ */
+DEFINE_GUID(IID_IMemAllocatorNotifyCallbackTemp, 0x92980b30, 0xc1de, 0x11d2, 0xab,0xf5, 0x00,0xa0,0xc9,0x05,0xf3,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMemAllocatorNotifyCallbackTemp : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE NotifyRelease(
+        ) = 0;
+
+};
+#else
+typedef struct IMemAllocatorNotifyCallbackTempVtbl IMemAllocatorNotifyCallbackTempVtbl;
+struct IMemAllocatorNotifyCallbackTemp {
+    const IMemAllocatorNotifyCallbackTempVtbl* lpVtbl;
+};
+struct IMemAllocatorNotifyCallbackTempVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMemAllocatorNotifyCallbackTemp* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMemAllocatorNotifyCallbackTemp* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMemAllocatorNotifyCallbackTemp* This);
+
+    /*** IMemAllocatorNotifyCallbackTemp methods ***/
+    HRESULT (STDMETHODCALLTYPE *NotifyRelease)(
+        IMemAllocatorNotifyCallbackTemp* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IMemAllocatorNotifyCallbackTemp_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMemAllocatorNotifyCallbackTemp_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMemAllocatorNotifyCallbackTemp_Release(p) (p)->lpVtbl->Release(p)
+/*** IMemAllocatorNotifyCallbackTemp methods ***/
+#define IMemAllocatorNotifyCallbackTemp_NotifyRelease(p) (p)->lpVtbl->NotifyRelease(p)
+
+#endif
+
+#define IMemAllocatorNotifyCallbackTemp_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; \
+    /*** IMemAllocatorNotifyCallbackTemp methods ***/ \
+    STDMETHOD_(HRESULT,NotifyRelease)(THIS) PURE;
+
+HRESULT CALLBACK IMemAllocatorNotifyCallbackTemp_NotifyRelease_Proxy(
+    IMemAllocatorNotifyCallbackTemp* This);
+void __RPC_STUB IMemAllocatorNotifyCallbackTemp_NotifyRelease_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * IMemInputPin interface
+ */
+DEFINE_GUID(IID_IMemInputPin, 0x56a8689d, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMemInputPin : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetAllocator(
+        IMemAllocator** ppAllocator) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyAllocator(
+        IMemAllocator* pAllocator,
+        BOOL bReadOnly) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAllocatorRequirements(
+        ALLOCATOR_PROPERTIES* pProps) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Receive(
+        IMediaSample* pSample) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReceiveMultiple(
+        IMediaSample** pSamples,
+        long nSamples,
+        long* nSamplesProcessed) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReceiveCanBlock(
+        ) = 0;
+
+};
+#else
+typedef struct IMemInputPinVtbl IMemInputPinVtbl;
+struct IMemInputPin {
+    const IMemInputPinVtbl* lpVtbl;
+};
+struct IMemInputPinVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMemInputPin* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMemInputPin* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMemInputPin* This);
+
+    /*** IMemInputPin methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAllocator)(
+        IMemInputPin* This,
+        IMemAllocator** ppAllocator);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyAllocator)(
+        IMemInputPin* This,
+        IMemAllocator* pAllocator,
+        BOOL bReadOnly);
+
+    HRESULT (STDMETHODCALLTYPE *GetAllocatorRequirements)(
+        IMemInputPin* This,
+        ALLOCATOR_PROPERTIES* pProps);
+
+    HRESULT (STDMETHODCALLTYPE *Receive)(
+        IMemInputPin* This,
+        IMediaSample* pSample);
+
+    HRESULT (STDMETHODCALLTYPE *ReceiveMultiple)(
+        IMemInputPin* This,
+        IMediaSample** pSamples,
+        long nSamples,
+        long* nSamplesProcessed);
+
+    HRESULT (STDMETHODCALLTYPE *ReceiveCanBlock)(
+        IMemInputPin* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IMemInputPin_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMemInputPin_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMemInputPin_Release(p) (p)->lpVtbl->Release(p)
+/*** IMemInputPin methods ***/
+#define IMemInputPin_GetAllocator(p,a) (p)->lpVtbl->GetAllocator(p,a)
+#define IMemInputPin_NotifyAllocator(p,a,b) (p)->lpVtbl->NotifyAllocator(p,a,b)
+#define IMemInputPin_GetAllocatorRequirements(p,a) (p)->lpVtbl->GetAllocatorRequirements(p,a)
+#define IMemInputPin_Receive(p,a) (p)->lpVtbl->Receive(p,a)
+#define IMemInputPin_ReceiveMultiple(p,a,b,c) (p)->lpVtbl->ReceiveMultiple(p,a,b,c)
+#define IMemInputPin_ReceiveCanBlock(p) (p)->lpVtbl->ReceiveCanBlock(p)
+
+#endif
+
+#define IMemInputPin_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; \
+    /*** IMemInputPin methods ***/ \
+    STDMETHOD_(HRESULT,GetAllocator)(THIS_ IMemAllocator** ppAllocator) PURE; \
+    STDMETHOD_(HRESULT,NotifyAllocator)(THIS_ IMemAllocator* pAllocator, BOOL bReadOnly) PURE; \
+    STDMETHOD_(HRESULT,GetAllocatorRequirements)(THIS_ ALLOCATOR_PROPERTIES* pProps) PURE; \
+    STDMETHOD_(HRESULT,Receive)(THIS_ IMediaSample* pSample) PURE; \
+    STDMETHOD_(HRESULT,ReceiveMultiple)(THIS_ IMediaSample** pSamples, long nSamples, long* nSamplesProcessed) PURE; \
+    STDMETHOD_(HRESULT,ReceiveCanBlock)(THIS) PURE;
+
+HRESULT CALLBACK IMemInputPin_GetAllocator_Proxy(
+    IMemInputPin* This,
+    IMemAllocator** ppAllocator);
+void __RPC_STUB IMemInputPin_GetAllocator_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemInputPin_NotifyAllocator_Proxy(
+    IMemInputPin* This,
+    IMemAllocator* pAllocator,
+    BOOL bReadOnly);
+void __RPC_STUB IMemInputPin_NotifyAllocator_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemInputPin_GetAllocatorRequirements_Proxy(
+    IMemInputPin* This,
+    ALLOCATOR_PROPERTIES* pProps);
+void __RPC_STUB IMemInputPin_GetAllocatorRequirements_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemInputPin_Receive_Proxy(
+    IMemInputPin* This,
+    IMediaSample* pSample);
+void __RPC_STUB IMemInputPin_Receive_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemInputPin_ReceiveMultiple_Proxy(
+    IMemInputPin* This,
+    IMediaSample** pSamples,
+    long nSamples,
+    long* nSamplesProcessed);
+void __RPC_STUB IMemInputPin_ReceiveMultiple_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMemInputPin_ReceiveCanBlock_Proxy(
+    IMemInputPin* This);
+void __RPC_STUB IMemInputPin_ReceiveCanBlock_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMemInputPin *PMEMINPUTPIN;
+
+/*****************************************************************************
+ * IAMovieSetup interface
+ */
+DEFINE_GUID(IID_IAMovieSetup, 0xa3d8cec0, 0x7e5a, 0x11cf, 0xbb,0xc5, 0x00,0x80,0x5f,0x6c,0xef,0x20);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IAMovieSetup : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Register(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Unregister(
+        ) = 0;
+
+};
+#else
+typedef struct IAMovieSetupVtbl IAMovieSetupVtbl;
+struct IAMovieSetup {
+    const IAMovieSetupVtbl* lpVtbl;
+};
+struct IAMovieSetupVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMovieSetup* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMovieSetup* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMovieSetup* This);
+
+    /*** IAMovieSetup methods ***/
+    HRESULT (STDMETHODCALLTYPE *Register)(
+        IAMovieSetup* This);
+
+    HRESULT (STDMETHODCALLTYPE *Unregister)(
+        IAMovieSetup* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IAMovieSetup_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IAMovieSetup_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IAMovieSetup_Release(p) (p)->lpVtbl->Release(p)
+/*** IAMovieSetup methods ***/
+#define IAMovieSetup_Register(p) (p)->lpVtbl->Register(p)
+#define IAMovieSetup_Unregister(p) (p)->lpVtbl->Unregister(p)
+
+#endif
+
+#define IAMovieSetup_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; \
+    /*** IAMovieSetup methods ***/ \
+    STDMETHOD_(HRESULT,Register)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Unregister)(THIS) PURE;
+
+HRESULT CALLBACK IAMovieSetup_Register_Proxy(
+    IAMovieSetup* This);
+void __RPC_STUB IAMovieSetup_Register_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAMovieSetup_Unregister_Proxy(
+    IAMovieSetup* This);
+void __RPC_STUB IAMovieSetup_Unregister_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IAMovieSetup *PAMOVIESETUP;
+
+typedef enum AM_SEEKING_SeekingFlags {
+    AM_SEEKING_NoPositioning = 0x0,
+    AM_SEEKING_AbsolutePositioning = 0x1,
+    AM_SEEKING_RelativePositioning = 0x2,
+    AM_SEEKING_IncrementalPositioning = 0x3,
+    AM_SEEKING_PositioningBitsMask = 0x3,
+    AM_SEEKING_SeekToKeyFrame = 0x4,
+    AM_SEEKING_ReturnTime = 0x8,
+    AM_SEEKING_Segment = 0x10,
+    AM_SEEKING_NoFlush = 0x20
+} AM_SEEKING_SEEKING_FLAGS;
+
+typedef enum AM_SEEKING_SeekingCapabilities {
+    AM_SEEKING_CanSeekAbsolute = 0x1,
+    AM_SEEKING_CanSeekForwards = 0x2,
+    AM_SEEKING_CanSeekBackwards = 0x4,
+    AM_SEEKING_CanGetCurrentPos = 0x8,
+    AM_SEEKING_CanGetStopPos = 0x10,
+    AM_SEEKING_CanGetDuration = 0x20,
+    AM_SEEKING_CanPlayBackwards = 0x40,
+    AM_SEEKING_CanDoSegments = 0x80,
+    AM_SEEKING_Source = 0x100
+} AM_SEEKING_SEEKING_CAPABILITIES;
+
+typedef struct IMediaSeeking IMediaSeeking;
+/*****************************************************************************
+ * IMediaSeeking interface
+ */
+DEFINE_GUID(IID_IMediaSeeking, 0x36b73880, 0xc2c8, 0x11cf, 0x8b,0x46, 0x00,0x80,0x5f,0x6c,0xef,0x60);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMediaSeeking : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetCapabilities(
+        DWORD* pCapabilities) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CheckCapabilities(
+        DWORD* pCapabilities) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsFormatSupported(
+        const GUID* pFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryPreferredFormat(
+        GUID* pFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTimeFormat(
+        GUID* pFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(
+        const GUID* pFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTimeFormat(
+        const GUID* pFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDuration(
+        LONGLONG* pDuration) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStopPosition(
+        LONGLONG* pStop) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentPosition(
+        LONGLONG* pCurrent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConvertTimeFormat(
+        LONGLONG* pTarget,
+        const GUID* pTargetFormat,
+        LONGLONG Source,
+        const GUID* pSourceFormat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPositions(
+        LONGLONG* pCurrent,
+        DWORD dwCurrentFlags,
+        LONGLONG* pStop,
+        DWORD dwStopFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPositions(
+        LONGLONG* pCurrent,
+        LONGLONG* pStop) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAvailable(
+        LONGLONG* pEarliest,
+        LONGLONG* pLatest) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetRate(
+        double dRate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRate(
+        double* pdRate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPreroll(
+        LONGLONG* pllPreroll) = 0;
+
+};
+#else
+typedef struct IMediaSeekingVtbl IMediaSeekingVtbl;
+struct IMediaSeeking {
+    const IMediaSeekingVtbl* lpVtbl;
+};
+struct IMediaSeekingVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMediaSeeking* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMediaSeeking* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMediaSeeking* This);
+
+    /*** IMediaSeeking methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetCapabilities)(
+        IMediaSeeking* This,
+        DWORD* pCapabilities);
+
+    HRESULT (STDMETHODCALLTYPE *CheckCapabilities)(
+        IMediaSeeking* This,
+        DWORD* pCapabilities);
+
+    HRESULT (STDMETHODCALLTYPE *IsFormatSupported)(
+        IMediaSeeking* This,
+        const GUID* pFormat);
+
+    HRESULT (STDMETHODCALLTYPE *QueryPreferredFormat)(
+        IMediaSeeking* This,
+        GUID* pFormat);
+
+    HRESULT (STDMETHODCALLTYPE *GetTimeFormat)(
+        IMediaSeeking* This,
+        GUID* pFormat);
+
+    HRESULT (STDMETHODCALLTYPE *IsUsingTimeFormat)(
+        IMediaSeeking* This,
+        const GUID* pFormat);
+
+    HRESULT (STDMETHODCALLTYPE *SetTimeFormat)(
+        IMediaSeeking* This,
+        const GUID* pFormat);
+
+    HRESULT (STDMETHODCALLTYPE *GetDuration)(
+        IMediaSeeking* This,
+        LONGLONG* pDuration);
+
+    HRESULT (STDMETHODCALLTYPE *GetStopPosition)(
+        IMediaSeeking* This,
+        LONGLONG* pStop);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentPosition)(
+        IMediaSeeking* This,
+        LONGLONG* pCurrent);
+
+    HRESULT (STDMETHODCALLTYPE *ConvertTimeFormat)(
+        IMediaSeeking* This,
+        LONGLONG* pTarget,
+        const GUID* pTargetFormat,
+        LONGLONG Source,
+        const GUID* pSourceFormat);
+
+    HRESULT (STDMETHODCALLTYPE *SetPositions)(
+        IMediaSeeking* This,
+        LONGLONG* pCurrent,
+        DWORD dwCurrentFlags,
+        LONGLONG* pStop,
+        DWORD dwStopFlags);
+
+    HRESULT (STDMETHODCALLTYPE *GetPositions)(
+        IMediaSeeking* This,
+        LONGLONG* pCurrent,
+        LONGLONG* pStop);
+
+    HRESULT (STDMETHODCALLTYPE *GetAvailable)(
+        IMediaSeeking* This,
+        LONGLONG* pEarliest,
+        LONGLONG* pLatest);
+
+    HRESULT (STDMETHODCALLTYPE *SetRate)(
+        IMediaSeeking* This,
+        double dRate);
+
+    HRESULT (STDMETHODCALLTYPE *GetRate)(
+        IMediaSeeking* This,
+        double* pdRate);
+
+    HRESULT (STDMETHODCALLTYPE *GetPreroll)(
+        IMediaSeeking* This,
+        LONGLONG* pllPreroll);
+
+};
+
+/*** IUnknown methods ***/
+#define IMediaSeeking_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMediaSeeking_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMediaSeeking_Release(p) (p)->lpVtbl->Release(p)
+/*** IMediaSeeking methods ***/
+#define IMediaSeeking_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
+#define IMediaSeeking_CheckCapabilities(p,a) (p)->lpVtbl->CheckCapabilities(p,a)
+#define IMediaSeeking_IsFormatSupported(p,a) (p)->lpVtbl->IsFormatSupported(p,a)
+#define IMediaSeeking_QueryPreferredFormat(p,a) (p)->lpVtbl->QueryPreferredFormat(p,a)
+#define IMediaSeeking_GetTimeFormat(p,a) (p)->lpVtbl->GetTimeFormat(p,a)
+#define IMediaSeeking_IsUsingTimeFormat(p,a) (p)->lpVtbl->IsUsingTimeFormat(p,a)
+#define IMediaSeeking_SetTimeFormat(p,a) (p)->lpVtbl->SetTimeFormat(p,a)
+#define IMediaSeeking_GetDuration(p,a) (p)->lpVtbl->GetDuration(p,a)
+#define IMediaSeeking_GetStopPosition(p,a) (p)->lpVtbl->GetStopPosition(p,a)
+#define IMediaSeeking_GetCurrentPosition(p,a) (p)->lpVtbl->GetCurrentPosition(p,a)
+#define IMediaSeeking_ConvertTimeFormat(p,a,b,c,d) (p)->lpVtbl->ConvertTimeFormat(p,a,b,c,d)
+#define IMediaSeeking_SetPositions(p,a,b,c,d) (p)->lpVtbl->SetPositions(p,a,b,c,d)
+#define IMediaSeeking_GetPositions(p,a,b) (p)->lpVtbl->GetPositions(p,a,b)
+#define IMediaSeeking_GetAvailable(p,a,b) (p)->lpVtbl->GetAvailable(p,a,b)
+#define IMediaSeeking_SetRate(p,a) (p)->lpVtbl->SetRate(p,a)
+#define IMediaSeeking_GetRate(p,a) (p)->lpVtbl->GetRate(p,a)
+#define IMediaSeeking_GetPreroll(p,a) (p)->lpVtbl->GetPreroll(p,a)
+
+#endif
+
+#define IMediaSeeking_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; \
+    /*** IMediaSeeking methods ***/ \
+    STDMETHOD_(HRESULT,GetCapabilities)(THIS_ DWORD* pCapabilities) PURE; \
+    STDMETHOD_(HRESULT,CheckCapabilities)(THIS_ DWORD* pCapabilities) PURE; \
+    STDMETHOD_(HRESULT,IsFormatSupported)(THIS_ const GUID* pFormat) PURE; \
+    STDMETHOD_(HRESULT,QueryPreferredFormat)(THIS_ GUID* pFormat) PURE; \
+    STDMETHOD_(HRESULT,GetTimeFormat)(THIS_ GUID* pFormat) PURE; \
+    STDMETHOD_(HRESULT,IsUsingTimeFormat)(THIS_ const GUID* pFormat) PURE; \
+    STDMETHOD_(HRESULT,SetTimeFormat)(THIS_ const GUID* pFormat) PURE; \
+    STDMETHOD_(HRESULT,GetDuration)(THIS_ LONGLONG* pDuration) PURE; \
+    STDMETHOD_(HRESULT,GetStopPosition)(THIS_ LONGLONG* pStop) PURE; \
+    STDMETHOD_(HRESULT,GetCurrentPosition)(THIS_ LONGLONG* pCurrent) PURE; \
+    STDMETHOD_(HRESULT,ConvertTimeFormat)(THIS_ LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat) PURE; \
+    STDMETHOD_(HRESULT,SetPositions)(THIS_ LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags) PURE; \
+    STDMETHOD_(HRESULT,GetPositions)(THIS_ LONGLONG* pCurrent, LONGLONG* pStop) PURE; \
+    STDMETHOD_(HRESULT,GetAvailable)(THIS_ LONGLONG* pEarliest, LONGLONG* pLatest) PURE; \
+    STDMETHOD_(HRESULT,SetRate)(THIS_ double dRate) PURE; \
+    STDMETHOD_(HRESULT,GetRate)(THIS_ double* pdRate) PURE; \
+    STDMETHOD_(HRESULT,GetPreroll)(THIS_ LONGLONG* pllPreroll) PURE;
+
+HRESULT CALLBACK IMediaSeeking_GetCapabilities_Proxy(
+    IMediaSeeking* This,
+    DWORD* pCapabilities);
+void __RPC_STUB IMediaSeeking_GetCapabilities_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_CheckCapabilities_Proxy(
+    IMediaSeeking* This,
+    DWORD* pCapabilities);
+void __RPC_STUB IMediaSeeking_CheckCapabilities_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_IsFormatSupported_Proxy(
+    IMediaSeeking* This,
+    const GUID* pFormat);
+void __RPC_STUB IMediaSeeking_IsFormatSupported_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_QueryPreferredFormat_Proxy(
+    IMediaSeeking* This,
+    GUID* pFormat);
+void __RPC_STUB IMediaSeeking_QueryPreferredFormat_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetTimeFormat_Proxy(
+    IMediaSeeking* This,
+    GUID* pFormat);
+void __RPC_STUB IMediaSeeking_GetTimeFormat_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_IsUsingTimeFormat_Proxy(
+    IMediaSeeking* This,
+    const GUID* pFormat);
+void __RPC_STUB IMediaSeeking_IsUsingTimeFormat_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_SetTimeFormat_Proxy(
+    IMediaSeeking* This,
+    const GUID* pFormat);
+void __RPC_STUB IMediaSeeking_SetTimeFormat_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetDuration_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pDuration);
+void __RPC_STUB IMediaSeeking_GetDuration_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetStopPosition_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pStop);
+void __RPC_STUB IMediaSeeking_GetStopPosition_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetCurrentPosition_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pCurrent);
+void __RPC_STUB IMediaSeeking_GetCurrentPosition_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_ConvertTimeFormat_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pTarget,
+    const GUID* pTargetFormat,
+    LONGLONG Source,
+    const GUID* pSourceFormat);
+void __RPC_STUB IMediaSeeking_ConvertTimeFormat_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_SetPositions_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pCurrent,
+    DWORD dwCurrentFlags,
+    LONGLONG* pStop,
+    DWORD dwStopFlags);
+void __RPC_STUB IMediaSeeking_SetPositions_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetPositions_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pCurrent,
+    LONGLONG* pStop);
+void __RPC_STUB IMediaSeeking_GetPositions_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetAvailable_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pEarliest,
+    LONGLONG* pLatest);
+void __RPC_STUB IMediaSeeking_GetAvailable_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_SetRate_Proxy(
+    IMediaSeeking* This,
+    double dRate);
+void __RPC_STUB IMediaSeeking_SetRate_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetRate_Proxy(
+    IMediaSeeking* This,
+    double* pdRate);
+void __RPC_STUB IMediaSeeking_GetRate_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IMediaSeeking_GetPreroll_Proxy(
+    IMediaSeeking* This,
+    LONGLONG* pllPreroll);
+void __RPC_STUB IMediaSeeking_GetPreroll_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMediaSeeking *PMEDIASEEKING;
+
+enum tagAM_MEDIAEVENT_FLAGS {
+    AM_MEDIAEVENT_NONOTIFY = 0x1
+};
+
+typedef struct IAMAnalogVideoDecoder IAMAnalogVideoDecoder;
+typedef struct IAMAnalogVideoEncoder IAMAnalogVideoEncoder;
+typedef struct IAMAudioInputMixer IAMAudioInputMixer;
+typedef struct IAMAudioRendererStats IAMAudioRendererStats;
+typedef struct IAMBufferNegotiation IAMBufferNegotiation;
+typedef struct IAMCameraControl IAMCameraControl;
+typedef struct IAMCopyCaptureFileProgress IAMCopyCaptureFileProgress;
+typedef struct IAMCrossbar IAMCrossbar;
+typedef struct IAMDevMemoryAllocator IAMDevMemoryAllocator;
+typedef struct IAMDevMemoryControl IAMDevMemoryControl;
+typedef struct IAMDroppedFrames IAMDroppedFrames;
+typedef struct IAMExtDevice IAMExtDevice;
+typedef struct IAMExtTransport IAMExtTransport;
+typedef struct IAMGraphStreams IAMGraphStreams;
+typedef struct IAMLatency IAMLatency;
+typedef struct IAMOpenProgress IAMOpenProgress;
+typedef struct IAMOverlayFX IAMOverlayFX;
+typedef struct IAMPhysicalPinInfo IAMPhysicalPinInfo;
+typedef struct IAMPushSource IAMPushSource;
+typedef struct IAMStreamConfig IAMStreamConfig;
+typedef struct IAMTimecodeDisplay IAMTimecodeDisplay;
+typedef struct IAMTimecodeGenerator IAMTimecodeGenerator;
+typedef struct IAMTimecodeReader IAMTimecodeReader;
+typedef struct IAMTVTuner IAMTVTuner;
+typedef struct IAMVfwCaptureDialogs IAMVfwCaptureDialogs;
+typedef struct IAMVfwCompressDialogs IAMVfwCompressDialogs;
+typedef struct IAMVideoCompression IAMVideoCompression;
+typedef struct IAMVideoDecimationProperties IAMVideoDecimationProperties;
+typedef struct IAMVideoProcAmp IAMVideoProcAmp;
+typedef struct ICaptureGraphBuilder ICaptureGraphBuilder;
+typedef struct ICaptureGraphBuilder2 ICaptureGraphBuilder2;
+typedef struct IConfigAviMux IConfigAviMux;
+typedef struct IConfigInterleaving IConfigInterleaving;
+typedef struct IDecimateVideoImage IDecimateVideoImage;
+typedef struct IDrawVideoImage IDrawVideoImage;
+typedef struct IEnumRegFilters IEnumRegFilters;
+typedef struct IEnumStreamIdMap IEnumStreamIdMap;
+typedef struct IFileSourceFilter IFileSourceFilter;
+typedef struct IFileSinkFilter IFileSinkFilter;
+typedef struct IFileSinkFilter2 IFileSinkFilter2;
+typedef struct IFilterMapper IFilterMapper;
+typedef struct IFilterMapper2 IFilterMapper2;
+typedef struct IGraphBuilder IGraphBuilder;
+typedef struct IKsPropertySet IKsPropertySet;
+typedef struct IMediaEventSink IMediaEventSink;
+typedef struct IMpeg2Demultiplexer IMpeg2Demultiplexer;
+typedef struct IMPEG2StreamIdMap IMPEG2StreamIdMap;
+typedef struct IOverlay IOverlay;
+typedef struct IOverlayNotify IOverlayNotify;
+typedef struct IOverlayNotify2 IOverlayNotify2;
+typedef struct IQualityControl IQualityControl;
+typedef struct ISeekingPassThru ISeekingPassThru;
+typedef struct {
+    CLSID Clsid;
+    LPWSTR Name;
+} REGFILTER;
+
+/*****************************************************************************
+ * IEnumRegFilters interface
+ */
+DEFINE_GUID(IID_IEnumRegFilters, 0x56a868a4, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IEnumRegFilters : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Next(
+        ULONG cFilters,
+        REGFILTER** apRegFilter,
+        ULONG* pcFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG cFilters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumRegFilters** ppEnum) = 0;
+
+};
+#else
+typedef struct IEnumRegFiltersVtbl IEnumRegFiltersVtbl;
+struct IEnumRegFilters {
+    const IEnumRegFiltersVtbl* lpVtbl;
+};
+struct IEnumRegFiltersVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumRegFilters* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumRegFilters* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumRegFilters* This);
+
+    /*** IEnumRegFilters methods ***/
+    HRESULT (STDMETHODCALLTYPE *Next)(
+        IEnumRegFilters* This,
+        ULONG cFilters,
+        REGFILTER** apRegFilter,
+        ULONG* pcFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumRegFilters* This,
+        ULONG cFilters);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumRegFilters* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumRegFilters* This,
+        IEnumRegFilters** ppEnum);
+
+};
+
+/*** IUnknown methods ***/
+#define IEnumRegFilters_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IEnumRegFilters_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IEnumRegFilters_Release(p) (p)->lpVtbl->Release(p)
+/*** IEnumRegFilters methods ***/
+#define IEnumRegFilters_Next(p,a,b,c) (p)->lpVtbl->Next(p,a,b,c)
+#define IEnumRegFilters_Skip(p,a) (p)->lpVtbl->Skip(p,a)
+#define IEnumRegFilters_Reset(p) (p)->lpVtbl->Reset(p)
+#define IEnumRegFilters_Clone(p,a) (p)->lpVtbl->Clone(p,a)
+
+#endif
+
+#define IEnumRegFilters_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; \
+    /*** IEnumRegFilters methods ***/ \
+    STDMETHOD_(HRESULT,Next)(THIS_ ULONG cFilters, REGFILTER** apRegFilter, ULONG* pcFetched) PURE; \
+    STDMETHOD_(HRESULT,Skip)(THIS_ ULONG cFilters) PURE; \
+    STDMETHOD_(HRESULT,Reset)(THIS) PURE; \
+    STDMETHOD_(HRESULT,Clone)(THIS_ IEnumRegFilters** ppEnum) PURE;
+
+HRESULT CALLBACK IEnumRegFilters_Next_Proxy(
+    IEnumRegFilters* This,
+    ULONG cFilters,
+    REGFILTER** apRegFilter,
+    ULONG* pcFetched);
+void __RPC_STUB IEnumRegFilters_Next_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumRegFilters_Skip_Proxy(
+    IEnumRegFilters* This,
+    ULONG cFilters);
+void __RPC_STUB IEnumRegFilters_Skip_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumRegFilters_Reset_Proxy(
+    IEnumRegFilters* This);
+void __RPC_STUB IEnumRegFilters_Reset_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumRegFilters_Clone_Proxy(
+    IEnumRegFilters* This,
+    IEnumRegFilters** ppEnum);
+void __RPC_STUB IEnumRegFilters_Clone_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IEnumRegFilters *PENUMREGFILTERS;
+
+enum {
+    MERIT_PREFERRED = 0x800000,
+    MERIT_NORMAL = 0x600000,
+    MERIT_UNLIKELY = 0x400000,
+    MERIT_DO_NOT_USE = 0x200000,
+    MERIT_SW_COMPRESSOR = 0x100000,
+    MERIT_HW_COMPRESSOR = 0x100050
+};
+
+/*****************************************************************************
+ * IFilterMapper interface
+ */
+DEFINE_GUID(IID_IFilterMapper, 0x56a868a3, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterMapper : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE RegisterFilter(
+        CLSID clsid,
+        LPCWSTR Name,
+        DWORD dwMerit) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterFilterInstance(
+        CLSID clsid,
+        LPCWSTR Name,
+        CLSID* MRId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterPin(
+        CLSID Filter,
+        LPCWSTR Name,
+        BOOL bRendered,
+        BOOL bOutput,
+        BOOL bZero,
+        BOOL bMany,
+        CLSID ConnectsToFilter,
+        LPCWSTR ConnectsToPin) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterPinType(
+        CLSID clsFilter,
+        LPCWSTR strName,
+        CLSID clsMajorType,
+        CLSID clsSubType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterFilter(
+        CLSID Filter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterFilterInstance(
+        CLSID MRId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterPin(
+        CLSID Filter,
+        LPCWSTR Name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumMatchingFilters(
+        IEnumRegFilters** ppEnum,
+        DWORD dwMerit,
+        BOOL bInputNeeded,
+        CLSID clsInMaj,
+        CLSID clsInSub,
+        BOOL bRender,
+        BOOL bOututNeeded,
+        CLSID clsOutMaj,
+        CLSID clsOutSub) = 0;
+
+};
+#else
+typedef struct IFilterMapperVtbl IFilterMapperVtbl;
+struct IFilterMapper {
+    const IFilterMapperVtbl* lpVtbl;
+};
+struct IFilterMapperVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterMapper* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterMapper* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterMapper* This);
+
+    /*** IFilterMapper methods ***/
+    HRESULT (STDMETHODCALLTYPE *RegisterFilter)(
+        IFilterMapper* This,
+        CLSID clsid,
+        LPCWSTR Name,
+        DWORD dwMerit);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFilterInstance)(
+        IFilterMapper* This,
+        CLSID clsid,
+        LPCWSTR Name,
+        CLSID* MRId);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterPin)(
+        IFilterMapper* This,
+        CLSID Filter,
+        LPCWSTR Name,
+        BOOL bRendered,
+        BOOL bOutput,
+        BOOL bZero,
+        BOOL bMany,
+        CLSID ConnectsToFilter,
+        LPCWSTR ConnectsToPin);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterPinType)(
+        IFilterMapper* This,
+        CLSID clsFilter,
+        LPCWSTR strName,
+        CLSID clsMajorType,
+        CLSID clsSubType);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFilter)(
+        IFilterMapper* This,
+        CLSID Filter);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFilterInstance)(
+        IFilterMapper* This,
+        CLSID MRId);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterPin)(
+        IFilterMapper* This,
+        CLSID Filter,
+        LPCWSTR Name);
+
+    HRESULT (STDMETHODCALLTYPE *EnumMatchingFilters)(
+        IFilterMapper* This,
+        IEnumRegFilters** ppEnum,
+        DWORD dwMerit,
+        BOOL bInputNeeded,
+        CLSID clsInMaj,
+        CLSID clsInSub,
+        BOOL bRender,
+        BOOL bOututNeeded,
+        CLSID clsOutMaj,
+        CLSID clsOutSub);
+
+};
+
+/*** IUnknown methods ***/
+#define IFilterMapper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterMapper_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterMapper_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterMapper methods ***/
+#define IFilterMapper_RegisterFilter(p,a,b,c) (p)->lpVtbl->RegisterFilter(p,a,b,c)
+#define IFilterMapper_RegisterFilterInstance(p,a,b,c) (p)->lpVtbl->RegisterFilterInstance(p,a,b,c)
+#define IFilterMapper_RegisterPin(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->RegisterPin(p,a,b,c,d,e,f,g,h)
+#define IFilterMapper_RegisterPinType(p,a,b,c,d) (p)->lpVtbl->RegisterPinType(p,a,b,c,d)
+#define IFilterMapper_UnregisterFilter(p,a) (p)->lpVtbl->UnregisterFilter(p,a)
+#define IFilterMapper_UnregisterFilterInstance(p,a) (p)->lpVtbl->UnregisterFilterInstance(p,a)
+#define IFilterMapper_UnregisterPin(p,a,b) (p)->lpVtbl->UnregisterPin(p,a,b)
+#define IFilterMapper_EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i) (p)->lpVtbl->EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i)
+
+#endif
+
+#define IFilterMapper_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; \
+    /*** IFilterMapper methods ***/ \
+    STDMETHOD_(HRESULT,RegisterFilter)(THIS_ CLSID clsid, LPCWSTR Name, DWORD dwMerit) PURE; \
+    STDMETHOD_(HRESULT,RegisterFilterInstance)(THIS_ CLSID clsid, LPCWSTR Name, CLSID* MRId) PURE; \
+    STDMETHOD_(HRESULT,RegisterPin)(THIS_ CLSID Filter, LPCWSTR Name, BOOL bRendered, BOOL bOutput, BOOL bZero, BOOL bMany, CLSID ConnectsToFilter, LPCWSTR ConnectsToPin) PURE; \
+    STDMETHOD_(HRESULT,RegisterPinType)(THIS_ CLSID clsFilter, LPCWSTR strName, CLSID clsMajorType, CLSID clsSubType) PURE; \
+    STDMETHOD_(HRESULT,UnregisterFilter)(THIS_ CLSID Filter) PURE; \
+    STDMETHOD_(HRESULT,UnregisterFilterInstance)(THIS_ CLSID MRId) PURE; \
+    STDMETHOD_(HRESULT,UnregisterPin)(THIS_ CLSID Filter, LPCWSTR Name) PURE; \
+    STDMETHOD_(HRESULT,EnumMatchingFilters)(THIS_ IEnumRegFilters** ppEnum, DWORD dwMerit, BOOL bInputNeeded, CLSID clsInMaj, CLSID clsInSub, BOOL bRender, BOOL bOututNeeded, CLSID clsOutMaj, CLSID clsOutSub) PURE;
+
+HRESULT CALLBACK IFilterMapper_RegisterFilter_Proxy(
+    IFilterMapper* This,
+    CLSID clsid,
+    LPCWSTR Name,
+    DWORD dwMerit);
+void __RPC_STUB IFilterMapper_RegisterFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_RegisterFilterInstance_Proxy(
+    IFilterMapper* This,
+    CLSID clsid,
+    LPCWSTR Name,
+    CLSID* MRId);
+void __RPC_STUB IFilterMapper_RegisterFilterInstance_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_RegisterPin_Proxy(
+    IFilterMapper* This,
+    CLSID Filter,
+    LPCWSTR Name,
+    BOOL bRendered,
+    BOOL bOutput,
+    BOOL bZero,
+    BOOL bMany,
+    CLSID ConnectsToFilter,
+    LPCWSTR ConnectsToPin);
+void __RPC_STUB IFilterMapper_RegisterPin_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_RegisterPinType_Proxy(
+    IFilterMapper* This,
+    CLSID clsFilter,
+    LPCWSTR strName,
+    CLSID clsMajorType,
+    CLSID clsSubType);
+void __RPC_STUB IFilterMapper_RegisterPinType_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_UnregisterFilter_Proxy(
+    IFilterMapper* This,
+    CLSID Filter);
+void __RPC_STUB IFilterMapper_UnregisterFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_UnregisterFilterInstance_Proxy(
+    IFilterMapper* This,
+    CLSID MRId);
+void __RPC_STUB IFilterMapper_UnregisterFilterInstance_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_UnregisterPin_Proxy(
+    IFilterMapper* This,
+    CLSID Filter,
+    LPCWSTR Name);
+void __RPC_STUB IFilterMapper_UnregisterPin_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper_EnumMatchingFilters_Proxy(
+    IFilterMapper* This,
+    IEnumRegFilters** ppEnum,
+    DWORD dwMerit,
+    BOOL bInputNeeded,
+    CLSID clsInMaj,
+    CLSID clsInSub,
+    BOOL bRender,
+    BOOL bOututNeeded,
+    CLSID clsOutMaj,
+    CLSID clsOutSub);
+void __RPC_STUB IFilterMapper_EnumMatchingFilters_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct {
+    const CLSID *clsMajorType;
+    const CLSID *clsMinorType;
+} REGPINTYPES;
+
+typedef struct {
+    LPWSTR strName;
+    BOOL bRendered;
+    BOOL bOutput;
+    BOOL bZero;
+    BOOL bMany;
+    const CLSID *clsConnectsToFilter;
+    const WCHAR *strConnectsToPin;
+    UINT nMediaTypes;
+    const REGPINTYPES *lpMediaType;
+} REGFILTERPINS;
+
+typedef struct {
+    CLSID clsMedium;
+    DWORD dw1;
+    DWORD dw2;
+} REGPINMEDIUM;
+
+enum {
+    REG_PINFLAG_B_ZERO = 0x1,
+    REG_PINFLAG_B_RENDERER = 0x2,
+    REG_PINFLAG_B_MANY = 0x4,
+    REG_PINFLAG_B_OUTPUT = 0x8
+};
+
+typedef struct {
+    DWORD dwFlags;
+    UINT cInstances;
+    UINT nMediaTypes;
+    const REGPINTYPES *lpMediaType;
+    UINT nMediums;
+    const REGPINMEDIUM *lpMedium;
+    const CLSID *clsPinCategory;
+} REGFILTERPINS2;
+
+typedef struct {
+    DWORD dwVersion;
+    DWORD dwMerit;
+    union {
+        struct {
+            ULONG cPins;
+            const REGFILTERPINS *rgPins;
+        } DUMMYSTRUCTNAME;
+        struct {
+            ULONG cPins2;
+            const REGFILTERPINS2 *rgPins2;
+        } DUMMYSTRUCTNAME1;
+    } DUMMYUNIONNAME;
+} REGFILTER2;
+
+/*****************************************************************************
+ * IFilterMapper2 interface
+ */
+DEFINE_GUID(IID_IFilterMapper2, 0xb79bb0b0, 0x33c1, 0x11d1, 0xab,0xe1, 0x00,0xa0,0xc9,0x05,0xf3,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterMapper2 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateCategory(
+        REFCLSID clsidCategory,
+        DWORD dwCategoryMerit,
+        LPCWSTR Description) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnregisterFilter(
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        REFCLSID Filter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterFilter(
+        REFCLSID clsidFilter,
+        LPCWSTR Name,
+        IMoniker** ppMoniker,
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        const REGFILTER2* prf2) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumMatchingFilters(
+        IEnumMoniker** ppEnum,
+        DWORD dwFlags,
+        BOOL bExactMatch,
+        DWORD dwMerit,
+        BOOL bInputNeeded,
+        DWORD cInputTypes,
+        const GUID* pInputTypes,
+        const REGPINMEDIUM* pMedIn,
+        const CLSID* pPinCategoryIn,
+        BOOL bRender,
+        BOOL bOutputNeeded,
+        DWORD cOutputTypes,
+        const GUID* pOutputTypes,
+        const REGPINMEDIUM* pMedOut,
+        const CLSID* pPinCategoryOut) = 0;
+
+};
+#else
+typedef struct IFilterMapper2Vtbl IFilterMapper2Vtbl;
+struct IFilterMapper2 {
+    const IFilterMapper2Vtbl* lpVtbl;
+};
+struct IFilterMapper2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterMapper2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterMapper2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterMapper2* This);
+
+    /*** IFilterMapper2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateCategory)(
+        IFilterMapper2* This,
+        REFCLSID clsidCategory,
+        DWORD dwCategoryMerit,
+        LPCWSTR Description);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFilter)(
+        IFilterMapper2* This,
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        REFCLSID Filter);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFilter)(
+        IFilterMapper2* This,
+        REFCLSID clsidFilter,
+        LPCWSTR Name,
+        IMoniker** ppMoniker,
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        const REGFILTER2* prf2);
+
+    HRESULT (STDMETHODCALLTYPE *EnumMatchingFilters)(
+        IFilterMapper2* This,
+        IEnumMoniker** ppEnum,
+        DWORD dwFlags,
+        BOOL bExactMatch,
+        DWORD dwMerit,
+        BOOL bInputNeeded,
+        DWORD cInputTypes,
+        const GUID* pInputTypes,
+        const REGPINMEDIUM* pMedIn,
+        const CLSID* pPinCategoryIn,
+        BOOL bRender,
+        BOOL bOutputNeeded,
+        DWORD cOutputTypes,
+        const GUID* pOutputTypes,
+        const REGPINMEDIUM* pMedOut,
+        const CLSID* pPinCategoryOut);
+
+};
+
+/*** IUnknown methods ***/
+#define IFilterMapper2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterMapper2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterMapper2_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterMapper2 methods ***/
+#define IFilterMapper2_CreateCategory(p,a,b,c) (p)->lpVtbl->CreateCategory(p,a,b,c)
+#define IFilterMapper2_UnregisterFilter(p,a,b,c) (p)->lpVtbl->UnregisterFilter(p,a,b,c)
+#define IFilterMapper2_RegisterFilter(p,a,b,c,d,e,f) (p)->lpVtbl->RegisterFilter(p,a,b,c,d,e,f)
+#define IFilterMapper2_EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) (p)->lpVtbl->EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
+
+#endif
+
+#define IFilterMapper2_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; \
+    /*** IFilterMapper2 methods ***/ \
+    STDMETHOD_(HRESULT,CreateCategory)(THIS_ REFCLSID clsidCategory, DWORD dwCategoryMerit, LPCWSTR Description) PURE; \
+    STDMETHOD_(HRESULT,UnregisterFilter)(THIS_ const CLSID* pclsidCategory, const OLECHAR* szInstance, REFCLSID Filter) PURE; \
+    STDMETHOD_(HRESULT,RegisterFilter)(THIS_ REFCLSID clsidFilter, LPCWSTR Name, IMoniker** ppMoniker, const CLSID* pclsidCategory, const OLECHAR* szInstance, const REGFILTER2* prf2) PURE; \
+    STDMETHOD_(HRESULT,EnumMatchingFilters)(THIS_ IEnumMoniker** ppEnum, DWORD dwFlags, BOOL bExactMatch, DWORD dwMerit, BOOL bInputNeeded, DWORD cInputTypes, const GUID* pInputTypes, const REGPINMEDIUM* pMedIn, const CLSID* pPinCategoryIn, BOOL bRender, BOOL bOutputNeeded, DWORD cOutputTypes, const GUID* pOutputTypes, const REGPINMEDIUM* pMedOut, const CLSID* pPinCategoryOut) PURE;
+
+HRESULT CALLBACK IFilterMapper2_CreateCategory_Proxy(
+    IFilterMapper2* This,
+    REFCLSID clsidCategory,
+    DWORD dwCategoryMerit,
+    LPCWSTR Description);
+void __RPC_STUB IFilterMapper2_CreateCategory_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper2_UnregisterFilter_Proxy(
+    IFilterMapper2* This,
+    const CLSID* pclsidCategory,
+    const OLECHAR* szInstance,
+    REFCLSID Filter);
+void __RPC_STUB IFilterMapper2_UnregisterFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper2_RegisterFilter_Proxy(
+    IFilterMapper2* This,
+    REFCLSID clsidFilter,
+    LPCWSTR Name,
+    IMoniker** ppMoniker,
+    const CLSID* pclsidCategory,
+    const OLECHAR* szInstance,
+    const REGFILTER2* prf2);
+void __RPC_STUB IFilterMapper2_RegisterFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterMapper2_EnumMatchingFilters_Proxy(
+    IFilterMapper2* This,
+    IEnumMoniker** ppEnum,
+    DWORD dwFlags,
+    BOOL bExactMatch,
+    DWORD dwMerit,
+    BOOL bInputNeeded,
+    DWORD cInputTypes,
+    const GUID* pInputTypes,
+    const REGPINMEDIUM* pMedIn,
+    const CLSID* pPinCategoryIn,
+    BOOL bRender,
+    BOOL bOutputNeeded,
+    DWORD cOutputTypes,
+    const GUID* pOutputTypes,
+    const REGPINMEDIUM* pMedOut,
+    const CLSID* pPinCategoryOut);
+void __RPC_STUB IFilterMapper2_EnumMatchingFilters_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IFilterMapper3 IFilterMapper3;
+/*****************************************************************************
+ * IFilterMapper3 interface
+ */
+DEFINE_GUID(IID_IFilterMapper3, 0xb79bb0b1, 0x33c1, 0x11d1, 0xab,0xe1, 0x00,0xa0,0xc9,0x05,0xf3,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterMapper3 : public IFilterMapper2
+{
+    virtual HRESULT STDMETHODCALLTYPE GetICreateDevEnum(
+        ICreateDevEnum** ppEnum) = 0;
+
+};
+#else
+typedef struct IFilterMapper3Vtbl IFilterMapper3Vtbl;
+struct IFilterMapper3 {
+    const IFilterMapper3Vtbl* lpVtbl;
+};
+struct IFilterMapper3Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterMapper3* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterMapper3* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterMapper3* This);
+
+    /*** IFilterMapper2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateCategory)(
+        IFilterMapper3* This,
+        REFCLSID clsidCategory,
+        DWORD dwCategoryMerit,
+        LPCWSTR Description);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterFilter)(
+        IFilterMapper3* This,
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        REFCLSID Filter);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterFilter)(
+        IFilterMapper3* This,
+        REFCLSID clsidFilter,
+        LPCWSTR Name,
+        IMoniker** ppMoniker,
+        const CLSID* pclsidCategory,
+        const OLECHAR* szInstance,
+        const REGFILTER2* prf2);
+
+    HRESULT (STDMETHODCALLTYPE *EnumMatchingFilters)(
+        IFilterMapper3* This,
+        IEnumMoniker** ppEnum,
+        DWORD dwFlags,
+        BOOL bExactMatch,
+        DWORD dwMerit,
+        BOOL bInputNeeded,
+        DWORD cInputTypes,
+        const GUID* pInputTypes,
+        const REGPINMEDIUM* pMedIn,
+        const CLSID* pPinCategoryIn,
+        BOOL bRender,
+        BOOL bOutputNeeded,
+        DWORD cOutputTypes,
+        const GUID* pOutputTypes,
+        const REGPINMEDIUM* pMedOut,
+        const CLSID* pPinCategoryOut);
+
+    /*** IFilterMapper3 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetICreateDevEnum)(
+        IFilterMapper3* This,
+        ICreateDevEnum** ppEnum);
+
+};
+
+/*** IUnknown methods ***/
+#define IFilterMapper3_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterMapper3_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterMapper3_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterMapper2 methods ***/
+#define IFilterMapper3_CreateCategory(p,a,b,c) (p)->lpVtbl->CreateCategory(p,a,b,c)
+#define IFilterMapper3_UnregisterFilter(p,a,b,c) (p)->lpVtbl->UnregisterFilter(p,a,b,c)
+#define IFilterMapper3_RegisterFilter(p,a,b,c,d,e,f) (p)->lpVtbl->RegisterFilter(p,a,b,c,d,e,f)
+#define IFilterMapper3_EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) (p)->lpVtbl->EnumMatchingFilters(p,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
+/*** IFilterMapper3 methods ***/
+#define IFilterMapper3_GetICreateDevEnum(p,a) (p)->lpVtbl->GetICreateDevEnum(p,a)
+
+#endif
+
+#define IFilterMapper3_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; \
+    /*** IFilterMapper2 methods ***/ \
+    STDMETHOD_(HRESULT,CreateCategory)(THIS_ REFCLSID clsidCategory, DWORD dwCategoryMerit, LPCWSTR Description) PURE; \
+    STDMETHOD_(HRESULT,UnregisterFilter)(THIS_ const CLSID* pclsidCategory, const OLECHAR* szInstance, REFCLSID Filter) PURE; \
+    STDMETHOD_(HRESULT,RegisterFilter)(THIS_ REFCLSID clsidFilter, LPCWSTR Name, IMoniker** ppMoniker, const CLSID* pclsidCategory, const OLECHAR* szInstance, const REGFILTER2* prf2) PURE; \
+    STDMETHOD_(HRESULT,EnumMatchingFilters)(THIS_ IEnumMoniker** ppEnum, DWORD dwFlags, BOOL bExactMatch, DWORD dwMerit, BOOL bInputNeeded, DWORD cInputTypes, const GUID* pInputTypes, const REGPINMEDIUM* pMedIn, const CLSID* pPinCategoryIn, BOOL bRender, BOOL bOutputNeeded, DWORD cOutputTypes, const GUID* pOutputTypes, const REGPINMEDIUM* pMedOut, const CLSID* pPinCategoryOut) PURE; \
+    /*** IFilterMapper3 methods ***/ \
+    STDMETHOD_(HRESULT,GetICreateDevEnum)(THIS_ ICreateDevEnum** ppEnum) PURE;
+
+HRESULT CALLBACK IFilterMapper3_GetICreateDevEnum_Proxy(
+    IFilterMapper3* This,
+    ICreateDevEnum** ppEnum);
+void __RPC_STUB IFilterMapper3_GetICreateDevEnum_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef enum tagQualityMessageType {
+    Famine,
+    Flood
+} QualityMessageType;
+
+typedef struct tagQuality {
+    QualityMessageType Type;
+    long Proportion;
+    REFERENCE_TIME Late;
+    REFERENCE_TIME TimeStamp;
+} Quality;
+
+typedef IQualityControl *PQUALITYCONTROL;
+
+/*****************************************************************************
+ * IQualityControl interface
+ */
+DEFINE_GUID(IID_IQualityControl, 0x56a868a5, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IQualityControl : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Notify(
+        IBaseFilter* pSelf,
+        Quality q) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetSink(
+        IQualityControl* piqc) = 0;
+
+};
+#else
+typedef struct IQualityControlVtbl IQualityControlVtbl;
+struct IQualityControl {
+    const IQualityControlVtbl* lpVtbl;
+};
+struct IQualityControlVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IQualityControl* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IQualityControl* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IQualityControl* This);
+
+    /*** IQualityControl methods ***/
+    HRESULT (STDMETHODCALLTYPE *Notify)(
+        IQualityControl* This,
+        IBaseFilter* pSelf,
+        Quality q);
+
+    HRESULT (STDMETHODCALLTYPE *SetSink)(
+        IQualityControl* This,
+        IQualityControl* piqc);
+
+};
+
+/*** IUnknown methods ***/
+#define IQualityControl_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IQualityControl_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IQualityControl_Release(p) (p)->lpVtbl->Release(p)
+/*** IQualityControl methods ***/
+#define IQualityControl_Notify(p,a,b) (p)->lpVtbl->Notify(p,a,b)
+#define IQualityControl_SetSink(p,a) (p)->lpVtbl->SetSink(p,a)
+
+#endif
+
+#define IQualityControl_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; \
+    /*** IQualityControl methods ***/ \
+    STDMETHOD_(HRESULT,Notify)(THIS_ IBaseFilter* pSelf, Quality q) PURE; \
+    STDMETHOD_(HRESULT,SetSink)(THIS_ IQualityControl* piqc) PURE;
+
+HRESULT CALLBACK IQualityControl_Notify_Proxy(
+    IQualityControl* This,
+    IBaseFilter* pSelf,
+    Quality q);
+void __RPC_STUB IQualityControl_Notify_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IQualityControl_SetSink_Proxy(
+    IQualityControl* This,
+    IQualityControl* piqc);
+void __RPC_STUB IQualityControl_SetSink_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+enum {
+    CK_NOCOLORKEY = 0x0,
+    CK_INDEX = 0x1,
+    CK_RGB = 0x2
+};
+
+typedef struct tagCOLORKEY {
+    DWORD KeyType;
+    DWORD PaletteIndex;
+    COLORREF LowColorValue;
+    COLORREF HighColorValue;
+} COLORKEY;
+
+enum {
+    ADVISE_NONE = 0x0,
+    ADVISE_CLIPPING = 0x1,
+    ADVISE_PALETTE = 0x2,
+    ADVISE_COLORKEY = 0x4,
+    ADVISE_POSITION = 0x8,
+    ADVISE_DISPLAY_CHANGE = 0x10
+};
+
+#define ADVISE_ALL (((ADVISE_CLIPPING | ADVISE_PALETTE) | ADVISE_COLORKEY) | ADVISE_POSITION)
+
+#define ADVISE_ALL2 (ADVISE_ALL | ADVISE_DISPLAY_CHANGE)
+
+#ifndef _WINGDI_
+typedef struct _RGNDATAHEADER {
+    DWORD dwSize;
+    DWORD iType;
+    DWORD nCount;
+    DWORD nRgnSize;
+    RECT rcBound;
+} RGNDATAHEADER;
+
+typedef struct _RGNDATA {
+    RGNDATAHEADER rdh;
+    char Buffer[1];
+} RGNDATA;
+
+#endif /* _WINGDI_ */
+/*****************************************************************************
+ * IOverlayNotify interface
+ */
+DEFINE_GUID(IID_IOverlayNotify, 0x56a868a0, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IOverlayNotify : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnPaletteChange(
+        DWORD dwColors,
+        const PALETTEENTRY* pPalette) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnClipChange(
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect,
+        const RGNDATA* pRgnData) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnColorKeyChange(
+        const COLORKEY* pColorKey) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnPositionChange(
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect) = 0;
+
+};
+#else
+typedef struct IOverlayNotifyVtbl IOverlayNotifyVtbl;
+struct IOverlayNotify {
+    const IOverlayNotifyVtbl* lpVtbl;
+};
+struct IOverlayNotifyVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IOverlayNotify* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IOverlayNotify* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IOverlayNotify* This);
+
+    /*** IOverlayNotify methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnPaletteChange)(
+        IOverlayNotify* This,
+        DWORD dwColors,
+        const PALETTEENTRY* pPalette);
+
+    HRESULT (STDMETHODCALLTYPE *OnClipChange)(
+        IOverlayNotify* This,
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect,
+        const RGNDATA* pRgnData);
+
+    HRESULT (STDMETHODCALLTYPE *OnColorKeyChange)(
+        IOverlayNotify* This,
+        const COLORKEY* pColorKey);
+
+    HRESULT (STDMETHODCALLTYPE *OnPositionChange)(
+        IOverlayNotify* This,
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect);
+
+};
+
+/*** IUnknown methods ***/
+#define IOverlayNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IOverlayNotify_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IOverlayNotify_Release(p) (p)->lpVtbl->Release(p)
+/*** IOverlayNotify methods ***/
+#define IOverlayNotify_OnPaletteChange(p,a,b) (p)->lpVtbl->OnPaletteChange(p,a,b)
+#define IOverlayNotify_OnClipChange(p,a,b,c) (p)->lpVtbl->OnClipChange(p,a,b,c)
+#define IOverlayNotify_OnColorKeyChange(p,a) (p)->lpVtbl->OnColorKeyChange(p,a)
+#define IOverlayNotify_OnPositionChange(p,a,b) (p)->lpVtbl->OnPositionChange(p,a,b)
+
+#endif
+
+#define IOverlayNotify_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; \
+    /*** IOverlayNotify methods ***/ \
+    STDMETHOD_(HRESULT,OnPaletteChange)(THIS_ DWORD dwColors, const PALETTEENTRY* pPalette) PURE; \
+    STDMETHOD_(HRESULT,OnClipChange)(THIS_ const RECT* pSourceRect, const RECT* pDestinationRect, const RGNDATA* pRgnData) PURE; \
+    STDMETHOD_(HRESULT,OnColorKeyChange)(THIS_ const COLORKEY* pColorKey) PURE; \
+    STDMETHOD_(HRESULT,OnPositionChange)(THIS_ const RECT* pSourceRect, const RECT* pDestinationRect) PURE;
+
+HRESULT CALLBACK IOverlayNotify_OnPaletteChange_Proxy(
+    IOverlayNotify* This,
+    DWORD dwColors,
+    const PALETTEENTRY* pPalette);
+void __RPC_STUB IOverlayNotify_OnPaletteChange_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlayNotify_OnClipChange_Proxy(
+    IOverlayNotify* This,
+    const RECT* pSourceRect,
+    const RECT* pDestinationRect,
+    const RGNDATA* pRgnData);
+void __RPC_STUB IOverlayNotify_OnClipChange_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlayNotify_OnColorKeyChange_Proxy(
+    IOverlayNotify* This,
+    const COLORKEY* pColorKey);
+void __RPC_STUB IOverlayNotify_OnColorKeyChange_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlayNotify_OnPositionChange_Proxy(
+    IOverlayNotify* This,
+    const RECT* pSourceRect,
+    const RECT* pDestinationRect);
+void __RPC_STUB IOverlayNotify_OnPositionChange_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IOverlayNotify *POVERLAYNOTIFY;
+
+#if 0
+typedef HANDLE HMONITOR;
+
+#endif /* 0 */
+/*****************************************************************************
+ * IOverlayNotify2 interface
+ */
+DEFINE_GUID(IID_IOverlayNotify2, 0x680efa10, 0xd535, 0x11d1, 0x87,0xc8, 0x00,0xa0,0xc9,0x22,0x31,0x96);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IOverlayNotify2 : public IOverlayNotify
+{
+    virtual HRESULT STDMETHODCALLTYPE OnDisplayChange(
+        HMONITOR hMonitor) = 0;
+
+};
+#else
+typedef struct IOverlayNotify2Vtbl IOverlayNotify2Vtbl;
+struct IOverlayNotify2 {
+    const IOverlayNotify2Vtbl* lpVtbl;
+};
+struct IOverlayNotify2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IOverlayNotify2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IOverlayNotify2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IOverlayNotify2* This);
+
+    /*** IOverlayNotify methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnPaletteChange)(
+        IOverlayNotify2* This,
+        DWORD dwColors,
+        const PALETTEENTRY* pPalette);
+
+    HRESULT (STDMETHODCALLTYPE *OnClipChange)(
+        IOverlayNotify2* This,
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect,
+        const RGNDATA* pRgnData);
+
+    HRESULT (STDMETHODCALLTYPE *OnColorKeyChange)(
+        IOverlayNotify2* This,
+        const COLORKEY* pColorKey);
+
+    HRESULT (STDMETHODCALLTYPE *OnPositionChange)(
+        IOverlayNotify2* This,
+        const RECT* pSourceRect,
+        const RECT* pDestinationRect);
+
+    /*** IOverlayNotify2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnDisplayChange)(
+        IOverlayNotify2* This,
+        HMONITOR hMonitor);
+
+};
+
+/*** IUnknown methods ***/
+#define IOverlayNotify2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IOverlayNotify2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IOverlayNotify2_Release(p) (p)->lpVtbl->Release(p)
+/*** IOverlayNotify methods ***/
+#define IOverlayNotify2_OnPaletteChange(p,a,b) (p)->lpVtbl->OnPaletteChange(p,a,b)
+#define IOverlayNotify2_OnClipChange(p,a,b,c) (p)->lpVtbl->OnClipChange(p,a,b,c)
+#define IOverlayNotify2_OnColorKeyChange(p,a) (p)->lpVtbl->OnColorKeyChange(p,a)
+#define IOverlayNotify2_OnPositionChange(p,a,b) (p)->lpVtbl->OnPositionChange(p,a,b)
+/*** IOverlayNotify2 methods ***/
+#define IOverlayNotify2_OnDisplayChange(p,a) (p)->lpVtbl->OnDisplayChange(p,a)
+
+#endif
+
+#define IOverlayNotify2_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; \
+    /*** IOverlayNotify methods ***/ \
+    STDMETHOD_(HRESULT,OnPaletteChange)(THIS_ DWORD dwColors, const PALETTEENTRY* pPalette) PURE; \
+    STDMETHOD_(HRESULT,OnClipChange)(THIS_ const RECT* pSourceRect, const RECT* pDestinationRect, const RGNDATA* pRgnData) PURE; \
+    STDMETHOD_(HRESULT,OnColorKeyChange)(THIS_ const COLORKEY* pColorKey) PURE; \
+    STDMETHOD_(HRESULT,OnPositionChange)(THIS_ const RECT* pSourceRect, const RECT* pDestinationRect) PURE; \
+    /*** IOverlayNotify2 methods ***/ \
+    STDMETHOD_(HRESULT,OnDisplayChange)(THIS_ HMONITOR hMonitor) PURE;
+
+HRESULT CALLBACK IOverlayNotify2_OnDisplayChange_Proxy(
+    IOverlayNotify2* This,
+    HMONITOR hMonitor);
+void __RPC_STUB IOverlayNotify2_OnDisplayChange_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IOverlayNotify2 *POVERLAYNOTIFY2;
+
+/*****************************************************************************
+ * IOverlay interface
+ */
+DEFINE_GUID(IID_IOverlay, 0x56a868a1, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IOverlay : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetPalette(
+        DWORD* pdwColors,
+        PALETTEENTRY** ppPalette) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPalette(
+        DWORD dwColors,
+        PALETTEENTRY* pPalette) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDefaultColorKey(
+        COLORKEY* pColorKey) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetColorKey(
+        COLORKEY* pColorKey) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetColorKey(
+        COLORKEY* pColorKey) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetWindowHandle(
+        HWND* pHwnd) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetClipList(
+        RECT* pSourceRect,
+        RECT* pDestinationRect,
+        RGNDATA** ppRgnData) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetVideoPosition(
+        RECT* pSourceRect,
+        RECT* pDestinationRect) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Advise(
+        IOverlayNotify* pOverlayNotify,
+        DWORD dwInterests) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Unadvise(
+        ) = 0;
+
+};
+#else
+typedef struct IOverlayVtbl IOverlayVtbl;
+struct IOverlay {
+    const IOverlayVtbl* lpVtbl;
+};
+struct IOverlayVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IOverlay* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IOverlay* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IOverlay* This);
+
+    /*** IOverlay methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPalette)(
+        IOverlay* This,
+        DWORD* pdwColors,
+        PALETTEENTRY** ppPalette);
+
+    HRESULT (STDMETHODCALLTYPE *SetPalette)(
+        IOverlay* This,
+        DWORD dwColors,
+        PALETTEENTRY* pPalette);
+
+    HRESULT (STDMETHODCALLTYPE *GetDefaultColorKey)(
+        IOverlay* This,
+        COLORKEY* pColorKey);
+
+    HRESULT (STDMETHODCALLTYPE *GetColorKey)(
+        IOverlay* This,
+        COLORKEY* pColorKey);
+
+    HRESULT (STDMETHODCALLTYPE *SetColorKey)(
+        IOverlay* This,
+        COLORKEY* pColorKey);
+
+    HRESULT (STDMETHODCALLTYPE *GetWindowHandle)(
+        IOverlay* This,
+        HWND* pHwnd);
+
+    HRESULT (STDMETHODCALLTYPE *GetClipList)(
+        IOverlay* This,
+        RECT* pSourceRect,
+        RECT* pDestinationRect,
+        RGNDATA** ppRgnData);
+
+    HRESULT (STDMETHODCALLTYPE *GetVideoPosition)(
+        IOverlay* This,
+        RECT* pSourceRect,
+        RECT* pDestinationRect);
+
+    HRESULT (STDMETHODCALLTYPE *Advise)(
+        IOverlay* This,
+        IOverlayNotify* pOverlayNotify,
+        DWORD dwInterests);
+
+    HRESULT (STDMETHODCALLTYPE *Unadvise)(
+        IOverlay* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IOverlay_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IOverlay_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IOverlay_Release(p) (p)->lpVtbl->Release(p)
+/*** IOverlay methods ***/
+#define IOverlay_GetPalette(p,a,b) (p)->lpVtbl->GetPalette(p,a,b)
+#define IOverlay_SetPalette(p,a,b) (p)->lpVtbl->SetPalette(p,a,b)
+#define IOverlay_GetDefaultColorKey(p,a) (p)->lpVtbl->GetDefaultColorKey(p,a)
+#define IOverlay_GetColorKey(p,a) (p)->lpVtbl->GetColorKey(p,a)
+#define IOverlay_SetColorKey(p,a) (p)->lpVtbl->SetColorKey(p,a)
+#define IOverlay_GetWindowHandle(p,a) (p)->lpVtbl->GetWindowHandle(p,a)
+#define IOverlay_GetClipList(p,a,b,c) (p)->lpVtbl->GetClipList(p,a,b,c)
+#define IOverlay_GetVideoPosition(p,a,b) (p)->lpVtbl->GetVideoPosition(p,a,b)
+#define IOverlay_Advise(p,a,b) (p)->lpVtbl->Advise(p,a,b)
+#define IOverlay_Unadvise(p) (p)->lpVtbl->Unadvise(p)
+
+#endif
+
+#define IOverlay_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; \
+    /*** IOverlay methods ***/ \
+    STDMETHOD_(HRESULT,GetPalette)(THIS_ DWORD* pdwColors, PALETTEENTRY** ppPalette) PURE; \
+    STDMETHOD_(HRESULT,SetPalette)(THIS_ DWORD dwColors, PALETTEENTRY* pPalette) PURE; \
+    STDMETHOD_(HRESULT,GetDefaultColorKey)(THIS_ COLORKEY* pColorKey) PURE; \
+    STDMETHOD_(HRESULT,GetColorKey)(THIS_ COLORKEY* pColorKey) PURE; \
+    STDMETHOD_(HRESULT,SetColorKey)(THIS_ COLORKEY* pColorKey) PURE; \
+    STDMETHOD_(HRESULT,GetWindowHandle)(THIS_ HWND* pHwnd) PURE; \
+    STDMETHOD_(HRESULT,GetClipList)(THIS_ RECT* pSourceRect, RECT* pDestinationRect, RGNDATA** ppRgnData) PURE; \
+    STDMETHOD_(HRESULT,GetVideoPosition)(THIS_ RECT* pSourceRect, RECT* pDestinationRect) PURE; \
+    STDMETHOD_(HRESULT,Advise)(THIS_ IOverlayNotify* pOverlayNotify, DWORD dwInterests) PURE; \
+    STDMETHOD_(HRESULT,Unadvise)(THIS) PURE;
+
+HRESULT CALLBACK IOverlay_GetPalette_Proxy(
+    IOverlay* This,
+    DWORD* pdwColors,
+    PALETTEENTRY** ppPalette);
+void __RPC_STUB IOverlay_GetPalette_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_SetPalette_Proxy(
+    IOverlay* This,
+    DWORD dwColors,
+    PALETTEENTRY* pPalette);
+void __RPC_STUB IOverlay_SetPalette_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_GetDefaultColorKey_Proxy(
+    IOverlay* This,
+    COLORKEY* pColorKey);
+void __RPC_STUB IOverlay_GetDefaultColorKey_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_GetColorKey_Proxy(
+    IOverlay* This,
+    COLORKEY* pColorKey);
+void __RPC_STUB IOverlay_GetColorKey_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_SetColorKey_Proxy(
+    IOverlay* This,
+    COLORKEY* pColorKey);
+void __RPC_STUB IOverlay_SetColorKey_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_GetWindowHandle_Proxy(
+    IOverlay* This,
+    HWND* pHwnd);
+void __RPC_STUB IOverlay_GetWindowHandle_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_GetClipList_Proxy(
+    IOverlay* This,
+    RECT* pSourceRect,
+    RECT* pDestinationRect,
+    RGNDATA** ppRgnData);
+void __RPC_STUB IOverlay_GetClipList_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_GetVideoPosition_Proxy(
+    IOverlay* This,
+    RECT* pSourceRect,
+    RECT* pDestinationRect);
+void __RPC_STUB IOverlay_GetVideoPosition_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_Advise_Proxy(
+    IOverlay* This,
+    IOverlayNotify* pOverlayNotify,
+    DWORD dwInterests);
+void __RPC_STUB IOverlay_Advise_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IOverlay_Unadvise_Proxy(
+    IOverlay* This);
+void __RPC_STUB IOverlay_Unadvise_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IOverlay *POVERLAY;
+
+/*****************************************************************************
+ * IMediaEventSink interface
+ */
+DEFINE_GUID(IID_IMediaEventSink, 0x56a868a2, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IMediaEventSink : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Notify(
+        long EventCode,
+        LONG_PTR EventParam1,
+        LONG_PTR EventParam2) = 0;
+
+};
+#else
+typedef struct IMediaEventSinkVtbl IMediaEventSinkVtbl;
+struct IMediaEventSink {
+    const IMediaEventSinkVtbl* lpVtbl;
+};
+struct IMediaEventSinkVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMediaEventSink* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMediaEventSink* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMediaEventSink* This);
+
+    /*** IMediaEventSink methods ***/
+    HRESULT (STDMETHODCALLTYPE *Notify)(
+        IMediaEventSink* This,
+        long EventCode,
+        LONG_PTR EventParam1,
+        LONG_PTR EventParam2);
+
+};
+
+/*** IUnknown methods ***/
+#define IMediaEventSink_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IMediaEventSink_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IMediaEventSink_Release(p) (p)->lpVtbl->Release(p)
+/*** IMediaEventSink methods ***/
+#define IMediaEventSink_Notify(p,a,b,c) (p)->lpVtbl->Notify(p,a,b,c)
+
+#endif
+
+#define IMediaEventSink_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; \
+    /*** IMediaEventSink methods ***/ \
+    STDMETHOD_(HRESULT,Notify)(THIS_ long EventCode, LONG_PTR EventParam1, LONG_PTR EventParam2) PURE;
+
+HRESULT CALLBACK IMediaEventSink_Notify_Proxy(
+    IMediaEventSink* This,
+    long EventCode,
+    LONG_PTR EventParam1,
+    LONG_PTR EventParam2);
+void __RPC_STUB IMediaEventSink_Notify_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IMediaEventSink *PMEDIAEVENTSINK;
+
+/*****************************************************************************
+ * IFileSourceFilter interface
+ */
+DEFINE_GUID(IID_IFileSourceFilter, 0x56a868a6, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFileSourceFilter : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Load(
+        LPCOLESTR pszFileName,
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurFile(
+        LPOLESTR* ppszFileName,
+        AM_MEDIA_TYPE* pmt) = 0;
+
+};
+#else
+typedef struct IFileSourceFilterVtbl IFileSourceFilterVtbl;
+struct IFileSourceFilter {
+    const IFileSourceFilterVtbl* lpVtbl;
+};
+struct IFileSourceFilterVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFileSourceFilter* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFileSourceFilter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFileSourceFilter* This);
+
+    /*** IFileSourceFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *Load)(
+        IFileSourceFilter* This,
+        LPCOLESTR pszFileName,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurFile)(
+        IFileSourceFilter* This,
+        LPOLESTR* ppszFileName,
+        AM_MEDIA_TYPE* pmt);
+
+};
+
+/*** IUnknown methods ***/
+#define IFileSourceFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFileSourceFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFileSourceFilter_Release(p) (p)->lpVtbl->Release(p)
+/*** IFileSourceFilter methods ***/
+#define IFileSourceFilter_Load(p,a,b) (p)->lpVtbl->Load(p,a,b)
+#define IFileSourceFilter_GetCurFile(p,a,b) (p)->lpVtbl->GetCurFile(p,a,b)
+
+#endif
+
+#define IFileSourceFilter_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; \
+    /*** IFileSourceFilter methods ***/ \
+    STDMETHOD_(HRESULT,Load)(THIS_ LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,GetCurFile)(THIS_ LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt) PURE;
+
+HRESULT CALLBACK IFileSourceFilter_Load_Proxy(
+    IFileSourceFilter* This,
+    LPCOLESTR pszFileName,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFileSourceFilter_Load_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFileSourceFilter_GetCurFile_Proxy(
+    IFileSourceFilter* This,
+    LPOLESTR* ppszFileName,
+    AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFileSourceFilter_GetCurFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IFileSourceFilter *PFILTERFILESOURCE;
+
+/*****************************************************************************
+ * IFileSinkFilter interface
+ */
+DEFINE_GUID(IID_IFileSinkFilter, 0xa2104830, 0x7c70, 0x11cf, 0x8b,0xce, 0x00,0xaa,0x00,0xa3,0xf1,0xa6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFileSinkFilter : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFileName(
+        LPCOLESTR pszFileName,
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurFile(
+        LPOLESTR* ppszFileName,
+        AM_MEDIA_TYPE* pmt) = 0;
+
+};
+#else
+typedef struct IFileSinkFilterVtbl IFileSinkFilterVtbl;
+struct IFileSinkFilter {
+    const IFileSinkFilterVtbl* lpVtbl;
+};
+struct IFileSinkFilterVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFileSinkFilter* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFileSinkFilter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFileSinkFilter* This);
+
+    /*** IFileSinkFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFileName)(
+        IFileSinkFilter* This,
+        LPCOLESTR pszFileName,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurFile)(
+        IFileSinkFilter* This,
+        LPOLESTR* ppszFileName,
+        AM_MEDIA_TYPE* pmt);
+
+};
+
+/*** IUnknown methods ***/
+#define IFileSinkFilter_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFileSinkFilter_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFileSinkFilter_Release(p) (p)->lpVtbl->Release(p)
+/*** IFileSinkFilter methods ***/
+#define IFileSinkFilter_SetFileName(p,a,b) (p)->lpVtbl->SetFileName(p,a,b)
+#define IFileSinkFilter_GetCurFile(p,a,b) (p)->lpVtbl->GetCurFile(p,a,b)
+
+#endif
+
+#define IFileSinkFilter_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; \
+    /*** IFileSinkFilter methods ***/ \
+    STDMETHOD_(HRESULT,SetFileName)(THIS_ LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,GetCurFile)(THIS_ LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt) PURE;
+
+HRESULT CALLBACK IFileSinkFilter_SetFileName_Proxy(
+    IFileSinkFilter* This,
+    LPCOLESTR pszFileName,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFileSinkFilter_SetFileName_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFileSinkFilter_GetCurFile_Proxy(
+    IFileSinkFilter* This,
+    LPOLESTR* ppszFileName,
+    AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFileSinkFilter_GetCurFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IFileSinkFilter *PFILTERFILESINK;
+
+/*****************************************************************************
+ * IFileSinkFilter2 interface
+ */
+DEFINE_GUID(IID_IFileSinkFilter2, 0x00855b90, 0xce1b, 0x11d0, 0xbd,0x4f, 0x00,0xa0,0xc9,0x11,0xce,0x86);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFileSinkFilter2 : public IFileSinkFilter
+{
+    virtual HRESULT STDMETHODCALLTYPE SetMode(
+        DWORD dwFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMode(
+        DWORD* pdwFlags) = 0;
+
+};
+#else
+typedef struct IFileSinkFilter2Vtbl IFileSinkFilter2Vtbl;
+struct IFileSinkFilter2 {
+    const IFileSinkFilter2Vtbl* lpVtbl;
+};
+struct IFileSinkFilter2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFileSinkFilter2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFileSinkFilter2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFileSinkFilter2* This);
+
+    /*** IFileSinkFilter methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFileName)(
+        IFileSinkFilter2* This,
+        LPCOLESTR pszFileName,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurFile)(
+        IFileSinkFilter2* This,
+        LPOLESTR* ppszFileName,
+        AM_MEDIA_TYPE* pmt);
+
+    /*** IFileSinkFilter2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetMode)(
+        IFileSinkFilter2* This,
+        DWORD dwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *GetMode)(
+        IFileSinkFilter2* This,
+        DWORD* pdwFlags);
+
+};
+
+/*** IUnknown methods ***/
+#define IFileSinkFilter2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFileSinkFilter2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFileSinkFilter2_Release(p) (p)->lpVtbl->Release(p)
+/*** IFileSinkFilter methods ***/
+#define IFileSinkFilter2_SetFileName(p,a,b) (p)->lpVtbl->SetFileName(p,a,b)
+#define IFileSinkFilter2_GetCurFile(p,a,b) (p)->lpVtbl->GetCurFile(p,a,b)
+/*** IFileSinkFilter2 methods ***/
+#define IFileSinkFilter2_SetMode(p,a) (p)->lpVtbl->SetMode(p,a)
+#define IFileSinkFilter2_GetMode(p,a) (p)->lpVtbl->GetMode(p,a)
+
+#endif
+
+#define IFileSinkFilter2_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; \
+    /*** IFileSinkFilter methods ***/ \
+    STDMETHOD_(HRESULT,SetFileName)(THIS_ LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,GetCurFile)(THIS_ LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt) PURE; \
+    /*** IFileSinkFilter2 methods ***/ \
+    STDMETHOD_(HRESULT,SetMode)(THIS_ DWORD dwFlags) PURE; \
+    STDMETHOD_(HRESULT,GetMode)(THIS_ DWORD* pdwFlags) PURE;
+
+HRESULT CALLBACK IFileSinkFilter2_SetMode_Proxy(
+    IFileSinkFilter2* This,
+    DWORD dwFlags);
+void __RPC_STUB IFileSinkFilter2_SetMode_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFileSinkFilter2_GetMode_Proxy(
+    IFileSinkFilter2* This,
+    DWORD* pdwFlags);
+void __RPC_STUB IFileSinkFilter2_GetMode_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef IFileSinkFilter2 *PFILESINKFILTER2;
+
+typedef enum {
+    AM_FILE_OVERWRITE = 0x1
+} AM_FILESINK_FLAGS;
+
+/*****************************************************************************
+ * IGraphBuilder interface
+ */
+DEFINE_GUID(IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IGraphBuilder : public IFilterGraph
+{
+    virtual HRESULT STDMETHODCALLTYPE Connect(
+        IPin* ppinOut,
+        IPin* ppinIn) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Render(
+        IPin* ppinOut) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RenderFile(
+        LPCWSTR lpcwstrFile,
+        LPCWSTR lpcwstrPlayList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddSourceFilter(
+        LPCWSTR lpcwstrFileName,
+        LPCWSTR lpcwstrFilterName,
+        IBaseFilter** ppFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLogFile(
+        DWORD_PTR hFile) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ShouldOperationContinue(
+        ) = 0;
+
+};
+#else
+typedef struct IGraphBuilderVtbl IGraphBuilderVtbl;
+struct IGraphBuilder {
+    const IGraphBuilderVtbl* lpVtbl;
+};
+struct IGraphBuilderVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IGraphBuilder* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IGraphBuilder* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IGraphBuilder* This);
+
+    /*** IFilterGraph methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFilter)(
+        IGraphBuilder* This,
+        IBaseFilter* pFilter,
+        LPCWSTR pName);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveFilter)(
+        IGraphBuilder* This,
+        IBaseFilter* pFilter);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFilters)(
+        IGraphBuilder* This,
+        IEnumFilters** ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *FindFilterByName)(
+        IGraphBuilder* This,
+        LPCWSTR pName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDirect)(
+        IGraphBuilder* This,
+        IPin* ppinOut,
+        IPin* ppinIn,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *Reconnect)(
+        IGraphBuilder* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnect)(
+        IGraphBuilder* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultSyncSource)(
+        IGraphBuilder* This);
+
+    /*** IGraphBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *Connect)(
+        IGraphBuilder* This,
+        IPin* ppinOut,
+        IPin* ppinIn);
+
+    HRESULT (STDMETHODCALLTYPE *Render)(
+        IGraphBuilder* This,
+        IPin* ppinOut);
+
+    HRESULT (STDMETHODCALLTYPE *RenderFile)(
+        IGraphBuilder* This,
+        LPCWSTR lpcwstrFile,
+        LPCWSTR lpcwstrPlayList);
+
+    HRESULT (STDMETHODCALLTYPE *AddSourceFilter)(
+        IGraphBuilder* This,
+        LPCWSTR lpcwstrFileName,
+        LPCWSTR lpcwstrFilterName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *SetLogFile)(
+        IGraphBuilder* This,
+        DWORD_PTR hFile);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IGraphBuilder* This);
+
+    HRESULT (STDMETHODCALLTYPE *ShouldOperationContinue)(
+        IGraphBuilder* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IGraphBuilder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IGraphBuilder_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IGraphBuilder_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterGraph methods ***/
+#define IGraphBuilder_AddFilter(p,a,b) (p)->lpVtbl->AddFilter(p,a,b)
+#define IGraphBuilder_RemoveFilter(p,a) (p)->lpVtbl->RemoveFilter(p,a)
+#define IGraphBuilder_EnumFilters(p,a) (p)->lpVtbl->EnumFilters(p,a)
+#define IGraphBuilder_FindFilterByName(p,a,b) (p)->lpVtbl->FindFilterByName(p,a,b)
+#define IGraphBuilder_ConnectDirect(p,a,b,c) (p)->lpVtbl->ConnectDirect(p,a,b,c)
+#define IGraphBuilder_Reconnect(p,a) (p)->lpVtbl->Reconnect(p,a)
+#define IGraphBuilder_Disconnect(p,a) (p)->lpVtbl->Disconnect(p,a)
+#define IGraphBuilder_SetDefaultSyncSource(p) (p)->lpVtbl->SetDefaultSyncSource(p)
+/*** IGraphBuilder methods ***/
+#define IGraphBuilder_Connect(p,a,b) (p)->lpVtbl->Connect(p,a,b)
+#define IGraphBuilder_Render(p,a) (p)->lpVtbl->Render(p,a)
+#define IGraphBuilder_RenderFile(p,a,b) (p)->lpVtbl->RenderFile(p,a,b)
+#define IGraphBuilder_AddSourceFilter(p,a,b,c) (p)->lpVtbl->AddSourceFilter(p,a,b,c)
+#define IGraphBuilder_SetLogFile(p,a) (p)->lpVtbl->SetLogFile(p,a)
+#define IGraphBuilder_Abort(p) (p)->lpVtbl->Abort(p)
+#define IGraphBuilder_ShouldOperationContinue(p) (p)->lpVtbl->ShouldOperationContinue(p)
+
+#endif
+
+#define IGraphBuilder_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; \
+    /*** IFilterGraph methods ***/ \
+    STDMETHOD_(HRESULT,AddFilter)(THIS_ IBaseFilter* pFilter, LPCWSTR pName) PURE; \
+    STDMETHOD_(HRESULT,RemoveFilter)(THIS_ IBaseFilter* pFilter) PURE; \
+    STDMETHOD_(HRESULT,EnumFilters)(THIS_ IEnumFilters** ppEnum) PURE; \
+    STDMETHOD_(HRESULT,FindFilterByName)(THIS_ LPCWSTR pName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,ConnectDirect)(THIS_ IPin* ppinOut, IPin* ppinIn, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,Reconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,Disconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,SetDefaultSyncSource)(THIS) PURE; \
+    /*** IGraphBuilder methods ***/ \
+    STDMETHOD_(HRESULT,Connect)(THIS_ IPin* ppinOut, IPin* ppinIn) PURE; \
+    STDMETHOD_(HRESULT,Render)(THIS_ IPin* ppinOut) PURE; \
+    STDMETHOD_(HRESULT,RenderFile)(THIS_ LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList) PURE; \
+    STDMETHOD_(HRESULT,AddSourceFilter)(THIS_ LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,SetLogFile)(THIS_ DWORD_PTR hFile) PURE; \
+    STDMETHOD_(HRESULT,Abort)(THIS) PURE; \
+    STDMETHOD_(HRESULT,ShouldOperationContinue)(THIS) PURE;
+
+HRESULT CALLBACK IGraphBuilder_Connect_Proxy(
+    IGraphBuilder* This,
+    IPin* ppinOut,
+    IPin* ppinIn);
+void __RPC_STUB IGraphBuilder_Connect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_Render_Proxy(
+    IGraphBuilder* This,
+    IPin* ppinOut);
+void __RPC_STUB IGraphBuilder_Render_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_RenderFile_Proxy(
+    IGraphBuilder* This,
+    LPCWSTR lpcwstrFile,
+    LPCWSTR lpcwstrPlayList);
+void __RPC_STUB IGraphBuilder_RenderFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_AddSourceFilter_Proxy(
+    IGraphBuilder* This,
+    LPCWSTR lpcwstrFileName,
+    LPCWSTR lpcwstrFilterName,
+    IBaseFilter** ppFilter);
+void __RPC_STUB IGraphBuilder_AddSourceFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_SetLogFile_Proxy(
+    IGraphBuilder* This,
+    DWORD_PTR hFile);
+void __RPC_STUB IGraphBuilder_SetLogFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_Abort_Proxy(
+    IGraphBuilder* This);
+void __RPC_STUB IGraphBuilder_Abort_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphBuilder_ShouldOperationContinue_Proxy(
+    IGraphBuilder* This);
+void __RPC_STUB IGraphBuilder_ShouldOperationContinue_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * ICaptureGraphBuilder interface
+ */
+DEFINE_GUID(IID_ICaptureGraphBuilder, 0xbf87b6e0, 0x8c27, 0x11d0, 0xb3,0xf0, 0x00,0xaa,0x00,0x37,0x61,0xc5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct ICaptureGraphBuilder : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFiltergraph(
+        IGraphBuilder* pfg) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFiltergraph(
+        IGraphBuilder** ppfg) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOutputFileName(
+        const GUID* pType,
+        LPCOLESTR lpstrFile,
+        IBaseFilter** ppf,
+        IFileSinkFilter** ppSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindInterface(
+        const GUID* pCategory,
+        IBaseFilter* pf,
+        REFIID riid,
+        void** ppint) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RenderStream(
+        const GUID* pCategory,
+        IUnknown* pSource,
+        IBaseFilter* pfCompressor,
+        IBaseFilter* pfRenderer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ControlStream(
+        const GUID* pCategory,
+        IBaseFilter* pFilter,
+        REFERENCE_TIME* pstart,
+        REFERENCE_TIME* pstop,
+        WORD wStartCookie,
+        WORD wStopCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AllocCapFile(
+        LPCOLESTR lpstr,
+        DWORDLONG dwlSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CopyCaptureFile(
+        LPOLESTR lpwstrOld,
+        LPOLESTR lpwstrNew,
+        int fAllowEscAbort,
+        IAMCopyCaptureFileProgress* pCallback) = 0;
+
+};
+#else
+typedef struct ICaptureGraphBuilderVtbl ICaptureGraphBuilderVtbl;
+struct ICaptureGraphBuilder {
+    const ICaptureGraphBuilderVtbl* lpVtbl;
+};
+struct ICaptureGraphBuilderVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ICaptureGraphBuilder* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ICaptureGraphBuilder* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ICaptureGraphBuilder* This);
+
+    /*** ICaptureGraphBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFiltergraph)(
+        ICaptureGraphBuilder* This,
+        IGraphBuilder* pfg);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiltergraph)(
+        ICaptureGraphBuilder* This,
+        IGraphBuilder** ppfg);
+
+    HRESULT (STDMETHODCALLTYPE *SetOutputFileName)(
+        ICaptureGraphBuilder* This,
+        const GUID* pType,
+        LPCOLESTR lpstrFile,
+        IBaseFilter** ppf,
+        IFileSinkFilter** ppSink);
+
+    HRESULT (STDMETHODCALLTYPE *FindInterface)(
+        ICaptureGraphBuilder* This,
+        const GUID* pCategory,
+        IBaseFilter* pf,
+        REFIID riid,
+        void** ppint);
+
+    HRESULT (STDMETHODCALLTYPE *RenderStream)(
+        ICaptureGraphBuilder* This,
+        const GUID* pCategory,
+        IUnknown* pSource,
+        IBaseFilter* pfCompressor,
+        IBaseFilter* pfRenderer);
+
+    HRESULT (STDMETHODCALLTYPE *ControlStream)(
+        ICaptureGraphBuilder* This,
+        const GUID* pCategory,
+        IBaseFilter* pFilter,
+        REFERENCE_TIME* pstart,
+        REFERENCE_TIME* pstop,
+        WORD wStartCookie,
+        WORD wStopCookie);
+
+    HRESULT (STDMETHODCALLTYPE *AllocCapFile)(
+        ICaptureGraphBuilder* This,
+        LPCOLESTR lpstr,
+        DWORDLONG dwlSize);
+
+    HRESULT (STDMETHODCALLTYPE *CopyCaptureFile)(
+        ICaptureGraphBuilder* This,
+        LPOLESTR lpwstrOld,
+        LPOLESTR lpwstrNew,
+        int fAllowEscAbort,
+        IAMCopyCaptureFileProgress* pCallback);
+
+};
+
+/*** IUnknown methods ***/
+#define ICaptureGraphBuilder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define ICaptureGraphBuilder_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define ICaptureGraphBuilder_Release(p) (p)->lpVtbl->Release(p)
+/*** ICaptureGraphBuilder methods ***/
+#define ICaptureGraphBuilder_SetFiltergraph(p,a) (p)->lpVtbl->SetFiltergraph(p,a)
+#define ICaptureGraphBuilder_GetFiltergraph(p,a) (p)->lpVtbl->GetFiltergraph(p,a)
+#define ICaptureGraphBuilder_SetOutputFileName(p,a,b,c,d) (p)->lpVtbl->SetOutputFileName(p,a,b,c,d)
+#define ICaptureGraphBuilder_FindInterface(p,a,b,c,d) (p)->lpVtbl->FindInterface(p,a,b,c,d)
+#define ICaptureGraphBuilder_RenderStream(p,a,b,c,d) (p)->lpVtbl->RenderStream(p,a,b,c,d)
+#define ICaptureGraphBuilder_ControlStream(p,a,b,c,d,e,f) (p)->lpVtbl->ControlStream(p,a,b,c,d,e,f)
+#define ICaptureGraphBuilder_AllocCapFile(p,a,b) (p)->lpVtbl->AllocCapFile(p,a,b)
+#define ICaptureGraphBuilder_CopyCaptureFile(p,a,b,c,d) (p)->lpVtbl->CopyCaptureFile(p,a,b,c,d)
+
+#endif
+
+#define ICaptureGraphBuilder_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; \
+    /*** ICaptureGraphBuilder methods ***/ \
+    STDMETHOD_(HRESULT,SetFiltergraph)(THIS_ IGraphBuilder* pfg) PURE; \
+    STDMETHOD_(HRESULT,GetFiltergraph)(THIS_ IGraphBuilder** ppfg) PURE; \
+    STDMETHOD_(HRESULT,SetOutputFileName)(THIS_ const GUID* pType, LPCOLESTR lpstrFile, IBaseFilter** ppf, IFileSinkFilter** ppSink) PURE; \
+    STDMETHOD_(HRESULT,FindInterface)(THIS_ const GUID* pCategory, IBaseFilter* pf, REFIID riid, void** ppint) PURE; \
+    STDMETHOD_(HRESULT,RenderStream)(THIS_ const GUID* pCategory, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer) PURE; \
+    STDMETHOD_(HRESULT,ControlStream)(THIS_ const GUID* pCategory, IBaseFilter* pFilter, REFERENCE_TIME* pstart, REFERENCE_TIME* pstop, WORD wStartCookie, WORD wStopCookie) PURE; \
+    STDMETHOD_(HRESULT,AllocCapFile)(THIS_ LPCOLESTR lpstr, DWORDLONG dwlSize) PURE; \
+    STDMETHOD_(HRESULT,CopyCaptureFile)(THIS_ LPOLESTR lpwstrOld, LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback) PURE;
+
+HRESULT CALLBACK ICaptureGraphBuilder_SetFiltergraph_Proxy(
+    ICaptureGraphBuilder* This,
+    IGraphBuilder* pfg);
+void __RPC_STUB ICaptureGraphBuilder_SetFiltergraph_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_GetFiltergraph_Proxy(
+    ICaptureGraphBuilder* This,
+    IGraphBuilder** ppfg);
+void __RPC_STUB ICaptureGraphBuilder_GetFiltergraph_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_SetOutputFileName_Proxy(
+    ICaptureGraphBuilder* This,
+    const GUID* pType,
+    LPCOLESTR lpstrFile,
+    IBaseFilter** ppf,
+    IFileSinkFilter** ppSink);
+void __RPC_STUB ICaptureGraphBuilder_SetOutputFileName_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_RemoteFindInterface_Proxy(
+    ICaptureGraphBuilder* This,
+    const GUID* pCategory,
+    IBaseFilter* pf,
+    REFIID riid,
+    IUnknown** ppint);
+void __RPC_STUB ICaptureGraphBuilder_RemoteFindInterface_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_FindInterface_Proxy(
+    ICaptureGraphBuilder* This,
+    const GUID* pCategory,
+    IBaseFilter* pf,
+    REFIID riid,
+    void** ppint);
+HRESULT __RPC_STUB ICaptureGraphBuilder_FindInterface_Stub(
+    ICaptureGraphBuilder* This,
+    const GUID* pCategory,
+    IBaseFilter* pf,
+    REFIID riid,
+    IUnknown** ppint);
+HRESULT CALLBACK ICaptureGraphBuilder_RenderStream_Proxy(
+    ICaptureGraphBuilder* This,
+    const GUID* pCategory,
+    IUnknown* pSource,
+    IBaseFilter* pfCompressor,
+    IBaseFilter* pfRenderer);
+void __RPC_STUB ICaptureGraphBuilder_RenderStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_ControlStream_Proxy(
+    ICaptureGraphBuilder* This,
+    const GUID* pCategory,
+    IBaseFilter* pFilter,
+    REFERENCE_TIME* pstart,
+    REFERENCE_TIME* pstop,
+    WORD wStartCookie,
+    WORD wStopCookie);
+void __RPC_STUB ICaptureGraphBuilder_ControlStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_AllocCapFile_Proxy(
+    ICaptureGraphBuilder* This,
+    LPCOLESTR lpstr,
+    DWORDLONG dwlSize);
+void __RPC_STUB ICaptureGraphBuilder_AllocCapFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder_CopyCaptureFile_Proxy(
+    ICaptureGraphBuilder* This,
+    LPOLESTR lpwstrOld,
+    LPOLESTR lpwstrNew,
+    int fAllowEscAbort,
+    IAMCopyCaptureFileProgress* pCallback);
+void __RPC_STUB ICaptureGraphBuilder_CopyCaptureFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * IAMCopyCaptureFileProgress interface
+ */
+DEFINE_GUID(IID_IAMCopyCaptureFileProgress, 0x670d1d20, 0xa068, 0x11d0, 0xb3,0xf0, 0x00,0xaa,0x00,0x37,0x61,0xc5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IAMCopyCaptureFileProgress : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Progress(
+        int iProgress) = 0;
+
+};
+#else
+typedef struct IAMCopyCaptureFileProgressVtbl IAMCopyCaptureFileProgressVtbl;
+struct IAMCopyCaptureFileProgress {
+    const IAMCopyCaptureFileProgressVtbl* lpVtbl;
+};
+struct IAMCopyCaptureFileProgressVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMCopyCaptureFileProgress* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMCopyCaptureFileProgress* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMCopyCaptureFileProgress* This);
+
+    /*** IAMCopyCaptureFileProgress methods ***/
+    HRESULT (STDMETHODCALLTYPE *Progress)(
+        IAMCopyCaptureFileProgress* This,
+        int iProgress);
+
+};
+
+/*** IUnknown methods ***/
+#define IAMCopyCaptureFileProgress_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IAMCopyCaptureFileProgress_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IAMCopyCaptureFileProgress_Release(p) (p)->lpVtbl->Release(p)
+/*** IAMCopyCaptureFileProgress methods ***/
+#define IAMCopyCaptureFileProgress_Progress(p,a) (p)->lpVtbl->Progress(p,a)
+
+#endif
+
+#define IAMCopyCaptureFileProgress_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; \
+    /*** IAMCopyCaptureFileProgress methods ***/ \
+    STDMETHOD_(HRESULT,Progress)(THIS_ int iProgress) PURE;
+
+HRESULT CALLBACK IAMCopyCaptureFileProgress_Progress_Proxy(
+    IAMCopyCaptureFileProgress* This,
+    int iProgress);
+void __RPC_STUB IAMCopyCaptureFileProgress_Progress_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * ICaptureGraphBuilder2 interface
+ */
+DEFINE_GUID(IID_ICaptureGraphBuilder2, 0x93e5a4e0, 0x2d50, 0x11d2, 0xab,0xfa, 0x00,0xa0,0xc9,0xc6,0xe3,0x8d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct ICaptureGraphBuilder2 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFiltergraph(
+        IGraphBuilder* pfg) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFiltergraph(
+        IGraphBuilder** ppfg) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOutputFileName(
+        const GUID* pType,
+        LPCOLESTR lpstrFile,
+        IBaseFilter** ppf,
+        IFileSinkFilter** ppSink) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindInterface(
+        const GUID* pCategory,
+        const GUID* pType,
+        IBaseFilter* pf,
+        REFIID riid,
+        void** ppint) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RenderStream(
+        const GUID* pCategory,
+        const GUID* pType,
+        IUnknown* pSource,
+        IBaseFilter* pfCompressor,
+        IBaseFilter* pfRenderer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ControlStream(
+        const GUID* pCategory,
+        const GUID* pType,
+        IBaseFilter* pFilter,
+        REFERENCE_TIME* pstart,
+        REFERENCE_TIME* pstop,
+        WORD wStartCookie,
+        WORD wStopCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AllocCapFile(
+        LPCOLESTR lpstr,
+        DWORDLONG dwlSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CopyCaptureFile(
+        LPOLESTR lpwstrOld,
+        LPOLESTR lpwstrNew,
+        int fAllowEscAbort,
+        IAMCopyCaptureFileProgress* pCallback) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FindPin(
+        IUnknown* pSource,
+        PIN_DIRECTION pindir,
+        const GUID* pCategory,
+        const GUID* pType,
+        BOOL fUnconnected,
+        int num,
+        IPin** ppPin) = 0;
+
+};
+#else
+typedef struct ICaptureGraphBuilder2Vtbl ICaptureGraphBuilder2Vtbl;
+struct ICaptureGraphBuilder2 {
+    const ICaptureGraphBuilder2Vtbl* lpVtbl;
+};
+struct ICaptureGraphBuilder2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ICaptureGraphBuilder2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ICaptureGraphBuilder2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ICaptureGraphBuilder2* This);
+
+    /*** ICaptureGraphBuilder2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFiltergraph)(
+        ICaptureGraphBuilder2* This,
+        IGraphBuilder* pfg);
+
+    HRESULT (STDMETHODCALLTYPE *GetFiltergraph)(
+        ICaptureGraphBuilder2* This,
+        IGraphBuilder** ppfg);
+
+    HRESULT (STDMETHODCALLTYPE *SetOutputFileName)(
+        ICaptureGraphBuilder2* This,
+        const GUID* pType,
+        LPCOLESTR lpstrFile,
+        IBaseFilter** ppf,
+        IFileSinkFilter** ppSink);
+
+    HRESULT (STDMETHODCALLTYPE *FindInterface)(
+        ICaptureGraphBuilder2* This,
+        const GUID* pCategory,
+        const GUID* pType,
+        IBaseFilter* pf,
+        REFIID riid,
+        void** ppint);
+
+    HRESULT (STDMETHODCALLTYPE *RenderStream)(
+        ICaptureGraphBuilder2* This,
+        const GUID* pCategory,
+        const GUID* pType,
+        IUnknown* pSource,
+        IBaseFilter* pfCompressor,
+        IBaseFilter* pfRenderer);
+
+    HRESULT (STDMETHODCALLTYPE *ControlStream)(
+        ICaptureGraphBuilder2* This,
+        const GUID* pCategory,
+        const GUID* pType,
+        IBaseFilter* pFilter,
+        REFERENCE_TIME* pstart,
+        REFERENCE_TIME* pstop,
+        WORD wStartCookie,
+        WORD wStopCookie);
+
+    HRESULT (STDMETHODCALLTYPE *AllocCapFile)(
+        ICaptureGraphBuilder2* This,
+        LPCOLESTR lpstr,
+        DWORDLONG dwlSize);
+
+    HRESULT (STDMETHODCALLTYPE *CopyCaptureFile)(
+        ICaptureGraphBuilder2* This,
+        LPOLESTR lpwstrOld,
+        LPOLESTR lpwstrNew,
+        int fAllowEscAbort,
+        IAMCopyCaptureFileProgress* pCallback);
+
+    HRESULT (STDMETHODCALLTYPE *FindPin)(
+        ICaptureGraphBuilder2* This,
+        IUnknown* pSource,
+        PIN_DIRECTION pindir,
+        const GUID* pCategory,
+        const GUID* pType,
+        BOOL fUnconnected,
+        int num,
+        IPin** ppPin);
+
+};
+
+/*** IUnknown methods ***/
+#define ICaptureGraphBuilder2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define ICaptureGraphBuilder2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define ICaptureGraphBuilder2_Release(p) (p)->lpVtbl->Release(p)
+/*** ICaptureGraphBuilder2 methods ***/
+#define ICaptureGraphBuilder2_SetFiltergraph(p,a) (p)->lpVtbl->SetFiltergraph(p,a)
+#define ICaptureGraphBuilder2_GetFiltergraph(p,a) (p)->lpVtbl->GetFiltergraph(p,a)
+#define ICaptureGraphBuilder2_SetOutputFileName(p,a,b,c,d) (p)->lpVtbl->SetOutputFileName(p,a,b,c,d)
+#define ICaptureGraphBuilder2_FindInterface(p,a,b,c,d,e) (p)->lpVtbl->FindInterface(p,a,b,c,d,e)
+#define ICaptureGraphBuilder2_RenderStream(p,a,b,c,d,e) (p)->lpVtbl->RenderStream(p,a,b,c,d,e)
+#define ICaptureGraphBuilder2_ControlStream(p,a,b,c,d,e,f,g) (p)->lpVtbl->ControlStream(p,a,b,c,d,e,f,g)
+#define ICaptureGraphBuilder2_AllocCapFile(p,a,b) (p)->lpVtbl->AllocCapFile(p,a,b)
+#define ICaptureGraphBuilder2_CopyCaptureFile(p,a,b,c,d) (p)->lpVtbl->CopyCaptureFile(p,a,b,c,d)
+#define ICaptureGraphBuilder2_FindPin(p,a,b,c,d,e,f,g) (p)->lpVtbl->FindPin(p,a,b,c,d,e,f,g)
+
+#endif
+
+#define ICaptureGraphBuilder2_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; \
+    /*** ICaptureGraphBuilder2 methods ***/ \
+    STDMETHOD_(HRESULT,SetFiltergraph)(THIS_ IGraphBuilder* pfg) PURE; \
+    STDMETHOD_(HRESULT,GetFiltergraph)(THIS_ IGraphBuilder** ppfg) PURE; \
+    STDMETHOD_(HRESULT,SetOutputFileName)(THIS_ const GUID* pType, LPCOLESTR lpstrFile, IBaseFilter** ppf, IFileSinkFilter** ppSink) PURE; \
+    STDMETHOD_(HRESULT,FindInterface)(THIS_ const GUID* pCategory, const GUID* pType, IBaseFilter* pf, REFIID riid, void** ppint) PURE; \
+    STDMETHOD_(HRESULT,RenderStream)(THIS_ const GUID* pCategory, const GUID* pType, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer) PURE; \
+    STDMETHOD_(HRESULT,ControlStream)(THIS_ const GUID* pCategory, const GUID* pType, IBaseFilter* pFilter, REFERENCE_TIME* pstart, REFERENCE_TIME* pstop, WORD wStartCookie, WORD wStopCookie) PURE; \
+    STDMETHOD_(HRESULT,AllocCapFile)(THIS_ LPCOLESTR lpstr, DWORDLONG dwlSize) PURE; \
+    STDMETHOD_(HRESULT,CopyCaptureFile)(THIS_ LPOLESTR lpwstrOld, LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback) PURE; \
+    STDMETHOD_(HRESULT,FindPin)(THIS_ IUnknown* pSource, PIN_DIRECTION pindir, const GUID* pCategory, const GUID* pType, BOOL fUnconnected, int num, IPin** ppPin) PURE;
+
+HRESULT CALLBACK ICaptureGraphBuilder2_SetFiltergraph_Proxy(
+    ICaptureGraphBuilder2* This,
+    IGraphBuilder* pfg);
+void __RPC_STUB ICaptureGraphBuilder2_SetFiltergraph_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_GetFiltergraph_Proxy(
+    ICaptureGraphBuilder2* This,
+    IGraphBuilder** ppfg);
+void __RPC_STUB ICaptureGraphBuilder2_GetFiltergraph_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_SetOutputFileName_Proxy(
+    ICaptureGraphBuilder2* This,
+    const GUID* pType,
+    LPCOLESTR lpstrFile,
+    IBaseFilter** ppf,
+    IFileSinkFilter** ppSink);
+void __RPC_STUB ICaptureGraphBuilder2_SetOutputFileName_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_RemoteFindInterface_Proxy(
+    ICaptureGraphBuilder2* This,
+    const GUID* pCategory,
+    const GUID* pType,
+    IBaseFilter* pf,
+    REFIID riid,
+    IUnknown** ppint);
+void __RPC_STUB ICaptureGraphBuilder2_RemoteFindInterface_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_FindInterface_Proxy(
+    ICaptureGraphBuilder2* This,
+    const GUID* pCategory,
+    const GUID* pType,
+    IBaseFilter* pf,
+    REFIID riid,
+    void** ppint);
+HRESULT __RPC_STUB ICaptureGraphBuilder2_FindInterface_Stub(
+    ICaptureGraphBuilder2* This,
+    const GUID* pCategory,
+    const GUID* pType,
+    IBaseFilter* pf,
+    REFIID riid,
+    IUnknown** ppint);
+HRESULT CALLBACK ICaptureGraphBuilder2_RenderStream_Proxy(
+    ICaptureGraphBuilder2* This,
+    const GUID* pCategory,
+    const GUID* pType,
+    IUnknown* pSource,
+    IBaseFilter* pfCompressor,
+    IBaseFilter* pfRenderer);
+void __RPC_STUB ICaptureGraphBuilder2_RenderStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_ControlStream_Proxy(
+    ICaptureGraphBuilder2* This,
+    const GUID* pCategory,
+    const GUID* pType,
+    IBaseFilter* pFilter,
+    REFERENCE_TIME* pstart,
+    REFERENCE_TIME* pstop,
+    WORD wStartCookie,
+    WORD wStopCookie);
+void __RPC_STUB ICaptureGraphBuilder2_ControlStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_AllocCapFile_Proxy(
+    ICaptureGraphBuilder2* This,
+    LPCOLESTR lpstr,
+    DWORDLONG dwlSize);
+void __RPC_STUB ICaptureGraphBuilder2_AllocCapFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_CopyCaptureFile_Proxy(
+    ICaptureGraphBuilder2* This,
+    LPOLESTR lpwstrOld,
+    LPOLESTR lpwstrNew,
+    int fAllowEscAbort,
+    IAMCopyCaptureFileProgress* pCallback);
+void __RPC_STUB ICaptureGraphBuilder2_CopyCaptureFile_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK ICaptureGraphBuilder2_FindPin_Proxy(
+    ICaptureGraphBuilder2* This,
+    IUnknown* pSource,
+    PIN_DIRECTION pindir,
+    const GUID* pCategory,
+    const GUID* pType,
+    BOOL fUnconnected,
+    int num,
+    IPin** ppPin);
+void __RPC_STUB ICaptureGraphBuilder2_FindPin_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+enum _AM_RENSDEREXFLAGS {
+    AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x1
+};
+
+typedef struct IFilterGraph2 IFilterGraph2;
+/*****************************************************************************
+ * IFilterGraph2 interface
+ */
+DEFINE_GUID(IID_IFilterGraph2, 0x36b73882, 0xc2c8, 0x11cf, 0x8b,0x46, 0x00,0x80,0x5f,0x6c,0xef,0x60);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterGraph2 : public IGraphBuilder
+{
+    virtual HRESULT STDMETHODCALLTYPE AddSourceFilterForMoniker(
+        IMoniker* pMoniker,
+        IBindCtx* pCtx,
+        LPCWSTR lpcwstrFilterName,
+        IBaseFilter** ppFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReconnectEx(
+        IPin* ppin,
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RenderEx(
+        IPin* pPinOut,
+        DWORD dwFlags,
+        DWORD* pvContext) = 0;
+
+};
+#else
+typedef struct IFilterGraph2Vtbl IFilterGraph2Vtbl;
+struct IFilterGraph2 {
+    const IFilterGraph2Vtbl* lpVtbl;
+};
+struct IFilterGraph2Vtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterGraph2* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterGraph2* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterGraph2* This);
+
+    /*** IFilterGraph methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddFilter)(
+        IFilterGraph2* This,
+        IBaseFilter* pFilter,
+        LPCWSTR pName);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveFilter)(
+        IFilterGraph2* This,
+        IBaseFilter* pFilter);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFilters)(
+        IFilterGraph2* This,
+        IEnumFilters** ppEnum);
+
+    HRESULT (STDMETHODCALLTYPE *FindFilterByName)(
+        IFilterGraph2* This,
+        LPCWSTR pName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDirect)(
+        IFilterGraph2* This,
+        IPin* ppinOut,
+        IPin* ppinIn,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *Reconnect)(
+        IFilterGraph2* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *Disconnect)(
+        IFilterGraph2* This,
+        IPin* ppin);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultSyncSource)(
+        IFilterGraph2* This);
+
+    /*** IGraphBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *Connect)(
+        IFilterGraph2* This,
+        IPin* ppinOut,
+        IPin* ppinIn);
+
+    HRESULT (STDMETHODCALLTYPE *Render)(
+        IFilterGraph2* This,
+        IPin* ppinOut);
+
+    HRESULT (STDMETHODCALLTYPE *RenderFile)(
+        IFilterGraph2* This,
+        LPCWSTR lpcwstrFile,
+        LPCWSTR lpcwstrPlayList);
+
+    HRESULT (STDMETHODCALLTYPE *AddSourceFilter)(
+        IFilterGraph2* This,
+        LPCWSTR lpcwstrFileName,
+        LPCWSTR lpcwstrFilterName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *SetLogFile)(
+        IFilterGraph2* This,
+        DWORD_PTR hFile);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IFilterGraph2* This);
+
+    HRESULT (STDMETHODCALLTYPE *ShouldOperationContinue)(
+        IFilterGraph2* This);
+
+    /*** IFilterGraph2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddSourceFilterForMoniker)(
+        IFilterGraph2* This,
+        IMoniker* pMoniker,
+        IBindCtx* pCtx,
+        LPCWSTR lpcwstrFilterName,
+        IBaseFilter** ppFilter);
+
+    HRESULT (STDMETHODCALLTYPE *ReconnectEx)(
+        IFilterGraph2* This,
+        IPin* ppin,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *RenderEx)(
+        IFilterGraph2* This,
+        IPin* pPinOut,
+        DWORD dwFlags,
+        DWORD* pvContext);
+
+};
+
+/*** IUnknown methods ***/
+#define IFilterGraph2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterGraph2_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterGraph2_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterGraph methods ***/
+#define IFilterGraph2_AddFilter(p,a,b) (p)->lpVtbl->AddFilter(p,a,b)
+#define IFilterGraph2_RemoveFilter(p,a) (p)->lpVtbl->RemoveFilter(p,a)
+#define IFilterGraph2_EnumFilters(p,a) (p)->lpVtbl->EnumFilters(p,a)
+#define IFilterGraph2_FindFilterByName(p,a,b) (p)->lpVtbl->FindFilterByName(p,a,b)
+#define IFilterGraph2_ConnectDirect(p,a,b,c) (p)->lpVtbl->ConnectDirect(p,a,b,c)
+#define IFilterGraph2_Reconnect(p,a) (p)->lpVtbl->Reconnect(p,a)
+#define IFilterGraph2_Disconnect(p,a) (p)->lpVtbl->Disconnect(p,a)
+#define IFilterGraph2_SetDefaultSyncSource(p) (p)->lpVtbl->SetDefaultSyncSource(p)
+/*** IGraphBuilder methods ***/
+#define IFilterGraph2_Connect(p,a,b) (p)->lpVtbl->Connect(p,a,b)
+#define IFilterGraph2_Render(p,a) (p)->lpVtbl->Render(p,a)
+#define IFilterGraph2_RenderFile(p,a,b) (p)->lpVtbl->RenderFile(p,a,b)
+#define IFilterGraph2_AddSourceFilter(p,a,b,c) (p)->lpVtbl->AddSourceFilter(p,a,b,c)
+#define IFilterGraph2_SetLogFile(p,a) (p)->lpVtbl->SetLogFile(p,a)
+#define IFilterGraph2_Abort(p) (p)->lpVtbl->Abort(p)
+#define IFilterGraph2_ShouldOperationContinue(p) (p)->lpVtbl->ShouldOperationContinue(p)
+/*** IFilterGraph2 methods ***/
+#define IFilterGraph2_AddSourceFilterForMoniker(p,a,b,c,d) (p)->lpVtbl->AddSourceFilterForMoniker(p,a,b,c,d)
+#define IFilterGraph2_ReconnectEx(p,a,b) (p)->lpVtbl->ReconnectEx(p,a,b)
+#define IFilterGraph2_RenderEx(p,a,b,c) (p)->lpVtbl->RenderEx(p,a,b,c)
+
+#endif
+
+#define IFilterGraph2_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; \
+    /*** IFilterGraph methods ***/ \
+    STDMETHOD_(HRESULT,AddFilter)(THIS_ IBaseFilter* pFilter, LPCWSTR pName) PURE; \
+    STDMETHOD_(HRESULT,RemoveFilter)(THIS_ IBaseFilter* pFilter) PURE; \
+    STDMETHOD_(HRESULT,EnumFilters)(THIS_ IEnumFilters** ppEnum) PURE; \
+    STDMETHOD_(HRESULT,FindFilterByName)(THIS_ LPCWSTR pName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,ConnectDirect)(THIS_ IPin* ppinOut, IPin* ppinIn, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,Reconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,Disconnect)(THIS_ IPin* ppin) PURE; \
+    STDMETHOD_(HRESULT,SetDefaultSyncSource)(THIS) PURE; \
+    /*** IGraphBuilder methods ***/ \
+    STDMETHOD_(HRESULT,Connect)(THIS_ IPin* ppinOut, IPin* ppinIn) PURE; \
+    STDMETHOD_(HRESULT,Render)(THIS_ IPin* ppinOut) PURE; \
+    STDMETHOD_(HRESULT,RenderFile)(THIS_ LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList) PURE; \
+    STDMETHOD_(HRESULT,AddSourceFilter)(THIS_ LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,SetLogFile)(THIS_ DWORD_PTR hFile) PURE; \
+    STDMETHOD_(HRESULT,Abort)(THIS) PURE; \
+    STDMETHOD_(HRESULT,ShouldOperationContinue)(THIS) PURE; \
+    /*** IFilterGraph2 methods ***/ \
+    STDMETHOD_(HRESULT,AddSourceFilterForMoniker)(THIS_ IMoniker* pMoniker, IBindCtx* pCtx, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter) PURE; \
+    STDMETHOD_(HRESULT,ReconnectEx)(THIS_ IPin* ppin, const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,RenderEx)(THIS_ IPin* pPinOut, DWORD dwFlags, DWORD* pvContext) PURE;
+
+HRESULT CALLBACK IFilterGraph2_AddSourceFilterForMoniker_Proxy(
+    IFilterGraph2* This,
+    IMoniker* pMoniker,
+    IBindCtx* pCtx,
+    LPCWSTR lpcwstrFilterName,
+    IBaseFilter** ppFilter);
+void __RPC_STUB IFilterGraph2_AddSourceFilterForMoniker_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph2_ReconnectEx_Proxy(
+    IFilterGraph2* This,
+    IPin* ppin,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IFilterGraph2_ReconnectEx_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterGraph2_RenderEx_Proxy(
+    IFilterGraph2* This,
+    IPin* pPinOut,
+    DWORD dwFlags,
+    DWORD* pvContext);
+void __RPC_STUB IFilterGraph2_RenderEx_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IStreamBuilder IStreamBuilder;
+/*****************************************************************************
+ * IStreamBuilder interface
+ */
+DEFINE_GUID(IID_IStreamBuilder, 0x56a868bf, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IStreamBuilder : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Render(
+        IPin* ppinOut,
+        IGraphBuilder* pGraph) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Backout(
+        IPin* ppinOut,
+        IGraphBuilder* pGraph) = 0;
+
+};
+#else
+typedef struct IStreamBuilderVtbl IStreamBuilderVtbl;
+struct IStreamBuilder {
+    const IStreamBuilderVtbl* lpVtbl;
+};
+struct IStreamBuilderVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IStreamBuilder* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IStreamBuilder* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IStreamBuilder* This);
+
+    /*** IStreamBuilder methods ***/
+    HRESULT (STDMETHODCALLTYPE *Render)(
+        IStreamBuilder* This,
+        IPin* ppinOut,
+        IGraphBuilder* pGraph);
+
+    HRESULT (STDMETHODCALLTYPE *Backout)(
+        IStreamBuilder* This,
+        IPin* ppinOut,
+        IGraphBuilder* pGraph);
+
+};
+
+/*** IUnknown methods ***/
+#define IStreamBuilder_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IStreamBuilder_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IStreamBuilder_Release(p) (p)->lpVtbl->Release(p)
+/*** IStreamBuilder methods ***/
+#define IStreamBuilder_Render(p,a,b) (p)->lpVtbl->Render(p,a,b)
+#define IStreamBuilder_Backout(p,a,b) (p)->lpVtbl->Backout(p,a,b)
+
+#endif
+
+#define IStreamBuilder_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; \
+    /*** IStreamBuilder methods ***/ \
+    STDMETHOD_(HRESULT,Render)(THIS_ IPin* ppinOut, IGraphBuilder* pGraph) PURE; \
+    STDMETHOD_(HRESULT,Backout)(THIS_ IPin* ppinOut, IGraphBuilder* pGraph) PURE;
+
+HRESULT CALLBACK IStreamBuilder_Render_Proxy(
+    IStreamBuilder* This,
+    IPin* ppinOut,
+    IGraphBuilder* pGraph);
+void __RPC_STUB IStreamBuilder_Render_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IStreamBuilder_Backout_Proxy(
+    IStreamBuilder* This,
+    IPin* ppinOut,
+    IGraphBuilder* pGraph);
+void __RPC_STUB IStreamBuilder_Backout_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IAsyncReader IAsyncReader;
+/*****************************************************************************
+ * IAsyncReader interface
+ */
+DEFINE_GUID(IID_IAsyncReader, 0x56a868aa, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IAsyncReader : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE RequestAllocator(
+        IMemAllocator* pPreferred,
+        ALLOCATOR_PROPERTIES* pProps,
+        IMemAllocator** ppActual) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Request(
+        IMediaSample* pSample,
+        DWORD_PTR dwUser) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WaitForNext(
+        DWORD dwTimeout,
+        IMediaSample** ppSample,
+        DWORD_PTR* pdwUser) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SyncReadAligned(
+        IMediaSample* pSample) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SyncRead(
+        LONGLONG llPosition,
+        LONG lLength,
+        BYTE* pBuffer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Length(
+        LONGLONG* pTotal,
+        LONGLONG* pAvailable) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BeginFlush(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EndFlush(
+        ) = 0;
+
+};
+#else
+typedef struct IAsyncReaderVtbl IAsyncReaderVtbl;
+struct IAsyncReader {
+    const IAsyncReaderVtbl* lpVtbl;
+};
+struct IAsyncReaderVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAsyncReader* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAsyncReader* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAsyncReader* This);
+
+    /*** IAsyncReader methods ***/
+    HRESULT (STDMETHODCALLTYPE *RequestAllocator)(
+        IAsyncReader* This,
+        IMemAllocator* pPreferred,
+        ALLOCATOR_PROPERTIES* pProps,
+        IMemAllocator** ppActual);
+
+    HRESULT (STDMETHODCALLTYPE *Request)(
+        IAsyncReader* This,
+        IMediaSample* pSample,
+        DWORD_PTR dwUser);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForNext)(
+        IAsyncReader* This,
+        DWORD dwTimeout,
+        IMediaSample** ppSample,
+        DWORD_PTR* pdwUser);
+
+    HRESULT (STDMETHODCALLTYPE *SyncReadAligned)(
+        IAsyncReader* This,
+        IMediaSample* pSample);
+
+    HRESULT (STDMETHODCALLTYPE *SyncRead)(
+        IAsyncReader* This,
+        LONGLONG llPosition,
+        LONG lLength,
+        BYTE* pBuffer);
+
+    HRESULT (STDMETHODCALLTYPE *Length)(
+        IAsyncReader* This,
+        LONGLONG* pTotal,
+        LONGLONG* pAvailable);
+
+    HRESULT (STDMETHODCALLTYPE *BeginFlush)(
+        IAsyncReader* This);
+
+    HRESULT (STDMETHODCALLTYPE *EndFlush)(
+        IAsyncReader* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IAsyncReader_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IAsyncReader_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IAsyncReader_Release(p) (p)->lpVtbl->Release(p)
+/*** IAsyncReader methods ***/
+#define IAsyncReader_RequestAllocator(p,a,b,c) (p)->lpVtbl->RequestAllocator(p,a,b,c)
+#define IAsyncReader_Request(p,a,b) (p)->lpVtbl->Request(p,a,b)
+#define IAsyncReader_WaitForNext(p,a,b,c) (p)->lpVtbl->WaitForNext(p,a,b,c)
+#define IAsyncReader_SyncReadAligned(p,a) (p)->lpVtbl->SyncReadAligned(p,a)
+#define IAsyncReader_SyncRead(p,a,b,c) (p)->lpVtbl->SyncRead(p,a,b,c)
+#define IAsyncReader_Length(p,a,b) (p)->lpVtbl->Length(p,a,b)
+#define IAsyncReader_BeginFlush(p) (p)->lpVtbl->BeginFlush(p)
+#define IAsyncReader_EndFlush(p) (p)->lpVtbl->EndFlush(p)
+
+#endif
+
+#define IAsyncReader_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; \
+    /*** IAsyncReader methods ***/ \
+    STDMETHOD_(HRESULT,RequestAllocator)(THIS_ IMemAllocator* pPreferred, ALLOCATOR_PROPERTIES* pProps, IMemAllocator** ppActual) PURE; \
+    STDMETHOD_(HRESULT,Request)(THIS_ IMediaSample* pSample, DWORD_PTR dwUser) PURE; \
+    STDMETHOD_(HRESULT,WaitForNext)(THIS_ DWORD dwTimeout, IMediaSample** ppSample, DWORD_PTR* pdwUser) PURE; \
+    STDMETHOD_(HRESULT,SyncReadAligned)(THIS_ IMediaSample* pSample) PURE; \
+    STDMETHOD_(HRESULT,SyncRead)(THIS_ LONGLONG llPosition, LONG lLength, BYTE* pBuffer) PURE; \
+    STDMETHOD_(HRESULT,Length)(THIS_ LONGLONG* pTotal, LONGLONG* pAvailable) PURE; \
+    STDMETHOD_(HRESULT,BeginFlush)(THIS) PURE; \
+    STDMETHOD_(HRESULT,EndFlush)(THIS) PURE;
+
+HRESULT CALLBACK IAsyncReader_RequestAllocator_Proxy(
+    IAsyncReader* This,
+    IMemAllocator* pPreferred,
+    ALLOCATOR_PROPERTIES* pProps,
+    IMemAllocator** ppActual);
+void __RPC_STUB IAsyncReader_RequestAllocator_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_Request_Proxy(
+    IAsyncReader* This,
+    IMediaSample* pSample,
+    DWORD_PTR dwUser);
+void __RPC_STUB IAsyncReader_Request_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_WaitForNext_Proxy(
+    IAsyncReader* This,
+    DWORD dwTimeout,
+    IMediaSample** ppSample,
+    DWORD_PTR* pdwUser);
+void __RPC_STUB IAsyncReader_WaitForNext_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_SyncReadAligned_Proxy(
+    IAsyncReader* This,
+    IMediaSample* pSample);
+void __RPC_STUB IAsyncReader_SyncReadAligned_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_SyncRead_Proxy(
+    IAsyncReader* This,
+    LONGLONG llPosition,
+    LONG lLength,
+    BYTE* pBuffer);
+void __RPC_STUB IAsyncReader_SyncRead_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_Length_Proxy(
+    IAsyncReader* This,
+    LONGLONG* pTotal,
+    LONGLONG* pAvailable);
+void __RPC_STUB IAsyncReader_Length_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_BeginFlush_Proxy(
+    IAsyncReader* This);
+void __RPC_STUB IAsyncReader_BeginFlush_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IAsyncReader_EndFlush_Proxy(
+    IAsyncReader* This);
+void __RPC_STUB IAsyncReader_EndFlush_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IGraphVersion IGraphVersion;
+/*****************************************************************************
+ * IGraphVersion interface
+ */
+DEFINE_GUID(IID_IGraphVersion, 0x56a868ab, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IGraphVersion : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE QueryVersion(
+        LONG* pVersion) = 0;
+
+};
+#else
+typedef struct IGraphVersionVtbl IGraphVersionVtbl;
+struct IGraphVersion {
+    const IGraphVersionVtbl* lpVtbl;
+};
+struct IGraphVersionVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IGraphVersion* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IGraphVersion* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IGraphVersion* This);
+
+    /*** IGraphVersion methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryVersion)(
+        IGraphVersion* This,
+        LONG* pVersion);
+
+};
+
+/*** IUnknown methods ***/
+#define IGraphVersion_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IGraphVersion_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IGraphVersion_Release(p) (p)->lpVtbl->Release(p)
+/*** IGraphVersion methods ***/
+#define IGraphVersion_QueryVersion(p,a) (p)->lpVtbl->QueryVersion(p,a)
+
+#endif
+
+#define IGraphVersion_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; \
+    /*** IGraphVersion methods ***/ \
+    STDMETHOD_(HRESULT,QueryVersion)(THIS_ LONG* pVersion) PURE;
+
+HRESULT CALLBACK IGraphVersion_QueryVersion_Proxy(
+    IGraphVersion* This,
+    LONG* pVersion);
+void __RPC_STUB IGraphVersion_QueryVersion_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IResourceConsumer IResourceConsumer;
+/*****************************************************************************
+ * IResourceConsumer interface
+ */
+DEFINE_GUID(IID_IResourceConsumer, 0x56a868ad, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IResourceConsumer : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AcquireResource(
+        LONG idResource) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseResource(
+        LONG idResource) = 0;
+
+};
+#else
+typedef struct IResourceConsumerVtbl IResourceConsumerVtbl;
+struct IResourceConsumer {
+    const IResourceConsumerVtbl* lpVtbl;
+};
+struct IResourceConsumerVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IResourceConsumer* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IResourceConsumer* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IResourceConsumer* This);
+
+    /*** IResourceConsumer methods ***/
+    HRESULT (STDMETHODCALLTYPE *AcquireResource)(
+        IResourceConsumer* This,
+        LONG idResource);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseResource)(
+        IResourceConsumer* This,
+        LONG idResource);
+
+};
+
+/*** IUnknown methods ***/
+#define IResourceConsumer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IResourceConsumer_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IResourceConsumer_Release(p) (p)->lpVtbl->Release(p)
+/*** IResourceConsumer methods ***/
+#define IResourceConsumer_AcquireResource(p,a) (p)->lpVtbl->AcquireResource(p,a)
+#define IResourceConsumer_ReleaseResource(p,a) (p)->lpVtbl->ReleaseResource(p,a)
+
+#endif
+
+#define IResourceConsumer_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; \
+    /*** IResourceConsumer methods ***/ \
+    STDMETHOD_(HRESULT,AcquireResource)(THIS_ LONG idResource) PURE; \
+    STDMETHOD_(HRESULT,ReleaseResource)(THIS_ LONG idResource) PURE;
+
+HRESULT CALLBACK IResourceConsumer_AcquireResource_Proxy(
+    IResourceConsumer* This,
+    LONG idResource);
+void __RPC_STUB IResourceConsumer_AcquireResource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceConsumer_ReleaseResource_Proxy(
+    IResourceConsumer* This,
+    LONG idResource);
+void __RPC_STUB IResourceConsumer_ReleaseResource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IResourceManager IResourceManager;
+/*****************************************************************************
+ * IResourceManager interface
+ */
+DEFINE_GUID(IID_IResourceManager, 0x56a868ac, 0x0ad4, 0x11ce, 0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IResourceManager : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Register(
+        LPCWSTR pName,
+        LONG cResource,
+        LONG* plToken) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterGroup(
+        LPCWSTR pName,
+        LONG cResource,
+        LONG* palTokens,
+        LONG* plToken) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RequestResource(
+        LONG idResource,
+        IUnknown* pFocusObject,
+        IResourceConsumer* pConsumer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyAcquire(
+        LONG idResource,
+        IResourceConsumer* pConsumer,
+        HRESULT hr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyRelease(
+        LONG idResource,
+        IResourceConsumer* pConsumer,
+        BOOL bStillWant) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CancelRequest(
+        LONG idResource,
+        IResourceConsumer* pConsumer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFocus(
+        IUnknown* pFocusObject) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReleaseFocus(
+        IUnknown* pFocusObject) = 0;
+
+};
+#else
+typedef struct IResourceManagerVtbl IResourceManagerVtbl;
+struct IResourceManager {
+    const IResourceManagerVtbl* lpVtbl;
+};
+struct IResourceManagerVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IResourceManager* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IResourceManager* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IResourceManager* This);
+
+    /*** IResourceManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *Register)(
+        IResourceManager* This,
+        LPCWSTR pName,
+        LONG cResource,
+        LONG* plToken);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterGroup)(
+        IResourceManager* This,
+        LPCWSTR pName,
+        LONG cResource,
+        LONG* palTokens,
+        LONG* plToken);
+
+    HRESULT (STDMETHODCALLTYPE *RequestResource)(
+        IResourceManager* This,
+        LONG idResource,
+        IUnknown* pFocusObject,
+        IResourceConsumer* pConsumer);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyAcquire)(
+        IResourceManager* This,
+        LONG idResource,
+        IResourceConsumer* pConsumer,
+        HRESULT hr);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyRelease)(
+        IResourceManager* This,
+        LONG idResource,
+        IResourceConsumer* pConsumer,
+        BOOL bStillWant);
+
+    HRESULT (STDMETHODCALLTYPE *CancelRequest)(
+        IResourceManager* This,
+        LONG idResource,
+        IResourceConsumer* pConsumer);
+
+    HRESULT (STDMETHODCALLTYPE *SetFocus)(
+        IResourceManager* This,
+        IUnknown* pFocusObject);
+
+    HRESULT (STDMETHODCALLTYPE *ReleaseFocus)(
+        IResourceManager* This,
+        IUnknown* pFocusObject);
+
+};
+
+/*** IUnknown methods ***/
+#define IResourceManager_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IResourceManager_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IResourceManager_Release(p) (p)->lpVtbl->Release(p)
+/*** IResourceManager methods ***/
+#define IResourceManager_Register(p,a,b,c) (p)->lpVtbl->Register(p,a,b,c)
+#define IResourceManager_RegisterGroup(p,a,b,c,d) (p)->lpVtbl->RegisterGroup(p,a,b,c,d)
+#define IResourceManager_RequestResource(p,a,b,c) (p)->lpVtbl->RequestResource(p,a,b,c)
+#define IResourceManager_NotifyAcquire(p,a,b,c) (p)->lpVtbl->NotifyAcquire(p,a,b,c)
+#define IResourceManager_NotifyRelease(p,a,b,c) (p)->lpVtbl->NotifyRelease(p,a,b,c)
+#define IResourceManager_CancelRequest(p,a,b) (p)->lpVtbl->CancelRequest(p,a,b)
+#define IResourceManager_SetFocus(p,a) (p)->lpVtbl->SetFocus(p,a)
+#define IResourceManager_ReleaseFocus(p,a) (p)->lpVtbl->ReleaseFocus(p,a)
+
+#endif
+
+#define IResourceManager_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; \
+    /*** IResourceManager methods ***/ \
+    STDMETHOD_(HRESULT,Register)(THIS_ LPCWSTR pName, LONG cResource, LONG* plToken) PURE; \
+    STDMETHOD_(HRESULT,RegisterGroup)(THIS_ LPCWSTR pName, LONG cResource, LONG* palTokens, LONG* plToken) PURE; \
+    STDMETHOD_(HRESULT,RequestResource)(THIS_ LONG idResource, IUnknown* pFocusObject, IResourceConsumer* pConsumer) PURE; \
+    STDMETHOD_(HRESULT,NotifyAcquire)(THIS_ LONG idResource, IResourceConsumer* pConsumer, HRESULT hr) PURE; \
+    STDMETHOD_(HRESULT,NotifyRelease)(THIS_ LONG idResource, IResourceConsumer* pConsumer, BOOL bStillWant) PURE; \
+    STDMETHOD_(HRESULT,CancelRequest)(THIS_ LONG idResource, IResourceConsumer* pConsumer) PURE; \
+    STDMETHOD_(HRESULT,SetFocus)(THIS_ IUnknown* pFocusObject) PURE; \
+    STDMETHOD_(HRESULT,ReleaseFocus)(THIS_ IUnknown* pFocusObject) PURE;
+
+HRESULT CALLBACK IResourceManager_Register_Proxy(
+    IResourceManager* This,
+    LPCWSTR pName,
+    LONG cResource,
+    LONG* plToken);
+void __RPC_STUB IResourceManager_Register_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_RegisterGroup_Proxy(
+    IResourceManager* This,
+    LPCWSTR pName,
+    LONG cResource,
+    LONG* palTokens,
+    LONG* plToken);
+void __RPC_STUB IResourceManager_RegisterGroup_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_RequestResource_Proxy(
+    IResourceManager* This,
+    LONG idResource,
+    IUnknown* pFocusObject,
+    IResourceConsumer* pConsumer);
+void __RPC_STUB IResourceManager_RequestResource_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_NotifyAcquire_Proxy(
+    IResourceManager* This,
+    LONG idResource,
+    IResourceConsumer* pConsumer,
+    HRESULT hr);
+void __RPC_STUB IResourceManager_NotifyAcquire_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_NotifyRelease_Proxy(
+    IResourceManager* This,
+    LONG idResource,
+    IResourceConsumer* pConsumer,
+    BOOL bStillWant);
+void __RPC_STUB IResourceManager_NotifyRelease_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_CancelRequest_Proxy(
+    IResourceManager* This,
+    LONG idResource,
+    IResourceConsumer* pConsumer);
+void __RPC_STUB IResourceManager_CancelRequest_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_SetFocus_Proxy(
+    IResourceManager* This,
+    IUnknown* pFocusObject);
+void __RPC_STUB IResourceManager_SetFocus_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IResourceManager_ReleaseFocus_Proxy(
+    IResourceManager* This,
+    IUnknown* pFocusObject);
+void __RPC_STUB IResourceManager_ReleaseFocus_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IPinConnection IPinConnection;
+typedef struct IPinFlowControl IPinFlowControl;
+typedef struct IGraphConfig IGraphConfig;
+typedef struct IGraphConfigCallback IGraphConfigCallback;
+/*****************************************************************************
+ * IPinConnection interface
+ */
+DEFINE_GUID(IID_IPinConnection, 0x4a9a62d3, 0x27d4, 0x403d, 0x91,0xe9, 0x89,0xf5,0x40,0xe5,0x55,0x34);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IPinConnection : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE DynamicQueryAccept(
+        const AM_MEDIA_TYPE* pmt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyEndOfStream(
+        HANDLE hNotifyEvent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsEndPin(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DynamicDisconnect(
+        ) = 0;
+
+};
+#else
+typedef struct IPinConnectionVtbl IPinConnectionVtbl;
+struct IPinConnection {
+    const IPinConnectionVtbl* lpVtbl;
+};
+struct IPinConnectionVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPinConnection* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPinConnection* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPinConnection* This);
+
+    /*** IPinConnection methods ***/
+    HRESULT (STDMETHODCALLTYPE *DynamicQueryAccept)(
+        IPinConnection* This,
+        const AM_MEDIA_TYPE* pmt);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyEndOfStream)(
+        IPinConnection* This,
+        HANDLE hNotifyEvent);
+
+    HRESULT (STDMETHODCALLTYPE *IsEndPin)(
+        IPinConnection* This);
+
+    HRESULT (STDMETHODCALLTYPE *DynamicDisconnect)(
+        IPinConnection* This);
+
+};
+
+/*** IUnknown methods ***/
+#define IPinConnection_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IPinConnection_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IPinConnection_Release(p) (p)->lpVtbl->Release(p)
+/*** IPinConnection methods ***/
+#define IPinConnection_DynamicQueryAccept(p,a) (p)->lpVtbl->DynamicQueryAccept(p,a)
+#define IPinConnection_NotifyEndOfStream(p,a) (p)->lpVtbl->NotifyEndOfStream(p,a)
+#define IPinConnection_IsEndPin(p) (p)->lpVtbl->IsEndPin(p)
+#define IPinConnection_DynamicDisconnect(p) (p)->lpVtbl->DynamicDisconnect(p)
+
+#endif
+
+#define IPinConnection_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; \
+    /*** IPinConnection methods ***/ \
+    STDMETHOD_(HRESULT,DynamicQueryAccept)(THIS_ const AM_MEDIA_TYPE* pmt) PURE; \
+    STDMETHOD_(HRESULT,NotifyEndOfStream)(THIS_ HANDLE hNotifyEvent) PURE; \
+    STDMETHOD_(HRESULT,IsEndPin)(THIS) PURE; \
+    STDMETHOD_(HRESULT,DynamicDisconnect)(THIS) PURE;
+
+HRESULT CALLBACK IPinConnection_DynamicQueryAccept_Proxy(
+    IPinConnection* This,
+    const AM_MEDIA_TYPE* pmt);
+void __RPC_STUB IPinConnection_DynamicQueryAccept_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPinConnection_NotifyEndOfStream_Proxy(
+    IPinConnection* This,
+    HANDLE hNotifyEvent);
+void __RPC_STUB IPinConnection_NotifyEndOfStream_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPinConnection_IsEndPin_Proxy(
+    IPinConnection* This);
+void __RPC_STUB IPinConnection_IsEndPin_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IPinConnection_DynamicDisconnect_Proxy(
+    IPinConnection* This);
+void __RPC_STUB IPinConnection_DynamicDisconnect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * IPinFlowControl interface
+ */
+DEFINE_GUID(IID_IPinFlowControl, 0xc56e9858, 0xdbf3, 0x4f6b, 0x81,0x19, 0x38,0x4a,0xf2,0x06,0x0d,0xeb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IPinFlowControl : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Block(
+        DWORD dwBlockFlags,
+        HANDLE hEvent) = 0;
+
+};
+#else
+typedef struct IPinFlowControlVtbl IPinFlowControlVtbl;
+struct IPinFlowControl {
+    const IPinFlowControlVtbl* lpVtbl;
+};
+struct IPinFlowControlVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IPinFlowControl* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IPinFlowControl* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IPinFlowControl* This);
+
+    /*** IPinFlowControl methods ***/
+    HRESULT (STDMETHODCALLTYPE *Block)(
+        IPinFlowControl* This,
+        DWORD dwBlockFlags,
+        HANDLE hEvent);
+
+};
+
+/*** IUnknown methods ***/
+#define IPinFlowControl_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IPinFlowControl_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IPinFlowControl_Release(p) (p)->lpVtbl->Release(p)
+/*** IPinFlowControl methods ***/
+#define IPinFlowControl_Block(p,a,b) (p)->lpVtbl->Block(p,a,b)
+
+#endif
+
+#define IPinFlowControl_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; \
+    /*** IPinFlowControl methods ***/ \
+    STDMETHOD_(HRESULT,Block)(THIS_ DWORD dwBlockFlags, HANDLE hEvent) PURE;
+
+HRESULT CALLBACK IPinFlowControl_Block_Proxy(
+    IPinFlowControl* This,
+    DWORD dwBlockFlags,
+    HANDLE hEvent);
+void __RPC_STUB IPinFlowControl_Block_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS {
+    AM_PIN_FLOW_CONTROL_BLOCK = 0x1
+};
+
+typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS {
+    AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x1,
+    AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x2,
+    AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x4
+} AM_GRAPH_CONFIG_RECONNECT_FLAGS;
+
+enum _REM_FILTER_FLAGS {
+    REMFILTERF_LEAVECONNECTED = 0x1
+};
+
+typedef enum _AM_FILTER_FLAGS {
+    AM_FILTER_FLAGS_REMOVABLE = 0x1
+} AM_FILTER_FLAGS;
+
+/*****************************************************************************
+ * IGraphConfig interface
+ */
+DEFINE_GUID(IID_IGraphConfig, 0x03a1eb8e, 0x32bf, 0x4245, 0x85,0x02, 0x11,0x4d,0x08,0xa9,0xcb,0x88);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IGraphConfig : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Reconnect(
+        IPin* pOutputPin,
+        IPin* pInputPin,
+        const AM_MEDIA_TYPE* pmtFirstConnection,
+        IBaseFilter* pUsingFilter,
+        HANDLE hAbortEvent,
+        DWORD dwFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reconfigure(
+        IGraphConfigCallback* pCallback,
+        PVOID pvContext,
+        DWORD dwFlags,
+        HANDLE hAbortEvent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddFilterToCache(
+        IBaseFilter* pFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumCacheFilter(
+        IEnumFilters** pEnum) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveFilterFromCache(
+        IBaseFilter* pFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStartTime(
+        REFERENCE_TIME* prtStart) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE PushThroughData(
+        IPin* pOutputPin,
+        IPinConnection* pConnection,
+        HANDLE hEventAbort) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFilterFlags(
+        IBaseFilter* pFilter,
+        DWORD dwFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilterFlags(
+        IBaseFilter* pFilter,
+        DWORD* pdwFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveFilterEx(
+        IBaseFilter* pFilter,
+        DWORD Flags) = 0;
+
+};
+#else
+typedef struct IGraphConfigVtbl IGraphConfigVtbl;
+struct IGraphConfig {
+    const IGraphConfigVtbl* lpVtbl;
+};
+struct IGraphConfigVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IGraphConfig* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IGraphConfig* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IGraphConfig* This);
+
+    /*** IGraphConfig methods ***/
+    HRESULT (STDMETHODCALLTYPE *Reconnect)(
+        IGraphConfig* This,
+        IPin* pOutputPin,
+        IPin* pInputPin,
+        const AM_MEDIA_TYPE* pmtFirstConnection,
+        IBaseFilter* pUsingFilter,
+        HANDLE hAbortEvent,
+        DWORD dwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *Reconfigure)(
+        IGraphConfig* This,
+        IGraphConfigCallback* pCallback,
+        PVOID pvContext,
+        DWORD dwFlags,
+        HANDLE hAbortEvent);
+
+    HRESULT (STDMETHODCALLTYPE *AddFilterToCache)(
+        IGraphConfig* This,
+        IBaseFilter* pFilter);
+
+    HRESULT (STDMETHODCALLTYPE *EnumCacheFilter)(
+        IGraphConfig* This,
+        IEnumFilters** pEnum);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveFilterFromCache)(
+        IGraphConfig* This,
+        IBaseFilter* pFilter);
+
+    HRESULT (STDMETHODCALLTYPE *GetStartTime)(
+        IGraphConfig* This,
+        REFERENCE_TIME* prtStart);
+
+    HRESULT (STDMETHODCALLTYPE *PushThroughData)(
+        IGraphConfig* This,
+        IPin* pOutputPin,
+        IPinConnection* pConnection,
+        HANDLE hEventAbort);
+
+    HRESULT (STDMETHODCALLTYPE *SetFilterFlags)(
+        IGraphConfig* This,
+        IBaseFilter* pFilter,
+        DWORD dwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilterFlags)(
+        IGraphConfig* This,
+        IBaseFilter* pFilter,
+        DWORD* pdwFlags);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveFilterEx)(
+        IGraphConfig* This,
+        IBaseFilter* pFilter,
+        DWORD Flags);
+
+};
+
+/*** IUnknown methods ***/
+#define IGraphConfig_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IGraphConfig_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IGraphConfig_Release(p) (p)->lpVtbl->Release(p)
+/*** IGraphConfig methods ***/
+#define IGraphConfig_Reconnect(p,a,b,c,d,e,f) (p)->lpVtbl->Reconnect(p,a,b,c,d,e,f)
+#define IGraphConfig_Reconfigure(p,a,b,c,d) (p)->lpVtbl->Reconfigure(p,a,b,c,d)
+#define IGraphConfig_AddFilterToCache(p,a) (p)->lpVtbl->AddFilterToCache(p,a)
+#define IGraphConfig_EnumCacheFilter(p,a) (p)->lpVtbl->EnumCacheFilter(p,a)
+#define IGraphConfig_RemoveFilterFromCache(p,a) (p)->lpVtbl->RemoveFilterFromCache(p,a)
+#define IGraphConfig_GetStartTime(p,a) (p)->lpVtbl->GetStartTime(p,a)
+#define IGraphConfig_PushThroughData(p,a,b,c) (p)->lpVtbl->PushThroughData(p,a,b,c)
+#define IGraphConfig_SetFilterFlags(p,a,b) (p)->lpVtbl->SetFilterFlags(p,a,b)
+#define IGraphConfig_GetFilterFlags(p,a,b) (p)->lpVtbl->GetFilterFlags(p,a,b)
+#define IGraphConfig_RemoveFilterEx(p,a,b) (p)->lpVtbl->RemoveFilterEx(p,a,b)
+
+#endif
+
+#define IGraphConfig_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; \
+    /*** IGraphConfig methods ***/ \
+    STDMETHOD_(HRESULT,Reconnect)(THIS_ IPin* pOutputPin, IPin* pInputPin, const AM_MEDIA_TYPE* pmtFirstConnection, IBaseFilter* pUsingFilter, HANDLE hAbortEvent, DWORD dwFlags) PURE; \
+    STDMETHOD_(HRESULT,Reconfigure)(THIS_ IGraphConfigCallback* pCallback, PVOID pvContext, DWORD dwFlags, HANDLE hAbortEvent) PURE; \
+    STDMETHOD_(HRESULT,AddFilterToCache)(THIS_ IBaseFilter* pFilter) PURE; \
+    STDMETHOD_(HRESULT,EnumCacheFilter)(THIS_ IEnumFilters** pEnum) PURE; \
+    STDMETHOD_(HRESULT,RemoveFilterFromCache)(THIS_ IBaseFilter* pFilter) PURE; \
+    STDMETHOD_(HRESULT,GetStartTime)(THIS_ REFERENCE_TIME* prtStart) PURE; \
+    STDMETHOD_(HRESULT,PushThroughData)(THIS_ IPin* pOutputPin, IPinConnection* pConnection, HANDLE hEventAbort) PURE; \
+    STDMETHOD_(HRESULT,SetFilterFlags)(THIS_ IBaseFilter* pFilter, DWORD dwFlags) PURE; \
+    STDMETHOD_(HRESULT,GetFilterFlags)(THIS_ IBaseFilter* pFilter, DWORD* pdwFlags) PURE; \
+    STDMETHOD_(HRESULT,RemoveFilterEx)(THIS_ IBaseFilter* pFilter, DWORD Flags) PURE;
+
+HRESULT CALLBACK IGraphConfig_Reconnect_Proxy(
+    IGraphConfig* This,
+    IPin* pOutputPin,
+    IPin* pInputPin,
+    const AM_MEDIA_TYPE* pmtFirstConnection,
+    IBaseFilter* pUsingFilter,
+    HANDLE hAbortEvent,
+    DWORD dwFlags);
+void __RPC_STUB IGraphConfig_Reconnect_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_Reconfigure_Proxy(
+    IGraphConfig* This,
+    IGraphConfigCallback* pCallback,
+    PVOID pvContext,
+    DWORD dwFlags,
+    HANDLE hAbortEvent);
+void __RPC_STUB IGraphConfig_Reconfigure_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_AddFilterToCache_Proxy(
+    IGraphConfig* This,
+    IBaseFilter* pFilter);
+void __RPC_STUB IGraphConfig_AddFilterToCache_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_EnumCacheFilter_Proxy(
+    IGraphConfig* This,
+    IEnumFilters** pEnum);
+void __RPC_STUB IGraphConfig_EnumCacheFilter_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_RemoveFilterFromCache_Proxy(
+    IGraphConfig* This,
+    IBaseFilter* pFilter);
+void __RPC_STUB IGraphConfig_RemoveFilterFromCache_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_GetStartTime_Proxy(
+    IGraphConfig* This,
+    REFERENCE_TIME* prtStart);
+void __RPC_STUB IGraphConfig_GetStartTime_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_PushThroughData_Proxy(
+    IGraphConfig* This,
+    IPin* pOutputPin,
+    IPinConnection* pConnection,
+    HANDLE hEventAbort);
+void __RPC_STUB IGraphConfig_PushThroughData_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_SetFilterFlags_Proxy(
+    IGraphConfig* This,
+    IBaseFilter* pFilter,
+    DWORD dwFlags);
+void __RPC_STUB IGraphConfig_SetFilterFlags_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_GetFilterFlags_Proxy(
+    IGraphConfig* This,
+    IBaseFilter* pFilter,
+    DWORD* pdwFlags);
+void __RPC_STUB IGraphConfig_GetFilterFlags_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IGraphConfig_RemoveFilterEx_Proxy(
+    IGraphConfig* This,
+    IBaseFilter* pFilter,
+    DWORD Flags);
+void __RPC_STUB IGraphConfig_RemoveFilterEx_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+/*****************************************************************************
+ * IGraphConfigCallback interface
+ */
+DEFINE_GUID(IID_IGraphConfigCallback, 0xade0fd60, 0xd19d, 0x11d2, 0xab,0xf6, 0x00,0xa0,0xc9,0x05,0xf3,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IGraphConfigCallback : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Reconfigure(
+        PVOID pvContext,
+        DWORD dwFlags) = 0;
+
+};
+#else
+typedef struct IGraphConfigCallbackVtbl IGraphConfigCallbackVtbl;
+struct IGraphConfigCallback {
+    const IGraphConfigCallbackVtbl* lpVtbl;
+};
+struct IGraphConfigCallbackVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IGraphConfigCallback* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IGraphConfigCallback* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IGraphConfigCallback* This);
+
+    /*** IGraphConfigCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *Reconfigure)(
+        IGraphConfigCallback* This,
+        PVOID pvContext,
+        DWORD dwFlags);
+
+};
+
+/*** IUnknown methods ***/
+#define IGraphConfigCallback_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IGraphConfigCallback_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IGraphConfigCallback_Release(p) (p)->lpVtbl->Release(p)
+/*** IGraphConfigCallback methods ***/
+#define IGraphConfigCallback_Reconfigure(p,a,b) (p)->lpVtbl->Reconfigure(p,a,b)
+
+#endif
+
+#define IGraphConfigCallback_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; \
+    /*** IGraphConfigCallback methods ***/ \
+    STDMETHOD_(HRESULT,Reconfigure)(THIS_ PVOID pvContext, DWORD dwFlags) PURE;
+
+HRESULT CALLBACK IGraphConfigCallback_Reconfigure_Proxy(
+    IGraphConfigCallback* This,
+    PVOID pvContext,
+    DWORD dwFlags);
+void __RPC_STUB IGraphConfigCallback_Reconfigure_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+typedef struct IFilterChain IFilterChain;
+/*****************************************************************************
+ * IFilterChain interface
+ */
+DEFINE_GUID(IID_IFilterChain, 0xdcfbdcf6, 0x0dc2, 0x45f5, 0x9a,0xb2, 0x7c,0x33,0x0e,0xa0,0x9c,0x29);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IFilterChain : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE StartChain(
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE PauseChain(
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StopChain(
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveChain(
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter) = 0;
+
+};
+#else
+typedef struct IFilterChainVtbl IFilterChainVtbl;
+struct IFilterChain {
+    const IFilterChainVtbl* lpVtbl;
+};
+struct IFilterChainVtbl {
+    ICOM_MSVTABLE_COMPAT_FIELDS
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFilterChain* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFilterChain* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFilterChain* This);
+
+    /*** IFilterChain methods ***/
+    HRESULT (STDMETHODCALLTYPE *StartChain)(
+        IFilterChain* This,
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter);
+
+    HRESULT (STDMETHODCALLTYPE *PauseChain)(
+        IFilterChain* This,
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter);
+
+    HRESULT (STDMETHODCALLTYPE *StopChain)(
+        IFilterChain* This,
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveChain)(
+        IFilterChain* This,
+        IBaseFilter* pStartFilter,
+        IBaseFilter* pEndFilter);
+
+};
+
+/*** IUnknown methods ***/
+#define IFilterChain_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IFilterChain_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IFilterChain_Release(p) (p)->lpVtbl->Release(p)
+/*** IFilterChain methods ***/
+#define IFilterChain_StartChain(p,a,b) (p)->lpVtbl->StartChain(p,a,b)
+#define IFilterChain_PauseChain(p,a,b) (p)->lpVtbl->PauseChain(p,a,b)
+#define IFilterChain_StopChain(p,a,b) (p)->lpVtbl->StopChain(p,a,b)
+#define IFilterChain_RemoveChain(p,a,b) (p)->lpVtbl->RemoveChain(p,a,b)
+
+#endif
+
+#define IFilterChain_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; \
+    /*** IFilterChain methods ***/ \
+    STDMETHOD_(HRESULT,StartChain)(THIS_ IBaseFilter* pStartFilter, IBaseFilter* pEndFilter) PURE; \
+    STDMETHOD_(HRESULT,PauseChain)(THIS_ IBaseFilter* pStartFilter, IBaseFilter* pEndFilter) PURE; \
+    STDMETHOD_(HRESULT,StopChain)(THIS_ IBaseFilter* pStartFilter, IBaseFilter* pEndFilter) PURE; \
+    STDMETHOD_(HRESULT,RemoveChain)(THIS_ IBaseFilter* pStartFilter, IBaseFilter* pEndFilter) PURE;
+
+HRESULT CALLBACK IFilterChain_StartChain_Proxy(
+    IFilterChain* This,
+    IBaseFilter* pStartFilter,
+    IBaseFilter* pEndFilter);
+void __RPC_STUB IFilterChain_StartChain_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterChain_PauseChain_Proxy(
+    IFilterChain* This,
+    IBaseFilter* pStartFilter,
+    IBaseFilter* pEndFilter);
+void __RPC_STUB IFilterChain_PauseChain_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterChain_StopChain_Proxy(
+    IFilterChain* This,
+    IBaseFilter* pStartFilter,
+    IBaseFilter* pEndFilter);
+void __RPC_STUB IFilterChain_StopChain_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IFilterChain_RemoveChain_Proxy(
+    IFilterChain* This,
+    IBaseFilter* pStartFilter,
+    IBaseFilter* pEndFilter);
+void __RPC_STUB IFilterChain_RemoveChain_Stub(
+    struct IRpcStubBuffer* This,
+    struct IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __WIDL_STRMIF_H */
diff --git a/include/strmif.idl b/include/strmif.idl
new file mode 100644
index 0000000..c2ef913
--- /dev/null
+++ b/include/strmif.idl
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2002 Robert Shearman
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+import "objidl.idl";
+
+#include "devenum.idl"
+
+#include "axcore.idl"
+
+#include "axextend.idl"
+
+#include "dyngraph.idl"