[FFmpeg-cvslog] r25098 - in trunk/libavcodec: aac.h aacdec.c
alexc
subversion
Fri Sep 10 20:01:48 CEST 2010
Author: alexc
Date: Fri Sep 10 20:01:48 2010
New Revision: 25098
Log:
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.
Modified:
trunk/libavcodec/aac.h
trunk/libavcodec/aacdec.c
Modified: trunk/libavcodec/aac.h
==============================================================================
--- trunk/libavcodec/aac.h Fri Sep 10 19:44:08 2010 (r25097)
+++ trunk/libavcodec/aac.h Fri Sep 10 20:01:48 2010 (r25098)
@@ -251,7 +251,6 @@ typedef struct {
*/
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;
/** @} */
Modified: trunk/libavcodec/aacdec.c
==============================================================================
--- trunk/libavcodec/aacdec.c Fri Sep 10 19:44:08 2010 (r25097)
+++ trunk/libavcodec/aacdec.c Fri Sep 10 20:01:48 2010 (r25098)
@@ -113,28 +113,11 @@ static const char overread_err[] = "Inpu
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(AACC
}
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(AACC
}
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(AVCodecConte
}
}
- 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);
More information about the ffmpeg-cvslog
mailing list