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

Reply via email to