]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
hand pick db477925584cb67b14c4314bc8a8a1bc4aa5a959 - FS-10447: [freeswitch-core]...
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 29 Jun 2017 22:00:07 +0000 (17:00 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 29 Jun 2017 22:00:07 +0000 (17:00 -0500)
src/include/switch_core.h
src/include/switch_types.h
src/mod/applications/mod_commands/mod_commands.c
src/mod/applications/mod_dptools/mod_dptools.c
src/mod/endpoints/mod_sofia/mod_sofia.c
src/switch_core_media.c

index bee66f13e45b67f71f112c5b90a3d93d63821c3a..887fc0e05289fc65f5f03a228d0ecb12e4f09261 100644 (file)
@@ -2744,8 +2744,9 @@ SWITCH_DECLARE(int) switch_core_gen_certs(const char *prefix);
 SWITCH_DECLARE(int) switch_core_cert_gen_fingerprint(const char *prefix, dtls_fingerprint_t *fp);
 SWITCH_DECLARE(int) switch_core_cert_expand_fingerprint(dtls_fingerprint_t *fp, const char *str);
 SWITCH_DECLARE(int) switch_core_cert_verify(dtls_fingerprint_t *fp);
-SWITCH_DECLARE(switch_status_t) _switch_core_session_request_video_refresh(switch_core_session_t *session, const char *file, const char *func, int line);
-#define switch_core_session_request_video_refresh(_s) _switch_core_session_request_video_refresh(_s, __FILE__, __SWITCH_FUNC__, __LINE__)
+SWITCH_DECLARE(switch_status_t) _switch_core_session_request_video_refresh(switch_core_session_t *session, int force, const char *file, const char *func, int line);
+#define switch_core_session_request_video_refresh(_s) _switch_core_session_request_video_refresh(_s, 0, __FILE__, __SWITCH_FUNC__, __LINE__)
+#define switch_core_session_force_request_video_refresh(_s) _switch_core_session_request_video_refresh(_s, 1, __FILE__, __SWITCH_FUNC__, __LINE__)
 SWITCH_DECLARE(switch_status_t) switch_core_session_send_and_request_video_refresh(switch_core_session_t *session);
 SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait);
 SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_handle_t *stream);
index 69cde7c752a069195d0411d9e047582ad916477a..773dbe641b127a89edfda52c6899492b7d035b4c 100644 (file)
@@ -1448,6 +1448,7 @@ typedef enum {
        CF_INTERCEPT,
        CF_INTERCEPTED,
        CF_VIDEO_REFRESH_REQ,
+       CF_MANUAL_VID_REFRESH,
        CF_SERVICE_AUDIO,
        CF_SERVICE_VIDEO,
        CF_ZRTP_PASSTHRU_REQ,
index ea46c4996b7a3bc300da2fe2e2cb8dfe245e8af1..2391992d21430aa35418f3ec8d92717082851f97 100644 (file)
@@ -4147,7 +4147,7 @@ SWITCH_STANDARD_API(uuid_xfer_zombie)
        return SWITCH_STATUS_SUCCESS;
 }
 
-#define VIDEO_REFRESH_SYNTAX "<uuid>"
+#define VIDEO_REFRESH_SYNTAX "<uuid> [auto|manual]"
 SWITCH_STANDARD_API(uuid_video_refresh_function)
 {
        switch_status_t status = SWITCH_STATUS_FALSE;
@@ -4164,11 +4164,28 @@ SWITCH_STANDARD_API(uuid_video_refresh_function)
                switch_core_session_t *lsession = NULL;
 
                if ((lsession = switch_core_session_locate(argv[0]))) {
-                       switch_channel_set_flag(switch_core_session_get_channel(lsession), CF_XFER_ZOMBIE);
-                       switch_core_session_request_video_refresh(lsession);
-                       switch_core_media_gen_key_frame(lsession);
+                       char *cmd = (char *)argv[1];
+       
+                       if (!zstr(cmd)) {
+                               switch_channel_t *channel = switch_core_session_get_channel(lsession);
+                               
+                               if (!strcasecmp(cmd, "manual")) {
+                                       switch_channel_set_flag(channel, CF_MANUAL_VID_REFRESH);
+                               } else if (!strcasecmp(cmd, "auto")) {
+                                       switch_channel_clear_flag(channel, CF_MANUAL_VID_REFRESH);
+                               }
+
+                               stream->write_function(stream, "%s video refresh now in %s mode.\n", switch_channel_get_name(channel),
+                                                                          switch_channel_test_flag(channel, CF_MANUAL_VID_REFRESH) ? "manual" : "auto");
+
+                       } else {
+                               switch_core_session_force_request_video_refresh(lsession);
+                               switch_core_media_gen_key_frame(lsession);
+                       }
+
                        status = SWITCH_STATUS_SUCCESS;
                        switch_core_session_rwunlock(lsession);
+
                }
        }
 
