Author: trixter Date: Sun Feb 25 23:15:04 2007 New Revision: 4395 Modified: freeswitch/branches/trixter/src/include/switch_types.h freeswitch/branches/trixter/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/branches/trixter/src/switch_rtp.c Log: I think this pretty much wraps up the clean RTP transmission, adds a flag rewrite_rtp which can be specified in the profile or dialplan as a chan var that will set it up so all RTP is rewritten by FreeSWITCH so it can filter devices that otherwise wouldnt talk to each other Modified: freeswitch/branches/trixter/src/include/switch_types.h ============================================================================== --- freeswitch/branches/trixter/src/include/switch_types.h (original) +++ freeswitch/branches/trixter/src/include/switch_types.h Sun Feb 25 23:15:04 2007 @@ -244,7 +244,7 @@ SWITCH_RTP_FLAG_MINI - Use mini RTP when possible SWITCH_RTP_FLAG_DATAWAIT - Do not return from reads unless there is data even when non blocking SWITCH_RTP_FLAG_BUGGY_2833 - Emulate the bug in cisco equipment to allow interop - SWITCH_RTP_FLAG_PASS_RFC2833 - Pass 2833 (ignore it) + SWITCH_RTP_FLAG_PASS_RFC2833 - Pass 2833 (ignore it) </pre> */ typedef enum { @@ -261,7 +261,7 @@ SWITCH_RTP_FLAG_MINI = ( 1 << 10), SWITCH_RTP_FLAG_DATAWAIT = (1 << 11), SWITCH_RTP_FLAG_BUGGY_2833 = (1 << 12), - SWITCH_RTP_FLAG_PASS_RFC2833 = (1 << 13) + SWITCH_RTP_FLAG_PASS_RFC2833 = (1 << 13), } switch_rtp_flag_t; /*! Modified: freeswitch/branches/trixter/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/branches/trixter/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/branches/trixter/src/mod/endpoints/mod_sofia/mod_sofia.c Sun Feb 25 23:15:04 2007 @@ -147,7 +147,8 @@ PFLAG_FULL_ID = (1 << 3), PFLAG_PRESENCE = (1 << 4), PFLAG_PASS_RFC2833 = (1 << 5), - PFLAG_DISABLE_TRANSCODING = (1 << 6) + PFLAG_DISABLE_TRANSCODING = (1 << 6), + PFLAG_REWRITE_RTP = (1 << 7) } PFLAGS; typedef enum { @@ -1533,6 +1534,12 @@ flags |= SWITCH_RTP_FLAG_PASS_RFC2833; } + if ((tech_pvt->profile->pflags & PFLAG_REWRITE_RTP) || (val = switch_channel_get_variable(channel, "rewrite_rtp")) && switch_true(val)) { + printf("\n\n\n\n\nSetting PFLAG_REWRITE_RTP\n\n\n\n\n"); + // disable raw writes and disable 2833 passthrough + flags &= ~(SWITCH_RTP_FLAG_PASS_RFC2833 | SWITCH_RTP_FLAG_RAW_WRITE); + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "RTP [%s] %s:%d->%s:%d codec: %u ms: %d\n", switch_channel_get_name(channel), tech_pvt->local_sdp_audio_ip, @@ -1582,6 +1589,7 @@ uint8_t inb = switch_test_flag(tech_pvt, TFLAG_OUTBOUND) ? 0 : 1; tech_pvt->ssrc = switch_rtp_get_ssrc(tech_pvt->rtp_session); + switch_rtp_set_telephony_event(tech_pvt->rtp_session, tech_pvt->te); switch_set_flag_locked(tech_pvt, TFLAG_RTP); switch_set_flag_locked(tech_pvt, TFLAG_IO); @@ -2327,6 +2335,7 @@ //switch_channel_t *channel = switch_core_session_get_channel(session); switch_ivr_transfer_variable(session, nsession, SOFIA_REPLACES_HEADER); switch_ivr_transfer_variable(session, nsession, SOFIA_SIP_HEADER_PREFIX_T); + if (switch_core_session_compare(session, nsession)) { /* It's another sofia channel! so lets cache what they use as a pt for telephone event so we can keep it the same @@ -2335,6 +2344,8 @@ ctech_pvt = switch_core_session_get_private(session); assert(ctech_pvt != NULL); tech_pvt->bte = ctech_pvt->te; + + printf("\n\n\n\n\nFlags: old 0x%08X\tnew 0x%08X\n\n\n\n\n\n", ctech_pvt->profile->pflags, tech_pvt->profile->pflags); } } @@ -5169,6 +5180,10 @@ if (switch_true(val)) { profile->pflags |= PFLAG_PASS_RFC2833; } + } else if (!strcasecmp(var, "rewrite_rtp")) { + if (switch_true(val)) { + profile->pflags |= PFLAG_REWRITE_RTP; + } } else if (!strcasecmp(var, "disable-transcoding")) { if (switch_true(val)) { profile->pflags |= PFLAG_DISABLE_TRANSCODING; Modified: freeswitch/branches/trixter/src/switch_rtp.c ============================================================================== --- freeswitch/branches/trixter/src/switch_rtp.c (original) +++ freeswitch/branches/trixter/src/switch_rtp.c Sun Feb 25 23:15:04 2007 @@ -131,6 +131,7 @@ uint16_t seq; uint16_t rseq; + uint32_t ssrc; switch_payload_t payload; switch_payload_t rpayload; @@ -454,6 +455,7 @@ rtp_session->recv_msg.header.x = 0; rtp_session->recv_msg.header.cc = 0; + rtp_session->ssrc = rtp_session->send_msg.header.ssrc; rtp_session->seq = (uint16_t)rtp_session->send_msg.header.seq; rtp_session->payload = payload; rtp_session->ms_per_packet = ms_per_packet; @@ -1354,16 +1356,19 @@ void *data; uint32_t len; + // disable sending audio while sending 2833 if(rtp_session->dtmf_data.sending_dtmf) { - return 0; // is this value correct? rtp_write_common returns the bytes written ... + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "asked to send audio when 2833 is in progress, dumping audio frame\n"); + return 0; // is this value correct? rtp_write_common returns the bytes written mod_sofia doesnt seem to check though } if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_IO) || !rtp_session->remote_addr) { return -1; } - + + if (fwd && !packetize) { data = frame->packet; len = frame->packetlen; @@ -1371,10 +1376,10 @@ data = frame->data; len = frame->datalen; rtp_session->ts += ts; - rtp_session->seq = ntohs(rtp_session->seq) + 1; - rtp_session->seq = htons(rtp_session->seq); + rtp_session->seq = htons(ntohs(rtp_session->seq) + 1); rtp_session->send_msg.header.seq = rtp_session->seq; rtp_session->send_msg.header.ts = htonl(rtp_session->ts); + rtp_session->send_msg.header.ssrc = htonl(rtp_session->ssrc); } return rtp_common_write(rtp_session, data, len, 0, rtp_session->payload, &frame->flags);