[asterisk-commits] coreyfarrell: branch group/media_formats-reviewed-trunk r418960 - in /team/gr...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jul 18 12:40:48 CDT 2014


Author: coreyfarrell
Date: Fri Jul 18 12:40:42 2014
New Revision: 418960

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=418960
Log:
Move format_compatibility functions to iax2 where possible

All ast_codec_pref and most ast_format_compatibility functions are
used exclusively by chan_iax2.  This change moves those functions
to channels/iax2 to ensure no other code starts using them.

Review: https://reviewboard.asterisk.org/r/3822/

Added:
    team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c   (with props)
    team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c   (with props)
    team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h   (with props)
    team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h   (with props)
Modified:
    team/group/media_formats-reviewed-trunk/channels/chan_iax2.c
    team/group/media_formats-reviewed-trunk/channels/iax2/parser.c
    team/group/media_formats-reviewed-trunk/include/asterisk/config_options.h
    team/group/media_formats-reviewed-trunk/include/asterisk/format_compatibility.h
    team/group/media_formats-reviewed-trunk/main/format_compatibility.c

Modified: team/group/media_formats-reviewed-trunk/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/chan_iax2.c?view=diff&rev=418960&r1=418959&r2=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/chan_iax2.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/chan_iax2.c Fri Jul 18 12:40:42 2014
@@ -124,6 +124,9 @@
 #include "iax2/include/firmware.h"
 #include "iax2/include/parser.h"
 #include "iax2/include/provision.h"
+#include "iax2/include/codec_pref.h"
+#include "iax2/include/format_compatibility.h"
+
 #include "jitterbuf.h"
 
 /*** DOCUMENTATION
@@ -282,7 +285,7 @@
 /* Sample over last 100 units to determine historic jitter */
 #define GAMMA (0.01)
 
-static struct ast_codec_pref prefs;
+static struct iax2_codec_pref prefs;
 
 static const char tdesc[] = "Inter Asterisk eXchange Driver (Ver 2)";
 
@@ -506,7 +509,7 @@
 	iax2_format capability;
 	int maxauthreq; /*!< Maximum allowed outstanding AUTHREQs */
 	int curauthreq; /*!< Current number of outstanding AUTHREQs */
-	struct ast_codec_pref prefs;
+	struct iax2_codec_pref prefs;
 	struct ast_acl_list *acl;
 	struct iax2_context *contexts;
 	struct ast_variable *vars;
@@ -535,7 +538,7 @@
 		AST_STRING_FIELD(zonetag);		/*!< Time Zone */
 		AST_STRING_FIELD(parkinglot);   /*!< Default parkinglot for device */
 	);
-	struct ast_codec_pref prefs;
+	struct iax2_codec_pref prefs;
 	struct ast_dnsmgr_entry *dnsmgr;		/*!< DNS refresh manager */
 	struct ast_sockaddr addr;
 	int formats;
@@ -711,9 +714,9 @@
 	/*! Peer Address */
 	struct ast_sockaddr addr;
 	/*! Actual used codec preferences */
-	struct ast_codec_pref prefs;
+	struct iax2_codec_pref prefs;
 	/*! Requested codec preferences */
-	struct ast_codec_pref rprefs;
+	struct iax2_codec_pref rprefs;
 	/*! Our call number */
 	unsigned short callno;
 	/*! Our callno_entry entry */
@@ -1812,14 +1815,14 @@
 		return csub;
 }
 
