[Freeswitch-svn] [commit] r11293 - freeswitch/trunk/src
FreeSWITCH SVN
anthm at freeswitch.org
Mon Jan 19 13:12:20 PST 2009
Author: anthm
Date: Mon Jan 19 15:12:20 2009
New Revision: 11293
Log:
FSCORE-273
Modified:
freeswitch/trunk/src/switch_rtp.c
Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c (original)
+++ freeswitch/trunk/src/switch_rtp.c Mon Jan 19 15:12:20 2009
@@ -1374,110 +1374,6 @@
goto end;
}
-#ifdef DEBUG_2833
- if (rtp_session->dtmf_data.in_digit_sanity && !(rtp_session->dtmf_data.in_digit_sanity % 100)) {
- printf("sanity %d\n", rtp_session->dtmf_data.in_digit_sanity);
- }
-#endif
-
- if (rtp_session->dtmf_data.in_digit_sanity && !--rtp_session->dtmf_data.in_digit_sanity) {
- rtp_session->dtmf_data.last_digit = 0;
- rtp_session->dtmf_data.in_digit_ts = 0;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed DTMF sanity check.\n");
- }
-
- /* RFC2833 ... like all RFC RE: VoIP, guaranteed to drive you to insanity!
- We know the real rules here, but if we enforce them, it's an interop nightmare so,
- we put up with as much as we can so we don't have to deal with being punished for
- doing it right. Nice guys finish last!
- */
- if (bytes && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA) &&
- !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PASS_RFC2833) && rtp_session->recv_msg.header.pt == rtp_session->te) {
- unsigned char *packet = (unsigned char *) rtp_session->recv_msg.body;
- int end = packet[1] & 0x80 ? 1 : 0;
- uint16_t duration = (packet[2] << 8) + packet[3];
- char key = switch_rfc2833_to_char(packet[0]);
- uint16_t in_digit_seq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
- uint32_t ts = htonl(rtp_session->recv_msg.header.ts);
-
- if (in_digit_seq < rtp_session->dtmf_data.in_digit_seq) {
- if (rtp_session->dtmf_data.in_digit_seq - in_digit_seq > 100) {
- rtp_session->dtmf_data.in_digit_seq = 0;
- }
- }
-
- if (in_digit_seq > rtp_session->dtmf_data.in_digit_seq) {
-
- rtp_session->dtmf_data.in_digit_seq = in_digit_seq;
-
-#ifdef DEBUG_2833
-
- printf("read: %c %u %u %u %u %d %d %s\n",
- 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" : "");
-#endif
-
- if (rtp_session->dtmf_data.last_duration > duration && ts == rtp_session->dtmf_data.in_digit_ts) {
- rtp_session->dtmf_data.flip++;
- }
-
- if (end) {
- if (rtp_session->dtmf_data.in_digit_ts) {
- switch_dtmf_t dtmf = { key, duration };
-
- if (ts > rtp_session->dtmf_data.in_digit_ts) {
- dtmf.duration += (ts - rtp_session->dtmf_data.in_digit_ts);
- }
- if (rtp_session->dtmf_data.flip) {
- dtmf.duration += rtp_session->dtmf_data.flip * 0xFFFF;
- rtp_session->dtmf_data.flip = 0;
-#ifdef DEBUG_2833
- printf("you're welcome!\n");
-#endif
- }
-
-#ifdef DEBUG_2833
- printf("done digit=%c ts=%u start_ts=%u dur=%u ddur=%u\n",
- dtmf.digit, ts, rtp_session->dtmf_data.in_digit_ts, duration, dtmf.duration);
-#endif
- switch_rtp_queue_rfc2833_in(rtp_session, &dtmf);
- rtp_session->dtmf_data.last_digit = rtp_session->dtmf_data.first_digit;
-
- rtp_session->dtmf_data.in_digit_ts = 0;
- rtp_session->dtmf_data.in_digit_sanity = 0;
- do_cng = 1;
- } else {
- if (!switch_rtp_ready(rtp_session)) {
- goto end;
- }
- switch_cond_next();
- goto recvfrom;
- }
-
- } else if (!rtp_session->dtmf_data.in_digit_ts) {
- rtp_session->dtmf_data.in_digit_ts = ts;
- rtp_session->dtmf_data.first_digit = key;
- rtp_session->dtmf_data.in_digit_sanity = 2000;
- }
-
- rtp_session->dtmf_data.last_duration = duration;
-#ifdef DEBUG_2833
- } else {
- printf("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);
-#endif
- }
- }
-
- if (rtp_session->dtmf_data.in_digit_ts) {
- if (!switch_rtp_ready(rtp_session)) {
- goto end;
- }
- switch_cond_next();
- goto recvfrom;
- }
-
-
if (rtp_session->max_missed_packets) {
if (bytes) {
rtp_session->missed_count = 0;
@@ -1659,6 +1555,109 @@
}
+#ifdef DEBUG_2833
+ if (rtp_session->dtmf_data.in_digit_sanity && !(rtp_session->dtmf_data.in_digit_sanity % 100)) {
+ printf("sanity %d\n", rtp_session->dtmf_data.in_digit_sanity);
+ }
+#endif
+
+ if (rtp_session->dtmf_data.in_digit_sanity && !--rtp_session->dtmf_data.in_digit_sanity) {
+ rtp_session->dtmf_data.last_digit = 0;
+ rtp_session->dtmf_data.in_digit_ts = 0;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed DTMF sanity check.\n");
+ }
+
+ /* RFC2833 ... like all RFC RE: VoIP, guaranteed to drive you to insanity!
+ We know the real rules here, but if we enforce them, it's an interop nightmare so,
+ we put up with as much as we can so we don't have to deal with being punished for
+ doing it right. Nice guys finish last!
+ */
+ if (bytes && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA) &&
+ !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PASS_RFC2833) && rtp_session->recv_msg.header.pt == rtp_session->te) {
+ unsigned char *packet = (unsigned char *) rtp_session->recv_msg.body;
+ int end = packet[1] & 0x80 ? 1 : 0;
+ uint16_t duration = (packet[2] << 8) + packet[3];
+ char key = switch_rfc2833_to_char(packet[0]);
+ uint16_t in_digit_seq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
+ uint32_t ts = htonl(rtp_session->recv_msg.header.ts);
+
+ if (in_digit_seq < rtp_session->dtmf_data.in_digit_seq) {
+ if (rtp_session->dtmf_data.in_digit_seq - in_digit_seq > 100) {
+ rtp_session->dtmf_data.in_digit_seq = 0;
+ }
+ }
+
+ if (in_digit_seq > rtp_session->dtmf_data.in_digit_seq) {
+
+ rtp_session->dtmf_data.in_digit_seq = in_digit_seq;
+
+#ifdef DEBUG_2833
+
+ printf("read: %c %u %u %u %u %d %d %s\n",
+ 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" : "");
+#endif
+
+ if (rtp_session->dtmf_data.last_duration > duration && ts == rtp_session->dtmf_data.in_digit_ts) {
+ rtp_session->dtmf_data.flip++;
+ }
+
+ if (end) {
+ if (rtp_session->dtmf_data.in_digit_ts) {
+ switch_dtmf_t dtmf = { key, duration };
+
+ if (ts > rtp_session->dtmf_data.in_digit_ts) {
+ dtmf.duration += (ts - rtp_session->dtmf_data.in_digit_ts);
+ }
+ if (rtp_session->dtmf_data.flip) {
+ dtmf.duration += rtp_session->dtmf_data.flip * 0xFFFF;
+ rtp_session->dtmf_data.flip = 0;
+#ifdef DEBUG_2833
+ printf("you're welcome!\n");
+#endif
+ }
+
+#ifdef DEBUG_2833
+ printf("done digit=%c ts=%u start_ts=%u dur=%u ddur=%u\n",
+ dtmf.digit, ts, rtp_session->dtmf_data.in_digit_ts, duration, dtmf.duration);
+#endif
+ switch_rtp_queue_rfc2833_in(rtp_session, &dtmf);
+ rtp_session->dtmf_data.last_digit = rtp_session->dtmf_data.first_digit;
+
+ rtp_session->dtmf_data.in_digit_ts = 0;
+ rtp_session->dtmf_data.in_digit_sanity = 0;
+ do_cng = 1;
+ } else {
+ if (!switch_rtp_ready(rtp_session)) {
+ goto end;
+ }
+ switch_cond_next();
+ goto recvfrom;
+ }
+
+ } else if (!rtp_session->dtmf_data.in_digit_ts) {
+ rtp_session->dtmf_data.in_digit_ts = ts;
+ rtp_session->dtmf_data.first_digit = key;
+ rtp_session->dtmf_data.in_digit_sanity = 2000;
+ }
+
+ rtp_session->dtmf_data.last_duration = duration;
+#ifdef DEBUG_2833
+ } else {
+ printf("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);
+#endif
+ }
+ }
+
+ if (rtp_session->dtmf_data.in_digit_ts) {
+ if (!switch_rtp_ready(rtp_session)) {
+ goto end;
+ }
+ switch_cond_next();
+ goto recvfrom;
+ }
+
timer_check:
if (do_cng) {
More information about the Freeswitch-svn
mailing list