1
0
mirror of https://github.com/signalwire/freeswitch.git synced 2025-03-04 17:51:03 +00:00

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
src
include
mod/endpoints/mod_sofia
switch_rtp.c

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