#ifndef _STRMIF_H
#define _STRMIF_H
#if __GNUC__ >= 3
#pragma GCC system_header
#endif

#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

/*--- DirectShow Reference - DirectShow Enumerated Types - TVAudioMode Enumeration */
#define TVAUDIO_MODE_MASK 0x000000FF
#define TVAUDIO_PRESET_MASK 0x0000FF00
/*--- DirectShow Reference - DirectShow Data Types */
/* REFERENCE http://msdn.microsoft.com/en-us/library/ms783328(VS.85).aspx */
typedef LONG_PTR OAEVENT;
typedef LONG_PTR OAHWND;
typedef LONGLONG REFERENCE_TIME;
typedef double REFTIME;
typedef long OAFilterState;

/* http://msdn.microsoft.com/en-us/library/ms708770(VS.85).aspx */
typedef unsigned int HEVENT;
typedef HANDLE HSEMAPHORE;

/*--- DirectShow Reference - Constants and GUIDs */
enum { 
	MERIT_PREFERRED = 0x800000,
	MERIT_NORMAL = 0x600000,
	MERIT_UNLIKELY = 0x400000,
	MERIT_DO_NOT_USE = 0x200000,
	MERIT_SW_COMPRESSOR = 0x100000,
	MERIT_HW_COMPRESSOR = 0x100050
};
/*--- DirectShow Reference - DirectShow Enumerated Types */
typedef enum _AM_AUDIO_RENDERER_STAT_PARAM {
	AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1,
	AM_AUDREND_STAT_PARAM_SLAVE_MODE,
	AM_AUDREND_STAT_PARAM_SILENCE_DUR,
	AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR,
	AM_AUDREND_STAT_PARAM_DISCONTINUITIES,
	AM_AUDREND_STAT_PARAM_SLAVE_RATE,
	AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR,
	AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR,
	AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR,
	AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR,
	AM_AUDREND_STAT_PARAM_BUFFERFULLNESS,
	AM_AUDREND_STAT_PARAM_JITTER
} AM_AUDIO_RENDERER_STAT_PARAM;
typedef enum _AM_DVD_GRAPH_FLAGS {
	AM_DVD_HWDEC_PREFER = 0x01,
	AM_DVD_HWDEC_ONLY = 0x02,
	AM_DVD_SWDEC_PREFER = 0x04,
	AM_DVD_SWDEC_ONLY = 0x08,
	AM_DVD_NOVPE = 0x100,
	AM_DVD_VMR9_ONLY = 0x800,
	AM_DVD_EVR_ONLY = 0x1000
} AM_DVD_GRAPH_FLAGS;
typedef enum _AM_DVD_STREAM_FLAGS {
	AM_DVD_STREAM_VIDEO = 0x01,
	AM_DVD_STREAM_AUDIO = 0x02,
	AM_DVD_STREAM_SUBPIC = 0x04
} AM_DVD_STREAM_FLAGS;
typedef enum _AM_FILTER_MISC_FLAGS {
	AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001,
	AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002
} AM_FILTER_MISC_FLAGS;
typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS {
	AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001,
	AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002,
	AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004
} AM_GRAPH_CONFIG_RECONNECT_FLAGS;
typedef enum _AM_INTF_SEARCH_FLAGS {
	AM_INTF_SEARCH_INPUT_PIN = 0x00000001,
	AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002,
	AM_INTF_SEARCH_FILTER = 0x00000004
} AM_INTF_SEARCH_FLAGS;
typedef enum _AM_OVERLAY_NOTIFY_FLAGS {
	AM_OVERLAY_NOTIFY_VISIBLE_CHANGE = 0x00000001,
	AM_OVERLAY_NOTIFY_SOURCE_CHANGE = 0x00000002,
	AM_OVERLAY_NOTIFY_DEST_CHANGE = 0x00000004
} AM_OVERLAY_NOTIFY_FLAGS;
typedef enum _AM_PIN_CONNECTION_BLOCK_FLAGS {
	AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001,
	AM_PIN_PUSH_THROUGH_DATA = 0x00000002
} AM_PIN_CONNECTION_BLOCK_FLAGS;
typedef enum _AM_PUSHSOURCE_FLAGS {
	AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001,
	AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002,
	AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004,
	AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000
} AM_PUSHSOURCE_FLAGS;
typedef enum tagAM_SAMPLE_PROPERTY_FLAGS {
	AM_SAMPLE_SPLICEPOINT = 0x01,
	AM_SAMPLE_PREROLL = 0x02,
	AM_SAMPLE_DATADISCONTINUITY = 0x04,
	AM_SAMPLE_TYPECHANGED = 0x08,
	AM_SAMPLE_TIMEVALID = 0x10,
	AM_SAMPLE_TIMEDISCONTINUITY = 0x40,
	AM_SAMPLE_FLUSH_ON_PAUSE = 0x80,
	AM_SAMPLE_STOPVALID = 0x100,
	AM_SAMPLE_ENDOFSTREAM = 0x200,
	AM_STREAM_MEDIA = 0,
	AM_STREAM_CONTROL = 1
} AM_SAMPLE_PROPERTY_FLAGS;
typedef enum AM_SEEKING_SeekingCapabilities {
	AM_SEEKING_CanSeekAbsolute = 0x1,
	AM_SEEKING_CanSeekForwards = 0x2,
	AM_SEEKING_CanSeekBackwards = 0x4,
	AM_SEEKING_CanGetCurrentPos = 0x8,
	AM_SEEKING_CanGetStopPos = 0x10,
	AM_SEEKING_CanGetDuration = 0x20,
	AM_SEEKING_CanPlayBackwards = 0x40,
	AM_SEEKING_CanDoSegments = 0x80,
	AM_SEEKING_Source = 0x100
} AM_SEEKING_SEEKING_CAPABILITIES;
typedef enum {
	AM_STREAM_INFO_START_DEFINED = 0x00000001,
	AM_STREAM_INFO_STOP_DEFINED = 0x00000002,
	AM_STREAM_INFO_DISCARDING = 0x00000004,
	AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010
} AM_STREAM_INFO_FLAGS;
enum AMOVERLAYFX {
	AMOVERFX_NOFX = 0x00000000,
	AMOVERFX_MIRRORLEFTRIGHT = 0x00000002,
	AMOVERFX_MIRRORUPDOWN = 0x00000004,
	AMOVERFX_DEINTERLACE = 0x00000008
};
typedef enum _AMRESCTL_RESERVEFLAGS {
	AMRESCTL_RESERVEFLAGS_RESERVE = 0x00,
	AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01
} AMRESCTL_RESERVEFLAGS;
typedef enum tagAMTunerModeType {
	AMTUNER_MODE_DEFAULT = 0x0000,
	AMTUNER_MODE_TV = 0x0001,
	AMTUNER_MODE_FM_RADIO = 0x0002,
	AMTUNER_MODE_AM_RADIO = 0x0004,
	AMTUNER_MODE_DSS = 0x0008
} AMTunerModeType;
typedef enum tagAnalogVideoStandard {
	AnalogVideo_None = 0x00000000,
	AnalogVideo_NTSC_M = 0x00000001,
	AnalogVideo_NTSC_M_J = 0x00000002,
	AnalogVideo_NTSC_433 = 0x00000004,
	AnalogVideo_PAL_B = 0x00000010,
	AnalogVideo_PAL_D = 0x00000020,
	AnalogVideo_PAL_H = 0x00000080,
	AnalogVideo_PAL_I = 0x00000100,
	AnalogVideo_PAL_M = 0x00000200,
	AnalogVideo_PAL_N = 0x00000400,
	AnalogVideo_PAL_60 = 0x00000800,
	AnalogVideo_SECAM_B = 0x00001000,
	AnalogVideo_SECAM_D = 0x00002000,
	AnalogVideo_SECAM_G = 0x00004000,
	AnalogVideo_SECAM_H = 0x00008000,
	AnalogVideo_SECAM_K = 0x00010000,
	AnalogVideo_SECAM_K1 = 0x00020000,
	AnalogVideo_SECAM_L = 0x00040000,
	AnalogVideo_SECAM_L1 = 0x00080000,
	AnalogVideo_PAL_N_COMBO = 0x00100000
} AnalogVideoStandard;
typedef enum {
	CameraControl_Flags_Auto = 0x0001,
	CameraControl_Flags_Manual = 0x0002
} CameraControlFlags;
typedef enum {
	CameraControl_Pan = 1,
	CameraControl_Tilt,
	CameraControl_Roll,
	CameraControl_Zoom,
	CameraControl_Exposure,
	CameraControl_Iris,
	CameraControl_Focus
} CameraControlProperty;
typedef enum {
	CompressionCaps_CanQuality = 0x01,
	CompressionCaps_CanCrunch = 0x02,
	CompressionCaps_CanKeyFrame = 0x04,
	CompressionCaps_CanBFrame = 0x08,
	CompressionCaps_CanWindow = 0x10
} CompressionCaps;
typedef enum {
	DECIMATION_LEGACY,
	DECIMATION_USE_DECODER_ONLY,
	DECIMATION_USE_VIDEOPORT_ONLY,
	DECIMATION_USE_OVERLAY_ONLY,
	DECIMATION_DEFAULT
} DECIMATION_USAGE;
typedef enum tagDVD_AUDIO_APPMODE {
	DVD_AudioMode_None = 0,
	DVD_AudioMode_Karaoke = 1,
	DVD_AudioMode_Surround = 2,
	DVD_AudioMode_Other = 3
} DVD_AUDIO_APPMODE;
typedef enum tagDVD_AUDIO_FORMAT {
	DVD_AudioFormat_AC3 = 0,
	DVD_AudioFormat_MPEG1 = 1,
	DVD_AudioFormat_MPEG1_DRC = 2,
	DVD_AudioFormat_MPEG2 = 3,
	DVD_AudioFormat_MPEG2_DRC = 4,
	DVD_AudioFormat_LPCM = 5,
	DVD_AudioFormat_DTS = 6,
	DVD_AudioFormat_SDDS = 7,
	DVD_AudioFormat_Other = 8
} DVD_AUDIO_FORMAT;
typedef enum tagDVD_AUDIO_LANG_EXT {
	DVD_AUD_EXT_NotSpecified = 0,
	DVD_AUD_EXT_Captions = 1,
	DVD_AUD_EXT_VisuallyImpaired = 2,
	DVD_AUD_EXT_DirectorComments1 = 3,
	DVD_AUD_EXT_DirectorComments2 = 4
} DVD_AUDIO_LANG_EXT;
typedef enum {
	DVD_CMD_FLAG_None = 0x00000000,
	DVD_CMD_FLAG_Flush = 0x00000001,
	DVD_CMD_FLAG_SendEvents = 0x00000002,
	DVD_CMD_FLAG_Block = 0x00000004,
	DVD_CMD_FLAG_StartWhenRendered = 0x00000008,
	DVD_CMD_FLAG_EndAfterRendered = 0x00000010
} DVD_CMD_FLAGS;
typedef enum tagDVD_DISC_SIDE {
	DVD_SIDE_A,
	DVD_SIDE_B
} DVD_DISC_SIDE;
typedef enum tagDVD_DOMAIN {
	DVD_DOMAIN_FirstPlay,
	DVD_DOMAIN_VideoManagerMenu,
	DVD_DOMAIN_VideoTitleSetMenu,
	DVD_DOMAIN_Title,
	DVD_DOMAIN_Stop
} DVD_DOMAIN;
typedef enum tagDVD_FRAMERATE {
	DVD_FPS_25 = 1,
	DVD_FPS_30NonDrop = 3
} DVD_FRAMERATE;
typedef enum tagDVD_KARAOKE_ASSIGNMENT {
	DVD_Assignment_reserved0 = 0,
	DVD_Assignment_reserved1 = 1,
	DVD_Assignment_LR = 2,
	DVD_Assignment_LRM = 3,
	DVD_Assignment_LR1 = 4,
	DVD_Assignment_LRM1 = 5,
	DVD_Assignment_LR12 = 6,
	DVD_Assignment_LRM12 = 7 
} DVD_KARAOKE_ASSIGNMENT;
typedef enum tagDVD_KARAOKE_CONTENTS {
	DVD_Karaoke_GuideVocal1 = 0x0001,
	DVD_Karaoke_GuideVocal2 = 0x0002,
	DVD_Karaoke_GuideMelody1 = 0x0004,
	DVD_Karaoke_GuideMelody2 = 0x0008,
	DVD_Karaoke_GuideMelodyA = 0x0010,
	DVD_Karaoke_GuideMelodyB = 0x0020,
	DVD_Karaoke_SoundEffectA = 0x0040,
	DVD_Karaoke_SoundEffectB = 0x0080
} DVD_KARAOKE_CONTENTS;
typedef enum tagDVD_KARAOKE_DOWNMIX {
	DVD_Mix_0to0 = 0x0001,
	DVD_Mix_1to0 = 0x0002,
	DVD_Mix_2to0 = 0x0004,
	DVD_Mix_3to0 = 0x0008,
	DVD_Mix_4to0 = 0x0010,
	DVD_Mix_Lto0 = 0x0020,
	DVD_Mix_Rto0 = 0x0040,
	DVD_Mix_0to1 = 0x0100,
	DVD_Mix_1to1 = 0x0200,
	DVD_Mix_2to1 = 0x0400,
	DVD_Mix_3to1 = 0x0800,
	DVD_Mix_4to1 = 0x1000,
	DVD_Mix_Lto1 = 0x2000,
	DVD_Mix_Rto1 = 0x4000
} DVD_KARAOKE_DOWNMIX;
typedef enum tagDVD_MENU_ID {
	DVD_MENU_Title = 2,
	DVD_MENU_Root = 3,
	DVD_MENU_Subpicture = 4,
	DVD_MENU_Audio = 5,
	DVD_MENU_Angle = 6,
	DVD_MENU_Chapter = 7
} DVD_MENU_ID;
typedef enum {
	DVD_ResetOnStop = 1,
	DVD_NotifyParentalLevelChange = 2,
	DVD_HMSF_TimeCodeEvents = 3,
	DVD_AudioDuringFFwdRew = 4,
	DVD_EnableNonblockingAPIs = 5,
	DVD_CacheSizeInMB = 6,
	DVD_EnablePortableBookmarks = 7
} DVD_OPTION_FLAG;
typedef enum tagDVD_PARENTAL_LEVEL {
	DVD_PARENTAL_LEVEL_8 = 0x8000,
	DVD_PARENTAL_LEVEL_7 = 0x4000,
	DVD_PARENTAL_LEVEL_6 = 0x2000,
	DVD_PARENTAL_LEVEL_5 = 0x1000,
	DVD_PARENTAL_LEVEL_4 = 0x0800,
	DVD_PARENTAL_LEVEL_3 = 0x0400,
	DVD_PARENTAL_LEVEL_2 = 0x0200,
	DVD_PARENTAL_LEVEL_1 = 0x0100
} DVD_PARENTAL_LEVEL;
typedef enum tagDVD_PREFERRED_DISPLAY_MODE {
	DISPLAY_CONTENT_DEFAULT = 0,
	DISPLAY_16x9 = 1,
	DISPLAY_4x3_PANSCAN_PREFERRED = 2,
	DISPLAY_4x3_LETTERBOX_PREFERRED = 3
} DVD_PREFERRED_DISPLAY_MODE;
typedef enum tagDVD_RELATIVE_BUTTON {
	DVD_Relative_Upper = 1,
	DVD_Relative_Lower = 2,
	DVD_Relative_Left = 3,
	DVD_Relative_Right = 4
} DVD_RELATIVE_BUTTON;
typedef enum tagDVD_SUBPICTURE_LANG_EXT {
	DVD_SP_EXT_NotSpecified = 0,
	DVD_SP_EXT_Caption_Normal = 1,
	DVD_SP_EXT_Caption_Big = 2,
	DVD_SP_EXT_Caption_Children = 3,
	DVD_SP_EXT_CC_Normal = 5,
	DVD_SP_EXT_CC_Big = 6,
	DVD_SP_EXT_CC_Children = 7,
	DVD_SP_EXT_Forced = 9,
	DVD_SP_EXT_DirectorComments_Normal = 13,
	DVD_SP_EXT_DirectorComments_Big = 14,
	DVD_SP_EXT_DirectorComments_Children = 15
} DVD_SUBPICTURE_LANG_EXT;
typedef enum tagDVD_SUBPICTURE_TYPE {
	DVD_SPType_NotSpecified = 0,
	DVD_SPType_Language = 1,
	DVD_SPType_Other = 2
} DVD_SUBPICTURE_TYPE;
typedef enum tagDVD_SUBPICTURE_CODING {
	DVD_SPCoding_RunLength = 0,
	DVD_SPCoding_Extended = 1,
	DVD_SPCoding_Other = 2
} DVD_SUBPICTURE_CODING;
enum DVD_TextCharSet {
	DVD_CharSet_Unicode = 0,
	DVD_CharSet_ISO646 = 1,
	DVD_CharSet_JIS_Roman_Kanji = 2,
	DVD_CharSet_ISO8859_1 = 3,
	DVD_CharSet_ShiftJIS_Kanji_Roman_Katakana = 4
};
enum DVD_TextStringType {
	DVD_Struct_Volume = 0x01,
	DVD_Struct_Title = 0x02,
	DVD_Struct_ParentalID = 0x03,
	DVD_Struct_PartOfTitle = 0x04,
	DVD_Struct_Cell = 0x05,
	DVD_Stream_Audio = 0x10,
	DVD_Stream_Subpicture = 0x11,
	DVD_Stream_Angle = 0x12,
	DVD_Channel_Audio = 0x20,
	DVD_General_Name = 0x30,
	DVD_General_Comments = 0x31,
	DVD_Title_Series = 0x38,
	DVD_Title_Movie = 0x39,
	DVD_Title_Video = 0x3a,
	DVD_Title_Album = 0x3b,
	DVD_Title_Song = 0x3c,
	DVD_Title_Other = 0x3f,
	DVD_Title_Sub_Series = 0x40,
	DVD_Title_Sub_Movie = 0x41,
	DVD_Title_Sub_Video = 0x42,
	DVD_Title_Sub_Album = 0x43,
	DVD_Title_Sub_Song = 0x44,
	DVD_Title_Sub_Other = 0x47,
	DVD_Title_Orig_Series = 0x48,
	DVD_Title_Orig_Movie = 0x49,
	DVD_Title_Orig_Video = 0x4a,
	DVD_Title_Orig_Album = 0x4b,
	DVD_Title_Orig_Song = 0x4c,
	DVD_Title_Orig_Other = 0x4f,
	DVD_Other_Scene = 0x50,
	DVD_Other_Cut = 0x51,
	DVD_Other_Take = 0x52
};
typedef enum tagDVD_TIMECODE_FLAGS {
	DVD_TC_FLAG_25fps = 0x00000001,
	DVD_TC_FLAG_30fps = 0x00000002,
	DVD_TC_FLAG_DropFrame = 0x00000004,
	DVD_TC_FLAG_Interpolated = 0x00000008
} DVD_TIMECODE_FLAGS;
typedef enum tagDVD_TITLE_APPMODE {
	DVD_AppMode_Not_Specified = 0,
	DVD_AppMode_Karaoke = 1,
	DVD_AppMode_Other = 3 
} DVD_TITLE_APPMODE;
typedef enum tagDVD_VIDEO_COMPRESSION {
	DVD_VideoCompression_Other = 0,
	DVD_VideoCompression_MPEG1 = 1,
	DVD_VideoCompression_MPEG2 = 2 
} DVD_VIDEO_COMPRESSION;
typedef enum _DVDECODERRESOLUTION {
	DVDECODERRESOLUTION_720x480 = 1000,
	DVDECODERRESOLUTION_360x240 = 1001,
	DVDECODERRESOLUTION_180x120 = 1002,
	DVDECODERRESOLUTION_88x60 = 1003
} DVDECODERRESOLUTION;
typedef enum _DVRESOLUTION {
	DVRESOLUTION_FULL = 1000,
	DVRESOLUTION_HALF = 1001,
	DVRESOLUTION_QUARTER = 1002,
	DVRESOLUTION_DC = 1003
} DVRESOLUTION;
typedef enum _DVENCODERFORMAT {
	DVENCODERFORMAT_DVSD = 2007,
	DVENCODERFORMAT_DVHD = 2008,
	DVENCODERFORMAT_DVSL = 2009
} DVENCODERFORMAT;
typedef enum _DVENCODERRESOLUTION {
	DVENCODERRESOLUTION_720x480 = 2012,
	DVENCODERRESOLUTION_360x240 = 2013,
	DVENCODERRESOLUTION_180x120 = 2014,
	DVENCODERRESOLUTION_88x60 = 2015
} DVENCODERRESOLUTION;
typedef enum _DVENCODERVIDEOFORMAT {
	DVENCODERVIDEOFORMAT_NTSC = 2000,
	DVENCODERVIDEOFORMAT_PAL = 2001
} DVENCODERVIDEOFORMAT;
typedef enum _FilterState {
	State_Stopped,
	State_Paused,
	State_Running
} FILTER_STATE;
typedef enum {
	INTERLEAVE_NONE,
	INTERLEAVE_CAPTURE,
	INTERLEAVE_FULL,
	INTERLEAVE_NONE_BUFFERED
} InterleavingMode;
typedef enum {
	PhysConn_Video_Tuner = 1,
	PhysConn_Video_Composite,
	PhysConn_Video_SVideo,
	PhysConn_Video_RGB,
	PhysConn_Video_YRYBY,
	PhysConn_Video_SerialDigital,
	PhysConn_Video_ParallelDigital,
	PhysConn_Video_SCSI,
	PhysConn_Video_AUX,
	PhysConn_Video_1394,
	PhysConn_Video_USB,
	PhysConn_Video_VideoDecoder,
	PhysConn_Video_VideoEncoder,
	PhysConn_Video_SCART,
	PhysConn_Video_Black,
	PhysConn_Audio_Tuner = 4096,
	PhysConn_Audio_Line,
	PhysConn_Audio_Mic,
	PhysConn_Audio_AESDigital,
	PhysConn_Audio_SPDIFDigital,
	PhysConn_Audio_SCSI,
	PhysConn_Audio_AUX,
	PhysConn_Audio_1394,
	PhysConn_Audio_USB,
	PhysConn_Audio_AudioDecoder
} PhysicalConnectorType;
typedef enum _PinDirection {
	PINDIR_INPUT,
	PINDIR_OUTPUT
} PIN_DIRECTION;
typedef enum {
	Famine,
	Flood
} QualityMessageType;
enum {
	REG_PINFLAG_B_ZERO = 0x1,
	REG_PINFLAG_B_RENDERER = 0x2,
	REG_PINFLAG_B_MANY = 0x4,
	REG_PINFLAG_B_OUTPUT = 0x8
} REG_PINFLAG;
typedef enum _REM_FILTER_FLAGS {
	REMFILTERF_LEAVECONNECTED = 0x00000001
} REM_FILTER_FLAGS;
typedef enum {
	TunerInputCable,
	TunerInputAntenna
} TunerInputType;
typedef enum tagTVAudioMode {
	AMTVAUDIO_MODE_MONO = 0x0001,
	AMTVAUDIO_MODE_STEREO = 0x0002,
	AMTVAUDIO_MODE_LANG_A = 0x0010,
	AMTVAUDIO_MODE_LANG_B = 0x0020,
	AMTVAUDIO_MODE_LANG_C = 0x0040,
	AMTVAUDIO_PRESET_STEREO = 0x0200,
	AMTVAUDIO_PRESET_LANG_A = 0x1000,
	AMTVAUDIO_PRESET_LANG_B = 0x2000,
	AMTVAUDIO_PRESET_LANG_C = 0x4000
} TVAudioMode;
typedef enum {
	UOP_FLAG_Play_Title_Or_AtTime = 0x00000001,
	UOP_FLAG_Play_Chapter = 0x00000002,
	UOP_FLAG_Play_Title = 0x00000004,
	UOP_FLAG_Stop = 0x00000008,
	UOP_FLAG_ReturnFromSubMenu = 0x00000010,
	UOP_FLAG_Play_Chapter_Or_AtTime = 0x00000020,
	UOP_FLAG_PlayPrev_Or_Replay_Chapter = 0x00000040,
	UOP_FLAG_PlayNext_Chapter = 0x00000080,
	UOP_FLAG_Play_Forwards = 0x00000100,
	UOP_FLAG_Play_Backwards = 0x00000200,
	UOP_FLAG_ShowMenu_Title = 0x00000400,
	UOP_FLAG_ShowMenu_Root = 0x00000800,
	UOP_FLAG_ShowMenu_SubPic = 0x00001000,
	UOP_FLAG_ShowMenu_Audio = 0x00002000,
	UOP_FLAG_ShowMenu_Angle = 0x00004000,
	UOP_FLAG_ShowMenu_Chapter = 0x00008000,
	UOP_FLAG_Resume = 0x00010000,
	UOP_FLAG_Select_Or_Activate_Button = 0x00020000,
	UOP_FLAG_Still_Off = 0x00040000,
	UOP_FLAG_Pause_On = 0x00080000,
	UOP_FLAG_Select_Audio_Stream = 0x00100000,
	UOP_FLAG_Select_SubPic_Stream = 0x00200000,
	UOP_FLAG_Select_Angle = 0x00400000,
	UOP_FLAG_Select_Karaoke_Audio_Presentation_Mode = 0x00800000,
	UOP_FLAG_Select_Video_Mode_Preference = 0x01000000
} VALID_UOP_FLAG;
typedef enum {
	VfwCaptureDialog_Source = 0x01,
	VfwCaptureDialog_Format = 0x02,
	VfwCaptureDialog_Display = 0x04
} VfwCaptureDialogs;
typedef enum {
	VfwCompressDialog_Config = 0x01,
	VfwCompressDialog_About = 0x02,
	VfwCompressDialog_QueryConfig = 0x04,
	VfwCompressDialog_QueryAbout = 0x08
} VfwCompressDialogs;
typedef enum tagVideoControlFlags {
	VideoControlFlag_FlipHorizontal = 0x0001,
	VideoControlFlag_FlipVertical = 0x0002,
	VideoControlFlag_ExternalTriggerEnable = 0x0004,
	VideoControlFlag_Trigger = 0x0008
} VideoControlFlags;
typedef enum {
	ConstantBitRate = 0,
	VariableBitRateAverage,
	VariableBitRatePeak
} VIDEOENCODER_BITRATE_MODE;
typedef enum tagVideoProcAmpFlags {
	VideoProcAmp_Flags_Auto = 0x0001,
	VideoProcAmp_Flags_Manual = 0x0002
} VideoProcAmpFlags;
typedef enum tagVideoProcAmpProperty {
	VideoProcAmp_Brightness,
	VideoProcAmp_Contrast,
	VideoProcAmp_Hue,
	VideoProcAmp_Saturation,
	VideoProcAmp_Sharpness,
	VideoProcAmp_Gamma,
	VideoProcAmp_ColorEnable,
	VideoProcAmp_WhiteBalance,
	VideoProcAmp_BacklightCompensation,
	VideoProcAmp_Gain
} VideoProcAmpProperty;
enum VMR_ASPECT_RATIO_MODE {
	VMR_ARMODE_NONE,
	VMR_ARMODE_LETTER_BOX
};
typedef enum {
	DeinterlacePref_NextBest = 0x01,
	DeinterlacePref_BOB = 0x02,
	DeinterlacePref_Weave = 0x04,
	DeinterlacePref_Mask = 0x07
} VMRDeinterlacePrefs;
typedef enum {
	DeinterlaceTech_Unknown = 0x0000,
	DeinterlaceTech_BOBLineReplicate = 0x0001,
	DeinterlaceTech_BOBVerticalStretch = 0x0002,
	DeinterlaceTech_MedianFiltering = 0x0004,
	DeinterlaceTech_EdgeFiltering = 0x0010,
	DeinterlaceTech_FieldAdaptive = 0x0020,
	DeinterlaceTech_PixelAdaptive = 0x0040,
	DeinterlaceTech_MotionVectorSteered = 0x0080
} VMRDeinterlaceTech;
typedef enum {
	MixerPref_NoDecimation = 0x00000001,
	MixerPref_DecimateOutput = 0x00000002,
	MixerPref_ARAdjustXorY = 0x00000004,
	MixerPref_DecimationReserved = 0x00000008,
	MixerPref_DecimateMask = 0x0000000F,
	MixerPref_BiLinearFiltering = 0x00000010,
	MixerPref_PointFiltering = 0x00000020,
	MixerPref_FilteringMask = 0x000000F0,
	MixerPref_RenderTargetRGB = 0x00000100,
	MixerPref_RenderTargetYUV = 0x00001000,
	MixerPref_RenderTargetYUV420 = 0x00000200,
	MixerPref_RenderTargetYUV422 = 0x00000400,
	MixerPref_RenderTargetYUV444 = 0x00000800,
	MixerPref_RenderTargetReserved = 0x0000E000,
	MixerPref_RenderTargetMask = 0x0000FF00,
	MixerPref_DynamicSwitchToBOB = 0x00010000,
	MixerPref_DynamicDecimateBy2 = 0x00020000,
	MixerPref_DynamicReserved = 0x000C0000,
	MixerPref_DynamicMask = 0x000F0000
} VMRMixerPrefs;
enum VMRMode {
	VMRMode_Windowed = 0x00000001,
	VMRMode_Windowless = 0x00000002,
	VMRMode_Renderless = 0x00000004,
	VMRMode_Mask = 0x00000007
};
typedef enum {
	VMRSample_SyncPoint = 0x00000001,
	VMRSample_Preroll = 0x00000002,
	VMRSample_Discontinuity = 0x00000004,
	VMRSample_TimeValid = 0x00000008
} VMRPresentationFlags;
typedef enum {
	RenderPrefs_ForceOffscreen = 0x00000001,
	RenderPrefs_ForceOverlays = 0x00000002,
	RenderPrefs_AllowOverlays = 0x00000000,
	RenderPrefs_AllowOffscreen = 0x00000000,
	RenderPrefs_DoNotRenderColorKeyAndBorder = 0x00000008,
	RenderPrefs_RestrictToInitialMonitor = 0x00000010,
	RenderPrefs_PreferAGPMemWhenMixing = 0x00000020,
	RenderPrefs_Mask = 0x0000003f
} VMRRenderPrefs;
typedef enum {
	AMAP_PIXELFORMAT_VALID = 0x01,
	AMAP_3D_TARGET = 0x02,
	AMAP_ALLOW_SYSMEM = 0x04,
	AMAP_FORCE_SYSMEM = 0x08,
	AMAP_DIRECTED_FLIP = 0x10,
	AMAP_DXVA_TARGET = 0x20
} VMRSurfaceAllocationFlags;
/*--- DirectShow Reference - DirectShow Structures */
typedef struct _AllocatorProperties {
	long cBuffers;
	long cbBuffer;
	long cbAlign;
	long cbPrefix;
} ALLOCATOR_PROPERTIES;
typedef struct {
	HRESULT hrVPEStatus;
	BOOL bDvdVolInvalid;
	BOOL bDvdVolUnknown;
	BOOL bNoLine21In;
	BOOL bNoLine21Out;
	int iNumStreams;
	int iNumStreamsFailed;
	DWORD dwFailedStreamsFlag;
} AM_DVD_RENDERSTATUS;
typedef struct _AMCOPPCommand {
	GUID macKDI;
	GUID guidCommandID;
	DWORD dwSequence;
	DWORD cbSizeData;
	BYTE CommandData[4056];
} AMCOPPCommand,*LPAMCOPPCommand;
typedef struct _AMCOPPSignature {
	BYTE Signature[256];
} AMCOPPSignature;
typedef struct _AMCOPPStatusInput {
	GUID rApp;
	GUID guidStatusRequestID;
	DWORD dwSequence;
	DWORD cbSizeData;
	BYTE StatusData[4056];
} AMCOPPStatusInput,*LPAMCOPPStatusInput;
typedef struct _AMCOPPStatusOutput {
	GUID macKDI;
	DWORD cbSizeData;
	BYTE COPPStatus[4076];
} AMCOPPStatusOutput,*LPAMCOPPStatusOutput;
typedef struct _AMMediaType {
	GUID majortype;
	GUID subtype;
	BOOL bFixedSizeSamples;
	BOOL bTemporalCompression;
	ULONG lSampleSize;
	GUID formattype;
	IUnknown *pUnk;
	ULONG cbFormat;
	BYTE *pbFormat;
} AM_MEDIA_TYPE;
typedef struct tagAM_SAMPLE2_PROPERTIES {
	DWORD cbData;
	DWORD dwTypeSpecificFlags;
	DWORD dwSampleFlags;
	LONG lActual;
	REFERENCE_TIME tStart;
	REFERENCE_TIME tStop;
	DWORD dwStreamId;
	AM_MEDIA_TYPE *pMediaType;
	BYTE *pbBuffer;
	LONG cbBuffer;
} AM_SAMPLE2_PROPERTIES;
typedef struct {
	REFERENCE_TIME tStart;
	REFERENCE_TIME tStop;
	DWORD dwStartCookie;
	DWORD dwStopCookie;
	DWORD dwFlags;
} AM_STREAM_INFO;
typedef struct {
	const CLSID *clsMajorType;
	const CLSID *clsMinorType;
} REGPINTYPES;
typedef REGPINTYPES AMOVIESETUP_MEDIATYPE,*PAMOVIESETUP_MEDIATYPE,*LPAMOVIESETUP_MEDIATYPE;
typedef struct {
	LPWSTR strName;
	BOOL bRendered;
	BOOL bOutput;
	BOOL bZero;
	BOOL bMany;
	const CLSID *clsConnectsToFilter;
	const WCHAR *strConnectsToPin;
	UINT nMediaTypes;
	const REGPINTYPES *lpMediaType;
} REGFILTERPINS;
typedef REGFILTERPINS AMOVIESETUP_PIN,*PAMOVIESETUP_PIN,*LPAMOVIESETUP_PIN;
typedef struct _AMOVIESETUP_FILTER {
	const CLSID *clsID;
	const WCHAR *strName;
	DWORD dwMerit;
	UINT nPins;
	const AMOVIESETUP_PIN *lpPin;
} AMOVIESETUP_FILTER,*PAMOVIESETUP_FILTER,*LPAMOVIESETUP_FILTER;
typedef struct _AUDIO_STREAM_CONFIG_CAPS {
	GUID guid;
	ULONG MinimumChannels;
	ULONG MaximumChannels;
	ULONG ChannelsGranularity;
	ULONG MinimumBitsPerSample;
	ULONG MaximumBitsPerSample;
	ULONG BitsPerSampleGranularity;
	ULONG MinimumSampleFrequency;
	ULONG MaximumSampleFrequency;
	ULONG SampleFrequencyGranularity;
} AUDIO_STREAM_CONFIG_CAPS;
struct CodecAPIEventData {
	GUID guid;
	DWORD dataLength;
	DWORD reserved[3];
};
typedef struct tagCOLORKEY {
	DWORD KeyType;
	DWORD PaletteIndex;
	COLORREF LowColorValue;
	COLORREF HighColorValue;
} COLORKEY;
#define CK_NOCOLORKEY 0x00000000
#define CK_INDEX 0x00000001
#define CK_RGB 0x00000002
typedef struct {
	DWORD dw1;
	DWORD dw2;
} DDCOLORKEY,*LPDDCOLORKEY;
typedef struct tagDVD_AudioAttributes {
	DVD_AUDIO_APPMODE AppMode;
	DVD_AUDIO_FORMAT AudioFormat; 
	LCID Language;
	DVD_AUDIO_LANG_EXT LanguageExtension;
	BOOL fHasMultichannelInfo; 
	DWORD dwFrequency;
	BYTE bQuantization;
	BYTE bNumberOfChannels;
	DWORD dwReserved[2];
} DVD_AudioAttributes;
typedef struct tagDVD_DECODER_CAPS {
	DWORD dwSize;
	DWORD dwAudioCaps;
	double dFwdMaxRateVideo;
	double dFwdMaxRateAudio;
	double dFwdMaxRateSP;
	double dBwdMaxRateVideo; 
	double dBwdMaxRateAudio;
	double dBwdMaxRateSP;
	DWORD dwRes1;
	DWORD dwRes2;
	DWORD dwRes3;
	DWORD dwRes4;
} DVD_DECODER_CAPS;
#define DVD_AUDIO_CAPS_AC3 0x00000001
#define DVD_AUDIO_CAPS_MPEG2 0x00000002
#define DVD_AUDIO_CAPS_LPCM 0x00000004
#define DVD_AUDIO_CAPS_DTS 0x00000008
#define DVD_AUDIO_CAPS_SDDS 0x00000010
typedef struct tagDVD_HMSF_TIMECODE {
	BYTE bHours;
	BYTE bMinutes;
	BYTE bSeconds;
	BYTE bFrames;
} DVD_HMSF_TIMECODE;
typedef struct tagDVD_KaraokeAttributes {
	BYTE bVersion;
	BOOL fMasterOfCeremoniesInGuideVocal1;
	BOOL fDuet;
	DVD_KARAOKE_ASSIGNMENT ChannelAssignment;
	WORD wChannelContents[8];
} DVD_KaraokeAttributes;
typedef struct tagDVD_MUA_Coeff {
	double log2_alpha;
	double log2_beta;
} DVD_MUA_Coeff;
typedef struct tagDVD_MUA_MixingInfo {
	BOOL fMixTo0;
	BOOL fMixTo1;
	BOOL fMix0InPhase;
	BOOL fMix1InPhase;
	DWORD dwSpeakerPosition;
} DVD_MUA_MixingInfo;
#define KSAUDIO_SPEAKER_LEFT 0x00000001
#define KSAUDIO_SPEAKER_RIGHT 0x00000002
#define KSAUDIO_SPEAKER_CENTER 0x00000004
#define KSAUDIO_SPEAKER_SURROUND_LEFT 0x00000008
#define KSAUDIO_SPEAKER_SURROUND_RIGHT 0x00000010
#define KSAUDIO_SPEAKER_SUBWOOFER 0x00000020
#define KSAUDIO_SPEAKER_LEFT_OF_CENTER 0x00000040
#define KSAUDIO_SPEAKER_RIGHT_OF_CENTER 0x00000080
#define KSAUDIO_SPEAKER_SURROUND_MONO 0x00000100
#define KSAUDIO_SPEAKER_SIDE_LEFT 0x00000200
#define KSAUDIO_SPEAKER_SIDE_RIGHT 0x00000400
#define KSAUDIO_SPEAKER_TOP 0x00000800
typedef struct tagDVD_MultichannelAudioAttributes {
	DVD_MUA_MixingInfo Info[8];
	DVD_MUA_Coeff Coeff[8];
} DVD_MultichannelAudioAttributes;
typedef struct tagDVD_PLAYBACK_LOCATION {
	ULONG TitleNum;
	ULONG ChapterNum; 
	ULONG TimeCode;
} DVD_PLAYBACK_LOCATION;
typedef struct tagDVD_PLAYBACK_LOCATION2 {
	ULONG TitleNum;
	ULONG ChapterNum;
	DVD_HMSF_TIMECODE TimeCode;
	ULONG TimeCodeFlags;
} DVD_PLAYBACK_LOCATION2;
typedef struct tagDVD_SubpictureAttributes {
	DVD_SUBPICTURE_TYPE Type;
	DVD_SUBPICTURE_CODING CodingMode;
	LCID Language;
	DVD_SUBPICTURE_LANG_EXT LanguageExtension;
} DVD_SubpictureAttributes;
typedef struct tagDVD_TIMECODE {
	ULONG Hours1:4; 
	ULONG Hours10:4; 
	ULONG Minutes1:4; 
	ULONG Minutes10:4; 
	ULONG Seconds1:4; 
	ULONG Seconds10:4; 
	ULONG Frames1:4; 
	ULONG Frames10:2; 
	ULONG FrameRateCode:2; 
} DVD_TIMECODE;
typedef struct tagDVD_VideoAttributes {
	BOOL fPanscanPermitted;
	BOOL fLetterboxPermitted;
	ULONG ulAspectX;
	ULONG ulAspectY;
	ULONG ulFrameRate;
	ULONG ulFrameHeight;
	DVD_VIDEO_COMPRESSION Compression;
	BOOL fLine21Field1InGOP;
	BOOL fLine21Field2InGOP;
	ULONG ulSourceResolutionX;
	ULONG ulSourceResolutionY;
	BOOL fIsSourceLetterboxed;
	BOOL fIsFilmMode;
} DVD_VideoAttributes;
struct tagDVD_MenuAttributes {
	BOOL fCompatibleRegion[8];
	DVD_VideoAttributes VideoAttributes;
	BOOL fAudioPresent;
	DVD_AudioAttributes AudioAttributes;
	BOOL fSubpicturePresent;
	DVD_SubpictureAttributes SubpictureAttributes;
} DVD_MenuAttributes;
typedef struct tagDVD_TitleMainAttributes {
	DVD_TITLE_APPMODE AppMode;
	DVD_VideoAttributes VideoAttributes;
	ULONG ulNumberOfAudioStreams;
	DVD_AudioAttributes AudioAttributes[8];
	DVD_MultichannelAudioAttributes MultichannelAudioAttributes[8];
	ULONG ulNumberOfSubpictureStreams;
	DVD_SubpictureAttributes SubpictureAttributes[32];
} DVD_TitleAttributes;
typedef struct tag_DVINFO {
	DWORD dwDVAAuxSrc;
	DWORD dwDVAAuxCtl;
	DWORD dwDVAAuxSrc1;
	DWORD dwDVAAuxCtl1;
	DWORD dwDVVAuxSrc;
	DWORD dwDVVAuxCtl;
	DWORD dwDVReserved[2];
} DVINFO,*PDVINFO;
/***************
#define MAX_FILTER_NAME 128
typedef struct _FilterInfo {
	WCHAR achName[MAX_FILTER_NAME]; 
	IFilterGraph *pGraph;
} FILTER_INFO;
***************/
typedef struct _NORMALIZEDRECT {
	float left;
	float top;
	float right;
	float bottom;
} NORMALIZEDRECT,*PNORMALIZEDRECT;
#define MAX_PIN_NAME 128
typedef struct _PinInfo {
	IBaseFilter *pFilter;
	PIN_DIRECTION dir;
	WCHAR achName[MAX_PIN_NAME];
} PIN_INFO;
typedef struct{ 
	QualityMessageType Type;
	long Proportion;
	REFERENCE_TIME Late;
	REFERENCE_TIME TimeStamp;
} Quality;
typedef struct {
	CLSID clsMedium;
	DWORD dw1;
	DWORD dw2;
} REGPINMEDIUM;
typedef struct {
	DWORD dwFlags;
	UINT cInstances;
	UINT nMediaTypes; 
	const REGPINTYPES *lpMediaType;
	UINT nMediums;
	const REGPINMEDIUM *lpMedium;
	const CLSID *clsPinCategory;
} REGFILTERPINS2;
typedef struct {
	DWORD dwVersion;
	DWORD dwMerit;
	union {
		struct {
			ULONG cPins;
			const REGFILTERPINS *rgPins;
		};
		struct {
			ULONG cPins2;
			const REGFILTERPINS2 *rgPins2;
		};
	};
} REGFILTER2;
typedef struct {
	ULONG stream_id;
	DWORD dwMediaSampleContent;
	ULONG ulSubstreamFilterValue;
	int iDataOffset;
} STREAM_ID_MAP;
#define MPEG2_PROGRAM_STREAM_MAP 0x00000000
#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001
#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002
#define MPEG2_PROGRAM_PACK_HEADER 0x00000003
#define MPEG2_PROGRAM_PES_STREAM 0x00000004
#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005
#define SUBSTREAM_FILTER_VAL_NONE 0x10000000
typedef struct tagTIMECODE {
	WORD wFrameRate;
	WORD wFrameFract;
	DWORD dwFrames;
} TIMECODE;
#define ED_FORMAT_SMPTE_30 0x00001196
#define ED_FORMAT_SMPTE_30DROP 0x00001197
#define ED_FORMAT_SMPTE_25 0x00001198
#define ED_FORMAT_SMPTE_24 0x00001199
typedef struct tagTIMECODE_SAMPLE {
	LONGLONG qwTick;
	TIMECODE timecode;
	DWORD dwUser;
	DWORD dwFlags;
} TIMECODE_SAMPLE;
/*#define AM_TIMECODE_FLAG_FCM */
/*#define AM_TIMECODE_FLAG_CF */
/*#define AM_TIMECODE_FLAG_FIELD */
/*#define AM_TIMECODE_FLAG_DF */
/*#define AM_TIMECODE_COLORFRAME */
/*#define AM_TIMECODE_COLORSEQUENCE */
/*#define AM_TIMECODE_FILMSEQUENCE_TYPE */
typedef struct _VIDEO_STREAM_CONFIG_CAPS {
	GUID guid;
	ULONG VideoStandard;
	SIZE InputSize;
	SIZE MinCroppingSize;
	SIZE MaxCroppingSize;
	int CropGranularityX;
	int CropGranularityY;
	int CropAlignX;
	int CropAlignY;
	SIZE MinOutputSize;
	SIZE MaxOutputSize;
	int OutputGranularityX;
	int OutputGranularityY;
	int StretchTapsX;
	int StretchTapsY;
	int ShrinkTapsX;
	int ShrinkTapsY;
	LONGLONG MinFrameInterval;
	LONGLONG MaxFrameInterval;
	LONG MinBitsPerSecond;
	LONG MaxBitsPerSecond;
} VIDEO_STREAM_CONFIG_CAPS;
typedef struct tagVMRALLOCATIONINFO {
	DWORD dwFlags;
	LPBITMAPINFOHEADER lpHdr;
	LPDDPIXELFORMAT lpPixFmt;
	SIZE szAspectRatio;
	DWORD dwMinBuffers;
	DWORD dwMaxBuffers;
	DWORD dwInterlaceFlags;
	SIZE szNativeSize;
} VMRALLOCATIONINFO;
/**********
typedef struct _VMRALPHABITMAP {
	DWORD dwFlags;
	HDC hdc;
	LPDIRECTDRAWSURFACE7 pDDS;
	RECT rSrc;
	NORMALIZEDRECT rDest;
	FLOAT fAlpha;
	COLORREF clrSrcKey;
} VMRALPHABITMAP,*PVMRALPHABITMAP;
**********/
#define VMRBITMAP_DISABLE 0x00000001
#define VMRBITMAP_HDC 0x00000002
#define VMRBITMAP_ENTIREDDS 0x00000004
#define VMRBITMAP_SRCCOLORKEY 0x00000008
#define VMRBITMAP_SRCRECT 0x00000010
typedef struct _VMRDeinterlaceCaps {
	DWORD dwSize;
	DWORD dwNumPreviousOutputFrames;
	DWORD dwNumForwardRefSamples;
	DWORD dwNumBackwardRefSamples;
	VMRDeinterlaceTech DeinterlaceTechnology;
} VMRDeinterlaceCaps;
typedef struct _VMRFrequency {
	DWORD dwNumerator;
	DWORD dwDenominator;
} VMRFrequency;
typedef struct tagVMRGUID {
	GUID *pGUID;
	GUID GUID;
} VMRGUID;
typedef struct tagVMRMONITORINFO {
	VMRGUID guid;
	RECT rcMonitor;
	HMONITOR hMon;
	DWORD dwFlags;
	wchar_t szDevice[32];
	wchar_t szDescription[256];
} VMRMONITORINFO;
/**********
typedef struct tagVMRPRESENTATIONINFO {
	DWORD dwFlags;
	LPDIRECTDRAWSURFACE7 lpSurf;
	REFERENCE_TIME rtStart;
	REFERENCE_TIME rtEnd;
	SIZE szAspectRatio;
	RECT rcSrc;
	RECT rcDst;
	DWORD dwTypeSpecificFlags;
	DWORD dwInterlaceFlags;
} VMRPRESENTATIONINFO;
**********/
typedef struct _VMRVideoDesc {
	DWORD dwSize;
	DWORD dwSampleWidth;
	DWORD dwSampleHeight;
	BOOL SingleFieldPerSample;
	DWORD dwFourCC;
	VMRFrequency InputSampleFreq;
	VMRFrequency OutputFrameFreq;
} VMRVideoDesc;
/**********
typedef struct _VMRVIDEOSTREAMINFO {
	LPDIRECTDRAWSURFACE7 pddsVideoSurface;
	DWORD dwWidth;
	DWORD dwHeight;
	DWORD dwStrmID;
	FLOAT fAlpha;
	DDCOLORKEY ddClrKey;
	NORMALIZEDRECT rNormal;
} VMRVIDEOSTREAMINFO;
**********/
/*--- DirectShow Reference - Interfaces */
EXTERN_C const IID IID_IAMAnalogVideoDecoder;
#define INTERFACE IAMAnalogVideoDecoder
DECLARE_INTERFACE_(IAMAnalogVideoDecoder, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,get_AvailableTVFormats)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,get_HorizontalLocked)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,get_NumberOfLines)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,get_OutputEnable)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,get_TVFormat)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,get_VCRHorizontalLocking)(THIS_ long*) PURE;
	STDMETHOD_(HRESULT,put_OutputEnable)(THIS_ long) PURE;
	STDMETHOD_(HRESULT,put_TVFormat)(THIS_ long) PURE;
	STDMETHOD_(HRESULT,put_VCRHorizontalLocking)(THIS_ long) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMAudioInputMixer;
