core: Fix unused variable error in handle_show_sysinfo.
[asterisk/asterisk.git] / main / format_cap.c
index 224fe33..d71ccdb 100644 (file)
@@ -29,8 +29,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_REGISTER_FILE()
-
 #include "asterisk/logger.h"
 #include "asterisk/format.h"
 #include "asterisk/format_cap.h"
@@ -93,14 +91,27 @@ static void format_cap_destroy(void *obj)
        AST_VECTOR_FREE(&cap->preference_order);
 }
 
-static inline void format_cap_init(struct ast_format_cap *cap, enum ast_format_cap_flags flags)
+/*
+ * \brief Initialize values on an ast_format_cap
+ *
+ * \param cap ast_format_cap to initialize
+ * \param flags Unused.
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+static inline int format_cap_init(struct ast_format_cap *cap, enum ast_format_cap_flags flags)
 {
-       AST_VECTOR_INIT(&cap->formats, 0);
+       if (AST_VECTOR_INIT(&cap->formats, 0)) {
+               return -1;
+       }
 
        /* TODO: Look at common usage of this and determine a good starting point */
-       AST_VECTOR_INIT(&cap->preference_order, 5);
+       if (AST_VECTOR_INIT(&cap->preference_order, 5)) {
+               return -1;
+       }
 
        cap->framing = UINT_MAX;
+       return 0;
 }
 
 struct ast_format_cap *__ast_format_cap_alloc(enum ast_format_cap_flags flags,
@@ -114,7 +125,10 @@ struct ast_format_cap *__ast_format_cap_alloc(enum ast_format_cap_flags flags,
                return NULL;
        }
 
-       format_cap_init(cap, flags);
+       if (format_cap_init(cap, flags)) {
+               ao2_ref(cap, -1);
+               return NULL;
+       }
 
        return cap;
 }
@@ -146,13 +160,16 @@ static inline int format_cap_framed_init(struct format_cap_framed *framed, struc
        }
        list = AST_VECTOR_GET_ADDR(&cap->formats, ast_format_get_codec_id(format));
 
+       /* This takes the allocation reference */
+       if (AST_VECTOR_APPEND(&cap->preference_order, framed)) {
+               ao2_ref(framed, -1);
+               return -1;
+       }
+
        /* Order doesn't matter for formats, so insert at the head for performance reasons */
        ao2_ref(framed, +1);
        AST_LIST_INSERT_HEAD(list, framed, entry);
 
-       /* This takes the allocation reference */
-       AST_VECTOR_APPEND(&cap->preference_order, framed);
-
        cap->framing = MIN(cap->framing, framing ? framing : ast_format_get_default_ms(format));
 
        return 0;
@@ -202,6 +219,7 @@ int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_typ
 
        for (id = 1; id < ast_codec_get_max(); ++id) {
                struct ast_codec *codec = ast_codec_get_by_id(id);
+               struct ast_codec *codec2 = NULL;
                struct ast_format *format;
                int res;
 
@@ -214,7 +232,22 @@ int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_typ
                        continue;
                }
 
-               format = ast_format_create(codec);
+               format = ast_format_cache_get(codec->name);
+
+               if (format == ast_format_none) {
+                       ao2_ref(format, -1);
+                       ao2_ref(codec, -1);
+                       continue;
+               }
+
+               if (format) {
+                       codec2 = ast_format_get_codec(format);
+               }
+               if (codec != codec2) {
+                       ao2_cleanup(format);
+                       format = ast_format_create(codec);
+               }
+               ao2_cleanup(codec2);
                ao2_ref(codec, -1);
 
                if (!format) {
@@ -238,6 +271,7 @@ int ast_format_cap_append_from_cap(struct ast_format_cap *dst, const struct ast_
 {
        int idx, res = 0;
 
+       /* NOTE:  The streams API is dependent on the formats being in "preference" order */
        for (idx = 0; (idx < AST_VECTOR_SIZE(&src->preference_order)) && !res; ++idx) {
                struct format_cap_framed *framed = AST_VECTOR_GET(&src->preference_order, idx);
 
@@ -295,7 +329,7 @@ int ast_format_cap_update_by_allow_disallow(struct ast_format_cap *cap, const ch
        parse = ast_strdupa(list);
 
        /* If the list is being fed to us as a result of ast_format_cap_get_names,
-        * strip off the paranthesis and immediately apply the inverse of the
+        * strip off the parenthesis and immediately apply the inverse of the
         * allowing option
         */
        if (parse[0] == '(' && parse[strlen(parse) - 1] == ')') {
@@ -310,7 +344,7 @@ int ast_format_cap_update_by_allow_disallow(struct ast_format_cap *cap, const ch
        }
 
 
-       while ((this = strsep(&parse, ",|"))) {
+       while ((this = ast_strip(strsep(&parse, ",|")))) {
                int framems = 0;
                struct ast_format *format = NULL;
 
@@ -671,7 +705,7 @@ const char *ast_format_cap_get_names(struct ast_format_cap *cap, struct ast_str
 
        ast_str_set(buf, 0, "(");
 
-       if (!AST_VECTOR_SIZE(&cap->preference_order)) {
+       if (!cap || !AST_VECTOR_SIZE(&cap->preference_order)) {
                ast_str_append(buf, 0, "nothing)");
                return ast_str_buffer(*buf);
        }