[Freeswitch-svn] [commit] r4876 - in freeswitch/trunk: libs/libdingaling/src src src/mod/endpoints/mod_dingaling

Freeswitch SVN anthm at freeswitch.org
Fri Apr 6 21:57:54 EDT 2007


Author: anthm
Date: Fri Apr  6 21:57:54 2007
New Revision: 4876

Modified:
   freeswitch/trunk/libs/libdingaling/src/libdingaling.c
   freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c
   freeswitch/trunk/src/switch_rtp.c

Log:
merge 1

Modified: freeswitch/trunk/libs/libdingaling/src/libdingaling.c
==============================================================================
--- freeswitch/trunk/libs/libdingaling/src/libdingaling.c	(original)
+++ freeswitch/trunk/libs/libdingaling/src/libdingaling.c	Fri Apr  6 21:57:54 2007
@@ -731,6 +731,8 @@
 	struct ldl_buffer *buffer;
 	ldl_signal_t dl_signal = LDL_SIGNAL_PRESENCE_IN;
 
+
+
     if (type && *type) {
         if (!strcasecmp(type, "unavailable")) {
             dl_signal = LDL_SIGNAL_PRESENCE_OUT;
@@ -754,6 +756,7 @@
 		*resource++ = '\0';
 	}
 	
+
 	if (!apr_hash_get(handle->sub_hash, from, APR_HASH_KEY_STRING)) {
 		iks *msg;
 		apr_hash_set(handle->sub_hash, 	apr_pstrdup(handle->pool, from), APR_HASH_KEY_STRING, &marker);
@@ -766,6 +769,8 @@
 		apr_cpystrn(buffer->buf, from, buffer->len);
 		fflush(stderr);
 		buffer->hit = 1;
+	} else {
+		printf("DAMMIT Lookup %s\n", from);
 	}
 	
     if (handle->session_callback) {
@@ -1953,42 +1958,33 @@
 	iks *pres, *msg;
 	char *lid = NULL, *low_id = NULL;
 	struct ldl_buffer buffer;
-	apr_time_t started;
+	time_t started;
 	unsigned int elapsed;
 	char *notice = "Call Me!";
-	int again = 0;
-
+	int next = 0;
+	
 	buffer.buf = buf;
 	buffer.len = len;
 	buffer.hit = 0;
 
-	pres = iks_new("presence");
-	iks_insert_attrib(pres, "type", "probe");
-	iks_insert_attrib(pres, "from", from);
-	iks_insert_attrib(pres, "to", id);
-	
-
 	apr_hash_set(handle->probe_hash, id, APR_HASH_KEY_STRING, &buffer);
+
 	msg = iks_make_s10n (IKS_TYPE_SUBSCRIBE, id, notice); 
 	iks_insert_attrib(msg, "from", from);
 	apr_queue_push(handle->queue, msg);
-	msg = iks_make_s10n (IKS_TYPE_SUBSCRIBED, id, notice); 
-	iks_insert_attrib(msg, "from", from);
-	apr_queue_push(handle->queue, msg);
-	apr_queue_push(handle->queue, pres);
-
-	//schedule_packet(handle, next_id(), pres, LDL_RETRY);
 
-	started = apr_time_now();
+	started = time(NULL);
 	for(;;) {
-		elapsed = (unsigned int)((apr_time_now() - started) / 1000);
-		if (elapsed > 5000 && ! again) {
-			msg = iks_make_s10n (IKS_TYPE_SUBSCRIBE, id, notice); 
-			iks_insert_attrib(msg, "from", from);
-			apr_queue_push(handle->queue, msg);
-			again++;
+		elapsed = time(NULL) - started;
+		if (elapsed == next) {
+			pres = iks_new("presence");
+			iks_insert_attrib(pres, "type", "probe");
+			iks_insert_attrib(pres, "from", from);
+			iks_insert_attrib(pres, "to", id);
+			apr_queue_push(handle->queue, pres);
+			next += 5;
 		}
-		if (elapsed > 10000) {
+		if (elapsed >= 17) {
 			break;
 		}
 		if (buffer.hit) {

Modified: freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_dingaling/mod_dingaling.c	Fri Apr  6 21:57:54 2007
@@ -849,9 +849,8 @@
 
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SETUP RTP %s:%d -> %s:%d\n", tech_pvt->profile->ip,
 					  tech_pvt->local_port, tech_pvt->remote_ip, tech_pvt->remote_port);
-
+	
 	flags = SWITCH_RTP_FLAG_GOOGLEHACK | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_RAW_WRITE | SWITCH_RTP_FLAG_AUTO_CNG;
-	//flags = SWITCH_RTP_FLAG_AUTOADJ;
 
 	if (switch_test_flag(tech_pvt->profile, TFLAG_TIMER)) {
 		flags |= SWITCH_RTP_FLAG_USE_TIMER;
@@ -874,7 +873,11 @@
 		uint8_t inb = switch_test_flag(tech_pvt, TFLAG_OUTBOUND) ? 0 : 1;
 		switch_rtp_activate_ice(tech_pvt->rtp_session, tech_pvt->remote_user, tech_pvt->local_user);
 		if ((vad_in && inb) || (vad_out && !inb)) {
-			switch_rtp_enable_vad(tech_pvt->rtp_session, tech_pvt->session, &tech_pvt->read_codec, SWITCH_VAD_FLAG_TALKING);
+			if (switch_rtp_enable_vad(tech_pvt->rtp_session, tech_pvt->session, &tech_pvt->read_codec, SWITCH_VAD_FLAG_TALKING) != SWITCH_STATUS_SUCCESS) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "VAD ERROR %s\n", err);
+				switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
+				return 0;
+			}
 			switch_set_flag_locked(tech_pvt, TFLAG_VAD);
 		}
 		switch_rtp_set_cng_pt(tech_pvt->rtp_session, 13);
@@ -1065,7 +1068,8 @@
 
 	while (!(switch_test_flag(tech_pvt, TFLAG_CODEC_READY) &&
 			 switch_test_flag(tech_pvt, TFLAG_RTP_READY) &&
-			 switch_test_flag(tech_pvt, TFLAG_ANSWER) && switch_test_flag(tech_pvt, TFLAG_TRANSPORT_ACCEPT)
+			 switch_test_flag(tech_pvt, TFLAG_ANSWER) && switch_test_flag(tech_pvt, TFLAG_TRANSPORT_ACCEPT) &&
+			 tech_pvt->remote_ip && tech_pvt->remote_port
 			 && switch_test_flag(tech_pvt, TFLAG_TRANSPORT))) {
 		now = switch_time_now();
 		elapsed = (unsigned int) ((now - started) / 1000);
@@ -1329,89 +1333,101 @@
 static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, int timeout, switch_io_flag_t flags, int stream_id)
 {
 	struct private_object *tech_pvt = NULL;
-	uint32_t bytes = 0;
-	switch_size_t samples = 0, frames = 0, ms = 0;
 	switch_channel_t *channel = NULL;
-	switch_payload_t payload = 0;
-	switch_status_t status;
+	int payload = 0;
 
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
-	tech_pvt = switch_core_session_get_private(session);
+	tech_pvt = (struct private_object *) switch_core_session_get_private(session);
 	assert(tech_pvt != NULL);
 
-
-	if (!tech_pvt->rtp_session) {
-		return SWITCH_STATUS_FALSE;
-	}
-
-	if (switch_test_flag(tech_pvt, TFLAG_BYE)) {
-		//terminate_session(&session,  __LINE__, SWITCH_CAUSE_NORMAL_CLEARING);
-		return SWITCH_STATUS_FALSE;
+	while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
+		if (switch_channel_ready(channel)) {
+			switch_yield(10000);
+		} else {
+			return SWITCH_STATUS_GENERR;
+		}
 	}
 
 
 	tech_pvt->read_frame.datalen = 0;
 	switch_set_flag_locked(tech_pvt, TFLAG_READING);
 
-	bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-	samples = tech_pvt->read_codec.implementation->samples_per_frame;
-	ms = tech_pvt->read_codec.implementation->microseconds_per_frame;
-	tech_pvt->read_frame.datalen = 0;
+#if 0
+	if (tech_pvt->last_read) {
+		elapsed = (unsigned int) ((switch_time_now() - tech_pvt->last_read) / 1000);
+		if (elapsed > 60000) {
+			return SWITCH_STATUS_TIMEOUT;
+		}
+	}
+#endif
 
 
-	while (!switch_test_flag(tech_pvt, TFLAG_BYE) && switch_test_flag(tech_pvt, TFLAG_IO)
-		   && tech_pvt->read_frame.datalen == 0) {
-		tech_pvt->read_frame.flags = 0;
-		status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame);
+	if (switch_test_flag(tech_pvt, TFLAG_IO)) {
+		switch_status_t status;
 
-		if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
-			return SWITCH_STATUS_FALSE;
-		}
-		payload = tech_pvt->read_frame.payload;
+		assert(tech_pvt->rtp_session != NULL);
+		tech_pvt->read_frame.datalen = 0;
 
-		if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) {
-			char dtmf[128];
-			switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, dtmf, sizeof(dtmf));
-			switch_channel_queue_dtmf(channel, dtmf);
-			switch_set_flag_locked(tech_pvt, TFLAG_DTMF);
-		}
 
-		if (switch_test_flag(tech_pvt, TFLAG_DTMF)) {
-			switch_clear_flag_locked(tech_pvt, TFLAG_DTMF);
-			return SWITCH_STATUS_BREAK;
-		}
+		while (switch_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) {
+			tech_pvt->read_frame.flags = SFF_NONE;
 
-		if (switch_test_flag(&tech_pvt->read_frame, SFF_CNG)) {
-			tech_pvt->read_frame.datalen = tech_pvt->last_read ? tech_pvt->last_read : tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-		}
+			status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame);
+			if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+				return SWITCH_STATUS_FALSE;
+			}
 
-		if (tech_pvt->read_frame.datalen > 0) {
-			if (!switch_test_flag((&tech_pvt->read_frame), SFF_CNG)) {
-				if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame && bytes) {
-					bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-					frames = (tech_pvt->read_frame.datalen / bytes);
-				} else {
-					frames = 1;
+
+
+			payload = tech_pvt->read_frame.payload;
+
+#if 0
+			elapsed = (unsigned int) ((switch_time_now() - started) / 1000);
+
+			if (timeout > -1) {
+				if (elapsed >= (unsigned int) timeout) {
+					return SWITCH_STATUS_BREAK;
 				}
-				samples = frames * tech_pvt->read_codec.implementation->samples_per_frame;
-				ms = frames * tech_pvt->read_codec.implementation->microseconds_per_frame;
-				tech_pvt->timestamp_recv += (int32_t) samples;
-				tech_pvt->read_frame.samples = (int) samples;
-				tech_pvt->last_read = tech_pvt->read_frame.datalen;
 			}
-			break;
-		}
 
-		switch_yield(1000);
-	}
+			elapsed = (unsigned int) ((switch_time_now() - last_act) / 1000);
+			if (elapsed >= hard_timeout) {
+				return SWITCH_STATUS_BREAK;
+			}
+#endif
+			if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) {
+				char dtmf[128];
+				switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, dtmf, sizeof(dtmf));
+				switch_channel_queue_dtmf(channel, dtmf);
+			}
+
 
