diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index 91efaf3..e6c5c8e 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -30,6 +30,7 @@ #include "dsputil.h" #include "libavutil/intreadwrite.h" #include "get_bits.h" +#include "libavutil/audioconvert.h" #include "libavutil/crc.h" #include "parser.h" #include "mlp_parser.h" @@ -434,6 +435,28 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, s->ch_assign[ch_assign] = ch; } + if (m->avctx->codec_id == CODEC_ID_TRUEHD) { + switch (m->avctx->channel_layout) { + case AV_CH_LAYOUT_6POINT1: + case (AV_CH_LAYOUT_6POINT1|AV_CH_TOP_CENTER): + case (AV_CH_LAYOUT_6POINT1|AV_CH_TOP_FRONT_CENTER): + { + int i = s->ch_assign[6]; + s->ch_assign[6] = s->ch_assign[5]; + s->ch_assign[5] = s->ch_assign[4]; + s->ch_assign[4] = i; + break; + } + case AV_CH_LAYOUT_7POINT1: + case (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER): + FFSWAP(int, s->ch_assign[4], s->ch_assign[6]); + FFSWAP(int, s->ch_assign[5], s->ch_assign[7]); + break; + default: + break; + } + } + checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count); if (checksum != get_bits(gbp, 8))