#define INTERFACE IAMAudioInputMixer
DECLARE_INTERFACE_(IAMAudioInputMixer, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,get_Bass)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,get_BassRange)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,get_Enable)(THIS_ BOOL*) PURE;
	STDMETHOD_(HRESULT,get_Loudness)(THIS_ BOOL*) PURE;
	STDMETHOD_(HRESULT,get_MixLevel)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,get_Mono)(THIS_ BOOL*) PURE;
	STDMETHOD_(HRESULT,get_Pan)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,get_Treble)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,get_TrebleRange)(THIS_ double*) PURE;
	STDMETHOD_(HRESULT,put_Bass)(THIS_ double) PURE;
	STDMETHOD_(HRESULT,put_Enable)(THIS_ BOOL) PURE;
	STDMETHOD_(HRESULT,put_Loudness)(THIS_ BOOL) PURE;
	STDMETHOD_(HRESULT,put_MixLevel)(THIS_ double) PURE;
	STDMETHOD_(HRESULT,put_Mono)(THIS_ BOOL) PURE;
	STDMETHOD_(HRESULT,put_Pan)(THIS_ double) PURE;
	STDMETHOD_(HRESULT,put_Treble)(THIS_ double) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMAudioRendererStats;
#define INTERFACE IAMAudioRendererStats
DECLARE_INTERFACE_(IAMAudioRendererStats, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,GetStatParam)(THIS_ DWORD,DWORD*,DWORD*) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMBufferNegotiation;
#define INTERFACE IAMBufferNegotiation
DECLARE_INTERFACE_(IAMBufferNegotiation, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,GetAllocatorProperties)(THIS_ ALLOCATOR_PROPERTIES*) PURE;
	STDMETHOD_(HRESULT,SuggestAllocatorProperties)(THIS_ const ALLOCATOR_PROPERTIES*) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMCameraControl;