-static iax2_format iax2_codec_choose(struct ast_codec_pref *pref, iax2_format formats, int find_best)
+static iax2_format iax2_codec_choose(struct iax2_codec_pref *pref, iax2_format formats, int find_best)
 {
 	struct ast_format_cap *cap;
 	struct ast_format *tmpfmt;
 	iax2_format format = 0;
 
 	if ((cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
-		ast_format_compatibility_bitfield2cap(formats, cap);
+		iax2_format_compatibility_bitfield2cap(formats, cap);
 		tmpfmt = ast_format_cap_get_format(cap, 0);
 		format = ast_format_compatibility_format2bitfield(tmpfmt);
 		ao2_ref(tmpfmt, -1);
@@ -1839,7 +1842,7 @@
 		return 0;
 	}
 
-	ast_format_compatibility_bitfield2cap(formats, cap);
+	iax2_format_compatibility_bitfield2cap(formats, cap);
 	tmpfmt = ast_format_cap_get_format(cap, 0);
 	format = ast_format_compatibility_format2bitfield(tmpfmt);
 	ao2_ref(tmpfmt, -1);
@@ -1867,14 +1870,14 @@
 	if (!cap) {
 		return "(Nothing)";
 	}
-	ast_format_compatibility_bitfield2cap(format, cap);
+	iax2_format_compatibility_bitfield2cap(format, cap);
 	ast_format_cap_get_names(cap, codec_buf);
 	ao2_ref(cap, -1);
 
 	return ast_str_buffer(*codec_buf);
 }
 
-static int iax2_parse_allow_disallow(struct ast_codec_pref *pref, iax2_format *formats, const char *list, int allowing)
+static int iax2_parse_allow_disallow(struct iax2_codec_pref *pref, iax2_format *formats, const char *list, int allowing)
 {
 	int res, i;
 	struct ast_format_cap *cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
@@ -1884,27 +1887,27 @@
 	}
 
 	/* We want to add the formats to the cap in the preferred order */
-	for (i = 0; i < AST_CODEC_PREF_SIZE; i++) {
-		uint64_t pref_as_bitfield = ast_codec_pref_order_value_to_format_bitfield(pref->order[i]);
+	for (i = 0; i < IAX2_CODEC_PREF_SIZE; i++) {
+		uint64_t pref_as_bitfield = iax2_codec_pref_order_value_to_format_bitfield(pref->order[i]);
 
 		if (!pref_as_bitfield) {
 			break;
 		}
 
-		if (ast_format_compatibility_bitfield2cap(pref_as_bitfield, cap)) {
+		if (iax2_format_compatibility_bitfield2cap(pref_as_bitfield, cap)) {
 			ao2_ref(cap, -1);
 			return 1;
 		}
 	}
 
 	res = ast_format_cap_update_by_allow_disallow(cap, list, allowing);
-	*formats = ast_format_compatibility_cap2bitfield(cap);
-
-	ast_codec_pref_remove_missing(pref, *formats);
+	*formats = iax2_format_compatibility_cap2bitfield(cap);
+
+	iax2_codec_pref_remove_missing(pref, *formats);
 
 	for (i = 0; i < ast_format_cap_count(cap); i++) {
 		struct ast_format *fmt = ast_format_cap_get_format(cap, i);
-		ast_codec_pref_append(pref, fmt, ast_format_cap_get_format_framing(cap, fmt));
+		iax2_codec_pref_append(pref, fmt, ast_format_cap_get_format_framing(cap, fmt));
 		ao2_ref(fmt, -1);
 	}
 
@@ -1920,7 +1923,7 @@
 	if (!cap) {
 		return -1;
 	}
-	ast_format_compatibility_bitfield2cap(formats, cap);
+	iax2_format_compatibility_bitfield2cap(formats, cap);
 	res = ast_data_add_codecs(root, node_name, cap);
 	ao2_ref(cap, -1);
 	return res;
@@ -3825,7 +3828,7 @@
 		ast_cli(a->fd, "%s\n", iax2_getformatname_multiple(peer->capability, &codec_buf));
 
 		ast_cli(a->fd, "  Codec Order  : ");
-		if (ast_codec_pref_string(&peer->prefs, cbuf, sizeof(cbuf)) != -1) {
+		if (iax2_codec_pref_string(&peer->prefs, cbuf, sizeof(cbuf)) != -1) {
 			ast_cli(a->fd, "%s\n", cbuf);
 		}
 
@@ -4602,7 +4605,7 @@
 {
 	struct iax2_peer *peer;
 	int res = -1;
-	struct ast_codec_pref ourprefs;
+	struct iax2_codec_pref ourprefs;
 
 	ast_clear_flag64(cai, IAX_SENDANI | IAX_TRUNK);
 	cai->sockfd = defaultsockfd;
@@ -4632,11 +4635,11 @@
 			for (i = 0; i < ast_format_cap_count(ast_channel_nativeformats(c)); i++) {
 				struct ast_format *format = ast_format_cap_get_format(
 					ast_channel_nativeformats(c), i);
-				ast_codec_pref_prepend(&ourprefs, format, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), format), 1);
+				iax2_codec_pref_prepend(&ourprefs, format, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), format), 1);
 				ao2_ref(format, -1);
 			}
 		}
-		ast_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
+		iax2_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
 		return 0;
 	}
 
@@ -4665,11 +4668,11 @@
 		for (i = 0; i < ast_format_cap_count(ast_channel_nativeformats(c)); i++) {
 			struct ast_format *tmpfmt = ast_format_cap_get_format(
 				ast_channel_nativeformats(c), i);
-			ast_codec_pref_prepend(&ourprefs, tmpfmt, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), tmpfmt), 1);
+			iax2_codec_pref_prepend(&ourprefs, tmpfmt, ast_format_cap_get_format_framing(ast_channel_nativeformats(c), tmpfmt), 1);
 			ao2_ref(tmpfmt, -1);
 		}
 	}
-	ast_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
+	iax2_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
 	ast_copy_string(cai->context, peer->context, sizeof(cai->context));
 	ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
 	ast_copy_string(cai->username, peer->username, sizeof(cai->username));
@@ -5207,7 +5210,7 @@
 	if (pds.password)
 		ast_string_field_set(iaxs[callno], secret, pds.password);
 
