diff --git a/mingw-w64-headers/include/strmif.h b/mingw-w64-headers/include/strmif.h
index b652239..26e14ee 100644
--- a/mingw-w64-headers/include/strmif.h
+++ b/mingw-w64-headers/include/strmif.h
@@ -1,4 +1,4 @@
-/*** Autogenerated by WIDL 6.0-rc3 from include/strmif.idl - Do not edit ***/
+/*** Autogenerated by WIDL 6.0-rc3 from strmif.idl - Do not edit ***/
 
 #ifdef _WIN32
 #ifndef __REQUIRED_RPCNDR_H_VERSION__
@@ -466,6 +466,102 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef __IAMCameraControl_FWD_DEFINED__
+#define __IAMCameraControl_FWD_DEFINED__
+typedef interface IAMCameraControl IAMCameraControl;
+#ifdef __cplusplus
+interface IAMCameraControl;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMVideoControl_FWD_DEFINED__
+#define __IAMVideoControl_FWD_DEFINED__
+typedef interface IAMVideoControl IAMVideoControl;
+#ifdef __cplusplus
+interface IAMVideoControl;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMBufferNegotiation_FWD_DEFINED__
+#define __IAMBufferNegotiation_FWD_DEFINED__
+typedef interface IAMBufferNegotiation IAMBufferNegotiation;
+#ifdef __cplusplus
+interface IAMBufferNegotiation;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMDroppedFrames_FWD_DEFINED__
+#define __IAMDroppedFrames_FWD_DEFINED__
+typedef interface IAMDroppedFrames IAMDroppedFrames;
+#ifdef __cplusplus
+interface IAMDroppedFrames;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMLatency_FWD_DEFINED__
+#define __IAMLatency_FWD_DEFINED__
+typedef interface IAMLatency IAMLatency;
+#ifdef __cplusplus
+interface IAMLatency;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMPushSource_FWD_DEFINED__
+#define __IAMPushSource_FWD_DEFINED__
+typedef interface IAMPushSource IAMPushSource;
+#ifdef __cplusplus
+interface IAMPushSource;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMVideoCompression_FWD_DEFINED__
+#define __IAMVideoCompression_FWD_DEFINED__
+typedef interface IAMVideoCompression IAMVideoCompression;
+#ifdef __cplusplus
+interface IAMVideoCompression;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMCrossbar_FWD_DEFINED__
+#define __IAMCrossbar_FWD_DEFINED__
+typedef interface IAMCrossbar IAMCrossbar;
+#ifdef __cplusplus
+interface IAMCrossbar;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMTunerNotification_FWD_DEFINED__
+#define __IAMTunerNotification_FWD_DEFINED__
+typedef interface IAMTunerNotification IAMTunerNotification;
+#ifdef __cplusplus
+interface IAMTunerNotification;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMTuner_FWD_DEFINED__
+#define __IAMTuner_FWD_DEFINED__
+typedef interface IAMTuner IAMTuner;
+#ifdef __cplusplus
+interface IAMTuner;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IAMTVTuner_FWD_DEFINED__
+#define __IAMTVTuner_FWD_DEFINED__
+typedef interface IAMTVTuner IAMTVTuner;
+#ifdef __cplusplus
+interface IAMTVTuner;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __IVideoFrameStep_FWD_DEFINED__
+#define __IVideoFrameStep_FWD_DEFINED__
+typedef interface IVideoFrameStep IVideoFrameStep;
+#ifdef __cplusplus
+interface IVideoFrameStep;
+#endif /* __cplusplus */
+#endif
+
 #ifndef __IAMAsyncReaderTimestampScaling_FWD_DEFINED__
 #define __IAMAsyncReaderTimestampScaling_FWD_DEFINED__
 typedef interface IAMAsyncReaderTimestampScaling IAMAsyncReaderTimestampScaling;
@@ -4306,7 +4402,7 @@
         CLSID clsInMaj,
         CLSID clsInSub,
         WINBOOL bRender,
-        WINBOOL bOututNeeded,
+        WINBOOL bOutputNeeded,
         CLSID clsOutMaj,
         CLSID clsOutSub) = 0;
 
@@ -4382,7 +4478,7 @@
         CLSID clsInMaj,
         CLSID clsInSub,
         WINBOOL bRender,
-        WINBOOL bOututNeeded,
+        WINBOOL bOutputNeeded,
         CLSID clsOutMaj,
         CLSID clsOutSub);
 
@@ -4407,7 +4503,7 @@
 #define IFilterMapper_UnregisterFilter(This,Filter) (This)->lpVtbl->UnregisterFilter(This,Filter)
 #define IFilterMapper_UnregisterFilterInstance(This,MRId) (This)->lpVtbl->UnregisterFilterInstance(This,MRId)
 #define IFilterMapper_UnregisterPin(This,Filter,Name) (This)->lpVtbl->UnregisterPin(This,Filter,Name)
