[Freeswitch-svn] [commit] r9778 - freeswitch/trunk/src
Freeswitch SVN
anthm at freeswitch.org
Wed Oct 1 14:02:48 EDT 2008
Author: anthm
Date: Wed Oct 1 14:02:46 2008
New Revision: 9778
Modified:
freeswitch/trunk/src/switch_rtp.c
Log:
clean up rtp a little and tolerate polycom cng bug
Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c (original)
+++ freeswitch/trunk/src/switch_rtp.c Wed Oct 1 14:02:46 2008
@@ -197,6 +197,7 @@
char *stun_ip;
switch_port_t stun_port;
int from_auto;
+ uint32_t cng_count;
};
static int global_init = 0;
@@ -1232,6 +1233,8 @@
}
}
+#define return_cng_frame() do_cng = 1; goto timer_check
+
static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_type, switch_frame_flag_t *flags, switch_io_flag_t io_flags)
{
switch_size_t bytes = 0;
@@ -1240,7 +1243,7 @@
stfu_frame_t *jb_frame;
int ret = -1;
int sleep_mss = 1000;
-
+
if (!switch_rtp_ready(rtp_session)) {
return -1;
}
@@ -1294,14 +1297,22 @@
if (bytes) {
rtp_session->missed_count = 0;
+
+ if ((rtp_session->recv_msg.header.pt == rtp_session->cng_pt || rtp_session->recv_msg.header.pt == 13)) {
+ if (++rtp_session->cng_count == 1) {
+ return_cng_frame();
+ }
+ continue;
+ } else {
+ rtp_session->cng_count = 0;
+ }
}
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) {
switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_BREAK);
do_2833(rtp_session);
bytes = 0;
- do_cng = 1;
- goto cng;
+ return_cng_frame();
}
if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA)) {
@@ -1312,8 +1323,7 @@
}
if (!bytes && (io_flags & SWITCH_IO_FLAG_NOBLOCK)) {
- do_cng = 1;
- goto cng;
+ return_cng_frame();
}
@@ -1363,8 +1373,6 @@
goto end;
}
-
-
if (rtp_session->jb && ((bytes && rtp_session->recv_msg.header.pt == rtp_session->payload) || check)) {
if (bytes) {
if (rtp_session->recv_msg.header.m) {
@@ -1384,7 +1392,7 @@
rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
rtp_session->recv_msg.header.pt = rtp_session->payload;
} else {
- goto cng;
+ goto timer_check;
}
}
@@ -1484,14 +1492,15 @@
do_cng = 1;
}
- cng:
+ timer_check:
+
if (do_cng) {
- memset(&rtp_session->recv_msg.body, 0, 2);
- rtp_session->recv_msg.body[0] = 127;
- rtp_session->recv_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD;
+ uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
+ memset(data, 0, 2);
+ data[0] = 65;
+ rtp_session->recv_msg.header.pt = (uint32_t) rtp_session->cng_pt ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
*flags |= SFF_CNG;
- /* Return a CNG frame */
- *payload_type = SWITCH_RTP_CNG_PAYLOAD;
+ *payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
ret = 2 + rtp_header_len;
goto end;
}
@@ -1512,21 +1521,14 @@
bytes = jb_frame->dlen + rtp_header_len;
rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
} else if (!bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) { /* We're late! We're Late! */
- uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
-
+
+
if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) {
switch_yield(1000);
continue;
}
-
- memset(data, 0, 2);
- data[0] = 65;
-
- rtp_session->recv_msg.header.pt = (uint32_t) rtp_session->cng_pt ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD;
- *flags |= SFF_CNG;
- *payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
- ret = 2 + rtp_header_len;
- goto end;
+
+ return_cng_frame();
}
}
@@ -1538,10 +1540,6 @@
goto end;
}
- if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) {
- goto do_continue;
- }
-
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) {
rtp_session->recv_msg.header.pt = 97;
}
@@ -1552,11 +1550,8 @@
do_continue:
- if (sleep_mss) {
- switch_yield(sleep_mss);
- } else {
- switch_yield(1000);
- }
+ switch_yield(sleep_mss);
+
}
if (switch_rtp_ready(rtp_session)) {
More information about the Freeswitch-svn
mailing list