From ccaa3ae7326e752212fc9c52576859c2dc8d2c23 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 21 Nov 2013 01:38:16 +0500 Subject: [PATCH] FS-5959 --- src/include/switch_types.h | 2 ++ src/mod/endpoints/mod_sofia/mod_sofia.c | 12 ++++---- src/switch_core_media.c | 37 ++++++++++++++++++++++--- src/switch_rtp.c | 15 ++++++---- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 8d042eae11..0567fd2455 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -668,6 +668,8 @@ typedef enum { SWITCH_RTP_FLAG_KILL_JB, SWITCH_RTP_FLAG_VIDEO_BREAK, SWITCH_RTP_FLAG_PAUSE, + SWITCH_RTP_FLAG_FIR, + SWITCH_RTP_FLAG_PLI, SWITCH_RTP_FLAG_INVALID } switch_rtp_flag_t; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index dc6351799d..5e27ccc864 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1245,19 +1245,19 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi case SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ: { - const char *pl = ""; - time_t now = switch_epoch_time_now(NULL); + const char *pl = "\n\n\n\n\n\n\n\n"; + //time_t now = switch_epoch_time_now(NULL); - if (!tech_pvt->last_vid_info || (now - tech_pvt->last_vid_info) > 5) { - - tech_pvt->last_vid_info = now; + //if (!tech_pvt->last_vid_info || (now - tech_pvt->last_vid_info) > 5) { + + // tech_pvt->last_vid_info = now; if (!zstr(msg->string_arg)) { pl = msg->string_arg; } nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("application/media_control+xml"), SIPTAG_PAYLOAD_STR(pl), TAG_END()); - } + //} } break; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 5a0bff64db..fdb4043f54 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -144,6 +144,10 @@ typedef struct switch_rtp_engine_s { uint8_t reset_codec; uint8_t codec_negotiated; + + uint8_t fir; + uint8_t pli; + } switch_rtp_engine_t; @@ -3435,8 +3439,19 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s for (attr = m->m_attributes; attr; attr = attr->a_next) { if (!strcasecmp(attr->a_name, "framerate") && attr->a_value) { //framerate = atoi(attr->a_value); - } - if (!strcasecmp(attr->a_name, "rtcp") && attr->a_value && !strcmp(attr->a_value, "1")) { + } else if (!strcasecmp(attr->a_name, "rtcp-fb")) { + if (!zstr(attr->a_value)) { + if (switch_stristr("fir", attr->a_value)) { + v_engine->fir++; + } + + if (switch_stristr("pli", attr->a_value)) { + v_engine->pli++; + } + + smh->mparams->rtcp_video_interval_msec = "10000"; + } + } else if (!strcasecmp(attr->a_name, "rtcp") && attr->a_value && !strcmp(attr->a_value, "1")) { switch_channel_set_variable(session->channel, "rtp_remote_video_rtcp_port", attr->a_value); v_engine->remote_rtcp_port = (switch_port_t)atoi(attr->a_value); } else if (!got_video_crypto && !strcasecmp(attr->a_name, "crypto") && !zstr(attr->a_value)) { @@ -5095,6 +5110,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi if (switch_rtp_ready(v_engine->rtp_session)) { const char *ssrc; + if (v_engine->fir) { + switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_FIR); + } + + if (v_engine->pli) { + switch_rtp_set_flag(v_engine->rtp_session, SWITCH_RTP_FLAG_PLI); + } + switch_rtp_set_payload_map(v_engine->rtp_session, &v_engine->payload_map); start_video_thread(session); @@ -6436,6 +6459,12 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess } } + + if (v_engine->fir || v_engine->pli) { + switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), + "a=rtcp-fb:* %s%s\n", v_engine->fir ? "fir " : "", v_engine->pli ? "pli" : ""); + } + //switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u\n", v_engine->ssrc); if (v_engine->ice_out.cands[0][0].ready) { @@ -6465,11 +6494,11 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "b=AS:%d\n", bw); } - if (vp8) { + if (vp8 && switch_channel_test_flag(session->channel, CF_WEBRTC)) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtcp-fb:%d ccm fir\n", vp8); } - + if (red) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtcp-fb:%d nack\n", vp8); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index aa296c95da..fab4ddba8a 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -1459,7 +1459,7 @@ static void send_fir(switch_rtp_t *rtp_session) } -#if 0 + static void send_pli(switch_rtp_t *rtp_session) { @@ -1542,7 +1542,7 @@ static void send_pli(switch_rtp_t *rtp_session) return; } -#endif + static int check_rtcp_and_ice(switch_rtp_t *rtp_session) { @@ -1557,8 +1557,11 @@ static int check_rtcp_and_ice(switch_rtp_t *rtp_session) } if (rtp_session->fir_countdown == FIR_COUNTDOWN || rtp_session->fir_countdown == 1) { - send_fir(rtp_session); - //send_pli(rtp_session); + if (rtp_session->flags[SWITCH_RTP_FLAG_PLI]) { + send_pli(rtp_session); + } else { + send_fir(rtp_session); + } } rtp_session->fir_countdown--; @@ -3460,9 +3463,9 @@ SWITCH_DECLARE(void) switch_rtp_flush(switch_rtp_t *rtp_session) SWITCH_DECLARE(void) switch_rtp_video_refresh(switch_rtp_t *rtp_session) { - if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] && rtp_session->ice.ice_user) { + if (rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] && + (rtp_session->ice.ice_user || rtp_session->flags[SWITCH_RTP_FLAG_FIR] || rtp_session->flags[SWITCH_RTP_FLAG_PLI])) { if (!rtp_session->fir_countdown) { - //send_fir(rtp_session); rtp_session->fir_countdown = FIR_COUNTDOWN; } }