#define INTERFACE IAMCameraControl
DECLARE_INTERFACE_(IAMCameraControl, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,Get)(THIS_ long,long*,long*) PURE;
	STDMETHOD_(HRESULT,GetRange)(THIS_ long,long*,long*,long*,long*,long*) PURE;
	STDMETHOD_(HRESULT,Set)(THIS_ long,long,long) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMCertifiedOutputProtection;
#define INTERFACE IAMCertifiedOutputProtection
DECLARE_INTERFACE_(IAMCertifiedOutputProtection, IUnknown)
{
	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
	STDMETHOD_(ULONG,Release)(THIS) PURE;
	STDMETHOD_(HRESULT,KeyExchange)(THIS_ GUID*,BYTE**,DWORD*) PURE;
	STDMETHOD_(HRESULT,ProtectionCommand)(THIS_ const AMCOPPCommand*) PURE;
	STDMETHOD_(HRESULT,ProtectionStatus)(THIS_ const AMCOPPStatusInput*,AMCOPPStatusOutput*) PURE;
	STDMETHOD_(HRESULT,SessionSequenceStart)(THIS_ const AMCOPPSignature*) PURE;
};
#undef INTERFACE

/* NEW INTERFACES FOR DIRECTSHOW */
/* REFERENCE http://msdn.microsoft.com/en-us/library/dd390343(VS.85).aspx */
EXTERN_C const IID IID_IReferenceClock;
#define INTERFACE IReferenceClock
DECLARE_INTERFACE_(IReferenceClock, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, GetTime) (THIS_ REFERENCE_TIME*) PURE;
    STDMETHOD_(HRESULT, AdviseTime) (THIS_ REFERENCE_TIME, REFERENCE_TIME, HEVENT, DWORD*) PURE;
    STDMETHOD_(HRESULT, AdvisePeriodicTime) (THIS_ REFERENCE_TIME, REFERENCE_TIME, HSEMAPHORE, DWORD*) PURE;
    STDMETHOD_(HRESULT, Unadvise) (THIS_ DWORD ) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IPin;