index 48e18b3934b2c93bdb78d17dd93b1476023e2374..a0b5e20371a9ccae6095cded1adb245a28ab172e 100644 (file)
@@ -1391,9 +1391,27 @@ SWITCH_STANDARD_APP(video_set_decode_function)
 SWITCH_STANDARD_APP(video_refresh_function)
 {
        switch_core_session_message_t msg = { 0 };
+       char *cmd = (char *)data;
+       
+       if (!zstr(cmd)) {
+               switch_channel_t *channel = switch_core_session_get_channel(session);
+
+               if (!strcasecmp(cmd, "manual")) {
+                       switch_channel_set_flag(channel, CF_MANUAL_VID_REFRESH);
+               } else if (!strcasecmp(cmd, "auto")) {
+                       switch_channel_clear_flag(channel, CF_MANUAL_VID_REFRESH);
+               }
+               
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, 
+                                                 "%s video refresh now in %s mode.\n", switch_channel_get_name(channel), 
+                                                 switch_channel_test_flag(channel, CF_MANUAL_VID_REFRESH) ? "manual" : "auto");        
 
+               return;
+       }
+       
        /* Tell the channel to refresh video */
        msg.from = __FILE__;
+       msg.numeric_arg = 1;
        msg.string_arg = data;
        msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ;
        switch_core_session_receive_message(session, &msg);
@@ -6244,7 +6262,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_dptools_load)
        SWITCH_ADD_APP(app_interface, "ivr", "Run an ivr menu", "Run an ivr menu.", ivr_application_function, "<menu_name>", SAF_NONE);
        SWITCH_ADD_APP(app_interface, "redirect", "Send session redirect", "Send a redirect message to a session.", redirect_function, "<redirect_data>",
                                   SAF_SUPPORT_NOMEDIA);
-       SWITCH_ADD_APP(app_interface, "video_refresh", "Send video refresh.", "Send video refresh.", video_refresh_function, "",
+       SWITCH_ADD_APP(app_interface, "video_refresh", "Send video refresh.", "Send video refresh.", video_refresh_function, "[manual|auto]",
                                   SAF_SUPPORT_NOMEDIA);
        SWITCH_ADD_APP(app_interface, "video_decode", "Set video decode.", "Set video decode.", video_set_decode_function, "[[on|wait]|off]",
                                   SAF_NONE);
index 13ef7a2dce225ca9a08f846b6ebc06f1641db068..091ed048825445404750edd7556c83a4764c0973 100644 (file)
@@ -1418,7 +1418,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                break;
 
        case SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ:
-               if (switch_channel_media_up(channel) && !switch_channel_test_flag(channel, CF_AVPF) &&
+               if (switch_channel_media_up(channel) && !switch_channel_test_flag(channel, CF_AVPF) && !switch_channel_test_flag(channel, CF_MANUAL_VID_REFRESH) &&
                        switch_channel_var_true(channel, "sofia_send_info_vid_refresh")) {
                        const char *pl = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<media_control><vc_primitive><to_encoder><picture_fast_update /></to_encoder></vc_primitive></media_control>\n";
                        switch_time_t now = switch_micro_time_now();
index 3ae933b6b292df19ef1842d0923575d0b7216013..16e65d91d15db4cbe566c4280aaa37165bce7b75 100644 (file)
@@ -9930,13 +9930,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se
        case SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ:
                {
                        if (v_engine->rtp_session) {
-                               if (switch_rtp_test_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_FIR)) {
-                                       switch_rtp_video_refresh(v_engine->rtp_session);
-                               }// else {
+                               if (msg->numeric_arg || !switch_channel_test_flag(session->channel, CF_MANUAL_VID_REFRESH)) {
+                                       if (switch_rtp_test_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_FIR)) {
+                                               switch_rtp_video_refresh(v_engine->rtp_session);
+                                       }// else {
                                        if (switch_rtp_test_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_PLI)) {
                                                switch_rtp_video_loss(v_engine->rtp_session);
                                        }
-                                       //                              }
+                                       //}
+                               }
                        }
                }
 
@@ -11590,7 +11592,7 @@ SWITCH_DECLARE(switch_timer_t *) switch_core_media_get_timer(switch_core_session
 
 }
 
-SWITCH_DECLARE(switch_status_t) _switch_core_session_request_video_refresh(switch_core_session_t *session, const char *file, const char *func, int line)
+SWITCH_DECLARE(switch_status_t) _switch_core_session_request_video_refresh(switch_core_session_t *session, int force, const char *file, const char *func, int line)
 {
        switch_channel_t *channel = switch_core_session_get_channel(session);
        switch_media_handle_t *smh = NULL;
@@ -11605,11 +11607,16 @@ SWITCH_DECLARE(switch_status_t) _switch_core_session_request_video_refresh(switc
                switch_core_session_message_t msg = { 0 };
                switch_time_t now = switch_micro_time_now();
 
-               if (smh->last_video_refresh_req && (now - smh->last_video_refresh_req) < VIDEO_REFRESH_FREQ) {
+               if (!force && (smh->last_video_refresh_req && (now - smh->last_video_refresh_req) < VIDEO_REFRESH_FREQ)) {
                        return SWITCH_STATUS_BREAK;
                }
 
                smh->last_video_refresh_req = now;
+
+               if (force) {
+                       msg.numeric_arg = 1;
+               }
+
                msg._file = file;
                msg._func = func;
                msg._line = line;