aboutsummaryrefslogtreecommitdiffstats
path: root/main/translate.c
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-26 16:31:05 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-26 16:31:05 +0000
commitfbfac7fe03ad37e88c95c273b6090f71c8c3c478 (patch)
tree581a4d83b4746cca8cb39ba9bfded4fd26f4bb07 /main/translate.c
parent8cdfdd40ca0c679573c48305502564c64c1f4cfc (diff)
- If the source has no audio or no video portion, do not call powerof() to
get the format index. - Don't run through the audio and video loops if there is no audio or video portion of the source If 0 is passed to powerof, it will return -1. This value of -1 was then being used as an array index in these loops, which caused a crash on some systems. Other than this issue, this code works as we expected it to. If a format is not in the source, and we have to translation path to it, it is not offered in the list of acceptable destination formats. (fixes issue #8231) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@46329 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/translate.c')
-rw-r--r--main/translate.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/main/translate.c b/main/translate.c
index 1e9c1e77b..f538c6b5d 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -814,17 +814,29 @@ unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src
{
unsigned int res = dest;
unsigned int x;
- unsigned int src_audio = powerof(src & AST_FORMAT_AUDIO_MASK);
- unsigned int src_video = powerof(src & AST_FORMAT_VIDEO_MASK);
+ unsigned int src_audio = src & AST_FORMAT_AUDIO_MASK;
+ unsigned int src_video = src & AST_FORMAT_VIDEO_MASK;
/* if we don't have a source format, we just have to try all
possible destination formats */
if (!src)
return dest;
+ /* If we have a source audio format, get its format index */
+ if (src_audio)
+ src_audio = powerof(src_audio);
+
+ /* If we have a source video format, get its format index */
+ if (src_video)
+ src_video = powerof(src_video);
+
AST_LIST_LOCK(&translators);
- for (x = 1; x < AST_FORMAT_MAX_AUDIO; x <<= 1) {
+ /* For a given source audio format, traverse the list of
+ known audio formats to determine whether there exists
+ a translation path from the source format to the
+ destination format. */
+ for (x = 1; src_audio && x < AST_FORMAT_MAX_AUDIO; x <<= 1) {
/* if this is not a desired format, nothing to do */
if (!dest & x)
continue;
@@ -840,8 +852,11 @@ unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src
res &= ~x;
}
- /* roll over into video formats */
- for (; x < AST_FORMAT_MAX_VIDEO; x <<= 1) {
+ /* For a given source video format, traverse the list of
+ known video formats to determine whether there exists
+ a translation path from the source format to the
+ destination format. */
+ for (; src_video && x < AST_FORMAT_MAX_VIDEO; x <<= 1) {
/* if this is not a desired format, nothing to do */
if (!dest & x)
continue;