#define INTERFACE IPin
DECLARE_INTERFACE_(IPin, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,Connect) (THIS_ IPin *, AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT,ReceiveConnection) (THIS_ IPin *, const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT,Disconnect) (THIS) PURE;
    STDMETHOD_(HRESULT,ConnectedTo) (THIS_ IPin **) PURE;
    STDMETHOD_(HRESULT,ConnectionMediaType) (THIS_ AM_MEDIA_TYPE * pmt) PURE;
    STDMETHOD_(HRESULT,QueryPinInfo) (THIS_ PIN_INFO *) PURE;
    STDMETHOD_(HRESULT,QueryDirection) (THIS_ PIN_DIRECTION *) PURE;
    STDMETHOD_(HRESULT,QueryId) (THIS_ unsigned short **) PURE;
    STDMETHOD_(HRESULT,QueryAccept) (THIS_ const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT,EnumMediaTypes) (THIS_ struct IEnumMediaTypes **) PURE;
    STDMETHOD_(HRESULT,QueryInternalConnections) (THIS_ IPin **, unsigned long *) PURE;
    STDMETHOD_(HRESULT,EndOfStream) (THIS) PURE;
    STDMETHOD_(HRESULT,BeginFlush) (THIS) PURE;
    STDMETHOD_(HRESULT,EndFlush) (THIS) PURE;
    STDMETHOD_(HRESULT,NewSegment) (THIS_ REFERENCE_TIME, REFERENCE_TIME, double) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IEnumPins;
