Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

ffmpeg: add backported AAC7.1 patch to patches directory

  • Loading branch information...
commit 4b789ae4bfbb4142d4ed97bb1999055380b6ddc6 1 parent bc7cf68
@anssih anssih authored fritsch committed
View
67 lib/ffmpeg/patches/0060-ffmpeg-backport-avcodec-aacdec-default-to-non-wide-7.patch
@@ -0,0 +1,67 @@
+From 59f16d529fdcb4c5db53ce3bd289aa8148a13de4 Mon Sep 17 00:00:00 2001
+From: Anssi Hannula <anssi.hannula@iki.fi>
+Date: Tue, 17 Dec 2013 23:04:31 +0200
+Subject: [PATCH] [ffmpeg] - backport - avcodec/aacdec: default to non-wide 7.1
+ in non-strict mode
+
+Upstream commit e10fccf62a36e09b54ad6ea3d5fa6638f298d5ae, for
+http://trac.xbmc.org/ticket/13758.
+
+AAC specification has 7.1(wide) as a default layout for 8-channel
+streams (channel config 7). However, at least Nero AAC encoder encodes
+non-wide 7.1 streams using the default channel config 7, mapping the
+side channels of the original audio stream to the second
+AAC_CHANNEL_FRONT pair in the AAC stream. Similarly, e.g. FAAD decodes
+the second AAC_CHANNEL_FRONT pair as side channels, therefore decoding
+the incorrect streams as if they were correct (and as the encoder
+intended).
+
+FFmpeg currently decodes such files by-the-spec, i.e. after decoding the
+original front pair will be in AV_CH_FRONT_x_OF_CENTER and the original
+side pair will be in AV_CH_FRONT_x.
+
+As actual intended 7.1(wide) streams are very rare while misencoded 7.1
+files actually exist in the wild, default to assuming a 7.1 layout was
+intended unless in strict mode.
+
+Fixes playback of e.g. 8_Channel_ID.m4a in samples.
+
+Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
+Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
+---
+ lib/ffmpeg/libavcodec/aacdec.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/lib/ffmpeg/libavcodec/aacdec.c b/lib/ffmpeg/libavcodec/aacdec.c
+index 7a871c4..12dbfcf 100644
+--- a/lib/ffmpeg/libavcodec/aacdec.c
++++ b/lib/ffmpeg/libavcodec/aacdec.c
+@@ -505,6 +505,25 @@ static int set_default_channel_config(AVCodecContext *avctx,
+ }
+ *tags = tags_per_config[channel_config];
+ memcpy(layout_map, aac_channel_layout_map[channel_config-1], *tags * sizeof(*layout_map));
++
++ /*
++ * AAC specification has 7.1(wide) as a default layout for 8-channel streams.
++ * However, at least Nero AAC encoder encodes 7.1 streams using the default
++ * channel config 7, mapping the side channels of the original audio stream
++ * to the second AAC_CHANNEL_FRONT pair in the AAC stream. Similarly, e.g. FAAD
++ * decodes the second AAC_CHANNEL_FRONT pair as side channels, therefore decoding
++ * the incorrect streams as if they were correct (and as the encoder intended).
++ *
++ * As actual intended 7.1(wide) streams are very rare, default to assuming a
++ * 7.1 layout was intended.
++ */
++ if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) {
++ av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
++ " instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode"
++ " according to the specification instead.\n", FF_COMPLIANCE_STRICT);
++ layout_map[2][2] = AAC_CHANNEL_SIDE;
++ }
++
+ return 0;
+ }
+
+--
+1.8.1.5
+
Please sign in to comment.
Something went wrong with that request. Please try again.