add RTP_BUG_IGNORE_MARK_BIT to list of bug tolerances

This commit is contained in:
Anthony Minessale 2010-06-07 14:06:41 -05:00
parent 23b1fc6175
commit d5ba2f3e3b
3 changed files with 23 additions and 3 deletions

View File

@ -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

View File

@ -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;
}
}

View File

@ -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);
}