From b4f477c22eb377d49c21bd7e92c928892a1eabe5 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 18 Nov 2015 21:36:41 -0600 Subject: [PATCH] FS-8293 fix some regressions where speed test caused excessive downlink bandwidth --- src/mod/applications/mod_av/avcodec.c | 8 ++++++- src/mod/codecs/mod_vpx/mod_vpx.c | 13 +++++++---- src/mod/endpoints/mod_verto/mod_verto.c | 30 +++++++++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/mod/applications/mod_av/avcodec.c b/src/mod/applications/mod_av/avcodec.c index 199f76084c..f65a6818bb 100644 --- a/src/mod/applications/mod_av/avcodec.c +++ b/src/mod/applications/mod_av/avcodec.c @@ -800,7 +800,8 @@ static switch_status_t consume_nalu(h264_codec_context_t *context, switch_frame_ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t width, uint32_t height) { - + int sane = 0; + if (!context->encoder) context->encoder = avcodec_find_encoder(context->av_codec_id); if (!context->encoder) { @@ -847,6 +848,11 @@ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t widt context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 0, 0) * 8; } + if (context->bandwidth > sane) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "BITRATE TRUNCATED TO %d\n", sane); + context->bandwidth = sane * 8; + } + //context->encoder_ctx->bit_rate = context->bandwidth * 1024; context->encoder_ctx->width = context->codec_settings.video.width; context->encoder_ctx->height = context->codec_settings.video.height; diff --git a/src/mod/codecs/mod_vpx/mod_vpx.c b/src/mod/codecs/mod_vpx/mod_vpx.c index c772baa457..bfdbd5eb9c 100644 --- a/src/mod/codecs/mod_vpx/mod_vpx.c +++ b/src/mod/codecs/mod_vpx/mod_vpx.c @@ -300,7 +300,8 @@ static switch_status_t init_encoder(switch_codec_t *codec) vpx_codec_enc_cfg_t *config = &context->config; int token_parts = 1; int cpus = switch_core_cpu_count(); - + int sane; + if (!context->codec_settings.video.width) { context->codec_settings.video.width = 1280; } @@ -312,15 +313,19 @@ static switch_status_t init_encoder(switch_codec_t *codec) if (context->codec_settings.video.bandwidth == -1) { context->codec_settings.video.bandwidth = 0; } - + if (context->codec_settings.video.bandwidth) { context->bandwidth = context->codec_settings.video.bandwidth; } else { context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 0, 0); + } - if (context->bandwidth > 40960) { - context->bandwidth = 40960; + sane = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 4, 30); + + if (context->bandwidth > sane) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "BITRATE TRUNCATED TO %d\n", sane); + context->bandwidth = sane; } context->pkt = NULL; diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c index 66cc242ae8..255e95702b 100644 --- a/src/mod/endpoints/mod_verto/mod_verto.c +++ b/src/mod/endpoints/mod_verto/mod_verto.c @@ -3429,18 +3429,40 @@ static switch_bool_t verto__invite_func(const char *method, cJSON *params, jsock } if ((bandwidth = cJSON_GetObjectItem(dialog, "outgoingBandwidth"))) { + int core_bw = 0, bwval = 0; + const char *val; + + if ((val = switch_channel_get_variable_dup(channel, "rtp_video_max_bandwidth_in", SWITCH_FALSE, -1))) { + core_bw = switch_parse_bandwidth_string(val); + } + if (!zstr(bandwidth->valuestring) && strcasecmp(bandwidth->valuestring, "default")) { - switch_channel_set_variable(channel, "rtp_video_max_bandwidth_in", bandwidth->valuestring); + bwval = atoi(bandwidth->valuestring); } else if (bandwidth->valueint) { - switch_channel_set_variable_printf(channel, "rtp_video_max_bandwidth_in", "%d", bandwidth->valueint); + bwval = bandwidth->valueint; + } + + if (bwval <= 0 || (core_bw && bwval < core_bw)) { + switch_channel_set_variable_printf(channel, "rtp_video_max_bandwidth_in", "%d", bwval); } } if ((bandwidth = cJSON_GetObjectItem(dialog, "incomingBandwidth"))) { + int core_bw = 0, bwval = 0; + const char *val; + + if ((val = switch_channel_get_variable_dup(channel, "rtp_video_max_bandwidth_out", SWITCH_FALSE, -1))) { + core_bw = switch_parse_bandwidth_string(val); + } + if (!zstr(bandwidth->valuestring) && strcasecmp(bandwidth->valuestring, "default")) { - switch_channel_set_variable(channel, "rtp_video_max_bandwidth_out", bandwidth->valuestring); + bwval = atoi(bandwidth->valuestring); } else if (bandwidth->valueint) { - switch_channel_set_variable_printf(channel, "rtp_video_max_bandwidth_out", "%d", bandwidth->valueint); + bwval = bandwidth->valueint; + } + + if (bwval <= 0 || (core_bw && bwval < core_bw)) { + switch_channel_set_variable_printf(channel, "rtp_video_max_bandwidth_out", "%d", bwval); } }