+			if (tech_pvt->read_frame.datalen > 0) {
+				size_t bytes = 0;
+				int frames = 1;
+
+				if (!switch_test_flag((&tech_pvt->read_frame), SFF_CNG)) {
+					if ((bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame)) {
+						frames = (tech_pvt->read_frame.datalen / bytes);
+					}
+					tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_codec.implementation->samples_per_frame);
+				}
+				break;
+			}
+		}
+	}
 
 	switch_clear_flag_locked(tech_pvt, TFLAG_READING);
 
+	if (tech_pvt->read_frame.datalen == 0) {
+		*frame = NULL;
+		return SWITCH_STATUS_GENERR;
+	}
 
 	*frame = &tech_pvt->read_frame;
+
 	return SWITCH_STATUS_SUCCESS;
 }
 
@@ -1422,45 +1438,46 @@
 	switch_status_t status = SWITCH_STATUS_SUCCESS;
 	int bytes = 0, samples = 0, frames = 0;
 
-
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
-	tech_pvt = switch_core_session_get_private(session);
+	tech_pvt = (struct private_object *) switch_core_session_get_private(session);
 	assert(tech_pvt != NULL);
 
-	if (!tech_pvt->rtp_session) {
-		return SWITCH_STATUS_FALSE;
+	while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) {
+		if (switch_channel_ready(channel)) {
+			switch_yield(10000);
+		} else {
+			return SWITCH_STATUS_GENERR;
+		}
 	}
 
