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