From a61629470a4aa285cf6a91fbd8125af1d537fd4a Mon Sep 17 00:00:00 2001 From: divverent Date: Tue, 7 Jun 2011 09:22:17 +0000 Subject: [PATCH] theora encoding: allow both bitrate and quality to be -1 for insane quality git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11183 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=bd172244c077be2f4f13caf8cabd022fcad4bd33 --- cap_ogg.c | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/cap_ogg.c b/cap_ogg.c index ff4bfb60..a5218655 100644 --- a/cap_ogg.c +++ b/cap_ogg.c @@ -9,8 +9,8 @@ // video capture cvars static cvar_t cl_capturevideo_ogg_theora_vp3compat = {CVAR_SAVE, "cl_capturevideo_ogg_theora_vp3compat", "1", "make VP3 compatible theora streams"}; -static cvar_t cl_capturevideo_ogg_theora_quality = {CVAR_SAVE, "cl_capturevideo_ogg_theora_quality", "42", "video quality factor (0 to 63), or -1 to use bitrate only; higher is better"}; -static cvar_t cl_capturevideo_ogg_theora_bitrate = {CVAR_SAVE, "cl_capturevideo_ogg_theora_bitrate", "-1", "video bitrate (45 to 2000 kbps), or -1 to use quality only; higher is better"}; +static cvar_t cl_capturevideo_ogg_theora_quality = {CVAR_SAVE, "cl_capturevideo_ogg_theora_quality", "42", "video quality factor (0 to 63), or -1 to use bitrate only; higher is better; setting both to -1 achieves unlimited quality"}; +static cvar_t cl_capturevideo_ogg_theora_bitrate = {CVAR_SAVE, "cl_capturevideo_ogg_theora_bitrate", "-1", "video bitrate (45 to 2000 kbps), or -1 to use quality only; higher is better; setting both to -1 achieves unlimited quality"}; static cvar_t cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier = {CVAR_SAVE, "cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier", "1.5", "how much more bit rate to use for keyframes, specified as a factor of at least 1"}; static cvar_t cl_capturevideo_ogg_theora_keyframe_maxinterval = {CVAR_SAVE, "cl_capturevideo_ogg_theora_keyframe_maxinterval", "64", "maximum keyframe interval (1 to 1000)"}; static cvar_t cl_capturevideo_ogg_theora_keyframe_mininterval = {CVAR_SAVE, "cl_capturevideo_ogg_theora_keyframe_mininterval", "8", "minimum keyframe interval (1 to 1000)"}; @@ -1010,34 +1010,31 @@ void SCR_CaptureVideo_Ogg_BeginVideo(void) if(ti.target_bitrate <= 0) { - if(ti.quality < 0) - { - ti.target_bitrate = -1; - ti.keyframe_data_target_bitrate = (unsigned int)-1; - ti.quality = 63; - } - else - { - ti.target_bitrate = -1; - ti.keyframe_data_target_bitrate = (unsigned int)-1; - ti.quality = bound(0, ti.quality, 63); - } + ti.target_bitrate = -1; + ti.keyframe_data_target_bitrate = (unsigned int)-1; } else { - if(ti.quality < 0) - { - ti.target_bitrate = bound(45000, ti.target_bitrate, 2000000); - ti.keyframe_data_target_bitrate = (int) (ti.target_bitrate * max(1, cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier.value)); - ti.quality = -1; - } - else + ti.target_bitrate = ti.target_bitrate; + ti.keyframe_data_target_bitrate = (int) (ti.target_bitrate * max(1, cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier.value)); + + if(ti.target_bitrate < 45000 || ti.target_bitrate > 2000000) + Con_DPrintf("WARNING: requesting an odd bitrate for theora (sensible values range from 45 to 2000 kbps)\n"); + } + + if(ti.quality < 0) + { + ti.quality = 63; + if(ti.target_bitrate <= 0) { - ti.target_bitrate = bound(45000, ti.target_bitrate, 2000000); - ti.keyframe_data_target_bitrate = (int) (ti.target_bitrate * max(1, cl_capturevideo_ogg_theora_keyframe_bitrate_multiplier.value)); - ti.quality = -1; + ti.target_bitrate = 0x7FFFFFFF; + ti.keyframe_data_target_bitrate = 0x7FFFFFFF; } } + else + { + ti.quality = bound(0, ti.quality, 63); + } // this -1 magic is because ti.keyframe_frequency and ti.keyframe_mindistance use different metrics ti.keyframe_frequency = bound(1, cl_capturevideo_ogg_theora_keyframe_maxinterval.integer, 1000); -- 2.39.2