diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-10-26 16:35:34 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-10-26 16:35:34 +0000 |
commit | c20e95709085540ac6e3a5bc013a8020f18ee377 (patch) | |
tree | 6c31b1171ce70639067b6401da70a67e54b51f20 /main/translate.c | |
parent | 88fc4c588b04a3731bae3421766753a4eec3fe03 (diff) |
Merged revisions 46329 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r46329 | russell | 2006-10-26 11:31:05 -0500 (Thu, 26 Oct 2006) | 11 lines
- 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/trunk@46330 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/translate.c')
-rw-r--r-- | main/translate.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/main/translate.c b/main/translate.c index bdee23e8d..189a9d839 100644 --- a/main/translate.c +++ b/main/translate.c @@ -740,17 +740,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; @@ -766,8 +778,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; |