From db477925584cb67b14c4314bc8a8a1bc4aa5a959 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 29 Jun 2017 16:57:13 -0500 Subject: [PATCH] FS-10447: [freeswitch-core] Manual video refresh mode #resolve --- src/include/switch_core.h | 5 ++-- src/include/switch_types.h | 1 + .../applications/mod_commands/mod_commands.c | 25 ++++++++++++++++--- .../applications/mod_dptools/mod_dptools.c | 20 ++++++++++++++- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 +- src/switch_core_media.c | 19 +++++++++----- 6 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 60249f88c2..a07ea36a1e 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2758,8 +2758,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); diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 2cc1000e2f..c5cd77584f 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1457,6 +1457,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, diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 758e8c9570..e592b3fabc 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -4203,7 +4203,7 @@ SWITCH_STANDARD_API(uuid_xfer_zombie) return SWITCH_STATUS_SUCCESS; } -#define VIDEO_REFRESH_SYNTAX "" +#define VIDEO_REFRESH_SYNTAX " [auto|manual]" SWITCH_STANDARD_API(uuid_video_refresh_function) { switch_status_t status = SWITCH_STATUS_FALSE; @@ -4220,11 +4220,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); + } } diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 6daddfcdc5..3f28d3ba04 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -1431,9 +1431,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); @@ -6321,7 +6339,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, "", SAF_NONE); SWITCH_ADD_APP(app_interface, "redirect", "Send session redirect", "Send a redirect message to a session.", redirect_function, "", 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); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 03e20717ce..439aed2718 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1528,7 +1528,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 = "\n\n"; switch_time_t now = switch_micro_time_now(); diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 429d4693d6..d2d70add99 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -11997,13 +11997,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); } - // } + //} + } } } @@ -13720,7 +13722,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; @@ -13735,11 +13737,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;