From 3a1c4aa457f9e79550d38408a972b44f337b58e3 Mon Sep 17 00:00:00 2001 From: Thilo Schulz Date: Mon, 31 Jul 2006 13:05:15 +0000 Subject: [PATCH] Fix from the VirtualDub people which should make avi files created with the video command playable with numerous windows players. --- code/client/cl_avi.c | 21 ++++++++++++--------- code/renderer/tr_init.c | 17 +++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/code/client/cl_avi.c b/code/client/cl_avi.c index 1806b4fa..0be5fa54 100644 --- a/code/client/cl_avi.c +++ b/code/client/cl_avi.c @@ -168,7 +168,7 @@ static ID_INLINE void END_CHUNK( void ) afd.chunkStackTop--; bufIndex = afd.chunkStack[ afd.chunkStackTop ]; bufIndex += 4; - WRITE_4BYTES( endIndex - bufIndex - 1 ); + WRITE_4BYTES( endIndex - bufIndex - 4 ); bufIndex = endIndex; bufIndex = PAD( bufIndex, 2 ); } @@ -223,7 +223,7 @@ void CL_WriteAVIHeader( void ) if( afd.motionJpeg ) WRITE_STRING( "MJPG" ); else - WRITE_STRING( " BGR" ); + WRITE_4BYTES( 0 ); // BI_RGB WRITE_4BYTES( 0 ); //dwFlags WRITE_4BYTES( 0 ); //dwPriority @@ -248,15 +248,18 @@ void CL_WriteAVIHeader( void ) WRITE_4BYTES( afd.width ); //biWidth WRITE_4BYTES( afd.height ); //biHeight WRITE_2BYTES( 1 ); //biPlanes - WRITE_2BYTES( 24 ); //biBitCount + WRITE_2BYTES( 32 ); //biBitCount - if( afd.motionJpeg ) //biCompression + if( afd.motionJpeg ) { //biCompression WRITE_STRING( "MJPG" ); - else - WRITE_STRING( " BGR" ); - - WRITE_4BYTES( afd.width * + WRITE_4BYTES( afd.width * afd.height ); //biSizeImage + } else { + WRITE_4BYTES( 0 ); // BI_RGB + WRITE_4BYTES( afd.width * + afd.height*4 ); //biSizeImage + } + WRITE_4BYTES( 0 ); //biXPelsPetMeter WRITE_4BYTES( 0 ); //biYPelsPetMeter WRITE_4BYTES( 0 ); //biClrUsed @@ -485,7 +488,7 @@ void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size ) // Index bufIndex = 0; WRITE_STRING( "00dc" ); //dwIdentifier - WRITE_4BYTES( 0 ); //dwFlags + WRITE_4BYTES( 0x00000010 ); //dwFlags (all frames are KeyFrames) WRITE_4BYTES( chunkOffset ); //dwOffset WRITE_4BYTES( size ); //dwLength SafeFS_Write( buffer, 16, afd.idxF ); diff --git a/code/renderer/tr_init.c b/code/renderer/tr_init.c index 1b1bfc03..87f47f17 100644 --- a/code/renderer/tr_init.c +++ b/code/renderer/tr_init.c @@ -715,6 +715,7 @@ const void *RB_TakeVideoFrameCmd( const void *data ) const videoFrameCommand_t *cmd; int frameSize; int i; + char swapper; cmd = (const videoFrameCommand_t *)data; @@ -729,21 +730,21 @@ const void *RB_TakeVideoFrameCmd( const void *data ) { frameSize = SaveJPGToBuffer( cmd->encodeBuffer, 95, cmd->width, cmd->height, cmd->captureBuffer ); + ri.CL_WriteAVIVideoFrame( cmd->encodeBuffer, frameSize ); } else { frameSize = cmd->width * cmd->height * 4; - // Vertically flip the image - for( i = 0; i < cmd->height; i++ ) + for( i = 0; i < frameSize; i = i + 4) // Swap R and B { - Com_Memcpy( &cmd->encodeBuffer[ i * ( cmd->width * 4 ) ], - &cmd->captureBuffer[ ( cmd->height - i - 1 ) * ( cmd->width * 4 ) ], - cmd->width * 4 ); - } - } + swapper = cmd->captureBuffer[ i ]; + cmd->captureBuffer[ i ] = cmd->captureBuffer[ i + 2 ]; + cmd->captureBuffer[ i + 2 ] = swapper; - ri.CL_WriteAVIVideoFrame( cmd->encodeBuffer, frameSize ); + } + ri.CL_WriteAVIVideoFrame( cmd->captureBuffer, frameSize ); + } return (const void *)(cmd + 1); }