FS-11189 make rtp-slice-size and key-frame-min-freq configurable

This commit is contained in:
Seven Du 2018-06-14 16:56:41 +08:00 committed by Muteesa Fred
parent e19687e0f2
commit 0ad867f3dd
2 changed files with 28 additions and 2 deletions

View File

@ -3,6 +3,11 @@
<!-- max bitrate the system support, truncate if over limit -->
<!-- <param name="max-bitrate" value="5mb"/> -->
<!-- <param name="rtp-slice-size" value="1200"/> -->
<!-- minimum time to generate a new key frame in ms /> -->
<!-- <param name="key-frame-min-freq" value="250"/> -->
<!-- integer of cpus, or 'auto', or 'cpu/<divisor>/<max> -->
<param name="dec-threads" value="cpu/2/4"/>
<param name="enc-threads" value="1"/>

View File

@ -380,6 +380,9 @@ typedef struct vpx_context vpx_context_t;
struct vpx_globals {
int debug;
uint32_t max_bitrate;
uint32_t rtp_slice_size;
uint32_t key_frame_min_freq;
char vp8_profile[20];
char vp9_profile[20];
char vp10_profile[20];
@ -651,7 +654,7 @@ static switch_status_t consume_partition(vpx_context_t *context, switch_frame_t
// if !extended
hdrlen = 1;
body = ((uint8_t *)frame->data) + hdrlen;
packet_size = SLICE_SIZE;
packet_size = vpx_globals.rtp_slice_size;
payload_size = packet_size - hdrlen;
// else add extended TBD
@ -820,7 +823,7 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
if (context->need_key_frame > 0) {
// force generate a key frame
if (!context->last_key_frame || (now - context->last_key_frame) > KEY_FRAME_MIN_FREQ) {
if (!context->last_key_frame || (now - context->last_key_frame) > vpx_globals.key_frame_min_freq) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "VPX KEYFRAME GENERATED\n");
vpx_flags |= VPX_EFLAG_FORCE_KF;
context->need_key_frame = 0;
@ -1406,6 +1409,13 @@ static void load_config()
if (!strcmp(name, "max-bitrate")) {
vpx_globals.max_bitrate = switch_parse_bandwidth_string(value);
} else if (!strcmp(name, "rtp-slice-size")) {
int val = atoi(value);
vpx_globals.rtp_slice_size = UINTVAL(val);
} else if (!strcmp(name, "key-frame-min-freq")) {
int val = atoi(value);
vpx_globals.key_frame_min_freq = UINTVAL(val);
vpx_globals.key_frame_min_freq *= 1000;
} else if (!strcmp(name, "dec-threads")) {
vpx_globals.vp8.dec_cfg.threads = switch_parse_cpu_string(value);
vpx_globals.vp9.dec_cfg.threads = switch_parse_cpu_string(value);
@ -1634,6 +1644,14 @@ static void load_config()
vpx_globals.max_bitrate = switch_calc_bitrate(1920, 1080, 5, 60);
}
if (vpx_globals.rtp_slice_size < 500 || vpx_globals.rtp_slice_size > 1500) {
vpx_globals.rtp_slice_size = SLICE_SIZE;
}
if (vpx_globals.key_frame_min_freq < 10000 || vpx_globals.key_frame_min_freq > 3 * 1000000) {
vpx_globals.key_frame_min_freq = KEY_FRAME_MIN_FREQ;
}
if (!vpx_globals.vp8.enc_cfg.g_threads) vpx_globals.vp8.enc_cfg.g_threads = 1;
if (!vpx_globals.vp8.dec_cfg.threads) vpx_globals.vp8.dec_cfg.threads = switch_parse_cpu_string("cpu/2/4");
if (!vpx_globals.vp9.enc_cfg.g_threads) vpx_globals.vp9.enc_cfg.g_threads = vpx_globals.vp8.enc_cfg.g_threads;
@ -1661,6 +1679,9 @@ SWITCH_STANDARD_API(vpx_api_function)
load_config();
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "rtp-slice-size", vpx_globals.rtp_slice_size);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "key-frame-min-freq", vpx_globals.key_frame_min_freq);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp8-dec-threads", vpx_globals.vp8.dec_cfg.threads);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp9-dec-threads", vpx_globals.vp9.dec_cfg.threads);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp10-dec-threads", vpx_globals.vp10.dec_cfg.threads);