[svn-commits] mmichelson: branch mmichelson/correct_sdp_answer r206640 - /team/mmichelson/c...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Jul 15 11:06:52 CDT 2009


Author: mmichelson
Date: Wed Jul 15 11:06:49 2009
New Revision: 206640

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=206640
Log:
Expand the offered_media to also keep track of codecs offered. This way
our parroted m= lines are correct.

"endoplasmic reticulum"


Modified:
    team/mmichelson/correct_sdp_answer/channels/chan_sip.c

Modified: team/mmichelson/correct_sdp_answer/channels/chan_sip.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/mmichelson/correct_sdp_answer/channels/chan_sip.c?view=diff&rev=206640&r1=206639&r2=206640
==============================================================================
--- team/mmichelson/correct_sdp_answer/channels/chan_sip.c (original)
+++ team/mmichelson/correct_sdp_answer/channels/chan_sip.c Wed Jul 15 11:06:49 2009
@@ -910,6 +910,10 @@
 	enum referstatus status;			/*!< REFER status */
 };
 
+struct offered_media {
+	int offered;
+	char text[128];
+};
 /*! \brief sip_pvt: PVT structures are used for each SIP dialog, ie. a call, a registration, a subscribe  */
 static struct sip_pvt {
 	ast_mutex_t lock;			/*!< Dialog private lock */
@@ -1040,14 +1044,14 @@
 	 * The reason for the length being 3 is that in this branch of Asterisk, the only media types supported are 
 	 * image, audio, and video. Therefore we need to keep track of which types of media were offered.
 	 *
-	 * Note that if we wanted to be 100% correct, we would keep a list of all media types offered. That way we could respond
+	 * Note that if we wanted to be 100% correct, we would keep a list of all media streams offered. That way we could respond
 	 * even to unknown media types, and we could respond to multiple streams of the same type. Such large-scale changes
 	 * are not a good idea for released branches, though, so we're compromising by just making sure that for the common cases:
 	 * audio and video, and audio and T.38, we give the appropriate response to both media streams.
 	 *
 	 * The large-scale changes would be a good idea for implementing during an SDP rewrite.
 	 */
-	int offered_media[3];
+	struct offered_media offered_media[3];
 } *iflist = NULL;
 
 /*! Max entires in the history list for a sip_pvt */
@@ -5165,6 +5169,12 @@
 	SDP_IMAGE,
 };
 
+static inline void init_offered_media(struct offered_media offered_media[], enum media_type index)
+{
+	offered_media[index].offered = 1;
+	*(offered_media[index].text) = '\0';
+}
+
 static int get_ip_and_port_from_sdp(struct sip_request *req, const enum media_type media, struct sockaddr_in *sin)
 {
 	const char *m;
@@ -5333,12 +5343,14 @@
 		if ((sscanf(m, "audio %d/%d RTP/AVP %n", &x, &numberofports, &len) == 2 && len > 0) ||
 		    (sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1 && len > 0)) {
 			audio = TRUE;
-			p->offered_media[SDP_AUDIO] = 1;
+			init_offered_media(p->offered_media, SDP_AUDIO);
 			numberofmediastreams++;
 			/* Found audio stream in this media definition */
 			portno = x;
 			/* Scan through the RTP payload types specified in a "m=" line: */
-			for (codecs = m + len; !ast_strlen_zero(codecs); codecs = ast_skip_blanks(codecs + len)) {
+			codecs = m + len;
+			ast_copy_string(p->offered_media[SDP_AUDIO].text, codecs, sizeof(p->offered_media[SDP_AUDIO].text));
+			for (; !ast_strlen_zero(codecs); codecs = ast_skip_blanks(codecs + len)) {
 				if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
 					ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
 					return -1;
@@ -5356,10 +5368,12 @@
 		    (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1 && len >= 0)) {
 			/* If it is not audio - is it video ? */
 			ast_clear_flag(&p->flags[0], SIP_NOVIDEO);
-			p->offered_media[SDP_VIDEO] = 1;
+			init_offered_media(p->offered_media, SDP_VIDEO);
 			numberofmediastreams++;
 			vportno = x;
 			/* Scan through the RTP payload types specified in a "m=" line: */
+			codecs = m + len;
+			ast_copy_string(p->offered_media[SDP_VIDEO].text, codecs, sizeof(p->offered_media[SDP_VIDEO].text));
 			for (codecs = m + len; !ast_strlen_zero(codecs); codecs = ast_skip_blanks(codecs + len)) {
 				if (sscanf(codecs, "%d%n", &codec, &len) != 1) {
 					ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs);
@@ -5373,7 +5387,7 @@
 		 (sscanf(m, "image %d UDPTL t38%n", &x, &len) == 1 && len >= 0) )) {
 			if (debug)
 				ast_verbose("Got T.38 offer in SDP in dialog %s\n", p->callid);
-			p->offered_media[SDP_IMAGE] = 1;
+			init_offered_media(p->offered_media, SDP_IMAGE);
 			udptlportno = x;
 			numberofmediastreams++;
 			
@@ -6981,22 +6995,26 @@
 		add_line(resp, m_audio);
 		add_line(resp, a_audio);
 		add_line(resp, hold);
-	} else if (p->offered_media[SDP_AUDIO]) {
-		add_line(resp, "m=audio 0 RTP/AVP\r\n");
+	} else if (p->offered_media[SDP_AUDIO].offered) {
+		char dummy_audio[256];
+		snprintf(dummy_audio, sizeof(dummy_audio), "m=audio 0 RTP/AVP %s\r\n", p->offered_media[SDP_AUDIO].text);
+		add_line(resp, dummy_audio);
 		add_line(resp, "a=inactive\r\n");
 	}
 	if (needvideo) { /* only if video response is appropriate */
 		add_line(resp, m_video);
 		add_line(resp, a_video);
 		add_line(resp, hold);	/* Repeat hold for the video stream */
-	} else if (p->offered_media[SDP_VIDEO]) {
-		add_line(resp, "m=video 0 RTP/AVP\r\n");
+	} else if (p->offered_media[SDP_VIDEO].offered) {
+		char dummy_video[256];
+		snprintf(dummy_video, sizeof(dummy_video), "m=video 0 RTP/AVP %s\r\n", p->offered_media[SDP_VIDEO].text);
+		add_line(resp, dummy_video);
 		add_line(resp, "a=inactive\r\n");
 	}
 	if (add_t38) {
 		add_line(resp, m_modem);
 		add_line(resp, a_modem);
-	} else if (p->offered_media[SDP_IMAGE]) {
+	} else if (p->offered_media[SDP_IMAGE].offered) {
 		add_line(resp, "m=image 0 udptl t38\r\n");
 		add_line(resp, "a=inactive\r\n");
 	}




More information about the svn-commits mailing list