Click here to Skip to main content
15,885,435 members
Articles / Multimedia / DirectX

Video File Saving in Windows Media Video Format for the DirectX.Capture Class Library

Rate me:
Please Sign up or sign in to vote.
4.85/5 (20 votes)
27 Mar 2009CPOL16 min read 687.8K   16.2K   152  
Enhancements to the DirectX.Capture class for capturing audio and video to Windows Media files, using IWMProfile
/******************************************************
                  DirectShow .NET
		      netmaster@swissonline.ch
*******************************************************/
//					DsExtend
// Extended streaming interfaces, ported from axextend.idl

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace DShowNET
{



	[ComVisible(true), ComImport,
	Guid("93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface ICaptureGraphBuilder2
{
		[PreserveSig]
	int SetFiltergraph( [In] IGraphBuilder pfg );

		[PreserveSig]
	int GetFiltergraph( [Out] out IGraphBuilder ppfg );

		[PreserveSig]
	int SetOutputFileName(
		[In]											ref Guid		pType,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpstrFile,
		[Out]										out IBaseFilter		ppbf,
		[Out]										out IFileSinkFilter	ppSink );

		[PreserveSig]
	int FindInterface(
		[In]											ref Guid		pCategory,
		[In]											ref Guid		pType,
		[In]											IBaseFilter		pbf,
		[In]											ref Guid		riid,
		[Out, MarshalAs(UnmanagedType.IUnknown) ]		out	object		ppint );

		[PreserveSig]
	int RenderStream(
		[In]										ref Guid		pCategory,
		[In]										ref Guid		pType,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pSource,
		[In]											IBaseFilter		pfCompressor,
		[In]											IBaseFilter		pfRenderer );

		[PreserveSig]
	int ControlStream(
		[In]											ref Guid		pCategory,
		[In]											ref Guid		pType,
		[In]											IBaseFilter		pFilter,
		[In]											long			pstart,
		[In]											long			pstop,
		[In]											short			wStartCookie,
		[In]											short			wStopCookie );

		[PreserveSig]
	int AllocCapFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpstrFile,
		[In]											long			dwlSize );

		[PreserveSig]
	int CopyCaptureFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpwstrOld,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpwstrNew,
		[In]											int							fAllowEscAbort,
		[In]											IAMCopyCaptureFileProgress	pFilter );


		[PreserveSig]
	int FindPin(
		[In]											object			pSource,
		[In]											int				pindir,
		[In]										ref Guid			pCategory,
		[In]										ref Guid			pType,
		[In, MarshalAs(UnmanagedType.Bool) ]			bool			fUnconnected,
		[In]											int				num,
		[Out]										out IPin			ppPin );
}





	[ComVisible(true), ComImport,
	Guid("56a868a9-0ad4-11ce-b03a-0020af0ba770"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IGraphBuilder
{
	#region "IFilterGraph Methods"
			[PreserveSig]
		int AddFilter(
			[In] IBaseFilter pFilter,
			[In, MarshalAs(UnmanagedType.LPWStr)]			string			pName );

			[PreserveSig]
		int RemoveFilter( [In] IBaseFilter pFilter );

			[PreserveSig]
		int EnumFilters( [Out] out IEnumFilters ppEnum );

			[PreserveSig]
		int FindFilterByName(
			[In, MarshalAs(UnmanagedType.LPWStr)]			string			pName,
			[Out]										out IBaseFilter		ppFilter );

			[PreserveSig]
		int ConnectDirect( [In] IPin ppinOut, [In] IPin ppinIn,
			[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );

			[PreserveSig]
		int Reconnect( [In] IPin ppin );

			[PreserveSig]
		int Disconnect( [In] IPin ppin );

			[PreserveSig]
		int SetDefaultSyncSource();
	#endregion

		[PreserveSig]
	int Connect( [In] IPin ppinOut, [In] IPin ppinIn );

		[PreserveSig]
	int Render( [In] IPin ppinOut );

		[PreserveSig]
	int RenderFile(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFile,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrPlayList );

		[PreserveSig]
	int AddSourceFilter(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFileName,
		[In, MarshalAs(UnmanagedType.LPWStr)]			string			lpcwstrFilterName,
		[Out]										out IBaseFilter		ppFilter );

		[PreserveSig]
	int SetLogFile( IntPtr hFile );

		[PreserveSig]
	int Abort();

		[PreserveSig]
	int ShouldOperationContinue();
}







// ---------------------------------------------------------------------------------------


	[ComVisible(true), ComImport,
	Guid("a2104830-7c70-11cf-8bce-00aa00a3f1a6"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IFileSinkFilter
{
	[PreserveSig]
	int SetFileName(
		[In, MarshalAs(UnmanagedType.LPWStr)]			string		pszFileName,
		[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );
	
	[PreserveSig]
	int GetCurFile(
		[Out, MarshalAs(UnmanagedType.LPWStr) ]		out	string		pszFileName,
		[Out, MarshalAs(UnmanagedType.LPStruct) ]		AMMediaType pmt );
}

	[ComVisible(true), ComImport,
	Guid("00855B90-CE1B-11d0-BD4F-00A0C911CE86"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IFileSinkFilter2
	{
		[PreserveSig]
		int SetFileName(
			[In, MarshalAs(UnmanagedType.LPWStr)]			string		pszFileName,
			[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );
	
		[PreserveSig]
		int GetCurFile(
			[Out, MarshalAs(UnmanagedType.LPWStr) ]		out	string		pszFileName,
			[Out, MarshalAs(UnmanagedType.LPStruct) ]		AMMediaType pmt );

		[PreserveSig]
		int SetMode( [In] int dwFlags );

		[PreserveSig]
		int GetMode( [Out] out int dwFlags );

	}





// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("670d1d20-a068-11d0-b3f0-00aa003761c5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMCopyCaptureFileProgress
{
		[PreserveSig]
	int Progress( int iProgress );
}








// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("e46a9787-2b71-444d-a4b5-1fab7b708d6a"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IVideoFrameStep
{
		[PreserveSig]
	int Step( int dwFrames,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pStepObject );

		[PreserveSig]
	int CanStep( int bMultiple,
		[In, MarshalAs(UnmanagedType.IUnknown)]			object			pStepObject );

		[PreserveSig]
	int CancelStep();
}








// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("C6E13340-30AC-11d0-A18C-00A0C9118956"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMStreamConfig
{
		[PreserveSig]
	int SetFormat(
		[In, MarshalAs(UnmanagedType.LPStruct)]			AMMediaType	pmt );

		[PreserveSig]
	int GetFormat(
		[Out] out IntPtr	pmt );

		[PreserveSig]
	int GetNumberOfCapabilities( out int piCount, out int piSize );

		[PreserveSig]
	int GetStreamCaps( int iIndex,
		//[Out, MarshalAs(UnmanagedType.LPStruct)]	out AMMediaType	ppmt,
		[Out] out IntPtr pmt,
		[In]									IntPtr		pSCC );
    }














// =============================================================================
//											TUNER
// =============================================================================

	[ComVisible(false)]
public enum AMTunerSubChannel
{
	NoTune		= -2,	// AMTUNER_SUBCHAN_NO_TUNE : don't tune
	Default		= -1	// AMTUNER_SUBCHAN_DEFAULT : use default sub chan
}

	[ComVisible(false)]
public enum AMTunerSignalStrength
{
	NA				= -1,	// AMTUNER_HASNOSIGNALSTRENGTH : cannot indicate signal strength
	NoSignal		= 0,	// AMTUNER_NOSIGNAL : no signal available
	SignalPresent	= 1		// AMTUNER_SIGNALPRESENT : signal present
}

	[Flags, ComVisible(false)]
public enum AMTunerModeType
{
	Default		= 0x0000,	// AMTUNER_MODE_DEFAULT : default tuner mode
	TV			= 0x0001,	// AMTUNER_MODE_TV : tv
	FMRadio		= 0x0002,	// AMTUNER_MODE_FM_RADIO : fm radio
	AMRadio		= 0x0004,	// AMTUNER_MODE_AM_RADIO : am radio
	Dss			= 0x0008	// AMTUNER_MODE_DSS : dss
}

	[ComVisible(false)]
public enum AMTunerEventType
{
	Changed		= 0x0001,	// AMTUNER_EVENT_CHANGED : status changed
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8761-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTuner
{
		[PreserveSig]
	int put_Channel( int lChannel, AMTunerSubChannel lVideoSubChannel, AMTunerSubChannel lAudioSubChannel );

		[PreserveSig]
	int get_Channel( out int plChannel, out int plVideoSubChannel, out int plAudioSubChannel );
    
		[PreserveSig]
	int ChannelMinMax( out int lChannelMin, out int lChannelMax );
        
		[PreserveSig]
	int put_CountryCode( int lCountryCode );

		[PreserveSig]
	int get_CountryCode( out int plCountryCode );

		[PreserveSig]
	int put_TuningSpace( int lTuningSpace );

		[PreserveSig]
	int get_TuningSpace( out int plTuningSpace );

		[PreserveSig]
	int Logon( IntPtr hCurrentUser );
    
		[PreserveSig]
	int Logout();

		[PreserveSig]
	int SignalPresent( out AMTunerSignalStrength plSignalStrength );
    
		[PreserveSig]
	int put_Mode( AMTunerModeType lMode );

		[PreserveSig]
	int get_Mode( out AMTunerModeType plMode );
    
		[PreserveSig]
	int GetAvailableModes( out AMTunerModeType plModes );
    
		[PreserveSig]
	int RegisterNotificationCallBack( IAMTunerNotification pNotify, AMTunerEventType lEvents );

		[PreserveSig]
	int UnRegisterNotificationCallBack( IAMTunerNotification pNotify );
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8760-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTunerNotification
{
		[PreserveSig]
	int OnEvent( AMTunerEventType Event );
}


// ---------------------------------------------------------------------------------------
	[Flags, ComVisible(false)]
public enum AnalogVideoStandard
{
	None		= 0x00000000,  // This is a digital sensor
	NTSC_M		= 0x00000001,  //        75 IRE Setup
	NTSC_M_J	= 0x00000002,  // Japan,  0 IRE Setup
	NTSC_433	= 0x00000004,
	PAL_B		= 0x00000010,
	PAL_D		= 0x00000020,
	PAL_G		= 0x00000040,
	PAL_H		= 0x00000080,
	PAL_I		= 0x00000100,
	PAL_M		= 0x00000200,
	PAL_N		= 0x00000400,
	PAL_60		= 0x00000800,
	SECAM_B		= 0x00001000,
	SECAM_D		= 0x00002000,
	SECAM_G		= 0x00004000,
	SECAM_H		= 0x00008000,
	SECAM_K		= 0x00010000,
	SECAM_K1	= 0x00020000,
	SECAM_L		= 0x00040000,
	SECAM_L1	= 0x00080000,
	PAL_N_COMBO	= 0x00100000	// Argentina
}

	[ComVisible(false)]
public enum TunerInputType
{
	Cable,
	Antenna
}


// ---------------------------------------------------------------------------------------

	[ComVisible(true), ComImport,
	Guid("211A8766-03AC-11d1-8D13-00AA00BD8339"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IAMTVTuner
{

	#region "IAMTuner Methods"
			[PreserveSig]
		int put_Channel( int lChannel, AMTunerSubChannel lVideoSubChannel, AMTunerSubChannel lAudioSubChannel );

			[PreserveSig]
		int get_Channel( out int plChannel, out int plVideoSubChannel, out int plAudioSubChannel );
	    
			[PreserveSig]
		int ChannelMinMax( out int lChannelMin, out int lChannelMax );
	        
			[PreserveSig]
		int put_CountryCode( int lCountryCode );

			[PreserveSig]
		int get_CountryCode( out int plCountryCode );

			[PreserveSig]
		int put_TuningSpace( int lTuningSpace );

			[PreserveSig]
		int get_TuningSpace( out int plTuningSpace );

			[PreserveSig]
		int Logon( IntPtr hCurrentUser );
	    
			[PreserveSig]
		int Logout();

			[PreserveSig]
		int SignalPresent( out AMTunerSignalStrength plSignalStrength );
	    
			[PreserveSig]
		int put_Mode( AMTunerModeType lMode );

			[PreserveSig]
		int get_Mode( out AMTunerModeType plMode );
	    
			[PreserveSig]
		int GetAvailableModes( out AMTunerModeType plModes );
	    
			[PreserveSig]
		int RegisterNotificationCallBack( IAMTunerNotification pNotify, AMTunerEventType lEvents );

			[PreserveSig]
		int UnRegisterNotificationCallBack( IAMTunerNotification pNotify );
	#endregion

		[PreserveSig]
	int get_AvailableTVFormats( out AnalogVideoStandard lAnalogVideoStandard );

		[PreserveSig]
	int get_TVFormat( out AnalogVideoStandard lAnalogVideoStandard );
    
		[PreserveSig]
	int AutoTune( int lChannel, out int plFoundSignal );
    
		[PreserveSig]
	int StoreAutoTune();
    
		[PreserveSig]
	int get_NumInputConnections( out int plNumInputConnections );
    
		[PreserveSig]
	int put_InputType( int lIndex, TunerInputType inputType );
    
		[PreserveSig]
	int get_InputType( int lIndex, out TunerInputType inputType );

		[PreserveSig]
	int put_ConnectInput( int lIndex );
    
		[PreserveSig]
	int get_ConnectInput( out int lIndex );

		[PreserveSig]
	int get_VideoFrequency( out int lFreq );

		[PreserveSig]
	int get_AudioFrequency( out int lFreq );
}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("C6E13380-30AC-11d0-A18C-00A0C9118956"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMCrossbar
	{
		[PreserveSig]
		int get_PinCounts(
				[Out] out int OutputPinCount, 
				[Out] out int InputPinCount );

		[PreserveSig]
		int CanRoute( 
				[In]  int OutputPinIndex, 
				[In]  int InputPinIndex );

		[PreserveSig]
		int Route( 
				[In]  int OutputPinIndex, 
				[In]  int InputPinIndex );

		[PreserveSig]
		int get_IsRoutedTo( 
			[In] int OutputPinIndex, 
			[Out] out int InputPinIndex );

		[PreserveSig]
		int get_CrossbarPinInfo( 
				[In, MarshalAs(UnmanagedType.Bool)]	bool IsInputPin, 
				[In]  int PinIndex,
				[Out] out int PinIndexRelated,
				[Out] out PhysicalConnectorType PhysicalType
				);
	}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("54C39221-8380-11d0-B3F0-00AA003761C5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMAudioInputMixer
	{
		// This interface is only supported by the input pins, not the filter
		// If disabled, this channel will not be mixed in as part of the
		// recorded signal.
		int put_Enable (
			[In] bool fEnable);	// TRUE=enable FALSE=disable

		//Is this channel enabled?
		int get_Enable (
			[Out] out bool pfEnable);

		// When set to mono mode, making a stereo recording of this channel
		// will have both channels contain the same data... a mixture of the
		// left and right signals
		int put_Mono (
			[In] bool fMono);	// TRUE=mono FALSE=multi channel

		//all channels combined into a mono signal?
		int get_Mono (
			[Out] out bool pfMono);

		// !!! WILL CARDS BE ABLE TO BOOST THE GAIN?
		//Set the record level for this channel
		int put_MixLevel (
			[In] double Level);	// 0 = off, 1 = full (unity?) volume
		// AMF_AUTOMATICGAIN, if supported,
		// means automatic

		//Get the record level for this channel
		int get_MixLevel (
			[Out] out double pLevel);

		// For instance, when panned full left, and you make a stereo recording
		// of this channel, you will record a silent right channel.
		int put_Pan (
			[In] double Pan);	// -1 = full left, 0 = centre, 1 = right

		//Get the pan for this channel
		int get_Pan (
			[Out] out double pPan);

		// Boosts the bass of low volume signals before they are recorded
		// to compensate for the fact that your ear has trouble hearing quiet
		// bass sounds
		int put_Loudness (
			[In] bool fLoudness);// TRUE=on FALSE=off

		int get_Loudness (
			[Out] out bool pfLoudness);

		// boosts or cuts the treble of the signal before it's recorded by
		// a certain amount of dB
		int put_Treble (
			[In] double Treble); // gain in dB (-ve = attenuate)

		//Get the treble EQ for this channel
		int get_Treble (
			[Out] out double pTreble);

		// This is the maximum value allowed in put_Treble.  ie 6.0 means
		// any value between -6.0 and 6.0 is allowed
		int get_TrebleRange (
			[Out] out double pRange); // largest value allowed

		// boosts or cuts the bass of the signal before it's recorded by
		// a certain amount of dB
		int put_Bass (
			[In] double Bass); // gain in dB (-ve = attenuate)

		// Get the bass EQ for this channel
		int get_Bass (
			[Out] out double pBass);

		// This is the maximum value allowed in put_Bass.  ie 6.0 means
		// any value between -6.0 and 6.0 is allowed
		int get_BassRange (
			[Out] out double pRange); // largest value allowed
	}

	// ---------------------------------------------------------------------------------------
	public enum VfwCompressDialogs
	{
		Config = 0x01,
		About =  0x02,
		QueryConfig = 0x04,
		QueryAbout =  0x08
	}

	// ---------------------------------------------------------------------------------------
	[ComVisible(true), ComImport,
	Guid("D8D715A3-6E5E-11D0-B3F0-00AA003761C5"),
	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
	public interface IAMVfwCompressDialogs
	{
		[PreserveSig]
			// Bring up a dialog for this codec
		int ShowDialog(
			[In]  VfwCompressDialogs	iDialog,
			[In]  IntPtr				hwnd );

		// Calls ICGetState and gives you the result
		int GetState(
			[Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pState,
			ref int pcbState );

		// Calls ICSetState
		int SetState(
			[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pState,
			[In] int cbState );

		// Send a codec specific message
		int SendDriverMessage(
			int uMsg,
			long dw1,
			long dw2 );
	}


	// ---------------------------------------------------------------------------------------
	[StructLayout(LayoutKind.Sequential), ComVisible(false)]
	public class VideoStreamConfigCaps		// VIDEO_STREAM_CONFIG_CAPS
	{
		public Guid			Guid;
		public AnalogVideoStandard	    VideoStandard;
		public Size			InputSize;
		public Size			MinCroppingSize;
		public Size			MaxCroppingSize;
		public int			CropGranularityX;
		public int			CropGranularityY;
		public int			CropAlignX;
		public int			CropAlignY;
		public Size			MinOutputSize;
		public Size			MaxOutputSize;
		public int			OutputGranularityX;
		public int			OutputGranularityY;
		public int			StretchTapsX;
		public int			StretchTapsY;
		public int			ShrinkTapsX;
		public int			ShrinkTapsY;
		public long			MinFrameInterval;
		public long			MaxFrameInterval;
		public int			MinBitsPerSecond;
		public int			MaxBitsPerSecond;
	}

	// ---------------------------------------------------------------------------------------
	[StructLayout(LayoutKind.Sequential), ComVisible(false)]
	public class AudioStreamConfigCaps  // AUDIO_STREAM_CONFIG_CAPS
	{
		public Guid	Guid;
		public int	MinimumChannels;
		public int	MaximumChannels;
		public int	ChannelsGranularity;
		public int	MinimumBitsPerSample;
		public int	MaximumBitsPerSample;
		public int	BitsPerSampleGranularity;
		public int	MinimumSampleFrequency;
		public int	MaximumSampleFrequency;
		public int	SampleFrequencyGranularity;
	}


} // namespace DShowNET

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Netherlands Netherlands
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions