|
|
|
@@ -113,28 +113,11 @@ static const char overread_err[] = "Input buffer exhausted before END element fo |
|
|
|
|
|
|
|
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 @@ static av_cold int output_configure(AACContext *ac, |
|
|
|
} |
|
|
|
|
|
|
|
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 @@ static av_cold int output_configure(AACContext *ac, |
|
|
|
} |
|
|
|
|
|
|
|
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 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
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); |
|
|
|
|