From: Carl Eugen Hoyos <[email protected]>
This is a squash of the following commits from FFmpeg:
939a12e25d956850613f9c6c416e12de305f444b Fix channel order for some MLP
samples.
0aac0403c54eb7f47d5d707e1368e52763043a69 Map mlp surround channels to
FFmpeg rear channels.
6daf513cf24a99ddddb7e748fc150f37bcd323f3 Fix channel order for 7.1 TrueHD
samples.
b9d8af03270223202c9a991655d3f75b5a8b56b5 mlpdec: fix channel order for wide
7.1 truehd layouts
1af0ace3a4b8aa8c6240a99de3c40f495ab279e9 Fix channel order for some less
common TrueHD layouts.
One fix by Hendrik Leppkes.
Signed-off-by: Derek Buitenhuis <[email protected]>
---
libavcodec/mlpdec.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c
index 30310db..db0a817 100644
--- a/libavcodec/mlpdec.c
+++ b/libavcodec/mlpdec.c
@@ -434,6 +434,33 @@ static int read_restart_header(MLPDecodeContext *m,
GetBitContext *gbp,
s->ch_assign[ch_assign] = ch;
}
+ if (m->avctx->codec_id == CODEC_ID_MLP && m->needs_reordering) {
+ if (m->avctx->channel_layout ==
(AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY) ||
+ m->avctx->channel_layout == AV_CH_LAYOUT_5POINT0_BACK) {
+ int i = s->ch_assign[4];
+ s->ch_assign[4] = s->ch_assign[3];
+ s->ch_assign[3] = s->ch_assign[2];
+ s->ch_assign[2] = i;
+ } else if (m->avctx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) {
+ FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
+ FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
+ }
+ }
+ if (m->avctx->codec_id == CODEC_ID_TRUEHD) {
+ if (m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1 ||
+ m->avctx->channel_layout == AV_CH_LAYOUT_7POINT1_WIDE) {
+ FFSWAP(int, s->ch_assign[4], s->ch_assign[6]);
+ FFSWAP(int, s->ch_assign[5], s->ch_assign[7]);
+ } else if (m->avctx->channel_layout == AV_CH_LAYOUT_6POINT1 ||
+ m->avctx->channel_layout == (AV_CH_LAYOUT_6POINT1 |
AV_CH_TOP_CENTER) ||
+ m->avctx->channel_layout == (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;
+ }
+ }
+
checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
if (checksum != get_bits(gbp, 8))
--
1.7.10
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel