提交 d5ba2f3e authored 作者: Anthony Minessale's avatar Anthony Minessale

add RTP_BUG_IGNORE_MARK_BIT to list of bug tolerances

上级 23b1fc61
...@@ -554,7 +554,7 @@ typedef enum { ...@@ -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 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 should increment the RTP timestamp in each packet when, in reality, the sender should
...@@ -573,6 +573,19 @@ typedef enum { ...@@ -573,6 +573,19 @@ typedef enum {
This flag will cause each packet to have a new timestamp. 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; } switch_rtp_bug_flag_t;
#ifdef _MSC_VER #ifdef _MSC_VER
......
...@@ -2125,6 +2125,13 @@ static void parse_rtp_bugs(sofia_profile_t *profile, const char *str) ...@@ -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; 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;
}
} }
......
...@@ -2043,7 +2043,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t ...@@ -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->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 && 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); stfu_n_reset(rtp_session->jb);
} }
...@@ -2395,7 +2395,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ ...@@ -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 && 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); rtp_flush_read_buffer(rtp_session, SWITCH_RTP_FLUSH_ONCE);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论