]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11164: [freeswitch-core] Improve audio JB in bad conditions
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 25 May 2018 16:07:24 +0000 (11:07 -0500)
committerMuteesa Fred <muteesafred@hotmail.com>
Tue, 24 Jul 2018 07:21:53 +0000 (07:21 +0000)
src/mod/applications/mod_commands/mod_commands.c
src/switch_jitterbuffer.c
src/switch_vpx.c

index 5b8e1a1cc94287ff1b3737b74d55e940e6ee6290..1c3e59adfb6f0a767fc09696c5de01efe3e1ed88 100644 (file)
@@ -4435,6 +4435,44 @@ SWITCH_STANDARD_API(uuid_video_bitrate_function)
        return SWITCH_STATUS_SUCCESS;
 }
 
+
+#define VIDEO_BITRATE_SYNTAX "<uuid> <bitrate>"
+SWITCH_STANDARD_API(uuid_video_bandwidth_function)
+{
+       switch_status_t status = SWITCH_STATUS_FALSE;
+       char *mycmd = NULL, *argv[2] = { 0 };
+       int argc = 0;
+
+       if (!zstr(cmd) && (mycmd = strdup(cmd))) {
+               argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
+       }
+
+       if (argc < 2) {
+               stream->write_function(stream, "-USAGE: %s\n", VIDEO_REFRESH_SYNTAX);
+       } else {
+               switch_core_session_t *lsession = NULL;
+
+               if ((lsession = switch_core_session_locate(argv[0]))) {
+                       int kps;
+
+                       kps = switch_parse_bandwidth_string(argv[1]);
+                       switch_core_media_set_outgoing_bitrate(lsession, SWITCH_MEDIA_TYPE_VIDEO, kps);
+                       status = SWITCH_STATUS_SUCCESS;
+                       switch_core_session_rwunlock(lsession);
+               }
+       }
+
+       if (status == SWITCH_STATUS_SUCCESS) {
+               stream->write_function(stream, "+OK Success\n");
+       } else {
+               stream->write_function(stream, "-ERR Operation Failed\n");
+       }
+
+       switch_safe_free(mycmd);
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
 #define CODEC_DEBUG_SYNTAX "<uuid> audio|video <level>"
 SWITCH_STANDARD_API(uuid_codec_debug_function)
 {
@@ -7496,6 +7534,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
        SWITCH_ADD_API(commands_api_interface, "uuid_send_info", "Send info to the endpoint", uuid_send_info_function, INFO_SYNTAX);
        SWITCH_ADD_API(commands_api_interface, "uuid_set_media_stats", "Set media stats", uuid_set_media_stats, UUID_MEDIA_STATS_SYNTAX);
        SWITCH_ADD_API(commands_api_interface, "uuid_video_bitrate", "Send video bitrate req.", uuid_video_bitrate_function, VIDEO_BITRATE_SYNTAX);
+       SWITCH_ADD_API(commands_api_interface, "uuid_video_bandwidth", "Send video bandwidth", uuid_video_bandwidth_function, VIDEO_BITRATE_SYNTAX);
        SWITCH_ADD_API(commands_api_interface, "uuid_video_refresh", "Send video refresh.", uuid_video_refresh_function, VIDEO_REFRESH_SYNTAX);
        SWITCH_ADD_API(commands_api_interface, "uuid_outgoing_answer", "Answer outgoing channel", outgoing_answer_function, OUTGOING_ANSWER_SYNTAX);
        SWITCH_ADD_API(commands_api_interface, "uuid_limit", "Increase limit resource", uuid_limit_function, LIMIT_SYNTAX);
@@ -7719,6 +7758,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
        switch_console_set_complete("add uuid_dual_transfer ::console::list_uuid");
        switch_console_set_complete("add uuid_video_refresh ::console::list_uuid");
        switch_console_set_complete("add uuid_video_bitrate ::console::list_uuid");
+       switch_console_set_complete("add uuid_video_bandwidth ::console::list_uuid");
        switch_console_set_complete("add uuid_xfer_zombie ::console::list_uuid");
        switch_console_set_complete("add version");
        switch_console_set_complete("add uuid_warning ::console::list_uuid");
index 7a74e9bd9d11ab6cef8e667b10d0b4b8b86d7887..7965413059bdba594d53657773e86678859bf986 100644 (file)
@@ -1292,7 +1292,6 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
        switch_jb_node_t *node = NULL;
        switch_status_t status;
        int plc = 0;
-       int too_big = 0;
        
        switch_mutex_lock(jb->mutex);
 
@@ -1454,30 +1453,17 @@ SWITCH_DECLARE(switch_status_t) switch_jb_get_packet(switch_jb_t *jb, switch_rtp
        }
 
        switch_mutex_unlock(jb->mutex);
-
+       
        if (jb->type == SJB_VIDEO) {
-               too_big = jb->max_frame_len * 15;
+               if (jb->complete_frames > jb->max_frame_len * 2) {
+                       jb_debug(jb, 2, "JB TOO BIG (%d), RESET\n", jb->complete_frames);
+                       switch_jb_reset(jb);
+               }
        } else {
-               too_big = (int)(jb->max_frame_len * 1.5);
-       }
-       
-       if (jb->visible_nodes > too_big) {
-               //if (jb->complete_frames > jb->max_frame_len) {
-               //int b4 = jb->visible_nodes;
-               //thin_frames(jb, 2, jb->max_frame_len / 2);
-               //jb_debug(jb, 2, "JB TOO BIG (%d/%d), DROP SOME\n", b4, jb->visible_nodes);
-               //switch_jb_reset(jb);
-       }
-
-       //if (jb->complete_frames > jb->max_frame_len * 2) {
-       //      jb_debug(jb, 2, "JB TOO BIG (%d), RESET\n", jb->complete_frames);
-       //      switch_jb_reset(jb);
-       //}
-
-       if (jb->visible_nodes > too_big && status == SWITCH_STATUS_SUCCESS) {
-       //if (jb->frame_len >= jb->max_frame_len && status == SWITCH_STATUS_SUCCESS) {
-       //if (jb->allocated_nodes > jb->max_frame_len) {
-               status = SWITCH_STATUS_TIMEOUT;
+               int too_big = (int)(jb->max_frame_len * 1.5);
+               if (jb->visible_nodes > too_big && status == SWITCH_STATUS_SUCCESS) {
+                       status = SWITCH_STATUS_TIMEOUT;
+               }
        }
        
        return status;
index 02b5f3aaddf03ebcc3fd795ea299a83043da88c5..07cb64e40d0dc183ea349a24236a4243d2f98350 100644 (file)
@@ -414,7 +414,7 @@ static switch_status_t init_encoder(switch_codec_t *codec)
        context->start_time = switch_micro_time_now();
 
        config->g_timebase.num = 1;
-       config->g_timebase.den = 1000;//90000;
+       config->g_timebase.den = 90000;
        config->g_pass = VPX_RC_ONE_PASS;
        config->g_w = context->codec_settings.video.width;
        config->g_h = context->codec_settings.video.height;
@@ -864,8 +864,8 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
 
        context->framecount++;
 
-       pts = (now - context->start_time) / 1000;
-       //pts = frame->timestamp;
+       //pts = (now - context->start_time) / 1000;
+       pts = frame->timestamp;
 
        dur = context->last_ms ? (now - context->last_ms) / 1000 : pts;