diff options
-rw-r--r-- | src/client/cl_avi.c | 48 | ||||
-rw-r--r-- | src/qcommon/files.c | 6 |
2 files changed, 48 insertions, 6 deletions
diff --git a/src/client/cl_avi.c b/src/client/cl_avi.c index 178260be..1806b4fa 100644 --- a/src/client/cl_avi.c +++ b/src/client/cl_avi.c @@ -23,6 +23,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "client.h" #include "snd_local.h" +#define INDEX_FILE_EXTENSION ".index.dat" + #define MAX_RIFF_CHUNKS 16 typedef struct audioFormat_s @@ -341,7 +343,8 @@ qboolean CL_OpenAVIForWriting( const char *fileName ) if( ( afd.f = FS_FOpenFileWrite( fileName ) ) <= 0 ) return qfalse; - if( ( afd.idxF = FS_FOpenFileWrite( va( "%s.idx", fileName ) ) ) <= 0 ) + if( ( afd.idxF = FS_FOpenFileWrite( + va( "%s" INDEX_FILE_EXTENSION, fileName ) ) ) <= 0 ) { FS_FCloseFile( afd.f ); return qfalse; @@ -416,6 +419,37 @@ qboolean CL_OpenAVIForWriting( const char *fileName ) /* =============== +CL_CheckFileSize +=============== +*/ +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 + + // 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 ) ); + + return qtrue; + } + + return qfalse; +} + +/* +=============== CL_WriteAVIVideoFrame =============== */ @@ -429,6 +463,10 @@ void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size ) if( !afd.fileOpen ) return; + // Chunk header + contents + padding + if( CL_CheckFileSize( 8 + size + 2 ) ) + return; + bufIndex = 0; WRITE_STRING( "00dc" ); WRITE_4BYTES( size ); @@ -473,6 +511,10 @@ void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size ) 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 @@ -484,7 +526,7 @@ void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size ) bytesInBuffer += size; // Only write if we have a frame's worth of audio - if( bytesInBuffer >= (int)ceil( afd.a.rate / cl_aviFrameRate->value ) * + if( bytesInBuffer >= (int)ceil( (float)afd.a.rate / (float)afd.frameRate ) * afd.a.sampleSize ) { int chunkOffset = afd.fileSize - afd.moviOffset - 8; @@ -545,7 +587,7 @@ qboolean CL_CloseAVI( void ) { int indexRemainder; int indexSize = afd.numIndices * 16; - const char *idxFileName = va( "%s.idx", afd.fileName ); + const char *idxFileName = va( "%s" INDEX_FILE_EXTENSION, afd.fileName ); // AVI file isn't open if( !afd.fileOpen ) diff --git a/src/qcommon/files.c b/src/qcommon/files.c index b24b36fd..84db5b18 100644 --- a/src/qcommon/files.c +++ b/src/qcommon/files.c @@ -1109,9 +1109,9 @@ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueF } } - // qagame.qvm - 13 - // dTZT`X!di` - if (!(pak->referenced & FS_QAGAME_REF) && FS_ShiftedStrStr(filename, "dTZT`X!di`", 13)) { + // game.qvm - 13 + // ZT`X!di` + if (!(pak->referenced & FS_QAGAME_REF) && FS_ShiftedStrStr(filename, "ZT`X!di`", 13)) { pak->referenced |= FS_QAGAME_REF; } // cgame.qvm - 7 |