FS-8130 FS-8305 refactor of last patch plus suppression of scary harmless message about opus fec
This commit is contained in:
parent
132564f071
commit
7f85faf21e
|
@ -338,7 +338,8 @@ static switch_bool_t switch_opus_has_fec(const uint8_t* payload,int payload_leng
|
||||||
return SWITCH_FALSE;
|
return SWITCH_FALSE;
|
||||||
}
|
}
|
||||||
if (payload[0] & 0x80) {
|
if (payload[0] & 0x80) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "FEC in CELT_ONLY mode ?!\n");
|
/* this scares users and its harmless so commenting it */
|
||||||
|
//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "FEC in CELT_ONLY mode ?!\n");
|
||||||
return SWITCH_FALSE;
|
return SWITCH_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
175
src/switch_rtp.c
175
src/switch_rtp.c
|
@ -556,7 +556,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (bytes > rtp_header_len && !rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] &&
|
if (bytes > rtp_header_len && !rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] &&
|
||||||
rtp_session->recv_msg.header.pt == rtp_session->recv_te) {
|
rtp_session->last_rtp_hdr.pt == rtp_session->recv_te) {
|
||||||
switch_size_t len = bytes - rtp_header_len;
|
switch_size_t len = bytes - rtp_header_len;
|
||||||
unsigned char *packet = (unsigned char *) RTP_BODY(rtp_session);
|
unsigned char *packet = (unsigned char *) RTP_BODY(rtp_session);
|
||||||
int end;
|
int end;
|
||||||
|
@ -584,8 +584,8 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
||||||
end = packet[1] & 0x80 ? 1 : 0;
|
end = packet[1] & 0x80 ? 1 : 0;
|
||||||
duration = (packet[2] << 8) + packet[3];
|
duration = (packet[2] << 8) + packet[3];
|
||||||
key = switch_rfc2833_to_char(packet[0]);
|
key = switch_rfc2833_to_char(packet[0]);
|
||||||
in_digit_seq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
|
in_digit_seq = ntohs((uint16_t) rtp_session->last_rtp_hdr.seq);
|
||||||
ts = htonl(rtp_session->recv_msg.header.ts);
|
ts = htonl(rtp_session->last_rtp_hdr.ts);
|
||||||
|
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_PASS_RFC2833]) {
|
if (rtp_session->flags[SWITCH_RTP_FLAG_PASS_RFC2833]) {
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "read: %c %u %u %u %u %d %d %s\n",
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "read: %c %u %u %u %u %d %d %s\n",
|
||||||
key, in_digit_seq, rtp_session->dtmf_data.in_digit_seq,
|
key, in_digit_seq, rtp_session->dtmf_data.in_digit_seq,
|
||||||
ts, duration, rtp_session->recv_msg.header.m, end, end && !rtp_session->dtmf_data.in_digit_ts ? "ignored" : "");
|
ts, duration, rtp_session->last_rtp_hdr.m, end, end && !rtp_session->dtmf_data.in_digit_ts ? "ignored" : "");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!rtp_session->dtmf_data.in_digit_queued && rtp_session->dtmf_data.in_digit_ts) {
|
if (!rtp_session->dtmf_data.in_digit_queued && rtp_session->dtmf_data.in_digit_ts) {
|
||||||
|
@ -706,7 +706,7 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEBUG_2833
|
#ifdef DEBUG_2833
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "drop: %c %u %u %u %u %d %d\n",
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "drop: %c %u %u %u %u %d %d\n",
|
||||||
key, in_digit_seq, rtp_session->dtmf_data.in_digit_seq, ts, duration, rtp_session->recv_msg.header.m, end);
|
key, in_digit_seq, rtp_session->dtmf_data.in_digit_seq, ts, duration, rtp_session->last_rtp_hdr.m, end);
|
||||||
#endif
|
#endif
|
||||||
switch_cond_next();
|
switch_cond_next();
|
||||||
return RESULT_GOTO_RECVFROM;
|
return RESULT_GOTO_RECVFROM;
|
||||||
|
@ -718,13 +718,13 @@ static handle_rfc2833_result_t handle_rfc2833(switch_rtp_t *rtp_session, switch_
|
||||||
return RESULT_GOTO_END;
|
return RESULT_GOTO_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rtp_session->dtmf_data.in_interleaved && rtp_session->recv_msg.header.pt != rtp_session->recv_te) {
|
if (!rtp_session->dtmf_data.in_interleaved && rtp_session->last_rtp_hdr.pt != rtp_session->recv_te) {
|
||||||
/* Drat, they are sending audio still as well as DTMF ok fine..... *sigh* */
|
/* Drat, they are sending audio still as well as DTMF ok fine..... *sigh* */
|
||||||
rtp_session->dtmf_data.in_interleaved = 1;
|
rtp_session->dtmf_data.in_interleaved = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->dtmf_data.in_interleaved || (rtp_session->rtp_bugs & RTP_BUG_IGNORE_DTMF_DURATION)) {
|
if (rtp_session->dtmf_data.in_interleaved || (rtp_session->rtp_bugs & RTP_BUG_IGNORE_DTMF_DURATION)) {
|
||||||
if (rtp_session->recv_msg.header.pt == rtp_session->recv_te) {
|
if (rtp_session->last_rtp_hdr.pt == rtp_session->recv_te) {
|
||||||
return RESULT_GOTO_RECVFROM;
|
return RESULT_GOTO_RECVFROM;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -4918,7 +4918,7 @@ static switch_size_t do_flush(switch_rtp_t *rtp_session, int force, switch_size_
|
||||||
int do_cng = 0;
|
int do_cng = 0;
|
||||||
|
|
||||||
/* Make sure to handle RFC2833 packets, even if we're flushing the packets */
|
/* Make sure to handle RFC2833 packets, even if we're flushing the packets */
|
||||||
if (bytes > rtp_header_len && rtp_session->recv_msg.header.pt == rtp_session->recv_te) {
|
if (bytes > rtp_header_len && rtp_session->last_rtp_hdr.pt == rtp_session->recv_te) {
|
||||||
handle_rfc2833(rtp_session, bytes, &do_cng);
|
handle_rfc2833(rtp_session, bytes, &do_cng);
|
||||||
#ifdef DEBUG_2833
|
#ifdef DEBUG_2833
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "*** RTP packet handled in flush loop %d ***\n", do_cng);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "*** RTP packet handled in flush loop %d ***\n", do_cng);
|
||||||
|
@ -4971,7 +4971,7 @@ static int check_recv_payload(switch_rtp_t *rtp_session)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt == pmap->pt) {
|
if (rtp_session->last_rtp_hdr.pt == pmap->pt) {
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4981,6 +4981,27 @@ static int check_recv_payload(switch_rtp_t *rtp_session)
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_recv_payload(switch_rtp_t *rtp_session)
|
||||||
|
{
|
||||||
|
int r = -1;
|
||||||
|
|
||||||
|
if (rtp_session->pmaps && *rtp_session->pmaps) {
|
||||||
|
payload_map_t *pmap;
|
||||||
|
|
||||||
|
switch_mutex_lock(rtp_session->flag_mutex);
|
||||||
|
|
||||||
|
for (pmap = *rtp_session->pmaps; pmap && pmap->allocated; pmap = pmap->next) {
|
||||||
|
if (pmap->negotiated) {
|
||||||
|
r = pmap->pt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch_mutex_unlock(rtp_session->flag_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#define return_cng_frame() do_cng = 1; goto timer_check
|
#define return_cng_frame() do_cng = 1; goto timer_check
|
||||||
|
|
||||||
static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t *bytes, switch_frame_flag_t *flags,
|
static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t *bytes, switch_frame_flag_t *flags,
|
||||||
|
@ -5048,46 +5069,44 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
|
|
||||||
rtp_session->has_rtp = (rtp_session->recv_msg.header.version == 2);
|
rtp_session->has_rtp = (rtp_session->recv_msg.header.version == 2);
|
||||||
|
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) {
|
|
||||||
switch(rtp_session->recv_msg.header.pt) {
|
|
||||||
case 64: // 192 Full INTRA-frame request.
|
|
||||||
case 72: // 200 Sender report.
|
|
||||||
case 73: // 201 Receiver report.
|
|
||||||
case 74: // 202 Source description.
|
|
||||||
case 75: // 203 Goodbye.
|
|
||||||
case 76: // 204 Application-defined.
|
|
||||||
case 77: // 205 Transport layer FB message.
|
|
||||||
case 78: // 206 Payload-specific FB message.
|
|
||||||
case 79: // 207 Extended report.
|
|
||||||
rtp_session->has_rtcp = 1;
|
|
||||||
rtp_session->has_rtp = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (!check_recv_payload(rtp_session) && rtp_session->recv_msg.header.pt != rtp_session->recv_te &&
|
|
||||||
rtp_session->recv_msg.header.pt != rtp_session->cng_pt &&
|
|
||||||
rtp_session->rtcp_recv_msg_p->header.version == 2 &&
|
|
||||||
rtp_session->rtcp_recv_msg_p->header.type > 199 && rtp_session->rtcp_recv_msg_p->header.type < 208) {
|
|
||||||
rtp_session->has_rtcp = 1;
|
|
||||||
rtp_session->has_rtp = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((*b >= 20) && (*b <= 64)) {
|
if ((*b >= 20) && (*b <= 64)) {
|
||||||
rtp_session->dtls->bytes = *bytes;
|
rtp_session->dtls->bytes = *bytes;
|
||||||
rtp_session->dtls->data = (void *) &rtp_session->recv_msg;
|
rtp_session->dtls->data = (void *) &rtp_session->recv_msg;
|
||||||
rtp_session->has_ice = 0;
|
rtp_session->has_ice = 0;
|
||||||
rtp_session->has_rtp = 0;
|
rtp_session->has_rtp = 0;
|
||||||
rtp_session->has_rtcp = 0;
|
rtp_session->has_rtcp = 0;
|
||||||
} else if (!rtp_session->has_rtp && !rtp_session->has_rtcp && rtp_session->ice.ice_user) {
|
|
||||||
if (*b == 0 || *b == 1) {
|
} else if (*b == 0 || *b == 1) {
|
||||||
rtp_session->has_ice = 1;
|
rtp_session->has_ice = 1;
|
||||||
rtp_session->has_rtp = 0;
|
rtp_session->has_rtp = 0;
|
||||||
rtp_session->has_rtcp = 0;
|
rtp_session->has_rtcp = 0;
|
||||||
|
} else {
|
||||||
|
if (rtp_session->flags[SWITCH_RTP_FLAG_RTCP_MUX]) {
|
||||||
|
switch(rtp_session->recv_msg.header.pt) {
|
||||||
|
case 64: // 192 Full INTRA-frame request.
|
||||||
|
case 72: // 200 Sender report.
|
||||||
|
case 73: // 201 Receiver report.
|
||||||
|
case 74: // 202 Source description.
|
||||||
|
case 75: // 203 Goodbye.
|
||||||
|
case 76: // 204 Application-defined.
|
||||||
|
case 77: // 205 Transport layer FB message.
|
||||||
|
case 78: // 206 Payload-specific FB message.
|
||||||
|
case 79: // 207 Extended report.
|
||||||
|
rtp_session->has_rtcp = 1;
|
||||||
|
rtp_session->has_rtp = 0;
|
||||||
|
rtp_session->has_ice = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (rtp_session->rtcp_recv_msg_p->header.version == 2 &&
|
||||||
|
rtp_session->rtcp_recv_msg_p->header.type > 199 && rtp_session->rtcp_recv_msg_p->header.type < 208) {
|
||||||
|
rtp_session->has_rtcp = 1;
|
||||||
|
rtp_session->has_rtp = 0;
|
||||||
|
rtp_session->has_ice = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rtp_session->missed_count = 0;
|
rtp_session->missed_count = 0;
|
||||||
if (rtp_session->has_rtp) {
|
if (rtp_session->has_rtp) {
|
||||||
|
@ -5227,8 +5246,8 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
now = switch_micro_time_now();
|
now = switch_micro_time_now();
|
||||||
|
|
||||||
if (*bytes) {
|
if (*bytes) {
|
||||||
uint16_t seq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
|
uint16_t seq = ntohs((uint16_t) rtp_session->last_rtp_hdr.seq);
|
||||||
ts = ntohl(rtp_session->recv_msg.header.ts);
|
ts = ntohl(rtp_session->last_rtp_hdr.ts);
|
||||||
|
|
||||||
#ifdef DEBUG_MISSED_SEQ
|
#ifdef DEBUG_MISSED_SEQ
|
||||||
if (rtp_session->last_seq && rtp_session->last_seq+1 != seq) {
|
if (rtp_session->last_seq && rtp_session->last_seq+1 != seq) {
|
||||||
|
@ -5282,7 +5301,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] && !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] &&
|
if (!rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] && !rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] &&
|
||||||
*bytes && rtp_session->recv_msg.header.pt != rtp_session->recv_te &&
|
*bytes && rtp_session->last_rtp_hdr.pt != rtp_session->recv_te &&
|
||||||
ts && !rtp_session->jb && !rtp_session->pause_jb && jb_valid(rtp_session) && ts == rtp_session->last_cng_ts) {
|
ts && !rtp_session->jb && !rtp_session->pause_jb && jb_valid(rtp_session) && ts == rtp_session->last_cng_ts) {
|
||||||
/* we already sent this frame..... */
|
/* we already sent this frame..... */
|
||||||
*bytes = 0;
|
*bytes = 0;
|
||||||
|
@ -5320,8 +5339,8 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
#ifdef ENABLE_SRTP
|
#ifdef ENABLE_SRTP
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_SECURE_RECV] && rtp_session->has_rtp &&
|
if (rtp_session->flags[SWITCH_RTP_FLAG_SECURE_RECV] && rtp_session->has_rtp &&
|
||||||
(check_recv_payload(rtp_session) ||
|
(check_recv_payload(rtp_session) ||
|
||||||
rtp_session->recv_msg.header.pt == rtp_session->recv_te ||
|
rtp_session->last_rtp_hdr.pt == rtp_session->recv_te ||
|
||||||
rtp_session->recv_msg.header.pt == rtp_session->cng_pt)) {
|
rtp_session->last_rtp_hdr.pt == rtp_session->cng_pt)) {
|
||||||
//if (rtp_session->flags[SWITCH_RTP_FLAG_SECURE_RECV] && (!rtp_session->ice.ice_user || rtp_session->has_rtp)) {
|
//if (rtp_session->flags[SWITCH_RTP_FLAG_SECURE_RECV] && (!rtp_session->ice.ice_user || rtp_session->has_rtp)) {
|
||||||
int sbytes = (int) *bytes;
|
int sbytes = (int) *bytes;
|
||||||
err_status_t stat = 0;
|
err_status_t stat = 0;
|
||||||
|
@ -5418,13 +5437,13 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
|
||||||
"VIDEO: seq: %d ts: %u len: %ld %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x mark: %d\n",
|
"VIDEO: seq: %d ts: %u len: %ld %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x mark: %d\n",
|
||||||
ntohs(rtp_session->recv_msg.header.seq), ntohl(rtp_session->recv_msg.header.ts), *bytes,
|
ntohs(rtp_session->last_rtp_hdr.seq), ntohl(rtp_session->last_rtp_hdr.ts), *bytes,
|
||||||
*((uint8_t *)RTP_BODY(rtp_session)), *((uint8_t *)RTP_BODY(rtp_session) + 1),
|
*((uint8_t *)RTP_BODY(rtp_session)), *((uint8_t *)RTP_BODY(rtp_session) + 1),
|
||||||
*((uint8_t *)RTP_BODY(rtp_session) + 2), *((uint8_t *)RTP_BODY(rtp_session) + 3),
|
*((uint8_t *)RTP_BODY(rtp_session) + 2), *((uint8_t *)RTP_BODY(rtp_session) + 3),
|
||||||
*((uint8_t *)RTP_BODY(rtp_session) + 4), *((uint8_t *)RTP_BODY(rtp_session) + 5),
|
*((uint8_t *)RTP_BODY(rtp_session) + 4), *((uint8_t *)RTP_BODY(rtp_session) + 5),
|
||||||
*((uint8_t *)RTP_BODY(rtp_session) + 6), *((uint8_t *)RTP_BODY(rtp_session) + 7),
|
*((uint8_t *)RTP_BODY(rtp_session) + 6), *((uint8_t *)RTP_BODY(rtp_session) + 7),
|
||||||
*((uint8_t *)RTP_BODY(rtp_session) + 8), *((uint8_t *)RTP_BODY(rtp_session) + 9),
|
*((uint8_t *)RTP_BODY(rtp_session) + 8), *((uint8_t *)RTP_BODY(rtp_session) + 9),
|
||||||
*((uint8_t *)RTP_BODY(rtp_session) + 10), rtp_session->recv_msg.header.m);
|
*((uint8_t *)RTP_BODY(rtp_session) + 10), rtp_session->last_rtp_hdr.m);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -5439,9 +5458,9 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
|
|
||||||
rtp_session->stats.inbound.raw_bytes += *bytes;
|
rtp_session->stats.inbound.raw_bytes += *bytes;
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt == rtp_session->recv_te) {
|
if (rtp_session->last_rtp_hdr.pt == rtp_session->recv_te) {
|
||||||
rtp_session->stats.inbound.dtmf_packet_count++;
|
rtp_session->stats.inbound.dtmf_packet_count++;
|
||||||
} else if (rtp_session->recv_msg.header.pt == rtp_session->cng_pt || rtp_session->recv_msg.header.pt == 13) {
|
} else if (rtp_session->last_rtp_hdr.pt == rtp_session->cng_pt || rtp_session->last_rtp_hdr.pt == 13) {
|
||||||
rtp_session->stats.inbound.cng_packet_count++;
|
rtp_session->stats.inbound.cng_packet_count++;
|
||||||
} else {
|
} else {
|
||||||
rtp_session->stats.inbound.media_packet_count++;
|
rtp_session->stats.inbound.media_packet_count++;
|
||||||
|
@ -5451,7 +5470,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
rtp_session->stats.inbound.packet_count++;
|
rtp_session->stats.inbound.packet_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt == rtp_session->recv_te ||
|
if (rtp_session->last_rtp_hdr.pt == rtp_session->recv_te ||
|
||||||
(*bytes < rtp_header_len && *bytes > 0) ||
|
(*bytes < rtp_header_len && *bytes > 0) ||
|
||||||
rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] || rtp_session->flags[SWITCH_RTP_FLAG_UDPTL]) {
|
rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] || rtp_session->flags[SWITCH_RTP_FLAG_UDPTL]) {
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
|
@ -5497,7 +5516,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
if (rtp_session->jb && !rtp_session->pause_jb && jb_valid(rtp_session)) {
|
if (rtp_session->jb && !rtp_session->pause_jb && jb_valid(rtp_session)) {
|
||||||
uint32_t read_ssrc = ntohl(rtp_session->last_rtp_hdr.ssrc);
|
uint32_t read_ssrc = ntohl(rtp_session->last_rtp_hdr.ssrc);
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->recv_te &&
|
if (rtp_session->last_rtp_hdr.m && rtp_session->last_rtp_hdr.pt != rtp_session->recv_te &&
|
||||||
!rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] && !(rtp_session->rtp_bugs & RTP_BUG_IGNORE_MARK_BIT)) {
|
!rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] && !(rtp_session->rtp_bugs & RTP_BUG_IGNORE_MARK_BIT)) {
|
||||||
switch_jb_reset(rtp_session->jb);
|
switch_jb_reset(rtp_session->jb);
|
||||||
} else if (rtp_session->last_jb_read_ssrc && rtp_session->last_jb_read_ssrc != read_ssrc) {
|
} else if (rtp_session->last_jb_read_ssrc && rtp_session->last_jb_read_ssrc != read_ssrc) {
|
||||||
|
@ -5539,10 +5558,14 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
goto more;
|
goto more;
|
||||||
case SWITCH_STATUS_NOTFOUND:
|
case SWITCH_STATUS_NOTFOUND:
|
||||||
{
|
{
|
||||||
|
int pt = get_recv_payload(rtp_session);
|
||||||
(*flags) |= SFF_PLC;
|
(*flags) |= SFF_PLC;
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
*bytes = switch_jb_get_last_read_len(rtp_session->jb);
|
*bytes = switch_jb_get_last_read_len(rtp_session->jb);
|
||||||
rtp_session->last_rtp_hdr = rtp_session->recv_msg.header;
|
rtp_session->last_rtp_hdr = rtp_session->recv_msg.header;
|
||||||
|
if (pt > -1) {
|
||||||
|
rtp_session->last_rtp_hdr.pt = pt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWITCH_STATUS_SUCCESS:
|
case SWITCH_STATUS_SUCCESS:
|
||||||
|
@ -5551,7 +5574,7 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t
|
||||||
rtp_session->stats.inbound.jb_packet_count++;
|
rtp_session->stats.inbound.jb_packet_count++;
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
rtp_session->last_rtp_hdr = rtp_session->recv_msg.header;
|
rtp_session->last_rtp_hdr = rtp_session->recv_msg.header;
|
||||||
|
|
||||||
if (!xcheck_jitter) {
|
if (!xcheck_jitter) {
|
||||||
check_jitter(rtp_session);
|
check_jitter(rtp_session);
|
||||||
xcheck_jitter = *bytes;
|
xcheck_jitter = *bytes;
|
||||||
|
@ -6382,9 +6405,9 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
|
|
||||||
if (bytes && rtp_session->has_rtp &&
|
if (bytes && rtp_session->has_rtp &&
|
||||||
!rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] &&
|
!rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] &&
|
||||||
rtp_session->recv_msg.header.pt != 13 &&
|
rtp_session->last_rtp_hdr.pt != 13 &&
|
||||||
rtp_session->recv_msg.header.pt != rtp_session->recv_te &&
|
rtp_session->last_rtp_hdr.pt != rtp_session->recv_te &&
|
||||||
rtp_session->recv_msg.header.pt != rtp_session->cng_pt) {
|
rtp_session->last_rtp_hdr.pt != rtp_session->cng_pt) {
|
||||||
int accept_packet = 1;
|
int accept_packet = 1;
|
||||||
|
|
||||||
|
|
||||||
|
@ -6399,7 +6422,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt == pmap->pt) {
|
if (rtp_session->last_rtp_hdr.pt == pmap->pt) {
|
||||||
accept_packet = 1;
|
accept_packet = 1;
|
||||||
if (pmapP) {
|
if (pmapP) {
|
||||||
*pmapP = pmap;
|
*pmapP = pmap;
|
||||||
|
@ -6451,14 +6474,14 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
goto recvfrom;
|
goto recvfrom;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytes && rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->recv_te &&
|
if (bytes && rtp_session->last_rtp_hdr.m && rtp_session->last_rtp_hdr.pt != rtp_session->recv_te &&
|
||||||
!rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] &&
|
!rtp_session->flags[SWITCH_RTP_FLAG_VIDEO] &&
|
||||||
!(rtp_session->rtp_bugs & RTP_BUG_IGNORE_MARK_BIT)) {
|
!(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt == rtp_session->cng_pt || rtp_session->recv_msg.header.pt == 13) {
|
if (rtp_session->last_rtp_hdr.pt == rtp_session->cng_pt || rtp_session->last_rtp_hdr.pt == 13) {
|
||||||
*flags |= SFF_NOT_AUDIO;
|
*flags |= SFF_NOT_AUDIO;
|
||||||
} else {
|
} else {
|
||||||
*flags &= ~SFF_NOT_AUDIO; /* If this flag was already set, make sure to remove it when we get real audio */
|
*flags &= ~SFF_NOT_AUDIO; /* If this flag was already set, make sure to remove it when we get real audio */
|
||||||
|
@ -6467,7 +6490,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
/* ignore packets not meant for us unless the auto-adjust window is open (ice mode has its own alternatives to this) */
|
/* ignore packets not meant for us unless the auto-adjust window is open (ice mode has its own alternatives to this) */
|
||||||
if (!using_ice(rtp_session) && bytes) {
|
if (!using_ice(rtp_session) && bytes) {
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_AUTOADJ]) {
|
if (rtp_session->flags[SWITCH_RTP_FLAG_AUTOADJ]) {
|
||||||
if (rtp_session->recv_msg.header.pt == rtp_session->cng_pt || rtp_session->recv_msg.header.pt == 13) {
|
if (rtp_session->last_rtp_hdr.pt == rtp_session->cng_pt || rtp_session->last_rtp_hdr.pt == 13) {
|
||||||
goto recvfrom;
|
goto recvfrom;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6569,7 +6592,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
goto do_continue;
|
goto do_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.pt && (rtp_session->recv_msg.header.pt == rtp_session->cng_pt || rtp_session->recv_msg.header.pt == 13)) {
|
if (rtp_session->last_rtp_hdr.pt && (rtp_session->last_rtp_hdr.pt == rtp_session->cng_pt || rtp_session->last_rtp_hdr.pt == 13)) {
|
||||||
return_cng_frame();
|
return_cng_frame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6581,12 +6604,12 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
if (bytes && rtp_session->recv_msg.header.version != 2) {
|
if (bytes && rtp_session->recv_msg.header.version != 2) {
|
||||||
uint8_t *data = (uint8_t *) RTP_BODY(rtp_session);
|
uint8_t *data = (uint8_t *) RTP_BODY(rtp_session);
|
||||||
|
|
||||||
if (rtp_session->recv_msg.header.version == 0) {
|
//if (rtp_session->recv_msg.header.version == 0) {
|
||||||
if (rtp_session->ice.ice_user) {
|
// if (rtp_session->ice.ice_user) {
|
||||||
handle_ice(rtp_session, &rtp_session->ice, (void *) &rtp_session->recv_msg, bytes);
|
// handle_ice(rtp_session, &rtp_session->ice, (void *) &rtp_session->recv_msg, bytes);
|
||||||
goto recvfrom;
|
// goto recvfrom;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (rtp_session->invalid_handler) {
|
if (rtp_session->invalid_handler) {
|
||||||
rtp_session->invalid_handler(rtp_session, rtp_session->sock_input, (void *) &rtp_session->recv_msg, bytes, rtp_session->rtp_from_addr);
|
rtp_session->invalid_handler(rtp_session, rtp_session->sock_input, (void *) &rtp_session->recv_msg, bytes, rtp_session->rtp_from_addr);
|
||||||
|
@ -6595,9 +6618,9 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
memset(data, 0, 2);
|
memset(data, 0, 2);
|
||||||
data[0] = 65;
|
data[0] = 65;
|
||||||
|
|
||||||
rtp_session->recv_msg.header.pt = rtp_session->cng_pt != INVALID_PT ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
|
rtp_session->last_rtp_hdr.pt = rtp_session->cng_pt != INVALID_PT ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
|
||||||
*flags |= SFF_CNG;
|
*flags |= SFF_CNG;
|
||||||
*payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
|
*payload_type = (switch_payload_t) rtp_session->last_rtp_hdr.pt;
|
||||||
ret = 2 + rtp_header_len;
|
ret = 2 + rtp_header_len;
|
||||||
goto end;
|
goto end;
|
||||||
} else if (bytes) {
|
} else if (bytes) {
|
||||||
|
@ -6637,9 +6660,9 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
|
|
||||||
memset(data, 0, 2);
|
memset(data, 0, 2);
|
||||||
data[0] = 65;
|
data[0] = 65;
|
||||||
rtp_session->recv_msg.header.pt = rtp_session->cng_pt != INVALID_PT ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
|
rtp_session->last_rtp_hdr.pt = rtp_session->cng_pt != INVALID_PT ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
|
||||||
*flags |= SFF_CNG;
|
*flags |= SFF_CNG;
|
||||||
*payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
|
*payload_type = (switch_payload_t) rtp_session->last_rtp_hdr.pt;
|
||||||
ret = 2 + rtp_header_len;
|
ret = 2 + rtp_header_len;
|
||||||
rtp_session->stats.inbound.skip_packet_count++;
|
rtp_session->stats.inbound.skip_packet_count++;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -6679,8 +6702,8 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
return_cng_frame();
|
return_cng_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_GOOGLEHACK] && rtp_session->recv_msg.header.pt == 102) {
|
if (rtp_session->flags[SWITCH_RTP_FLAG_GOOGLEHACK] && rtp_session->last_rtp_hdr.pt == 102) {
|
||||||
rtp_session->recv_msg.header.pt = 97;
|
rtp_session->last_rtp_hdr.pt = 97;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -6694,7 +6717,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (switch_rtp_ready(rtp_session)) {
|
if (switch_rtp_ready(rtp_session)) {
|
||||||
*payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
|
*payload_type = (switch_payload_t) rtp_session->last_rtp_hdr.pt;
|
||||||
|
|
||||||
if (*payload_type == SWITCH_RTP_CNG_PAYLOAD) {
|
if (*payload_type == SWITCH_RTP_CNG_PAYLOAD) {
|
||||||
*flags |= SFF_CNG;
|
*flags |= SFF_CNG;
|
||||||
|
@ -7154,11 +7177,11 @@ static int rtp_common_write(switch_rtp_t *rtp_session,
|
||||||
send_msg->header.ssrc = htonl(rtp_session->ssrc);
|
send_msg->header.ssrc = htonl(rtp_session->ssrc);
|
||||||
|
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_GOOGLEHACK] && rtp_session->send_msg.header.pt == 97) {
|
if (rtp_session->flags[SWITCH_RTP_FLAG_GOOGLEHACK] && rtp_session->send_msg.header.pt == 97) {
|
||||||
rtp_session->recv_msg.header.pt = 102;
|
rtp_session->last_rtp_hdr.pt = 102;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtp_session->flags[SWITCH_RTP_FLAG_VAD] &&
|
if (rtp_session->flags[SWITCH_RTP_FLAG_VAD] &&
|
||||||
rtp_session->recv_msg.header.pt == rtp_session->vad_data.read_codec->implementation->ianacode) {
|
rtp_session->last_rtp_hdr.pt == rtp_session->vad_data.read_codec->implementation->ianacode) {
|
||||||
|
|
||||||
int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)] = { 0 };
|
int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)] = { 0 };
|
||||||
uint32_t rate = 0;
|
uint32_t rate = 0;
|
||||||
|
|
Loading…
Reference in New Issue