#define INTERFACE IEnumPins
DECLARE_INTERFACE_(IEnumPins, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, Clone) (THIS_ struct IEnumPins** ) PURE;
    STDMETHOD_(HRESULT, Next) (THIS_ ULONG, struct IPin**, ULONG*) PURE;
    STDMETHOD_(VOID, Reset) (THIS) PURE;
    STDMETHOD_(HRESULT, Skip) (THIS_ ULONG) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IEnumMediaTypes;
#define INTERFACE IEnumMediaTypes
DECLARE_INTERFACE_(IEnumMediaTypes, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, Clone) (THIS_ struct IEnumMediaTypes** ) PURE;
    STDMETHOD_(HRESULT, Next) (THIS_ ULONG, AM_MEDIA_TYPE**, ULONG) PURE;
    STDMETHOD_(VOID, Reset) (THIS) PURE;
    STDMETHOD_(HRESULT, Skip) (THIS_ ULONG) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IBaseFilter;
#define INTERFACE IBaseFilter
DECLARE_INTERFACE_(IBaseFilter, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,GetClassID) (THIS_ CLSID * pClassID) PURE;
    STDMETHOD_(HRESULT,Stop) (THIS) PURE;
    STDMETHOD_(HRESULT,Pause) (THIS) PURE;
    STDMETHOD_(HRESULT,Run) (THIS_ REFERENCE_TIME tStart) PURE;
    STDMETHOD_(HRESULT,GetState) (THIS_ unsigned long, void *) PURE;
    STDMETHOD_(HRESULT,SetSyncSource) (THIS_ struct IReferenceClock*) PURE;
    STDMETHOD_(HRESULT,GetSyncSource) (THIS_ struct IReferenceClock**) PURE;
    STDMETHOD_(HRESULT,EnumPins) (THIS_ struct IEnumPins **) PURE;
    STDMETHOD_(HRESULT,FindPin) (THIS_ const unsigned short *, struct IPin *) PURE;
    STDMETHOD_(HRESULT,QueryFilterInfo) (THIS_ void *) PURE;
    STDMETHOD_(HRESULT,JoinFilterGraph) (THIS_ struct IFilterGraph *, const unsigned short *) PURE;
    STDMETHOD_(HRESULT,QueryVendorInfo) (THIS_ unsigned short **) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMTVTuner;
