From a8c1341f42f1e018e458749cd82327fbcf49f28a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 14 May 2015 18:01:22 -0500 Subject: [PATCH] FS-7499 add tmmbr negotiation to sdp --- src/include/switch_types.h | 1 + src/switch_core_media.c | 39 ++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 2a597465a0..2f201a5fda 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -750,6 +750,7 @@ typedef enum { SWITCH_RTP_FLAG_RESET, SWITCH_RTP_FLAG_MUTE, SWITCH_RTP_FLAG_NACK, + SWITCH_RTP_FLAG_TMMBR, SWITCH_RTP_FLAG_INVALID } switch_rtp_flag_t; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 4100f2837e..a510f22915 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -155,6 +155,7 @@ typedef struct switch_rtp_engine_s { uint8_t fir; uint8_t pli; uint8_t nack; + uint8_t tmmbr; uint8_t no_crypto; switch_codec_settings_t codec_settings; switch_media_flow_t rmode; @@ -4399,6 +4400,10 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s if (switch_stristr("nack", attr->a_value)) { v_engine->nack++; } + + if (switch_stristr("tmmbr", attr->a_value)) { + v_engine->tmmbr++; + } smh->mparams->rtcp_video_interval_msec = SWITCH_RTCP_VIDEO_INTERVAL_MSEC; } @@ -6278,6 +6283,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi flags[SWITCH_RTP_FLAG_NACK]++; } + if (v_engine->tmmbr) { + flags[SWITCH_RTP_FLAG_TMMBR]++; + } + v_engine->rtp_session = switch_rtp_new(a_engine->local_sdp_ip, v_engine->local_sdp_port, v_engine->cur_payload_map->remote_sdp_ip, @@ -6896,10 +6905,26 @@ SWITCH_DECLARE(void)switch_core_media_set_local_sdp(switch_core_session_t *sessi if (smh->sdp_mutex) switch_mutex_unlock(smh->sdp_mutex); } -void add_fb(char *buf, uint32_t buflen, int pt, int fir, int nack, int pli) +static void add_fb(char *buf, uint32_t buflen, int pt, int fir, int nack, int pli, int tmmbr) { + const char *zfir = ""; + const char *ztmmbr = ""; + char *sp = ""; + if (fir) { - switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=rtcp-fb:%d ccm fir\n", pt); + zfir = "fir"; + } + + if (tmmbr) { + ztmmbr = "tmmbr"; + } + + if (fir && tmmbr) { + sp = " "; + } + + if (fir) { + switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=rtcp-fb:%d ccm %s%s%s\n", pt, zfir, sp, ztmmbr); } if (nack) { @@ -6947,7 +6972,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess int is_outbound = switch_channel_direction(session->channel) == SWITCH_CALL_DIRECTION_OUTBOUND; const char *vbw; int bw = 256; - uint8_t fir = 0, nack = 0, pli = 0; + uint8_t fir = 0, nack = 0, pli = 0, tmmbr = 0; switch_assert(session); @@ -7739,6 +7764,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess fir++; pli++; nack++; + tmmbr++; } /* DFF nack pli etc */ @@ -7747,13 +7773,14 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (v_engine->codec_negotiated) { - add_fb(buf, SDPBUFLEN, v_engine->cur_payload_map->agreed_pt, v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli); + add_fb(buf, SDPBUFLEN, v_engine->cur_payload_map->agreed_pt, v_engine->fir || fir, + v_engine->nack || nack, v_engine->pli || pli, v_engine->tmmbr || tmmbr); if (switch_media_handle_test_media_flag(smh, SCMF_MULTI_ANSWER_VIDEO)) { switch_mutex_lock(smh->sdp_mutex); for (pmap = v_engine->cur_payload_map; pmap && pmap->allocated; pmap = pmap->next) { if (pmap->pt != v_engine->cur_payload_map->pt && pmap->negotiated) { - add_fb(buf, SDPBUFLEN, pmap->pt, v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli); + add_fb(buf, SDPBUFLEN, pmap->pt, v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli, v_engine->tmmbr || tmmbr); } } switch_mutex_unlock(smh->sdp_mutex); @@ -7782,7 +7809,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess already_did[smh->ianacodes[i]] = 1; } - add_fb(buf, SDPBUFLEN, smh->ianacodes[i], v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli); + add_fb(buf, SDPBUFLEN, smh->ianacodes[i], v_engine->fir || fir, v_engine->nack || nack, v_engine->pli || pli, v_engine->pli || pli); } }