-	if (!switch_test_flag(tech_pvt, TFLAG_RTP_READY)) {
+	if (!switch_test_flag(tech_pvt, TFLAG_IO)) {
 		return SWITCH_STATUS_SUCCESS;
 	}
 
-
-	if (switch_test_flag(tech_pvt, TFLAG_BYE)) {
-		return SWITCH_STATUS_FALSE;
-	}
-
 	switch_set_flag_locked(tech_pvt, TFLAG_WRITING);
 
-	if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame) {
-		bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
-		frames = ((int) frame->datalen / bytes);
-	} else {
-		frames = 1;
-	}
+	if (!switch_test_flag(frame, SFF_CNG)) {
+		if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame) {
+			bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame;
+			frames = ((int) frame->datalen / bytes);
+		} else
+			frames = 1;
 
-	samples = frames * tech_pvt->read_codec.implementation->samples_per_frame;
-	tech_pvt->timestamp_send += samples;
-	if (switch_rtp_write_frame(tech_pvt->rtp_session, frame, 0) < 0) {
-		terminate_session(&session, __LINE__, SWITCH_CAUSE_NORMAL_CLEARING);
-		return SWITCH_STATUS_FALSE;
+		samples = frames * tech_pvt->read_codec.implementation->samples_per_frame;
 	}