#define INTERFACE IAMTVTuner
DECLARE_INTERFACE_(IAMTVTuner, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,put_Channel) (THIS_ long, long, long) PURE;
    STDMETHOD_(HRESULT,get_Channel) (THIS_ long *, long *, long *) PURE;
    STDMETHOD_(HRESULT,ChannelMinMax) (THIS_ long *, long *) PURE;
    STDMETHOD_(HRESULT,put_CountryCode) (THIS_ long) PURE;
    STDMETHOD_(HRESULT,get_CountryCode) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,put_TuningSpace) (THIS_ long) PURE;
    STDMETHOD_(HRESULT,get_TuningSpace) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,Logon) (THIS_ HANDLE) PURE;
    STDMETHOD_(HRESULT,Logout) (IAMTVTuner *) PURE;
    STDMETHOD_(HRESULT,SignalPresen) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,put_Mode) (THIS_ AMTunerModeType) PURE;
    STDMETHOD_(HRESULT,get_Mode) (THIS_ AMTunerModeType *) PURE;
    STDMETHOD_(HRESULT,GetAvailableModes) (THIS_ long *) PURE;
/****** NOT IMPLEMENTED
    STDMETHOD_(HRESULT,RegisterNotificationCallBack) (THIS_ struct IAMTunerNotification*, long) PURE;
    STDMETHOD_(HRESULT,UnRegisterNotificationCallBack) (THIS_ struct IAMTunerNotification*) PURE;
*******/
    STDMETHOD_(HRESULT,get_AvailableTVFormats) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,get_TVFormat) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,AutoTune) (THIS_ long, long *) PURE;
    STDMETHOD_(HRESULT,StoreAutoTune) (IAMTVTuner *) PURE;
    STDMETHOD_(HRESULT,get_NumInputConnections) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,put_InputType) (THIS_ long, TunerInputType) PURE;
    STDMETHOD_(HRESULT,get_InputType) (THIS_ long, TunerInputType *) PURE;
    STDMETHOD_(HRESULT,put_ConnectInput) (THIS_ long) PURE;
    STDMETHOD_(HRESULT,get_ConnectInput) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,get_VideoFrequency) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT,get_AudioFrequency) (THIS_ long *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IMediaControl;
#define INTERFACE IMediaControl
DECLARE_INTERFACE_(IMediaControl, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*);
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,GetTypeInfoCount) (THIS_ UINT *) PURE;
    STDMETHOD_(HRESULT,GetTypeInfo) (THIS_ UINT, LCID, LPTYPEINFO *) PURE;
    STDMETHOD_(HRESULT,GetIDsOfNames) (THIS_ REFIID, LPOLESTR *, UINT, LCID,
                              DISPID *) PURE;
    STDMETHOD_(HRESULT,Invoke) (THIS_ DISPID, REFIID, LCID, WORD, DISPPARAMS*,
                       VARIANT *, EXCEPINFO *, UINT *) PURE;
    STDMETHOD_(HRESULT,Run) (THIS) PURE;
    STDMETHOD_(HRESULT,Pause) (THIS) PURE;
    STDMETHOD_(HRESULT,Stop) (THIS) PURE;
    STDMETHOD_(HRESULT,GetState) (THIS_ LONG, OAFilterState *) PURE;
    STDMETHOD_(HRESULT,RenderFile) (THIS_ BSTR) PURE;
    STDMETHOD_(HRESULT,AddSourceFilter) (THIS_ BSTR, LPDISPATCH *) PURE;
    STDMETHOD_(HRESULT,get_FilterCollection) (THIS_ LPDISPATCH *) PURE;
    STDMETHOD_(HRESULT,get_RegFilterCollection) (THIS_ LPDISPATCH *) PURE;
    STDMETHOD_(HRESULT,StopWhenReady) (IMediaControl *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IGraphBuilder;
#define INTERFACE IGraphBuilder
DECLARE_INTERFACE_(IGraphBuilder, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,AddFilter) (THIS_ IBaseFilter *, LPCWSTR) PURE;
    STDMETHOD_(HRESULT,RemoveFilter) (THIS_ IBaseFilter *) PURE;
    STDMETHOD_(HRESULT,EnumFilters) (THIS_ struct IEnumFilters **) PURE;
    STDMETHOD_(HRESULT,FindFilterByName) (THIS_ LPCWSTR, IBaseFilter **) PURE;
    STDMETHOD_(HRESULT,ConnectDirect) (THIS_ IPin *, IPin *, const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT,Reconnect) (THIS_ IPin *) PURE;
    STDMETHOD_(HRESULT,Disconnect) (THIS_ IPin *) PURE;
    STDMETHOD_(HRESULT,SetDefaultSyncSource) (IGraphBuilder *) PURE;
    STDMETHOD_(HRESULT,Connect) (THIS_ IPin *, IPin *) PURE;
    STDMETHOD_(HRESULT,Render) (THIS_ IPin *) PURE;
    STDMETHOD_(HRESULT,RenderFile) (THIS_ LPCWSTR, LPCWSTR) PURE;
    STDMETHOD_(HRESULT,AddSourceFilter) (THIS_ LPCWSTR, LPCWSTR, IBaseFilter **) PURE;
    STDMETHOD_(HRESULT,SetLogFile) (THIS_ DWORD_PTR) PURE;
    STDMETHOD_(HRESULT,Abort) (IGraphBuilder *) PURE;
    STDMETHOD_(HRESULT,ShouldOperationContinue) (IGraphBuilder *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IFileSinkFilter;
#define INTERFACE IFileSinkFilter
DECLARE_INTERFACE_(IFileSinkFilter, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*);
    STDMETHOD_(ULONG, AddRef) (THIS);
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,SetFileName) (THIS_  LPCOLESTR, const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT,GetCurFile) (THIS_  LPCOLESTR*, const AM_MEDIA_TYPE *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMCopyCaptureFileProgress;
#define INTERFACE IAMCopyCaptureFileProgress
DECLARE_INTERFACE_(IAMCopyCaptureFileProgress, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*);
    STDMETHOD_(ULONG, AddRef) (THIS);
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, Progress) (THIS_ int ) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_ICaptureGraphBuilder2;
#define INTERFACE ICaptureGraphBuilder2
DECLARE_INTERFACE_(ICaptureGraphBuilder2, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*);
    STDMETHOD_(ULONG, AddRef) (THIS);
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,SetFiltergraph) (THIS_ IGraphBuilder *) PURE;
    STDMETHOD_(HRESULT,GetFiltergraph) (THIS_ IGraphBuilder **) PURE;
    STDMETHOD_(HRESULT,SetOutputFileName) (THIS_ const GUID *, LPCOLESTR,
                                  IBaseFilter **, IFileSinkFilter**) PURE;
    STDMETHOD_(HRESULT,FindInterface) (THIS_ const GUID *, const GUID *,
                              IBaseFilter *, REFIID, void **) PURE;
    STDMETHOD_(HRESULT,RenderStream) (THIS_ const GUID *, const GUID *, IUnknown *,
                             IBaseFilter *, IBaseFilter *) PURE;
    STDMETHOD_(HRESULT,ControlStream) (THIS_ const GUID *, const GUID *,
                              IBaseFilter *, REFERENCE_TIME *,
                              REFERENCE_TIME *, WORD, WORD) PURE;
    STDMETHOD_(HRESULT,AllocCapFile) (THIS_ LPCOLESTR, DWORDLONG) PURE;
    STDMETHOD_(HRESULT,CopyCaptureFile) (THIS_ LPOLESTR, LPOLESTR, int,
                                struct IAMCopyCaptureFileProgress*) PURE;
    STDMETHOD_(HRESULT,FindPin) (THIS_ IUnknown *, PIN_DIRECTION, const GUID *,
                        const GUID *, BOOL, int, IPin **) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMCrossBar;
