diff --git a/code/client/cl_main.c b/code/client/cl_main.c index 5a30a681..143e1201 100644 --- a/code/client/cl_main.c +++ b/code/client/cl_main.c @@ -2940,13 +2940,13 @@ void CL_Frame ( int msec ) { if ( CL_VideoRecording( ) && cl_aviFrameRate->integer && msec) { // save the current screen if ( clc.state == CA_ACTIVE || cl_forceavidemo->integer) { + float fps = MIN(cl_aviFrameRate->value * com_timescale->value, 1000.0f); + float frameDuration = MAX(1000.0f / fps, 1.0f) + clc.aviVideoFrameRemainder; + CL_TakeVideoFrame( ); - // fixed time for next frame' - msec = (int)ceil( (1000.0f / cl_aviFrameRate->value) * com_timescale->value ); - if (msec == 0) { - msec = 1; - } + msec = (int)frameDuration; + clc.aviVideoFrameRemainder = frameDuration - msec; } } diff --git a/code/client/client.h b/code/client/client.h index a6155555..a9b3e51e 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -233,6 +233,9 @@ typedef struct { int timeDemoMaxDuration; // maximum frame duration unsigned char timeDemoDurations[ MAX_TIMEDEMO_DURATIONS ]; // log of frame durations + float aviVideoFrameRemainder; + float aviSoundFrameRemainder; + #ifdef USE_VOIP qboolean voipEnabled; qboolean speexInitialized; diff --git a/code/client/snd_dma.c b/code/client/snd_dma.c index 869c6197..1e78f350 100644 --- a/code/client/snd_dma.c +++ b/code/client/snd_dma.c @@ -1242,7 +1242,13 @@ void S_GetSoundtime(void) if( CL_VideoRecording( ) ) { - s_soundtime += (int)ceil( dma.speed / cl_aviFrameRate->value ); + float fps = MIN(cl_aviFrameRate->value, 1000.0f); + float frameDuration = MAX(dma.speed / fps, 1.0f) + clc.aviSoundFrameRemainder; + + int msec = (int)frameDuration; + s_soundtime += msec; + clc.aviSoundFrameRemainder = frameDuration - msec; + return; }