# HG changeset patch # User alexc # Date 1284141708 0 # Node ID 0159a19bfff734cd0a7b088d66bd7df1f8c8f22a # Parent 8cafb4db28cb03a75d8eaa65a726f7b26e6ed994 aacdec: Rework channel mapping compatibility hacks. For a PCE based configuration map the channels solely based on tags. For an indexed configuration map the channels solely based on position. This works with all known exotic samples including al17, elem_id0, bad_concat, and lfe_is_sce. diff -r 8cafb4db28cb -r 0159a19bfff7 aac.h --- a/aac.h Fri Sep 10 17:33:31 2010 +0000 +++ b/aac.h Fri Sep 10 18:01:48 2010 +0000 @@ -251,7 +251,6 @@ */ 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; /** @} */ diff -r 8cafb4db28cb -r 0159a19bfff7 aacdec.c --- a/aacdec.c Fri Sep 10 17:33:31 2010 +0000 +++ b/aacdec.c Fri Sep 10 18:01:48 2010 +0000 @@ -113,28 +113,11 @@ 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->avctx, 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]) { + // For PCE based channel configurations map the channels solely based on tags. + if (!ac->m4ac.chan_config) { return ac->tag_che_map[type][elem_id]; } - if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) { - return NULL; - } + // For indexed channel configurations map the channels solely based on position. switch (ac->m4ac.chan_config) { case 7: if (ac->tags_mapped == 3 && type == TYPE_CPE) { @@ -242,7 +225,6 @@ } memset(ac->tag_che_map, 0, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); - ac->tags_mapped = 0; avctx->channel_layout = aac_channel_layout[channel_config - 1]; } else { @@ -263,7 +245,6 @@ } memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); - ac->tags_mapped = 4 * MAX_ELEM_ID; avctx->channel_layout = 0; } @@ -1964,7 +1945,7 @@ } } - memset(ac->tags_seen_this_frame, 0, sizeof(ac->tags_seen_this_frame)); + ac->tags_mapped = 0; // parse while ((elem_type = get_bits(&gb, 3)) != TYPE_END) { elem_id = get_bits(&gb, 4);