public Open ( string fileName ) : void | ||
fileName | string | AVI file name to open. |
return | void |
public void Open( string fileName )
{
// close previous file
Close( );
bool success = false;
try
{
lock ( sync )
{
// open AVI file
if ( Win32.AVIFileOpen( out file, fileName, Win32.OpenFileMode.ShareDenyWrite, IntPtr.Zero ) != 0 )
throw new System.IO.IOException( "Failed opening the specified AVI file." );
// get first video stream
if ( Win32.AVIFileGetStream( file, out stream, Win32.mmioFOURCC( "vids" ), 0 ) != 0 )
throw new VideoException( "Failed getting video stream." );
// get stream info
Win32.AVISTREAMINFO info = new Win32.AVISTREAMINFO( );
Win32.AVIStreamInfo( stream, ref info, Marshal.SizeOf( info ) );
width = info.rectFrame.right;
height = info.rectFrame.bottom;
position = info.start;
start = info.start;
length = info.length;
rate = (float) info.rate / (float) info.scale;
codec = Win32.decode_mmioFOURCC( info.handler );
// prepare decompressor
Win32.BITMAPINFOHEADER bitmapInfoHeader = new Win32.BITMAPINFOHEADER( );
bitmapInfoHeader.size = Marshal.SizeOf( bitmapInfoHeader.GetType( ) );
bitmapInfoHeader.width = width;
bitmapInfoHeader.height = height;
bitmapInfoHeader.planes = 1;
bitmapInfoHeader.bitCount = 24;
bitmapInfoHeader.compression = 0; // BI_RGB
// get frame object
if ( ( getFrame = Win32.AVIStreamGetFrameOpen( stream, ref bitmapInfoHeader ) ) == IntPtr.Zero )
{
bitmapInfoHeader.height = -height;
if ( ( getFrame = Win32.AVIStreamGetFrameOpen( stream, ref bitmapInfoHeader ) ) == IntPtr.Zero )
throw new VideoException( "Failed initializing decompressor." );
}
success = true;
}
}
finally
{
if ( !success )
{
Close( );
}
}
}
/// <summary> /// Worker thread. /// </summary> /// private void WorkerThread( ) { ReasonToFinishPlaying reasonToStop = ReasonToFinishPlaying.StoppedByUser; // AVI reader AVIReader aviReader = new AVIReader( ); try { // open file aviReader.Open( source ); // stop positions int stopPosition = aviReader.Start + aviReader.Length; // frame interval int interval = ( frameIntervalFromSource ) ? (int) ( 1000 / aviReader.FrameRate ) : frameInterval; while ( !stopEvent.WaitOne( 0, false ) ) { // start time DateTime start = DateTime.Now; // get next frame Bitmap bitmap = aviReader.GetNextFrame( ); framesReceived++; bytesReceived += bitmap.Width * bitmap.Height * ( Bitmap.GetPixelFormatSize( bitmap.PixelFormat ) >> 3 ); if ( NewFrame != null ) NewFrame( this, new NewFrameEventArgs( bitmap ) ); // free image bitmap.Dispose( ); // check current position if ( aviReader.Position >= stopPosition ) { reasonToStop = ReasonToFinishPlaying.EndOfStreamReached; break; } // wait for a while ? if ( interval > 0 ) { // get frame extract duration TimeSpan span = DateTime.Now.Subtract( start ); // miliseconds to sleep int msec = interval - (int) span.TotalMilliseconds; if ( ( msec > 0 ) && ( stopEvent.WaitOne( msec, false ) ) ) break; } } } catch ( Exception exception ) { // provide information to clients if ( VideoSourceError != null ) { VideoSourceError( this, new VideoSourceErrorEventArgs( exception.Message ) ); } } aviReader.Dispose( ); aviReader = null; if ( PlayingFinished != null ) { PlayingFinished( this, reasonToStop ); } }