*/
- 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
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
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;
+ }
}
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);
}
}
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);
}