[Asterisk-cvs] asterisk rtp.c,1.66,1.67

markster at lists.digium.com markster at lists.digium.com
Thu May 27 00:04:11 CDT 2004


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv31689

Modified Files:
	rtp.c 
Log Message:
Make RTP handle codecs (first pass)


Index: rtp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/rtp.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- rtp.c	15 May 2004 16:26:52 -0000	1.66
+++ rtp.c	27 May 2004 04:18:45 -0000	1.67
@@ -1257,6 +1257,8 @@
 	
 	void *pvt0, *pvt1;
 	int to;
+	int codec0,codec1, oldcodec0, oldcodec1;
+	
 	memset(&vt0, 0, sizeof(vt0));
 	memset(&vt1, 0, sizeof(vt1));
 	memset(&vac0, 0, sizeof(vac0));
@@ -1307,10 +1309,15 @@
 		ast_mutex_unlock(&c1->lock);
 		return -2;
 	}
-	if (pr0->get_codec && pr1->get_codec) {
-		int codec0,codec1;
+	if (pr0->get_codec)
 		codec0 = pr0->get_codec(c0);
+	else
+		codec0 = 0;
+	if (pr1->get_codec)
 		codec1 = pr1->get_codec(c1);
+	else
+		codec1 = 0;
+	if (pr0->get_codec && pr1->get_codec) {
 		/* Hey, we can't do reinvite if both parties speak diffrent codecs */
 		if (!(codec0 & codec1)) {
 			ast_log(LOG_WARNING, "codec0 = %d is not codec1 = %d, cannot native bridge.\n",codec0,codec1);
@@ -1319,7 +1326,7 @@
 			return -2;
 		}
 	}
-	if (pr0->set_rtp_peer(c0, p1, vp1)) 
+	if (pr0->set_rtp_peer(c0, p1, vp1, codec1)) 
 		ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
 	else {
 		/* Store RTP peer */
@@ -1327,7 +1334,7 @@
 		if (vp1)
 			ast_rtp_get_peer(p1, &vac1);
 	}
-	if (pr1->set_rtp_peer(c1, p0, vp0))
+	if (pr1->set_rtp_peer(c1, p0, vp0, codec0))
 		ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
 	else {
 		/* Store RTP peer */
@@ -1340,17 +1347,19 @@
 	cs[0] = c0;
 	cs[1] = c1;
 	cs[2] = NULL;
+	oldcodec0 = codec0;
+	oldcodec1 = codec1;
 	for (;;) {
 		if ((c0->pvt->pvt != pvt0)  ||
 			(c1->pvt->pvt != pvt1) ||
 			(c0->masq || c0->masqr || c1->masq || c1->masqr)) {
 				ast_log(LOG_DEBUG, "Oooh, something is weird, backing out\n");
 				if (c0->pvt->pvt == pvt0) {
-					if (pr0->set_rtp_peer(c0, NULL, NULL)) 
+					if (pr0->set_rtp_peer(c0, NULL, NULL, 0)) 
 						ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
 				}
 				if (c1->pvt->pvt == pvt1) {
-					if (pr1->set_rtp_peer(c1, NULL, NULL)) 
+					if (pr1->set_rtp_peer(c1, NULL, NULL, 0)) 
 						ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
 				}
 				/* Tell it to try again later */
@@ -1359,23 +1368,29 @@
 		to = -1;
 		ast_rtp_get_peer(p1, &t1);
 		ast_rtp_get_peer(p0, &t0);
+		if (pr0->get_codec)
+			codec0 = pr0->get_codec(c0);
+		if (pr1->get_codec)
+			codec1 = pr1->get_codec(c1);
 		if (vp1)
 			ast_rtp_get_peer(vp1, &vt1);
 		if (vp0)
 			ast_rtp_get_peer(vp0, &vt0);
-		if (inaddrcmp(&t1, &ac1) || (vp1 && inaddrcmp(&vt1, &vac1))) {
-			ast_log(LOG_DEBUG, "Oooh, '%s' changed end address\n", c1->name);
-			if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL)) 
+		if (inaddrcmp(&t1, &ac1) || (vp1 && inaddrcmp(&vt1, &vac1)) || (codec1 != oldcodec1)) {
+			ast_log(LOG_DEBUG, "Oooh, '%s' changed end address (format %d)\n", c1->name, codec1);
+			if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, codec1)) 
 				ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name);
 			memcpy(&ac1, &t1, sizeof(ac1));
 			memcpy(&vac1, &vt1, sizeof(vac1));
+			oldcodec1 = codec1;
 		}
 		if (inaddrcmp(&t0, &ac0) || (vp0 && inaddrcmp(&vt0, &vac0))) {
-			ast_log(LOG_DEBUG, "Oooh, '%s' changed end address\n", c0->name);
-			if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL))
+			ast_log(LOG_DEBUG, "Oooh, '%s' changed end address (format %d)\n", c0->name, codec0);
+			if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, codec0))
 				ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name);
 			memcpy(&ac0, &t0, sizeof(ac0));
 			memcpy(&vac0, &vt0, sizeof(vac0));
+			oldcodec0 = codec0;
 		}
 		who = ast_waitfor_n(cs, 2, &to);
 		if (!who) {
@@ -1393,11 +1408,11 @@
 			*rc = who;
 			ast_log(LOG_DEBUG, "Oooh, got a %s\n", f ? "digit" : "hangup");
 			if ((c0->pvt->pvt == pvt0) && (!c0->_softhangup)) {
-				if (pr0->set_rtp_peer(c0, NULL, NULL)) 
+				if (pr0->set_rtp_peer(c0, NULL, NULL, 0)) 
 					ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
 			}
 			if ((c1->pvt->pvt == pvt1) && (!c1->_softhangup)) {
-				if (pr1->set_rtp_peer(c1, NULL, NULL)) 
+				if (pr1->set_rtp_peer(c1, NULL, NULL, 0)) 
 					ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
 			}
 			/* That's all we needed */




More information about the svn-commits mailing list