+#if 0
+	printf("%s %s->%s send %d bytes %d samples in %d frames ts=%d\n",
+		   switch_channel_get_name(channel),
+		   tech_pvt->local_sdp_audio_ip, tech_pvt->remote_sdp_audio_ip, frame->datalen, samples, frames, tech_pvt->timestamp_send);
+#endif
 
+	tech_pvt->timestamp_send += samples;
+	//switch_rtp_write_frame(tech_pvt->rtp_session, frame, tech_pvt->timestamp_send);
+	switch_rtp_write_frame(tech_pvt->rtp_session, frame, 0);
 
 	switch_clear_flag_locked(tech_pvt, TFLAG_WRITING);
-
 	return status;
 }
 

Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c	(original)
+++ freeswitch/trunk/src/switch_rtp.c	Fri Apr  6 21:57:54 2007
@@ -772,7 +772,6 @@
 			return -1;
 		}
 
-
 		if (!bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) {
 			switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_BREAK);
 
@@ -787,22 +786,6 @@
 
 		if (bytes < 0) {
 			return (int) bytes;
-		} else if (bytes > 0 && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE)) {
-			int sbytes = (int) bytes;
-			err_status_t stat;
-
-			stat = srtp_unprotect(rtp_session->recv_ctx, &rtp_session->recv_msg.header, &sbytes);
-			if (stat) {
-				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
-								  "error: srtp unprotection failed with code %d%s\n", stat,
-								  stat == err_status_replay_fail ? " (replay check failed)" : stat == err_status_auth_fail ? " (auth check failed)" : "");
-				return -1;
-			}
-			bytes = sbytes;
-		}
-
-		if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) {
-			continue;
 		}
 
 		if (rtp_session->timer.interval) {
@@ -818,24 +801,61 @@
 			}
 		}
 
-
-
 		if (check) {
 			do_2833(rtp_session);
 
 			if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) {
+				uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
 				/* We're late! We're Late! */
 				if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) {
 					switch_yield(1000);
 					continue;
 				}
