[svn-commits] branch oej/sdpcleanup r27330 - in /team/oej/sdpcleanup: ./ channels/chan_sip.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue May 16 06:05:01 MST 2006


Author: oej
Date: Tue May 16 08:05:00 2006
New Revision: 27330

URL: http://svn.digium.com/view/asterisk?rev=27330&view=rev
Log:
Update

Modified:
    team/oej/sdpcleanup/   (props changed)
    team/oej/sdpcleanup/channels/chan_sip.c

Propchange: team/oej/sdpcleanup/
------------------------------------------------------------------------------
    automerge = http://edvina.net/training/

Modified: team/oej/sdpcleanup/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/oej/sdpcleanup/channels/chan_sip.c?rev=27330&r1=27329&r2=27330&view=diff
==============================================================================
--- team/oej/sdpcleanup/channels/chan_sip.c (original)
+++ team/oej/sdpcleanup/channels/chan_sip.c Tue May 16 08:05:00 2006
@@ -3875,12 +3875,11 @@
 	int destiterator = 0;
 	int iterator;
 	int sendonly = 0;
-	int x;
 	int numberofports;
 	int debug=sip_debug_test_pvt(p);
 	struct ast_channel *bridgepeer = NULL;
-	struct ast_rtp newaudiortp, newvideortp;
-	int newjointcapability;
+	struct ast_rtp newaudiortp, newvideortp;	/* Buffers for codec handling */
+	int newjointcapability;				/* Negotiated capability */
 	int newpeercapability;
 	int newnoncodeccapability;
 	int numberofmediastreams = 0;
@@ -3891,6 +3890,8 @@
 	}
 
 	/* Initialize the temporary RTP structures we use to evaluate the offer from the peer */
+	memset(&newaudiortp, 0, sizeof(newaudiortp));
+	memset(&newvideortp, 0, sizeof(newvideortp));
 	ast_rtp_pt_default(&newaudiortp);
 	ast_rtp_pt_default(&newvideortp);
 
@@ -3933,6 +3934,7 @@
 
 	/* Find media streams in this SDP offer */
 	while ((m = get_sdp_iterate(&iterator, req, "m"))[0] != '\0') {
+		int x;
 		int audio = FALSE;
 		numberofmediastreams++;
 
@@ -3967,28 +3969,27 @@
 					return -1;
 				}
 				if (debug)
