ffmpeg: Update to 2.6.9, Add patch to fix AAC decoder performance and memory usage...
authorTed Hess <thess@kitschensync.net>
Fri, 30 Sep 2016 18:48:48 +0000 (14:48 -0400)
committerTed Hess <thess@kitschensync.net>
Fri, 30 Sep 2016 18:48:48 +0000 (14:48 -0400)
Signed-off-by: Ted Hess <thess@kitschensync.net>
multimedia/ffmpeg/Makefile
multimedia/ffmpeg/patches/050-Correctly_map_multichannel_ADTS-AAC.patch [new file with mode: 0644]

index dddb6efbd6f8f816a649941d4054142f0ac286d7..b087fdb10040cf7614fdd9184ea9afe2e309a9fd 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2015 OpenWrt.org
+# Copyright (C) 2006-2016 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=ffmpeg
-PKG_VERSION:=2.6.2
+PKG_VERSION:=2.6.9
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://ffmpeg.org/releases/
-PKG_MD5SUM:=e75d598921285d6775f20164a91936ac
+PKG_MD5SUM:=c3bdcce6f5ea0d138cae57ee38affa39
 PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
 
 PKG_LICENSE:=LGPL-2.1+ GPL-2+ LGPL-3
diff --git a/multimedia/ffmpeg/patches/050-Correctly_map_multichannel_ADTS-AAC.patch b/multimedia/ffmpeg/patches/050-Correctly_map_multichannel_ADTS-AAC.patch
new file mode 100644 (file)
index 0000000..4ef1914
--- /dev/null
@@ -0,0 +1,68 @@
+From 0289f81241e720452b5a77713488d54d3ec252d7 Mon Sep 17 00:00:00 2001
+From: nu774 <honeycomb77@gmail.com>
+Date: Wed, 3 Jun 2015 14:01:32 +0900
+Subject: [PATCH] aac: Correctly map multichannel ADTS AAC with non-zero
+ channel_config + PCE
+
+The decoder assigns channels using default channel configuration
+for 5.1ch when it parses an ADTS frame header using consecutive
+channel ids.
+
+When a PCE comes, it reassigns channels using PCE configuration
+using directly the ids provided. They can be arbitrary.
+
+Always use consecutive channel ids to avoid decoding glitches due
+spurious reconfigurations due the channel ids mismatch between the
+two otherwise-identical channel maps.
+
+Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
+---
+ libavcodec/aacdec.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+--- a/libavcodec/aacdec.c
++++ b/libavcodec/aacdec.c
+@@ -457,12 +457,18 @@ static int output_configure(AACContext *
+     AVCodecContext *avctx = ac->avctx;
+     int i, channels = 0, ret;
+     uint64_t layout = 0;
++    uint8_t id_map[TYPE_END][MAX_ELEM_ID] = {{ 0 }};
++    uint8_t type_counts[TYPE_END] = { 0 };
+     if (ac->oc[1].layout_map != layout_map) {
+         memcpy(ac->oc[1].layout_map, layout_map, tags * sizeof(layout_map[0]));
+         ac->oc[1].layout_map_tags = tags;
+     }
+-
++    for (i = 0; i < tags; i++) {
++        int type =         layout_map[i][0];
++        int id =           layout_map[i][1];
++        id_map[type][id] = type_counts[type]++;
++    }
+     // Try to sniff a reasonable channel order, otherwise output the
+     // channels in the order the PCE declared them.
+     if (avctx->request_channel_layout != AV_CH_LAYOUT_NATIVE)
+@@ -470,12 +476,14 @@ static int output_configure(AACContext *
+     for (i = 0; i < tags; i++) {
+         int type =     layout_map[i][0];
+         int id =       layout_map[i][1];
++        int iid =      id_map[type][id];
+         int position = layout_map[i][2];
+         // Allocate or free elements depending on if they are in the
+         // current program configuration.
+-        ret = che_configure(ac, position, type, id, &channels);
++        ret = che_configure(ac, position, type, iid, &channels);
+         if (ret < 0)
+             return ret;
++        ac->tag_che_map[type][id] = ac->che[type][iid];
+     }
+     if (ac->oc[1].m4ac.ps == 1 && channels == 2) {
+         if (layout == AV_CH_FRONT_CENTER) {
+@@ -485,7 +493,6 @@ static int output_configure(AACContext *
+         }
+     }
+-    memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
+     if (layout) avctx->channel_layout = layout;
+                             ac->oc[1].channel_layout = layout;
+     avctx->channels       = ac->oc[1].channels       = channels;