diff --git a/multimedia/ffmpeg/Makefile b/multimedia/ffmpeg/Makefile index dddb6efbd6..b087fdb100 100644 --- a/multimedia/ffmpeg/Makefile +++ b/multimedia/ffmpeg/Makefile @@ -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 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 index 0000000000..4ef1914866 --- /dev/null +++ b/multimedia/ffmpeg/patches/050-Correctly_map_multichannel_ADTS-AAC.patch @@ -0,0 +1,68 @@ +From 0289f81241e720452b5a77713488d54d3ec252d7 Mon Sep 17 00:00:00 2001 +From: nu774 +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 +--- + 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;