#define INTERFACE IAMCrossbar
DECLARE_INTERFACE_(IAMCrossbar, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT,get_PinCounts) (THIS_ long *, long *) PURE;
    STDMETHOD_(HRESULT,CanRoute) (THIS_ long, long) PURE;
    STDMETHOD_(HRESULT,Route) (THIS_ long, long) PURE;
    STDMETHOD_(HRESULT,get_IsRoutedTo) (THIS_ long, long *) PURE;
    STDMETHOD_(HRESULT,get_CrossbarPinInfo) (THIS_ BOOL, long, long *, long *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMStreamConfig;
#define INTERFACE IAMStreamConfig
DECLARE_INTERFACE_(IAMStreamConfig, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, SetFormat) (THIS_ AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT, GetFormat) (THIS_ AM_MEDIA_TYPE **) PURE;
    STDMETHOD_(HRESULT, GetNumberOfCapabilities) (THIS_ int *,int *) PURE;
    STDMETHOD_(HRESULT, GetStreamCaps) (THIS_ int,AM_MEDIA_TYPE **, BYTE *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMVideoProcAmp;
#define INTERFACE IAMVideoProcAmp
DECLARE_INTERFACE_(IAMVideoProcAmp, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, GetRange) (THIS_ long, long *, long *, long *, long *,long *) PURE;
    STDMETHOD_(HRESULT, Set) (THIS_ long, long, long) PURE;
    STDMETHOD_(HRESULT, Get) (THIS_ long, long *, long *) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IAMTVAudio;
#define INTERFACE IAMTVAudio
DECLARE_INTERFACE_(IAMTVAudio, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, GetHardwareSupportedTVAudioModes) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, GetAvailableTVAudioModes) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, get_TVAudioMode) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_TVAudioMode) (THIS_ long) PURE;
/****** NOT IMPLEMENTED
    STDMETHOD_(HRESULT, RegisterNotificationCallBack) (THIS_ struct IAMTunerNotification*, long) PURE;
    STDMETHOD_(HRESULT, UnRegisterNotificationCallBack) (THIS_ struct IAMTunerNotification*) PURE;
*******/
};
#undef INTERFACE

