From: Sean Bright Date: Mon, 14 Sep 2020 18:23:27 +0000 (-0400) Subject: format_cap: Perform codec lookups by pointer instead of name X-Git-Tag: 13.38.0-rc1~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9cd11030301f9ec6b7cddad041d381cdcafe66a0;p=thirdparty%2Fasterisk.git format_cap: Perform codec lookups by pointer instead of name ASTERISK-28416 #close Change-Id: I069420875ebdbcaada52d92599a5f7de3cb2cdf4 --- diff --git a/include/asterisk/format_cache.h b/include/asterisk/format_cache.h index d716cea6c6..50f3856e0c 100644 --- a/include/asterisk/format_cache.h +++ b/include/asterisk/format_cache.h @@ -306,4 +306,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 */ diff --git a/main/format_cache.c b/main/format_cache.c index e6277ee11e..3f73c610d0 100644 --- a/main/format_cache.c +++ b/main/format_cache.c @@ -541,3 +541,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; +} diff --git a/main/format_cap.c b/main/format_cap.c index 86e8e1ff0b..2558c4a142 100644 --- a/main/format_cap.c +++ b/main/format_cap.c @@ -268,7 +268,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);