r646 - trunk/code/client
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Mar 15 17:41:38 EST 2006
Author: tma
Date: 2006-03-15 17:41:38 -0500 (Wed, 15 Mar 2006)
New Revision: 646
Modified:
trunk/code/client/cl_avi.c
Log:
* Video export doesn't crap out with sv_pure 1 anymore
* Video export doesn't crap out when writing > 2Gb files anymore
Modified: trunk/code/client/cl_avi.c
===================================================================
--- trunk/code/client/cl_avi.c 2006-03-15 00:40:03 UTC (rev 645)
+++ trunk/code/client/cl_avi.c 2006-03-15 22:41:38 UTC (rev 646)
@@ -23,6 +23,8 @@
#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 @@
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 @@
/*
===============
+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 @@
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 @@
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 @@
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 @@
{
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 )
More information about the quake3-commits
mailing list