diff options
Diffstat (limited to 'main/translate.c')
-rw-r--r-- | main/translate.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/main/translate.c b/main/translate.c index 4ffe27c33..240e4956a 100644 --- a/main/translate.c +++ b/main/translate.c @@ -34,7 +34,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include <sys/time.h> #include <sys/resource.h> #include <math.h> -#include <stdlib.h> #include "asterisk/lock.h" #include "asterisk/channel.h" @@ -499,6 +498,7 @@ struct ast_trans_pvt *ast_translator_build_path(struct ast_format *dst, struct a ast_log(LOG_WARNING, "No translator path from %s to %s\n", ast_format_get_name(src), ast_format_get_name(dst)); AST_RWLIST_UNLOCK(&translators); + ast_translator_free_path(head); return NULL; } if ((t->dst_codec.sample_rate == ast_format_get_sample_rate(dst)) && (t->dst_codec.type == ast_format_get_type(dst))) { @@ -507,9 +507,7 @@ struct ast_trans_pvt *ast_translator_build_path(struct ast_format *dst, struct a if (!(cur = newpvt(t, explicit_dst))) { ast_log(LOG_WARNING, "Failed to build translator step from %s to %s\n", ast_format_get_name(src), ast_format_get_name(dst)); - if (head) { - ast_translator_free_path(head); - } + ast_translator_free_path(head); AST_RWLIST_UNLOCK(&translators); return NULL; } @@ -1323,6 +1321,13 @@ void ast_translator_deactivate(struct ast_translator *t) AST_RWLIST_UNLOCK(&translators); } +/*! Calculate the absolute difference between sample rate of two formats. */ +#define format_sample_rate_absdiff(fmt1, fmt2) ({ \ + unsigned int rate1 = ast_format_get_sample_rate(fmt1); \ + unsigned int rate2 = ast_format_get_sample_rate(fmt2); \ + (rate1 > rate2 ? rate1 - rate2 : rate2 - rate1); \ +}) + /*! \brief Calculate our best translator source format, given costs, and a desired destination */ int ast_translator_best_choice(struct ast_format_cap *dst_cap, struct ast_format_cap *src_cap, @@ -1407,10 +1412,8 @@ int ast_translator_best_choice(struct ast_format_cap *dst_cap, beststeps = matrix_get(x, y)->multistep; } else if (matrix_get(x, y)->table_cost == besttablecost && matrix_get(x, y)->multistep == beststeps) { - int gap_selected = abs(ast_format_get_sample_rate(best) - - ast_format_get_sample_rate(bestdst)); - int gap_current = abs(ast_format_get_sample_rate(src) - - ast_format_get_sample_rate(dst)); + unsigned int gap_selected = format_sample_rate_absdiff(best, bestdst); + unsigned int gap_current = format_sample_rate_absdiff(src, dst); if (gap_current < gap_selected) { /* better than what we have so far */ |