[svn-commits] dvossel: branch dvossel/fixtheworld_phase1_step3 r303281 - /team/dvossel/fixt...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Jan 21 12:03:36 CST 2011


Author: dvossel
Date: Fri Jan 21 12:03:32 2011
New Revision: 303281

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=303281
Log:
performace improvement to chan_sip format negotation.

Modified:
    team/dvossel/fixtheworld_phase1_step3/channels/chan_sip.c

Modified: team/dvossel/fixtheworld_phase1_step3/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step3/channels/chan_sip.c?view=diff&rev=303281&r1=303280&r2=303281
==============================================================================
--- team/dvossel/fixtheworld_phase1_step3/channels/chan_sip.c (original)
+++ team/dvossel/fixtheworld_phase1_step3/channels/chan_sip.c Fri Jan 21 12:03:32 2011
@@ -6548,17 +6548,12 @@
 	struct ast_channel *tmp;
 	struct ast_variable *v = NULL;
 	struct ast_format fmt;
-	struct ast_format_cap *what = ast_format_cap_alloc_nolock();
-	struct ast_format_cap *video = NULL;
-	struct ast_format_cap *text = NULL;
+	struct ast_format_cap *what = NULL; /* SHALLOW COPY DO NOT DESTROY! */
 	int needvideo = 0;
 	int needtext = 0;
 	char buf[SIPBUFSIZE];
 	char *decoded_exten;
 
-	if (!what) {
-		return NULL;
-	}
 	{
 		const char *my_name;	/* pick a good name */
 	
@@ -6575,7 +6570,6 @@
 	if (!tmp) {
 		ast_log(LOG_WARNING, "Unable to allocate AST channel structure for SIP channel\n");
 		sip_pvt_lock(i);
-		ast_format_cap_destroy(what);
 		return NULL;
 	}
 	ast_channel_lock(tmp);
@@ -6589,28 +6583,19 @@
 	/* Select our native format based on codec preference until we receive
 	   something from another device to the contrary. */
 	if (!(ast_format_cap_is_empty(i->jointcaps))) {	/* The joint capabilities of us and peer */
-		ast_format_cap_copy2(what, i->jointcaps);
-		video = ast_format_cap_get_type(i->jointcaps, AST_FORMAT_TYPE_VIDEO);
-		text = ast_format_cap_get_type(i->jointcaps, AST_FORMAT_TYPE_TEXT);
+		what = i->jointcaps;
 	} else if (!(ast_format_cap_is_empty(i->caps))) {		/* Our configured capability for this peer */
-		ast_format_cap_copy2(what, i->caps);
-		video = ast_format_cap_get_type(i->caps, AST_FORMAT_TYPE_VIDEO);
-		text = ast_format_cap_get_type(i->caps, AST_FORMAT_TYPE_TEXT);
+		what = i->caps;
 	} else {
-		ast_format_cap_copy2(what, sip_cfg.caps);	/* Global codec support */
-		video = ast_format_cap_get_type(sip_cfg.caps, AST_FORMAT_TYPE_VIDEO);
-		text = ast_format_cap_get_type(sip_cfg.caps, AST_FORMAT_TYPE_TEXT);
-	}
-
-	/* Set the native formats for audio  and merge in video */
-	ast_codec_choose(&i->prefs, what, 1, &fmt);
-	if (video) {
-		ast_format_cap_append(tmp->nativeformats, video);
-	}
-	if (text) {
-		ast_format_cap_append(tmp->nativeformats, text);
-	}
-	ast_format_cap_add(tmp->nativeformats, &fmt);
+		what = sip_cfg.caps;
+	}
+
+	/* Set the native formats */
+	ast_format_cap_copy2(tmp->nativeformats, what);
+	/* choose and use only the best audio format for our native formats */
+	ast_codec_choose(&i->prefs, tmp->nativeformats, 1, &fmt); /* get the best audio format */
+	ast_format_cap_remove_bytype(tmp->nativeformats, AST_FORMAT_TYPE_AUDIO); /* remove only the other audio formats */
+	ast_format_cap_add(tmp->nativeformats, &fmt); /* add our best choice back */
 
 	ast_debug(3, "*** Our native formats are %s \n", ast_getformatname_multiple(buf, SIPBUFSIZE, tmp->nativeformats));
 	ast_debug(3, "*** Joint capabilities are %s \n", ast_getformatname_multiple(buf, SIPBUFSIZE, i->jointcaps));
@@ -6774,10 +6759,6 @@
 			"Channel: %s\r\nUniqueid: %s\r\nChanneltype: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\n",
 			tmp->name, tmp->uniqueid, "SIP", i->callid, i->fullcontact);
 	}
-
-	what = ast_format_cap_destroy(what);
-	video = ast_format_cap_destroy(video);
-	text = ast_format_cap_destroy(text);
 
 	return tmp;
 }




More information about the svn-commits mailing list