]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
- If the source has no audio or no video portion, do not call powerof() to
authorRussell Bryant <russell@russellbryant.com>
Thu, 26 Oct 2006 16:31:05 +0000 (16:31 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 26 Oct 2006 16:31:05 +0000 (16:31 +0000)
  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: https://origsvn.digium.com/svn/asterisk/branches/1.4@46329 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/translate.c

index 1e9c1e77bc9fb63741f92e242775f673a4be819d..f538c6b5db12c51ead093c1ad5390395f3b77ad4 100644 (file)
@@ -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;