[svn-commits] file: branch group/media_formats r406487 - /team/group/media_formats/main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Jan 25 09:46:01 CST 2014


Author: file
Date: Sat Jan 25 09:45:58 2014
New Revision: 406487

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=406487
Log:
Turn formats into a vector of linked lists, for supporting multiple formats with same codec.

Modified:
    team/group/media_formats/main/format_cap_ng.c

Modified: team/group/media_formats/main/format_cap_ng.c
URL: http://svnview.digium.com/svn/asterisk/team/group/media_formats/main/format_cap_ng.c?view=diff&rev=406487&r1=406486&r2=406487
==============================================================================
--- team/group/media_formats/main/format_cap_ng.c (original)
+++ team/group/media_formats/main/format_cap_ng.c Sat Jan 25 09:45:58 2014
@@ -38,6 +38,7 @@
 #include "asterisk/astobj2.h"
 #include "asterisk/strings.h"
 #include "asterisk/vector.h"
+#include "asterisk/linkedlists.h"
 
 /*! \brief Structure used for capability formats, adds framing */
 struct format_cap_framed {
@@ -45,17 +46,25 @@
 	struct ast_format *format;
 	/*! \brief The format framing size */
 	unsigned int framing;
+	/*! \brief Linked list information */
+	AST_LIST_ENTRY(format_cap_framed) entry;
 };
 
 /*! \brief Format capabilities structure, holds formats + preference order + etc */
 struct ast_format_cap {
 	/*! \brief Vector of formats, indexed using the codec identifier */
-	AST_VECTOR(, struct format_cap_framed *) formats;
+	AST_VECTOR(, struct format_cap_framed_list) formats;
 	/*! \brief Vector of formats, added in preference order */
 	AST_VECTOR(, struct format_cap_framed *) preference_order;
 	/*! \brief Global framing size, applies to all formats if no framing present on format */
 	unsigned int framing;
 };
+
+/*! \brief Linked list for formats */
+AST_LIST_HEAD_NOLOCK(format_cap_framed_list, format_cap_framed);
+
+/*! \brief Dummy empty list for when we are inserting a new list */
+static const struct format_cap_framed_list format_cap_framed_list_empty = { NULL, };
 
 /*! \brief Destructor for format capabilities structure */
 static void format_cap_destroy(void *obj)
@@ -64,17 +73,12 @@
 	int idx;
 
 	for (idx = 0; idx < AST_VECTOR_SIZE(&cap->formats); idx++) {
-		struct format_cap_framed *framed = AST_VECTOR_GET(&cap->formats, idx);
+		struct format_cap_framed_list *list = AST_VECTOR_GET_ADDR(&cap->formats, idx);
+		struct format_cap_framed *framed;
 
-		/* Unlike the preference order it is possible for there to be nothing present,
-		 * which means there are no formats with the codec present in this capabilities
-		 * structure.
-		 */
-		if (!framed) {
-			continue;
+		while ((framed = AST_LIST_REMOVE_HEAD(list, entry))) {
+			ao2_ref(framed, -1);
 		}
-
-		ao2_ref(framed, -1);
 	}
 
 	for (idx = 0; idx < AST_VECTOR_SIZE(&cap->preference_order); idx++) {
@@ -114,11 +118,7 @@
 int ast_format_cap_add(struct ast_format_cap *cap, struct ast_format *format)
 {
 	struct format_cap_framed *framed;
-
-	/* If a codec is already present bail out for now */
-	if (AST_VECTOR_GET(&cap->formats, format->codec->id)) {
-		return -1;
-	}
+	struct format_cap_framed_list *list;
 
 	framed = ao2_alloc_options(sizeof(*framed), format_cap_framed_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
 	if (!framed) {
@@ -127,8 +127,18 @@
 
 	framed->format = ao2_bump(format);
 
+	list = AST_VECTOR_GET_ADDR(&cap->formats, format->codec->id);
+	if (!list) {
+		if (AST_VECTOR_INSERT(&cap->formats, format->codec->id, format_cap_framed_list_empty)) {
+			ao2_ref(framed, -1);
+			return -1;
+		}
+		list = AST_VECTOR_GET_ADDR(&cap->formats, format->codec->id);
+	}
+
+	/* Order doesn't matter for formats, so insert at the head for performance reasons */
 	ao2_ref(framed, +1);
-	AST_VECTOR_INSERT(&cap->formats, format->codec->id, framed);
+	AST_LIST_INSERT_HEAD(list, framed, entry);
 
 	/* This takes the allocation reference */
 	AST_VECTOR_APPEND(&cap->preference_order, framed);




More information about the svn-commits mailing list