diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 02f21a04d3..d4f328802c 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -554,7 +554,7 @@ typedef enum { */ - RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833 = (1 << 1) + RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833 = (1 << 1), /* Sonus wrongly expects that, when sending a multi-packet 2833 DTMF event, The sender should increment the RTP timestamp in each packet when, in reality, the sender should @@ -573,6 +573,19 @@ typedef enum { This flag will cause each packet to have a new timestamp. */ + + + RTP_BUG_IGNORE_MARK_BIT = (1 << 2) + + /* + A Huawei SBC has been discovered that sends the mark bit on every single RTP packet. + Since this causes the RTP stack to flush it's buffers, it horribly messes up the timing on the channel. + + This flag will do nothing when an inbound packet contains the mark bit. + + */ + + } switch_rtp_bug_flag_t; #ifdef _MSC_VER diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index cb709d12b8..2d5c43eafa 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -2125,6 +2125,13 @@ static void parse_rtp_bugs(sofia_profile_t *profile, const char *str) profile->auto_rtp_bugs &= ~RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833; } + if (switch_stristr("RTP_BUG_IGNORE_MARK_BIT", str)) { + profile->auto_rtp_bugs |= RTP_BUG_IGNORE_MARK_BIT; + } + + if (switch_stristr("~RTP_BUG_IGNORE_MARK_BIT", str)) { + profile->auto_rtp_bugs &= ~RTP_BUG_IGNORE_MARK_BIT; + } } diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 13edd4d330..0efbf24e97 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2043,7 +2043,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t if (rtp_session->jb && rtp_session->recv_msg.header.version == 2 && *bytes) { if (rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->recv_te && - !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO)) { + !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO) && !(rtp_session->rtp_bugs & RTP_BUG_IGNORE_MARK_BIT)) { stfu_n_reset(rtp_session->jb); } @@ -2395,7 +2395,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ } if (bytes && rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->recv_te && - !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO)) { + !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VIDEO) && !(rtp_session->rtp_bugs & RTP_BUG_IGNORE_MARK_BIT)) { rtp_flush_read_buffer(rtp_session, SWITCH_RTP_FLUSH_ONCE); }