# HG changeset patch # User alexc # Date 1275531469 0 # Node ID 9bdc0fe882fa19c6f576aef4b1c917d7a01ac42b # Parent fd38b5438c2682c80b48cc36aa9d5b0f99beefd7 aacdec: Work around illegal files with all elem_id tags set to the same value. Fixes issue 1882. diff -r fd38b5438c26 -r 9bdc0fe882fa aac.c --- 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); diff -r fd38b5438c26 -r 9bdc0fe882fa aac.h --- 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; /** @} */