diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c index 3852f6e..c7217c8 100644 --- a/libavcodec/mlpdec.c +++ b/libavcodec/mlpdec.c @@ -28,6 +28,7 @@ #include "avcodec.h" #include "libavutil/intreadwrite.h" +#include "libavutil/channel_layout.h" #include "get_bits.h" #include "internal.h" #include "libavutil/crc.h" @@ -435,6 +436,28 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp, s->ch_assign[ch_assign] = ch; } + if (m->avctx->codec_id == AV_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))