-	iax2_tmpfmt = ast_format_compatibility_cap2bitfield(ast_channel_nativeformats(c));
+	iax2_tmpfmt = iax2_format_compatibility_cap2bitfield(ast_channel_nativeformats(c));
 	iax_ie_append_int(&ied, IAX_IE_FORMAT, (int) iax2_tmpfmt);
 	iax_ie_append_versioned_uint64(&ied, IAX_IE_FORMAT2, 0, iax2_tmpfmt);
 
@@ -5851,7 +5854,7 @@
 	ast_channel_tech_set(tmp, &iax2_tech);
 
 	/* We can support any format by default, until we get restricted */
-	ast_format_compatibility_bitfield2cap(capability, native);
+	iax2_format_compatibility_bitfield2cap(capability, native);
 	ast_channel_nativeformats_set(tmp, native);
 	tmpfmt = ast_format_cap_get_format(ast_channel_nativeformats(tmp), 0);
 
@@ -7810,8 +7813,8 @@
 
 	/* Use provided preferences until told otherwise for actual preferences */
 	if (ies->codec_prefs) {
-		ast_codec_pref_convert(&iaxs[callno]->rprefs, ies->codec_prefs, 32, 0);
-		ast_codec_pref_convert(&iaxs[callno]->prefs, ies->codec_prefs, 32, 0);
+		iax2_codec_pref_convert(&iaxs[callno]->rprefs, ies->codec_prefs, 32, 0);
+		iax2_codec_pref_convert(&iaxs[callno]->prefs, ies->codec_prefs, 32, 0);
 	}
 
 	if (!gotcapability) {
@@ -10047,7 +10050,7 @@
 	struct iax_frame *duped_fr;
 	char host_pref_buf[128];
 	char caller_pref_buf[128];
-	struct ast_codec_pref pref;
+	struct iax2_codec_pref pref;
 	char *using_prefs = "mine";
 
 	/* allocate an iax_frame with 4096 bytes of data buffer */
@@ -10743,8 +10746,8 @@
 							using_prefs = "mine";
 							/* If the information elements are in here... use them */
 							if (ies.codec_prefs)
-								ast_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
-							if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
+								iax2_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
+							if (iax2_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
 								/* If we are codec_first_choice we let the caller have the 1st shot at picking the codec.*/
 								if (ast_test_flag64(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
 									pref = iaxs[fr->callno]->rprefs;
@@ -10756,8 +10759,8 @@
 								pref = iaxs[fr->callno]->prefs;
 
 							format = iax2_codec_choose(&pref, iaxs[fr->callno]->capability & iaxs[fr->callno]->peercapability, 0);
-							ast_codec_pref_string(&iaxs[fr->callno]->rprefs, caller_pref_buf, sizeof(caller_pref_buf) - 1);
-							ast_codec_pref_string(&iaxs[fr->callno]->prefs, host_pref_buf, sizeof(host_pref_buf) - 1);
+							iax2_codec_pref_string(&iaxs[fr->callno]->rprefs, caller_pref_buf, sizeof(caller_pref_buf) - 1);
+							iax2_codec_pref_string(&iaxs[fr->callno]->prefs, host_pref_buf, sizeof(host_pref_buf) - 1);
 						}
 						if (!format) {
 							if(!ast_test_flag64(iaxs[fr->callno], IAX_CODEC_NOCAP))
@@ -10803,7 +10806,7 @@
 									} else {
 										struct ast_format *tmpfmt;
 										using_prefs = "mine";
-										if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
+										if (iax2_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
 											/* Do the opposite of what we tried above. */
 											if (ast_test_flag64(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
 												pref = iaxs[fr->callno]->prefs;
@@ -10983,7 +10986,7 @@
 					iaxs[fr->callno]->peerformat = ies.format;
 				} else {
 					if (iaxs[fr->callno]->owner)
-						iaxs[fr->callno]->peerformat = ast_format_compatibility_cap2bitfield(ast_channel_nativeformats(iaxs[fr->callno]->owner));
+						iaxs[fr->callno]->peerformat = iax2_format_compatibility_cap2bitfield(ast_channel_nativeformats(iaxs[fr->callno]->owner));
 					else
 						iaxs[fr->callno]->peerformat = iaxs[fr->callno]->capability;
 				}
@@ -11015,7 +11018,7 @@
 						struct ast_str *cap_buf = ast_str_alloca(64);
 
 						/* Switch us to use a compatible format */
-						ast_format_compatibility_bitfield2cap(iaxs[fr->callno]->peerformat, native);
+						iax2_format_compatibility_bitfield2cap(iaxs[fr->callno]->peerformat, native);
 						ast_channel_nativeformats_set(iaxs[fr->callno]->owner, native);
 						ast_verb(3, "Format for call is %s\n", ast_format_cap_get_names(ast_channel_nativeformats(iaxs[fr->callno]->owner), &cap_buf));
 
@@ -11199,8 +11202,8 @@
 						struct ast_format *tmpfmt;
 						using_prefs = "mine";
 						if (ies.codec_prefs)
-							ast_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
-						if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
+							iax2_codec_pref_convert(&iaxs[fr->callno]->rprefs, ies.codec_prefs, 32, 0);
+						if (iax2_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
 							if (ast_test_flag64(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
 								pref = iaxs[fr->callno]->rprefs;
 								using_prefs = "caller";
@@ -11210,8 +11213,8 @@
 						} else /* if no codec_prefs IE do it the old way */
 							pref = iaxs[fr->callno]->prefs;
 						format = iax2_codec_choose(&pref, iaxs[fr->callno]->capability & iaxs[fr->callno]->peercapability, 0);
-						ast_codec_pref_string(&iaxs[fr->callno]->rprefs, caller_pref_buf, sizeof(caller_pref_buf) - 1);
-						ast_codec_pref_string(&iaxs[fr->callno]->prefs, host_pref_buf, sizeof(host_pref_buf) - 1);
+						iax2_codec_pref_string(&iaxs[fr->callno]->rprefs, caller_pref_buf, sizeof(caller_pref_buf) - 1);
+						iax2_codec_pref_string(&iaxs[fr->callno]->prefs, host_pref_buf, sizeof(host_pref_buf) - 1);
 					}
 					if (!format) {
 						struct ast_str *cap_buf = ast_str_alloca(64);
@@ -11262,7 +11265,7 @@
 								} else {
 									struct ast_format *tmpfmt;
 									using_prefs = "mine";
-									if (ast_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
+									if (iax2_codec_pref_index(&iaxs[fr->callno]->rprefs, 0, &tmpfmt)) {
 										/* Do the opposite of what we tried above. */
 										if (ast_test_flag64(iaxs[fr->callno], IAX_CODEC_USER_FIRST)) {
 											pref = iaxs[fr->callno]->prefs;
@@ -13433,7 +13436,7 @@
 	ast_sockaddr_parse(&bindaddr, "0.0.0.0:0", 0);
 
 	/* Reset global codec prefs */
-	memset(&prefs, 0 , sizeof(struct ast_codec_pref));
+	memset(&prefs, 0 , sizeof(struct iax2_codec_pref));
 
 	/* Reset Global Flags */
 	memset(&globalflags, 0, sizeof(globalflags));
@@ -14327,7 +14330,7 @@
 		if ((ptr = strchr(codecnum, ']'))) {
 			*ptr = '\0';
 		}
-		if((ast_codec_pref_index(&peer->prefs, atoi(codecnum), &tmpfmt))) {
+		if((iax2_codec_pref_index(&peer->prefs, atoi(codecnum), &tmpfmt))) {
 			ast_copy_string(buf, ast_format_get_name(tmpfmt), len);
 		} else {
 			buf[0] = '\0';

Added: team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c?view=auto&rev=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c (added)
+++ team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c Fri Jul 18 12:40:42 2014
@@ -1,0 +1,333 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2014, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Media Format Bitfield Compatibility API
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+	<support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/logger.h"
+#include "asterisk/astobj2.h"
+#include "asterisk/codec.h"
+#include "asterisk/format.h"
+#include "asterisk/format_compatibility.h"
+#include "asterisk/format_cache.h"
+#include "asterisk/format_cap.h"
+
+#include "include/codec_pref.h"
+#include "include/format_compatibility.h"
+
+void iax2_codec_pref_convert(struct iax2_codec_pref *pref, char *buf, size_t size, int right)
+{
+	static int differential = (int) 'A';
+	int x;
+
+	if (right) {
+		for (x = 0; x < IAX2_CODEC_PREF_SIZE && x < size; x++) {
+			if (!pref->order[x]) {
+				break;
+			}
+
+			buf[x] = pref->order[x] + differential;
+		}
+
+		buf[x] = '\0';
+	} else {
+		for (x = 0; x < IAX2_CODEC_PREF_SIZE && x < size; x++) {
+			if (buf[x] == '\0') {
+				break;
+			}
+
+			pref->order[x] = buf[x] - differential;
+		}
+
+		if (x < size) {
+			pref->order[x] = 0;
+		}
+	}
+}
+
+struct ast_format *iax2_codec_pref_index(struct iax2_codec_pref *pref, int idx, struct ast_format **result)
+{
+	if ((idx >= 0) && (idx < sizeof(pref->order)) && pref->order[idx]) {
+		*result = ast_format_compatibility_bitfield2format(pref->order[idx]);
+	} else {
+		*result = NULL;
+	}
+
+	return *result;
+}
+
+void iax2_codec_pref_to_cap(struct iax2_codec_pref *pref, struct ast_format_cap *cap)
+{
+	int idx;
+
+	for (idx = 0; idx < sizeof(pref->order); idx++) {
+		if (!pref->order[idx]) {
+			break;
+		}
+		ast_format_cap_append(cap, ast_format_compatibility_bitfield2format(pref->order[idx]), pref->framing[idx]);
+	}
+}
+
+int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size)
+{
+	int x;
+	struct ast_format_cap *cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
+	size_t total_len;
+	char *cur;
+
+	if (!cap) {
+		return -1;
+	}
+
+	/* This function is useless if you have less than a 6 character buffer.
+	 * '(...)' is six characters. */
+	if (size < 6) {
+		return -1;
+	}
+
+	/* Convert the preferences into a format cap so that we can read the formst names */
+	for (x = 0; x < IAX2_CODEC_PREF_SIZE; x++) {
+		uint64_t bitfield = iax2_codec_pref_order_value_to_format_bitfield(pref->order[x]);
+		if (!bitfield) {
+			break;
+		}
+
+		iax2_format_compatibility_bitfield2cap(bitfield, cap);
+	}
+
+	/* We know that at a minimum, 3 characters are used - (, ), and \0 */
+	total_len = size - 3;
+
+	memset(buf, 0, size);
+
+	/* This character has already been accounted for total_len purposes */
+	buf[0] = '(';
+	cur = buf + 1;
+
+	/* Loop through the formats and write as many into the buffer as we can */
+	for (x = 0; x < ast_format_cap_count(cap); x++) {
+		size_t name_len;
+		struct ast_format *fmt = ast_format_cap_get_format(cap, x);
+		const char *name = ast_format_get_name(fmt);
+
+		name_len = strlen(name);
+
+		/* all entries after the first need a delimiter character */
+		if (x) {
+			name_len++;
+		}
+
+		/* Terminate the list early if we don't have room for the entry.
+		 * If it's not the last entry in the list, save enough room to write '...'.
+		 */
+		if (((x == ast_format_cap_count(cap) - 1) && (total_len < name_len)) ||
+				((x < ast_format_cap_count(cap) - 1) && (total_len < name_len + 3))) {
+			strcpy(cur, "...");
+			cur += 3;
+			total_len -= 3;
+			ao2_ref(fmt, -1);
+			break;
+		}
+
+		sprintf(cur, "%s%s", x ? "|" : "", name);
+		cur += name_len;
+		total_len -= name_len;
+
+		ao2_ref(fmt, -1);
+	}
+	ao2_ref(cap, -1);
+
+	/* These two characters have already been accounted for total_len purposes */
+	cur[0] = ')';
+	cur[1] = '\0';
+
+	return size - total_len;
+}
+
+static void codec_pref_remove_index(struct iax2_codec_pref *pref, int codec_pref_index)
+{
+	int x;
+
+	for (x = codec_pref_index; x < IAX2_CODEC_PREF_SIZE; x++) {
+		pref->order[x] = pref->order[x + 1];
+		pref->framing[x] = pref->framing[x + 1];
+		if (!pref->order[x]) {
+			return;
+		}
+	}
+}
+
+/*! \brief Remove codec from pref list */
+static void codec_pref_remove(struct iax2_codec_pref *pref, int format_index)
+{
+	int x;
+
+	if (!pref->order[0]) {
+		return;
+	}
+
+	for (x = 0; x < IAX2_CODEC_PREF_SIZE; x++) {
+		if (!pref->order[x]) {
+			break;
+		}
+
+		if (pref->order[x] == format_index) {
+			codec_pref_remove_index(pref, x);
+			break;
+		}
+	}
+}
+
+void iax2_codec_pref_remove_missing(struct iax2_codec_pref *pref, uint64_t bitfield)
+{
+	int x;
+
+	if (!pref->order[0]) {
+		return;
+	}
+
+	for (x = 0; x < IAX2_CODEC_PREF_SIZE; x++) {
+		uint64_t format_as_bitfield = iax2_codec_pref_order_value_to_format_bitfield(pref->order[x]);
+		if (!pref->order[x]) {
+			break;
+		}
+
+		/* If this format isn't in the bitfield, remove it from the prefs. */
+		if (!(format_as_bitfield & bitfield)) {
+			codec_pref_remove_index(pref, x);
+		}
+	}
+}
+
+uint64_t iax2_codec_pref_order_value_to_format_bitfield(uint64_t order_value)
+{
+	if (!order_value) {
+		return 0;
+	}
+
+	return 1 << (order_value - 1);
+}
+
+uint64_t iax2_codec_pref_format_bitfield_to_order_value(uint64_t bitfield)
+{
+	int format_index = 1;
+
+	if (!bitfield) {
+		return 0;
+	}
+
+	while (bitfield > 1) {
+		bitfield = bitfield >> 1;
+		format_index++;
+	}
+
+	return format_index;
+}
+
+/*! \brief Append codec to list */
+int iax2_codec_pref_append(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing)
+{
+	uint64_t bitfield = ast_format_compatibility_format2bitfield(format);
+	int format_index = iax2_codec_pref_format_bitfield_to_order_value(bitfield);
+	int x;
+
+	codec_pref_remove(pref, format_index);
+
+	for (x = 0; x < IAX2_CODEC_PREF_SIZE; x++) {
+		if (!pref->order[x]) {
+			pref->order[x] = format_index;
+			pref->framing[x] = framing;
+			break;
+		}
+	}
+
+	return x;
+}
+
+/*! \brief Prepend codec to list */
+void iax2_codec_pref_prepend(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing,
+	int only_if_existing)
+{
+	uint64_t bitfield = ast_format_compatibility_format2bitfield(format);
+	int x;
+
+	/* Now find any existing occurrence, or the end */
+	for (x = 0; x < IAX2_CODEC_PREF_SIZE; x++) {
+		if (!pref->order[x] || pref->order[x] == bitfield)
+			break;
+	}
+
+	/* If we failed to find any occurrence, set to the end */
+	if (x == IAX2_CODEC_PREF_SIZE) {
+		--x;
+	}
+
+	if (only_if_existing && !pref->order[x]) {
+		return;
+	}
+
+	/* Move down to make space to insert - either all the way to the end,
+	   or as far as the existing location (which will be overwritten) */
+	for (; x > 0; x--) {
+		pref->order[x] = pref->order[x - 1];
+		pref->framing[x] = pref->framing[x - 1];
+	}
+
+	/* And insert the new entry */
+	pref->order[0] = bitfield;
+	pref->framing[0] = framing;
+}
+
+unsigned int iax2_codec_pref_getsize(struct iax2_codec_pref *pref, int idx)
+{
+	if ((idx >= 0) && (idx < sizeof(pref->order)) && pref->order[idx]) {
+		return pref->framing[idx];
+	} else {
+		return 0;
+	}
+}
+
+int iax2_codec_pref_setsize(struct iax2_codec_pref *pref, struct ast_format *format, int framems)
+{
+	int idx;
+
+	for (idx = 0; idx < sizeof(pref->order); idx++) {
+		if (!pref->order[idx]) {
+			break;
+		} else if (ast_format_cmp(ast_format_compatibility_bitfield2format(pref->order[idx]),
+			format) != AST_FORMAT_CMP_EQUAL) {
+			continue;
+		}
+		pref->framing[idx] = framems;
+		return 0;
+	}
+
+	return -1;
+}

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/codec_pref.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c?view=auto&rev=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c (added)
+++ team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c Fri Jul 18 12:40:42 2014
@@ -1,0 +1,73 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2014, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Media Format Bitfield Compatibility API
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+	<support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/logger.h"
+#include "asterisk/astobj2.h"
+#include "asterisk/codec.h"
+#include "asterisk/format.h"
+#include "asterisk/format_compatibility.h"
+#include "asterisk/format_cache.h"
+#include "asterisk/format_cap.h"
+
+#include "include/format_compatibility.h"
+
+uint64_t iax2_format_compatibility_cap2bitfield(const struct ast_format_cap *cap)
+{
+	uint64_t bitfield = 0;
+	int x;
+
+	for (x = 0; x < ast_format_cap_count(cap); x++) {
+		struct ast_format *format = ast_format_cap_get_format(cap, x);
+
+		bitfield |= ast_format_compatibility_format2bitfield(format);
+
+		ao2_ref(format, -1);
+	}
+
+	return bitfield;
+}
+
+int iax2_format_compatibility_bitfield2cap(uint64_t bitfield, struct ast_format_cap *cap)
+{
+	int x;
+
+	for (x = 0; x < 64; x++) {
+		uint64_t tmp = (1ULL << x);
+
+		if ((tmp & bitfield) && ast_format_cap_append(cap, ast_format_compatibility_bitfield2format(tmp), 0)) {
+			return -1;
+		}
+	}
+
+	return 0;
+}

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/format_compatibility.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h?view=auto&rev=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h (added)
+++ team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h Fri Jul 18 12:40:42 2014
@@ -1,0 +1,123 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2014, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief Media Format Bitfield Compatibility API
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+#ifndef _IAX2_CODEC_PREF_H_
+#define _IAX2_CODEC_PREF_H_
+
+struct ast_format;
+struct ast_codec;
+struct ast_format_cap;
+
+#define IAX2_CODEC_PREF_SIZE 64
+struct iax2_codec_pref {
+	/*! This array is ordered by preference and contains the codec bitfield. */
+	uint64_t order[IAX2_CODEC_PREF_SIZE];
+	/*! Framing size of the codec */
+	unsigned int framing[IAX2_CODEC_PREF_SIZE];
+};
+
+/*!
+ * \brief Convert an iax2_codec_pref order value into a format bitfield
+ *
+ * \param order_value value being converted
+ *
+ * \return the bitfield value of the order_value format
+ */
+uint64_t iax2_codec_pref_order_value_to_format_bitfield(uint64_t order_value);
+
+/*!
+ * \brief Convert a format bitfield into an iax2_codec_pref order value
+ *
+ * \param bitfield value being converted
+ *
+ * \return the iax2_codec_pref order value of the most significant format
+ *  in the bitfield.
+ *
+ * \note This is really meant to be used on single format bitfields.
+ *  It will work with multiformat bitfields, but it can only return the
+ *  index of the most significant one if that is the case.
+ */
+uint64_t iax2_codec_pref_format_bitfield_to_order_value(uint64_t bitfield);
+
+/*!
+ * \brief Codec located at a particular place in the preference index.
+ * \param pref preference structure to get the codec out of
+ * \param index to retrieve from
+ * \param result ast_format structure to store the index value in
+ * \return pointer to input ast_format on success, NULL on failure
+*/
+struct ast_format *iax2_codec_pref_index(struct iax2_codec_pref *pref, int index, struct ast_format **result);
+
+/*! \brief Convert a preference structure to a capabilities structure */
+void iax2_codec_pref_to_cap(struct iax2_codec_pref *pref, struct ast_format_cap *cap);
+
+/*! \brief Removes format from the pref list that aren't in the bitfield */
+void iax2_codec_pref_remove_missing(struct iax2_codec_pref *pref, uint64_t bitfield);
+
+/*!
+ * \brief Dump audio codec preference list into a string
+ *
+ * \param pref preference structure to dump string representation of order for
+ * \param buf character buffer to put string into
+ * \param size size of the character buffer
+ *
+ * \return -1 on error. Otherwise returns the remaining spaaaaaace in the buffer.
+ *
+ * \note Format is (codec1|codec2|codec3|...) -- if the list is too long for the
+ *  size of the buffer, codecs will be written until they exceed the length
+ *  remaining in which case the list will be closed with '...)' after the last
+ *  writable codec.
+ */
+int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size);
+
+/*! \brief Append a audio codec to a preference list, removing it first if it was already there
+*/
+int iax2_codec_pref_append(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing);
+
+/*! \brief Prepend an audio codec to a preference list, removing it first if it was already there
+*/
+void iax2_codec_pref_prepend(struct iax2_codec_pref *pref, struct ast_format *format, unsigned int framing,
+	int only_if_existing);
+
+/*! \brief Get packet size for codec
+*/
+unsigned int iax2_codec_pref_getsize(struct iax2_codec_pref *pref, int index);
+
+/*! \brief Set packet size for codec
+*/
+int iax2_codec_pref_setsize(struct iax2_codec_pref *pref, struct ast_format *format, int framems);
+
+/*! \brief Shift an audio codec preference list up or down 65 bytes so that it becomes an ASCII string
+ * \note Due to a misunderstanding in how codec preferences are stored, this
+ * list starts at 'B', not 'A'.  For backwards compatibility reasons, this
+ * cannot change.
+ * \param pref A codec preference list structure
+ * \param buf A string denoting codec preference, appropriate for use in line transmission
+ * \param size Size of \a buf
+ * \param right Boolean:  if 0, convert from \a buf to \a pref; if 1, convert from \a pref to \a buf.
+ */
+void iax2_codec_pref_convert(struct iax2_codec_pref *pref, char *buf, size_t size, int right);
+
+#endif /* _IAX2_CODEC_PREF_H_ */

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/codec_pref.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h?view=auto&rev=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h (added)
+++ team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h Fri Jul 18 12:40:42 2014
@@ -1,0 +1,55 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2014, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file
+ * \brief Media Format Bitfield Compatibility API
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+#ifndef _IAX2_FORMAT_COMPATIBILITY_H_
+#define _IAX2_FORMAT_COMPATIBILITY_H_
+
+struct ast_format;
+struct ast_format_cap;
+
+/*!
+ * \brief Convert a format capabilities structure to a bitfield
+ *
+ * \param cap Capabilities structure containing formats
+ *
+ * \retval non-zero success
+ * \retval zero no formats present or no formats supported
+ */
+uint64_t iax2_format_compatibility_cap2bitfield(const struct ast_format_cap *cap);
+
+/*!
+ * \brief Convert a bitfield to a format capabilities structure
+ *
+ * \param bitfield The bitfield for the media formats
+ * \param cap Capabilities structure to place formats into
+ *
+ * \retval non-NULL success
+ * \retval NULL failure
+ *
+ * \note If failure occurs the capabilities structure may contain a partial set of formats
+ */
+int iax2_format_compatibility_bitfield2cap(uint64_t bitfield, struct ast_format_cap *cap);
+
+#endif /* _IAX2_FORMAT_COMPATIBILITY_H */

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/media_formats-reviewed-trunk/channels/iax2/include/format_compatibility.h
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: team/group/media_formats-reviewed-trunk/channels/iax2/parser.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/channels/iax2/parser.c?view=diff&rev=418960&r1=418959&r2=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/channels/iax2/parser.c (original)
+++ team/group/media_formats-reviewed-trunk/channels/iax2/parser.c Fri Jul 18 12:40:42 2014
@@ -48,6 +48,7 @@
 #include "include/iax2.h"
 #include "include/parser.h"
 #include "include/provision.h"
+#include "include/codec_pref.h"
 
 static int frames = 0;
 static int iframes = 0;
@@ -126,7 +127,7 @@
 
 static void dump_prefs(char *output, int maxlen, void *value, int len)
 {
-	struct ast_codec_pref pref;
+	struct iax2_codec_pref pref;
 	int total_len = 0;
 
 	maxlen--;
@@ -138,9 +139,9 @@
 	strncpy(output, value, maxlen);
 	output[maxlen] = '\0';
 	
-	ast_codec_pref_convert(&pref, output, total_len, 0);
+	iax2_codec_pref_convert(&pref, output, total_len, 0);
 	memset(output,0,total_len);
-	ast_codec_pref_string(&pref, output, total_len);
+	iax2_codec_pref_string(&pref, output, total_len);
 }
 
 static void dump_int(char *output, int maxlen, void *value, int len)

Modified: team/group/media_formats-reviewed-trunk/include/asterisk/config_options.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/include/asterisk/config_options.h?view=diff&rev=418960&r1=418959&r2=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/include/asterisk/config_options.h (original)
+++ team/group/media_formats-reviewed-trunk/include/asterisk/config_options.h Fri Jul 18 12:40:42 2014
@@ -317,12 +317,12 @@
 	 */
 	OPT_CHAR_ARRAY_T,
 
-	/*! \brief Type for default option handler for codec preferences/capabilities
+	/*! \brief Type for default option handler for format capabilities
 	 * \note aco_option_register flags:
 	 *   non-zero : This is an "allow" style option
 	 *   0        : This is a "disallow" style option
 	 * aco_option_register varargs:
-	 *   FLDSET macro with fields representing a struct ast_codec_pref and a struct ast_format_cap *
+	 *   FLDSET macro with field representing a struct ast_format_cap *
 	 *
 	 * Example:
 	 * {code}

Modified: team/group/media_formats-reviewed-trunk/include/asterisk/format_compatibility.h
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats-reviewed-trunk/include/asterisk/format_compatibility.h?view=diff&rev=418960&r1=418959&r2=418960
==============================================================================
--- team/group/media_formats-reviewed-trunk/include/asterisk/format_compatibility.h (original)
+++ team/group/media_formats-reviewed-trunk/include/asterisk/format_compatibility.h Fri Jul 18 12:40:42 2014
@@ -28,7 +28,6 @@
 
 struct ast_format;
 struct ast_codec;
-struct ast_format_cap;
 
 /*
  * Legacy bitfields for specific formats
@@ -95,38 +94,6 @@
 /*! T.140 Text format - ITU T.140, RFC 4103 */
 #define AST_FORMAT_T140 (1ULL << 27)
 
-
-#define AST_CODEC_PREF_SIZE 64
-struct ast_codec_pref {
-	/*! This array is ordered by preference and contains the codec bitfield. */
-	uint64_t order[AST_CODEC_PREF_SIZE];
-	/*! Framing size of the codec */
-	unsigned int framing[AST_CODEC_PREF_SIZE];
-};
-
-/*!
- * \brief Convert an ast_codec_pref order value into a format bitfield
- *
- * \param order_value value being converted
- *
- * \return the bitfield value of the order_value format
- */
-uint64_t ast_codec_pref_order_value_to_format_bitfield(uint64_t order_value);
-
-/*!
- * \brief Convert a format bitfield into an ast_codec_pref order value
- *
- * \param bitfield value being converted
- *
- * \return the ast_codec_pref order value of the most significant format
- *  in the bitfield.
- *
- * \note This is really meant to be used on single format bitfields.
- *  It will work with multiformat bitfields, but it can only return the
- *  index of the most significant one if that is the case.
- */
-uint64_t ast_codec_pref_format_bitfield_to_order_value(uint64_t bitfield);
-
 /*!
  * \brief Convert a format structure to its respective bitfield
  *
@@ -159,86 +126,4 @@
  */
 struct ast_format *ast_format_compatibility_bitfield2format(uint64_t bitfield);
 
-/*!

[... 421 lines stripped ...]



More information about the asterisk-commits mailing list