-#define IFilterMapper_EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOututNeeded,clsOutMaj,clsOutSub) (This)->lpVtbl->EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOututNeeded,clsOutMaj,clsOutSub)
+#define IFilterMapper_EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOutputNeeded,clsOutMaj,clsOutSub) (This)->lpVtbl->EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOutputNeeded,clsOutMaj,clsOutSub)
 #else
 /*** IUnknown methods ***/
 static FORCEINLINE HRESULT IFilterMapper_QueryInterface(IFilterMapper* This,REFIID riid,void **ppvObject) {
@@ -4441,8 +4537,8 @@
 static FORCEINLINE HRESULT IFilterMapper_UnregisterPin(IFilterMapper* This,CLSID Filter,LPCWSTR Name) {
     return This->lpVtbl->UnregisterPin(This,Filter,Name);
 }
-static FORCEINLINE HRESULT IFilterMapper_EnumMatchingFilters(IFilterMapper* This,IEnumRegFilters **ppEnum,DWORD dwMerit,WINBOOL bInputNeeded,CLSID clsInMaj,CLSID clsInSub,WINBOOL bRender,WINBOOL bOututNeeded,CLSID clsOutMaj,CLSID clsOutSub) {
-    return This->lpVtbl->EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOututNeeded,clsOutMaj,clsOutSub);
+static FORCEINLINE HRESULT IFilterMapper_EnumMatchingFilters(IFilterMapper* This,IEnumRegFilters **ppEnum,DWORD dwMerit,WINBOOL bInputNeeded,CLSID clsInMaj,CLSID clsInSub,WINBOOL bRender,WINBOOL bOutputNeeded,CLSID clsOutMaj,CLSID clsOutSub) {
+    return This->lpVtbl->EnumMatchingFilters(This,ppEnum,dwMerit,bInputNeeded,clsInMaj,clsInSub,bRender,bOutputNeeded,clsOutMaj,clsOutSub);
 }
 #endif
 #endif
@@ -8204,6 +8300,10 @@
 #define _IKsPropertySet_
 #define KSPROPERTY_SUPPORT_GET  1
 #define KSPROPERTY_SUPPORT_SET  2
+typedef enum AMPROPERTY_PIN {
+    AMPROPERTY_PIN_CATEGORY = 0,
+    AMPROPERTY_PIN_MEDIUM = 1
+} AMPROPERTY_PIN;
 /*****************************************************************************
  * IKsPropertySet interface
  */
@@ -8904,6 +9004,1788 @@
 
 #endif  /* __IAMVfwCaptureDialogs_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IAMCameraControl interface
+ */
+#ifndef __IAMCameraControl_INTERFACE_DEFINED__
+#define __IAMCameraControl_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMCameraControl, 0xc6e13370, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c6e13370-30ac-11d0-a18c-00a0c9118956")
+IAMCameraControl : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetRange(
+        LONG property,
+        LONG *min,
+        LONG *max,
+        LONG *stepping_delta,
+        LONG *default_value,
+        LONG *flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Set(
+        LONG property,
+        LONG property_value,
+        LONG flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Get(
+        LONG property,
+        LONG *property_value,
+        LONG *flags) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMCameraControl, 0xc6e13370, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56)
+#endif
+#else
+typedef struct IAMCameraControlVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMCameraControl *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMCameraControl *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMCameraControl *This);
+
+    /*** IAMCameraControl methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetRange)(
+        IAMCameraControl *This,
+        LONG property,
+        LONG *min,
+        LONG *max,
+        LONG *stepping_delta,
+        LONG *default_value,
+        LONG *flags);
+
+    HRESULT (STDMETHODCALLTYPE *Set)(
+        IAMCameraControl *This,
+        LONG property,
+        LONG property_value,
+        LONG flags);
+
+    HRESULT (STDMETHODCALLTYPE *Get)(
+        IAMCameraControl *This,
+        LONG property,
+        LONG *property_value,
+        LONG *flags);
+
+    END_INTERFACE
+} IAMCameraControlVtbl;
+
+interface IAMCameraControl {
+    CONST_VTBL IAMCameraControlVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMCameraControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMCameraControl_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMCameraControl_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMCameraControl methods ***/
+#define IAMCameraControl_GetRange(This,property,min,max,stepping_delta,default_value,flags) (This)->lpVtbl->GetRange(This,property,min,max,stepping_delta,default_value,flags)
+#define IAMCameraControl_Set(This,property,property_value,flags) (This)->lpVtbl->Set(This,property,property_value,flags)
+#define IAMCameraControl_Get(This,property,property_value,flags) (This)->lpVtbl->Get(This,property,property_value,flags)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMCameraControl_QueryInterface(IAMCameraControl* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMCameraControl_AddRef(IAMCameraControl* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMCameraControl_Release(IAMCameraControl* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMCameraControl methods ***/
+static FORCEINLINE HRESULT IAMCameraControl_GetRange(IAMCameraControl* This,LONG property,LONG *min,LONG *max,LONG *stepping_delta,LONG *default_value,LONG *flags) {
+    return This->lpVtbl->GetRange(This,property,min,max,stepping_delta,default_value,flags);
+}
+static FORCEINLINE HRESULT IAMCameraControl_Set(IAMCameraControl* This,LONG property,LONG property_value,LONG flags) {
+    return This->lpVtbl->Set(This,property,property_value,flags);
+}
+static FORCEINLINE HRESULT IAMCameraControl_Get(IAMCameraControl* This,LONG property,LONG *property_value,LONG *flags) {
+    return This->lpVtbl->Get(This,property,property_value,flags);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMCameraControl_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMVideoControl interface
+ */
+#ifndef __IAMVideoControl_INTERFACE_DEFINED__
+#define __IAMVideoControl_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMVideoControl, 0x6a2e0670, 0x28e4, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6a2e0670-28e4-11d0-a18c-00a0c9118956")
+IAMVideoControl : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetCaps(
+        IPin *pin,
+        LONG *flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetMode(
+        IPin *pin,
+        LONG mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMode(
+        IPin *pin,
+        LONG *mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentActualFrameRate(
+        IPin *pin,
+        LONGLONG *frame_rate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMaxAvailableFrameRate(
+        IPin *pin,
+        LONG index,
+        SIZE dimensions,
+        LONGLONG *frame_rate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFrameRateList(
+        IPin *pin,
+        LONG index,
+        SIZE dimensions,
+        LONG *list_size,
+        LONGLONG **frame_rate) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMVideoControl, 0x6a2e0670, 0x28e4, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56)
+#endif
+#else
+typedef struct IAMVideoControlVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMVideoControl *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMVideoControl *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMVideoControl *This);
+
+    /*** IAMVideoControl methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetCaps)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONG *flags);
+
+    HRESULT (STDMETHODCALLTYPE *SetMode)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONG mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetMode)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONG *mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentActualFrameRate)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONGLONG *frame_rate);
+
+    HRESULT (STDMETHODCALLTYPE *GetMaxAvailableFrameRate)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONG index,
+        SIZE dimensions,
+        LONGLONG *frame_rate);
+
+    HRESULT (STDMETHODCALLTYPE *GetFrameRateList)(
+        IAMVideoControl *This,
+        IPin *pin,
+        LONG index,
+        SIZE dimensions,
+        LONG *list_size,
+        LONGLONG **frame_rate);
+
+    END_INTERFACE
+} IAMVideoControlVtbl;
+
+interface IAMVideoControl {
+    CONST_VTBL IAMVideoControlVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMVideoControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMVideoControl_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMVideoControl_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMVideoControl methods ***/
+#define IAMVideoControl_GetCaps(This,pin,flags) (This)->lpVtbl->GetCaps(This,pin,flags)
+#define IAMVideoControl_SetMode(This,pin,mode) (This)->lpVtbl->SetMode(This,pin,mode)
+#define IAMVideoControl_GetMode(This,pin,mode) (This)->lpVtbl->GetMode(This,pin,mode)
+#define IAMVideoControl_GetCurrentActualFrameRate(This,pin,frame_rate) (This)->lpVtbl->GetCurrentActualFrameRate(This,pin,frame_rate)
+#define IAMVideoControl_GetMaxAvailableFrameRate(This,pin,index,dimensions,frame_rate) (This)->lpVtbl->GetMaxAvailableFrameRate(This,pin,index,dimensions,frame_rate)
+#define IAMVideoControl_GetFrameRateList(This,pin,index,dimensions,list_size,frame_rate) (This)->lpVtbl->GetFrameRateList(This,pin,index,dimensions,list_size,frame_rate)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMVideoControl_QueryInterface(IAMVideoControl* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMVideoControl_AddRef(IAMVideoControl* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMVideoControl_Release(IAMVideoControl* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMVideoControl methods ***/
+static FORCEINLINE HRESULT IAMVideoControl_GetCaps(IAMVideoControl* This,IPin *pin,LONG *flags) {
+    return This->lpVtbl->GetCaps(This,pin,flags);
+}
+static FORCEINLINE HRESULT IAMVideoControl_SetMode(IAMVideoControl* This,IPin *pin,LONG mode) {
+    return This->lpVtbl->SetMode(This,pin,mode);
+}
+static FORCEINLINE HRESULT IAMVideoControl_GetMode(IAMVideoControl* This,IPin *pin,LONG *mode) {
+    return This->lpVtbl->GetMode(This,pin,mode);
+}
+static FORCEINLINE HRESULT IAMVideoControl_GetCurrentActualFrameRate(IAMVideoControl* This,IPin *pin,LONGLONG *frame_rate) {
+    return This->lpVtbl->GetCurrentActualFrameRate(This,pin,frame_rate);
+}
+static FORCEINLINE HRESULT IAMVideoControl_GetMaxAvailableFrameRate(IAMVideoControl* This,IPin *pin,LONG index,SIZE dimensions,LONGLONG *frame_rate) {
+    return This->lpVtbl->GetMaxAvailableFrameRate(This,pin,index,dimensions,frame_rate);
+}
+static FORCEINLINE HRESULT IAMVideoControl_GetFrameRateList(IAMVideoControl* This,IPin *pin,LONG index,SIZE dimensions,LONG *list_size,LONGLONG **frame_rate) {
+    return This->lpVtbl->GetFrameRateList(This,pin,index,dimensions,list_size,frame_rate);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMVideoControl_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMBufferNegotiation interface
+ */
+#ifndef __IAMBufferNegotiation_INTERFACE_DEFINED__
+#define __IAMBufferNegotiation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMBufferNegotiation, 0x56ed71a0, 0xaf5f, 0x11d0, 0xb3,0xf0, 0x00,0xaa,0x00,0x37,0x61,0xc5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("56ed71a0-af5f-11d0-b3f0-00aa003761c5")
+IAMBufferNegotiation : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SuggestAllocatorProperties(
+        const ALLOCATOR_PROPERTIES *prop) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAllocatorProperties(
+        ALLOCATOR_PROPERTIES *prop) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMBufferNegotiation, 0x56ed71a0, 0xaf5f, 0x11d0, 0xb3,0xf0, 0x00,0xaa,0x00,0x37,0x61,0xc5)
+#endif
+#else
+typedef struct IAMBufferNegotiationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMBufferNegotiation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMBufferNegotiation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMBufferNegotiation *This);
+
+    /*** IAMBufferNegotiation methods ***/
+    HRESULT (STDMETHODCALLTYPE *SuggestAllocatorProperties)(
+        IAMBufferNegotiation *This,
+        const ALLOCATOR_PROPERTIES *prop);
+
+    HRESULT (STDMETHODCALLTYPE *GetAllocatorProperties)(
+        IAMBufferNegotiation *This,
+        ALLOCATOR_PROPERTIES *prop);
+
+    END_INTERFACE
+} IAMBufferNegotiationVtbl;
+
+interface IAMBufferNegotiation {
+    CONST_VTBL IAMBufferNegotiationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMBufferNegotiation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMBufferNegotiation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMBufferNegotiation_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMBufferNegotiation methods ***/
+#define IAMBufferNegotiation_SuggestAllocatorProperties(This,prop) (This)->lpVtbl->SuggestAllocatorProperties(This,prop)
+#define IAMBufferNegotiation_GetAllocatorProperties(This,prop) (This)->lpVtbl->GetAllocatorProperties(This,prop)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMBufferNegotiation_QueryInterface(IAMBufferNegotiation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMBufferNegotiation_AddRef(IAMBufferNegotiation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMBufferNegotiation_Release(IAMBufferNegotiation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMBufferNegotiation methods ***/
+static FORCEINLINE HRESULT IAMBufferNegotiation_SuggestAllocatorProperties(IAMBufferNegotiation* This,const ALLOCATOR_PROPERTIES *prop) {
+    return This->lpVtbl->SuggestAllocatorProperties(This,prop);
+}
+static FORCEINLINE HRESULT IAMBufferNegotiation_GetAllocatorProperties(IAMBufferNegotiation* This,ALLOCATOR_PROPERTIES *prop) {
+    return This->lpVtbl->GetAllocatorProperties(This,prop);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMBufferNegotiation_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMDroppedFrames interface
+ */
+#ifndef __IAMDroppedFrames_INTERFACE_DEFINED__
+#define __IAMDroppedFrames_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMDroppedFrames, 0xc6e13344, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c6e13344-30ac-11d0-a18c-00a0c9118956")
+IAMDroppedFrames : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetNumDropped(
+        LONG *number) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetNumNotDropped(
+        LONG *number) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDroppedInfo(
+        LONG size,
+        LONG *array,
+        LONG *copied) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAverageFrameSize(
+        LONG *size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMDroppedFrames, 0xc6e13344, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56)
+#endif
+#else
+typedef struct IAMDroppedFramesVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMDroppedFrames *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMDroppedFrames *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMDroppedFrames *This);
+
+    /*** IAMDroppedFrames methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetNumDropped)(
+        IAMDroppedFrames *This,
+        LONG *number);
+
+    HRESULT (STDMETHODCALLTYPE *GetNumNotDropped)(
+        IAMDroppedFrames *This,
+        LONG *number);
+
+    HRESULT (STDMETHODCALLTYPE *GetDroppedInfo)(
+        IAMDroppedFrames *This,
+        LONG size,
+        LONG *array,
+        LONG *copied);
+
+    HRESULT (STDMETHODCALLTYPE *GetAverageFrameSize)(
+        IAMDroppedFrames *This,
+        LONG *size);
+
+    END_INTERFACE
+} IAMDroppedFramesVtbl;
+
+interface IAMDroppedFrames {
+    CONST_VTBL IAMDroppedFramesVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMDroppedFrames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMDroppedFrames_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMDroppedFrames_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMDroppedFrames methods ***/
+#define IAMDroppedFrames_GetNumDropped(This,number) (This)->lpVtbl->GetNumDropped(This,number)
+#define IAMDroppedFrames_GetNumNotDropped(This,number) (This)->lpVtbl->GetNumNotDropped(This,number)
+#define IAMDroppedFrames_GetDroppedInfo(This,size,array,copied) (This)->lpVtbl->GetDroppedInfo(This,size,array,copied)
+#define IAMDroppedFrames_GetAverageFrameSize(This,size) (This)->lpVtbl->GetAverageFrameSize(This,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMDroppedFrames_QueryInterface(IAMDroppedFrames* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMDroppedFrames_AddRef(IAMDroppedFrames* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMDroppedFrames_Release(IAMDroppedFrames* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMDroppedFrames methods ***/
+static FORCEINLINE HRESULT IAMDroppedFrames_GetNumDropped(IAMDroppedFrames* This,LONG *number) {
+    return This->lpVtbl->GetNumDropped(This,number);
+}
+static FORCEINLINE HRESULT IAMDroppedFrames_GetNumNotDropped(IAMDroppedFrames* This,LONG *number) {
+    return This->lpVtbl->GetNumNotDropped(This,number);
+}
+static FORCEINLINE HRESULT IAMDroppedFrames_GetDroppedInfo(IAMDroppedFrames* This,LONG size,LONG *array,LONG *copied) {
+    return This->lpVtbl->GetDroppedInfo(This,size,array,copied);
+}
+static FORCEINLINE HRESULT IAMDroppedFrames_GetAverageFrameSize(IAMDroppedFrames* This,LONG *size) {
+    return This->lpVtbl->GetAverageFrameSize(This,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMDroppedFrames_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMLatency interface
+ */
+#ifndef __IAMLatency_INTERFACE_DEFINED__
+#define __IAMLatency_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMLatency, 0x62ea93ba, 0xec62, 0x11d2, 0xb7,0x70, 0x00,0xc0,0x4f,0xb6,0xbd,0x3d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("62ea93ba-ec62-11d2-b770-00c04fb6bd3d")
+IAMLatency : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetLatency(
+        REFERENCE_TIME *latency) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMLatency, 0x62ea93ba, 0xec62, 0x11d2, 0xb7,0x70, 0x00,0xc0,0x4f,0xb6,0xbd,0x3d)
+#endif
+#else
+typedef struct IAMLatencyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMLatency *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMLatency *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMLatency *This);
+
+    /*** IAMLatency methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLatency)(
+        IAMLatency *This,
+        REFERENCE_TIME *latency);
+
+    END_INTERFACE
+} IAMLatencyVtbl;
+
+interface IAMLatency {
+    CONST_VTBL IAMLatencyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMLatency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMLatency_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMLatency_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMLatency methods ***/
+#define IAMLatency_GetLatency(This,latency) (This)->lpVtbl->GetLatency(This,latency)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMLatency_QueryInterface(IAMLatency* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMLatency_AddRef(IAMLatency* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMLatency_Release(IAMLatency* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMLatency methods ***/
+static FORCEINLINE HRESULT IAMLatency_GetLatency(IAMLatency* This,REFERENCE_TIME *latency) {
+    return This->lpVtbl->GetLatency(This,latency);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMLatency_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMPushSource interface
+ */
+#ifndef __IAMPushSource_INTERFACE_DEFINED__
+#define __IAMPushSource_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMPushSource, 0xf185fe76, 0xe64e, 0x11d2, 0xb7,0x6e, 0x00,0xc0,0x4f,0xb6,0xbd,0x3d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f185fe76-e64e-11d2-b76e-00c04fb6bd3d")
+IAMPushSource : public IAMLatency
+{
+    virtual HRESULT STDMETHODCALLTYPE GetPushSourceFlags(
+        ULONG *flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetPushSourceFlags(
+        ULONG flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetStreamOffset(
+        REFERENCE_TIME offset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStreamOffset(
+        REFERENCE_TIME *offset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMaxStreamOffset(
+        REFERENCE_TIME *offset) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetMaxStreamOffset(
+        REFERENCE_TIME offset) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMPushSource, 0xf185fe76, 0xe64e, 0x11d2, 0xb7,0x6e, 0x00,0xc0,0x4f,0xb6,0xbd,0x3d)
+#endif
+#else
+typedef struct IAMPushSourceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMPushSource *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMPushSource *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMPushSource *This);
+
+    /*** IAMLatency methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLatency)(
+        IAMPushSource *This,
+        REFERENCE_TIME *latency);
+
+    /*** IAMPushSource methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPushSourceFlags)(
+        IAMPushSource *This,
+        ULONG *flags);
+
+    HRESULT (STDMETHODCALLTYPE *SetPushSourceFlags)(
+        IAMPushSource *This,
+        ULONG flags);
+
+    HRESULT (STDMETHODCALLTYPE *SetStreamOffset)(
+        IAMPushSource *This,
+        REFERENCE_TIME offset);
+
+    HRESULT (STDMETHODCALLTYPE *GetStreamOffset)(
+        IAMPushSource *This,
+        REFERENCE_TIME *offset);
+
+    HRESULT (STDMETHODCALLTYPE *GetMaxStreamOffset)(
+        IAMPushSource *This,
+        REFERENCE_TIME *offset);
+
+    HRESULT (STDMETHODCALLTYPE *SetMaxStreamOffset)(
+        IAMPushSource *This,
+        REFERENCE_TIME offset);
+
+    END_INTERFACE
+} IAMPushSourceVtbl;
+
+interface IAMPushSource {
+    CONST_VTBL IAMPushSourceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMPushSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMPushSource_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMPushSource_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMLatency methods ***/
+#define IAMPushSource_GetLatency(This,latency) (This)->lpVtbl->GetLatency(This,latency)
+/*** IAMPushSource methods ***/
+#define IAMPushSource_GetPushSourceFlags(This,flags) (This)->lpVtbl->GetPushSourceFlags(This,flags)
+#define IAMPushSource_SetPushSourceFlags(This,flags) (This)->lpVtbl->SetPushSourceFlags(This,flags)
+#define IAMPushSource_SetStreamOffset(This,offset) (This)->lpVtbl->SetStreamOffset(This,offset)
+#define IAMPushSource_GetStreamOffset(This,offset) (This)->lpVtbl->GetStreamOffset(This,offset)
+#define IAMPushSource_GetMaxStreamOffset(This,offset) (This)->lpVtbl->GetMaxStreamOffset(This,offset)
+#define IAMPushSource_SetMaxStreamOffset(This,offset) (This)->lpVtbl->SetMaxStreamOffset(This,offset)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMPushSource_QueryInterface(IAMPushSource* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMPushSource_AddRef(IAMPushSource* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMPushSource_Release(IAMPushSource* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMLatency methods ***/
+static FORCEINLINE HRESULT IAMPushSource_GetLatency(IAMPushSource* This,REFERENCE_TIME *latency) {
+    return This->lpVtbl->GetLatency(This,latency);
+}
+/*** IAMPushSource methods ***/
+static FORCEINLINE HRESULT IAMPushSource_GetPushSourceFlags(IAMPushSource* This,ULONG *flags) {
+    return This->lpVtbl->GetPushSourceFlags(This,flags);
+}
+static FORCEINLINE HRESULT IAMPushSource_SetPushSourceFlags(IAMPushSource* This,ULONG flags) {
+    return This->lpVtbl->SetPushSourceFlags(This,flags);
+}
+static FORCEINLINE HRESULT IAMPushSource_SetStreamOffset(IAMPushSource* This,REFERENCE_TIME offset) {
+    return This->lpVtbl->SetStreamOffset(This,offset);
+}
+static FORCEINLINE HRESULT IAMPushSource_GetStreamOffset(IAMPushSource* This,REFERENCE_TIME *offset) {
+    return This->lpVtbl->GetStreamOffset(This,offset);
+}
+static FORCEINLINE HRESULT IAMPushSource_GetMaxStreamOffset(IAMPushSource* This,REFERENCE_TIME *offset) {
+    return This->lpVtbl->GetMaxStreamOffset(This,offset);
+}
+static FORCEINLINE HRESULT IAMPushSource_SetMaxStreamOffset(IAMPushSource* This,REFERENCE_TIME offset) {
+    return This->lpVtbl->SetMaxStreamOffset(This,offset);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMPushSource_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMVideoCompression interface
+ */
+#ifndef __IAMVideoCompression_INTERFACE_DEFINED__
+#define __IAMVideoCompression_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMVideoCompression, 0xc6e13343, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c6e13343-30ac-11d0-a18c-00a0c9118956")
+IAMVideoCompression : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE put_KeyFrameRate(
+        LONG frame_rate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_KeyFrameRate(
+        LONG *frame_rate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_PFramesPerKeyFrame(
+        LONG frame) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_PFramesPerKeyFrame(
+        LONG *frame) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Quality(
+        double quality) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Quality(
+        double *quality) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_WindowSize(
+        DWORDLONG size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_WindowSize(
+        DWORDLONG *size) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetInfo(
+        LPWSTR version,
+        int *version_size,
+        LPWSTR description,
+        int *description_size,
+        LONG *frame_rate,
+        LONG *key,
+        double *quality,
+        LONG *capabilities) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OverrideKeyFrame(
+        LONG number) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OverrideFrameSize(
+        LONG number,
+        LONG size) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMVideoCompression, 0xc6e13343, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56)
+#endif
+#else
+typedef struct IAMVideoCompressionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMVideoCompression *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMVideoCompression *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMVideoCompression *This);
+
+    /*** IAMVideoCompression methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_KeyFrameRate)(
+        IAMVideoCompression *This,
+        LONG frame_rate);
+
+    HRESULT (STDMETHODCALLTYPE *get_KeyFrameRate)(
+        IAMVideoCompression *This,
+        LONG *frame_rate);
+
+    HRESULT (STDMETHODCALLTYPE *put_PFramesPerKeyFrame)(
+        IAMVideoCompression *This,
+        LONG frame);
+
+    HRESULT (STDMETHODCALLTYPE *get_PFramesPerKeyFrame)(
+        IAMVideoCompression *This,
+        LONG *frame);
+
+    HRESULT (STDMETHODCALLTYPE *put_Quality)(
+        IAMVideoCompression *This,
+        double quality);
+
+    HRESULT (STDMETHODCALLTYPE *get_Quality)(
+        IAMVideoCompression *This,
+        double *quality);
+
+    HRESULT (STDMETHODCALLTYPE *put_WindowSize)(
+        IAMVideoCompression *This,
+        DWORDLONG size);
+
+    HRESULT (STDMETHODCALLTYPE *get_WindowSize)(
+        IAMVideoCompression *This,
+        DWORDLONG *size);
+
+    HRESULT (STDMETHODCALLTYPE *GetInfo)(
+        IAMVideoCompression *This,
+        LPWSTR version,
+        int *version_size,
+        LPWSTR description,
+        int *description_size,
+        LONG *frame_rate,
+        LONG *key,
+        double *quality,
+        LONG *capabilities);
+
+    HRESULT (STDMETHODCALLTYPE *OverrideKeyFrame)(
+        IAMVideoCompression *This,
+        LONG number);
+
+    HRESULT (STDMETHODCALLTYPE *OverrideFrameSize)(
+        IAMVideoCompression *This,
+        LONG number,
+        LONG size);
+
+    END_INTERFACE
+} IAMVideoCompressionVtbl;
+
+interface IAMVideoCompression {
+    CONST_VTBL IAMVideoCompressionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMVideoCompression_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMVideoCompression_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMVideoCompression_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMVideoCompression methods ***/
+#define IAMVideoCompression_put_KeyFrameRate(This,frame_rate) (This)->lpVtbl->put_KeyFrameRate(This,frame_rate)
+#define IAMVideoCompression_get_KeyFrameRate(This,frame_rate) (This)->lpVtbl->get_KeyFrameRate(This,frame_rate)
+#define IAMVideoCompression_put_PFramesPerKeyFrame(This,frame) (This)->lpVtbl->put_PFramesPerKeyFrame(This,frame)
+#define IAMVideoCompression_get_PFramesPerKeyFrame(This,frame) (This)->lpVtbl->get_PFramesPerKeyFrame(This,frame)
+#define IAMVideoCompression_put_Quality(This,quality) (This)->lpVtbl->put_Quality(This,quality)
+#define IAMVideoCompression_get_Quality(This,quality) (This)->lpVtbl->get_Quality(This,quality)
+#define IAMVideoCompression_put_WindowSize(This,size) (This)->lpVtbl->put_WindowSize(This,size)
+#define IAMVideoCompression_get_WindowSize(This,size) (This)->lpVtbl->get_WindowSize(This,size)
+#define IAMVideoCompression_GetInfo(This,version,version_size,description,description_size,frame_rate,key,quality,capabilities) (This)->lpVtbl->GetInfo(This,version,version_size,description,description_size,frame_rate,key,quality,capabilities)
+#define IAMVideoCompression_OverrideKeyFrame(This,number) (This)->lpVtbl->OverrideKeyFrame(This,number)
+#define IAMVideoCompression_OverrideFrameSize(This,number,size) (This)->lpVtbl->OverrideFrameSize(This,number,size)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMVideoCompression_QueryInterface(IAMVideoCompression* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMVideoCompression_AddRef(IAMVideoCompression* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMVideoCompression_Release(IAMVideoCompression* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMVideoCompression methods ***/
+static FORCEINLINE HRESULT IAMVideoCompression_put_KeyFrameRate(IAMVideoCompression* This,LONG frame_rate) {
+    return This->lpVtbl->put_KeyFrameRate(This,frame_rate);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_get_KeyFrameRate(IAMVideoCompression* This,LONG *frame_rate) {
+    return This->lpVtbl->get_KeyFrameRate(This,frame_rate);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_put_PFramesPerKeyFrame(IAMVideoCompression* This,LONG frame) {
+    return This->lpVtbl->put_PFramesPerKeyFrame(This,frame);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_get_PFramesPerKeyFrame(IAMVideoCompression* This,LONG *frame) {
+    return This->lpVtbl->get_PFramesPerKeyFrame(This,frame);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_put_Quality(IAMVideoCompression* This,double quality) {
+    return This->lpVtbl->put_Quality(This,quality);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_get_Quality(IAMVideoCompression* This,double *quality) {
+    return This->lpVtbl->get_Quality(This,quality);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_put_WindowSize(IAMVideoCompression* This,DWORDLONG size) {
+    return This->lpVtbl->put_WindowSize(This,size);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_get_WindowSize(IAMVideoCompression* This,DWORDLONG *size) {
+    return This->lpVtbl->get_WindowSize(This,size);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_GetInfo(IAMVideoCompression* This,LPWSTR version,int *version_size,LPWSTR description,int *description_size,LONG *frame_rate,LONG *key,double *quality,LONG *capabilities) {
+    return This->lpVtbl->GetInfo(This,version,version_size,description,description_size,frame_rate,key,quality,capabilities);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_OverrideKeyFrame(IAMVideoCompression* This,LONG number) {
+    return This->lpVtbl->OverrideKeyFrame(This,number);
+}
+static FORCEINLINE HRESULT IAMVideoCompression_OverrideFrameSize(IAMVideoCompression* This,LONG number,LONG size) {
+    return This->lpVtbl->OverrideFrameSize(This,number,size);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMVideoCompression_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMCrossbar interface
+ */
+#ifndef __IAMCrossbar_INTERFACE_DEFINED__
+#define __IAMCrossbar_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMCrossbar, 0xc6e13380, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c6e13380-30ac-11d0-a18c-00a0c9118956")
+IAMCrossbar : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE get_PinCounts(
+        LONG *output,
+        LONG *intput) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CanRoute(
+        LONG output,
+        LONG input) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Route(
+        LONG output,
+        LONG input) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_IsRoutedTo(
+        LONG output,
+        LONG *input) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_CrossbarPinInfo(
+        WINBOOL is_input,
+        LONG index,
+        LONG *related,
+        LONG *type) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMCrossbar, 0xc6e13380, 0x30ac, 0x11d0, 0xa1,0x8c, 0x00,0xa0,0xc9,0x11,0x89,0x56)
+#endif
+#else
+typedef struct IAMCrossbarVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMCrossbar *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMCrossbar *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMCrossbar *This);
+
+    /*** IAMCrossbar methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_PinCounts)(
+        IAMCrossbar *This,
+        LONG *output,
+        LONG *intput);
+
+    HRESULT (STDMETHODCALLTYPE *CanRoute)(
+        IAMCrossbar *This,
+        LONG output,
+        LONG input);
+
+    HRESULT (STDMETHODCALLTYPE *Route)(
+        IAMCrossbar *This,
+        LONG output,
+        LONG input);
+
+    HRESULT (STDMETHODCALLTYPE *get_IsRoutedTo)(
+        IAMCrossbar *This,
+        LONG output,
+        LONG *input);
+
+    HRESULT (STDMETHODCALLTYPE *get_CrossbarPinInfo)(
+        IAMCrossbar *This,
+        WINBOOL is_input,
+        LONG index,
+        LONG *related,
+        LONG *type);
+
+    END_INTERFACE
+} IAMCrossbarVtbl;
+
+interface IAMCrossbar {
+    CONST_VTBL IAMCrossbarVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMCrossbar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMCrossbar_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMCrossbar_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMCrossbar methods ***/
+#define IAMCrossbar_get_PinCounts(This,output,intput) (This)->lpVtbl->get_PinCounts(This,output,intput)
+#define IAMCrossbar_CanRoute(This,output,input) (This)->lpVtbl->CanRoute(This,output,input)
+#define IAMCrossbar_Route(This,output,input) (This)->lpVtbl->Route(This,output,input)
+#define IAMCrossbar_get_IsRoutedTo(This,output,input) (This)->lpVtbl->get_IsRoutedTo(This,output,input)
+#define IAMCrossbar_get_CrossbarPinInfo(This,is_input,index,related,type) (This)->lpVtbl->get_CrossbarPinInfo(This,is_input,index,related,type)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMCrossbar_QueryInterface(IAMCrossbar* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMCrossbar_AddRef(IAMCrossbar* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMCrossbar_Release(IAMCrossbar* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMCrossbar methods ***/
+static FORCEINLINE HRESULT IAMCrossbar_get_PinCounts(IAMCrossbar* This,LONG *output,LONG *intput) {
+    return This->lpVtbl->get_PinCounts(This,output,intput);
+}
+static FORCEINLINE HRESULT IAMCrossbar_CanRoute(IAMCrossbar* This,LONG output,LONG input) {
+    return This->lpVtbl->CanRoute(This,output,input);
+}
+static FORCEINLINE HRESULT IAMCrossbar_Route(IAMCrossbar* This,LONG output,LONG input) {
+    return This->lpVtbl->Route(This,output,input);
+}
+static FORCEINLINE HRESULT IAMCrossbar_get_IsRoutedTo(IAMCrossbar* This,LONG output,LONG *input) {
+    return This->lpVtbl->get_IsRoutedTo(This,output,input);
+}
+static FORCEINLINE HRESULT IAMCrossbar_get_CrossbarPinInfo(IAMCrossbar* This,WINBOOL is_input,LONG index,LONG *related,LONG *type) {
+    return This->lpVtbl->get_CrossbarPinInfo(This,is_input,index,related,type);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMCrossbar_INTERFACE_DEFINED__ */
+
+typedef enum tagAMTunerEventType {
+    AMTUNER_EVENT_CHANGED = 0x1
+} AMTunerEventType;
+/*****************************************************************************
+ * IAMTunerNotification interface
+ */
+#ifndef __IAMTunerNotification_INTERFACE_DEFINED__
+#define __IAMTunerNotification_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMTunerNotification, 0x211a8760, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("211a8760-03ac-11d1-8d13-00aa00bd8339")
+IAMTunerNotification : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnEvent(
+        AMTunerEventType event) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMTunerNotification, 0x211a8760, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39)
+#endif
+#else
+typedef struct IAMTunerNotificationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMTunerNotification *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMTunerNotification *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMTunerNotification *This);
+
+    /*** IAMTunerNotification methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnEvent)(
+        IAMTunerNotification *This,
+        AMTunerEventType event);
+
+    END_INTERFACE
+} IAMTunerNotificationVtbl;
+
+interface IAMTunerNotification {
+    CONST_VTBL IAMTunerNotificationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMTunerNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMTunerNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMTunerNotification_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMTunerNotification methods ***/
+#define IAMTunerNotification_OnEvent(This,event) (This)->lpVtbl->OnEvent(This,event)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMTunerNotification_QueryInterface(IAMTunerNotification* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMTunerNotification_AddRef(IAMTunerNotification* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMTunerNotification_Release(IAMTunerNotification* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMTunerNotification methods ***/
+static FORCEINLINE HRESULT IAMTunerNotification_OnEvent(IAMTunerNotification* This,AMTunerEventType event) {
+    return This->lpVtbl->OnEvent(This,event);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMTunerNotification_INTERFACE_DEFINED__ */
+
+typedef enum tagAMTunerModeType {
+    AMTUNER_MODE_DEFAULT = 0x0,
+    AMTUNER_MODE_TV = 0x1,
+    AMTUNER_MODE_FM_RADIO = 0x2,
+    AMTUNER_MODE_AM_RADIO = 0x4,
+    AMTUNER_MODE_DSS = 0x8
+} AMTunerModeType;
+/*****************************************************************************
+ * IAMTuner interface
+ */
+#ifndef __IAMTuner_INTERFACE_DEFINED__
+#define __IAMTuner_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMTuner, 0x211a8761, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("211a8761-03ac-11d1-8d13-00aa00bd8339")
+IAMTuner : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE put_Channel(
+        LONG channel,
+        LONG video,
+        LONG audio) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Channel(
+        LONG *channel,
+        LONG *video,
+        LONG *audio) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ChannelMinMax(
+        LONG *min,
+        LONG *max) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_CountryCode(
+        LONG country) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_CountryCode(
+        LONG *country) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_TuningSpace(
+        LONG tuning_space) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_TuningSpace(
+        LONG *tuning_space) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Logon(
+        HANDLE user) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Logout(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SignalPresent(
+        LONG *signal_strength) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Mode(
+        AMTunerModeType mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Mode(
+        AMTunerModeType *mode) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAvailableModes(
+        LONG *modes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RegisterNotificationCallBack(
+        IAMTunerNotification *notify,
+        LONG events) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE UnRegisterNotificationCallBack(
+        IAMTunerNotification *notify) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMTuner, 0x211a8761, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39)
+#endif
+#else
+typedef struct IAMTunerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMTuner *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMTuner *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMTuner *This);
+
+    /*** IAMTuner methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Channel)(
+        IAMTuner *This,
+        LONG channel,
+        LONG video,
+        LONG audio);
+
+    HRESULT (STDMETHODCALLTYPE *get_Channel)(
+        IAMTuner *This,
+        LONG *channel,
+        LONG *video,
+        LONG *audio);
+
+    HRESULT (STDMETHODCALLTYPE *ChannelMinMax)(
+        IAMTuner *This,
+        LONG *min,
+        LONG *max);
+
+    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
+        IAMTuner *This,
+        LONG country);
+
+    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
+        IAMTuner *This,
+        LONG *country);
+
+    HRESULT (STDMETHODCALLTYPE *put_TuningSpace)(
+        IAMTuner *This,
+        LONG tuning_space);
+
+    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
+        IAMTuner *This,
+        LONG *tuning_space);
+
+    HRESULT (STDMETHODCALLTYPE *Logon)(
+        IAMTuner *This,
+        HANDLE user);
+
+    HRESULT (STDMETHODCALLTYPE *Logout)(
+        IAMTuner *This);
+
+    HRESULT (STDMETHODCALLTYPE *SignalPresent)(
+        IAMTuner *This,
+        LONG *signal_strength);
+
+    HRESULT (STDMETHODCALLTYPE *put_Mode)(
+        IAMTuner *This,
+        AMTunerModeType mode);
+
+    HRESULT (STDMETHODCALLTYPE *get_Mode)(
+        IAMTuner *This,
+        AMTunerModeType *mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetAvailableModes)(
+        IAMTuner *This,
+        LONG *modes);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterNotificationCallBack)(
+        IAMTuner *This,
+        IAMTunerNotification *notify,
+        LONG events);
+
+    HRESULT (STDMETHODCALLTYPE *UnRegisterNotificationCallBack)(
+        IAMTuner *This,
+        IAMTunerNotification *notify);
+
+    END_INTERFACE
+} IAMTunerVtbl;
+
+interface IAMTuner {
+    CONST_VTBL IAMTunerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMTuner_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMTuner methods ***/
+#define IAMTuner_put_Channel(This,channel,video,audio) (This)->lpVtbl->put_Channel(This,channel,video,audio)
+#define IAMTuner_get_Channel(This,channel,video,audio) (This)->lpVtbl->get_Channel(This,channel,video,audio)
+#define IAMTuner_ChannelMinMax(This,min,max) (This)->lpVtbl->ChannelMinMax(This,min,max)
+#define IAMTuner_put_CountryCode(This,country) (This)->lpVtbl->put_CountryCode(This,country)
+#define IAMTuner_get_CountryCode(This,country) (This)->lpVtbl->get_CountryCode(This,country)
+#define IAMTuner_put_TuningSpace(This,tuning_space) (This)->lpVtbl->put_TuningSpace(This,tuning_space)
+#define IAMTuner_get_TuningSpace(This,tuning_space) (This)->lpVtbl->get_TuningSpace(This,tuning_space)
+#define IAMTuner_Logon(This,user) (This)->lpVtbl->Logon(This,user)
+#define IAMTuner_Logout(This) (This)->lpVtbl->Logout(This)
+#define IAMTuner_SignalPresent(This,signal_strength) (This)->lpVtbl->SignalPresent(This,signal_strength)
+#define IAMTuner_put_Mode(This,mode) (This)->lpVtbl->put_Mode(This,mode)
+#define IAMTuner_get_Mode(This,mode) (This)->lpVtbl->get_Mode(This,mode)
+#define IAMTuner_GetAvailableModes(This,modes) (This)->lpVtbl->GetAvailableModes(This,modes)
+#define IAMTuner_RegisterNotificationCallBack(This,notify,events) (This)->lpVtbl->RegisterNotificationCallBack(This,notify,events)
+#define IAMTuner_UnRegisterNotificationCallBack(This,notify) (This)->lpVtbl->UnRegisterNotificationCallBack(This,notify)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMTuner_QueryInterface(IAMTuner* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMTuner_AddRef(IAMTuner* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMTuner_Release(IAMTuner* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMTuner methods ***/
+static FORCEINLINE HRESULT IAMTuner_put_Channel(IAMTuner* This,LONG channel,LONG video,LONG audio) {
+    return This->lpVtbl->put_Channel(This,channel,video,audio);
+}
+static FORCEINLINE HRESULT IAMTuner_get_Channel(IAMTuner* This,LONG *channel,LONG *video,LONG *audio) {
+    return This->lpVtbl->get_Channel(This,channel,video,audio);
+}
+static FORCEINLINE HRESULT IAMTuner_ChannelMinMax(IAMTuner* This,LONG *min,LONG *max) {
+    return This->lpVtbl->ChannelMinMax(This,min,max);
+}
+static FORCEINLINE HRESULT IAMTuner_put_CountryCode(IAMTuner* This,LONG country) {
+    return This->lpVtbl->put_CountryCode(This,country);
+}
+static FORCEINLINE HRESULT IAMTuner_get_CountryCode(IAMTuner* This,LONG *country) {
+    return This->lpVtbl->get_CountryCode(This,country);
+}
+static FORCEINLINE HRESULT IAMTuner_put_TuningSpace(IAMTuner* This,LONG tuning_space) {
+    return This->lpVtbl->put_TuningSpace(This,tuning_space);
+}
+static FORCEINLINE HRESULT IAMTuner_get_TuningSpace(IAMTuner* This,LONG *tuning_space) {
+    return This->lpVtbl->get_TuningSpace(This,tuning_space);
+}
+static FORCEINLINE HRESULT IAMTuner_Logon(IAMTuner* This,HANDLE user) {
+    return This->lpVtbl->Logon(This,user);
+}
+static FORCEINLINE HRESULT IAMTuner_Logout(IAMTuner* This) {
+    return This->lpVtbl->Logout(This);
+}
+static FORCEINLINE HRESULT IAMTuner_SignalPresent(IAMTuner* This,LONG *signal_strength) {
+    return This->lpVtbl->SignalPresent(This,signal_strength);
+}
+static FORCEINLINE HRESULT IAMTuner_put_Mode(IAMTuner* This,AMTunerModeType mode) {
+    return This->lpVtbl->put_Mode(This,mode);
+}
+static FORCEINLINE HRESULT IAMTuner_get_Mode(IAMTuner* This,AMTunerModeType *mode) {
+    return This->lpVtbl->get_Mode(This,mode);
+}
+static FORCEINLINE HRESULT IAMTuner_GetAvailableModes(IAMTuner* This,LONG *modes) {
+    return This->lpVtbl->GetAvailableModes(This,modes);
+}
+static FORCEINLINE HRESULT IAMTuner_RegisterNotificationCallBack(IAMTuner* This,IAMTunerNotification *notify,LONG events) {
+    return This->lpVtbl->RegisterNotificationCallBack(This,notify,events);
+}
+static FORCEINLINE HRESULT IAMTuner_UnRegisterNotificationCallBack(IAMTuner* This,IAMTunerNotification *notify) {
+    return This->lpVtbl->UnRegisterNotificationCallBack(This,notify);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMTuner_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAMTVTuner interface
+ */
+#ifndef __IAMTVTuner_INTERFACE_DEFINED__
+#define __IAMTVTuner_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IAMTVTuner, 0x211a8766, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("211a8766-03ac-11d1-8d13-00aa00bd8339")
+IAMTVTuner : public IAMTuner
+{
+    virtual HRESULT STDMETHODCALLTYPE get_AvailableTVFormats(
+        LONG *standard) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_TVFormat(
+        LONG *standard) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AutoTune(
+        LONG channel,
+        LONG *signal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StoreAutoTune(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_NumInputConnections(
+        LONG *number) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_InputType(
+        LONG index,
+        TunerInputType type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_InputType(
+        LONG index,
+        TunerInputType *type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ConnectInput(
+        LONG index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ConnectInput(
+        LONG *index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_VideoFrequency(
+        LONG *freq) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_AudioFrequency(
+        LONG *freq) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IAMTVTuner, 0x211a8766, 0x03ac, 0x11d1, 0x8d,0x13, 0x00,0xaa,0x00,0xbd,0x83,0x39)
+#endif
+#else
+typedef struct IAMTVTunerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IAMTVTuner *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IAMTVTuner *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IAMTVTuner *This);
+
+    /*** IAMTuner methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Channel)(
+        IAMTVTuner *This,
+        LONG channel,
+        LONG video,
+        LONG audio);
+
+    HRESULT (STDMETHODCALLTYPE *get_Channel)(
+        IAMTVTuner *This,
+        LONG *channel,
+        LONG *video,
+        LONG *audio);
+
+    HRESULT (STDMETHODCALLTYPE *ChannelMinMax)(
+        IAMTVTuner *This,
+        LONG *min,
+        LONG *max);
+
+    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
+        IAMTVTuner *This,
+        LONG country);
+
+    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
+        IAMTVTuner *This,
+        LONG *country);
+
+    HRESULT (STDMETHODCALLTYPE *put_TuningSpace)(
+        IAMTVTuner *This,
+        LONG tuning_space);
+
+    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
+        IAMTVTuner *This,
+        LONG *tuning_space);
+
+    HRESULT (STDMETHODCALLTYPE *Logon)(
+        IAMTVTuner *This,
+        HANDLE user);
+
+    HRESULT (STDMETHODCALLTYPE *Logout)(
+        IAMTVTuner *This);
+
+    HRESULT (STDMETHODCALLTYPE *SignalPresent)(
+        IAMTVTuner *This,
+        LONG *signal_strength);
+
+    HRESULT (STDMETHODCALLTYPE *put_Mode)(
+        IAMTVTuner *This,
+        AMTunerModeType mode);
+
+    HRESULT (STDMETHODCALLTYPE *get_Mode)(
+        IAMTVTuner *This,
+        AMTunerModeType *mode);
+
+    HRESULT (STDMETHODCALLTYPE *GetAvailableModes)(
+        IAMTVTuner *This,
+        LONG *modes);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterNotificationCallBack)(
+        IAMTVTuner *This,
+        IAMTunerNotification *notify,
+        LONG events);
+
+    HRESULT (STDMETHODCALLTYPE *UnRegisterNotificationCallBack)(
+        IAMTVTuner *This,
+        IAMTunerNotification *notify);
+
+    /*** IAMTVTuner methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_AvailableTVFormats)(
+        IAMTVTuner *This,
+        LONG *standard);
+
+    HRESULT (STDMETHODCALLTYPE *get_TVFormat)(
+        IAMTVTuner *This,
+        LONG *standard);
+
+    HRESULT (STDMETHODCALLTYPE *AutoTune)(
+        IAMTVTuner *This,
+        LONG channel,
+        LONG *signal);
+
+    HRESULT (STDMETHODCALLTYPE *StoreAutoTune)(
+        IAMTVTuner *This);
+
+    HRESULT (STDMETHODCALLTYPE *get_NumInputConnections)(
+        IAMTVTuner *This,
+        LONG *number);
+
+    HRESULT (STDMETHODCALLTYPE *put_InputType)(
+        IAMTVTuner *This,
+        LONG index,
+        TunerInputType type);
+
+    HRESULT (STDMETHODCALLTYPE *get_InputType)(
+        IAMTVTuner *This,
+        LONG index,
+        TunerInputType *type);
+
+    HRESULT (STDMETHODCALLTYPE *put_ConnectInput)(
+        IAMTVTuner *This,
+        LONG index);
+
+    HRESULT (STDMETHODCALLTYPE *get_ConnectInput)(
+        IAMTVTuner *This,
+        LONG *index);
+
+    HRESULT (STDMETHODCALLTYPE *get_VideoFrequency)(
+        IAMTVTuner *This,
+        LONG *freq);
+
+    HRESULT (STDMETHODCALLTYPE *get_AudioFrequency)(
+        IAMTVTuner *This,
+        LONG *freq);
+
+    END_INTERFACE
+} IAMTVTunerVtbl;
+
+interface IAMTVTuner {
+    CONST_VTBL IAMTVTunerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IAMTVTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IAMTVTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IAMTVTuner_Release(This) (This)->lpVtbl->Release(This)
+/*** IAMTuner methods ***/
+#define IAMTVTuner_put_Channel(This,channel,video,audio) (This)->lpVtbl->put_Channel(This,channel,video,audio)
+#define IAMTVTuner_get_Channel(This,channel,video,audio) (This)->lpVtbl->get_Channel(This,channel,video,audio)
+#define IAMTVTuner_ChannelMinMax(This,min,max) (This)->lpVtbl->ChannelMinMax(This,min,max)
+#define IAMTVTuner_put_CountryCode(This,country) (This)->lpVtbl->put_CountryCode(This,country)
+#define IAMTVTuner_get_CountryCode(This,country) (This)->lpVtbl->get_CountryCode(This,country)
+#define IAMTVTuner_put_TuningSpace(This,tuning_space) (This)->lpVtbl->put_TuningSpace(This,tuning_space)
+#define IAMTVTuner_get_TuningSpace(This,tuning_space) (This)->lpVtbl->get_TuningSpace(This,tuning_space)
+#define IAMTVTuner_Logon(This,user) (This)->lpVtbl->Logon(This,user)
+#define IAMTVTuner_Logout(This) (This)->lpVtbl->Logout(This)
+#define IAMTVTuner_SignalPresent(This,signal_strength) (This)->lpVtbl->SignalPresent(This,signal_strength)
+#define IAMTVTuner_put_Mode(This,mode) (This)->lpVtbl->put_Mode(This,mode)
+#define IAMTVTuner_get_Mode(This,mode) (This)->lpVtbl->get_Mode(This,mode)
+#define IAMTVTuner_GetAvailableModes(This,modes) (This)->lpVtbl->GetAvailableModes(This,modes)
+#define IAMTVTuner_RegisterNotificationCallBack(This,notify,events) (This)->lpVtbl->RegisterNotificationCallBack(This,notify,events)
+#define IAMTVTuner_UnRegisterNotificationCallBack(This,notify) (This)->lpVtbl->UnRegisterNotificationCallBack(This,notify)
+/*** IAMTVTuner methods ***/
+#define IAMTVTuner_get_AvailableTVFormats(This,standard) (This)->lpVtbl->get_AvailableTVFormats(This,standard)
+#define IAMTVTuner_get_TVFormat(This,standard) (This)->lpVtbl->get_TVFormat(This,standard)
+#define IAMTVTuner_AutoTune(This,channel,signal) (This)->lpVtbl->AutoTune(This,channel,signal)
+#define IAMTVTuner_StoreAutoTune(This) (This)->lpVtbl->StoreAutoTune(This)
+#define IAMTVTuner_get_NumInputConnections(This,number) (This)->lpVtbl->get_NumInputConnections(This,number)
+#define IAMTVTuner_put_InputType(This,index,type) (This)->lpVtbl->put_InputType(This,index,type)
+#define IAMTVTuner_get_InputType(This,index,type) (This)->lpVtbl->get_InputType(This,index,type)
+#define IAMTVTuner_put_ConnectInput(This,index) (This)->lpVtbl->put_ConnectInput(This,index)
+#define IAMTVTuner_get_ConnectInput(This,index) (This)->lpVtbl->get_ConnectInput(This,index)
+#define IAMTVTuner_get_VideoFrequency(This,freq) (This)->lpVtbl->get_VideoFrequency(This,freq)
+#define IAMTVTuner_get_AudioFrequency(This,freq) (This)->lpVtbl->get_AudioFrequency(This,freq)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IAMTVTuner_QueryInterface(IAMTVTuner* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IAMTVTuner_AddRef(IAMTVTuner* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IAMTVTuner_Release(IAMTVTuner* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAMTuner methods ***/
+static FORCEINLINE HRESULT IAMTVTuner_put_Channel(IAMTVTuner* This,LONG channel,LONG video,LONG audio) {
+    return This->lpVtbl->put_Channel(This,channel,video,audio);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_Channel(IAMTVTuner* This,LONG *channel,LONG *video,LONG *audio) {
+    return This->lpVtbl->get_Channel(This,channel,video,audio);
+}
+static FORCEINLINE HRESULT IAMTVTuner_ChannelMinMax(IAMTVTuner* This,LONG *min,LONG *max) {
+    return This->lpVtbl->ChannelMinMax(This,min,max);
+}
+static FORCEINLINE HRESULT IAMTVTuner_put_CountryCode(IAMTVTuner* This,LONG country) {
+    return This->lpVtbl->put_CountryCode(This,country);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_CountryCode(IAMTVTuner* This,LONG *country) {
+    return This->lpVtbl->get_CountryCode(This,country);
+}
+static FORCEINLINE HRESULT IAMTVTuner_put_TuningSpace(IAMTVTuner* This,LONG tuning_space) {
+    return This->lpVtbl->put_TuningSpace(This,tuning_space);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_TuningSpace(IAMTVTuner* This,LONG *tuning_space) {
+    return This->lpVtbl->get_TuningSpace(This,tuning_space);
+}
+static FORCEINLINE HRESULT IAMTVTuner_Logon(IAMTVTuner* This,HANDLE user) {
+    return This->lpVtbl->Logon(This,user);
+}
+static FORCEINLINE HRESULT IAMTVTuner_Logout(IAMTVTuner* This) {
+    return This->lpVtbl->Logout(This);
+}
+static FORCEINLINE HRESULT IAMTVTuner_SignalPresent(IAMTVTuner* This,LONG *signal_strength) {
+    return This->lpVtbl->SignalPresent(This,signal_strength);
+}
+static FORCEINLINE HRESULT IAMTVTuner_put_Mode(IAMTVTuner* This,AMTunerModeType mode) {
+    return This->lpVtbl->put_Mode(This,mode);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_Mode(IAMTVTuner* This,AMTunerModeType *mode) {
+    return This->lpVtbl->get_Mode(This,mode);
+}
+static FORCEINLINE HRESULT IAMTVTuner_GetAvailableModes(IAMTVTuner* This,LONG *modes) {
+    return This->lpVtbl->GetAvailableModes(This,modes);
+}
+static FORCEINLINE HRESULT IAMTVTuner_RegisterNotificationCallBack(IAMTVTuner* This,IAMTunerNotification *notify,LONG events) {
+    return This->lpVtbl->RegisterNotificationCallBack(This,notify,events);
+}
+static FORCEINLINE HRESULT IAMTVTuner_UnRegisterNotificationCallBack(IAMTVTuner* This,IAMTunerNotification *notify) {
+    return This->lpVtbl->UnRegisterNotificationCallBack(This,notify);
+}
+/*** IAMTVTuner methods ***/
+static FORCEINLINE HRESULT IAMTVTuner_get_AvailableTVFormats(IAMTVTuner* This,LONG *standard) {
+    return This->lpVtbl->get_AvailableTVFormats(This,standard);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_TVFormat(IAMTVTuner* This,LONG *standard) {
+    return This->lpVtbl->get_TVFormat(This,standard);
+}
+static FORCEINLINE HRESULT IAMTVTuner_AutoTune(IAMTVTuner* This,LONG channel,LONG *signal) {
+    return This->lpVtbl->AutoTune(This,channel,signal);
+}
+static FORCEINLINE HRESULT IAMTVTuner_StoreAutoTune(IAMTVTuner* This) {
+    return This->lpVtbl->StoreAutoTune(This);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_NumInputConnections(IAMTVTuner* This,LONG *number) {
+    return This->lpVtbl->get_NumInputConnections(This,number);
+}
+static FORCEINLINE HRESULT IAMTVTuner_put_InputType(IAMTVTuner* This,LONG index,TunerInputType type) {
+    return This->lpVtbl->put_InputType(This,index,type);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_InputType(IAMTVTuner* This,LONG index,TunerInputType *type) {
+    return This->lpVtbl->get_InputType(This,index,type);
+}
+static FORCEINLINE HRESULT IAMTVTuner_put_ConnectInput(IAMTVTuner* This,LONG index) {
+    return This->lpVtbl->put_ConnectInput(This,index);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_ConnectInput(IAMTVTuner* This,LONG *index) {
+    return This->lpVtbl->get_ConnectInput(This,index);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_VideoFrequency(IAMTVTuner* This,LONG *freq) {
+    return This->lpVtbl->get_VideoFrequency(This,freq);
+}
+static FORCEINLINE HRESULT IAMTVTuner_get_AudioFrequency(IAMTVTuner* This,LONG *freq) {
+    return This->lpVtbl->get_AudioFrequency(This,freq);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IAMTVTuner_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IVideoFrameStep interface
+ */
+#ifndef __IVideoFrameStep_INTERFACE_DEFINED__
+#define __IVideoFrameStep_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IVideoFrameStep, 0xe46a9787, 0x2b71, 0x444d, 0xa4,0xb5, 0x1f,0xab,0x7b,0x70,0x8d,0x6a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("e46a9787-2b71-444d-a4b5-1fab7b708d6a")
+IVideoFrameStep : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Step(
+        DWORD frame_count,
+        IUnknown *filter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CanStep(
+        LONG multiple,
+        IUnknown *filter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CancelStep(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IVideoFrameStep, 0xe46a9787, 0x2b71, 0x444d, 0xa4,0xb5, 0x1f,0xab,0x7b,0x70,0x8d,0x6a)
+#endif
+#else
+typedef struct IVideoFrameStepVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IVideoFrameStep *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IVideoFrameStep *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IVideoFrameStep *This);
+
+    /*** IVideoFrameStep methods ***/
+    HRESULT (STDMETHODCALLTYPE *Step)(
+        IVideoFrameStep *This,
+        DWORD frame_count,
+        IUnknown *filter);
+
+    HRESULT (STDMETHODCALLTYPE *CanStep)(
+        IVideoFrameStep *This,
+        LONG multiple,
+        IUnknown *filter);
+
+    HRESULT (STDMETHODCALLTYPE *CancelStep)(
+        IVideoFrameStep *This);
+
+    END_INTERFACE
+} IVideoFrameStepVtbl;
+
+interface IVideoFrameStep {
+    CONST_VTBL IVideoFrameStepVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IVideoFrameStep_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IVideoFrameStep_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IVideoFrameStep_Release(This) (This)->lpVtbl->Release(This)
+/*** IVideoFrameStep methods ***/
+#define IVideoFrameStep_Step(This,frame_count,filter) (This)->lpVtbl->Step(This,frame_count,filter)
+#define IVideoFrameStep_CanStep(This,multiple,filter) (This)->lpVtbl->CanStep(This,multiple,filter)
+#define IVideoFrameStep_CancelStep(This) (This)->lpVtbl->CancelStep(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IVideoFrameStep_QueryInterface(IVideoFrameStep* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IVideoFrameStep_AddRef(IVideoFrameStep* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IVideoFrameStep_Release(IVideoFrameStep* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IVideoFrameStep methods ***/
+static FORCEINLINE HRESULT IVideoFrameStep_Step(IVideoFrameStep* This,DWORD frame_count,IUnknown *filter) {
+    return This->lpVtbl->Step(This,frame_count,filter);
+}
+static FORCEINLINE HRESULT IVideoFrameStep_CanStep(IVideoFrameStep* This,LONG multiple,IUnknown *filter) {
+    return This->lpVtbl->CanStep(This,multiple,filter);
+}
+static FORCEINLINE HRESULT IVideoFrameStep_CancelStep(IVideoFrameStep* This) {
+    return This->lpVtbl->CancelStep(This);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IVideoFrameStep_INTERFACE_DEFINED__ */
+
 #if (_WIN32_WINNT >= 0x0601)
 /*****************************************************************************
  * IAMAsyncReaderTimestampScaling interface
@@ -9158,66 +11040,21 @@
 typedef struct IDistributorNotify IDistributorNotify;
 #endif
 
-#ifndef __IAMVideoCompression_FWD_DEFINED__
-#define __IAMVideoCompression_FWD_DEFINED__
-typedef struct IAMVideoCompression IAMVideoCompression;
-#endif
-
 #ifndef __IAMVfwCompressDialogs_FWD_DEFINED__
 #define __IAMVfwCompressDialogs_FWD_DEFINED__
 typedef struct IAMVfwCompressDialogs IAMVfwCompressDialogs;
 #endif
 
-#ifndef __IAMDroppedFrames_FWD_DEFINED__
-#define __IAMDroppedFrames_FWD_DEFINED__
-typedef struct IAMDroppedFrames IAMDroppedFrames;
-#endif
-
 #ifndef __IAMAudioInputMixer_FWD_DEFINED__
 #define __IAMAudioInputMixer_FWD_DEFINED__
 typedef struct IAMAudioInputMixer IAMAudioInputMixer;
 #endif
 
-#ifndef __IAMBufferNegotiation_FWD_DEFINED__
-#define __IAMBufferNegotiation_FWD_DEFINED__
-typedef struct IAMBufferNegotiation IAMBufferNegotiation;
-#endif
-
 #ifndef __IAMAnalogVideoDecoder_FWD_DEFINED__
 #define __IAMAnalogVideoDecoder_FWD_DEFINED__
 typedef struct IAMAnalogVideoDecoder IAMAnalogVideoDecoder;
 #endif
 
-#ifndef __IAMCameraControl_FWD_DEFINED__
-#define __IAMCameraControl_FWD_DEFINED__
-typedef struct IAMCameraControl IAMCameraControl;
-#endif
-
-#ifndef __IAMVideoControl_FWD_DEFINED__
-#define __IAMVideoControl_FWD_DEFINED__
-typedef struct IAMVideoControl IAMVideoControl;
-#endif
-
-#ifndef __IAMCrossbar_FWD_DEFINED__
-#define __IAMCrossbar_FWD_DEFINED__
-typedef struct IAMCrossbar IAMCrossbar;
-#endif
-
-#ifndef __IAMTuner_FWD_DEFINED__
-#define __IAMTuner_FWD_DEFINED__
-typedef struct IAMTuner IAMTuner;
-#endif
-
-#ifndef __IAMTunerNotification_FWD_DEFINED__
-#define __IAMTunerNotification_FWD_DEFINED__
-typedef struct IAMTunerNotification IAMTunerNotification;
-#endif
-
-#ifndef __IAMTVTuner_FWD_DEFINED__
-#define __IAMTVTuner_FWD_DEFINED__
-typedef struct IAMTVTuner IAMTVTuner;
-#endif
-
 #ifndef __IBPCSatelliteTuner_FWD_DEFINED__
 #define __IBPCSatelliteTuner_FWD_DEFINED__
 typedef struct IBPCSatelliteTuner IBPCSatelliteTuner;
@@ -9308,21 +11145,6 @@
 typedef struct IAMVideoDecimationProperties IAMVideoDecimationProperties;
 #endif
 
-#ifndef __IVideoFrameStep_FWD_DEFINED__
-#define __IVideoFrameStep_FWD_DEFINED__
-typedef struct IVideoFrameStep IVideoFrameStep;
-#endif
-
-#ifndef __IAMLatency_FWD_DEFINED__
-#define __IAMLatency_FWD_DEFINED__
-typedef struct IAMLatency IAMLatency;
-#endif
-
-#ifndef __IAMPushSource_FWD_DEFINED__
-#define __IAMPushSource_FWD_DEFINED__
-typedef struct IAMPushSource IAMPushSource;
-#endif
-
 #ifndef __IAMDeviceRemoval_FWD_DEFINED__
 #define __IAMDeviceRemoval_FWD_DEFINED__
 typedef struct IAMDeviceRemoval IAMDeviceRemoval;
@@ -9670,86 +11492,6 @@
 
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0167_v0_0_c_ifspec;
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0167_v0_0_s_ifspec;
-#ifndef __IAMVideoCompression_INTERFACE_DEFINED__
-#define __IAMVideoCompression_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMVideoCompression;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMVideoCompression : public IUnknown {
-  public:
-    virtual HRESULT WINAPI put_KeyFrameRate(LONG KeyFrameRate) = 0;
-    virtual HRESULT WINAPI get_KeyFrameRate(LONG *pKeyFrameRate) = 0;
-    virtual HRESULT WINAPI put_PFramesPerKeyFrame(LONG PFramesPerKeyFrame) = 0;
-    virtual HRESULT WINAPI get_PFramesPerKeyFrame(LONG *pPFramesPerKeyFrame) = 0;
-    virtual HRESULT WINAPI put_Quality(double Quality) = 0;
-    virtual HRESULT WINAPI get_Quality(double *pQuality) = 0;
-    virtual HRESULT WINAPI put_WindowSize(DWORDLONG WindowSize) = 0;
-    virtual HRESULT WINAPI get_WindowSize(DWORDLONG *pWindowSize) = 0;
-    virtual HRESULT WINAPI GetInfo(WCHAR *pszVersion,int *pcbVersion,LPWSTR pszDescription,int *pcbDescription,LONG *pDefaultKeyFrameRate,LONG *pDefaultPFramesPerKey,double *pDefaultQuality,LONG *pCapabilities) = 0;
-    virtual HRESULT WINAPI OverrideKeyFrame(LONG FrameNumber) = 0;
-    virtual HRESULT WINAPI OverrideFrameSize(LONG FrameNumber,LONG Size) = 0;
-  };
-#else
-  typedef struct IAMVideoCompressionVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMVideoCompression *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMVideoCompression *This);
-      ULONG (WINAPI *Release)(IAMVideoCompression *This);
-      HRESULT (WINAPI *put_KeyFrameRate)(IAMVideoCompression *This,LONG KeyFrameRate);
-      HRESULT (WINAPI *get_KeyFrameRate)(IAMVideoCompression *This,LONG *pKeyFrameRate);
-      HRESULT (WINAPI *put_PFramesPerKeyFrame)(IAMVideoCompression *This,LONG PFramesPerKeyFrame);
-      HRESULT (WINAPI *get_PFramesPerKeyFrame)(IAMVideoCompression *This,LONG *pPFramesPerKeyFrame);
-      HRESULT (WINAPI *put_Quality)(IAMVideoCompression *This,double Quality);
-      HRESULT (WINAPI *get_Quality)(IAMVideoCompression *This,double *pQuality);
-      HRESULT (WINAPI *put_WindowSize)(IAMVideoCompression *This,DWORDLONG WindowSize);
-      HRESULT (WINAPI *get_WindowSize)(IAMVideoCompression *This,DWORDLONG *pWindowSize);
-      HRESULT (WINAPI *GetInfo)(IAMVideoCompression *This,WCHAR *pszVersion,int *pcbVersion,LPWSTR pszDescription,int *pcbDescription,LONG *pDefaultKeyFrameRate,LONG *pDefaultPFramesPerKey,double *pDefaultQuality,LONG *pCapabilities);
-      HRESULT (WINAPI *OverrideKeyFrame)(IAMVideoCompression *This,LONG FrameNumber);
-      HRESULT (WINAPI *OverrideFrameSize)(IAMVideoCompression *This,LONG FrameNumber,LONG Size);
-    END_INTERFACE
-  } IAMVideoCompressionVtbl;
-  struct IAMVideoCompression {
-    CONST_VTBL struct IAMVideoCompressionVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMVideoCompression_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMVideoCompression_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMVideoCompression_Release(This) (This)->lpVtbl->Release(This)
-#define IAMVideoCompression_put_KeyFrameRate(This,KeyFrameRate) (This)->lpVtbl->put_KeyFrameRate(This,KeyFrameRate)
-#define IAMVideoCompression_get_KeyFrameRate(This,pKeyFrameRate) (This)->lpVtbl->get_KeyFrameRate(This,pKeyFrameRate)
-#define IAMVideoCompression_put_PFramesPerKeyFrame(This,PFramesPerKeyFrame) (This)->lpVtbl->put_PFramesPerKeyFrame(This,PFramesPerKeyFrame)
-#define IAMVideoCompression_get_PFramesPerKeyFrame(This,pPFramesPerKeyFrame) (This)->lpVtbl->get_PFramesPerKeyFrame(This,pPFramesPerKeyFrame)
-#define IAMVideoCompression_put_Quality(This,Quality) (This)->lpVtbl->put_Quality(This,Quality)
-#define IAMVideoCompression_get_Quality(This,pQuality) (This)->lpVtbl->get_Quality(This,pQuality)
-#define IAMVideoCompression_put_WindowSize(This,WindowSize) (This)->lpVtbl->put_WindowSize(This,WindowSize)
-#define IAMVideoCompression_get_WindowSize(This,pWindowSize) (This)->lpVtbl->get_WindowSize(This,pWindowSize)
-#define IAMVideoCompression_GetInfo(This,pszVersion,pcbVersion,pszDescription,pcbDescription,pDefaultKeyFrameRate,pDefaultPFramesPerKey,pDefaultQuality,pCapabilities) (This)->lpVtbl->GetInfo(This,pszVersion,pcbVersion,pszDescription,pcbDescription,pDefaultKeyFrameRate,pDefaultPFramesPerKey,pDefaultQuality,pCapabilities)
-#define IAMVideoCompression_OverrideKeyFrame(This,FrameNumber) (This)->lpVtbl->OverrideKeyFrame(This,FrameNumber)
-#define IAMVideoCompression_OverrideFrameSize(This,FrameNumber,Size) (This)->lpVtbl->OverrideFrameSize(This,FrameNumber,Size)
-#endif
-#endif
-  HRESULT WINAPI IAMVideoCompression_put_KeyFrameRate_Proxy(IAMVideoCompression *This,LONG KeyFrameRate);
-  void __RPC_STUB IAMVideoCompression_put_KeyFrameRate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_get_KeyFrameRate_Proxy(IAMVideoCompression *This,LONG *pKeyFrameRate);
-  void __RPC_STUB IAMVideoCompression_get_KeyFrameRate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_put_PFramesPerKeyFrame_Proxy(IAMVideoCompression *This,LONG PFramesPerKeyFrame);
-  void __RPC_STUB IAMVideoCompression_put_PFramesPerKeyFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_get_PFramesPerKeyFrame_Proxy(IAMVideoCompression *This,LONG *pPFramesPerKeyFrame);
-  void __RPC_STUB IAMVideoCompression_get_PFramesPerKeyFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_put_Quality_Proxy(IAMVideoCompression *This,double Quality);
-  void __RPC_STUB IAMVideoCompression_put_Quality_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_get_Quality_Proxy(IAMVideoCompression *This,double *pQuality);
-  void __RPC_STUB IAMVideoCompression_get_Quality_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_put_WindowSize_Proxy(IAMVideoCompression *This,DWORDLONG WindowSize);
-  void __RPC_STUB IAMVideoCompression_put_WindowSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_get_WindowSize_Proxy(IAMVideoCompression *This,DWORDLONG *pWindowSize);
-  void __RPC_STUB IAMVideoCompression_get_WindowSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_GetInfo_Proxy(IAMVideoCompression *This,WCHAR *pszVersion,int *pcbVersion,LPWSTR pszDescription,int *pcbDescription,LONG *pDefaultKeyFrameRate,LONG *pDefaultPFramesPerKey,double *pDefaultQuality,LONG *pCapabilities);
-  void __RPC_STUB IAMVideoCompression_GetInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_OverrideKeyFrame_Proxy(IAMVideoCompression *This,LONG FrameNumber);
-  void __RPC_STUB IAMVideoCompression_OverrideKeyFrame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoCompression_OverrideFrameSize_Proxy(IAMVideoCompression *This,LONG FrameNumber,LONG Size);
-  void __RPC_STUB IAMVideoCompression_OverrideFrameSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
 
   typedef enum __MIDL___MIDL_itf_strmif_0168_0001 {
     VfwCaptureDialog_Source = 0x1,VfwCaptureDialog_Format = 0x2,VfwCaptureDialog_Display = 0x4
@@ -9805,52 +11547,6 @@
   void __RPC_STUB IAMVfwCompressDialogs_SendDriverMessage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
 #endif
 
-#ifndef __IAMDroppedFrames_INTERFACE_DEFINED__
-#define __IAMDroppedFrames_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMDroppedFrames;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMDroppedFrames : public IUnknown {
-  public:
-    virtual HRESULT WINAPI GetNumDropped(LONG *plDropped) = 0;
-    virtual HRESULT WINAPI GetNumNotDropped(LONG *plNotDropped) = 0;
-    virtual HRESULT WINAPI GetDroppedInfo(LONG lSize,LONG *plArray,LONG *plNumCopied) = 0;
-    virtual HRESULT WINAPI GetAverageFrameSize(LONG *plAverageSize) = 0;
-  };
-#else
-  typedef struct IAMDroppedFramesVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMDroppedFrames *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMDroppedFrames *This);
-      ULONG (WINAPI *Release)(IAMDroppedFrames *This);
-      HRESULT (WINAPI *GetNumDropped)(IAMDroppedFrames *This,LONG *plDropped);
-      HRESULT (WINAPI *GetNumNotDropped)(IAMDroppedFrames *This,LONG *plNotDropped);
-      HRESULT (WINAPI *GetDroppedInfo)(IAMDroppedFrames *This,LONG lSize,LONG *plArray,LONG *plNumCopied);
-      HRESULT (WINAPI *GetAverageFrameSize)(IAMDroppedFrames *This,LONG *plAverageSize);
-    END_INTERFACE
-  } IAMDroppedFramesVtbl;
-  struct IAMDroppedFrames {
-    CONST_VTBL struct IAMDroppedFramesVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMDroppedFrames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMDroppedFrames_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMDroppedFrames_Release(This) (This)->lpVtbl->Release(This)
-#define IAMDroppedFrames_GetNumDropped(This,plDropped) (This)->lpVtbl->GetNumDropped(This,plDropped)
-#define IAMDroppedFrames_GetNumNotDropped(This,plNotDropped) (This)->lpVtbl->GetNumNotDropped(This,plNotDropped)
-#define IAMDroppedFrames_GetDroppedInfo(This,lSize,plArray,plNumCopied) (This)->lpVtbl->GetDroppedInfo(This,lSize,plArray,plNumCopied)
-#define IAMDroppedFrames_GetAverageFrameSize(This,plAverageSize) (This)->lpVtbl->GetAverageFrameSize(This,plAverageSize)
-#endif
-#endif
-  HRESULT WINAPI IAMDroppedFrames_GetNumDropped_Proxy(IAMDroppedFrames *This,LONG *plDropped);
-  void __RPC_STUB IAMDroppedFrames_GetNumDropped_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMDroppedFrames_GetNumNotDropped_Proxy(IAMDroppedFrames *This,LONG *plNotDropped);
-  void __RPC_STUB IAMDroppedFrames_GetNumNotDropped_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMDroppedFrames_GetDroppedInfo_Proxy(IAMDroppedFrames *This,LONG lSize,LONG *plArray,LONG *plNumCopied);
-  void __RPC_STUB IAMDroppedFrames_GetDroppedInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMDroppedFrames_GetAverageFrameSize_Proxy(IAMDroppedFrames *This,LONG *plAverageSize);
-  void __RPC_STUB IAMDroppedFrames_GetAverageFrameSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
 #define AMF_AUTOMATICGAIN -1.0
 
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0171_v0_0_c_ifspec;
@@ -9961,42 +11657,6 @@
   void __RPC_STUB IAMAudioInputMixer_get_BassRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
 #endif
 
-#ifndef __IAMBufferNegotiation_INTERFACE_DEFINED__
-#define __IAMBufferNegotiation_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMBufferNegotiation;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMBufferNegotiation : public IUnknown {
-  public:
-    virtual HRESULT WINAPI SuggestAllocatorProperties(const ALLOCATOR_PROPERTIES *pprop) = 0;
-    virtual HRESULT WINAPI GetAllocatorProperties(ALLOCATOR_PROPERTIES *pprop) = 0;
-  };
-#else
-  typedef struct IAMBufferNegotiationVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMBufferNegotiation *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMBufferNegotiation *This);
-      ULONG (WINAPI *Release)(IAMBufferNegotiation *This);
-      HRESULT (WINAPI *SuggestAllocatorProperties)(IAMBufferNegotiation *This,const ALLOCATOR_PROPERTIES *pprop);
-      HRESULT (WINAPI *GetAllocatorProperties)(IAMBufferNegotiation *This,ALLOCATOR_PROPERTIES *pprop);
-    END_INTERFACE
-  } IAMBufferNegotiationVtbl;
-  struct IAMBufferNegotiation {
-    CONST_VTBL struct IAMBufferNegotiationVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMBufferNegotiation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMBufferNegotiation_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMBufferNegotiation_Release(This) (This)->lpVtbl->Release(This)
-#define IAMBufferNegotiation_SuggestAllocatorProperties(This,pprop) (This)->lpVtbl->SuggestAllocatorProperties(This,pprop)
-#define IAMBufferNegotiation_GetAllocatorProperties(This,pprop) (This)->lpVtbl->GetAllocatorProperties(This,pprop)
-#endif
-#endif
-  HRESULT WINAPI IAMBufferNegotiation_SuggestAllocatorProperties_Proxy(IAMBufferNegotiation *This,const ALLOCATOR_PROPERTIES *pprop);
-  void __RPC_STUB IAMBufferNegotiation_SuggestAllocatorProperties_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMBufferNegotiation_GetAllocatorProperties_Proxy(IAMBufferNegotiation *This,ALLOCATOR_PROPERTIES *pprop);
-  void __RPC_STUB IAMBufferNegotiation_GetAllocatorProperties_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
 #define AnalogVideo_NTSC_Mask 0x00000007
 #define AnalogVideo_PAL_Mask 0x00100FF0
 #define AnalogVideo_SECAM_Mask 0x000FF000
@@ -10102,46 +11762,6 @@
 
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0175_v0_0_c_ifspec;
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0175_v0_0_s_ifspec;
-#ifndef __IAMCameraControl_INTERFACE_DEFINED__
-#define __IAMCameraControl_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMCameraControl;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMCameraControl : public IUnknown {
-  public:
-    virtual HRESULT WINAPI GetRange(LONG Property,LONG *pMin,LONG *pMax,LONG *pSteppingDelta,LONG *pDefault,LONG *pCapsFlags) = 0;
-    virtual HRESULT WINAPI Set(LONG Property,LONG lValue,LONG Flags) = 0;
-    virtual HRESULT WINAPI Get(LONG Property,LONG *lValue,LONG *Flags) = 0;
-  };
-#else
-  typedef struct IAMCameraControlVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMCameraControl *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMCameraControl *This);
-      ULONG (WINAPI *Release)(IAMCameraControl *This);
-      HRESULT (WINAPI *GetRange)(IAMCameraControl *This,LONG Property,LONG *pMin,LONG *pMax,LONG *pSteppingDelta,LONG *pDefault,LONG *pCapsFlags);
-      HRESULT (WINAPI *Set)(IAMCameraControl *This,LONG Property,LONG lValue,LONG Flags);
-      HRESULT (WINAPI *Get)(IAMCameraControl *This,LONG Property,LONG *lValue,LONG *Flags);
-    END_INTERFACE
-  } IAMCameraControlVtbl;
-  struct IAMCameraControl {
-    CONST_VTBL struct IAMCameraControlVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMCameraControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMCameraControl_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMCameraControl_Release(This) (This)->lpVtbl->Release(This)
-#define IAMCameraControl_GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags) (This)->lpVtbl->GetRange(This,Property,pMin,pMax,pSteppingDelta,pDefault,pCapsFlags)
-#define IAMCameraControl_Set(This,Property,lValue,Flags) (This)->lpVtbl->Set(This,Property,lValue,Flags)
-#define IAMCameraControl_Get(This,Property,lValue,Flags) (This)->lpVtbl->Get(This,Property,lValue,Flags)
-#endif
-#endif
-  HRESULT WINAPI IAMCameraControl_GetRange_Proxy(IAMCameraControl *This,LONG Property,LONG *pMin,LONG *pMax,LONG *pSteppingDelta,LONG *pDefault,LONG *pCapsFlags);
-  void __RPC_STUB IAMCameraControl_GetRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCameraControl_Set_Proxy(IAMCameraControl *This,LONG Property,LONG lValue,LONG Flags);
-  void __RPC_STUB IAMCameraControl_Set_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCameraControl_Get_Proxy(IAMCameraControl *This,LONG Property,LONG *lValue,LONG *Flags);
-  void __RPC_STUB IAMCameraControl_Get_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
 
   typedef enum tagVideoControlFlags {
     VideoControlFlag_FlipHorizontal = 0x1,VideoControlFlag_FlipVertical = 0x2,VideoControlFlag_ExternalTriggerEnable = 0x4,VideoControlFlag_Trigger = 0x8
@@ -10149,116 +11769,6 @@
 
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0176_v0_0_c_ifspec;
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0176_v0_0_s_ifspec;
-#ifndef __IAMVideoControl_INTERFACE_DEFINED__
-#define __IAMVideoControl_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMVideoControl;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMVideoControl : public IUnknown {
-  public:
-    virtual HRESULT WINAPI GetCaps(IPin *pPin,LONG *pCapsFlags) = 0;
-    virtual HRESULT WINAPI SetMode(IPin *pPin,LONG Mode) = 0;
-    virtual HRESULT WINAPI GetMode(IPin *pPin,LONG *Mode) = 0;
-    virtual HRESULT WINAPI GetCurrentActualFrameRate(IPin *pPin,LONGLONG *ActualFrameRate) = 0;
-    virtual HRESULT WINAPI GetMaxAvailableFrameRate(IPin *pPin,LONG iIndex,SIZE Dimensions,LONGLONG *MaxAvailableFrameRate) = 0;
-    virtual HRESULT WINAPI GetFrameRateList(IPin *pPin,LONG iIndex,SIZE Dimensions,LONG *ListSize,LONGLONG **FrameRates) = 0;
-  };
-#else
-  typedef struct IAMVideoControlVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMVideoControl *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMVideoControl *This);
-      ULONG (WINAPI *Release)(IAMVideoControl *This);
-      HRESULT (WINAPI *GetCaps)(IAMVideoControl *This,IPin *pPin,LONG *pCapsFlags);
-      HRESULT (WINAPI *SetMode)(IAMVideoControl *This,IPin *pPin,LONG Mode);
-      HRESULT (WINAPI *GetMode)(IAMVideoControl *This,IPin *pPin,LONG *Mode);
-      HRESULT (WINAPI *GetCurrentActualFrameRate)(IAMVideoControl *This,IPin *pPin,LONGLONG *ActualFrameRate);
-      HRESULT (WINAPI *GetMaxAvailableFrameRate)(IAMVideoControl *This,IPin *pPin,LONG iIndex,SIZE Dimensions,LONGLONG *MaxAvailableFrameRate);
-      HRESULT (WINAPI *GetFrameRateList)(IAMVideoControl *This,IPin *pPin,LONG iIndex,SIZE Dimensions,LONG *ListSize,LONGLONG **FrameRates);
-    END_INTERFACE
-  } IAMVideoControlVtbl;
-  struct IAMVideoControl {
-    CONST_VTBL struct IAMVideoControlVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMVideoControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMVideoControl_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMVideoControl_Release(This) (This)->lpVtbl->Release(This)
-#define IAMVideoControl_GetCaps(This,pPin,pCapsFlags) (This)->lpVtbl->GetCaps(This,pPin,pCapsFlags)
-#define IAMVideoControl_SetMode(This,pPin,Mode) (This)->lpVtbl->SetMode(This,pPin,Mode)
-#define IAMVideoControl_GetMode(This,pPin,Mode) (This)->lpVtbl->GetMode(This,pPin,Mode)
-#define IAMVideoControl_GetCurrentActualFrameRate(This,pPin,ActualFrameRate) (This)->lpVtbl->GetCurrentActualFrameRate(This,pPin,ActualFrameRate)
-#define IAMVideoControl_GetMaxAvailableFrameRate(This,pPin,iIndex,Dimensions,MaxAvailableFrameRate) (This)->lpVtbl->GetMaxAvailableFrameRate(This,pPin,iIndex,Dimensions,MaxAvailableFrameRate)
-#define IAMVideoControl_GetFrameRateList(This,pPin,iIndex,Dimensions,ListSize,FrameRates) (This)->lpVtbl->GetFrameRateList(This,pPin,iIndex,Dimensions,ListSize,FrameRates)
-#endif
-#endif
-  HRESULT WINAPI IAMVideoControl_GetCaps_Proxy(IAMVideoControl *This,IPin *pPin,LONG *pCapsFlags);
-  void __RPC_STUB IAMVideoControl_GetCaps_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoControl_SetMode_Proxy(IAMVideoControl *This,IPin *pPin,LONG Mode);
-  void __RPC_STUB IAMVideoControl_SetMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoControl_GetMode_Proxy(IAMVideoControl *This,IPin *pPin,LONG *Mode);
-  void __RPC_STUB IAMVideoControl_GetMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoControl_GetCurrentActualFrameRate_Proxy(IAMVideoControl *This,IPin *pPin,LONGLONG *ActualFrameRate);
-  void __RPC_STUB IAMVideoControl_GetCurrentActualFrameRate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoControl_GetMaxAvailableFrameRate_Proxy(IAMVideoControl *This,IPin *pPin,LONG iIndex,SIZE Dimensions,LONGLONG *MaxAvailableFrameRate);
-  void __RPC_STUB IAMVideoControl_GetMaxAvailableFrameRate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMVideoControl_GetFrameRateList_Proxy(IAMVideoControl *This,IPin *pPin,LONG iIndex,SIZE Dimensions,LONG *ListSize,LONGLONG **FrameRates);
-  void __RPC_STUB IAMVideoControl_GetFrameRateList_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
-#ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(IAMCrossbar,0xc6e13380,0x30ac,0x11d0,0xa1,0x8c,0x00,0xa0,0xc9,0x11,0x89,0x56);
-#endif
-
-#ifndef __IAMCrossbar_INTERFACE_DEFINED__
-#define __IAMCrossbar_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMCrossbar;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMCrossbar : public IUnknown {
-  public:
-    virtual HRESULT WINAPI get_PinCounts(LONG *OutputPinCount,LONG *InputPinCount) = 0;
-    virtual HRESULT WINAPI CanRoute(LONG OutputPinIndex,LONG InputPinIndex) = 0;
-    virtual HRESULT WINAPI Route(LONG OutputPinIndex,LONG InputPinIndex) = 0;
-    virtual HRESULT WINAPI get_IsRoutedTo(LONG OutputPinIndex,LONG *InputPinIndex) = 0;
-    virtual HRESULT WINAPI get_CrossbarPinInfo(WINBOOL IsInputPin,LONG PinIndex,LONG *PinIndexRelated,LONG *PhysicalType) = 0;
-  };
-#else
-  typedef struct IAMCrossbarVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMCrossbar *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMCrossbar *This);
-      ULONG (WINAPI *Release)(IAMCrossbar *This);
-      HRESULT (WINAPI *get_PinCounts)(IAMCrossbar *This,LONG *OutputPinCount,LONG *InputPinCount);
-      HRESULT (WINAPI *CanRoute)(IAMCrossbar *This,LONG OutputPinIndex,LONG InputPinIndex);
-      HRESULT (WINAPI *Route)(IAMCrossbar *This,LONG OutputPinIndex,LONG InputPinIndex);
-      HRESULT (WINAPI *get_IsRoutedTo)(IAMCrossbar *This,LONG OutputPinIndex,LONG *InputPinIndex);
-      HRESULT (WINAPI *get_CrossbarPinInfo)(IAMCrossbar *This,WINBOOL IsInputPin,LONG PinIndex,LONG *PinIndexRelated,LONG *PhysicalType);
-    END_INTERFACE
-  } IAMCrossbarVtbl;
-  struct IAMCrossbar {
-    CONST_VTBL struct IAMCrossbarVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMCrossbar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMCrossbar_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMCrossbar_Release(This) (This)->lpVtbl->Release(This)
-#define IAMCrossbar_get_PinCounts(This,OutputPinCount,InputPinCount) (This)->lpVtbl->get_PinCounts(This,OutputPinCount,InputPinCount)
-#define IAMCrossbar_CanRoute(This,OutputPinIndex,InputPinIndex) (This)->lpVtbl->CanRoute(This,OutputPinIndex,InputPinIndex)
-#define IAMCrossbar_Route(This,OutputPinIndex,InputPinIndex) (This)->lpVtbl->Route(This,OutputPinIndex,InputPinIndex)
-#define IAMCrossbar_get_IsRoutedTo(This,OutputPinIndex,InputPinIndex) (This)->lpVtbl->get_IsRoutedTo(This,OutputPinIndex,InputPinIndex)
-#define IAMCrossbar_get_CrossbarPinInfo(This,IsInputPin,PinIndex,PinIndexRelated,PhysicalType) (This)->lpVtbl->get_CrossbarPinInfo(This,IsInputPin,PinIndex,PinIndexRelated,PhysicalType)
-#endif
-#endif
-  HRESULT WINAPI IAMCrossbar_get_PinCounts_Proxy(IAMCrossbar *This,LONG *OutputPinCount,LONG *InputPinCount);
-  void __RPC_STUB IAMCrossbar_get_PinCounts_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCrossbar_CanRoute_Proxy(IAMCrossbar *This,LONG OutputPinIndex,LONG InputPinIndex);
-  void __RPC_STUB IAMCrossbar_CanRoute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCrossbar_Route_Proxy(IAMCrossbar *This,LONG OutputPinIndex,LONG InputPinIndex);
-  void __RPC_STUB IAMCrossbar_Route_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCrossbar_get_IsRoutedTo_Proxy(IAMCrossbar *This,LONG OutputPinIndex,LONG *InputPinIndex);
-  void __RPC_STUB IAMCrossbar_get_IsRoutedTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMCrossbar_get_CrossbarPinInfo_Proxy(IAMCrossbar *This,WINBOOL IsInputPin,LONG PinIndex,LONG *PinIndexRelated,LONG *PhysicalType);
-  void __RPC_STUB IAMCrossbar_get_CrossbarPinInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
 
   typedef enum tagAMTunerSubChannel {
     AMTUNER_SUBCHAN_NO_TUNE = -2,AMTUNER_SUBCHAN_DEFAULT = -1
@@ -10268,258 +11778,8 @@
     AMTUNER_HASNOSIGNALSTRENGTH = -1,AMTUNER_NOSIGNAL = 0,AMTUNER_SIGNALPRESENT = 1
   } AMTunerSignalStrength;
 
-  typedef enum tagAMTunerModeType {
-    AMTUNER_MODE_DEFAULT = 0,AMTUNER_MODE_TV = 0x1,AMTUNER_MODE_FM_RADIO = 0x2,AMTUNER_MODE_AM_RADIO = 0x4,AMTUNER_MODE_DSS = 0x8
-  } AMTunerModeType;
-
-  typedef enum tagAMTunerEventType {
-    AMTUNER_EVENT_CHANGED = 0x1
-  } AMTunerEventType;
-
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0178_v0_0_c_ifspec;
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0178_v0_0_s_ifspec;
-#ifndef __IAMTuner_INTERFACE_DEFINED__
-#define __IAMTuner_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMTuner;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMTuner : public IUnknown {
-  public:
-    virtual HRESULT WINAPI put_Channel(LONG lChannel,LONG lVideoSubChannel,LONG lAudioSubChannel) = 0;
-    virtual HRESULT WINAPI get_Channel(LONG *plChannel,LONG *plVideoSubChannel,LONG *plAudioSubChannel) = 0;
-    virtual HRESULT WINAPI ChannelMinMax(LONG *lChannelMin,LONG *lChannelMax) = 0;
-    virtual HRESULT WINAPI put_CountryCode(LONG lCountryCode) = 0;
-    virtual HRESULT WINAPI get_CountryCode(LONG *plCountryCode) = 0;
-    virtual HRESULT WINAPI put_TuningSpace(LONG lTuningSpace) = 0;
-    virtual HRESULT WINAPI get_TuningSpace(LONG *plTuningSpace) = 0;
-    virtual HRESULT WINAPI Logon(HANDLE hCurrentUser) = 0;
-    virtual HRESULT WINAPI Logout(void) = 0;
-    virtual HRESULT WINAPI SignalPresent(LONG *plSignalStrength) = 0;
-    virtual HRESULT WINAPI put_Mode(AMTunerModeType lMode) = 0;
-    virtual HRESULT WINAPI get_Mode(AMTunerModeType *plMode) = 0;
-    virtual HRESULT WINAPI GetAvailableModes(LONG *plModes) = 0;
-    virtual HRESULT WINAPI RegisterNotificationCallBack(IAMTunerNotification *pNotify,LONG lEvents) = 0;
-    virtual HRESULT WINAPI UnRegisterNotificationCallBack(IAMTunerNotification *pNotify) = 0;
-  };
-#else
-  typedef struct IAMTunerVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMTuner *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMTuner *This);
-      ULONG (WINAPI *Release)(IAMTuner *This);
-      HRESULT (WINAPI *put_Channel)(IAMTuner *This,LONG lChannel,LONG lVideoSubChannel,LONG lAudioSubChannel);
-      HRESULT (WINAPI *get_Channel)(IAMTuner *This,LONG *plChannel,LONG *plVideoSubChannel,LONG *plAudioSubChannel);
-      HRESULT (WINAPI *ChannelMinMax)(IAMTuner *This,LONG *lChannelMin,LONG *lChannelMax);
-      HRESULT (WINAPI *put_CountryCode)(IAMTuner *This,LONG lCountryCode);
-      HRESULT (WINAPI *get_CountryCode)(IAMTuner *This,LONG *plCountryCode);
-      HRESULT (WINAPI *put_TuningSpace)(IAMTuner *This,LONG lTuningSpace);
-      HRESULT (WINAPI *get_TuningSpace)(IAMTuner *This,LONG *plTuningSpace);
-      HRESULT (WINAPI *Logon)(IAMTuner *This,HANDLE hCurrentUser);
-      HRESULT (WINAPI *Logout)(IAMTuner *This);
-      HRESULT (WINAPI *SignalPresent)(IAMTuner *This,LONG *plSignalStrength);
-      HRESULT (WINAPI *put_Mode)(IAMTuner *This,AMTunerModeType lMode);
-      HRESULT (WINAPI *get_Mode)(IAMTuner *This,AMTunerModeType *plMode);
-      HRESULT (WINAPI *GetAvailableModes)(IAMTuner *This,LONG *plModes);
-      HRESULT (WINAPI *RegisterNotificationCallBack)(IAMTuner *This,IAMTunerNotification *pNotify,LONG lEvents);
-      HRESULT (WINAPI *UnRegisterNotificationCallBack)(IAMTuner *This,IAMTunerNotification *pNotify);
-    END_INTERFACE
-  } IAMTunerVtbl;
-  struct IAMTuner {
-    CONST_VTBL struct IAMTunerVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMTuner_Release(This) (This)->lpVtbl->Release(This)
-#define IAMTuner_put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) (This)->lpVtbl->put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel)
-#define IAMTuner_get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) (This)->lpVtbl->get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel)
-#define IAMTuner_ChannelMinMax(This,lChannelMin,lChannelMax) (This)->lpVtbl->ChannelMinMax(This,lChannelMin,lChannelMax)
-#define IAMTuner_put_CountryCode(This,lCountryCode) (This)->lpVtbl->put_CountryCode(This,lCountryCode)
-#define IAMTuner_get_CountryCode(This,plCountryCode) (This)->lpVtbl->get_CountryCode(This,plCountryCode)
-#define IAMTuner_put_TuningSpace(This,lTuningSpace) (This)->lpVtbl->put_TuningSpace(This,lTuningSpace)
-#define IAMTuner_get_TuningSpace(This,plTuningSpace) (This)->lpVtbl->get_TuningSpace(This,plTuningSpace)
-#define IAMTuner_Logon(This,hCurrentUser) (This)->lpVtbl->Logon(This,hCurrentUser)
-#define IAMTuner_Logout(This) (This)->lpVtbl->Logout(This)
-#define IAMTuner_SignalPresent(This,plSignalStrength) (This)->lpVtbl->SignalPresent(This,plSignalStrength)
-#define IAMTuner_put_Mode(This,lMode) (This)->lpVtbl->put_Mode(This,lMode)
-#define IAMTuner_get_Mode(This,plMode) (This)->lpVtbl->get_Mode(This,plMode)
-#define IAMTuner_GetAvailableModes(This,plModes) (This)->lpVtbl->GetAvailableModes(This,plModes)
-#define IAMTuner_RegisterNotificationCallBack(This,pNotify,lEvents) (This)->lpVtbl->RegisterNotificationCallBack(This,pNotify,lEvents)
-#define IAMTuner_UnRegisterNotificationCallBack(This,pNotify) (This)->lpVtbl->UnRegisterNotificationCallBack(This,pNotify)
-#endif
-#endif
-  HRESULT WINAPI IAMTuner_put_Channel_Proxy(IAMTuner *This,LONG lChannel,LONG lVideoSubChannel,LONG lAudioSubChannel);
-  void __RPC_STUB IAMTuner_put_Channel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_get_Channel_Proxy(IAMTuner *This,LONG *plChannel,LONG *plVideoSubChannel,LONG *plAudioSubChannel);
-  void __RPC_STUB IAMTuner_get_Channel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_ChannelMinMax_Proxy(IAMTuner *This,LONG *lChannelMin,LONG *lChannelMax);
-  void __RPC_STUB IAMTuner_ChannelMinMax_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_put_CountryCode_Proxy(IAMTuner *This,LONG lCountryCode);
-  void __RPC_STUB IAMTuner_put_CountryCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_get_CountryCode_Proxy(IAMTuner *This,LONG *plCountryCode);
-  void __RPC_STUB IAMTuner_get_CountryCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_put_TuningSpace_Proxy(IAMTuner *This,LONG lTuningSpace);
-  void __RPC_STUB IAMTuner_put_TuningSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_get_TuningSpace_Proxy(IAMTuner *This,LONG *plTuningSpace);
-  void __RPC_STUB IAMTuner_get_TuningSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_Logon_Proxy(IAMTuner *This,HANDLE hCurrentUser);
-  void __RPC_STUB IAMTuner_Logon_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_Logout_Proxy(IAMTuner *This);
-  void __RPC_STUB IAMTuner_Logout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_SignalPresent_Proxy(IAMTuner *This,LONG *plSignalStrength);
-  void __RPC_STUB IAMTuner_SignalPresent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_put_Mode_Proxy(IAMTuner *This,AMTunerModeType lMode);
-  void __RPC_STUB IAMTuner_put_Mode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_get_Mode_Proxy(IAMTuner *This,AMTunerModeType *plMode);
-  void __RPC_STUB IAMTuner_get_Mode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_GetAvailableModes_Proxy(IAMTuner *This,LONG *plModes);
-  void __RPC_STUB IAMTuner_GetAvailableModes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_RegisterNotificationCallBack_Proxy(IAMTuner *This,IAMTunerNotification *pNotify,LONG lEvents);
-  void __RPC_STUB IAMTuner_RegisterNotificationCallBack_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTuner_UnRegisterNotificationCallBack_Proxy(IAMTuner *This,IAMTunerNotification *pNotify);
-  void __RPC_STUB IAMTuner_UnRegisterNotificationCallBack_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
-#ifndef __IAMTunerNotification_INTERFACE_DEFINED__
-#define __IAMTunerNotification_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMTunerNotification;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMTunerNotification : public IUnknown {
-  public:
-    virtual HRESULT WINAPI OnEvent(AMTunerEventType Event) = 0;
-  };
-#else
-  typedef struct IAMTunerNotificationVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMTunerNotification *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMTunerNotification *This);
-      ULONG (WINAPI *Release)(IAMTunerNotification *This);
-      HRESULT (WINAPI *OnEvent)(IAMTunerNotification *This,AMTunerEventType Event);
-    END_INTERFACE
-  } IAMTunerNotificationVtbl;
-  struct IAMTunerNotification {
-    CONST_VTBL struct IAMTunerNotificationVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMTunerNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMTunerNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMTunerNotification_Release(This) (This)->lpVtbl->Release(This)
-#define IAMTunerNotification_OnEvent(This,Event) (This)->lpVtbl->OnEvent(This,Event)
-#endif
-#endif
-  HRESULT WINAPI IAMTunerNotification_OnEvent_Proxy(IAMTunerNotification *This,AMTunerEventType Event);
-  void __RPC_STUB IAMTunerNotification_OnEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
-#ifndef __IAMTVTuner_INTERFACE_DEFINED__
-#define __IAMTVTuner_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMTVTuner;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMTVTuner : public IAMTuner {
-  public:
-    virtual HRESULT WINAPI get_AvailableTVFormats(LONG *lAnalogVideoStandard) = 0;
-    virtual HRESULT WINAPI get_TVFormat(LONG *plAnalogVideoStandard) = 0;
-    virtual HRESULT WINAPI AutoTune(LONG lChannel,LONG *plFoundSignal) = 0;
-    virtual HRESULT WINAPI StoreAutoTune(void) = 0;
-    virtual HRESULT WINAPI get_NumInputConnections(LONG *plNumInputConnections) = 0;
-    virtual HRESULT WINAPI put_InputType(LONG lIndex,TunerInputType InputType) = 0;
-    virtual HRESULT WINAPI get_InputType(LONG lIndex,TunerInputType *pInputType) = 0;
-    virtual HRESULT WINAPI put_ConnectInput(LONG lIndex) = 0;
-    virtual HRESULT WINAPI get_ConnectInput(LONG *plIndex) = 0;
-    virtual HRESULT WINAPI get_VideoFrequency(LONG *lFreq) = 0;
-    virtual HRESULT WINAPI get_AudioFrequency(LONG *lFreq) = 0;
-  };
-#else
-  typedef struct IAMTVTunerVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMTVTuner *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMTVTuner *This);
-      ULONG (WINAPI *Release)(IAMTVTuner *This);
-      HRESULT (WINAPI *put_Channel)(IAMTVTuner *This,LONG lChannel,LONG lVideoSubChannel,LONG lAudioSubChannel);
-      HRESULT (WINAPI *get_Channel)(IAMTVTuner *This,LONG *plChannel,LONG *plVideoSubChannel,LONG *plAudioSubChannel);
-      HRESULT (WINAPI *ChannelMinMax)(IAMTVTuner *This,LONG *lChannelMin,LONG *lChannelMax);
-      HRESULT (WINAPI *put_CountryCode)(IAMTVTuner *This,LONG lCountryCode);
-      HRESULT (WINAPI *get_CountryCode)(IAMTVTuner *This,LONG *plCountryCode);
-      HRESULT (WINAPI *put_TuningSpace)(IAMTVTuner *This,LONG lTuningSpace);
-      HRESULT (WINAPI *get_TuningSpace)(IAMTVTuner *This,LONG *plTuningSpace);
-      HRESULT (WINAPI *Logon)(IAMTVTuner *This,HANDLE hCurrentUser);
-      HRESULT (WINAPI *Logout)(IAMTVTuner *This);
-      HRESULT (WINAPI *SignalPresent)(IAMTVTuner *This,LONG *plSignalStrength);
-      HRESULT (WINAPI *put_Mode)(IAMTVTuner *This,AMTunerModeType lMode);
-      HRESULT (WINAPI *get_Mode)(IAMTVTuner *This,AMTunerModeType *plMode);
-      HRESULT (WINAPI *GetAvailableModes)(IAMTVTuner *This,LONG *plModes);
-      HRESULT (WINAPI *RegisterNotificationCallBack)(IAMTVTuner *This,IAMTunerNotification *pNotify,LONG lEvents);
-      HRESULT (WINAPI *UnRegisterNotificationCallBack)(IAMTVTuner *This,IAMTunerNotification *pNotify);
-      HRESULT (WINAPI *get_AvailableTVFormats)(IAMTVTuner *This,LONG *lAnalogVideoStandard);
-      HRESULT (WINAPI *get_TVFormat)(IAMTVTuner *This,LONG *plAnalogVideoStandard);
-      HRESULT (WINAPI *AutoTune)(IAMTVTuner *This,LONG lChannel,LONG *plFoundSignal);
-      HRESULT (WINAPI *StoreAutoTune)(IAMTVTuner *This);
-      HRESULT (WINAPI *get_NumInputConnections)(IAMTVTuner *This,LONG *plNumInputConnections);
-      HRESULT (WINAPI *put_InputType)(IAMTVTuner *This,LONG lIndex,TunerInputType InputType);
-      HRESULT (WINAPI *get_InputType)(IAMTVTuner *This,LONG lIndex,TunerInputType *pInputType);
-      HRESULT (WINAPI *put_ConnectInput)(IAMTVTuner *This,LONG lIndex);
-      HRESULT (WINAPI *get_ConnectInput)(IAMTVTuner *This,LONG *plIndex);
-      HRESULT (WINAPI *get_VideoFrequency)(IAMTVTuner *This,LONG *lFreq);
-      HRESULT (WINAPI *get_AudioFrequency)(IAMTVTuner *This,LONG *lFreq);
-    END_INTERFACE
-  } IAMTVTunerVtbl;
-  struct IAMTVTuner {
-    CONST_VTBL struct IAMTVTunerVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMTVTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMTVTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMTVTuner_Release(This) (This)->lpVtbl->Release(This)
-#define IAMTVTuner_put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel) (This)->lpVtbl->put_Channel(This,lChannel,lVideoSubChannel,lAudioSubChannel)
-#define IAMTVTuner_get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel) (This)->lpVtbl->get_Channel(This,plChannel,plVideoSubChannel,plAudioSubChannel)
-#define IAMTVTuner_ChannelMinMax(This,lChannelMin,lChannelMax) (This)->lpVtbl->ChannelMinMax(This,lChannelMin,lChannelMax)
-#define IAMTVTuner_put_CountryCode(This,lCountryCode) (This)->lpVtbl->put_CountryCode(This,lCountryCode)
-#define IAMTVTuner_get_CountryCode(This,plCountryCode) (This)->lpVtbl->get_CountryCode(This,plCountryCode)
-#define IAMTVTuner_put_TuningSpace(This,lTuningSpace) (This)->lpVtbl->put_TuningSpace(This,lTuningSpace)
-#define IAMTVTuner_get_TuningSpace(This,plTuningSpace) (This)->lpVtbl->get_TuningSpace(This,plTuningSpace)
-#define IAMTVTuner_Logon(This,hCurrentUser) (This)->lpVtbl->Logon(This,hCurrentUser)
-#define IAMTVTuner_Logout(This) (This)->lpVtbl->Logout(This)
-#define IAMTVTuner_SignalPresent(This,plSignalStrength) (This)->lpVtbl->SignalPresent(This,plSignalStrength)
-#define IAMTVTuner_put_Mode(This,lMode) (This)->lpVtbl->put_Mode(This,lMode)
-#define IAMTVTuner_get_Mode(This,plMode) (This)->lpVtbl->get_Mode(This,plMode)
-#define IAMTVTuner_GetAvailableModes(This,plModes) (This)->lpVtbl->GetAvailableModes(This,plModes)
-#define IAMTVTuner_RegisterNotificationCallBack(This,pNotify,lEvents) (This)->lpVtbl->RegisterNotificationCallBack(This,pNotify,lEvents)
-#define IAMTVTuner_UnRegisterNotificationCallBack(This,pNotify) (This)->lpVtbl->UnRegisterNotificationCallBack(This,pNotify)
-#define IAMTVTuner_get_AvailableTVFormats(This,lAnalogVideoStandard) (This)->lpVtbl->get_AvailableTVFormats(This,lAnalogVideoStandard)
-#define IAMTVTuner_get_TVFormat(This,plAnalogVideoStandard) (This)->lpVtbl->get_TVFormat(This,plAnalogVideoStandard)
-#define IAMTVTuner_AutoTune(This,lChannel,plFoundSignal) (This)->lpVtbl->AutoTune(This,lChannel,plFoundSignal)
-#define IAMTVTuner_StoreAutoTune(This) (This)->lpVtbl->StoreAutoTune(This)
-#define IAMTVTuner_get_NumInputConnections(This,plNumInputConnections) (This)->lpVtbl->get_NumInputConnections(This,plNumInputConnections)
-#define IAMTVTuner_put_InputType(This,lIndex,InputType) (This)->lpVtbl->put_InputType(This,lIndex,InputType)
-#define IAMTVTuner_get_InputType(This,lIndex,pInputType) (This)->lpVtbl->get_InputType(This,lIndex,pInputType)
-#define IAMTVTuner_put_ConnectInput(This,lIndex) (This)->lpVtbl->put_ConnectInput(This,lIndex)
-#define IAMTVTuner_get_ConnectInput(This,plIndex) (This)->lpVtbl->get_ConnectInput(This,plIndex)
-#define IAMTVTuner_get_VideoFrequency(This,lFreq) (This)->lpVtbl->get_VideoFrequency(This,lFreq)
-#define IAMTVTuner_get_AudioFrequency(This,lFreq) (This)->lpVtbl->get_AudioFrequency(This,lFreq)
-#endif
-#endif
-  HRESULT WINAPI IAMTVTuner_get_AvailableTVFormats_Proxy(IAMTVTuner *This,LONG *lAnalogVideoStandard);
-  void __RPC_STUB IAMTVTuner_get_AvailableTVFormats_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_TVFormat_Proxy(IAMTVTuner *This,LONG *plAnalogVideoStandard);
-  void __RPC_STUB IAMTVTuner_get_TVFormat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_AutoTune_Proxy(IAMTVTuner *This,LONG lChannel,LONG *plFoundSignal);
-  void __RPC_STUB IAMTVTuner_AutoTune_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_StoreAutoTune_Proxy(IAMTVTuner *This);
-  void __RPC_STUB IAMTVTuner_StoreAutoTune_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_NumInputConnections_Proxy(IAMTVTuner *This,LONG *plNumInputConnections);
-  void __RPC_STUB IAMTVTuner_get_NumInputConnections_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_put_InputType_Proxy(IAMTVTuner *This,LONG lIndex,TunerInputType InputType);
-  void __RPC_STUB IAMTVTuner_put_InputType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_InputType_Proxy(IAMTVTuner *This,LONG lIndex,TunerInputType *pInputType);
-  void __RPC_STUB IAMTVTuner_get_InputType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_put_ConnectInput_Proxy(IAMTVTuner *This,LONG lIndex);
-  void __RPC_STUB IAMTVTuner_put_ConnectInput_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_ConnectInput_Proxy(IAMTVTuner *This,LONG *plIndex);
-  void __RPC_STUB IAMTVTuner_get_ConnectInput_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_VideoFrequency_Proxy(IAMTVTuner *This,LONG *lFreq);
-  void __RPC_STUB IAMTVTuner_get_VideoFrequency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMTVTuner_get_AudioFrequency_Proxy(IAMTVTuner *This,LONG *lFreq);
-  void __RPC_STUB IAMTVTuner_get_AudioFrequency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
 
 #ifndef __IBPCSatelliteTuner_INTERFACE_DEFINED__
 #define __IBPCSatelliteTuner_INTERFACE_DEFINED__
@@ -10746,10 +12006,6 @@
   void __RPC_STUB IAMAnalogVideoEncoder_get_CCEnable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
 #endif
 
-  typedef enum __MIDL___MIDL_itf_strmif_0185_0001 {
-    AMPROPERTY_PIN_CATEGORY = 0,AMPROPERTY_PIN_MEDIUM = AMPROPERTY_PIN_CATEGORY + 1
-  } AMPROPERTY_PIN;
-
 #ifndef __IAMPhysicalPinInfo_INTERFACE_DEFINED__
 #define __IAMPhysicalPinInfo_INTERFACE_DEFINED__
   EXTERN_C const IID IID_IAMPhysicalPinInfo;
@@ -11553,47 +12809,6 @@
   void __RPC_STUB IAMVideoDecimationProperties_SetDecimationUsage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
 #endif
 
-#ifndef __IVideoFrameStep_INTERFACE_DEFINED__
-#define __IVideoFrameStep_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IVideoFrameStep;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IVideoFrameStep : public IUnknown {
-  public:
-    virtual HRESULT WINAPI Step(DWORD dwFrames,IUnknown *pStepObject) = 0;
-    virtual HRESULT WINAPI CanStep(LONG bMultiple,IUnknown *pStepObject) = 0;
-    virtual HRESULT WINAPI CancelStep(void) = 0;
-  };
-#else
-  typedef struct IVideoFrameStepVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IVideoFrameStep *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IVideoFrameStep *This);
-      ULONG (WINAPI *Release)(IVideoFrameStep *This);
-      HRESULT (WINAPI *Step)(IVideoFrameStep *This,DWORD dwFrames,IUnknown *pStepObject);
-      HRESULT (WINAPI *CanStep)(IVideoFrameStep *This,LONG bMultiple,IUnknown *pStepObject);
-      HRESULT (WINAPI *CancelStep)(IVideoFrameStep *This);
-    END_INTERFACE
-  } IVideoFrameStepVtbl;
-  struct IVideoFrameStep {
-    CONST_VTBL struct IVideoFrameStepVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IVideoFrameStep_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IVideoFrameStep_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IVideoFrameStep_Release(This) (This)->lpVtbl->Release(This)
-#define IVideoFrameStep_Step(This,dwFrames,pStepObject) (This)->lpVtbl->Step(This,dwFrames,pStepObject)
-#define IVideoFrameStep_CanStep(This,bMultiple,pStepObject) (This)->lpVtbl->CanStep(This,bMultiple,pStepObject)
-#define IVideoFrameStep_CancelStep(This) (This)->lpVtbl->CancelStep(This)
-#endif
-#endif
-  HRESULT WINAPI IVideoFrameStep_Step_Proxy(IVideoFrameStep *This,DWORD dwFrames,IUnknown *pStepObject);
-  void __RPC_STUB IVideoFrameStep_Step_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IVideoFrameStep_CanStep_Proxy(IVideoFrameStep *This,LONG bMultiple,IUnknown *pStepObject);
-  void __RPC_STUB IVideoFrameStep_CanStep_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IVideoFrameStep_CancelStep_Proxy(IVideoFrameStep *This);
-  void __RPC_STUB IVideoFrameStep_CancelStep_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
   enum _AM_PUSHSOURCE_FLAGS {
     AM_PUSHSOURCECAPS_INTERNAL_RM = 0x1,AM_PUSHSOURCECAPS_NOT_LIVE = 0x2,AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x4,
     AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x10000,AM_PUSHSOURCEREQS_USE_CLOCK_CHAIN = 0x20000
@@ -11601,94 +12816,6 @@
 
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0353_v0_0_c_ifspec;
   extern RPC_IF_HANDLE __MIDL_itf_strmif_0353_v0_0_s_ifspec;
-#ifndef __IAMLatency_INTERFACE_DEFINED__
-#define __IAMLatency_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMLatency;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMLatency : public IUnknown {
-  public:
-    virtual HRESULT WINAPI GetLatency(REFERENCE_TIME *prtLatency) = 0;
-  };
-#else
-  typedef struct IAMLatencyVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMLatency *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMLatency *This);
-      ULONG (WINAPI *Release)(IAMLatency *This);
-      HRESULT (WINAPI *GetLatency)(IAMLatency *This,REFERENCE_TIME *prtLatency);
-    END_INTERFACE
-  } IAMLatencyVtbl;
-  struct IAMLatency {
-    CONST_VTBL struct IAMLatencyVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMLatency_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMLatency_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMLatency_Release(This) (This)->lpVtbl->Release(This)
-#define IAMLatency_GetLatency(This,prtLatency) (This)->lpVtbl->GetLatency(This,prtLatency)
-#endif
-#endif
-  HRESULT WINAPI IAMLatency_GetLatency_Proxy(IAMLatency *This,REFERENCE_TIME *prtLatency);
-  void __RPC_STUB IAMLatency_GetLatency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
-
-#ifndef __IAMPushSource_INTERFACE_DEFINED__
-#define __IAMPushSource_INTERFACE_DEFINED__
-  EXTERN_C const IID IID_IAMPushSource;
-#if defined(__cplusplus) && !defined(CINTERFACE)
-  struct IAMPushSource : public IAMLatency {
-  public:
-    virtual HRESULT WINAPI GetPushSourceFlags(ULONG *pFlags) = 0;
-    virtual HRESULT WINAPI SetPushSourceFlags(ULONG Flags) = 0;
-    virtual HRESULT WINAPI SetStreamOffset(REFERENCE_TIME rtOffset) = 0;
-    virtual HRESULT WINAPI GetStreamOffset(REFERENCE_TIME *prtOffset) = 0;
-    virtual HRESULT WINAPI GetMaxStreamOffset(REFERENCE_TIME *prtMaxOffset) = 0;
-    virtual HRESULT WINAPI SetMaxStreamOffset(REFERENCE_TIME rtMaxOffset) = 0;
-  };
-#else
-  typedef struct IAMPushSourceVtbl {
-    BEGIN_INTERFACE
-      HRESULT (WINAPI *QueryInterface)(IAMPushSource *This,REFIID riid,void **ppvObject);
-      ULONG (WINAPI *AddRef)(IAMPushSource *This);
-      ULONG (WINAPI *Release)(IAMPushSource *This);
-      HRESULT (WINAPI *GetLatency)(IAMPushSource *This,REFERENCE_TIME *prtLatency);
-      HRESULT (WINAPI *GetPushSourceFlags)(IAMPushSource *This,ULONG *pFlags);
-      HRESULT (WINAPI *SetPushSourceFlags)(IAMPushSource *This,ULONG Flags);
-      HRESULT (WINAPI *SetStreamOffset)(IAMPushSource *This,REFERENCE_TIME rtOffset);
-      HRESULT (WINAPI *GetStreamOffset)(IAMPushSource *This,REFERENCE_TIME *prtOffset);
-      HRESULT (WINAPI *GetMaxStreamOffset)(IAMPushSource *This,REFERENCE_TIME *prtMaxOffset);
-      HRESULT (WINAPI *SetMaxStreamOffset)(IAMPushSource *This,REFERENCE_TIME rtMaxOffset);
-    END_INTERFACE
-  } IAMPushSourceVtbl;
-  struct IAMPushSource {
-    CONST_VTBL struct IAMPushSourceVtbl *lpVtbl;
-  };
-#ifdef COBJMACROS
-#define IAMPushSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IAMPushSource_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IAMPushSource_Release(This) (This)->lpVtbl->Release(This)
-#define IAMPushSource_GetLatency(This,prtLatency) (This)->lpVtbl->GetLatency(This,prtLatency)
-#define IAMPushSource_GetPushSourceFlags(This,pFlags) (This)->lpVtbl->GetPushSourceFlags(This,pFlags)
-#define IAMPushSource_SetPushSourceFlags(This,Flags) (This)->lpVtbl->SetPushSourceFlags(This,Flags)
-#define IAMPushSource_SetStreamOffset(This,rtOffset) (This)->lpVtbl->SetStreamOffset(This,rtOffset)
-#define IAMPushSource_GetStreamOffset(This,prtOffset) (This)->lpVtbl->GetStreamOffset(This,prtOffset)
-#define IAMPushSource_GetMaxStreamOffset(This,prtMaxOffset) (This)->lpVtbl->GetMaxStreamOffset(This,prtMaxOffset)
-#define IAMPushSource_SetMaxStreamOffset(This,rtMaxOffset) (This)->lpVtbl->SetMaxStreamOffset(This,rtMaxOffset)
-#endif
-#endif
-  HRESULT WINAPI IAMPushSource_GetPushSourceFlags_Proxy(IAMPushSource *This,ULONG *pFlags);
-  void __RPC_STUB IAMPushSource_GetPushSourceFlags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMPushSource_SetPushSourceFlags_Proxy(IAMPushSource *This,ULONG Flags);
-  void __RPC_STUB IAMPushSource_SetPushSourceFlags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMPushSource_SetStreamOffset_Proxy(IAMPushSource *This,REFERENCE_TIME rtOffset);
-  void __RPC_STUB IAMPushSource_SetStreamOffset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMPushSource_GetStreamOffset_Proxy(IAMPushSource *This,REFERENCE_TIME *prtOffset);
-  void __RPC_STUB IAMPushSource_GetStreamOffset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMPushSource_GetMaxStreamOffset_Proxy(IAMPushSource *This,REFERENCE_TIME *prtMaxOffset);
-  void __RPC_STUB IAMPushSource_GetMaxStreamOffset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-  HRESULT WINAPI IAMPushSource_SetMaxStreamOffset_Proxy(IAMPushSource *This,REFERENCE_TIME rtMaxOffset);
-  void __RPC_STUB IAMPushSource_SetMaxStreamOffset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
-#endif
 
 #ifndef __IAMDeviceRemoval_INTERFACE_DEFINED__
 #define __IAMDeviceRemoval_INTERFACE_DEFINED__
