view stream/tvi_dshow.h @ 35013:4d94558867d6

Update endpos each time libavformat asks for it. Fixes playback of still downloading files to not stop before we really reached the end.
author reimar
date Sat, 18 Aug 2012 19:51:58 +0000
parents ce0122361a39
children
line wrap: on
line source

/*
 * This file is part of MPlayer.
 *
 * MPlayer is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * MPlayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef MPLAYER_TVI_DSHOW_H
#define MPLAYER_TVI_DSHOW_H

/// \defgroup tvi_dshow TV driver (Directshow)

#define INITGUID
#include <inttypes.h>
#include <windows.h>
//#include <ole2.h>
#include <vfw.h>
#include "loader/dshow/mediatype.h"
#include "loader/dshow/guids.h"

#define wtoa(strW,strA,lenA) WideCharToMultiByte(0,0,strW,-1,strA,lenA,NULL,NULL)
#define atow(strA,strW,lenW) MultiByteToWideChar(0,0,strA,strlen(strA),strW,lenW)

typedef struct DISPPARAMS *LPDISPPARAMS;
typedef struct IFileSinkFilter *LPFILESINKFILTER;
typedef struct IAMCopyCaptureFileProgress *LPAMCOPYCAPTUREFILEPROGRESS;
typedef struct IErrorLog *LPERRORLOG;
typedef struct IAMTunerNotification *LPAMTUNERNOTIFICATION;
typedef struct IFilterGraph *LPFILTERGRAPH;
typedef struct IBaseFilter *LPBASEFILTER;
typedef struct IPin *LPPIN;
typedef struct IEnumPins *LPENUMPINS;
typedef struct IEnumFilters *LPENUMFILTERS;
typedef struct IEnumMediaTypes *LPENUMMEDIATYPES;
typedef struct IReferenceClock *LPREFERENCECLOCK;
typedef struct IMediaSample *LPMEDIASAMPLE;
typedef struct IVideoWindow *LPVIDEOWINDOW;

typedef struct
{
    long cBuffers;
    long cbBuffer;
    long cbAlign;
    long cbPrefix;
}ALLOCATOR_PROPERTIES;

typedef
    enum tagTunerInputType { TunerInputCable = 0,
    TunerInputAntenna = TunerInputCable + 1
} TunerInputType;
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;
enum tagAMTunerSubChannel { AMTUNER_SUBCHAN_NO_TUNE = -2,
    AMTUNER_SUBCHAN_DEFAULT = -1
} AMTunerSubChannel;
typedef enum tagVideoProcAmpProperty {
    VideoProcAmp_Brightness,
    VideoProcAmp_Contrast,
    VideoProcAmp_Hue,
    VideoProcAmp_Saturation,
    VideoProcAmp_Sharpness,
    VideoProcAmp_Gamma,
    VideoProcAmp_ColorEnable,
    VideoProcAmp_WhiteBalance,
    VideoProcAmp_BacklightCompensation,
    VideoProcAmp_Gain
} VideoProcAmpProperty;

typedef long OAFilterState;
typedef
    enum tagAnalogVideoStandard { AnalogVideo_None = 0,
    AnalogVideo_NTSC_M = 0x1,
    AnalogVideo_NTSC_M_J = 0x2,
    AnalogVideo_NTSC_433 = 0x4,
    AnalogVideo_PAL_B = 0x10,
    AnalogVideo_PAL_D = 0x20,
    AnalogVideo_PAL_G = 0x40,
    AnalogVideo_PAL_H = 0x80,
    AnalogVideo_PAL_I = 0x100,
    AnalogVideo_PAL_M = 0x200,
    AnalogVideo_PAL_N = 0x400,
    AnalogVideo_PAL_60 = 0x800,
    AnalogVideo_SECAM_B = 0x1000,
    AnalogVideo_SECAM_D = 0x2000,
    AnalogVideo_SECAM_G = 0x4000,
    AnalogVideo_SECAM_H = 0x8000,
    AnalogVideo_SECAM_K = 0x10000,
    AnalogVideo_SECAM_K1 = 0x20000,
    AnalogVideo_SECAM_L = 0x40000,
    AnalogVideo_SECAM_L1 = 0x80000
} AnalogVideoStandard;


typedef LONG_PTR OAHWND;
typedef enum tagPhysicalConnectorType { PhysConn_Video_Tuner = 1,
    PhysConn_Video_Composite = PhysConn_Video_Tuner + 1,
    PhysConn_Video_SVideo = PhysConn_Video_Composite + 1,
    PhysConn_Video_RGB = PhysConn_Video_SVideo + 1,
    PhysConn_Video_YRYBY = PhysConn_Video_RGB + 1,
    PhysConn_Video_SerialDigital = PhysConn_Video_YRYBY + 1,
    PhysConn_Video_ParallelDigital = PhysConn_Video_SerialDigital + 1,
    PhysConn_Video_SCSI = PhysConn_Video_ParallelDigital + 1,
    PhysConn_Video_AUX = PhysConn_Video_SCSI + 1,
    PhysConn_Video_1394 = PhysConn_Video_AUX + 1,
    PhysConn_Video_USB = PhysConn_Video_1394 + 1,
    PhysConn_Video_VideoDecoder = PhysConn_Video_USB + 1,
    PhysConn_Video_VideoEncoder = PhysConn_Video_VideoDecoder + 1,
    PhysConn_Video_SCART = PhysConn_Video_VideoEncoder + 1,
    PhysConn_Video_Black = PhysConn_Video_SCART + 1,
    PhysConn_Audio_Tuner = 0x1000,
    PhysConn_Audio_Line = PhysConn_Audio_Tuner + 1,
    PhysConn_Audio_Mic = PhysConn_Audio_Line + 1,
    PhysConn_Audio_AESDigital = PhysConn_Audio_Mic + 1,
    PhysConn_Audio_SPDIFDigital = PhysConn_Audio_AESDigital + 1,
    PhysConn_Audio_SCSI = PhysConn_Audio_SPDIFDigital + 1,
    PhysConn_Audio_AUX = PhysConn_Audio_SCSI + 1,
    PhysConn_Audio_1394 = PhysConn_Audio_AUX + 1,
    PhysConn_Audio_USB = PhysConn_Audio_1394 + 1,
    PhysConn_Audio_AudioDecoder = PhysConn_Audio_USB + 1
} PhysicalConnectorType;

typedef struct VIDEO_STREAM_CONFIG_CAPS {
    GUID guid;			// will be MEDIATYPE_Video
    ULONG VideoStandard;	// logical OR of all AnalogVideoStandards
    // supported
    SIZE InputSize;		// the inherent size of the incoming signal
    // (every pixel unique)
    SIZE MinCroppingSize;	// smallest rcSrc cropping rect allowed
    SIZE MaxCroppingSize;	// largest rcSrc cropping rect allowed
    int CropGranularityX;	// granularity of cropping size
    int CropGranularityY;
    int CropAlignX;		// alignment of cropping rect
    int CropAlignY;
    SIZE MinOutputSize;		// smallest bitmap stream can produce
    SIZE MaxOutputSize;		// largest  bitmap stream can produce
    int OutputGranularityX;	// granularity of output bitmap size
    int OutputGranularityY;
    int StretchTapsX;		// 0, no stretch, 1 pix dup, 2 interp, ...
    int StretchTapsY;		//    Describes quality of hardware scaler
    int ShrinkTapsX;		//
    int ShrinkTapsY;		//
    LONGLONG MinFrameInterval;	// 100 nS units
    LONGLONG MaxFrameInterval;
    LONG MinBitsPerSecond;
    LONG MaxBitsPerSecond;
} VIDEO_STREAM_CONFIG_CAPS, *PVIDEO_STREAM_CONFIG_CAPS;

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;

typedef enum tagVideoProcAmpFlags {
    VideoProcAmp_Flags_Auto = 0x0001,
    VideoProcAmp_Flags_Manual = 0x0002
} VideoProcAmpFlags;
typedef enum {
    PINDIR_INPUT = 0,
    PINDIR_OUTPUT
} PIN_DIRECTION;

#define KSPROPERTY_SUPPORT_GET  1
#define KSPROPERTY_SUPPORT_SET  2
typedef struct {
    GUID Set;
    ULONG Id;
    ULONG Flags;
} KSIDENTIFIER;

typedef KSIDENTIFIER KSPROPERTY;


typedef struct {
    KSPROPERTY Property;
    ULONG Mode;			// IN: KSPROPERTY_TUNER_MODE
    ULONG StandardsSupported;	// KS_AnalogVideo_* (if TV or DSS)
    ULONG MinFrequency;		// Hz
    ULONG MaxFrequency;		// Hz
    ULONG TuningGranularity;	// Hz
    ULONG NumberOfInputs;	// count of inputs
    ULONG SettlingTime;		// milliSeconds
    ULONG Strategy;		// KS_TUNER_STRATEGY
} KSPROPERTY_TUNER_MODE_CAPS_S, *PKSPROPERTY_TUNER_MODE_CAPS_S;

typedef struct {
    KSPROPERTY Property;
    ULONG Mode;			// IN: KSPROPERTY_TUNER_MODE
} KSPROPERTY_TUNER_MODE_S, *PKSPROPERTY_TUNER_MODE_S;

typedef struct {
    KSPROPERTY Property;
    ULONG Frequency;		// Hz
    ULONG LastFrequency;	// Hz (last known good)
    ULONG TuningFlags;		// KS_TUNER_TUNING_FLAGS
    ULONG VideoSubChannel;	// DSS
    ULONG AudioSubChannel;	// DSS
    ULONG Channel;		// VBI decoders
    ULONG Country;		// VBI decoders
} KSPROPERTY_TUNER_FREQUENCY_S, *PKSPROPERTY_TUNER_FREQUENCY_S;
typedef struct {
    KSPROPERTY Property;
    ULONG CurrentFrequency;
    ULONG PLLOffset;
    ULONG SignalStrength;
    ULONG Busy;
} KSPROPERTY_TUNER_STATUS_S, *PKSPROPERTY_TUNER_STATUS_S;
typedef enum {
    KS_TUNER_TUNING_EXACT = 1,	// No fine tuning
    KS_TUNER_TUNING_FINE,	// Fine grained search
    KS_TUNER_TUNING_COARSE,	// Coarse search
} KS_TUNER_TUNING_FLAGS;

typedef enum {
    KSPROPERTY_TUNER_CAPS,	// R  -overall device capabilities
    KSPROPERTY_TUNER_MODE_CAPS,	// R  -capabilities in this mode
    KSPROPERTY_TUNER_MODE,	// RW -set a mode (TV, FM, AM, DSS)
    KSPROPERTY_TUNER_STANDARD,	// R  -get TV standard (only if TV mode)
    KSPROPERTY_TUNER_FREQUENCY,	// RW -set/get frequency
    KSPROPERTY_TUNER_INPUT,	// RW -select an input
    KSPROPERTY_TUNER_STATUS,	// R  -tuning status
    KSPROPERTY_TUNER_IF_MEDIUM	// R O-Medium for IF or Transport Pin
} KSPROPERTY_TUNER;
typedef enum {
    KS_TUNER_STRATEGY_PLL = 0X01,	// Tune by PLL offset
    KS_TUNER_STRATEGY_SIGNAL_STRENGTH = 0X02,	// Tune by signal strength
    KS_TUNER_STRATEGY_DRIVER_TUNES = 0X04,	// Driver does fine tuning
} KS_TUNER_STRATEGY;
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,
} TVAudioMode;

typedef struct FilterInfo {
    WCHAR achName[128];
    LPFILTERGRAPH pGraph;
} FILTER_INFO;

typedef struct PinInfo {
    LPBASEFILTER pFilter;
    PIN_DIRECTION dir;
    unsigned short achName[128];
} PIN_INFO;
//-----------------------------------


#undef INTERFACE
#define INTERFACE IPin
DECLARE_INTERFACE(IPin)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(Connect) (THIS_ IPin *, AM_MEDIA_TYPE *);
    STDMETHOD(ReceiveConnection) (THIS_ IPin *, const AM_MEDIA_TYPE *);
    STDMETHOD(Disconnect) (THIS);
    STDMETHOD(ConnectedTo) (THIS_ IPin **);
    STDMETHOD(ConnectionMediaType) (THIS_ AM_MEDIA_TYPE * pmt);
    STDMETHOD(QueryPinInfo) (THIS_ PIN_INFO *);
    STDMETHOD(QueryDirection) (THIS_ PIN_DIRECTION *);
    STDMETHOD(QueryId) (THIS_ unsigned short **);
    STDMETHOD(QueryAccept) (THIS_ const AM_MEDIA_TYPE *);
    STDMETHOD(EnumMediaTypes) (THIS_ LPENUMMEDIATYPES *);
    STDMETHOD(QueryInternalConnections) (THIS_ IPin **, unsigned long *);
    STDMETHOD(EndOfStream) (THIS);
    STDMETHOD(BeginFlush) (THIS);
    STDMETHOD(EndFlush) (THIS);
    STDMETHOD(NewSegment) (THIS_ REFERENCE_TIME, REFERENCE_TIME, double);
};

#undef INTERFACE
#define INTERFACE IBaseFilter
DECLARE_INTERFACE(IBaseFilter)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(GetClassID) (THIS_ CLSID * pClassID);
    STDMETHOD(Stop) (THIS);
    STDMETHOD(Pause) (THIS);
    STDMETHOD(Run) (THIS_ REFERENCE_TIME tStart);
    STDMETHOD(GetState) (THIS_ unsigned long, void *);
    STDMETHOD(SetSyncSource) (THIS_ LPREFERENCECLOCK);
    STDMETHOD(GetSyncSource) (THIS_ LPREFERENCECLOCK *);
    STDMETHOD(EnumPins) (THIS_ LPENUMPINS *);
    STDMETHOD(FindPin) (THIS_ const unsigned short *, LPPIN *);
    STDMETHOD(QueryFilterInfo) (THIS_ void *);
    STDMETHOD(JoinFilterGraph) (THIS_ LPFILTERGRAPH,
				const unsigned short *);
    STDMETHOD(QueryVendorInfo) (THIS_ unsigned short **);
};

#undef INTERFACE
#define INTERFACE IAMTVTuner
DECLARE_INTERFACE(IAMTVTuner)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(put_Channel) (THIS_ long, long, long);
    STDMETHOD(get_Channel) (THIS_ long *, long *, long *);
    STDMETHOD(ChannelMinMax) (THIS_ long *, long *);
    STDMETHOD(put_CountryCode) (THIS_ long);
    STDMETHOD(get_CountryCode) (THIS_ long *);
    STDMETHOD(put_TuningSpace) (THIS_ long);
    STDMETHOD(get_TuningSpace) (THIS_ long *);
    STDMETHOD(Logon) (THIS_ HANDLE);
    STDMETHOD(Logout) (IAMTVTuner *);
    STDMETHOD(SignalPresen) (THIS_ long *);
    STDMETHOD(put_Mode) (THIS_ AMTunerModeType);
    STDMETHOD(get_Mode) (THIS_ AMTunerModeType *);
    STDMETHOD(GetAvailableModes) (THIS_ long *);
    STDMETHOD(RegisterNotificationCallBack) (THIS_ LPAMTUNERNOTIFICATION,
					     long);
    STDMETHOD(UnRegisterNotificationCallBack) (THIS_
					       LPAMTUNERNOTIFICATION);
    STDMETHOD(get_AvailableTVFormats) (THIS_ long *);
    STDMETHOD(get_TVFormat) (THIS_ long *);
    STDMETHOD(AutoTune) (THIS_ long, long *);
    STDMETHOD(StoreAutoTune) (IAMTVTuner *);
    STDMETHOD(get_NumInputConnections) (THIS_ long *);
    STDMETHOD(put_InputType) (THIS_ long, TunerInputType);
    STDMETHOD(get_InputType) (THIS_ long, TunerInputType *);
    STDMETHOD(put_ConnectInput) (THIS_ long);
    STDMETHOD(get_ConnectInput) (THIS_ long *);
    STDMETHOD(get_VideoFrequency) (THIS_ long *);
    STDMETHOD(get_AudioFrequency) (THIS_ long *);
};

#undef INTERFACE
#define INTERFACE IMediaControl
DECLARE_INTERFACE(IMediaControl)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(GetTypeInfoCount) (THIS_ UINT *);
    STDMETHOD(GetTypeInfo) (THIS_ UINT, LCID, LPTYPEINFO *);
    STDMETHOD(GetIDsOfNames) (THIS_ REFIID, LPOLESTR *, UINT, LCID,
			      DISPID *);
    STDMETHOD(Invoke) (THIS_ DISPID, REFIID, LCID, WORD, LPDISPPARAMS,
		       VARIANT *, EXCEPINFO *, UINT *);
    STDMETHOD(Run) (THIS);
    STDMETHOD(Pause) (THIS);
    STDMETHOD(Stop) (THIS);
    STDMETHOD(GetState) (THIS_ LONG, OAFilterState *);
    STDMETHOD(RenderFile) (THIS_ BSTR);
    STDMETHOD(AddSourceFilter) (THIS_ BSTR, LPDISPATCH *);
    STDMETHOD(get_FilterCollection) (THIS_ LPDISPATCH *);
    STDMETHOD(get_RegFilterCollection) (THIS_ LPDISPATCH *);
    STDMETHOD(StopWhenReady) (IMediaControl *);
};

#undef INTERFACE
#define INTERFACE IGraphBuilder
DECLARE_INTERFACE(IGraphBuilder)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(AddFilter) (THIS_ IBaseFilter *, LPCWSTR);
    STDMETHOD(RemoveFilter) (THIS_ IBaseFilter *);
    STDMETHOD(EnumFilters) (THIS_ LPENUMFILTERS *);
    STDMETHOD(FindFilterByName) (THIS_ LPCWSTR, IBaseFilter **);
    STDMETHOD(ConnectDirect) (THIS_ IPin *, IPin *, const AM_MEDIA_TYPE *);
    STDMETHOD(Reconnect) (THIS_ IPin *);
    STDMETHOD(Disconnect) (THIS_ IPin *);
    STDMETHOD(SetDefaultSyncSource) (IGraphBuilder *);
    STDMETHOD(Connect) (THIS_ IPin *, IPin *);
    STDMETHOD(Render) (THIS_ IPin *);
    STDMETHOD(RenderFile) (THIS_ LPCWSTR, LPCWSTR);
    STDMETHOD(AddSourceFilter) (THIS_ LPCWSTR, LPCWSTR, IBaseFilter **);
    STDMETHOD(SetLogFile) (THIS_ DWORD_PTR);
    STDMETHOD(Abort) (IGraphBuilder *);
    STDMETHOD(ShouldOperationContinue) (IGraphBuilder *);
};


#undef INTERFACE
#define INTERFACE ICaptureGraphBuilder2
DECLARE_INTERFACE(ICaptureGraphBuilder2)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(SetFiltergraph) (THIS_ IGraphBuilder *);
    STDMETHOD(GetFiltergraph) (THIS_ IGraphBuilder **);
    STDMETHOD(SetOutputFileName) (THIS_ const GUID *, LPCOLESTR,
				  IBaseFilter **, LPFILESINKFILTER *);
    STDMETHOD(FindInterface) (THIS_ const GUID *, const GUID *,
			      IBaseFilter *, REFIID, void **);
    STDMETHOD(RenderStream) (THIS_ const GUID *, const GUID *, IUnknown *,
			     IBaseFilter *, IBaseFilter *);
    STDMETHOD(ControlStream) (THIS_ const GUID *, const GUID *,
			      IBaseFilter *, REFERENCE_TIME *,
			      REFERENCE_TIME *, WORD, WORD);
    STDMETHOD(AllocCapFile) (THIS_ LPCOLESTR, DWORDLONG);
    STDMETHOD(CopyCaptureFile) (THIS_ LPOLESTR, LPOLESTR, int,
				LPAMCOPYCAPTUREFILEPROGRESS);
    STDMETHOD(FindPin) (THIS_ IUnknown *, PIN_DIRECTION, const GUID *,
			const GUID *, BOOL, int, IPin **);
};

#undef INTERFACE
#define INTERFACE ICreateDevEnum
DECLARE_INTERFACE(ICreateDevEnum)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(CreateClassEnumerator) (THIS_ REFCLSID, IEnumMoniker **,
				      DWORD);
};

#undef INTERFACE
#define INTERFACE IAMCrossbar
DECLARE_INTERFACE(IAMCrossbar)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(get_PinCounts) (THIS_ long *, long *);
    STDMETHOD(CanRoute) (THIS_ long, long);
    STDMETHOD(Route) (THIS_ long, long);
    STDMETHOD(get_IsRoutedTo) (THIS_ long, long *);
    STDMETHOD(get_CrossbarPinInfo) (THIS_ BOOL, long, long *, long *);
};

#ifndef __IPropertyBag_INTERFACE_DEFINED__
#define __IPropertyBag_INTERFACE_DEFINED__
#undef INTERFACE
#define INTERFACE IPropertyBag
DECLARE_INTERFACE(IPropertyBag)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(Read) (THIS_ LPCOLESTR, LPVARIANT, LPERRORLOG);
    STDMETHOD(Write) (THIS_ LPCOLESTR, LPVARIANT);
};
#endif

#undef INTERFACE
#define INTERFACE IAMStreamConfig
DECLARE_INTERFACE(IAMStreamConfig)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    HRESULT(STDMETHODCALLTYPE * SetFormat) (THIS_ AM_MEDIA_TYPE *);
    HRESULT(STDMETHODCALLTYPE * GetFormat) (THIS_ AM_MEDIA_TYPE **);
    HRESULT(STDMETHODCALLTYPE * GetNumberOfCapabilities) (THIS_ int *,int *);
    HRESULT(STDMETHODCALLTYPE * GetStreamCaps) (THIS_ int,AM_MEDIA_TYPE **, BYTE *);
};

#undef INTERFACE
#define INTERFACE IAMVideoProcAmp
DECLARE_INTERFACE(IAMVideoProcAmp)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(GetRange) (THIS_ long, long *, long *, long *, long *,long *);
    STDMETHOD(Set) (THIS_ long, long, long);
    STDMETHOD(Get) (THIS_ long, long *, long *);
};

#undef INTERFACE
#define INTERFACE IKsPropertySet
DECLARE_INTERFACE(IKsPropertySet)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    HRESULT(STDMETHODCALLTYPE * Set) (THIS_ REFGUID, DWORD, LPVOID, DWORD,LPVOID, DWORD);
    HRESULT(STDMETHODCALLTYPE * Get) (THIS_ REFGUID, DWORD, LPVOID, DWORD,LPVOID, DWORD, DWORD *);
    HRESULT(STDMETHODCALLTYPE * QuerySupported) (THIS_ REFGUID, DWORD,DWORD *);
};

#undef INTERFACE
#define INTERFACE IAMAnalogVideoDecoder
DECLARE_INTERFACE(IAMAnalogVideoDecoder)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(get_AvailableTVFormats) (THIS_ long *);
    STDMETHOD(put_TVFormat) (THIS_ long);
    STDMETHOD(get_TVFormat) (THIS_ long *);
    STDMETHOD(get_HorizontalLocked) (THIS_ long *);
    STDMETHOD(put_VCRHorizontalLocking) (THIS_ long);
    STDMETHOD(get_VCRHorizontalLocking) (THIS_ long *);
    STDMETHOD(get_NumberOfLines) (THIS_ long *);
    STDMETHOD(put_OutputEnable) (THIS_ long);
    STDMETHOD(get_OutputEnable) (THIS_ long *);
};

#undef INTERFACE
#define INTERFACE IAMTVAudio
DECLARE_INTERFACE(IAMTVAudio)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(GetHardwareSupportedTVAudioModes) (THIS_ long *);
    STDMETHOD(GetAvailableTVAudioModes) (THIS_ long *);
    STDMETHOD(get_TVAudioMode) (THIS_ long *);
    STDMETHOD(put_TVAudioMode) (THIS_ long);
    STDMETHOD(RegisterNotificationCallBack) (THIS_ LPAMTUNERNOTIFICATION,
					     long);
    STDMETHOD(UnRegisterNotificationCallBack) (THIS_
					       LPAMTUNERNOTIFICATION);
};


#undef INTERFACE
#define INTERFACE ISampleGrabberCB
DECLARE_INTERFACE(ISampleGrabberCB)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(SampleCB) (THIS_ double, LPMEDIASAMPLE);
    STDMETHOD(BufferCB) (THIS_ double, BYTE *, long);
};

#undef INTERFACE
#define INTERFACE ISampleGrabber
DECLARE_INTERFACE(ISampleGrabber)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(SetOneShot) (THIS_ BOOL);
    STDMETHOD(SetMediaType) (THIS_ const AM_MEDIA_TYPE *);
    STDMETHOD(GetConnectedMediaType) (THIS_ AM_MEDIA_TYPE *);
    STDMETHOD(SetBufferSamples) (THIS_ BOOL);
    STDMETHOD(GetCurrentBuffer) (THIS_ long *, long *);
    STDMETHOD(GetCurrentSample) (THIS_ LPMEDIASAMPLE *);
    STDMETHOD(SetCallback) (THIS_ ISampleGrabberCB *, long);
};

#undef INTERFACE
#define INTERFACE IFilterGraph
DECLARE_INTERFACE(IFilterGraph)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(AddFilter) (THIS_ LPBASEFILTER, LPCWSTR);
    STDMETHOD(RemoveFilter) (THIS_ LPBASEFILTER);
    STDMETHOD(EnumFilters) (THIS_ LPENUMFILTERS *);
    STDMETHOD(FindFilterByName) (THIS_ LPCWSTR, LPBASEFILTER *);
    STDMETHOD(ConnectDirect) (THIS_ IPin *, IPin *, const AM_MEDIA_TYPE *);
    STDMETHOD(Reconnect) (THIS_ LPPIN);
    STDMETHOD(Disconnect) (THIS_ LPPIN);
    STDMETHOD(SetDefaultSyncSource) (THIS);
};

#undef INTERFACE
#define INTERFACE IAMAudioInputMixer
DECLARE_INTERFACE(IAMAudioInputMixer)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(put_Enable) (THIS_ BOOL);
    STDMETHOD(get_Enable) (THIS_ BOOL *);
    STDMETHOD(put_Mono) (THIS_ BOOL);
    STDMETHOD(get_Mono) (THIS_ BOOL *);
    STDMETHOD(put_MixLevel) (THIS_ double);
    STDMETHOD(get_MixLevel) (THIS_ double *);
    STDMETHOD(put_Pan) (THIS_ double);
    STDMETHOD(get_Pan) (THIS_ double *);
    STDMETHOD(put_Loudness) (THIS_ BOOL);
    STDMETHOD(get_Loudness) (THIS_ BOOL *);
    STDMETHOD(put_Treble) (THIS_ double);
    STDMETHOD(get_Treble) (THIS_ double *);
    STDMETHOD(get_TrebleRange) (THIS_ double *);
    STDMETHOD(put_Bass) (THIS_ double);
    STDMETHOD(get_Bass) (THIS_ double *);
    STDMETHOD(get_BassRange) (THIS_ double *);
};


#undef INTERFACE
#define INTERFACE IMediaSample
DECLARE_INTERFACE(IMediaSample)
{
    STDMETHOD(QueryInterface) (THIS_ const GUID *, void **);
    STDMETHOD_(long, AddRef) (THIS);
    STDMETHOD_(long, Release) (THIS);
    STDMETHOD(GetPointer )(THIS_ unsigned char** );
    STDMETHOD_(LONG,GetSize )(THIS);
    STDMETHOD(GetTime )(THIS_ REFERENCE_TIME* ,REFERENCE_TIME* );
    STDMETHOD(SetTime )(THIS_ REFERENCE_TIME* ,REFERENCE_TIME* );
    STDMETHOD(IsSyncPoint )(THIS);
    STDMETHOD(SetSyncPoint )(THIS_ long );
    STDMETHOD(IsPreroll )(THIS);
    STDMETHOD(SetPreroll )(THIS_ long );
    STDMETHOD_(LONG,GetActualDataLength)(THIS);
    STDMETHOD(SetActualDataLength )(THIS_ long );
    STDMETHOD(GetMediaType )(THIS_ AM_MEDIA_TYPE** );
    STDMETHOD(SetMediaType )(THIS_ AM_MEDIA_TYPE* );
    STDMETHOD(IsDiscontinuity )(THIS);
    STDMETHOD(SetDiscontinuity )(THIS_ long );
    STDMETHOD(GetMediaTime )(THIS_ long long* ,long long* );
    STDMETHOD(SetMediaTime )(THIS_ long long* ,long long* );
};


#undef INTERFACE
#define INTERFACE IAMBufferNegotiation
DECLARE_INTERFACE(IAMBufferNegotiation)
{
    STDMETHOD(QueryInterface )(THIS_ REFIID ,void **);
    STDMETHOD_(ULONG,AddRef )(THIS);
    STDMETHOD_(ULONG,Release )(THIS);
    STDMETHOD(SuggestAllocatorProperties )(THIS_ const ALLOCATOR_PROPERTIES *);
    STDMETHOD(GetAllocatorProperties )(THIS_ ALLOCATOR_PROPERTIES *);
};


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

#ifndef DECLARE_ENUMERATOR_
#define DECLARE_ENUMERATOR_(I,T) \
    DECLARE_INTERFACE_(I,IUnknown) \
    { \
        STDMETHOD(QueryInterface)(I*, REFIID,PVOID*); \
        STDMETHOD_(ULONG,AddRef)(I*); \
        STDMETHOD_(ULONG,Release)(I*); \
        STDMETHOD(Next)(I*, ULONG,T*,ULONG*); \
        STDMETHOD(Skip)(I*, ULONG); \
        STDMETHOD(Reset)(I*); \
        STDMETHOD(Clone)(I*, I**); \
    }
#endif
DECLARE_ENUMERATOR_(IEnumFilters, LPBASEFILTER);
DECLARE_ENUMERATOR_(IEnumPins, LPPIN);
DECLARE_ENUMERATOR_(IEnumMediaTypes, AM_MEDIA_TYPE *);

#define OLE_CALL(p,method)               (p)->lpVtbl->method(p)
#ifdef __GNUC__
#define OLE_CALL_ARGS(p, method, a1, args...) (p)->lpVtbl->method(p, a1, ##args)
#else
#define OLE_CALL_ARGS(p, method, ...) (p)->lpVtbl->method(p, __VA_ARGS__)
#endif
#define OLE_RELEASE_SAFE(p) if(p){ OLE_CALL((IUnknown*)p,Release); p=NULL;}
#define OLE_QUERYINTERFACE(p,iface,ptr) OLE_CALL_ARGS((IUnknown*)p,QueryInterface,&iface,(void*)&ptr)

#endif	/* MPLAYER_TVI_DSHOW_H */