From 5935425e12fda26e568edeb961d7ff040baa3652 Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 21 Apr 2005 01:26:44 +0000 Subject: [PATCH] added cl_capturevideo_sound (defaulted to 0) to allow enabling/disabling sound saving, with sound disabled you can save videos at a framerate your machine can't maintain (no sound sync to worry about) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5205 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_screen.c | 28 +++++++++++++++++++++------- host.c | 6 +++++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cl_screen.c b/cl_screen.c index 392feb94..9fa066f8 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -23,6 +23,7 @@ cvar_t scr_screenshot_jpeg_quality = {CVAR_SAVE, "scr_screenshot_jpeg_quality"," cvar_t scr_screenshot_gamma = {CVAR_SAVE, "scr_screenshot_gamma","2.2"}; cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp"}; cvar_t cl_capturevideo = {0, "cl_capturevideo", "0"}; +cvar_t cl_capturevideo_sound = {0, "cl_capturevideo_sound", "0"}; cvar_t cl_capturevideo_fps = {0, "cl_capturevideo_fps", "30"}; cvar_t cl_capturevideo_rawrgb = {0, "cl_capturevideo_rawrgb", "0"}; cvar_t cl_capturevideo_rawyv12 = {0, "cl_capturevideo_rawyv12", "0"}; @@ -466,6 +467,7 @@ void CL_Screen_Init(void) Cvar_RegisterVariable (&scr_screenshot_jpeg_quality); Cvar_RegisterVariable (&scr_screenshot_gamma); Cvar_RegisterVariable (&cl_capturevideo); + Cvar_RegisterVariable (&cl_capturevideo_sound); Cvar_RegisterVariable (&cl_capturevideo_fps); Cvar_RegisterVariable (&cl_capturevideo_rawrgb); Cvar_RegisterVariable (&cl_capturevideo_rawyv12); @@ -722,7 +724,7 @@ static int cl_capturevideo_soundrate = 0; static int cl_capturevideo_frame = 0; static qbyte *cl_capturevideo_buffer = NULL; static qfile_t *cl_capturevideo_videofile = NULL; -static qfile_t *cl_capturevideo_soundfile = NULL; +qfile_t *cl_capturevideo_soundfile = NULL; static short cl_capturevideo_rgbtoyuvscaletable[3][3][256]; static unsigned char cl_capturevideo_yuvnormalizetable[3][256]; //static unsigned char cl_capturevideo_rgbgammatable[3][256]; @@ -802,11 +804,15 @@ Cr = R * .500 + G * -.419 + B * -.0813 + 128.; cl_capturevideo_videofile = NULL; } - cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false, true); - - // wave header will be filled out when video ends - memset(out, 0, 44); - FS_Write (cl_capturevideo_soundfile, out, 44); + if (cl_capturevideo_sound.integer) + { + cl_capturevideo_soundfile = FS_Open ("video/dpvideo.wav", "wb", false, true); + // wave header will be filled out when video ends + memset(out, 0, 44); + FS_Write (cl_capturevideo_soundfile, out, 44); + } + else + cl_capturevideo_soundfile = NULL; } void SCR_CaptureVideo_EndVideo(void) @@ -967,6 +973,8 @@ qboolean SCR_CaptureVideo_VideoFrame(int newframenum) void SCR_CaptureVideo_SoundFrame(qbyte *bufstereo16le, size_t length, int rate) { + if (!cl_capturevideo_soundfile) + return; cl_capturevideo_soundrate = rate; if (FS_Write (cl_capturevideo_soundfile, bufstereo16le, 4 * length) < 4 * length) { @@ -988,7 +996,13 @@ void SCR_CaptureVideo(void) Con_Printf("You can not change the video framerate while recording a video.\n"); Cvar_SetValueQuick(&cl_capturevideo_fps, cl_capturevideo_framerate); } - newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate; + if (cl_capturevideo_soundfile) + { + // preserve sound sync by duplicating frames when running slow + newframenum = (Sys_DoubleTime() - cl_capturevideo_starttime) * cl_capturevideo_framerate; + } + else + newframenum = cl_capturevideo_frame + 1; // if falling behind more than one second, stop if (newframenum - cl_capturevideo_frame > (int)ceil(cl_capturevideo_framerate)) { diff --git a/host.c b/host.c index 58988498..fd66518c 100644 --- a/host.c +++ b/host.c @@ -556,6 +556,7 @@ Returns false if the time is too short to run a frame */ extern qboolean cl_capturevideo_active; extern double cl_capturevideo_framerate; +extern qfile_t *cl_capturevideo_soundfile; qboolean Host_FilterTime (double time) { double timecap, timeleft; @@ -592,7 +593,7 @@ qboolean Host_FilterTime (double time) timecap = 1.0 / cl_maxfps.value; } - timeleft = (oldrealtime - realtime) + timecap; + timeleft = timecap - (realtime - oldrealtime); if (timeleft > 0) { int msleft; @@ -619,6 +620,9 @@ qboolean Host_FilterTime (double time) host_realframetime = host_frametime = realtime - oldrealtime; oldrealtime = realtime; + if (cl_capturevideo_active && !cl_capturevideo_soundfile) + host_frametime = timecap; + // apply slowmo scaling host_frametime *= slowmo.value; -- 2.39.2