[Freeswitch-svn] [commit] r7546 - in freeswitch/trunk/src: . include mod/endpoints/mod_sofia

Freeswitch SVN anthm at freeswitch.org
Thu Feb 7 17:42:27 EST 2008


Author: anthm
Date: Thu Feb  7 17:42:27 2008
New Revision: 7546

Modified:
   freeswitch/trunk/src/include/switch.h
   freeswitch/trunk/src/include/switch_channel.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
   freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
   freeswitch/trunk/src/switch_channel.c

Log:
vid stuff

Modified: freeswitch/trunk/src/include/switch.h
==============================================================================
--- freeswitch/trunk/src/include/switch.h	(original)
+++ freeswitch/trunk/src/include/switch.h	Thu Feb  7 17:42:27 2008
@@ -43,7 +43,7 @@
 #define SWITCH_END_EXTERN_C
 #endif
 
-
+#define SWITCH_VIDEO_IN_THREADS
 
 #ifndef WIN32
 #include <switch_am_config.h>

Modified: freeswitch/trunk/src/include/switch_channel.h
==============================================================================
--- freeswitch/trunk/src/include/switch_channel.h	(original)
+++ freeswitch/trunk/src/include/switch_channel.h	Thu Feb  7 17:42:27 2008
@@ -212,6 +212,7 @@
 SWITCH_DECLARE(switch_status_t) switch_channel_set_variable(switch_channel_t *channel, const char *varname, const char *value);
 
 SWITCH_DECLARE(switch_status_t) switch_channel_set_variable_partner(switch_channel_t *channel, const char *varname, const char *value);
+SWITCH_DECLARE(const char *) switch_channel_get_variable_partner(switch_channel_t *channel, const char *varname);
 
 /*!
   \brief Retrieve a variable from a given channel

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	Thu Feb  7 17:42:27 2008
@@ -1745,6 +1745,8 @@
 		switch_ivr_transfer_variable(session, nsession, SOFIA_REPLACES_HEADER);
 		switch_ivr_transfer_variable(session, nsession, "sip_auto_answer");
 		switch_ivr_transfer_variable(session, nsession, SOFIA_SIP_HEADER_PREFIX_T);
+		switch_ivr_transfer_variable(session, nsession, "sip_video_fmtp");
+
 		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

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	Thu Feb  7 17:42:27 2008
@@ -46,6 +46,7 @@
 	uint32_t v_port;
 	int use_cng = 1;
 	const char *val;
+	const char *pass_fmtp = switch_channel_get_variable(tech_pvt->channel, "sip_video_fmtp");
 
 	if (sofia_test_pflag(tech_pvt->profile, PFLAG_SUPRESS_CNG) || 
 		((val = switch_channel_get_variable(tech_pvt->channel, "supress_cng")) && switch_true(val))) {
@@ -219,15 +220,15 @@
 		
 	}
 
-	if (switch_test_flag(tech_pvt, TFLAG_VIDEO) && tech_pvt->video_rm_encoding) {
+	if (switch_test_flag(tech_pvt, TFLAG_VIDEO)) {							
 		sofia_glue_tech_choose_video_port(tech_pvt);
+
 		if ((v_port = tech_pvt->adv_sdp_video_port)) {
 			switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "m=video %d RTP/AVP", v_port);
 			
-			sofia_glue_tech_set_video_codec(tech_pvt, 0);	
-
 			/*****************************/
 			if (tech_pvt->video_rm_encoding) {
+				sofia_glue_tech_set_video_codec(tech_pvt, 0);
 				switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %d", tech_pvt->video_pt);
 			} else if (tech_pvt->num_codecs) {
 				int i;
@@ -255,15 +256,30 @@
 
 			switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "\n");
 