-						ast_verbose("Found RTP video format %d\n", codec);
-					ast_rtp_set_m_type(&newvideortp, codec);
-				}
-			} else 
-				ast_log(LOG_WARNING, "Unsupported SDP media type in offer: %s\n", m);
-			if (numberofports > 1)
-				ast_log(LOG_WARNING, "SDP offered %d ports for media, not supported by Asterisk. Will try anyway...\n", numberofports);
+					ast_verbose("Found RTP video format %d\n", codec);
+				ast_rtp_set_m_type(&newvideortp, codec);
+			}
+		} else 
+			ast_log(LOG_WARNING, "Unsupported SDP media type in offer: %s\n", m);
+		if (numberofports > 1)
+			ast_log(LOG_WARNING, "SDP offered %d ports for media, not supported by Asterisk. Will try anyway...\n", numberofports);
 		
 
-			/* Check for Media-description-level-address for audio */
-			if (pedanticsipchecking) {
-				c = get_sdp_iterate(&destiterator, req, "c");
-				if (!ast_strlen_zero(c)) {
-					if (sscanf(c, "IN IP4 %256s", host) != 1) {
-						ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
-				} else {
-					/* XXX This could block for a long time, and block the main thread! XXX */
-					if (!audio && !(hp = ast_gethostbyname(host, &audiohp)))
+		/* Check for Media-description-level-address for audio */
+		c = get_sdp_iterate(&destiterator, req, "c");
+		if (!ast_strlen_zero(c)) {
+			if (sscanf(c, "IN IP4 %256s", host) != 1) {
+				ast_log(LOG_WARNING, "Invalid secondary host in c= line, '%s'\n", c);
+			} else {
+				/* XXX This could block for a long time, and block the main thread! XXX */
+				if (audio) {
+					if ( !(hp = ast_gethostbyname(host, &audiohp)))
 						ast_log(LOG_WARNING, "Unable to lookup RTP Audio host in secondary c= line, '%s'\n", c);
-					else if (!(vhp = ast_gethostbyname(host, &videohp)))
-						ast_log(LOG_WARNING, "Unable to lookup RTP video host in secondary c= line, '%s'\n", c);
-				}
+				} else if (!(vhp = ast_gethostbyname(host, &videohp)))
+					ast_log(LOG_WARNING, "Unable to lookup RTP video host in secondary c= line, '%s'\n", c);
 			}
 
 		}
@@ -4041,6 +4042,11 @@
 			if (debug)
 				ast_verbose("Got unsupported a:fmtp in SDP offer \n");
 			continue;
+		} else if (!strncasecmp(a, "framerate:", (size_t) 10)) {
+			/* Video stuff:  Not supported */
+			if (debug)
+				ast_verbose("Got unsupported a:framerate in SDP offer \n");
+			continue;
 		} else if (!strncasecmp(a, "maxprate:", (size_t) 9)) {
 			/* Video stuff:  Not supported */
 			if (debug)
@@ -4088,42 +4094,38 @@
 		
 	if (debug) {
 		/* shame on whoever coded this.... */
-		const unsigned slen=512;
-		char s1[slen], s2[slen], s3[slen], s4[slen];
+		char s1[BUFSIZ], s2[BUFSIZ], s3[BUFSIZ], s4[BUFSIZ];
 
 		ast_verbose("Capabilities: us - %s, peer - audio=%s/video=%s, combined - %s\n",
-			ast_getformatname_multiple(s1, slen, p->capability),
-			ast_getformatname_multiple(s2, slen, newpeercapability),
-			ast_getformatname_multiple(s3, slen, vpeercapability),
-			ast_getformatname_multiple(s4, slen, newjointcapability));
-
-		ast_verbose("Non-codec capabilities: us - %s, peer - %s, combined - %s\n",
-			ast_rtp_lookup_mime_multiple(s1, slen, noncodeccapability, 0),
-			ast_rtp_lookup_mime_multiple(s2, slen, peernoncodeccapability, 0),
-			ast_rtp_lookup_mime_multiple(s3, slen, newnoncodeccapability, 0));
+			ast_getformatname_multiple(s1, BUFSIZ, p->capability),
+			ast_getformatname_multiple(s2, BUFSIZ, newpeercapability),
+			ast_getformatname_multiple(s3, BUFSIZ, vpeercapability),
+			ast_getformatname_multiple(s4, BUFSIZ, newjointcapability));
+
+		ast_verbose("Non-codec capabilities (dtmf): us - %s, peer - %s, combined - %s\n",
+			ast_rtp_lookup_mime_multiple(s1, BUFSIZ, noncodeccapability, 0),
+			ast_rtp_lookup_mime_multiple(s2, BUFSIZ, peernoncodeccapability, 0),
+			ast_rtp_lookup_mime_multiple(s3, BUFSIZ, newnoncodeccapability, 0));
 	}
 	if (!newjointcapability) {
-		ast_log(LOG_NOTICE, "No compatible codecs!\n");
+		ast_log(LOG_NOTICE, "No compatible codecs, not accepting this offer!\n");
 		/* Do NOT Change current setting */
 		return -1;
 	}
 
 	/* We are now ready to change the sip session and p->rtp and p->vrtp with the offered codecs, since
 		they are acceptable */
-	p->jointcapability = newjointcapability;
-	p->peercapability = newpeercapability;
-	p->noncodeccapability = newnoncodeccapability;
-		
+	p->jointcapability = newjointcapability;	/* Our joint codec profile for this call */
+	p->peercapability = newpeercapability;		/* The other sides capability in latest offer */
+	p->noncodeccapability = newnoncodeccapability;	/* DTMF capabilities */
+
 	{
 		int i;
 		/* Copy payload types from source to destination */
 		for (i=0; i < MAX_RTP_PT; ++i) {
-			p->rtp->current_RTP_PT[i].isAstFormat = newaudiortp.current_RTP_PT[i].isAstFormat;
-			p->rtp->current_RTP_PT[i].code = newaudiortp.current_RTP_PT[i].code; 
-			if (p->vrtp) {
-				p->vrtp->current_RTP_PT[i].isAstFormat = newvideortp.current_RTP_PT[i].isAstFormat;
-				p->vrtp->current_RTP_PT[i].code = newvideortp.current_RTP_PT[i].code; 
-			}
+			p->rtp->current_RTP_PT[i]= newaudiortp.current_RTP_PT[i];
+			if (p->vrtp) 
+				p->vrtp->current_RTP_PT[i]= newvideortp.current_RTP_PT[i];
 		}
 	}
 
@@ -4142,7 +4144,7 @@
 	}
 
 	/* Ok, we're going with this offer */