-				memset(&rtp_session->recv_msg, 0, SWITCH_RTP_CNG_PAYLOAD);
-				rtp_session->recv_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD;
+					
+				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;
-				return SWITCH_RTP_CNG_PAYLOAD + rtp_header_len;
+				*payload_type = rtp_session->recv_msg.header.pt;
+				return 2 + rtp_header_len;
+			}
+		}
+
+		if (bytes && rtp_session->recv_msg.header.version != 2) {
+			uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
+			if (rtp_session->recv_msg.header.version == 0 && rtp_session->ice_user) {
+				handle_ice(rtp_session, (void *) &rtp_session->recv_msg, bytes);
+			}
+
+			if (rtp_session->invalid_handler) {
+				rtp_session->invalid_handler(rtp_session, rtp_session->sock, (void *) &rtp_session->recv_msg, bytes, rtp_session->from_addr);
+			}
+			
+			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 = rtp_session->recv_msg.header.pt;
+			return 2 + rtp_header_len;
+		}
+		
+
+
+
+		if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE)) {
+			int sbytes = (int) bytes;
+			err_status_t stat;
+
+			stat = srtp_unprotect(rtp_session->recv_ctx, &rtp_session->recv_msg.header, &sbytes);
+			if (stat) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
+								  "error: srtp unprotection failed with code %d%s\n", stat,
+								  stat == err_status_replay_fail ? " (replay check failed)" : stat == err_status_auth_fail ? " (auth check failed)" : "");
+				return -1;
 			}
+			bytes = sbytes;
 		}
 
 		if (status == SWITCH_STATUS_BREAK || bytes == 0) {
@@ -846,49 +866,45 @@
 			return 0;
 		}
 
-
-		if (rtp_session->recv_msg.header.version) {
-			if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ)
-				&& switch_sockaddr_get_port(rtp_session->from_addr)) {
-				char *tx_host;
-				char *old_host;
-				char bufa[30], bufb[30];
-				tx_host = switch_get_addr(bufa, sizeof(bufa), rtp_session->from_addr);
-				old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr);
-
-				if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port)
-					|| strcmp(tx_host, old_host)) {
-					const char *err;
-					uint32_t old = rtp_session->remote_port;
-
-					if (!switch_strlen_zero(tx_host) && switch_sockaddr_get_port(rtp_session->from_addr) > 0) {
-						switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
-										  "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host,
-										  switch_sockaddr_get_port(rtp_session->from_addr));
-						switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err);
-					}
+		
+		
+		if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) {
+			
+			char *tx_host;
+			char *old_host;
+			char bufa[30], bufb[30];
+			tx_host = switch_get_addr(bufa, sizeof(bufa), rtp_session->from_addr);
+			old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr);
+
+			if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port)
+				|| strcmp(tx_host, old_host)) {
+				const char *err;
+				uint32_t old = rtp_session->remote_port;
+
+				if (!switch_strlen_zero(tx_host) && switch_sockaddr_get_port(rtp_session->from_addr) > 0) {
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
+									  "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host,
+									  switch_sockaddr_get_port(rtp_session->from_addr));
+					switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err);
 				}
-				switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ);
 			}
+			switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ);
 		}
 
-		if (rtp_session->recv_msg.header.version == 2) {
-			if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) {
-				rtp_session->recv_msg.header.pt = 97;
-			}
-			rtp_session->rseq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
-			rtp_session->rpayload = (switch_payload_t) rtp_session->recv_msg.header.pt;
-		} else {
-			if (rtp_session->recv_msg.header.version == 0 && rtp_session->ice_user) {
-				handle_ice(rtp_session, (void *) &rtp_session->recv_msg, bytes);
-			}
+		if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) {
+			continue;
+		}
 
-			if (rtp_session->invalid_handler) {
-				rtp_session->invalid_handler(rtp_session, rtp_session->sock, (void *) &rtp_session->recv_msg, bytes, rtp_session->from_addr);
-			}
-			return 0;
+
+		
+		if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) {
+			rtp_session->recv_msg.header.pt = 97;
 		}
 
+		rtp_session->rseq = ntohs((uint16_t) rtp_session->recv_msg.header.seq);
+		rtp_session->rpayload = (switch_payload_t) rtp_session->recv_msg.header.pt;
+		
+
 		/* RFC2833 ... TBD try harder to honor the duration etc. */
 		if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PASS_RFC2833)
 			&& rtp_session->recv_msg.header.pt == rtp_session->te) {
@@ -923,9 +939,8 @@
 					rtp_session->dtmf_data.dc = 0;
 				}
 			}
