From 17db313334d564b34e00154e6d3d5cf6163c13fb Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Mon, 23 Mar 2015 17:12:31 +0000
Subject: [PATCH 1/6] [ffmpeg] Add support for libdcadec

---
 Makefile.in                                        |   2 +-
 configure.ac                                       |   4 +
 tools/depends/target/Makefile                      |   4 +-
 .../0001-avcodec-add-libdcadec-decoder.patch       | 280 +++++++++++++++++++++
 .../0002-avcodec-Fix-libdcadec-include-dir.patch   |  40 +++
 ...vcodec-add-profile-define-for-DTS-Express.patch |  25 ++
 tools/depends/target/ffmpeg/Makefile               |   7 +-
 tools/depends/target/libdcadec/Makefile            |  38 +++
 8 files changed, 396 insertions(+), 4 deletions(-)
 create mode 100644 tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch
 create mode 100644 tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch
 create mode 100644 tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch
 create mode 100644 tools/depends/target/libdcadec/Makefile

diff --git a/Makefile.in b/Makefile.in
index 7ed7c37..4a8aeef 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -445,7 +445,7 @@ FFMPEGOBJS = @FFMPEG_LIBDIR@/libavcodec.a \
              @FFMPEG_LIBDIR@/libpostproc.a \
              @FFMPEG_LIBDIR@/libswscale.a
 DYNOBJSXBMC+= $(FFMPEGOBJS)
-LIBS+= @GNUTLS_ALL_LIBS@ @VORBISENC_ALL_LIBS@
+LIBS+= @GNUTLS_ALL_LIBS@ @VORBISENC_ALL_LIBS@ @DCADEC_ALL_LIBS@
 
 $(FFMPEGOBJS): dvdpcodecs
 endif
