format_cap: Perform codec lookups by pointer instead of name

ASTERISK-28416 #close

Change-Id: I069420875ebdbcaada52d92599a5f7de3cb2cdf4
This commit is contained in:
Sean Bright 2020-09-14 14:23:27 -04:00 committed by George Joseph
parent df429c97a1
commit c9cc281484
3 changed files with 35 additions and 1 deletions

View File

@ -314,4 +314,17 @@ struct ast_format *ast_format_cache_get_slin_by_rate(unsigned int rate);
*/
int ast_format_cache_is_slinear(struct ast_format *format);
/*!
* \brief Retrieve a format from the cache by its codec
*
* \param codec The codec to search by
*
* \retval non-NULL if found
* \retval NULL if not found
*
* \note The returned format has its reference count incremented. It must be
* dropped using ao2_ref or ao2_cleanup.
*/
struct ast_format *ast_format_cache_get_by_codec(const struct ast_codec *codec);
#endif /* _AST_FORMAT_CACHE_H */

View File

@ -555,3 +555,24 @@ int ast_format_cache_is_slinear(struct ast_format *format)
return 0;
}
struct ast_format *ast_format_cache_get_by_codec(const struct ast_codec *codec)
{
struct ast_format *format;
struct ao2_iterator it;
for (it = ao2_iterator_init(formats, 0);
(format = ao2_iterator_next(&it));
ao2_ref(format, -1)) {
struct ast_codec *candidate = ast_format_get_codec(format);
if (codec == candidate) {
ao2_cleanup(candidate);
ao2_iterator_destroy(&it);
return format;
}
ao2_cleanup(candidate);
}
ao2_iterator_destroy(&it);
return NULL;
}

View File

@ -232,7 +232,7 @@ int ast_format_cap_append_by_type(struct ast_format_cap *cap, enum ast_media_typ
continue;
}
format = ast_format_cache_get(codec->name);
format = ast_format_cache_get_by_codec(codec);
if (format == ast_format_none) {
ao2_ref(format, -1);