changeset 11819:9bdc0fe882fa libavcodec

aacdec: Work around illegal files with all elem_id tags set to the same value. Fixes issue 1882.
author alexc
date Thu, 03 Jun 2010 02:17:49 +0000
parents fd38b5438c26
children f0aac2d7e335
files aac.c aac.h
diffstat 2 files changed, 18 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/aac.c	Wed Jun 02 22:41:32 2010 +0000
+++ b/aac.c	Thu Jun 03 02:17:49 2010 +0000
@@ -113,6 +113,22 @@
 
 static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
 {
+    /* Some buggy encoders appear to set all elem_ids to zero and rely on
+    channels always occurring in the same order. This is expressly forbidden
+    by the spec but we will try to work around it.
+    */
+    int err_printed = 0;
+    while (ac->tags_seen_this_frame[type][elem_id] && elem_id < MAX_ELEM_ID) {
+        if (ac->output_configured < OC_LOCKED && !err_printed) {
+            av_log(ac->avccontext, AV_LOG_WARNING, "Duplicate channel tag found, attempting to remap.\n");
+            err_printed = 1;
+        }
+        elem_id++;
+    }
+    if (elem_id == MAX_ELEM_ID)
+        return NULL;
+    ac->tags_seen_this_frame[type][elem_id] = 1;
+
     if (ac->tag_che_map[type][elem_id]) {
         return ac->tag_che_map[type][elem_id];
     }
@@ -1969,6 +1985,7 @@
         }
     }
 
+    memset(ac->tags_seen_this_frame, 0, sizeof(ac->tags_seen_this_frame));
     // parse
     while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
         elem_id = get_bits(&gb, 4);
--- a/aac.h	Wed Jun 02 22:41:32 2010 +0000
+++ b/aac.h	Thu Jun 03 02:17:49 2010 +0000
@@ -257,6 +257,7 @@
                                                    */
     ChannelElement * che[4][MAX_ELEM_ID];
     ChannelElement * tag_che_map[4][MAX_ELEM_ID];
+    uint8_t tags_seen_this_frame[4][MAX_ELEM_ID];
     int tags_mapped;
     /** @} */