short* Movie_SoundBuffer(void) { if (!movie_is_avi || !Movie_IsCapturing()) return NULL; return capture_audio_samples + (captured_audio_samples << 1); }
// Moves the local angle positions. void CL_AdjustAngles (void) { float basespeed, speed, up, down, frametime; if (Movie_IsCapturing() && movie_steadycam.value) frametime = movie_fps.value > 0 ? 1.0 / movie_fps.value : 1 / 30.0; else frametime = cls.trueframetime; basespeed = ((in_speed.state & 1) ? cl_anglespeedkey.value : 1); if (!(in_strafe.state & 1)) { speed = basespeed * cl_yawspeed.value; if ((cl.fpd & FPD_LIMIT_YAW) || allow_scripts.value < 2) speed = bound(-900, speed, 900); speed *= frametime; cl.viewangles[YAW] -= speed * CL_KeyState(&in_right, true); cl.viewangles[YAW] += speed * CL_KeyState(&in_left, true); if (cl.viewangles[YAW] < 0) cl.viewangles[YAW] += 360.0; else if (cl.viewangles[YAW] > 360) cl.viewangles[YAW] -= 360.0; } speed = basespeed * cl_pitchspeed.value; if ((cl.fpd & FPD_LIMIT_PITCH) || allow_scripts.value == 0) speed = bound(-700, speed, 700); speed *= frametime; if (in_klook.state & 1) { V_StopPitchDrift (); cl.viewangles[PITCH] -= speed * CL_KeyState(&in_forward, true); cl.viewangles[PITCH] += speed * CL_KeyState(&in_back, true); } up = CL_KeyState(&in_lookup, true); down = CL_KeyState(&in_lookdown, true); cl.viewangles[PITCH] -= speed * up; cl.viewangles[PITCH] += speed * down; if (up || down) V_StopPitchDrift(); if (cl.viewangles[PITCH] > cl.maxpitch) cl.viewangles[PITCH] = cl.maxpitch; if (cl.viewangles[PITCH] < cl.minpitch) cl.viewangles[PITCH] = cl.minpitch; //cl.viewangles[PITCH] = bound(cl.min!pitch, cl.viewangles[PITCH], cl.ma!xpitch); cl.viewangles[ROLL] = bound(-50, cl.viewangles[ROLL], 50); }
void Movie_TransferStereo16(void) { if (!movie_is_avi || !Movie_IsCapturing()) return; // Copy last audio chunk written into our temporary buffer memcpy (capture_audio_samples + (captured_audio_samples << 1), snd_out, snd_linear_count * shm->format.channels); captured_audio_samples += (snd_linear_count >> 1); if (captured_audio_samples >= (int)(0.5 + cls.frametime * shm->format.speed)) { // We have enough audio samples to match one frame of video Capture_WriteAudio (captured_audio_samples, (byte *)capture_audio_samples); captured_audio_samples = 0; } }
qbool Movie_GetSoundtime(void) { int views = 1; float demospeed = Demo_GetSpeed(); if (!movie_is_avi || !Movie_IsCapturing() || !demospeed) return false; if (cl_multiview.value) { views = cl_multiview.value; } soundtime += (int)(0.5 + cls.frametime * shm->format.speed * views * (1.0 / demospeed)); //joe: fix for slowmo/fast forward return true; }
void Movie_Demo_Capture_f(void) { int argc; double time; char *error; error = va("Usage: %s <start time | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3) { Com_Printf(error); return; } if (argc == 2) { if (Q_strncasecmp("stop", Cmd_Argv(1), 4)) Com_Printf(error); else if (Movie_IsCapturing()) Movie_Stop(); else Com_Printf("%s : Not capturing\n", Cmd_Argv(0)); return; } if (Q_strncasecmp("start", Cmd_Argv(1), 5)) { Com_Printf(error); return; } else if (Movie_IsCapturing()) { Com_Printf("%s : Already capturing\n", Cmd_Argv(0)); return; } if (!cls.demoplayback || cls.timedemo) { Com_Printf("%s : Must be playing a demo to capture\n", Cmd_Argv(0)); return; } if ((time = Q_atof(Cmd_Argv(2))) <= 0) { Com_Printf("%s : Time argument must be positive\n", Cmd_Argv(0)); return; } Movie_Start(time); }
static qboolean OnChange_movie_dir(cvar_t *var, char *string) { if (Movie_IsCapturing()) { Com_Printf("Cannot change demo_capture_dir whilst capturing. Use 'demo_capture stop' to cease capturing first.\n"); return true; } else if (strlen(string) > 31) { Com_Printf("demo_capture_dir can only contain a maximum of 31 characters\n"); return true; } Util_Process_Filename(string); if (!(Util_Is_Valid_Filename(string))) { Com_Printf(Util_Invalid_Filename_Msg("demo_capture_dir")); return true; } return false; }
qbool Movie_GetSoundtime(void) { int views = 1; extern cvar_t cl_demospeed; if (!movie_is_avi || !Movie_IsCapturing() || !cl_demospeed.value) return false; if (cl_multiview.value) { views = cl_multiview.value; } soundtime += (int)(0.5 + cls.frametime * shm->format.speed * views * (1.0 / cl_demospeed.value)); //joe: fix for slowmo/fast forward return true; }
void S_ExtraUpdate (void) { //joe: capturing audio #ifdef _WIN32 if (Movie_IsCapturing() && movie_is_avi) return; #endif #ifdef _WIN32 IN_Accumulate (); #endif if (s_noextraupdate.value || !sound_spatialized) return; // don't pollute timings S_Update_(); }
void Movie_FinishFrame(void) { char fname[128]; if (!Movie_IsCapturing()) return; #ifdef _WIN32 snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.wDay, movie_start_date.wMonth, movie_start_date.wYear, movie_start_date.wHour, movie_start_date.wMinute, movie_start_date.wSecond, movie_frame_count, image_ext); #else snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.tm_mday, movie_start_date.tm_mon, movie_start_date.tm_year, movie_start_date.tm_hour, movie_start_date.tm_min, movie_start_date.tm_sec, movie_frame_count, image_ext); #endif SCR_Screenshot(fname); movie_frame_count++; if (cls.realtime >= movie_start_time + movie_len) Movie_Stop(); }
void CL_FinishMove (usercmd_t *cmd) { int i, ms; float frametime; static double extramsec = 0; extern cvar_t allow_scripts; if (Movie_IsCapturing() && movie_steadycam.value) frametime = movie_fps.value > 0 ? 1.0 / movie_fps.value : 1 / 30.0; else frametime = cls.trueframetime; // figure button bits if ( in_attack.state & 3 ) cmd->buttons |= 1; in_attack.state &= ~2; if (in_jump.state & 3) cmd->buttons |= 2; in_jump.state &= ~2; if (in_use.state & 3) cmd->buttons |= 4; in_use.state &= ~2; if (in_attack2.state & 3) cmd->buttons |= 8; in_attack2.state &= ~2; // send milliseconds of time to apply the move //#fps extramsec += cls.frametime * 1000; extramsec += (cl_independentPhysics.value == 0 ? frametime : physframetime) * 1000; //#fps ms = extramsec; extramsec -= ms; if (ms > 250) ms = 100; // time was unreasonable cmd->msec = ms; VectorCopy (cl.viewangles, cmd->angles); // shaman RFE 1030281 { // KTPro's KFJump == impulse 156 // KTPro's KRJump == impulse 164 if ( *Info_ValueForKey(cl.serverinfo, "kmod") && ( ((in_impulse == 156) && (cl.fpd & FPD_LIMIT_YAW || allow_scripts.value < 2)) || ((in_impulse == 164) && (cl.fpd & FPD_LIMIT_PITCH || allow_scripts.value == 0)) ) ) { cmd->impulse = 0; } else { cmd->impulse = in_impulse; } // } shaman RFE 1030281 in_impulse = 0; // chop down so no extra bits are kept that the server wouldn't get cmd->forwardmove = MakeChar (cmd->forwardmove); cmd->sidemove = MakeChar (cmd->sidemove); cmd->upmove = MakeChar (cmd->upmove); for (i = 0; i < 3; i++) cmd->angles[i] = (Q_rint(cmd->angles[i] * 65536.0 / 360.0) & 65535) * (360.0 / 65536.0); }
void Movie_FinishFrame(void) { char fname[128]; if (!Movie_IsCapturing()) return; #ifdef _WIN32 if (!movie_is_avi) { snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.wDay, movie_start_date.wMonth, movie_start_date.wYear, movie_start_date.wHour, movie_start_date.wMinute, movie_start_date.wSecond, movie_frame_count, image_ext); con_suppress = true; } else { // Split up if we're over the time limit for each segment if (movie_vid_maxlen.value && cls.realtime >= movie_fragment_start_time + movie_vid_maxlen.value) { double original_start_time = movie_start_time; // Close existing, and start again avi_restarting = true; Movie_Stop(); Movie_Start_AVI_Capture(true); Movie_Start(movie_len); avi_restarting = false; // keep track of original start time so we know when to stop for good movie_start_time = original_start_time; } } #else snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.tm_mday, movie_start_date.tm_mon, movie_start_date.tm_year, movie_start_date.tm_hour, movie_start_date.tm_min, movie_start_date.tm_sec, movie_frame_count, image_ext); con_suppress = true; #endif // _WIN32 //SCR_Screenshot(fname); //movie_frame_count++; // Only capture a frame after all views have been drawn // in multiview mode. Otherwise always. if (cl_multiview.value && cls.mvdplayback) { if (CURRVIEW == 1) { SCR_Movieshot(fname); } } else { SCR_Movieshot(fname); } #ifdef _WIN32 if (!movie_is_avi) #endif { con_suppress = false; } // Only count the frame when all the views have been drawn // in multiview mode. (Instead of counting one for each view that is drawn). if (cl_multiview.value && cls.mvdplayback) { if (CURRVIEW == 1) { movie_frame_count++; } } else { movie_frame_count++; } if (cls.realtime >= movie_start_time + movie_len) Movie_Stop(); }
void Movie_Demo_Capture_f(void) { int argc; double time; char *error; #ifdef _WIN32 error = va("Usage: %s <start time [avifile] | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3 && argc != 4) { #else error = va("Usage: %s <start time | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3) { #endif Com_Printf(error); return; } if (argc == 2) { if (strncasecmp("stop", Cmd_Argv(1), 4)) Com_Printf(error); else if (Movie_IsCapturing()) Movie_Stop(); else Com_Printf("%s : Not capturing\n", Cmd_Argv(0)); return; } if (strncasecmp("start", Cmd_Argv(1), 5)) { Com_Printf(error); return; } else if (Movie_IsCapturing()) { Com_Printf("%s : Already capturing\n", Cmd_Argv(0)); return; } if (!cls.demoplayback || cls.timedemo) { Com_Printf("%s : Must be playing a demo to capture\n", Cmd_Argv(0)); return; } if ((time = Q_atof(Cmd_Argv(2))) <= 0) { Com_Printf("%s : Time argument must be positive\n", Cmd_Argv(0)); return; } #ifdef _WIN32 //joe: capturing to avi if (argc == 4) { avi_number = 0; strlcpy(movie_avi_filename, Cmd_Argv(3), sizeof(movie_avi_filename)-10); // Store user's requested filename if (!movie_avi_loaded) { Com_Printf_State (PRINT_FAIL, "Avi capturing not initialized\n"); return; } Movie_Start_AVI_Capture(movie_vid_maxlen.value > 0 && movie_vid_maxlen.value < time); } #endif Movie_Start(time); } #ifdef _WIN32 static void Movie_Start_AVI_Capture(qbool split) { ++avi_number; // If we're going to break up the movie, append number char aviname[MAX_OSPATH]; if (split) snprintf (aviname, sizeof(aviname), "%s-%03d", movie_avi_filename, avi_number); else strlcpy (aviname, movie_avi_filename, sizeof(aviname)); if (!(Util_Is_Valid_Filename(aviname))) { Com_Printf(Util_Invalid_Filename_Msg(aviname)); return; } COM_ForceExtensionEx (aviname, ".avi", sizeof (aviname)); snprintf (avipath, sizeof(avipath), "%s/%s/%s", com_basedir, movie_dir.string, aviname); if (!(avifile = fopen(avipath, "wb"))) { FS_CreatePath (avipath); if (!(avifile = fopen(avipath, "wb"))) { Com_Printf("Error: Couldn't open %s\n", aviname); return; } } }
void Movie_FinishFrame(void) { char fname[128]; if (!Movie_IsCapturing()) return; #ifdef _WIN32 if (!movie_is_avi) { snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.wDay, movie_start_date.wMonth, movie_start_date.wYear, movie_start_date.wHour, movie_start_date.wMinute, movie_start_date.wSecond, movie_frame_count, image_ext); con_suppress = true; } #else snprintf(fname, sizeof(fname), "%s/capture_%02d-%02d-%04d_%02d-%02d-%02d/shot-%06d.%s", movie_dir.string, movie_start_date.tm_mday, movie_start_date.tm_mon, movie_start_date.tm_year, movie_start_date.tm_hour, movie_start_date.tm_min, movie_start_date.tm_sec, movie_frame_count, image_ext); con_suppress = true; #endif // _WIN32 //SCR_Screenshot(fname); //movie_frame_count++; // Only capture a frame after all views have been drawn // in multiview mode. Otherwise always. if (cl_multiview.value && cls.mvdplayback) { if (CURRVIEW == 1) { SCR_Movieshot(fname); } } else { SCR_Movieshot(fname); } #ifdef _WIN32 if (!movie_is_avi) #endif { con_suppress = false; } // Only count the frame when all the views have been drawn // in multiview mode. (Instead of counting one for each view that is drawn). if (cl_multiview.value && cls.mvdplayback) { if (CURRVIEW == 1) { movie_frame_count++; } } else { movie_frame_count++; } if (cls.realtime >= movie_start_time + movie_len) Movie_Stop(); }
void Movie_Demo_Capture_f(void) { int argc; double time; char *error; #ifdef _WIN32 error = va("Usage: %s <start time [avifile] | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3 && argc != 4) { #else error = va("Usage: %s <start time | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3) { #endif Com_Printf(error); return; } if (argc == 2) { if (strncasecmp("stop", Cmd_Argv(1), 4)) Com_Printf(error); else if (Movie_IsCapturing()) Movie_Stop(); else Com_Printf("%s : Not capturing\n", Cmd_Argv(0)); return; } if (strncasecmp("start", Cmd_Argv(1), 5)) { Com_Printf(error); return; } else if (Movie_IsCapturing()) { Com_Printf("%s : Already capturing\n", Cmd_Argv(0)); return; } if (!cls.demoplayback || cls.timedemo) { Com_Printf("%s : Must be playing a demo to capture\n", Cmd_Argv(0)); return; } if ((time = Q_atof(Cmd_Argv(2))) <= 0) { Com_Printf("%s : Time argument must be positive\n", Cmd_Argv(0)); return; } #ifdef _WIN32 //joe: capturing to avi if (argc == 4) { char aviname[MAX_OSPATH]; if (!movie_avi_loaded) { Com_Printf_State (PRINT_FAIL, "Avi capturing not initialized\n"); return; } strlcpy (aviname, Cmd_Argv(3), sizeof(aviname)); if (!(Util_Is_Valid_Filename(aviname))) { Com_Printf(Util_Invalid_Filename_Msg(aviname)); return; } COM_ForceExtensionEx (aviname, ".avi", sizeof (aviname)); snprintf (avipath, sizeof(avipath), "%s/%s/%s", com_basedir, movie_dir.string, aviname); if (!(avifile = fopen(avipath, "wb"))) { FS_CreatePath (avipath); if (!(avifile = fopen(avipath, "wb"))) { Com_Printf("Error: Couldn't open %s\n", aviname); return; } } } #endif Movie_Start(time); } void Movie_Init(void) { Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_fps); Cvar_Register(&movie_dir); Cvar_Register(&movie_steadycam); Cvar_ResetCurrentGroup(); Cmd_AddCommand("demo_capture", Movie_Demo_Capture_f); #ifdef _WIN32 Capture_InitAVI (); //joe: capturing to avi if (!movie_avi_loaded) return; captured_audio_samples = 0; Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_codec); Cvar_ResetCurrentGroup(); Capture_InitACM (); if (!movie_acm_loaded) return; Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_mp3); Cvar_Register(&movie_mp3_kbps); Cvar_ResetCurrentGroup(); #endif }