Add API call to determine if format capability structure is "empty".

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
This commit is contained in:
Mark Michelson
2014-09-18 16:38:26 +00:00
parent 389db2b720
commit fa6313ad29
4 changed files with 34 additions and 0 deletions

View 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) {

View 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;
}

View 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;
}