-			if (tech_pvt->rm_encoding) {
+			if (tech_pvt->video_rm_encoding) {
+				const char *of;
 				rate = tech_pvt->video_rm_rate;
 				switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=rtpmap:%d %s/%ld\n", tech_pvt->video_pt, tech_pvt->video_rm_encoding, tech_pvt->video_rm_rate);
-				if (tech_pvt->video_fmtp_out) {
-					switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=fmtp:%d %s\n", tech_pvt->video_pt, tech_pvt->video_fmtp_out);
+				
+				
+				if (switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) {
+					if ((of = switch_channel_get_variable_partner(tech_pvt->channel, "sip_video_fmtp"))) {
+						pass_fmtp = of;
+					}
+				} 
+				
+				if (!pass_fmtp) {
+					pass_fmtp = tech_pvt->video_fmtp_out;
 				}
+
+				if (pass_fmtp) {
+					switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=fmtp:%d %s\n", tech_pvt->video_pt, pass_fmtp);
+				}
+				
 			} else if (tech_pvt->num_codecs) {
 				int i;
 				int already_did[128] = { 0 };
+
 				for (i = 0; i < tech_pvt->num_codecs; i++) {
 					const switch_codec_implementation_t *imp = tech_pvt->codecs[i];
 				
@@ -285,6 +301,10 @@
 					switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=rtpmap:%d %s/%d\n", imp->ianacode, imp->iananame, imp->samples_per_second);
 					if (imp->fmtp) {
 						switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=fmtp:%d %s\n", imp->ianacode, imp->fmtp);
+					} else {
+						if (pass_fmtp) {
+							switch_snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=fmtp:%d %s\n", imp->ianacode, pass_fmtp);
+						}
 					}
 				}
 			}
@@ -1042,7 +1062,8 @@
 							  switch_channel_get_name(tech_pvt->channel), tech_pvt->video_rm_encoding, tech_pvt->video_rm_rate, tech_pvt->video_codec_ms);
 			tech_pvt->video_read_frame.codec = &tech_pvt->video_read_codec;
 			
-			tech_pvt->fmtp_out = switch_core_session_strdup(tech_pvt->session, tech_pvt->video_write_codec.fmtp_out);
+			tech_pvt->video_fmtp_out = switch_core_session_strdup(tech_pvt->session, tech_pvt->video_write_codec.fmtp_out);
+
 		}
 	}
 	return SWITCH_STATUS_SUCCESS;
@@ -1878,6 +1899,7 @@
 						switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->remote_sdp_video_port);
 						switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_VIDEO_IP_VARIABLE, tech_pvt->remote_sdp_audio_ip);
 						switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_VIDEO_PORT_VARIABLE, tmp);
+						switch_channel_set_variable(tech_pvt->channel, "sip_video_fmtp", tech_pvt->video_rm_fmtp);
                         break;
 					} else {
 						vmatch = 0;

Modified: freeswitch/trunk/src/switch_channel.c
==============================================================================
--- freeswitch/trunk/src/switch_channel.c	(original)
+++ freeswitch/trunk/src/switch_channel.c	Thu Feb  7 17:42:27 2008
@@ -416,6 +416,31 @@
 	return v;
 }
 
+SWITCH_DECLARE(const char *) switch_channel_get_variable_partner(switch_channel_t *channel, const char *varname)
+{
+	const char *uuid;
+	const char *val = NULL;
+	switch_assert(channel != NULL);
+
+	if (!switch_strlen_zero(varname)) {
+		if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
+			switch_core_session_t *session;
+			switch_mutex_lock(channel->profile_mutex);
+			if ((session = switch_core_session_locate(uuid))) {
+				switch_channel_t *tchannel = switch_core_session_get_channel(session);
+				switch_mutex_lock(tchannel->profile_mutex);
+				val = switch_channel_get_variable(tchannel, varname);
+				switch_mutex_unlock(tchannel->profile_mutex);
+				switch_core_session_rwunlock(session);
+			}
+			switch_mutex_unlock(channel->profile_mutex);
+		}
+	}
+
+	return val;
+}
+
+
 SWITCH_DECLARE(void) switch_channel_variable_last(switch_channel_t *channel)
 {
 	switch_assert(channel != NULL);



More information about the Freeswitch-svn mailing list