diff --git a/configure.ac b/configure.ac
index cf18212..ad9ae6d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1088,6 +1088,7 @@ AC_CHECK_HEADER([mpeg2dec/mpeg2convert.h],, AC_MSG_ERROR($missing_library),
 AC_CHECK_HEADER([jpeglib.h],,        AC_MSG_ERROR($missing_library))
 AC_CHECK_HEADER([ogg/ogg.h],,        AC_MSG_ERROR($missing_library))
 AC_CHECK_HEADER([vorbis/vorbisfile.h],, AC_MSG_ERROR($missing_library))
+AC_CHECK_HEADER([libdcadec/dca_context.h],, AC_MSG_ERROR($missing_library))
 
 PKG_CHECK_MODULES([LIBCURL], [libcurl],, AC_MSG_ERROR([libcurl not found]))
 XB_FIND_SONAME([CURL], [curl])
@@ -1119,6 +1120,7 @@ PKG_CHECK_MODULES([GNUTLS], [gnutls], [have_gnutls=yes];AC_DEFINE([HAVE_GNUTLS],
 AC_CHECK_LIB([bz2],         [main],, AC_MSG_ERROR($missing_library))
 AC_CHECK_LIB([jpeg],        [main],, AC_MSG_ERROR($missing_library)) # check for cximage
 AC_CHECK_LIB([tiff],        [main],, AC_MSG_ERROR($missing_library))
+AC_CHECK_LIB([dcadec],      [main],, AC_MSG_ERROR($missing_library))
 if echo "$ARCH" | grep -q freebsd; then
 AC_CHECK_LIB([pthread],     [main],LIBS="-pthread $LIBS", AC_MSG_ERROR($missing_library))
 AC_CHECK_LIB([pthread],     [pthread_set_name_np],
@@ -1806,6 +1808,7 @@ if test "${USE_STATIC_FFMPEG}" = "1"; then
   FFMPEG_LIBDIR=${pkg_cfg_prefix}$(PKG_CONFIG_SYSROOT_DIR="" ${PKG_CONFIG} --static --variable=libdir libavcodec)
   GNUTLS_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors gnutls)
   VORBISENC_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors vorbisenc)
+  DCADEC_ALL_LIBS=$(${PKG_CONFIG} --static --libs-only-l --silence-errors dcadec)
 
   # check if static libs are available
   for ff_lib in ${ff_libs}; do
@@ -2630,6 +2633,7 @@ AC_SUBST(FFMPEG_LIBDIR)
 AC_SUBST(USE_STATIC_FFMPEG)
 AC_SUBST(GNUTLS_ALL_LIBS)
 AC_SUBST(VORBISENC_ALL_LIBS)
+AC_SUBST(DCADEC_ALL_LIBS)
 AC_SUBST(USE_TOUCH_SKIN)
 AC_SUBST(USE_LIBAV_HACKS)
 AC_SUBST(PYTHON_VERSION)
diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile
index 915de85..5d85ca8 100644
--- a/tools/depends/target/Makefile
+++ b/tools/depends/target/Makefile
@@ -15,7 +15,7 @@ DEPENDS = \
 	python26 libshairplay \
 	libplist libcec libbluray boost tinyxml dummy-libxbmc \
 	libamplayer libssh taglib libusb libnfs libmp3lame \
-	pythonmodule-pil libxslt ffmpeg platform
+	pythonmodule-pil libxslt ffmpeg platform libdcadec
 
 FFMPEG_DEPENDS = gnutls
 
@@ -96,7 +96,7 @@ nettle: gmp
 pythonmodule-pil: $(ZLIB) libjpeg-turbo libpng freetype2 python26
 libsdl2: $(LINUX_SYSTEM_LIBS)
 libxslt: libgcrypt
-ffmpeg: $(ICONV) $(ZLIB) bzip2 libvorbis $(FFMPEG_DEPENDS)
+ffmpeg: $(ICONV) $(ZLIB) bzip2 libvorbis libdcadec $(FFMPEG_DEPENDS)
 libcec: platform
 
 .installed-$(PLATFORM): $(DEPENDS)
diff --git a/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch b/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch
new file mode 100644
index 0000000..c0c2ac1
--- /dev/null
+++ b/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch
@@ -0,0 +1,280 @@
+From 519868de7d9c99876efcaf57d6a9683c22732cde Mon Sep 17 00:00:00 2001
+From: Hendrik Leppkes <h.leppkes@gmail.com>
+Date: Thu, 19 Mar 2015 23:56:22 +0100
+Subject: [PATCH] avcodec: add libdcadec decoder
+
+Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
+---
+ configure              |   4 +
+ libavcodec/Makefile    |   1 +
+ libavcodec/allcodecs.c |   1 +
+ libavcodec/libdcadec.c | 197 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 203 insertions(+)
+ create mode 100644 libavcodec/libdcadec.c
+
+diff --git a/configure b/configure
+index 1bf8f80..a449bc7 100755
+--- a/configure
++++ b/configure
+@@ -210,6 +210,7 @@ External library support:
+   --enable-libcdio         enable audio CD grabbing with libcdio [no]
+   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
+                            and libraw1394 [no]
++  --enable-libdcadec       enable DCA decoding via libdcadec [no]
+   --enable-libfaac         enable AAC encoding via libfaac [no]
+   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
+   --enable-libflite        enable flite (voice synthesis) support via libflite [no]
+@@ -1353,6 +1354,7 @@ EXTERNAL_LIBRARY_LIST="
+     libcdio
+     libcelt
+     libdc1394
++    libdcadec
+     libfaac
+     libfdk_aac
+     libflite
+@@ -2359,6 +2361,7 @@ vc1_parser_select="mpegvideo startcode vc1_decoder"
+ # external libraries
+ libaacplus_encoder_deps="libaacplus"
+ libcelt_decoder_deps="libcelt"
++libdcadec_decoder_deps="libdcadec"
+ libfaac_encoder_deps="libfaac"
+ libfaac_encoder_select="audio_frame_queue"
+ libfdk_aac_decoder_deps="libfdk_aac"
+@@ -4922,6 +4925,7 @@ enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
+                              { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
+                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
+ enabled libcaca           && require_pkg_config caca caca.h caca_create_canvas
++enabled libdcadec         && require libdcadec dca_context.h dcadec_context_create -ldcadec
+ enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
+ enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
+ flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
+diff --git a/libavcodec/Makefile b/libavcodec/Makefile
+index 4173f88..1a0c734 100644
+--- a/libavcodec/Makefile
++++ b/libavcodec/Makefile
+@@ -732,6 +732,7 @@ OBJS-$(CONFIG_ELBG_FILTER)             += elbg.o
+ # external codec libraries
+ OBJS-$(CONFIG_LIBAACPLUS_ENCODER)         += libaacplus.o
+ OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
++OBJS-$(CONFIG_LIBDCADEC_DECODER)          += libdcadec.o
+ OBJS-$(CONFIG_LIBFAAC_ENCODER)            += libfaac.o
+ OBJS-$(CONFIG_LIBFDK_AAC_DECODER)         += libfdk-aacdec.o
+ OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)         += libfdk-aacenc.o
+diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
+index 5194e74..bbf70a6 100644
+--- a/libavcodec/allcodecs.c
++++ b/libavcodec/allcodecs.c
+@@ -512,6 +512,7 @@ void avcodec_register_all(void)
+ 
+     /* external libraries */
+     REGISTER_DECODER(LIBCELT,           libcelt);
++    REGISTER_DECODER(LIBDCADEC,         libdcadec)
+     REGISTER_ENCODER(LIBFAAC,           libfaac);
+     REGISTER_ENCDEC (LIBFDK_AAC,        libfdk_aac);
+     REGISTER_ENCDEC (LIBGSM,            libgsm);
+diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c
+new file mode 100644
+index 0000000..d060db5
+--- /dev/null
++++ b/libavcodec/libdcadec.c
+@@ -0,0 +1,197 @@
++/*
++ * libdcadec decoder wrapper
++ * Copyright (C) 2015 Hendrik Leppkes
++ *
++ * This file is part of FFmpeg.
++ *
++ * FFmpeg is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * FFmpeg is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <dca_context.h>
++
++#include "libavutil/avassert.h"
++#include "libavutil/channel_layout.h"
++#include "libavutil/common.h"
++#include "libavutil/opt.h"
++#include "avcodec.h"
++#include "dca.h"
++#include "dca_syncwords.h"
++#include "internal.h"
++
++typedef struct DCADecContext {
++    struct dcadec_context *ctx;
++    uint8_t *buffer;
++    int buffer_size;
++} DCADecContext;
++
++static int dcadec_decode_frame(AVCodecContext *avctx, void *data,
++                               int *got_frame_ptr, AVPacket *avpkt)
++{
++    DCADecContext *s = avctx->priv_data;
++    AVFrame *frame = data;
++    int ret, i, k;
++    int **samples, nsamples, channel_mask, sample_rate, bits_per_sample, profile;
++    uint32_t mrk;
++    uint8_t *input = avpkt->data;
++    int input_size = avpkt->size;
++
++    /* convert bytestream syntax to RAW BE format if required */
++    mrk = AV_RB32(input);
++    if (mrk != DCA_SYNCWORD_CORE_BE && mrk != DCA_SYNCWORD_SUBSTREAM) {
++        s->buffer = av_fast_realloc(s->buffer, &s->buffer_size, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
++        if (!s->buffer)
++            return AVERROR(ENOMEM);
++
++        if ((ret = avpriv_dca_convert_bitstream(avpkt->data, avpkt->size, s->buffer, s->buffer_size)) < 0)
++            return ret;
++
++        input      = s->buffer;
++        input_size = ret;
++    }
++
++    if ((ret = dcadec_context_parse(s->ctx, input, input_size)) < 0) {
++        av_log(avctx, AV_LOG_ERROR, "dcadec_context_parse() failed: %d (%s)\n", -ret, dcadec_strerror(ret));
++        return AVERROR_EXTERNAL;
++    }
++    if ((ret = dcadec_context_filter(s->ctx, &samples, &nsamples, &channel_mask,
++                                     &sample_rate, &bits_per_sample, &profile)) < 0) {
++        av_log(avctx, AV_LOG_ERROR, "dcadec_context_filter() failed: %d (%s)\n", -ret, dcadec_strerror(ret));
++        return AVERROR_EXTERNAL;
++    }
++
++    avctx->channels       = av_get_channel_layout_nb_channels(channel_mask);
++    avctx->channel_layout = channel_mask;
++    avctx->sample_rate    = sample_rate;
++
++    av_assert0(bits_per_sample >= 16 && bits_per_sample <= 24);
++    if (bits_per_sample == 16)
++        avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
++    else
++        avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
++
++    avctx->bits_per_raw_sample = bits_per_sample;
++
++    switch (profile) {
++    case DCADEC_PROFILE_DS:
++        avctx->profile = FF_PROFILE_DTS;
++        break;
++    case DCADEC_PROFILE_DS_96_24:
++        avctx->profile = FF_PROFILE_DTS_96_24;
++        break;
++    case DCADEC_PROFILE_DS_ES:
++        avctx->profile = FF_PROFILE_DTS_ES;
++        break;
++    case DCADEC_PROFILE_HD_HRA:
++        avctx->profile = FF_PROFILE_DTS_HD_HRA;
++        break;
++    case DCADEC_PROFILE_HD_MA:
++        avctx->profile = FF_PROFILE_DTS_HD_MA;
++        break;
++    case DCADEC_PROFILE_EXPRESS:
++        avctx->profile = FF_PROFILE_DTS_EXPRESS;
++        break;
++    case DCADEC_PROFILE_UNKNOWN:
++    default:
++        avctx->profile = FF_PROFILE_UNKNOWN;
++        break;
++    }
++
++    /* bitrate is only meaningful if there are no HD extensions, as they distort the bitrate */
++    if (profile == DCADEC_PROFILE_DS || profile == DCADEC_PROFILE_DS_96_24 || profile == DCADEC_PROFILE_DS_ES) {
++        struct dcadec_core_info *info = dcadec_context_get_core_info(s->ctx);
++        avctx->bit_rate = info->bit_rate;
++        dcadec_context_free_core_info(info);
++    } else
++        avctx->bit_rate = 0;
++
++    frame->nb_samples = nsamples;
++    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
++        return ret;
++
++    for (i = 0; i < avctx->channels; i++) {
++        if (frame->format == AV_SAMPLE_FMT_S16P) {
++            int16_t *plane = (int16_t *)frame->extended_data[i];
++            for (k = 0; k < nsamples; k++)
++                plane[k] = samples[i][k];
++        } else {
++            int32_t *plane = (int32_t *)frame->extended_data[i];
++            int shift = 32 - bits_per_sample;
++            for (k = 0; k < nsamples; k++)
++                plane[k] = samples[i][k] << shift;
++        }
++    }
++
++    *got_frame_ptr = 1;
++
++    return avpkt->size;
++}
++
++static av_cold void dcadec_flush(AVCodecContext *avctx)
++{
++    DCADecContext *s = avctx->priv_data;
++    dcadec_context_clear(s->ctx);
++}
++
++static av_cold int dcadec_close(AVCodecContext *avctx)
++{
++    DCADecContext *s = avctx->priv_data;
++
++    dcadec_context_destroy(s->ctx);
++    s->ctx = NULL;
++
++    av_freep(&s->buffer);
++
++    return 0;
++}
++
++static av_cold int dcadec_init(AVCodecContext *avctx)
++{
++    DCADecContext *s = avctx->priv_data;
++
++    s->ctx = dcadec_context_create(0);
++    if (!s->ctx)
++        return AVERROR(ENOMEM);
++
++    avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
++    avctx->bits_per_raw_sample = 24;
++
++    return 0;
++}
++
++static const AVProfile profiles[] = {
++    { FF_PROFILE_DTS,         "DTS"         },
++    { FF_PROFILE_DTS_ES,      "DTS-ES"      },
++    { FF_PROFILE_DTS_96_24,   "DTS 96/24"   },
++    { FF_PROFILE_DTS_HD_HRA,  "DTS-HD HRA"  },
++    { FF_PROFILE_DTS_HD_MA,   "DTS-HD MA"   },
++    { FF_PROFILE_DTS_EXPRESS, "DTS Express" },
++    { FF_PROFILE_UNKNOWN },
++};
++
++AVCodec ff_libdcadec_decoder = {
++    .name           = "libdcadec",
++    .long_name      = NULL_IF_CONFIG_SMALL("dcadec DCA decoder"),
++    .type           = AVMEDIA_TYPE_AUDIO,
++    .id             = AV_CODEC_ID_DTS,
++    .priv_data_size = sizeof(DCADecContext),
++    .init           = dcadec_init,
++    .decode         = dcadec_decode_frame,
++    .close          = dcadec_close,
++    .flush          = dcadec_flush,
++    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_CHANNEL_CONF,
++    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_S16P,
++                                                      AV_SAMPLE_FMT_NONE },
++    .profiles       = NULL_IF_CONFIG_SMALL(profiles),
++};
+-- 
+1.9.1
+
diff --git a/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch b/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch
new file mode 100644
index 0000000..b4db15d
--- /dev/null
+++ b/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch
@@ -0,0 +1,40 @@
+From 4f3c31df3f569c7171ee9e651ddf479690367b9b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= <kasper93@gmail.com>
+Date: Fri, 20 Mar 2015 01:58:25 +0100
+Subject: [PATCH] avcodec: Fix libdcadec include dir
+
+Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
+---
+ configure              | 2 +-
+ libavcodec/libdcadec.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure b/configure
+index a449bc7..1ef83e3 100755
+--- a/configure
++++ b/configure
+@@ -4925,7 +4925,7 @@ enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
+                              { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
+                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
+ enabled libcaca           && require_pkg_config caca caca.h caca_create_canvas
+-enabled libdcadec         && require libdcadec dca_context.h dcadec_context_create -ldcadec
++enabled libdcadec         && require libdcadec libdcadec/dca_context.h dcadec_context_create -ldcadec
+ enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
+ enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
+ flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
+diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c
+index d060db5..a28b983 100644
+--- a/libavcodec/libdcadec.c
++++ b/libavcodec/libdcadec.c
+@@ -19,7 +19,7 @@
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ 
+-#include <dca_context.h>
++#include <libdcadec/dca_context.h>
+ 
+ #include "libavutil/avassert.h"
+ #include "libavutil/channel_layout.h"
+-- 
+1.9.1
+
diff --git a/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch b/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch
new file mode 100644
index 0000000..1550538
--- /dev/null
+++ b/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch
@@ -0,0 +1,25 @@
+From 11fe56c8bbf39cd0c3edbf0cd404dea400ff7e0c Mon Sep 17 00:00:00 2001
+From: Hendrik Leppkes <h.leppkes@gmail.com>
+Date: Thu, 19 Mar 2015 23:45:39 +0100
+Subject: [PATCH] avcodec: add profile define for DTS Express
+
+Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
+---
+ libavcodec/avcodec.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
+index cdc8aa1..48e212f 100644
+--- a/libavcodec/avcodec.h
++++ b/libavcodec/avcodec.h
+@@ -2851,6 +2851,7 @@ typedef struct AVCodecContext {
+ #define FF_PROFILE_DTS_96_24   40
+ #define FF_PROFILE_DTS_HD_HRA  50
+ #define FF_PROFILE_DTS_HD_MA   60
++#define FF_PROFILE_DTS_EXPRESS 70
+ 
+ #define FF_PROFILE_MPEG2_422    0
+ #define FF_PROFILE_MPEG2_HIGH   1
+-- 
+1.9.1
+
diff --git a/tools/depends/target/ffmpeg/Makefile b/tools/depends/target/ffmpeg/Makefile
index 711182f..24480b2 100644
--- a/tools/depends/target/ffmpeg/Makefile
+++ b/tools/depends/target/ffmpeg/Makefile
@@ -1,6 +1,7 @@
 include ../../Makefile.include
 include FFMPEG-VERSION
-DEPS= ../../Makefile.include FFMPEG-VERSION Makefile
+DEPS= ../../Makefile.include FFMPEG-VERSION Makefile \
+  0001-avcodec-add-libdcadec-decoder.patch  0002-avcodec-Fix-libdcadec-include-dir.patch 0003-avcodec-add-profile-define-for-DTS-Express.patch
 
 # set to "yes" to enable patching
 # we don't apply patches until we move to a vanilla ffmpeg tarball
@@ -55,6 +56,7 @@ endif
 ifeq ($(Configuration), Release)
   ffmpg_config += --disable-debug
 endif
+ffmpg_config += --enable-libdcadec --disable-decoder=dca
 
 
 CLEAN_FILES=$(ARCHIVE) $(PLATFORM)
@@ -68,6 +70,9 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
 	rm -rf $(PLATFORM); mkdir -p $(PLATFORM)
 	cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
 	cd $(PLATFORM); sed -i".bak" -e "s%pkg_config_default=pkg-config%export PKG_CONFIG_LIBDIR=$(PREFIX)/lib/pkgconfig \&\& pkg_config_default=$(NATIVEPREFIX)/bin/pkg-config%" configure
+	cd $(PLATFORM); patch -p1 < ../0001-avcodec-add-libdcadec-decoder.patch
+	cd $(PLATFORM); patch -p1 < ../0002-avcodec-Fix-libdcadec-include-dir.patch
+	cd $(PLATFORM); patch -p1 < ../0003-avcodec-add-profile-define-for-DTS-Express.patch
 	cd $(PLATFORM);\
 	CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" \
 	./configure $(ffmpg_config)
diff --git a/tools/depends/target/libdcadec/Makefile b/tools/depends/target/libdcadec/Makefile
new file mode 100644
index 0000000..e68ec46
--- /dev/null
+++ b/tools/depends/target/libdcadec/Makefile
@@ -0,0 +1,38 @@
+include ../../Makefile.include
+DEPS= ../../Makefile.include Makefile
+
+# lib name, version
+LIBNAME=dcadec
+ARCHIVE=master.tar.gz
+BASE_URL=https://github.com/foo86/dcadec/archive
+
+# configuration settings
+
+LIBDYLIB=$(PLATFORM)/.libs/lib$(LIBNAME).a
+
+CLEAN_FILES=$(ARCHIVE) $(PLATFORM)
+
+CFLAGS += -std=gnu99
+
+all: $(LIBDYLIB) .installed-$(PLATFORM)
+
+$(TARBALLS_LOCATION)/$(ARCHIVE):
+	cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE)
+
+$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
+	rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM)
+	cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
+
+$(LIBDYLIB): $(PLATFORM)
+	$(MAKE) -C $(PLATFORM) PREFIX=$(PREFIX) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" AR="$(AR)"
+
+.installed-$(PLATFORM): $(LIBDYLIB)
+	$(MAKE) -C $(PLATFORM) PREFIX=$(PREFIX) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" AR="$(AR)" install
+	touch $@
+
+clean:
+	$(MAKE) -C $(PLATFORM) clean
+	rm -f .installed-$(PLATFORM)
+
+distclean::
+	rm -rf $(PLATFORM) .installed-$(PLATFORM)

From bdf128de10eb980a68d8382df8f8621a61e020d1 Mon Sep 17 00:00:00 2001
From: fritsch <peter.fruehberger@gmail.com>
Date: Mon, 23 Mar 2015 22:33:04 +0000
Subject: [PATCH 2/6] [dcadec] Add settings option to enable libdcadec

---
 addons/resource.language.en_gb/resources/strings.po  | 10 ++++++++++
 system/settings/imx6.xml                             | 20 ++++++++++++++++++++
 system/settings/rbp.xml                              |  5 +++++
 system/settings/rbp2.xml                             |  5 +++++
 tools/depends/target/ffmpeg/Makefile                 |  2 +-
 .../DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp          | 14 ++++++++++++--
 xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp  | 15 +++++++++++++++
 xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp            | 10 ++++++++--
 8 files changed, 76 insertions(+), 5 deletions(-)

diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index 6a6f0a3..3ab966d 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -16541,3 +16541,13 @@ msgstr ""
 msgctxt "#38016"
 msgid "%d fps"
 msgstr ""
+
+#: system/settings/rbp.xml system/settings/imx6.xml
+msgctxt "#38120"
+msgid "Support 8 channel DTS-HD audio decoding"
+msgstr ""
+
+#: system/settings/rbp.xml system/settings/imx6.xml
+msgctxt "#38121"
+msgid "Enables decoding of high quality DTS-HD audio streams. Note: This increases CPU load and is only available when DTS and DTS-HD audio passthrough are disabled."
+msgstr ""
diff --git a/system/settings/imx6.xml b/system/settings/imx6.xml
index d8b17c3..bdb5eb8 100644
--- a/system/settings/imx6.xml
+++ b/system/settings/imx6.xml
@@ -13,6 +13,26 @@
         </setting>
       </group>
     </category>
+    <category id="audiooutput">
+      <group id="1">
+        <setting id="audiooutput.supportdtshdcpudecoding" type="boolean" label="38120" help="38121">
+          <level>2</level>
+          <default>false</default>
+          <control type="toggle" />
+          <dependencies>
+            <dependency type="enable">
+            <or>
+              <condition setting="audiooutput.passthrough" operator="is">false</condition>
+              <and>
+                <condition setting="audiooutput.dtshdpassthrough" operator="is">false</condition>
+                <condition setting="audiooutput.dtspassthrough" operator="is">false</condition>
+              </and>
+            </or>
+            </dependency>
+          </dependencies>
+        </setting>
+      </group>
+    </category>
   </section>
   <section id="videos">
     <category id="videoacceleration">
diff --git a/system/settings/rbp.xml b/system/settings/rbp.xml
index 50fe36a..52703e9 100644
--- a/system/settings/rbp.xml
+++ b/system/settings/rbp.xml
@@ -76,6 +76,11 @@
         <setting id="audiooutput.processquality">
           <default>101</default> <!-- AE_QUALITY_GPU -->
         </setting>
+        <setting id="audiooutput.supportdtshdcpudecoding" type="boolean" label="38120" help="38121">
+          <level>2</level>
+          <default>false</default>
+          <control type="toggle" />
+        </setting>
       </group>
       <group id="3">
         <setting id="audiooutput.ac3transcode" help="37024">
diff --git a/system/settings/rbp2.xml b/system/settings/rbp2.xml
index 8cc8f19..b29a428 100644
--- a/system/settings/rbp2.xml
+++ b/system/settings/rbp2.xml
@@ -19,6 +19,11 @@
       </group>
     </category>
     <category id="audiooutput">
+      <group id="1">
+        <setting id="audiooutput.supportdtshdcpudecoding">
+          <default>true</default>
+        </setting>
+      </group>
       <group id="3">
         <setting id="audiooutput.ac3transcode" help="36429">
         </setting>
diff --git a/tools/depends/target/ffmpeg/Makefile b/tools/depends/target/ffmpeg/Makefile
index 24480b2..1e20602 100644
--- a/tools/depends/target/ffmpeg/Makefile
+++ b/tools/depends/target/ffmpeg/Makefile
@@ -56,7 +56,7 @@ endif
 ifeq ($(Configuration), Release)
   ffmpg_config += --disable-debug
 endif
-ffmpg_config += --enable-libdcadec --disable-decoder=dca
+ffmpg_config += --enable-libdcadec
 
 
 CLEAN_FILES=$(ARCHIVE) $(PLATFORM)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp
index 991449b..e6553dd 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp
@@ -33,6 +33,7 @@ extern "C" {
 #include "settings/Settings.h"
 #include "cores/AudioEngine/Utils/AEUtil.h"
 #endif
+#include "settings/Settings.h"
 
 CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec()
 {
@@ -54,10 +55,19 @@ CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg()
 
 bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
 {
-  AVCodec* pCodec;
+  AVCodec* pCodec = NULL;
   m_bOpenedCodec = false;
 
-  pCodec = avcodec_find_decoder(hints.codec);
+  bool allow_dtshd_decoding = true;
+#if defined(TARGET_RASPBERRY_PI) || defined(HAS_IMXVPU) || defined(HAS_LIBAMCODEC)
+  allow_dtshd_decoding = CSettings::Get().GetBool("audiooutput.supportdtshdcpudecoding");
+#endif
+  if (hints.codec == AV_CODEC_ID_DTS && allow_dtshd_decoding)
+    pCodec = avcodec_find_decoder_by_name("libdcadec");
+
+  if (!pCodec)
+    pCodec = avcodec_find_decoder(hints.codec);
+
   if (!pCodec)
   {
     CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to find codec %d", hints.codec);
diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
index 74ff31f..6a97135 100644
--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
@@ -439,6 +439,21 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo, bool filein
 
   if (m_streaminfo)
   {
+#if defined(TARGET_RASPBERRY_PI) || defined(HAS_IMXVPU) || defined(HAS_LIBAMCODEC)
+    if (CSettings::Get().GetBool("audiooutput.supportdtshdcpudecoding"))
+#endif
+    {
+      for (unsigned int i = 0; i < m_pFormatContext->nb_streams; i++)
+      {
+        AVStream *st = m_pFormatContext->streams[i];
+        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->codec->codec_id == AV_CODEC_ID_DTS)
+        {
+          AVCodec* pCodec = avcodec_find_decoder_by_name("libdcadec");
+          if (pCodec)
+            st->codec->codec = pCodec;
+        }
+      }
+    }
     /* to speed up dvd switches, only analyse very short */
     if(m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD))
       av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0);
diff --git a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
index 1a920f7..075f728 100644
--- a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
+++ b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
@@ -26,6 +26,7 @@
 
 #include "cores/AudioEngine/Utils/AEUtil.h"
 #include "cores/AudioEngine/AEFactory.h"
+#include "settings/Settings.h"
 
 // the size of the audio_render output port buffers
 #define AUDIO_DECODE_OUTPUT_BUFFER (32*1024)
@@ -62,10 +63,15 @@ COMXAudioCodecOMX::~COMXAudioCodecOMX()
 
 bool COMXAudioCodecOMX::Open(CDVDStreamInfo &hints)
 {
-  AVCodec* pCodec;
+  AVCodec* pCodec = NULL;
   m_bOpenedCodec = false;
 
-  pCodec = avcodec_find_decoder(hints.codec);
+  if (hints.codec == AV_CODEC_ID_DTS && CSettings::Get().GetBool("audiooutput.supportdtshdcpudecoding"))
+    pCodec = avcodec_find_decoder_by_name("libdcadec");
+
+  if (!pCodec)
+    pCodec = avcodec_find_decoder(hints.codec);
+
   if (!pCodec)
   {
     CLog::Log(LOGDEBUG,"COMXAudioCodecOMX::Open() Unable to find codec %d", hints.codec);

From 61fac1c7999532e4595ef9101c83074937dddabb Mon Sep 17 00:00:00 2001
From: wsnipex <wsnipex@a1.net>
Date: Wed, 13 May 2015 20:00:31 +0200
Subject: [PATCH 3/6] [configure] use pkg-config to detect dcadec

---
 configure.ac | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index ad9ae6d..600325a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1088,7 +1088,7 @@ AC_CHECK_HEADER([mpeg2dec/mpeg2convert.h],, AC_MSG_ERROR($missing_library),
 AC_CHECK_HEADER([jpeglib.h],,        AC_MSG_ERROR($missing_library))
 AC_CHECK_HEADER([ogg/ogg.h],,        AC_MSG_ERROR($missing_library))
 AC_CHECK_HEADER([vorbis/vorbisfile.h],, AC_MSG_ERROR($missing_library))
-AC_CHECK_HEADER([libdcadec/dca_context.h],, AC_MSG_ERROR($missing_library))
+PKG_CHECK_MODULES([LIBDCADEC], [dcadec],, AC_MSG_ERROR([libdcadec not found]))
 
 PKG_CHECK_MODULES([LIBCURL], [libcurl],, AC_MSG_ERROR([libcurl not found]))
 XB_FIND_SONAME([CURL], [curl])

From 035084e5c09555005aa045f67a282cecceb98900 Mon Sep 17 00:00:00 2001
From: wsnipex <wsnipex@a1.net>
Date: Wed, 13 May 2015 20:02:38 +0200
Subject: [PATCH 4/6] [ffmpeg] enabled dcadec for linux standalone builds

---
 tools/depends/target/ffmpeg/autobuild.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/depends/target/ffmpeg/autobuild.sh b/tools/depends/target/ffmpeg/autobuild.sh
index 196c347..b9bfd57 100755
--- a/tools/depends/target/ffmpeg/autobuild.sh
+++ b/tools/depends/target/ffmpeg/autobuild.sh
@@ -159,6 +159,7 @@ CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" \
 	--disable-mips32r2 \
 	--disable-mipsdspr1 \
 	--disable-mipsdspr2 \
+	--enable-libdcadec \
         ${FLAGS}
 
 make -j ${BUILDTHREADS} 

From d89c29002ab09708540055f214823836e2c74c00 Mon Sep 17 00:00:00 2001
From: wsnipex <wsnipex@a1.net>
Date: Wed, 13 May 2015 20:12:31 +0200
Subject: [PATCH 5/6] [depends] use a tarball from mirrors for dcadec

---
 tools/depends/target/libdcadec/Makefile | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/depends/target/libdcadec/Makefile b/tools/depends/target/libdcadec/Makefile
index e68ec46..4c98063 100644
--- a/tools/depends/target/libdcadec/Makefile
+++ b/tools/depends/target/libdcadec/Makefile
@@ -2,9 +2,10 @@ include ../../Makefile.include
 DEPS= ../../Makefile.include Makefile
 
 # lib name, version
-LIBNAME=dcadec
-ARCHIVE=master.tar.gz
-BASE_URL=https://github.com/foo86/dcadec/archive
+LIBNAME=libdcadec
+VERSION=git-396e75652
+SOURCE=$(LIBNAME)-$(VERSION)
+ARCHIVE=$(SOURCE).tar.gz
 
 # configuration settings
 

From faceb91945a9064e26c55c83d9944d20f538da0d Mon Sep 17 00:00:00 2001
From: wsnipex <wsnipex@a1.net>
Date: Wed, 13 May 2015 20:18:09 +0200
Subject: [PATCH 6/6] [docs] add dcadec to linux README

---
 docs/README.linux  | 2 +-
 docs/README.ubuntu | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/README.linux b/docs/README.linux
index ee64baf..732d606 100644
--- a/docs/README.linux
+++ b/docs/README.linux
@@ -44,7 +44,7 @@ that are used to build Kodi packages on Debian/Ubuntu (with all supported
 external libraries enabled).
 
 Build-Depends: autoconf, automake, autopoint, autotools-dev, cmake, curl,
-  debhelper (>= 7.0.50~), default-jre, gawk, gperf, libao-dev, libasound2-dev,
+  dcadec-dev, default-jre, gawk, gperf, libao-dev, libasound2-dev,
   libass-dev (>= 0.9.8), libavahi-client-dev, libavahi-common-dev, libbluetooth-dev,
   libbluray-dev, libboost-dev, libboost-thread-dev, libbz2-dev, libcap-dev, libcdio-dev,
   libcec-dev, libcurl4-gnutls-dev | libcurl4-openssl-dev | libcurl-dev, libcwiid-dev,
diff --git a/docs/README.ubuntu b/docs/README.ubuntu
index 10f1611..0369f83 100644
--- a/docs/README.ubuntu
+++ b/docs/README.ubuntu
@@ -82,7 +82,7 @@ Tip: For those with multiple computers at home is to try out distcc
 
 For Ubuntu (all versions >= 7.04):
 
-    $ sudo apt-get install automake bison build-essential cmake curl cvs default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 libcurl4-gnutls-dev libdbus-1-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libgif-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libpcre3-dev libplist-dev libpng-dev libpulse-dev libsdl2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libva-dev libvdpau-dev libvorbis-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig unzip yasm zip zlib1g-dev
+    $ sudo apt-get install automake bison build-essential cmake curl cvs dcadec-dev default-jre fp-compiler gawk gdc gettext git-core gperf libasound2-dev libass-dev libboost-dev libboost-thread-dev libbz2-dev libcap-dev libcdio-dev libcurl3 libcurl4-gnutls-dev libdbus-1-dev libfontconfig-dev libfreetype6-dev libfribidi-dev libgif-dev libglew-dev libiso9660-dev libjasper-dev libjpeg-dev liblzo2-dev libmicrohttpd-dev libmodplug-dev libmpeg2-4-dev libmpeg3-dev libmysqlclient-dev libnfs-dev libogg-dev libpcre3-dev libplist-dev libpng-dev libpulse-dev libsdl2-dev libsmbclient-dev libsqlite3-dev libssh-dev libssl-dev libtiff-dev libtinyxml-dev libtool libudev-dev libusb-dev libva-dev libvdpau-dev libvorbis-dev libvorbisenc2 libxml2-dev libxmu-dev libxrandr-dev libxrender-dev libxslt1-dev libxt-dev libyajl-dev mesa-utils nasm pmount python-dev python-imaging python-sqlite swig unzip yasm zip zlib1g-dev
 
 For >= 10.10:
     $ sudo apt-get install autopoint libltdl-dev