-	if (option_debug) {
+	if (option_debug > 1) {
 		char buf[BUFSIZ];
 		ast_log(LOG_DEBUG, "We're settling with these formats: %s\n", ast_getformatname_multiple(buf, BUFSIZ, p->capability));
 	}
@@ -4152,12 +4154,12 @@
 
 
 	if (!(p->owner->nativeformats & p->jointcapability & AST_FORMAT_AUDIO_MASK)) {
-		const unsigned slen=512;
-		char s1[slen], s2[slen];
-		if (debug)
-			ast_log(LOG_DEBUG, "Oooh, we need to change our formats since our peer supports only %s and not %s\n", 
-				ast_getformatname_multiple(s1, slen, p->jointcapability),
-				ast_getformatname_multiple(s2, slen, p->owner->nativeformats));
+		if (debug) {
+			char s1[BUFSIZ], s2[BUFSIZ];
+			ast_log(LOG_DEBUG, "Oooh, we need to change our audio formats since our peer supports only %s and not %s\n", 
+				ast_getformatname_multiple(s1, BUFSIZ, p->jointcapability),
+				ast_getformatname_multiple(s2, BUFSIZ, p->owner->nativeformats));
+		}
 		p->owner->nativeformats = ast_codec_choose(&p->prefs, p->jointcapability, 1) | (p->capability & vpeercapability);
 		ast_set_read_format(p->owner, p->owner->readformat);
 		ast_set_write_format(p->owner, p->owner->writeformat);
@@ -4867,7 +4869,8 @@
 	char o[256];
 	char c[256];
 	char t[256];
-	char b[256];
+	char b[256] = "";
+	char hold[256] = "";
 	char m_audio[256];
 	char m_video[256];
 	char a_audio[1024];
@@ -4917,7 +4920,7 @@
 		dest.sin_port = sin.sin_port;
 	}
 
-	if(capability & AST_FORMAT_VIDEO_MASK) {
+	if((capability & AST_FORMAT_VIDEO_MASK) && ast_test_flag(&p->flags[0], SIP_NOVIDEO))) {
 		if (p->vrtp) {
 			needvideo = TRUE;
 			if (option_debug)
@@ -4927,8 +4930,8 @@
 	}
 		
 
-	/* Determine video destination */
 	if (needvideo) {
+		/* Determine video destination */
 		if (p->vredirip.sin_addr.s_addr) {
 			vdest.sin_port = p->vredirip.sin_port;
 			vdest.sin_addr = p->vredirip.sin_addr;
@@ -4936,12 +4939,13 @@
 			vdest.sin_addr = p->ourip;
 			vdest.sin_port = vsin.sin_port;
 		}
-	}
-	if (debug) {
-		ast_verbose("We're at %s port %d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ntohs(sin.sin_port));	
-		if (needvideo)
+		/* Build max bitrate string */
+		snprintf(b, sizeof(b), "b=CT:%d\r\n", p->maxcallbitrate);
+		if (debug) 
 			ast_verbose("Video is at %s port %d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ntohs(vsin.sin_port));	
 	}
+	if (debug) 
+		ast_verbose("Audio is at %s port %d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), p->ourip), ntohs(sin.sin_port));	
 
 	/* We break with the "recommendation" and send our IP, in order that our
 	   peer doesn't have to ast_gethostbyname() us */
@@ -4950,10 +4954,7 @@
 	snprintf(o, sizeof(o), "o=root %d %d IN IP4 %s\r\n", p->sessionid, p->sessionversion, ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
 	snprintf(s, sizeof(s), "s=session\r\n");
 	snprintf(c, sizeof(c), "c=IN IP4 %s\r\n", ast_inet_ntoa(iabuf, sizeof(iabuf), dest.sin_addr));
-	if ((p->vrtp) &&
-	    (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
-	    (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
-		snprintf(b, sizeof(b), "b=CT:%d\r\n", p->maxcallbitrate);
+	if (needvideo)
 	snprintf(t, sizeof(t), "t=0 0\r\n");
 
 	ast_build_string(&m_audio_next, &m_audio_left, "m=audio %d RTP/AVP", ntohs(dest.sin_port));
@@ -5000,12 +5001,12 @@
 
 	/* Now send any other common codecs, and non-codec formats: */
 	for (x = 1;
-	     x <= ((ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && p->vrtp) ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO);
+	     x <= needvideo ? AST_FORMAT_MAX_VIDEO : AST_FORMAT_MAX_AUDIO;
 	     x <<= 1) {
-		if (!(capability & x))
+		if (!(capability & x))	/* Codec not requested */
 			continue;
 
-		if (alreadysent & x)
+		if (alreadysent & x)	/* Already added to SDP */
 			continue;
 
 		if (x <= AST_FORMAT_MAX_AUDIO)
@@ -5039,11 +5040,14 @@
 	ast_build_string(&m_audio_next, &m_audio_left, "\r\n");
 	ast_build_string(&m_video_next, &m_video_left, "\r\n");
 
-	len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m_audio) + strlen(a_audio);
-	if ((p->vrtp) &&
-	    (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
-	    (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
-		len += strlen(m_video) + strlen(a_video) + strlen(b);
+	if (ast_test_flag(&p->flags[0], SIP_CALL_ONHOLD))
+		sprintf(hold, "a=recvonly");
+	else
+		sprintf(hold, "a=sendrecv");
+
+	len = strlen(v) + strlen(s) + strlen(o) + strlen(c) + strlen(t) + strlen(m_audio) + strlen(a_audio) + strlen(hold);
+	if (needvideo) /* only if video response is appropriate */
+		len += strlen(m_video) + strlen(a_video) + strlen(b) + strlen(hold);
 
 	add_header(resp, "Content-Type", "application/sdp");
 	add_header_contentLength(resp, len);
@@ -5051,18 +5055,16 @@
 	add_line(resp, o);
 	add_line(resp, s);
 	add_line(resp, c);
-	if ((needvideo) &&
-	    (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
-	    (capability & VIDEO_CODEC_MASK)) /* only if video response is appropriate */
+	if (needvideo) 	/* only if video response is appropriate */
 		add_line(resp, b);
 	add_line(resp, t);
 	add_line(resp, m_audio);
 	add_line(resp, a_audio);
-	if ((p->vrtp) &&
-	    (!ast_test_flag(&p->flags[0], SIP_NOVIDEO)) &&
-	    (capability & VIDEO_CODEC_MASK)) { /* only if video response is appropriate */
+	add_line(resp, hold);
+	if (needvideo) { /* only if video response is appropriate */
 		add_line(resp, m_video);
 		add_line(resp, a_video);
+		add_line(resp, hold);
 	}
 
 	/* Update lastrtprx when we send our SDP */
@@ -10068,14 +10070,14 @@
 	}
 }
 
-/*! \brief Handle SIP response in dialogue */
+/*! \brief Handle SIP response to INVITE dialogue */
 static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, struct sip_request *req, int seqno)
 {
 	int outgoing = ast_test_flag(&p->flags[0], SIP_OUTGOING);
 	int res = 0;
+	int reinvite = (p->owner && p->owner->_state == AST_STATE_UP);
 	
 	if (option_debug > 3) {
-		int reinvite = (p->owner && p->owner->_state == AST_STATE_UP);
 		if (reinvite)
 			ast_log(LOG_DEBUG, "SIP response %d to RE-invite on %s call %s\n", resp, outgoing ? "outgoing" : "incoming", p->callid);
 		else
@@ -10133,8 +10135,10 @@
 		p->authtries = 0;
 		if (!strcasecmp(get_header(req, "Content-Type"), "application/sdp")) {
 			if ((res = process_sdp(p, req)) && !ast_test_flag(req, SIP_PKT_IGNORE))
-				/* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
-				ast_set_flag(&p->flags[0], SIP_PENDINGBYE);	
+				if (!reinvite)
+					/* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
+					/* For re-invites, we try to recover */
+					ast_set_flag(&p->flags[0], SIP_PENDINGBYE);	
 		}
 
 		/* Parse contact header for continued conversation */
@@ -10159,7 +10163,7 @@
 		}
 		
 		if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
-			if (p->owner->_state != AST_STATE_UP) {
+			if (!reinvite)
 				ast_queue_control(p->owner, AST_CONTROL_ANSWER);
 			} else {	/* RE-invite */
 				ast_queue_frame(p->owner, &ast_null_frame);
@@ -13851,11 +13855,13 @@
 		changed = 1;
 	}
 	if (changed && !ast_test_flag(&p->flags[0], SIP_GOTREFER)) {
-		if (chan->_state != AST_STATE_UP) {
+		if (chan->_state != AST_STATE_UP) {	/* We are in early state */
 			char iabuf[INET_ADDRSTRLEN];
+			if (recordhistory)
+				append_history(p, "ExtInv", "Initial invite sent with remote bridge proposal.");
 			if (option_debug)
 				ast_log(LOG_DEBUG, "Early remote bridge setting SIP '%s' - Sending media to %s\n", p->callid, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp ? p->redirip.sin_addr : p->ourip));
-		} else if (!p->pendinginvite) {
+		} else if (!p->pendinginvite) {		/* We are up, and have no outstanding invite */
 			if (option_debug > 2) {
 				char iabuf[INET_ADDRSTRLEN];
 				ast_log(LOG_DEBUG, "Sending reinvite on SIP '%s' - It's audio soon redirected to IP %s\n", p->callid, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp ? p->redirip.sin_addr : p->ourip));
@@ -13866,6 +13872,7 @@
 				char iabuf[INET_ADDRSTRLEN];
 				ast_log(LOG_DEBUG, "Deferring reinvite on SIP '%s' - It's audio will be redirected to IP %s\n", p->callid, ast_inet_ntoa(iabuf, sizeof(iabuf), rtp ? p->redirip.sin_addr : p->ourip));
 			}
+			/* We have a pending Invite. Send re-invite when we're done with the invite */
 			ast_set_flag(&p->flags[0], SIP_NEEDREINVITE);	
 		}
 	}



More information about the svn-commits mailing list