]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8293 fix some regressions where speed test caused excessive downlink bandwidth
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 19 Nov 2015 03:36:41 +0000 (21:36 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 19 Nov 2015 03:36:41 +0000 (21:36 -0600)
src/mod/applications/mod_av/avcodec.c
src/mod/codecs/mod_vpx/mod_vpx.c
src/mod/endpoints/mod_verto/mod_verto.c

index 199f76084c93d2c135f06d2e2f64615a11df67b2..f65a6818bb3598ff7a6053a146062a631c7bcf69 100644 (file)
@@ -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;
index c772baa457f950e0b72d18e35fde67ec32108b5c..bfdbd5eb9cb9259052ccd1ca59313f1deea31b64 100644 (file)
@@ -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;
index 66cc242ae86635a44a44d098bdb0b357d8f8d270..255e95702ba4df77db9961428a5536915494cb19 100644 (file)
@@ -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);
                }
        }