]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add API call to determine if format capability structure is "empty".
authorMark Michelson <mmichelson@digium.com>
Thu, 18 Sep 2014 16:38:26 +0000 (16:38 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 18 Sep 2014 16:38:26 +0000 (16:38 +0000)
Empty here means that there are no formats in the format_cap structure
or the only format in it is the "none" format.

I've added calls to check the emptiness of a format_cap in a few places
in order to short-circuit operations that would otherwise be pointless
as well as to prevent some assertions from being triggered in cases
where channels with no formats are used.
........

Merged revisions 423414 from http://svn.asterisk.org/svn/asterisk/branches/13

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@423415 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/format_cap.h
main/channel.c
main/format_cap.c
main/translate.c

index f7d33fccda72e1d6f1d1ce29dcf3257153938726..94e81f869e9b1d6c00ebc41d3e151ebedf65c016 100644 (file)
@@ -321,4 +321,13 @@ int ast_format_cap_has_type(const struct ast_format_cap *cap, enum ast_media_typ
  */
 const char *ast_format_cap_get_names(struct ast_format_cap *cap, struct ast_str **buf);
 
+/*!
+ * \brief Determine if a format cap has no formats in it.
+ *
+ * \param cap The format cap to check for emptiness
+ * \retval 1 The format cap has zero formats or only ast_format_none
+ * \retval 0 The format cap has at least one format
+ */
+int ast_format_cap_empty(struct ast_format_cap *cap);
+
 #endif /* _AST_FORMAT_CAP_H */
index 4595b5944c0c1fca65ac59399165bf4aebded545..477bc815b25cf7c4057547de283edc36caa7a1b9 100644 (file)
@@ -5327,6 +5327,11 @@ static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set,
        ast_assert(rawformat != NULL);
 
        cap_native = ast_channel_nativeformats(chan);
+       if (ast_format_cap_empty(cap_native)) {
+               ast_log(LOG_ERROR, "Unable to set format because channel %s supports no formats\n",
+                               ast_channel_name(chan));
+               return -1;
+       }
 
        /* Find a translation path from the native format to one of the desired formats */
        if (!direction) {
index 65e469fc16a123037357498a412f6418dda8a510..364c924bfd116f7bcf2edb88b13854e3befc8c9d 100644 (file)
@@ -700,3 +700,18 @@ const char *ast_format_cap_get_names(struct ast_format_cap *cap, struct ast_str
 
        return ast_str_buffer(*buf);
 }
+
+int ast_format_cap_empty(struct ast_format_cap *cap)
+{
+       int count = ast_format_cap_count(cap);
+
+       if (count > 1) {
+               return 0;
+       }
+
+       if (count == 0 || AST_VECTOR_GET(&cap->preference_order, 0)->format == ast_format_none) {
+               return 1;
+       }
+
+       return 0;
+}
index 0696f5d836d6a1154ec43a903e1ab9b4fad3209c..2778ebccf6b493e34bdb0d3337bbceeecc0b7886 100644 (file)
@@ -1276,6 +1276,11 @@ int ast_translator_best_choice(struct ast_format_cap *dst_cap,
        int i;
        int j;
 
+       if (ast_format_cap_empty(dst_cap) || ast_format_cap_empty(src_cap)) {
+               ast_log(LOG_ERROR, "Cannot determine best translation path since one capability supports no formats\n");
+               return -1;
+       }
+
        if (!(joint_cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
                return -1;
        }