-
+			
 			continue;
-
 		}
 
 		break;
@@ -1182,12 +1197,11 @@
 	}
 
 	if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VAD) &&
-		rtp_session->recv_msg.header.pt == rtp_session->vad_data.read_codec->implementation->ianacode &&
-		((datalen == rtp_session->vad_data.read_codec->implementation->encoded_bytes_per_frame) ||
-		 (datalen > SWITCH_RTP_CNG_PAYLOAD && rtp_session->vad_data.read_codec->implementation->encoded_bytes_per_frame == 0))) {
-		int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)];
-		uint32_t rate;
-		uint32_t flags;
+		rtp_session->recv_msg.header.pt == rtp_session->vad_data.read_codec->implementation->ianacode) {
+		
+		int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)] = {0};
+		uint32_t rate = 0;
+		uint32_t flags = 0;
 		uint32_t len = sizeof(decoded);
 		time_t now = time(NULL);
 		send = 0;
@@ -1205,6 +1219,7 @@
 									 datalen,
 									 rtp_session->vad_data.read_codec->implementation->samples_per_second,
 									 decoded, &len, &rate, &flags) == SWITCH_STATUS_SUCCESS) {
+			
 
 			uint32_t energy = 0;
 			uint32_t x, y = 0, z = len / sizeof(int16_t);
@@ -1215,7 +1230,7 @@
 					energy += abs(decoded[y]);
 					y += rtp_session->vad_data.read_codec->implementation->number_of_channels;
 				}
-
+				
 				if (++rtp_session->vad_data.start_count < rtp_session->vad_data.start) {
 					send = 1;
 				} else {
@@ -1274,35 +1289,23 @@
 
 				if (switch_test_flag(&rtp_session->vad_data, SWITCH_VAD_FLAG_TALKING)) {
 					send = 1;
-				} else {
-					if (switch_test_flag(&rtp_session->vad_data, SWITCH_VAD_FLAG_CNG)
-						&& ++rtp_session->vad_data.cng_count >= rtp_session->vad_data.cng_freq) {
-						rtp_session->send_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD;
-						memset(rtp_session->send_msg.body, 255, SWITCH_RTP_CNG_PAYLOAD);
-						/* rtp_session->send_msg.header.ts = htonl(rtp_session->vad_data.ts);
-						 * rtp_session->vad_data.ts++;
-						 */
-						bytes = SWITCH_RTP_CNG_PAYLOAD;
-						send = 1;
-						rtp_session->vad_data.cng_count = 0;
-					}
-				}
-
+				} 
 			}
 		} else {
 			return SWITCH_STATUS_GENERR;
 		}
 	}
 
-	rtp_session->last_write_ts = ntohl(send_msg->header.ts);
-	rtp_session->last_write_ssrc = ntohl(send_msg->header.ssrc);
-	rtp_session->last_write_seq = rtp_session->seq;
 
-	if (rtp_session->last_write_seq <= rtp_session->dtmf_data.out_digit_seq) {
+	if (rtp_session->last_write_seq >0 && rtp_session->last_write_seq <= rtp_session->dtmf_data.out_digit_seq) {
 		send = 0;
 	}
 
 	if (send) {
+
+		rtp_session->last_write_ts = ntohl(send_msg->header.ts);
+		rtp_session->last_write_ssrc = ntohl(send_msg->header.ssrc);
+		rtp_session->last_write_seq = rtp_session->seq;
 		if (rtp_session->timer.interval) {
 			switch_core_timer_check(&rtp_session->timer);
 			rtp_session->last_write_samplecount = rtp_session->timer.samplecount;
@@ -1360,7 +1363,8 @@
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
 		return SWITCH_STATUS_FALSE;
 	}
-
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Activate VAD codec %s %dms\n", codec->implementation->iananame, 
+					  codec->implementation->microseconds_per_frame / 1000);
 	rtp_session->vad_data.diff_level = 400;
 	rtp_session->vad_data.hangunder = 15;
 	rtp_session->vad_data.hangover = 40;



More information about the Freeswitch-svn mailing list