EXTERN_C const IID IID_ISampleGrabberCB;
#define INTERFACE ISampleGrabberCB
DECLARE_INTERFACE_(ISampleGrabberCB, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, SampleCB) (THIS_ double, struct IMediaSample *) PURE;
    STDMETHOD_(HRESULT, BufferCB) (THIS_ double, BYTE *, long) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_ISampleGrabber;
#define INTERFACE ISampleGrabber
DECLARE_INTERFACE_(ISampleGrabber, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, SetOneShot) (THIS_ BOOL) PURE;
    STDMETHOD_(HRESULT, SetMediaType) (THIS_ const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT, GetConnectedMediaType) (THIS_ AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT, SetBufferSamples) (THIS_ BOOL) PURE;
    STDMETHOD_(HRESULT, GetCurrentBuffer) (THIS_ long *, long *) PURE;
    STDMETHOD_(HRESULT, GetCurrentSample) (THIS_ struct IMediaSample **) PURE;
    STDMETHOD_(HRESULT, SetCallback) (THIS_ ISampleGrabberCB *, long) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IFilterGraph;
#define INTERFACE IFilterGraph
DECLARE_INTERFACE_(IFilterGraph, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, AddFilter) (THIS_ struct IBaseFilter *, LPCWSTR) PURE;
    STDMETHOD_(HRESULT, RemoveFilter) (THIS_ struct IBaseFilter *) PURE;
    STDMETHOD_(HRESULT, EnumFilters) (THIS_ struct IEnumFilters **) PURE;
    STDMETHOD_(HRESULT, FindFilterByName) (THIS_ LPCWSTR, struct IBaseFilter **) PURE;
    STDMETHOD_(HRESULT, ConnectDirect) (THIS_ IPin *, IPin *, const AM_MEDIA_TYPE *) PURE;
    STDMETHOD_(HRESULT, Reconnect) (THIS_ struct IPin *) PURE;
    STDMETHOD_(HRESULT, Disconnect) (THIS_ struct IPin *) PURE;
    STDMETHOD_(HRESULT, SetDefaultSyncSource) (THIS) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IMediaSample;
#define INTERFACE IMediaSample
DECLARE_INTERFACE_(IMediaSample, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, GetPointer )(THIS_ unsigned char** ) PURE;
    STDMETHOD_(LONG,GetSize )(THIS) PURE;
    STDMETHOD_(HRESULT, GetTime )(THIS_ REFERENCE_TIME* ,REFERENCE_TIME* ) PURE;
    STDMETHOD_(HRESULT, SetTime )(THIS_ REFERENCE_TIME* ,REFERENCE_TIME* ) PURE;
    STDMETHOD_(HRESULT, IsSyncPoint )(THIS) PURE;
    STDMETHOD_(HRESULT, SetSyncPoint )(THIS_ long ) PURE;
    STDMETHOD_(HRESULT, IsPreroll )(THIS) PURE;
    STDMETHOD_(HRESULT, SetPreroll )(THIS_ long ) PURE;
    STDMETHOD_(LONG,GetActualDataLength)(THIS) PURE;
    STDMETHOD_(HRESULT, SetActualDataLength )(THIS_ long ) PURE;
    STDMETHOD_(HRESULT, GetMediaType )(THIS_ AM_MEDIA_TYPE** ) PURE;
    STDMETHOD_(HRESULT, SetMediaType )(THIS_ AM_MEDIA_TYPE* ) PURE;
    STDMETHOD_(HRESULT, IsDiscontinuity )(THIS) PURE;
    STDMETHOD_(HRESULT, SetDiscontinuity )(THIS_ long ) PURE;
    STDMETHOD_(HRESULT, GetMediaTime )(THIS_ long long* ,long long* ) PURE;
    STDMETHOD_(HRESULT, SetMediaTime )(THIS_ long long* ,long long* ) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IMediaFilter;
#define INTERFACE IMediaFilter
DECLARE_INTERFACE_(IMediaFilter, IUnknown)
{
    STDMETHOD(QueryInterface) (THIS_ REFIID,PVOID*) PURE;
    STDMETHOD_(ULONG, AddRef) (THIS) PURE;
    STDMETHOD_(ULONG, Release) (THIS) PURE;
    STDMETHOD_(HRESULT, Stop) (THIS) PURE;
    STDMETHOD_(HRESULT, Pause) (THIS) PURE;
    STDMETHOD_(HRESULT, Run) (THIS_ REFERENCE_TIME) PURE;
    STDMETHOD_(HRESULT, GetState) (THIS_ DWORD, FILTER_STATE *) PURE;
    STDMETHOD_(HRESULT, SetSyncSource) (THIS_ IReferenceClock *) PURE;
    STDMETHOD_(HRESULT, GetSyncSource) (THIS_ IReferenceClock **) PURE;
};
#undef INTERFACE

EXTERN_C const IID IID_IVideoWindow;
#define INTERFACE IVideoWindow
DECLARE_INTERFACE_(IVideoWindow, IUnknown)
{
    STDMETHOD(QueryInterface )(THIS_ REFIID ,void **) PURE;
    STDMETHOD_(ULONG,AddRef )(THIS) PURE;
    STDMETHOD_(ULONG,Release )(THIS) PURE;
    STDMETHOD_(HRESULT, GetTypeInfoCount) (THIS_ UINT * ) PURE;
    STDMETHOD_(HRESULT, GetTypeInfo) (THIS_  UINT ,LCID , ITypeInfo ** ) PURE;
    STDMETHOD_(HRESULT, GetIDsOfNames) (THIS_  REFIID ,LPOLESTR * , UINT ,LCID , DISPID * ) PURE;
    STDMETHOD_(HRESULT, Invoke) (THIS_  DISPID ,REFIID , LCID , WORD ,void *, VARIANT * ,EXCEPINFO * , UINT * ) PURE;
    STDMETHOD_(HRESULT, put_Caption) (THIS_  BSTR ) PURE;
    STDMETHOD_(HRESULT, get_Caption) (THIS_  BSTR * ) PURE;
    STDMETHOD_(HRESULT, put_WindowStyle) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, get_WindowStyle) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_WindowStyleEx) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, get_WindowStyleEx) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_AutoShow) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_AutoShow) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_WindowState) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, get_WindowState) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_BackgroundPalette) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, get_BackgroundPalette) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_Visible) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_Visible) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_Left) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_Left) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_Width) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_Width) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_Top) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_Top) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_Height) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_Height) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_Owner) (THIS_  OAHWND ) PURE;
    STDMETHOD_(HRESULT, get_Owner) (THIS_  OAHWND * ) PURE;
    STDMETHOD_(HRESULT, put_MessageDrain) (THIS_  OAHWND ) PURE;
    STDMETHOD_(HRESULT, get_MessageDrain) (THIS_ OAHWND * ) PURE;
    STDMETHOD_(HRESULT, get_BorderColor) (THIS_  long *) PURE;
    STDMETHOD_(HRESULT, put_BorderColor) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, get_FullScreenMode) (THIS_ long *) PURE;
    STDMETHOD_(HRESULT, put_FullScreenMode) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, SetWindowForeground) (THIS_ long ) PURE;
    STDMETHOD_(HRESULT, NotifyOwnerMessage) (THIS_  OAHWND ,long , LONG_PTR ,LONG_PTR ) PURE;
    STDMETHOD_(HRESULT, SetWindowPosition) (THIS_  long ,long , long ,long ) PURE;
    STDMETHOD_(HRESULT, GetWindowPosition) (THIS_  long *,long *, long *,long *) PURE;
    STDMETHOD_(HRESULT, GetMinIdealImageSize) (THIS_ long *, long *) PURE;
    STDMETHOD_(HRESULT, GetMaxIdealImageSize) (THIS_ long *, long *) PURE;
    STDMETHOD_(HRESULT, GetRestorePosition) (THIS_  long *,long *, long *,long *) PURE;
    STDMETHOD_(HRESULT, HideCursor) (THIS_  long ) PURE;
    STDMETHOD_(HRESULT, IsCursorHidden) (THIS_ long *) PURE;
};

#ifdef __cplusplus
}
#endif
#endif
