[iortcw] 139/497: All: Uncrustify cl_avi.c
Simon McVittie
smcv at debian.org
Fri Sep 8 10:36:39 UTC 2017
This is an automated email from the git hooks/post-receive script.
smcv pushed a commit to annotated tag 1.42d
in repository iortcw.
commit 39eacb684fbc5dcc822e53ea1da5956179734835
Author: M4N4T4RMS at gmail.com <M4N4T4RMS at gmail.com@e65d2741-a53d-b2dc-ae96-bb75fa5e4c4a>
Date: Wed Jun 11 12:02:55 2014 +0000
All: Uncrustify cl_avi.c
---
MP/code/client/cl_avi.c | 969 +++++++++++++++++++++++-------------------------
SP/code/client/cl_avi.c | 969 +++++++++++++++++++++++-------------------------
2 files changed, 938 insertions(+), 1000 deletions(-)
diff --git a/MP/code/client/cl_avi.c b/MP/code/client/cl_avi.c
index 3b0d775..0fcc1cc 100644
--- a/MP/code/client/cl_avi.c
+++ b/MP/code/client/cl_avi.c
@@ -27,44 +27,46 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define MAX_RIFF_CHUNKS 16
+#define MAX_PACK_LEN 16
+
typedef struct audioFormat_s
{
- int rate;
- int format;
- int channels;
- int bits;
+ int rate;
+ int format;
+ int channels;
+ int bits;
- int sampleSize;
- int totalBytes;
+ int sampleSize;
+ int totalBytes;
} audioFormat_t;
typedef struct aviFileData_s
{
- qboolean fileOpen;
- fileHandle_t f;
- char fileName[ MAX_QPATH ];
- int fileSize;
- int moviOffset;
- int moviSize;
-
- fileHandle_t idxF;
- int numIndices;
-
- int frameRate;
- int framePeriod;
- int width, height;
- int numVideoFrames;
- int maxRecordSize;
- qboolean motionJpeg;
-
- qboolean audio;
- audioFormat_t a;
- int numAudioFrames;
-
- int chunkStack[ MAX_RIFF_CHUNKS ];
- int chunkStackTop;
-
- byte *cBuffer, *eBuffer;
+ qboolean fileOpen;
+ fileHandle_t f;
+ char fileName[ MAX_QPATH ];
+ int fileSize;
+ int moviOffset;
+ int moviSize;
+
+ fileHandle_t idxF;
+ int numIndices;
+
+ int frameRate;
+ int framePeriod;
+ int width, height;
+ int numVideoFrames;
+ int maxRecordSize;
+ qboolean motionJpeg;
+
+ qboolean audio;
+ audioFormat_t a;
+ int numAudioFrames;
+
+ int chunkStack[ MAX_RIFF_CHUNKS ];
+ int chunkStackTop;
+
+ byte *cBuffer, *eBuffer;
} aviFileData_t;
static aviFileData_t afd;
@@ -72,17 +74,17 @@ static aviFileData_t afd;
#define MAX_AVI_BUFFER 2048
static byte buffer[ MAX_AVI_BUFFER ];
-static int bufIndex;
+static int bufIndex;
/*
===============
SafeFS_Write
===============
*/
-static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f )
-{
- if( FS_Write( buffer, len, f ) < len )
- Com_Error( ERR_DROP, "Failed to write avi file" );
+static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f ) {
+ if ( FS_Write( buffer, len, f ) < len ) {
+ Com_Error( ERR_DROP, "Failed to write avi file" );
+ }
}
/*
@@ -90,10 +92,9 @@ static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f
WRITE_STRING
===============
*/
-static ID_INLINE void WRITE_STRING( const char *s )
-{
- Com_Memcpy( &buffer[ bufIndex ], s, strlen( s ) );
- bufIndex += strlen( s );
+static ID_INLINE void WRITE_STRING( const char *s ) {
+ Com_Memcpy( &buffer[ bufIndex ], s, strlen( s ) );
+ bufIndex += strlen( s );
}
/*
@@ -101,13 +102,12 @@ static ID_INLINE void WRITE_STRING( const char *s )
WRITE_4BYTES
===============
*/
-static ID_INLINE void WRITE_4BYTES( int x )
-{
- buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
- buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
- buffer[ bufIndex + 2 ] = (byte)( ( x >> 16 ) & 0xFF );
- buffer[ bufIndex + 3 ] = (byte)( ( x >> 24 ) & 0xFF );
- bufIndex += 4;
+static ID_INLINE void WRITE_4BYTES( int x ) {
+ buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
+ buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
+ buffer[ bufIndex + 2 ] = (byte)( ( x >> 16 ) & 0xFF );
+ buffer[ bufIndex + 3 ] = (byte)( ( x >> 24 ) & 0xFF );
+ bufIndex += 4;
}
/*
@@ -115,11 +115,10 @@ static ID_INLINE void WRITE_4BYTES( int x )
WRITE_2BYTES
===============
*/
-static ID_INLINE void WRITE_2BYTES( int x )
-{
- buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
- buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
- bufIndex += 2;
+static ID_INLINE void WRITE_2BYTES( int x ) {
+ buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
+ buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
+ bufIndex += 2;
}
/*
@@ -127,10 +126,9 @@ static ID_INLINE void WRITE_2BYTES( int x )
WRITE_1BYTES
===============
*/
-static ID_INLINE void WRITE_1BYTES( int x )
-{
- buffer[ bufIndex ] = x;
- bufIndex += 1;
+static ID_INLINE void WRITE_1BYTES( int x ) {
+ buffer[ bufIndex ] = x;
+ bufIndex += 1;
}
/*
@@ -138,17 +136,15 @@ static ID_INLINE void WRITE_1BYTES( int x )
START_CHUNK
===============
*/
-static ID_INLINE void START_CHUNK( const char *s )
-{
- if( afd.chunkStackTop == MAX_RIFF_CHUNKS )
- {
- Com_Error( ERR_DROP, "ERROR: Top of chunkstack breached" );
- }
-
- afd.chunkStack[ afd.chunkStackTop ] = bufIndex;
- afd.chunkStackTop++;
- WRITE_STRING( s );
- WRITE_4BYTES( 0 );
+static ID_INLINE void START_CHUNK( const char *s ) {
+ if ( afd.chunkStackTop == MAX_RIFF_CHUNKS ) {
+ Com_Error( ERR_DROP, "ERROR: Top of chunkstack breached" );
+ }
+
+ afd.chunkStack[ afd.chunkStackTop ] = bufIndex;
+ afd.chunkStackTop++;
+ WRITE_STRING( s );
+ WRITE_4BYTES( 0 );
}
/*
@@ -156,21 +152,19 @@ static ID_INLINE void START_CHUNK( const char *s )
END_CHUNK
===============
*/
-static ID_INLINE void END_CHUNK( void )
-{
- int endIndex = bufIndex;
-
- if( afd.chunkStackTop <= 0 )
- {
- Com_Error( ERR_DROP, "ERROR: Bottom of chunkstack breached" );
- }
-
- afd.chunkStackTop--;
- bufIndex = afd.chunkStack[ afd.chunkStackTop ];
- bufIndex += 4;
- WRITE_4BYTES( endIndex - bufIndex - 4 );
- bufIndex = endIndex;
- bufIndex = PAD( bufIndex, 2 );
+static ID_INLINE void END_CHUNK( void ) {
+ int endIndex = bufIndex;
+
+ if ( afd.chunkStackTop <= 0 ) {
+ Com_Error( ERR_DROP, "ERROR: Bottom of chunkstack breached" );
+ }
+
+ afd.chunkStackTop--;
+ bufIndex = afd.chunkStack[ afd.chunkStackTop ];
+ bufIndex += 4;
+ WRITE_4BYTES( endIndex - bufIndex - 4 );
+ bufIndex = endIndex;
+ bufIndex = PAD( bufIndex, 2 );
}
/*
@@ -178,150 +172,142 @@ static ID_INLINE void END_CHUNK( void )
CL_WriteAVIHeader
===============
*/
-void CL_WriteAVIHeader( void )
-{
- bufIndex = 0;
- afd.chunkStackTop = 0;
-
- START_CHUNK( "RIFF" );
- {
- WRITE_STRING( "AVI " );
- {
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "hdrl" );
- WRITE_STRING( "avih" );
- WRITE_4BYTES( 56 ); //"avih" "chunk" size
- WRITE_4BYTES( afd.framePeriod ); //dwMicroSecPerFrame
- WRITE_4BYTES( afd.maxRecordSize *
- afd.frameRate ); //dwMaxBytesPerSec
- WRITE_4BYTES( 0 ); //dwReserved1
- WRITE_4BYTES( 0x110 ); //dwFlags bits HAS_INDEX and IS_INTERLEAVED
- WRITE_4BYTES( afd.numVideoFrames ); //dwTotalFrames
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- if( afd.audio ) //dwStreams
- WRITE_4BYTES( 2 );
- else
- WRITE_4BYTES( 1 );
-
- WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
- WRITE_4BYTES( afd.width ); //dwWidth
- WRITE_4BYTES( afd.height ); //dwHeight
- WRITE_4BYTES( 0 ); //dwReserved[ 0 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 1 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 2 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 3 ]
-
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "strl" );
- WRITE_STRING( "strh" );
- WRITE_4BYTES( 56 ); //"strh" "chunk" size
- WRITE_STRING( "vids" );
-
- if( afd.motionJpeg )
- WRITE_STRING( "MJPG" );
- else
- WRITE_4BYTES( 0 ); // BI_RGB
-
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( 0 ); //dwPriority
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- WRITE_4BYTES( 1 ); //dwTimescale
- WRITE_4BYTES( afd.frameRate ); //dwDataRate
- WRITE_4BYTES( 0 ); //dwStartTime
- WRITE_4BYTES( afd.numVideoFrames ); //dwDataLength
-
- WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
- WRITE_4BYTES( -1 ); //dwQuality
- WRITE_4BYTES( 0 ); //dwSampleSize
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( afd.width ); //rcFrame
- WRITE_2BYTES( afd.height ); //rcFrame
-
- WRITE_STRING( "strf" );
- WRITE_4BYTES( 40 ); //"strf" "chunk" size
- WRITE_4BYTES( 40 ); //biSize
- WRITE_4BYTES( afd.width ); //biWidth
- WRITE_4BYTES( afd.height ); //biHeight
- WRITE_2BYTES( 1 ); //biPlanes
- WRITE_2BYTES( 24 ); //biBitCount
-
- if( afd.motionJpeg ) //biCompression
- {
- WRITE_STRING( "MJPG" );
- WRITE_4BYTES( afd.width *
- afd.height ); //biSizeImage
- }
- else
- {
- WRITE_4BYTES( 0 ); // BI_RGB
- WRITE_4BYTES( afd.width *
- afd.height * 3 ); //biSizeImage
- }
-
- WRITE_4BYTES( 0 ); //biXPelsPetMeter
- WRITE_4BYTES( 0 ); //biYPelsPetMeter
- WRITE_4BYTES( 0 ); //biClrUsed
- WRITE_4BYTES( 0 ); //biClrImportant
- }
- END_CHUNK( );
-
- if( afd.audio )
- {
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "strl" );
- WRITE_STRING( "strh" );
- WRITE_4BYTES( 56 ); //"strh" "chunk" size
- WRITE_STRING( "auds" );
- WRITE_4BYTES( 0 ); //FCC
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( 0 ); //dwPriority
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- WRITE_4BYTES( afd.a.sampleSize ); //dwTimescale
- WRITE_4BYTES( afd.a.sampleSize *
- afd.a.rate ); //dwDataRate
- WRITE_4BYTES( 0 ); //dwStartTime
- WRITE_4BYTES( afd.a.totalBytes /
- afd.a.sampleSize ); //dwDataLength
-
- WRITE_4BYTES( 0 ); //dwSuggestedBufferSize
- WRITE_4BYTES( -1 ); //dwQuality
- WRITE_4BYTES( afd.a.sampleSize ); //dwSampleSize
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
-
- WRITE_STRING( "strf" );
- WRITE_4BYTES( 18 ); //"strf" "chunk" size
- WRITE_2BYTES( afd.a.format ); //wFormatTag
- WRITE_2BYTES( afd.a.channels ); //nChannels
- WRITE_4BYTES( afd.a.rate ); //nSamplesPerSec
- WRITE_4BYTES( afd.a.sampleSize *
- afd.a.rate ); //nAvgBytesPerSec
- WRITE_2BYTES( afd.a.sampleSize ); //nBlockAlign
- WRITE_2BYTES( afd.a.bits ); //wBitsPerSample
- WRITE_2BYTES( 0 ); //cbSize
- }
- END_CHUNK( );
- }
- }
- END_CHUNK( );
-
- afd.moviOffset = bufIndex;
-
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "movi" );
- }
- }
- }
+void CL_WriteAVIHeader( void ) {
+ bufIndex = 0;
+ afd.chunkStackTop = 0;
+
+ START_CHUNK( "RIFF" );
+ {
+ WRITE_STRING( "AVI " );
+ {
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "hdrl" );
+ WRITE_STRING( "avih" );
+ WRITE_4BYTES( 56 ); //"avih" "chunk" size
+ WRITE_4BYTES( afd.framePeriod ); //dwMicroSecPerFrame
+ WRITE_4BYTES( afd.maxRecordSize *
+ afd.frameRate ); //dwMaxBytesPerSec
+ WRITE_4BYTES( 0 ); //dwReserved1
+ WRITE_4BYTES( 0x110 ); //dwFlags bits HAS_INDEX and IS_INTERLEAVED
+ WRITE_4BYTES( afd.numVideoFrames ); //dwTotalFrames
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ if ( afd.audio ) { //dwStreams
+ WRITE_4BYTES( 2 );
+ } else {
+ WRITE_4BYTES( 1 );
+ }
+
+ WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
+ WRITE_4BYTES( afd.width ); //dwWidth
+ WRITE_4BYTES( afd.height ); //dwHeight
+ WRITE_4BYTES( 0 ); //dwReserved[ 0 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 1 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 2 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 3 ]
+
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "strl" );
+ WRITE_STRING( "strh" );
+ WRITE_4BYTES( 56 ); //"strh" "chunk" size
+ WRITE_STRING( "vids" );
+
+ if ( afd.motionJpeg ) {
+ WRITE_STRING( "MJPG" );
+ } else {
+ WRITE_4BYTES( 0 ); // BI_RGB
+ }
+
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( 0 ); //dwPriority
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ WRITE_4BYTES( 1 ); //dwTimescale
+ WRITE_4BYTES( afd.frameRate ); //dwDataRate
+ WRITE_4BYTES( 0 ); //dwStartTime
+ WRITE_4BYTES( afd.numVideoFrames ); //dwDataLength
+
+ WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
+ WRITE_4BYTES( -1 ); //dwQuality
+ WRITE_4BYTES( 0 ); //dwSampleSize
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( afd.width ); //rcFrame
+ WRITE_2BYTES( afd.height ); //rcFrame
+
+ WRITE_STRING( "strf" );
+ WRITE_4BYTES( 40 ); //"strf" "chunk" size
+ WRITE_4BYTES( 40 ); //biSize
+ WRITE_4BYTES( afd.width ); //biWidth
+ WRITE_4BYTES( afd.height ); //biHeight
+ WRITE_2BYTES( 1 ); //biPlanes
+ WRITE_2BYTES( 24 ); //biBitCount
+
+ if ( afd.motionJpeg ) { //biCompression
+ WRITE_STRING( "MJPG" );
+ WRITE_4BYTES( afd.width * afd.height ); //biSizeImage
+ } else {
+ WRITE_4BYTES( 0 ); // BI_RGB
+ WRITE_4BYTES( afd.width * afd.height * 3 ); //biSizeImage
+ }
+
+ WRITE_4BYTES( 0 ); //biXPelsPetMeter
+ WRITE_4BYTES( 0 ); //biYPelsPetMeter
+ WRITE_4BYTES( 0 ); //biClrUsed
+ WRITE_4BYTES( 0 ); //biClrImportant
+ }
+ END_CHUNK();
+
+ if ( afd.audio ) {
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "strl" );
+ WRITE_STRING( "strh" );
+ WRITE_4BYTES( 56 ); //"strh" "chunk" size
+ WRITE_STRING( "auds" );
+ WRITE_4BYTES( 0 ); //FCC
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( 0 ); //dwPriority
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ WRITE_4BYTES( afd.a.sampleSize ); //dwTimescale
+ WRITE_4BYTES( afd.a.sampleSize * afd.a.rate ); //dwDataRate
+ WRITE_4BYTES( 0 ); //dwStartTime
+ WRITE_4BYTES( afd.a.totalBytes / afd.a.sampleSize ); //dwDataLength
+
+ WRITE_4BYTES( 0 ); //dwSuggestedBufferSize
+ WRITE_4BYTES( -1 ); //dwQuality
+ WRITE_4BYTES( afd.a.sampleSize ); //dwSampleSize
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+
+ WRITE_STRING( "strf" );
+ WRITE_4BYTES( 18 ); //"strf" "chunk" size
+ WRITE_2BYTES( afd.a.format ); //wFormatTag
+ WRITE_2BYTES( afd.a.channels ); //nChannels
+ WRITE_4BYTES( afd.a.rate ); //nSamplesPerSec
+ WRITE_4BYTES( afd.a.sampleSize * afd.a.rate ); //nAvgBytesPerSec
+ WRITE_2BYTES( afd.a.sampleSize ); //nBlockAlign
+ WRITE_2BYTES( afd.a.bits ); //wBitsPerSample
+ WRITE_2BYTES( 0 ); //cbSize
+ }
+ END_CHUNK();
+ }
+ }
+ END_CHUNK();
+
+ afd.moviOffset = bufIndex;
+
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "movi" );
+ }
+ }
+ }
}
/*
@@ -332,104 +318,93 @@ Creates an AVI file and gets it into a state where
writing the actual data can begin
===============
*/
-qboolean CL_OpenAVIForWriting( const char *fileName )
-{
- if( afd.fileOpen )
- return qfalse;
-
- Com_Memset( &afd, 0, sizeof( aviFileData_t ) );
-
- // Don't start if a framerate has not been chosen
- if( cl_aviFrameRate->integer <= 0 )
- {
- Com_Printf( S_COLOR_RED "cl_aviFrameRate must be >= 1\n" );
- return qfalse;
- }
-
- if( ( afd.f = FS_FOpenFileWrite( fileName ) ) <= 0 )
- return qfalse;
-
- if( ( afd.idxF = FS_FOpenFileWrite(
- va( "%s" INDEX_FILE_EXTENSION, fileName ) ) ) <= 0 )
- {
- FS_FCloseFile( afd.f );
- return qfalse;
- }
-
- Q_strncpyz( afd.fileName, fileName, MAX_QPATH );
-
- afd.frameRate = cl_aviFrameRate->integer;
- afd.framePeriod = (int)( 1000000.0f / afd.frameRate );
- afd.width = cls.glconfig.vidWidth;
- afd.height = cls.glconfig.vidHeight;
-
- if( cl_aviMotionJpeg->integer )
- afd.motionJpeg = qtrue;
- else
- afd.motionJpeg = qfalse;
-
- // Buffers only need to store RGB pixels.
- // Allocate a bit more space for the capture buffer to account for possible
- // padding at the end of pixel lines, and padding for alignment
- #define MAX_PACK_LEN 16
- afd.cBuffer = Z_Malloc((afd.width * 3 + MAX_PACK_LEN - 1) * afd.height + MAX_PACK_LEN - 1);
- // raw avi files have pixel lines start on 4-byte boundaries
- afd.eBuffer = Z_Malloc(PAD(afd.width * 3, AVI_LINE_PADDING) * afd.height);
-
- afd.a.rate = dma.speed;
- afd.a.format = WAV_FORMAT_PCM;
- afd.a.channels = dma.channels;
- afd.a.bits = dma.samplebits;
- afd.a.sampleSize = ( afd.a.bits / 8 ) * afd.a.channels;
-
- if( afd.a.rate % afd.frameRate )
- {
- int suggestRate = afd.frameRate;
-
- while( ( afd.a.rate % suggestRate ) && suggestRate >= 1 )
- suggestRate--;
-
- Com_Printf( S_COLOR_YELLOW "WARNING: cl_aviFrameRate is not a divisor "
- "of the audio rate, suggest %d\n", suggestRate );
- }
-
- if( !Cvar_VariableIntegerValue( "s_initsound" ) )
- {
- afd.audio = qfalse;
- }
- else if( Q_stricmp( Cvar_VariableString( "s_backend" ), "OpenAL" ) )
- {
- if( afd.a.bits != 16 || afd.a.channels != 2 )
- {
- Com_Printf( S_COLOR_YELLOW "WARNING: Audio format of %d bit/%d channels not supported",
- afd.a.bits, afd.a.channels );
- afd.audio = qfalse;
- }
- else
- afd.audio = qtrue;
- }
- else
- {
- afd.audio = qfalse;
- Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture is not supported "
- "with OpenAL. Set s_useOpenAL to 0 for audio capture\n" );
- }
-
- // This doesn't write a real header, but allocates the
- // correct amount of space at the beginning of the file
- CL_WriteAVIHeader( );
-
- SafeFS_Write( buffer, bufIndex, afd.f );
- afd.fileSize = bufIndex;
-
- bufIndex = 0;
- START_CHUNK( "idx1" );
- SafeFS_Write( buffer, bufIndex, afd.idxF );
-
- afd.moviSize = 4; // For the "movi"
- afd.fileOpen = qtrue;
-
- return qtrue;
+qboolean CL_OpenAVIForWriting( const char *fileName ) {
+ if ( afd.fileOpen ) {
+ return qfalse;
+ }
+
+ Com_Memset( &afd, 0, sizeof( aviFileData_t ) );
+
+ // Don't start if a framerate has not been chosen
+ if ( cl_aviFrameRate->integer <= 0 ) {
+ Com_Printf( S_COLOR_RED "cl_aviFrameRate must be >= 1\n" );
+ return qfalse;
+ }
+
+ if ( ( afd.f = FS_FOpenFileWrite( fileName ) ) <= 0 ) {
+ return qfalse;
+ }
+
+ if ( ( afd.idxF = FS_FOpenFileWrite( va( "%s" INDEX_FILE_EXTENSION, fileName ) ) ) <= 0 ) {
+ FS_FCloseFile( afd.f );
+ return qfalse;
+ }
+
+ Q_strncpyz( afd.fileName, fileName, MAX_QPATH );
+
+ afd.frameRate = cl_aviFrameRate->integer;
+ afd.framePeriod = (int)( 1000000.0f / afd.frameRate );
+ afd.width = cls.glconfig.vidWidth;
+ afd.height = cls.glconfig.vidHeight;
+
+ if ( cl_aviMotionJpeg->integer ) {
+ afd.motionJpeg = qtrue;
+ } else {
+ afd.motionJpeg = qfalse;
+ }
+
+ // Buffers only need to store RGB pixels.
+ // Allocate a bit more space for the capture buffer to account for possible
+ // padding at the end of pixel lines, and padding for alignment
+ afd.cBuffer = Z_Malloc( ( afd.width * 3 + MAX_PACK_LEN - 1 ) * afd.height + MAX_PACK_LEN - 1 );
+
+ // raw avi files have pixel lines start on 4-byte boundaries
+ afd.eBuffer = Z_Malloc( PAD( afd.width * 3, AVI_LINE_PADDING ) * afd.height );
+
+ afd.a.rate = dma.speed;
+ afd.a.format = WAV_FORMAT_PCM;
+ afd.a.channels = dma.channels;
+ afd.a.bits = dma.samplebits;
+ afd.a.sampleSize = ( afd.a.bits / 8 ) * afd.a.channels;
+
+ if ( afd.a.rate % afd.frameRate ) {
+ int suggestRate = afd.frameRate;
+
+ while ( ( afd.a.rate % suggestRate ) && suggestRate >= 1 )
+ suggestRate--;
+
+ Com_Printf( S_COLOR_YELLOW "WARNING: cl_aviFrameRate is not a divisor of the audio rate, suggest %d\n", suggestRate );
+ }
+
+ if ( !Cvar_VariableIntegerValue( "s_initsound" ) ) {
+ afd.audio = qfalse;
+ } else if ( Q_stricmp( Cvar_VariableString( "s_backend" ), "OpenAL" ) ) {
+ if ( afd.a.bits != 16 || afd.a.channels != 2 ) {
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio format of %d bit/%d channels not supported", afd.a.bits, afd.a.channels );
+ afd.audio = qfalse;
+ } else {
+ afd.audio = qtrue;
+ }
+ } else {
+ afd.audio = qfalse;
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture is not supported with OpenAL. Set s_useOpenAL to 0 for audio capture\n" );
+ }
+
+ // This doesn't write a real header, but allocates the
+ // correct amount of space at the beginning of the file
+ CL_WriteAVIHeader();
+
+ SafeFS_Write( buffer, bufIndex, afd.f );
+ afd.fileSize = bufIndex;
+
+ bufIndex = 0;
+ START_CHUNK( "idx1" );
+ SafeFS_Write( buffer, bufIndex, afd.idxF );
+
+ afd.moviSize = 4; // For the "movi"
+ afd.fileOpen = qtrue;
+
+ return qtrue;
}
/*
@@ -437,30 +412,28 @@ qboolean CL_OpenAVIForWriting( const char *fileName )
CL_CheckFileSize
===============
*/
-static qboolean CL_CheckFileSize( int bytesToAdd )
-{
- unsigned int newFileSize;
+static qboolean CL_CheckFileSize( int bytesToAdd ) {
+ unsigned int newFileSize;
- newFileSize =
- afd.fileSize + // Current file size
- bytesToAdd + // What we want to add
- ( afd.numIndices * 16 ) + // The index
- 4; // The index size
+ newFileSize =
+ afd.fileSize + // Current file size
+ bytesToAdd + // What we want to add
+ ( afd.numIndices * 16 ) + // The index
+ 4; // The index size
- // I assume all the operating systems
- // we target can handle a 2Gb file
- if( newFileSize > INT_MAX )
- {
- // Close the current file...
- CL_CloseAVI( );
+ // I assume all the operating systems
+ // we target can handle a 2GB file
+ if ( newFileSize > INT_MAX ) {
+ // Close the current file...
+ CL_CloseAVI();
- // ...And open a new one
- CL_OpenAVIForWriting( va( "%s_", afd.fileName ) );
+ // ...And open a new one
+ CL_OpenAVIForWriting( va( "%s_", afd.fileName ) );
- return qtrue;
- }
+ return qtrue;
+ }
- return qfalse;
+ return qfalse;
}
/*
@@ -468,44 +441,46 @@ static qboolean CL_CheckFileSize( int bytesToAdd )
CL_WriteAVIVideoFrame
===============
*/
-void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size )
-{
- int chunkOffset = afd.fileSize - afd.moviOffset - 8;
- int chunkSize = 8 + size;
- int paddingSize = PADLEN(size, 2);
- byte padding[ 4 ] = { 0 };
-
- if( !afd.fileOpen )
- return;
-
- // Chunk header + contents + padding
- if( CL_CheckFileSize( 8 + size + 2 ) )
- return;
-
- bufIndex = 0;
- WRITE_STRING( "00dc" );
- WRITE_4BYTES( size );
-
- SafeFS_Write( buffer, 8, afd.f );
- SafeFS_Write( imageBuffer, size, afd.f );
- SafeFS_Write( padding, paddingSize, afd.f );
- afd.fileSize += ( chunkSize + paddingSize );
-
- afd.numVideoFrames++;
- afd.moviSize += ( chunkSize + paddingSize );
-
- if( size > afd.maxRecordSize )
- afd.maxRecordSize = size;
-
- // Index
- bufIndex = 0;
- WRITE_STRING( "00dc" ); //dwIdentifier
- WRITE_4BYTES( 0x00000010 ); //dwFlags (all frames are KeyFrames)
- WRITE_4BYTES( chunkOffset ); //dwOffset
- WRITE_4BYTES( size ); //dwLength
- SafeFS_Write( buffer, 16, afd.idxF );
-
- afd.numIndices++;
+void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size ) {
+ int chunkOffset = afd.fileSize - afd.moviOffset - 8;
+ int chunkSize = 8 + size;
+ int paddingSize = PADLEN( size, 2 );
+ byte padding[ 4 ] = { 0 };
+
+ if ( !afd.fileOpen ) {
+ return;
+ }
+
+ // Chunk header + contents + padding
+ if ( CL_CheckFileSize( 8 + size + 2 ) ) {
+ return;
+ }
+
+ bufIndex = 0;
+ WRITE_STRING( "00dc" );
+ WRITE_4BYTES( size );
+
+ SafeFS_Write( buffer, 8, afd.f );
+ SafeFS_Write( imageBuffer, size, afd.f );
+ SafeFS_Write( padding, paddingSize, afd.f );
+ afd.fileSize += ( chunkSize + paddingSize );
+
+ afd.numVideoFrames++;
+ afd.moviSize += ( chunkSize + paddingSize );
+
+ if ( size > afd.maxRecordSize ) {
+ afd.maxRecordSize = size;
+ }
+
+ // Index
+ bufIndex = 0;
+ WRITE_STRING( "00dc" ); //dwIdentifier
+ WRITE_4BYTES( 0x00000010 ); //dwFlags (all frames are KeyFrames)
+ WRITE_4BYTES( chunkOffset ); //dwOffset
+ WRITE_4BYTES( size ); //dwLength
+ SafeFS_Write( buffer, 16, afd.idxF );
+
+ afd.numIndices++;
}
#define PCM_BUFFER_SIZE 44100
@@ -515,65 +490,63 @@ void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size )
CL_WriteAVIAudioFrame
===============
*/
-void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size )
-{
- static byte pcmCaptureBuffer[ PCM_BUFFER_SIZE ] = { 0 };
- static int bytesInBuffer = 0;
-
- if( !afd.audio )
- return;
-
- if( !afd.fileOpen )
- return;
-
- // Chunk header + contents + padding
- if( CL_CheckFileSize( 8 + bytesInBuffer + size + 2 ) )
- return;
-
- if( bytesInBuffer + size > PCM_BUFFER_SIZE )
- {
- Com_Printf( S_COLOR_YELLOW
- "WARNING: Audio capture buffer overflow -- truncating\n" );
- size = PCM_BUFFER_SIZE - bytesInBuffer;
- }
-
- Com_Memcpy( &pcmCaptureBuffer[ bytesInBuffer ], pcmBuffer, size );
- bytesInBuffer += size;
-
- // Only write if we have a frame's worth of audio
- if( bytesInBuffer >= (int)ceil( (float)afd.a.rate / (float)afd.frameRate ) *
- afd.a.sampleSize )
- {
- int chunkOffset = afd.fileSize - afd.moviOffset - 8;
- int chunkSize = 8 + bytesInBuffer;
- int paddingSize = PADLEN(bytesInBuffer, 2);
- byte padding[ 4 ] = { 0 };
-
- bufIndex = 0;
- WRITE_STRING( "01wb" );
- WRITE_4BYTES( bytesInBuffer );
-
- SafeFS_Write( buffer, 8, afd.f );
- SafeFS_Write( pcmCaptureBuffer, bytesInBuffer, afd.f );
- SafeFS_Write( padding, paddingSize, afd.f );
- afd.fileSize += ( chunkSize + paddingSize );
-
- afd.numAudioFrames++;
- afd.moviSize += ( chunkSize + paddingSize );
- afd.a.totalBytes += bytesInBuffer;
-
- // Index
- bufIndex = 0;
- WRITE_STRING( "01wb" ); //dwIdentifier
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( chunkOffset ); //dwOffset
- WRITE_4BYTES( bytesInBuffer ); //dwLength
- SafeFS_Write( buffer, 16, afd.idxF );
-
- afd.numIndices++;
-
- bytesInBuffer = 0;
- }
+void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size ) {
+ static byte pcmCaptureBuffer[ PCM_BUFFER_SIZE ] = { 0 };
+ static int bytesInBuffer = 0;
+
+ if ( !afd.audio ) {
+ return;
+ }
+
+ if ( !afd.fileOpen ) {
+ return;
+ }
+
+ // Chunk header + contents + padding
+ if ( CL_CheckFileSize( 8 + bytesInBuffer + size + 2 ) ) {
+ return;
+ }
+
+ if ( bytesInBuffer + size > PCM_BUFFER_SIZE ) {
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture buffer overflow -- truncating\n" );
+ size = PCM_BUFFER_SIZE - bytesInBuffer;
+ }
+
+ Com_Memcpy( &pcmCaptureBuffer[ bytesInBuffer ], pcmBuffer, size );
+ bytesInBuffer += size;
+
+ // Only write if we have a frame's worth of audio
+ if ( bytesInBuffer >= (int)ceil( (float)afd.a.rate / (float)afd.frameRate ) * afd.a.sampleSize ) {
+ int chunkOffset = afd.fileSize - afd.moviOffset - 8;
+ int chunkSize = 8 + bytesInBuffer;
+ int paddingSize = PADLEN( bytesInBuffer, 2 );
+ byte padding[ 4 ] = { 0 };
+
+ bufIndex = 0;
+ WRITE_STRING( "01wb" );
+ WRITE_4BYTES( bytesInBuffer );
+
+ SafeFS_Write( buffer, 8, afd.f );
+ SafeFS_Write( pcmCaptureBuffer, bytesInBuffer, afd.f );
+ SafeFS_Write( padding, paddingSize, afd.f );
+ afd.fileSize += ( chunkSize + paddingSize );
+
+ afd.numAudioFrames++;
+ afd.moviSize += ( chunkSize + paddingSize );
+ afd.a.totalBytes += bytesInBuffer;
+
+ // Index
+ bufIndex = 0;
+ WRITE_STRING( "01wb" ); //dwIdentifier
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( chunkOffset ); //dwOffset
+ WRITE_4BYTES( bytesInBuffer ); //dwLength
+ SafeFS_Write( buffer, 16, afd.idxF );
+
+ afd.numIndices++;
+
+ bytesInBuffer = 0;
+ }
}
/*
@@ -581,14 +554,13 @@ void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size )
CL_TakeVideoFrame
===============
*/
-void CL_TakeVideoFrame( void )
-{
- // AVI file isn't open
- if( !afd.fileOpen )
- return;
+void CL_TakeVideoFrame( void ) {
+ // AVI file isn't open
+ if ( !afd.fileOpen ) {
+ return;
+ }
- re.TakeVideoFrame( afd.width, afd.height,
- afd.cBuffer, afd.eBuffer, afd.motionJpeg );
+ re.TakeVideoFrame( afd.width, afd.height, afd.cBuffer, afd.eBuffer, afd.motionJpeg );
}
/*
@@ -598,71 +570,69 @@ CL_CloseAVI
Closes the AVI file and writes an index chunk
===============
*/
-qboolean CL_CloseAVI( void )
-{
- int indexRemainder;
- int indexSize = afd.numIndices * 16;
- const char *idxFileName = va( "%s" INDEX_FILE_EXTENSION, afd.fileName );
+qboolean CL_CloseAVI( void ) {
+ int indexRemainder;
+ int indexSize = afd.numIndices * 16;
+ const char *idxFileName = va( "%s" INDEX_FILE_EXTENSION, afd.fileName );
- // AVI file isn't open
- if( !afd.fileOpen )
- return qfalse;
+ // AVI file isn't open
+ if ( !afd.fileOpen ) {
+ return qfalse;
+ }
- afd.fileOpen = qfalse;
+ afd.fileOpen = qfalse;
- FS_Seek( afd.idxF, 4, FS_SEEK_SET );
- bufIndex = 0;
- WRITE_4BYTES( indexSize );
- SafeFS_Write( buffer, bufIndex, afd.idxF );
- FS_FCloseFile( afd.idxF );
+ FS_Seek( afd.idxF, 4, FS_SEEK_SET );
+ bufIndex = 0;
+ WRITE_4BYTES( indexSize );
+ SafeFS_Write( buffer, bufIndex, afd.idxF );
+ FS_FCloseFile( afd.idxF );
- // Write index
+ // Write index
- // Open the temp index file
- if( ( indexSize = FS_FOpenFileRead( idxFileName,
- &afd.idxF, qtrue ) ) <= 0 )
- {
- FS_FCloseFile( afd.f );
- return qfalse;
- }
+ // Open the temp index file
+ if ( ( indexSize = FS_FOpenFileRead( idxFileName, &afd.idxF, qtrue ) ) <= 0 ) {
+ FS_FCloseFile( afd.f );
+ return qfalse;
+ }
- indexRemainder = indexSize;
+ indexRemainder = indexSize;
- // Append index to end of avi file
- while( indexRemainder > MAX_AVI_BUFFER )
- {
- FS_Read( buffer, MAX_AVI_BUFFER, afd.idxF );
- SafeFS_Write( buffer, MAX_AVI_BUFFER, afd.f );
- afd.fileSize += MAX_AVI_BUFFER;
- indexRemainder -= MAX_AVI_BUFFER;
- }
- FS_Read( buffer, indexRemainder, afd.idxF );
- SafeFS_Write( buffer, indexRemainder, afd.f );
- afd.fileSize += indexRemainder;
- FS_FCloseFile( afd.idxF );
+ // Append index to end of avi file
+ while ( indexRemainder > MAX_AVI_BUFFER )
+ {
+ FS_Read( buffer, MAX_AVI_BUFFER, afd.idxF );
+ SafeFS_Write( buffer, MAX_AVI_BUFFER, afd.f );
+ afd.fileSize += MAX_AVI_BUFFER;
+ indexRemainder -= MAX_AVI_BUFFER;
+ }
+ FS_Read( buffer, indexRemainder, afd.idxF );
+ SafeFS_Write( buffer, indexRemainder, afd.f );
+ afd.fileSize += indexRemainder;
+ FS_FCloseFile( afd.idxF );
- // Remove temp index file
- FS_HomeRemove( idxFileName );
+ // Remove temp index file
+ FS_HomeRemove( idxFileName );
- // Write the real header
- FS_Seek( afd.f, 0, FS_SEEK_SET );
- CL_WriteAVIHeader( );
+ // Write the real header
+ FS_Seek( afd.f, 0, FS_SEEK_SET );
+ CL_WriteAVIHeader();
- bufIndex = 4;
- WRITE_4BYTES( afd.fileSize - 8 ); // "RIFF" size
+ bufIndex = 4;
+ WRITE_4BYTES( afd.fileSize - 8 ); // "RIFF" size
- bufIndex = afd.moviOffset + 4; // Skip "LIST"
- WRITE_4BYTES( afd.moviSize );
+ bufIndex = afd.moviOffset + 4; // Skip "LIST"
+ WRITE_4BYTES( afd.moviSize );
- SafeFS_Write( buffer, bufIndex, afd.f );
+ SafeFS_Write( buffer, bufIndex, afd.f );
- Z_Free( afd.cBuffer );
- Z_Free( afd.eBuffer );
- FS_FCloseFile( afd.f );
+ Z_Free( afd.cBuffer );
+ Z_Free( afd.eBuffer );
+ FS_FCloseFile( afd.f );
- Com_Printf( "Wrote %d:%d frames to %s\n", afd.numVideoFrames, afd.numAudioFrames, afd.fileName );
+ Com_Printf( "Wrote %d:%d frames to %s\n", afd.numVideoFrames, afd.numAudioFrames, afd.fileName );
- return qtrue;
+ return qtrue;
}
/*
@@ -670,7 +640,6 @@ qboolean CL_CloseAVI( void )
CL_VideoRecording
===============
*/
-qboolean CL_VideoRecording( void )
-{
- return afd.fileOpen;
+qboolean CL_VideoRecording( void ) {
+ return afd.fileOpen;
}
diff --git a/SP/code/client/cl_avi.c b/SP/code/client/cl_avi.c
index 3b0d775..0fcc1cc 100644
--- a/SP/code/client/cl_avi.c
+++ b/SP/code/client/cl_avi.c
@@ -27,44 +27,46 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define MAX_RIFF_CHUNKS 16
+#define MAX_PACK_LEN 16
+
typedef struct audioFormat_s
{
- int rate;
- int format;
- int channels;
- int bits;
+ int rate;
+ int format;
+ int channels;
+ int bits;
- int sampleSize;
- int totalBytes;
+ int sampleSize;
+ int totalBytes;
} audioFormat_t;
typedef struct aviFileData_s
{
- qboolean fileOpen;
- fileHandle_t f;
- char fileName[ MAX_QPATH ];
- int fileSize;
- int moviOffset;
- int moviSize;
-
- fileHandle_t idxF;
- int numIndices;
-
- int frameRate;
- int framePeriod;
- int width, height;
- int numVideoFrames;
- int maxRecordSize;
- qboolean motionJpeg;
-
- qboolean audio;
- audioFormat_t a;
- int numAudioFrames;
-
- int chunkStack[ MAX_RIFF_CHUNKS ];
- int chunkStackTop;
-
- byte *cBuffer, *eBuffer;
+ qboolean fileOpen;
+ fileHandle_t f;
+ char fileName[ MAX_QPATH ];
+ int fileSize;
+ int moviOffset;
+ int moviSize;
+
+ fileHandle_t idxF;
+ int numIndices;
+
+ int frameRate;
+ int framePeriod;
+ int width, height;
+ int numVideoFrames;
+ int maxRecordSize;
+ qboolean motionJpeg;
+
+ qboolean audio;
+ audioFormat_t a;
+ int numAudioFrames;
+
+ int chunkStack[ MAX_RIFF_CHUNKS ];
+ int chunkStackTop;
+
+ byte *cBuffer, *eBuffer;
} aviFileData_t;
static aviFileData_t afd;
@@ -72,17 +74,17 @@ static aviFileData_t afd;
#define MAX_AVI_BUFFER 2048
static byte buffer[ MAX_AVI_BUFFER ];
-static int bufIndex;
+static int bufIndex;
/*
===============
SafeFS_Write
===============
*/
-static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f )
-{
- if( FS_Write( buffer, len, f ) < len )
- Com_Error( ERR_DROP, "Failed to write avi file" );
+static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f ) {
+ if ( FS_Write( buffer, len, f ) < len ) {
+ Com_Error( ERR_DROP, "Failed to write avi file" );
+ }
}
/*
@@ -90,10 +92,9 @@ static ID_INLINE void SafeFS_Write( const void *buffer, int len, fileHandle_t f
WRITE_STRING
===============
*/
-static ID_INLINE void WRITE_STRING( const char *s )
-{
- Com_Memcpy( &buffer[ bufIndex ], s, strlen( s ) );
- bufIndex += strlen( s );
+static ID_INLINE void WRITE_STRING( const char *s ) {
+ Com_Memcpy( &buffer[ bufIndex ], s, strlen( s ) );
+ bufIndex += strlen( s );
}
/*
@@ -101,13 +102,12 @@ static ID_INLINE void WRITE_STRING( const char *s )
WRITE_4BYTES
===============
*/
-static ID_INLINE void WRITE_4BYTES( int x )
-{
- buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
- buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
- buffer[ bufIndex + 2 ] = (byte)( ( x >> 16 ) & 0xFF );
- buffer[ bufIndex + 3 ] = (byte)( ( x >> 24 ) & 0xFF );
- bufIndex += 4;
+static ID_INLINE void WRITE_4BYTES( int x ) {
+ buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
+ buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
+ buffer[ bufIndex + 2 ] = (byte)( ( x >> 16 ) & 0xFF );
+ buffer[ bufIndex + 3 ] = (byte)( ( x >> 24 ) & 0xFF );
+ bufIndex += 4;
}
/*
@@ -115,11 +115,10 @@ static ID_INLINE void WRITE_4BYTES( int x )
WRITE_2BYTES
===============
*/
-static ID_INLINE void WRITE_2BYTES( int x )
-{
- buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
- buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
- bufIndex += 2;
+static ID_INLINE void WRITE_2BYTES( int x ) {
+ buffer[ bufIndex + 0 ] = (byte)( ( x >> 0 ) & 0xFF );
+ buffer[ bufIndex + 1 ] = (byte)( ( x >> 8 ) & 0xFF );
+ bufIndex += 2;
}
/*
@@ -127,10 +126,9 @@ static ID_INLINE void WRITE_2BYTES( int x )
WRITE_1BYTES
===============
*/
-static ID_INLINE void WRITE_1BYTES( int x )
-{
- buffer[ bufIndex ] = x;
- bufIndex += 1;
+static ID_INLINE void WRITE_1BYTES( int x ) {
+ buffer[ bufIndex ] = x;
+ bufIndex += 1;
}
/*
@@ -138,17 +136,15 @@ static ID_INLINE void WRITE_1BYTES( int x )
START_CHUNK
===============
*/
-static ID_INLINE void START_CHUNK( const char *s )
-{
- if( afd.chunkStackTop == MAX_RIFF_CHUNKS )
- {
- Com_Error( ERR_DROP, "ERROR: Top of chunkstack breached" );
- }
-
- afd.chunkStack[ afd.chunkStackTop ] = bufIndex;
- afd.chunkStackTop++;
- WRITE_STRING( s );
- WRITE_4BYTES( 0 );
+static ID_INLINE void START_CHUNK( const char *s ) {
+ if ( afd.chunkStackTop == MAX_RIFF_CHUNKS ) {
+ Com_Error( ERR_DROP, "ERROR: Top of chunkstack breached" );
+ }
+
+ afd.chunkStack[ afd.chunkStackTop ] = bufIndex;
+ afd.chunkStackTop++;
+ WRITE_STRING( s );
+ WRITE_4BYTES( 0 );
}
/*
@@ -156,21 +152,19 @@ static ID_INLINE void START_CHUNK( const char *s )
END_CHUNK
===============
*/
-static ID_INLINE void END_CHUNK( void )
-{
- int endIndex = bufIndex;
-
- if( afd.chunkStackTop <= 0 )
- {
- Com_Error( ERR_DROP, "ERROR: Bottom of chunkstack breached" );
- }
-
- afd.chunkStackTop--;
- bufIndex = afd.chunkStack[ afd.chunkStackTop ];
- bufIndex += 4;
- WRITE_4BYTES( endIndex - bufIndex - 4 );
- bufIndex = endIndex;
- bufIndex = PAD( bufIndex, 2 );
+static ID_INLINE void END_CHUNK( void ) {
+ int endIndex = bufIndex;
+
+ if ( afd.chunkStackTop <= 0 ) {
+ Com_Error( ERR_DROP, "ERROR: Bottom of chunkstack breached" );
+ }
+
+ afd.chunkStackTop--;
+ bufIndex = afd.chunkStack[ afd.chunkStackTop ];
+ bufIndex += 4;
+ WRITE_4BYTES( endIndex - bufIndex - 4 );
+ bufIndex = endIndex;
+ bufIndex = PAD( bufIndex, 2 );
}
/*
@@ -178,150 +172,142 @@ static ID_INLINE void END_CHUNK( void )
CL_WriteAVIHeader
===============
*/
-void CL_WriteAVIHeader( void )
-{
- bufIndex = 0;
- afd.chunkStackTop = 0;
-
- START_CHUNK( "RIFF" );
- {
- WRITE_STRING( "AVI " );
- {
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "hdrl" );
- WRITE_STRING( "avih" );
- WRITE_4BYTES( 56 ); //"avih" "chunk" size
- WRITE_4BYTES( afd.framePeriod ); //dwMicroSecPerFrame
- WRITE_4BYTES( afd.maxRecordSize *
- afd.frameRate ); //dwMaxBytesPerSec
- WRITE_4BYTES( 0 ); //dwReserved1
- WRITE_4BYTES( 0x110 ); //dwFlags bits HAS_INDEX and IS_INTERLEAVED
- WRITE_4BYTES( afd.numVideoFrames ); //dwTotalFrames
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- if( afd.audio ) //dwStreams
- WRITE_4BYTES( 2 );
- else
- WRITE_4BYTES( 1 );
-
- WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
- WRITE_4BYTES( afd.width ); //dwWidth
- WRITE_4BYTES( afd.height ); //dwHeight
- WRITE_4BYTES( 0 ); //dwReserved[ 0 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 1 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 2 ]
- WRITE_4BYTES( 0 ); //dwReserved[ 3 ]
-
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "strl" );
- WRITE_STRING( "strh" );
- WRITE_4BYTES( 56 ); //"strh" "chunk" size
- WRITE_STRING( "vids" );
-
- if( afd.motionJpeg )
- WRITE_STRING( "MJPG" );
- else
- WRITE_4BYTES( 0 ); // BI_RGB
-
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( 0 ); //dwPriority
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- WRITE_4BYTES( 1 ); //dwTimescale
- WRITE_4BYTES( afd.frameRate ); //dwDataRate
- WRITE_4BYTES( 0 ); //dwStartTime
- WRITE_4BYTES( afd.numVideoFrames ); //dwDataLength
-
- WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
- WRITE_4BYTES( -1 ); //dwQuality
- WRITE_4BYTES( 0 ); //dwSampleSize
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( afd.width ); //rcFrame
- WRITE_2BYTES( afd.height ); //rcFrame
-
- WRITE_STRING( "strf" );
- WRITE_4BYTES( 40 ); //"strf" "chunk" size
- WRITE_4BYTES( 40 ); //biSize
- WRITE_4BYTES( afd.width ); //biWidth
- WRITE_4BYTES( afd.height ); //biHeight
- WRITE_2BYTES( 1 ); //biPlanes
- WRITE_2BYTES( 24 ); //biBitCount
-
- if( afd.motionJpeg ) //biCompression
- {
- WRITE_STRING( "MJPG" );
- WRITE_4BYTES( afd.width *
- afd.height ); //biSizeImage
- }
- else
- {
- WRITE_4BYTES( 0 ); // BI_RGB
- WRITE_4BYTES( afd.width *
- afd.height * 3 ); //biSizeImage
- }
-
- WRITE_4BYTES( 0 ); //biXPelsPetMeter
- WRITE_4BYTES( 0 ); //biYPelsPetMeter
- WRITE_4BYTES( 0 ); //biClrUsed
- WRITE_4BYTES( 0 ); //biClrImportant
- }
- END_CHUNK( );
-
- if( afd.audio )
- {
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "strl" );
- WRITE_STRING( "strh" );
- WRITE_4BYTES( 56 ); //"strh" "chunk" size
- WRITE_STRING( "auds" );
- WRITE_4BYTES( 0 ); //FCC
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( 0 ); //dwPriority
- WRITE_4BYTES( 0 ); //dwInitialFrame
-
- WRITE_4BYTES( afd.a.sampleSize ); //dwTimescale
- WRITE_4BYTES( afd.a.sampleSize *
- afd.a.rate ); //dwDataRate
- WRITE_4BYTES( 0 ); //dwStartTime
- WRITE_4BYTES( afd.a.totalBytes /
- afd.a.sampleSize ); //dwDataLength
-
- WRITE_4BYTES( 0 ); //dwSuggestedBufferSize
- WRITE_4BYTES( -1 ); //dwQuality
- WRITE_4BYTES( afd.a.sampleSize ); //dwSampleSize
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
- WRITE_2BYTES( 0 ); //rcFrame
-
- WRITE_STRING( "strf" );
- WRITE_4BYTES( 18 ); //"strf" "chunk" size
- WRITE_2BYTES( afd.a.format ); //wFormatTag
- WRITE_2BYTES( afd.a.channels ); //nChannels
- WRITE_4BYTES( afd.a.rate ); //nSamplesPerSec
- WRITE_4BYTES( afd.a.sampleSize *
- afd.a.rate ); //nAvgBytesPerSec
- WRITE_2BYTES( afd.a.sampleSize ); //nBlockAlign
- WRITE_2BYTES( afd.a.bits ); //wBitsPerSample
- WRITE_2BYTES( 0 ); //cbSize
- }
- END_CHUNK( );
- }
- }
- END_CHUNK( );
-
- afd.moviOffset = bufIndex;
-
- START_CHUNK( "LIST" );
- {
- WRITE_STRING( "movi" );
- }
- }
- }
+void CL_WriteAVIHeader( void ) {
+ bufIndex = 0;
+ afd.chunkStackTop = 0;
+
+ START_CHUNK( "RIFF" );
+ {
+ WRITE_STRING( "AVI " );
+ {
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "hdrl" );
+ WRITE_STRING( "avih" );
+ WRITE_4BYTES( 56 ); //"avih" "chunk" size
+ WRITE_4BYTES( afd.framePeriod ); //dwMicroSecPerFrame
+ WRITE_4BYTES( afd.maxRecordSize *
+ afd.frameRate ); //dwMaxBytesPerSec
+ WRITE_4BYTES( 0 ); //dwReserved1
+ WRITE_4BYTES( 0x110 ); //dwFlags bits HAS_INDEX and IS_INTERLEAVED
+ WRITE_4BYTES( afd.numVideoFrames ); //dwTotalFrames
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ if ( afd.audio ) { //dwStreams
+ WRITE_4BYTES( 2 );
+ } else {
+ WRITE_4BYTES( 1 );
+ }
+
+ WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
+ WRITE_4BYTES( afd.width ); //dwWidth
+ WRITE_4BYTES( afd.height ); //dwHeight
+ WRITE_4BYTES( 0 ); //dwReserved[ 0 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 1 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 2 ]
+ WRITE_4BYTES( 0 ); //dwReserved[ 3 ]
+
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "strl" );
+ WRITE_STRING( "strh" );
+ WRITE_4BYTES( 56 ); //"strh" "chunk" size
+ WRITE_STRING( "vids" );
+
+ if ( afd.motionJpeg ) {
+ WRITE_STRING( "MJPG" );
+ } else {
+ WRITE_4BYTES( 0 ); // BI_RGB
+ }
+
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( 0 ); //dwPriority
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ WRITE_4BYTES( 1 ); //dwTimescale
+ WRITE_4BYTES( afd.frameRate ); //dwDataRate
+ WRITE_4BYTES( 0 ); //dwStartTime
+ WRITE_4BYTES( afd.numVideoFrames ); //dwDataLength
+
+ WRITE_4BYTES( afd.maxRecordSize ); //dwSuggestedBufferSize
+ WRITE_4BYTES( -1 ); //dwQuality
+ WRITE_4BYTES( 0 ); //dwSampleSize
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( afd.width ); //rcFrame
+ WRITE_2BYTES( afd.height ); //rcFrame
+
+ WRITE_STRING( "strf" );
+ WRITE_4BYTES( 40 ); //"strf" "chunk" size
+ WRITE_4BYTES( 40 ); //biSize
+ WRITE_4BYTES( afd.width ); //biWidth
+ WRITE_4BYTES( afd.height ); //biHeight
+ WRITE_2BYTES( 1 ); //biPlanes
+ WRITE_2BYTES( 24 ); //biBitCount
+
+ if ( afd.motionJpeg ) { //biCompression
+ WRITE_STRING( "MJPG" );
+ WRITE_4BYTES( afd.width * afd.height ); //biSizeImage
+ } else {
+ WRITE_4BYTES( 0 ); // BI_RGB
+ WRITE_4BYTES( afd.width * afd.height * 3 ); //biSizeImage
+ }
+
+ WRITE_4BYTES( 0 ); //biXPelsPetMeter
+ WRITE_4BYTES( 0 ); //biYPelsPetMeter
+ WRITE_4BYTES( 0 ); //biClrUsed
+ WRITE_4BYTES( 0 ); //biClrImportant
+ }
+ END_CHUNK();
+
+ if ( afd.audio ) {
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "strl" );
+ WRITE_STRING( "strh" );
+ WRITE_4BYTES( 56 ); //"strh" "chunk" size
+ WRITE_STRING( "auds" );
+ WRITE_4BYTES( 0 ); //FCC
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( 0 ); //dwPriority
+ WRITE_4BYTES( 0 ); //dwInitialFrame
+
+ WRITE_4BYTES( afd.a.sampleSize ); //dwTimescale
+ WRITE_4BYTES( afd.a.sampleSize * afd.a.rate ); //dwDataRate
+ WRITE_4BYTES( 0 ); //dwStartTime
+ WRITE_4BYTES( afd.a.totalBytes / afd.a.sampleSize ); //dwDataLength
+
+ WRITE_4BYTES( 0 ); //dwSuggestedBufferSize
+ WRITE_4BYTES( -1 ); //dwQuality
+ WRITE_4BYTES( afd.a.sampleSize ); //dwSampleSize
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+ WRITE_2BYTES( 0 ); //rcFrame
+
+ WRITE_STRING( "strf" );
+ WRITE_4BYTES( 18 ); //"strf" "chunk" size
+ WRITE_2BYTES( afd.a.format ); //wFormatTag
+ WRITE_2BYTES( afd.a.channels ); //nChannels
+ WRITE_4BYTES( afd.a.rate ); //nSamplesPerSec
+ WRITE_4BYTES( afd.a.sampleSize * afd.a.rate ); //nAvgBytesPerSec
+ WRITE_2BYTES( afd.a.sampleSize ); //nBlockAlign
+ WRITE_2BYTES( afd.a.bits ); //wBitsPerSample
+ WRITE_2BYTES( 0 ); //cbSize
+ }
+ END_CHUNK();
+ }
+ }
+ END_CHUNK();
+
+ afd.moviOffset = bufIndex;
+
+ START_CHUNK( "LIST" );
+ {
+ WRITE_STRING( "movi" );
+ }
+ }
+ }
}
/*
@@ -332,104 +318,93 @@ Creates an AVI file and gets it into a state where
writing the actual data can begin
===============
*/
-qboolean CL_OpenAVIForWriting( const char *fileName )
-{
- if( afd.fileOpen )
- return qfalse;
-
- Com_Memset( &afd, 0, sizeof( aviFileData_t ) );
-
- // Don't start if a framerate has not been chosen
- if( cl_aviFrameRate->integer <= 0 )
- {
- Com_Printf( S_COLOR_RED "cl_aviFrameRate must be >= 1\n" );
- return qfalse;
- }
-
- if( ( afd.f = FS_FOpenFileWrite( fileName ) ) <= 0 )
- return qfalse;
-
- if( ( afd.idxF = FS_FOpenFileWrite(
- va( "%s" INDEX_FILE_EXTENSION, fileName ) ) ) <= 0 )
- {
- FS_FCloseFile( afd.f );
- return qfalse;
- }
-
- Q_strncpyz( afd.fileName, fileName, MAX_QPATH );
-
- afd.frameRate = cl_aviFrameRate->integer;
- afd.framePeriod = (int)( 1000000.0f / afd.frameRate );
- afd.width = cls.glconfig.vidWidth;
- afd.height = cls.glconfig.vidHeight;
-
- if( cl_aviMotionJpeg->integer )
- afd.motionJpeg = qtrue;
- else
- afd.motionJpeg = qfalse;
-
- // Buffers only need to store RGB pixels.
- // Allocate a bit more space for the capture buffer to account for possible
- // padding at the end of pixel lines, and padding for alignment
- #define MAX_PACK_LEN 16
- afd.cBuffer = Z_Malloc((afd.width * 3 + MAX_PACK_LEN - 1) * afd.height + MAX_PACK_LEN - 1);
- // raw avi files have pixel lines start on 4-byte boundaries
- afd.eBuffer = Z_Malloc(PAD(afd.width * 3, AVI_LINE_PADDING) * afd.height);
-
- afd.a.rate = dma.speed;
- afd.a.format = WAV_FORMAT_PCM;
- afd.a.channels = dma.channels;
- afd.a.bits = dma.samplebits;
- afd.a.sampleSize = ( afd.a.bits / 8 ) * afd.a.channels;
-
- if( afd.a.rate % afd.frameRate )
- {
- int suggestRate = afd.frameRate;
-
- while( ( afd.a.rate % suggestRate ) && suggestRate >= 1 )
- suggestRate--;
-
- Com_Printf( S_COLOR_YELLOW "WARNING: cl_aviFrameRate is not a divisor "
- "of the audio rate, suggest %d\n", suggestRate );
- }
-
- if( !Cvar_VariableIntegerValue( "s_initsound" ) )
- {
- afd.audio = qfalse;
- }
- else if( Q_stricmp( Cvar_VariableString( "s_backend" ), "OpenAL" ) )
- {
- if( afd.a.bits != 16 || afd.a.channels != 2 )
- {
- Com_Printf( S_COLOR_YELLOW "WARNING: Audio format of %d bit/%d channels not supported",
- afd.a.bits, afd.a.channels );
- afd.audio = qfalse;
- }
- else
- afd.audio = qtrue;
- }
- else
- {
- afd.audio = qfalse;
- Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture is not supported "
- "with OpenAL. Set s_useOpenAL to 0 for audio capture\n" );
- }
-
- // This doesn't write a real header, but allocates the
- // correct amount of space at the beginning of the file
- CL_WriteAVIHeader( );
-
- SafeFS_Write( buffer, bufIndex, afd.f );
- afd.fileSize = bufIndex;
-
- bufIndex = 0;
- START_CHUNK( "idx1" );
- SafeFS_Write( buffer, bufIndex, afd.idxF );
-
- afd.moviSize = 4; // For the "movi"
- afd.fileOpen = qtrue;
-
- return qtrue;
+qboolean CL_OpenAVIForWriting( const char *fileName ) {
+ if ( afd.fileOpen ) {
+ return qfalse;
+ }
+
+ Com_Memset( &afd, 0, sizeof( aviFileData_t ) );
+
+ // Don't start if a framerate has not been chosen
+ if ( cl_aviFrameRate->integer <= 0 ) {
+ Com_Printf( S_COLOR_RED "cl_aviFrameRate must be >= 1\n" );
+ return qfalse;
+ }
+
+ if ( ( afd.f = FS_FOpenFileWrite( fileName ) ) <= 0 ) {
+ return qfalse;
+ }
+
+ if ( ( afd.idxF = FS_FOpenFileWrite( va( "%s" INDEX_FILE_EXTENSION, fileName ) ) ) <= 0 ) {
+ FS_FCloseFile( afd.f );
+ return qfalse;
+ }
+
+ Q_strncpyz( afd.fileName, fileName, MAX_QPATH );
+
+ afd.frameRate = cl_aviFrameRate->integer;
+ afd.framePeriod = (int)( 1000000.0f / afd.frameRate );
+ afd.width = cls.glconfig.vidWidth;
+ afd.height = cls.glconfig.vidHeight;
+
+ if ( cl_aviMotionJpeg->integer ) {
+ afd.motionJpeg = qtrue;
+ } else {
+ afd.motionJpeg = qfalse;
+ }
+
+ // Buffers only need to store RGB pixels.
+ // Allocate a bit more space for the capture buffer to account for possible
+ // padding at the end of pixel lines, and padding for alignment
+ afd.cBuffer = Z_Malloc( ( afd.width * 3 + MAX_PACK_LEN - 1 ) * afd.height + MAX_PACK_LEN - 1 );
+
+ // raw avi files have pixel lines start on 4-byte boundaries
+ afd.eBuffer = Z_Malloc( PAD( afd.width * 3, AVI_LINE_PADDING ) * afd.height );
+
+ afd.a.rate = dma.speed;
+ afd.a.format = WAV_FORMAT_PCM;
+ afd.a.channels = dma.channels;
+ afd.a.bits = dma.samplebits;
+ afd.a.sampleSize = ( afd.a.bits / 8 ) * afd.a.channels;
+
+ if ( afd.a.rate % afd.frameRate ) {
+ int suggestRate = afd.frameRate;
+
+ while ( ( afd.a.rate % suggestRate ) && suggestRate >= 1 )
+ suggestRate--;
+
+ Com_Printf( S_COLOR_YELLOW "WARNING: cl_aviFrameRate is not a divisor of the audio rate, suggest %d\n", suggestRate );
+ }
+
+ if ( !Cvar_VariableIntegerValue( "s_initsound" ) ) {
+ afd.audio = qfalse;
+ } else if ( Q_stricmp( Cvar_VariableString( "s_backend" ), "OpenAL" ) ) {
+ if ( afd.a.bits != 16 || afd.a.channels != 2 ) {
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio format of %d bit/%d channels not supported", afd.a.bits, afd.a.channels );
+ afd.audio = qfalse;
+ } else {
+ afd.audio = qtrue;
+ }
+ } else {
+ afd.audio = qfalse;
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture is not supported with OpenAL. Set s_useOpenAL to 0 for audio capture\n" );
+ }
+
+ // This doesn't write a real header, but allocates the
+ // correct amount of space at the beginning of the file
+ CL_WriteAVIHeader();
+
+ SafeFS_Write( buffer, bufIndex, afd.f );
+ afd.fileSize = bufIndex;
+
+ bufIndex = 0;
+ START_CHUNK( "idx1" );
+ SafeFS_Write( buffer, bufIndex, afd.idxF );
+
+ afd.moviSize = 4; // For the "movi"
+ afd.fileOpen = qtrue;
+
+ return qtrue;
}
/*
@@ -437,30 +412,28 @@ qboolean CL_OpenAVIForWriting( const char *fileName )
CL_CheckFileSize
===============
*/
-static qboolean CL_CheckFileSize( int bytesToAdd )
-{
- unsigned int newFileSize;
+static qboolean CL_CheckFileSize( int bytesToAdd ) {
+ unsigned int newFileSize;
- newFileSize =
- afd.fileSize + // Current file size
- bytesToAdd + // What we want to add
- ( afd.numIndices * 16 ) + // The index
- 4; // The index size
+ newFileSize =
+ afd.fileSize + // Current file size
+ bytesToAdd + // What we want to add
+ ( afd.numIndices * 16 ) + // The index
+ 4; // The index size
- // I assume all the operating systems
- // we target can handle a 2Gb file
- if( newFileSize > INT_MAX )
- {
- // Close the current file...
- CL_CloseAVI( );
+ // I assume all the operating systems
+ // we target can handle a 2GB file
+ if ( newFileSize > INT_MAX ) {
+ // Close the current file...
+ CL_CloseAVI();
- // ...And open a new one
- CL_OpenAVIForWriting( va( "%s_", afd.fileName ) );
+ // ...And open a new one
+ CL_OpenAVIForWriting( va( "%s_", afd.fileName ) );
- return qtrue;
- }
+ return qtrue;
+ }
- return qfalse;
+ return qfalse;
}
/*
@@ -468,44 +441,46 @@ static qboolean CL_CheckFileSize( int bytesToAdd )
CL_WriteAVIVideoFrame
===============
*/
-void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size )
-{
- int chunkOffset = afd.fileSize - afd.moviOffset - 8;
- int chunkSize = 8 + size;
- int paddingSize = PADLEN(size, 2);
- byte padding[ 4 ] = { 0 };
-
- if( !afd.fileOpen )
- return;
-
- // Chunk header + contents + padding
- if( CL_CheckFileSize( 8 + size + 2 ) )
- return;
-
- bufIndex = 0;
- WRITE_STRING( "00dc" );
- WRITE_4BYTES( size );
-
- SafeFS_Write( buffer, 8, afd.f );
- SafeFS_Write( imageBuffer, size, afd.f );
- SafeFS_Write( padding, paddingSize, afd.f );
- afd.fileSize += ( chunkSize + paddingSize );
-
- afd.numVideoFrames++;
- afd.moviSize += ( chunkSize + paddingSize );
-
- if( size > afd.maxRecordSize )
- afd.maxRecordSize = size;
-
- // Index
- bufIndex = 0;
- WRITE_STRING( "00dc" ); //dwIdentifier
- WRITE_4BYTES( 0x00000010 ); //dwFlags (all frames are KeyFrames)
- WRITE_4BYTES( chunkOffset ); //dwOffset
- WRITE_4BYTES( size ); //dwLength
- SafeFS_Write( buffer, 16, afd.idxF );
-
- afd.numIndices++;
+void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size ) {
+ int chunkOffset = afd.fileSize - afd.moviOffset - 8;
+ int chunkSize = 8 + size;
+ int paddingSize = PADLEN( size, 2 );
+ byte padding[ 4 ] = { 0 };
+
+ if ( !afd.fileOpen ) {
+ return;
+ }
+
+ // Chunk header + contents + padding
+ if ( CL_CheckFileSize( 8 + size + 2 ) ) {
+ return;
+ }
+
+ bufIndex = 0;
+ WRITE_STRING( "00dc" );
+ WRITE_4BYTES( size );
+
+ SafeFS_Write( buffer, 8, afd.f );
+ SafeFS_Write( imageBuffer, size, afd.f );
+ SafeFS_Write( padding, paddingSize, afd.f );
+ afd.fileSize += ( chunkSize + paddingSize );
+
+ afd.numVideoFrames++;
+ afd.moviSize += ( chunkSize + paddingSize );
+
+ if ( size > afd.maxRecordSize ) {
+ afd.maxRecordSize = size;
+ }
+
+ // Index
+ bufIndex = 0;
+ WRITE_STRING( "00dc" ); //dwIdentifier
+ WRITE_4BYTES( 0x00000010 ); //dwFlags (all frames are KeyFrames)
+ WRITE_4BYTES( chunkOffset ); //dwOffset
+ WRITE_4BYTES( size ); //dwLength
+ SafeFS_Write( buffer, 16, afd.idxF );
+
+ afd.numIndices++;
}
#define PCM_BUFFER_SIZE 44100
@@ -515,65 +490,63 @@ void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size )
CL_WriteAVIAudioFrame
===============
*/
-void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size )
-{
- static byte pcmCaptureBuffer[ PCM_BUFFER_SIZE ] = { 0 };
- static int bytesInBuffer = 0;
-
- if( !afd.audio )
- return;
-
- if( !afd.fileOpen )
- return;
-
- // Chunk header + contents + padding
- if( CL_CheckFileSize( 8 + bytesInBuffer + size + 2 ) )
- return;
-
- if( bytesInBuffer + size > PCM_BUFFER_SIZE )
- {
- Com_Printf( S_COLOR_YELLOW
- "WARNING: Audio capture buffer overflow -- truncating\n" );
- size = PCM_BUFFER_SIZE - bytesInBuffer;
- }
-
- Com_Memcpy( &pcmCaptureBuffer[ bytesInBuffer ], pcmBuffer, size );
- bytesInBuffer += size;
-
- // Only write if we have a frame's worth of audio
- if( bytesInBuffer >= (int)ceil( (float)afd.a.rate / (float)afd.frameRate ) *
- afd.a.sampleSize )
- {
- int chunkOffset = afd.fileSize - afd.moviOffset - 8;
- int chunkSize = 8 + bytesInBuffer;
- int paddingSize = PADLEN(bytesInBuffer, 2);
- byte padding[ 4 ] = { 0 };
-
- bufIndex = 0;
- WRITE_STRING( "01wb" );
- WRITE_4BYTES( bytesInBuffer );
-
- SafeFS_Write( buffer, 8, afd.f );
- SafeFS_Write( pcmCaptureBuffer, bytesInBuffer, afd.f );
- SafeFS_Write( padding, paddingSize, afd.f );
- afd.fileSize += ( chunkSize + paddingSize );
-
- afd.numAudioFrames++;
- afd.moviSize += ( chunkSize + paddingSize );
- afd.a.totalBytes += bytesInBuffer;
-
- // Index
- bufIndex = 0;
- WRITE_STRING( "01wb" ); //dwIdentifier
- WRITE_4BYTES( 0 ); //dwFlags
- WRITE_4BYTES( chunkOffset ); //dwOffset
- WRITE_4BYTES( bytesInBuffer ); //dwLength
- SafeFS_Write( buffer, 16, afd.idxF );
-
- afd.numIndices++;
-
- bytesInBuffer = 0;
- }
+void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size ) {
+ static byte pcmCaptureBuffer[ PCM_BUFFER_SIZE ] = { 0 };
+ static int bytesInBuffer = 0;
+
+ if ( !afd.audio ) {
+ return;
+ }
+
+ if ( !afd.fileOpen ) {
+ return;
+ }
+
+ // Chunk header + contents + padding
+ if ( CL_CheckFileSize( 8 + bytesInBuffer + size + 2 ) ) {
+ return;
+ }
+
+ if ( bytesInBuffer + size > PCM_BUFFER_SIZE ) {
+ Com_Printf( S_COLOR_YELLOW "WARNING: Audio capture buffer overflow -- truncating\n" );
+ size = PCM_BUFFER_SIZE - bytesInBuffer;
+ }
+
+ Com_Memcpy( &pcmCaptureBuffer[ bytesInBuffer ], pcmBuffer, size );
+ bytesInBuffer += size;
+
+ // Only write if we have a frame's worth of audio
+ if ( bytesInBuffer >= (int)ceil( (float)afd.a.rate / (float)afd.frameRate ) * afd.a.sampleSize ) {
+ int chunkOffset = afd.fileSize - afd.moviOffset - 8;
+ int chunkSize = 8 + bytesInBuffer;
+ int paddingSize = PADLEN( bytesInBuffer, 2 );
+ byte padding[ 4 ] = { 0 };
+
+ bufIndex = 0;
+ WRITE_STRING( "01wb" );
+ WRITE_4BYTES( bytesInBuffer );
+
+ SafeFS_Write( buffer, 8, afd.f );
+ SafeFS_Write( pcmCaptureBuffer, bytesInBuffer, afd.f );
+ SafeFS_Write( padding, paddingSize, afd.f );
+ afd.fileSize += ( chunkSize + paddingSize );
+
+ afd.numAudioFrames++;
+ afd.moviSize += ( chunkSize + paddingSize );
+ afd.a.totalBytes += bytesInBuffer;
+
+ // Index
+ bufIndex = 0;
+ WRITE_STRING( "01wb" ); //dwIdentifier
+ WRITE_4BYTES( 0 ); //dwFlags
+ WRITE_4BYTES( chunkOffset ); //dwOffset
+ WRITE_4BYTES( bytesInBuffer ); //dwLength
+ SafeFS_Write( buffer, 16, afd.idxF );
+
+ afd.numIndices++;
+
+ bytesInBuffer = 0;
+ }
}
/*
@@ -581,14 +554,13 @@ void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size )
CL_TakeVideoFrame
===============
*/
-void CL_TakeVideoFrame( void )
-{
- // AVI file isn't open
- if( !afd.fileOpen )
- return;
+void CL_TakeVideoFrame( void ) {
+ // AVI file isn't open
+ if ( !afd.fileOpen ) {
+ return;
+ }
- re.TakeVideoFrame( afd.width, afd.height,
- afd.cBuffer, afd.eBuffer, afd.motionJpeg );
+ re.TakeVideoFrame( afd.width, afd.height, afd.cBuffer, afd.eBuffer, afd.motionJpeg );
}
/*
@@ -598,71 +570,69 @@ CL_CloseAVI
Closes the AVI file and writes an index chunk
===============
*/
-qboolean CL_CloseAVI( void )
-{
- int indexRemainder;
- int indexSize = afd.numIndices * 16;
- const char *idxFileName = va( "%s" INDEX_FILE_EXTENSION, afd.fileName );
+qboolean CL_CloseAVI( void ) {
+ int indexRemainder;
+ int indexSize = afd.numIndices * 16;
+ const char *idxFileName = va( "%s" INDEX_FILE_EXTENSION, afd.fileName );
- // AVI file isn't open
- if( !afd.fileOpen )
- return qfalse;
+ // AVI file isn't open
+ if ( !afd.fileOpen ) {
+ return qfalse;
+ }
- afd.fileOpen = qfalse;
+ afd.fileOpen = qfalse;
- FS_Seek( afd.idxF, 4, FS_SEEK_SET );
- bufIndex = 0;
- WRITE_4BYTES( indexSize );
- SafeFS_Write( buffer, bufIndex, afd.idxF );
- FS_FCloseFile( afd.idxF );
+ FS_Seek( afd.idxF, 4, FS_SEEK_SET );
+ bufIndex = 0;
+ WRITE_4BYTES( indexSize );
+ SafeFS_Write( buffer, bufIndex, afd.idxF );
+ FS_FCloseFile( afd.idxF );
- // Write index
+ // Write index
- // Open the temp index file
- if( ( indexSize = FS_FOpenFileRead( idxFileName,
- &afd.idxF, qtrue ) ) <= 0 )
- {
- FS_FCloseFile( afd.f );
- return qfalse;
- }
+ // Open the temp index file
+ if ( ( indexSize = FS_FOpenFileRead( idxFileName, &afd.idxF, qtrue ) ) <= 0 ) {
+ FS_FCloseFile( afd.f );
+ return qfalse;
+ }
- indexRemainder = indexSize;
+ indexRemainder = indexSize;
- // Append index to end of avi file
- while( indexRemainder > MAX_AVI_BUFFER )
- {
- FS_Read( buffer, MAX_AVI_BUFFER, afd.idxF );
- SafeFS_Write( buffer, MAX_AVI_BUFFER, afd.f );
- afd.fileSize += MAX_AVI_BUFFER;
- indexRemainder -= MAX_AVI_BUFFER;
- }
- FS_Read( buffer, indexRemainder, afd.idxF );
- SafeFS_Write( buffer, indexRemainder, afd.f );
- afd.fileSize += indexRemainder;
- FS_FCloseFile( afd.idxF );
+ // Append index to end of avi file
+ while ( indexRemainder > MAX_AVI_BUFFER )
+ {
+ FS_Read( buffer, MAX_AVI_BUFFER, afd.idxF );
+ SafeFS_Write( buffer, MAX_AVI_BUFFER, afd.f );
+ afd.fileSize += MAX_AVI_BUFFER;
+ indexRemainder -= MAX_AVI_BUFFER;
+ }
+ FS_Read( buffer, indexRemainder, afd.idxF );
+ SafeFS_Write( buffer, indexRemainder, afd.f );
+ afd.fileSize += indexRemainder;
+ FS_FCloseFile( afd.idxF );
- // Remove temp index file
- FS_HomeRemove( idxFileName );
+ // Remove temp index file
+ FS_HomeRemove( idxFileName );
- // Write the real header
- FS_Seek( afd.f, 0, FS_SEEK_SET );
- CL_WriteAVIHeader( );
+ // Write the real header
+ FS_Seek( afd.f, 0, FS_SEEK_SET );
+ CL_WriteAVIHeader();
- bufIndex = 4;
- WRITE_4BYTES( afd.fileSize - 8 ); // "RIFF" size
+ bufIndex = 4;
+ WRITE_4BYTES( afd.fileSize - 8 ); // "RIFF" size
- bufIndex = afd.moviOffset + 4; // Skip "LIST"
- WRITE_4BYTES( afd.moviSize );
+ bufIndex = afd.moviOffset + 4; // Skip "LIST"
+ WRITE_4BYTES( afd.moviSize );
- SafeFS_Write( buffer, bufIndex, afd.f );
+ SafeFS_Write( buffer, bufIndex, afd.f );
- Z_Free( afd.cBuffer );
- Z_Free( afd.eBuffer );
- FS_FCloseFile( afd.f );
+ Z_Free( afd.cBuffer );
+ Z_Free( afd.eBuffer );
+ FS_FCloseFile( afd.f );
- Com_Printf( "Wrote %d:%d frames to %s\n", afd.numVideoFrames, afd.numAudioFrames, afd.fileName );
+ Com_Printf( "Wrote %d:%d frames to %s\n", afd.numVideoFrames, afd.numAudioFrames, afd.fileName );
- return qtrue;
+ return qtrue;
}
/*
@@ -670,7 +640,6 @@ qboolean CL_CloseAVI( void )
CL_VideoRecording
===============
*/
-qboolean CL_VideoRecording( void )
-{
- return afd.fileOpen;
+qboolean CL_VideoRecording( void ) {
+ return afd.fileOpen;
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git
More information about the Pkg-games-commits
mailing list