diff -Nur xbmc-15.0-Isengard.orig/addons/resource.language.en_gb/resources/strings.po xbmc-15.0-Isengard/addons/resource.language.en_gb/resources/strings.po --- xbmc-15.0-Isengard.orig/addons/resource.language.en_gb/resources/strings.po 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/addons/resource.language.en_gb/resources/strings.po 2015-07-25 08:01:50.578340000 -0500 @@ -16642,3 +16642,28 @@ msgctxt "#38016" msgid "%d fps" msgstr "" + +#: system/peripherals.xml +msgctxt "#38050" +msgid "Remote button press delay before repeating (ms)" +msgstr "" + +#: system/peripherals.xml +msgctxt "#38051" +msgid "Remote button press repeat rate (ms)" +msgstr "" + +#: system/peripherals.xml +msgctxt "#38052" +msgid "Remote button press release time (ms)" +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 -Nur xbmc-15.0-Isengard.orig/docs/README.linux xbmc-15.0-Isengard/docs/README.linux --- xbmc-15.0-Isengard.orig/docs/README.linux 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/docs/README.linux 2015-07-25 08:01:50.586339999 -0500 @@ -44,7 +44,7 @@ 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 -Nur xbmc-15.0-Isengard.orig/docs/README.ubuntu xbmc-15.0-Isengard/docs/README.ubuntu --- xbmc-15.0-Isengard.orig/docs/README.ubuntu 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/docs/README.ubuntu 2015-07-25 08:01:50.586339999 -0500 @@ -82,7 +82,7 @@ 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 diff -Nur xbmc-15.0-Isengard.orig/Makefile.in xbmc-15.0-Isengard/Makefile.in --- xbmc-15.0-Isengard.orig/Makefile.in 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/Makefile.in 2015-07-25 08:01:50.566340001 -0500 @@ -445,7 +445,7 @@ @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 -Nur xbmc-15.0-Isengard.orig/system/keyboardlayouts/english.xml xbmc-15.0-Isengard/system/keyboardlayouts/english.xml --- xbmc-15.0-Isengard.orig/system/keyboardlayouts/english.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/system/keyboardlayouts/english.xml 2015-07-25 08:01:50.526340002 -0500 @@ -8,14 +8,14 @@ 1234567890 qwertyuiop - asdfghjkl - zxcvbnm + asdfghjkl: + zxcvbnm./@ 1234567890 QWERTYUIOP - ASDFGHJKL - ZXCVBNM + ASDFGHJKL: + ZXCVBNM./@ )!@#$%^&*( diff -Nur xbmc-15.0-Isengard.orig/system/peripherals.xml xbmc-15.0-Isengard/system/peripherals.xml --- xbmc-15.0-Isengard.orig/system/peripherals.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/system/peripherals.xml 2015-07-25 08:01:50.534339999 -0500 @@ -30,7 +30,9 @@ - + + + diff -Nur xbmc-15.0-Isengard.orig/system/settings/imx6.xml xbmc-15.0-Isengard/system/settings/imx6.xml --- xbmc-15.0-Isengard.orig/system/settings/imx6.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/system/settings/imx6.xml 2015-07-25 08:01:50.578340000 -0500 @@ -13,6 +13,26 @@ + + + + 2 + false + + + + + false + + false + false + + + + + + +
diff -Nur xbmc-15.0-Isengard.orig/system/settings/rbp2.xml xbmc-15.0-Isengard/system/settings/rbp2.xml --- xbmc-15.0-Isengard.orig/system/settings/rbp2.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/system/settings/rbp2.xml 2015-07-25 08:01:50.578340000 -0500 @@ -19,6 +19,11 @@ + + + true + + diff -Nur xbmc-15.0-Isengard.orig/system/settings/rbp.xml xbmc-15.0-Isengard/system/settings/rbp.xml --- xbmc-15.0-Isengard.orig/system/settings/rbp.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/system/settings/rbp.xml 2015-07-25 08:01:50.578340000 -0500 @@ -76,6 +76,11 @@ 101 + + 2 + false + + diff -Nur xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch --- xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch 1969-12-31 18:00:00.000000000 -0600 +++ xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0001-avcodec-add-libdcadec-decoder.patch 2015-07-25 08:01:50.570340002 -0500 @@ -0,0 +1,280 @@ +From 519868de7d9c99876efcaf57d6a9683c22732cde Mon Sep 17 00:00:00 2001 +From: Hendrik Leppkes +Date: Thu, 19 Mar 2015 23:56:22 +0100 +Subject: [PATCH] avcodec: add libdcadec decoder + +Signed-off-by: Michael Niedermayer +--- + 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 ++ ++#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 -Nur xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch --- xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch 1969-12-31 18:00:00.000000000 -0600 +++ xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0002-avcodec-Fix-libdcadec-include-dir.patch 2015-07-25 08:01:50.570340002 -0500 @@ -0,0 +1,40 @@ +From 4f3c31df3f569c7171ee9e651ddf479690367b9b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Kacper=20Michaj=C5=82ow?= +Date: Fri, 20 Mar 2015 01:58:25 +0100 +Subject: [PATCH] avcodec: Fix libdcadec include dir + +Signed-off-by: Michael Niedermayer +--- + 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 ++#include + + #include "libavutil/avassert.h" + #include "libavutil/channel_layout.h" +-- +1.9.1 + diff -Nur xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch --- xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch 1969-12-31 18:00:00.000000000 -0600 +++ xbmc-15.0-Isengard/tools/depends/target/ffmpeg/0003-avcodec-add-profile-define-for-DTS-Express.patch 2015-07-25 08:01:50.570340002 -0500 @@ -0,0 +1,25 @@ +From 11fe56c8bbf39cd0c3edbf0cd404dea400ff7e0c Mon Sep 17 00:00:00 2001 +From: Hendrik Leppkes +Date: Thu, 19 Mar 2015 23:45:39 +0100 +Subject: [PATCH] avcodec: add profile define for DTS Express + +Signed-off-by: Michael Niedermayer +--- + 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 -Nur xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/autobuild.sh xbmc-15.0-Isengard/tools/depends/target/ffmpeg/autobuild.sh --- xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/autobuild.sh 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/tools/depends/target/ffmpeg/autobuild.sh 2015-07-25 08:01:50.586339999 -0500 @@ -159,6 +159,7 @@ --disable-mips32r2 \ --disable-mipsdspr1 \ --disable-mipsdspr2 \ + --enable-libdcadec \ ${FLAGS} make -j ${BUILDTHREADS} diff -Nur xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/Makefile xbmc-15.0-Isengard/tools/depends/target/ffmpeg/Makefile --- xbmc-15.0-Isengard.orig/tools/depends/target/ffmpeg/Makefile 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/tools/depends/target/ffmpeg/Makefile 2015-07-25 08:01:50.582339999 -0500 @@ -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 @@ ifeq ($(Configuration), Release) ffmpg_config += --disable-debug endif +ffmpg_config += --enable-libdcadec CLEAN_FILES=$(ARCHIVE) $(PLATFORM) @@ -68,6 +70,9 @@ 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 -Nur xbmc-15.0-Isengard.orig/tools/depends/target/libdcadec/Makefile xbmc-15.0-Isengard/tools/depends/target/libdcadec/Makefile --- xbmc-15.0-Isengard.orig/tools/depends/target/libdcadec/Makefile 1969-12-31 18:00:00.000000000 -0600 +++ xbmc-15.0-Isengard/tools/depends/target/libdcadec/Makefile 2015-07-25 08:01:50.586339999 -0500 @@ -0,0 +1,39 @@ +include ../../Makefile.include +DEPS= ../../Makefile.include Makefile + +# lib name, version +LIBNAME=libdcadec +VERSION=git-396e75652 +SOURCE=$(LIBNAME)-$(VERSION) +ARCHIVE=$(SOURCE).tar.gz + +# 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) diff -Nur xbmc-15.0-Isengard.orig/tools/depends/target/Makefile xbmc-15.0-Isengard/tools/depends/target/Makefile --- xbmc-15.0-Isengard.orig/tools/depends/target/Makefile 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/tools/depends/target/Makefile 2015-07-25 08:01:50.570340002 -0500 @@ -15,7 +15,7 @@ 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 @@ 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 -Nur xbmc-15.0-Isengard.orig/userdata/RssFeeds.xml xbmc-15.0-Isengard/userdata/RssFeeds.xml --- xbmc-15.0-Isengard.orig/userdata/RssFeeds.xml 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/userdata/RssFeeds.xml 2015-07-25 08:01:50.462339999 -0500 @@ -3,6 +3,7 @@ + http://feeds.openelec.tv/news http://feeds.xbmc.org/xbmc http://feeds.xbmc.org/latest_xbmc_addons http://feeds.xbmc.org/updated_xbmc_addons diff -Nur xbmc-15.0-Isengard.orig/xbmc/addons/AddonCallbacksAddon.cpp xbmc-15.0-Isengard/xbmc/addons/AddonCallbacksAddon.cpp --- xbmc-15.0-Isengard.orig/xbmc/addons/AddonCallbacksAddon.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/addons/AddonCallbacksAddon.cpp 2015-07-25 08:01:50.542340001 -0500 @@ -180,6 +180,12 @@ { CLog::Log(LOGDEBUG, "CAddonCallbacksAddon - %s - add-on '%s' requests setting '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str(), strSettingName); + if (strcasecmp(strSettingName, "__addonpath__") == 0) + { + strcpy((char*) settingValue, addonHelper->m_addon->Path().c_str()); + return true; + } + if (!addonHelper->m_addon->ReloadSettings()) { CLog::Log(LOGERROR, "CAddonCallbacksAddon - %s - could't get settings for add-on '%s'", __FUNCTION__, addonHelper->m_addon->Name().c_str()); diff -Nur xbmc-15.0-Isengard.orig/xbmc/addons/Addon.cpp xbmc-15.0-Isengard/xbmc/addons/Addon.cpp --- xbmc-15.0-Isengard.orig/xbmc/addons/Addon.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/addons/Addon.cpp 2015-07-25 08:01:50.494340001 -0500 @@ -44,6 +44,10 @@ #include #include +#include +#include +#include + using XFILE::CDirectory; using XFILE::CFile; using namespace std; @@ -622,6 +626,13 @@ return AddonVersion("0.0.0"); } +void CallOEWrapper(const std::string& ID, bool disable) +{ + char cmd[255]; + snprintf(cmd, sizeof(cmd), "/usr/lib/openelec/systemd-addon-wrapper %s %d %d", ID.c_str(), disable); + system(cmd); +} + void OnEnabled(const std::string& id) { // If the addon is a special, call enabled handler @@ -629,6 +640,11 @@ if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL)) return addon->OnEnabled(); + // OE: systemctl enable & start on addon enable + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) + CallOEWrapper(addon->ID(), false); + // OE + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) std::static_pointer_cast(addon)->Start(); @@ -645,6 +661,11 @@ if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) std::static_pointer_cast(addon)->Stop(); + // OE: systemctl stop & disable on addon disable + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) + CallOEWrapper(addon->ID(), true); + // OE + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM, false)) CContextMenuManager::Get().Unregister(std::static_pointer_cast(addon)); } @@ -668,18 +689,53 @@ void OnPostInstall(const AddonPtr& addon, bool update, bool modal) { AddonPtr localAddon; + // OE: systemctl stop & disable / enable & start on addon upgrade + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + { + CallOEWrapper(addon->ID(), true); + CallOEWrapper(addon->ID(), false); + } + // OE + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) std::static_pointer_cast(localAddon)->Start(); if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) CContextMenuManager::Get().Register(std::static_pointer_cast(localAddon)); + // OE: make binary addons executable, creddits to vpeter4 + std::string addonDirPath; + std::string chmodFilePath; + DIR *addonsDir; + struct dirent *fileDirent; + struct stat fileStat; + int statRet; + + addonDirPath = "/storage/.kodi/addons/" + addon->ID() + "/bin/"; + if ((addonsDir = opendir(addonDirPath.c_str())) != NULL) + { + while ((fileDirent = readdir(addonsDir)) != NULL) + { + chmodFilePath = addonDirPath + fileDirent->d_name; + statRet = stat(chmodFilePath.c_str(), &fileStat); + if (statRet == 0 && (fileStat.st_mode & S_IFMT) != S_IFDIR) + chmod(chmodFilePath.c_str(), fileStat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH); + } + closedir(addonsDir); + } + // OE + addon->OnPostInstall(update, modal); } void OnPreUnInstall(const AddonPtr& addon) { AddonPtr localAddon; + // OE: systemctl stop & disable on addon ininstall + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + CallOEWrapper(addon->ID(), true); + // OE + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) std::static_pointer_cast(localAddon)->Stop(); diff -Nur xbmc-15.0-Isengard.orig/xbmc/addons/Addon.h xbmc-15.0-Isengard/xbmc/addons/Addon.h --- xbmc-15.0-Isengard.orig/xbmc/addons/Addon.h 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/addons/Addon.h 2015-07-25 08:01:50.494340001 -0500 @@ -171,6 +171,8 @@ const InfoMap &ExtraInfo() const { return m_props.extrainfo; } const ADDONDEPS &GetDeps() const { return m_props.dependencies; } + void CallOEWrapper(const std::string& ID, bool disable); + /*! \brief get the required version of a dependency. \param dependencyID the addon ID of the dependency. \return the version this addon requires. diff -Nur xbmc-15.0-Isengard.orig/xbmc/Application.cpp xbmc-15.0-Isengard/xbmc/Application.cpp --- xbmc-15.0-Isengard.orig/xbmc/Application.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/Application.cpp 2015-07-25 08:01:50.502340002 -0500 @@ -2593,12 +2593,19 @@ } } +void CApplication::SetExitCode(int exitCode) +{ + // save it for CEC + m_ExitCode = exitCode; + m_ExitCodeSet = true; +} + void CApplication::Stop(int exitCode) { try { CVariant vExitCode(CVariant::VariantTypeObject); - vExitCode["exitcode"] = exitCode; + vExitCode["exitcode"] = m_ExitCode; CAnnouncementManager::Get().Announce(System, "xbmc", "OnQuit", vExitCode); // Abort any active screensaver @@ -2625,7 +2632,6 @@ m_bStop = true; m_AppFocused = false; - m_ExitCode = exitCode; CLog::Log(LOGNOTICE, "stop all"); // cancel any jobs from the jobmanager @@ -4732,7 +4738,6 @@ void CApplication::Minimize() { - g_Windowing.Minimize(); } PLAYERCOREID CApplication::GetCurrentPlayer() diff -Nur xbmc-15.0-Isengard.orig/xbmc/Application.h xbmc-15.0-Isengard/xbmc/Application.h --- xbmc-15.0-Isengard.orig/xbmc/Application.h 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/Application.h 2015-07-25 08:01:50.502340002 -0500 @@ -154,6 +154,7 @@ bool StartPVRManager(); void StopPVRManager(); bool IsCurrentThread() const; + void SetExitCode(int exitCode); void Stop(int exitCode); void RestartApp(); void UnloadSkin(bool forReload = false); diff -Nur xbmc-15.0-Isengard.orig/xbmc/ApplicationMessenger.cpp xbmc-15.0-Isengard/xbmc/ApplicationMessenger.cpp --- xbmc-15.0-Isengard.orig/xbmc/ApplicationMessenger.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/ApplicationMessenger.cpp 2015-07-25 08:01:50.502340002 -0500 @@ -257,13 +257,14 @@ case TMSG_POWERDOWN: { - g_application.Stop(EXITCODE_POWERDOWN); + g_application.SetExitCode(EXITCODE_POWERDOWN); g_powerManager.Powerdown(); } break; case TMSG_QUIT: { + g_application.SetExitCode(EXITCODE_QUIT); g_application.Stop(EXITCODE_QUIT); } break; @@ -285,7 +286,7 @@ case TMSG_RESTART: case TMSG_RESET: { - g_application.Stop(EXITCODE_REBOOT); + g_application.SetExitCode(EXITCODE_REBOOT); g_powerManager.Reboot(); } break; @@ -293,6 +294,7 @@ case TMSG_RESTARTAPP: { #if defined(TARGET_WINDOWS) || defined(TARGET_LINUX) + g_application.SetExitCode(EXITCODE_RESTARTAPP); g_application.Stop(EXITCODE_RESTARTAPP); #endif } diff -Nur xbmc-15.0-Isengard.orig/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp xbmc-15.0-Isengard/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp --- xbmc-15.0-Isengard.orig/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp 2015-07-25 08:01:50.618340002 -0500 @@ -28,6 +28,7 @@ #include "cores/AudioEngine/Encoders/AEEncoderFFmpeg.h" #include "settings/Settings.h" +#include "settings/AdvancedSettings.h" #include "windowing/WindowingFactory.h" #include "utils/log.h" @@ -1505,6 +1506,13 @@ format.m_channelLayout = AE_CH_LAYOUT_2_0; } + // OpenELEC workaround to define a minimum sample Rate for broken AVRs + if (format.m_sampleRate < g_advancedSettings.m_minimumSampleRate) + { + format.m_sampleRate = g_advancedSettings.m_minimumSampleRate; + CLog::Log(LOGDEBUG, "CActiveAE::MinimumSampleRate - Forced by use to samplerate %d", format.m_sampleRate); + } + if (m_settings.config == AE_CONFIG_FIXED) { format.m_sampleRate = m_settings.samplerate; diff -Nur xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp --- xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2015-07-25 08:01:50.582339999 -0500 @@ -33,6 +33,7 @@ #include "settings/Settings.h" #include "cores/AudioEngine/Utils/AEUtil.h" #endif +#include "settings/Settings.h" CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() { @@ -54,10 +55,19 @@ 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 -Nur xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp --- xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp 2015-07-25 08:01:50.630339999 -0500 @@ -38,7 +38,7 @@ #define IMX_VDI_MAX_WIDTH 968 #define FRAME_ALIGN 16 #define MEDIAINFO 1 -#define RENDER_QUEUE_SIZE 3 +#define RENDER_QUEUE_SIZE 5 #define _4CC(c1,c2,c3,c4) (((uint32_t)(c4)<<24)|((uint32_t)(c3)<<16)|((uint32_t)(c2)<<8)|(uint32_t)(c1)) #define Align(ptr,align) (((unsigned int)ptr + (align) - 1)/(align)*(align)) #define Align2(ptr,align) (((unsigned int)ptr)/(align)*(align)) diff -Nur xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp --- xbmc-15.0-Isengard.orig/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2015-07-25 08:01:50.582339999 -0500 @@ -439,6 +439,21 @@ 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 -Nur xbmc-15.0-Isengard.orig/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp xbmc-15.0-Isengard/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp --- xbmc-15.0-Isengard.orig/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp 2015-07-25 08:01:50.582339999 -0500 @@ -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 @@ 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); diff -Nur xbmc-15.0-Isengard.orig/xbmc/GUIInfoManager.cpp xbmc-15.0-Isengard/xbmc/GUIInfoManager.cpp --- xbmc-15.0-Isengard.orig/xbmc/GUIInfoManager.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/GUIInfoManager.cpp 2015-07-25 08:01:50.466339999 -0500 @@ -272,7 +272,6 @@ { "currentwindow", SYSTEM_CURRENT_WINDOW }, { "currentcontrol", SYSTEM_CURRENT_CONTROL }, { "dvdlabel", SYSTEM_DVD_LABEL }, - { "internetstate", SYSTEM_INTERNET_STATE }, { "osversioninfo", SYSTEM_OS_VERSION_INFO }, { "kernelversion", SYSTEM_OS_VERSION_INFO }, // old, not correct name { "uptime", SYSTEM_UPTIME }, diff -Nur xbmc-15.0-Isengard.orig/xbmc/interfaces/python/XBPython.cpp xbmc-15.0-Isengard/xbmc/interfaces/python/XBPython.cpp --- xbmc-15.0-Isengard.orig/xbmc/interfaces/python/XBPython.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/interfaces/python/XBPython.cpp 2015-07-25 08:01:50.458340000 -0500 @@ -567,10 +567,9 @@ // at http://docs.python.org/using/cmdline.html#environment-variables #if !defined(TARGET_WINDOWS) && !defined(TARGET_ANDROID) - /* PYTHONOPTIMIZE is set off intentionally when using external Python. - Reason for this is because we cannot be sure what version of Python - was used to compile the various Python object files (i.e. .pyo, - .pyc, etc.). */ + // Required for python to find optimized code (pyo) files + setenv("PYTHONOPTIMIZE", "1", 1); + // check if we are running as real xbmc.app or just binary if (!CUtil::GetFrameworksPath(true).empty()) { diff -Nur xbmc-15.0-Isengard.orig/xbmc/linux/LinuxTimezone.cpp xbmc-15.0-Isengard/xbmc/linux/LinuxTimezone.cpp --- xbmc-15.0-Isengard.orig/xbmc/linux/LinuxTimezone.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/linux/LinuxTimezone.cpp 2015-07-25 08:01:50.490339999 -0500 @@ -42,6 +42,8 @@ #include +#include + using namespace std; CLinuxTimezone::CLinuxTimezone() : m_IsDST(0) @@ -161,6 +163,16 @@ const std::string &settingId = setting->GetId(); if (settingId == "locale.timezone") { + std::ofstream out("/storage/.cache/timezone"); + if (out) + { + const std::string tz = std::string("TIMEZONE=") + ((CSettingString*)setting)->GetValue().c_str(); + out << tz << std::endl; + out.flush(); + out.close(); + system("systemctl restart tz-data.service"); + } + SetTimezone(((CSettingString*)setting)->GetValue()); CDateTime::ResetTimezoneBias(); diff -Nur xbmc-15.0-Isengard.orig/xbmc/linux/PosixMountProvider.cpp xbmc-15.0-Isengard/xbmc/linux/PosixMountProvider.cpp --- xbmc-15.0-Isengard.orig/xbmc/linux/PosixMountProvider.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/linux/PosixMountProvider.cpp 2015-07-25 08:01:50.474340002 -0500 @@ -133,7 +133,7 @@ { // just go ahead and try to umount the disk // if it does umount, life is good, if not, no loss. - std::string cmd = "umount \"" + mountpath + "\""; + std::string cmd = "udevil umount \"" + mountpath + "\""; int status = system(cmd.c_str()); if (status == 0) diff -Nur xbmc-15.0-Isengard.orig/xbmc/main/main.cpp xbmc-15.0-Isengard/xbmc/main/main.cpp --- xbmc-15.0-Isengard.orig/xbmc/main/main.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/main/main.cpp 2015-07-25 08:01:50.506340000 -0500 @@ -41,9 +41,24 @@ #include "input/linux/LIRC.h" #endif #include "XbmcContext.h" +#include "Application.h" + +void xbmc_term_handler(int signum) +{ + CLog::Log(LOGINFO, "Received SIGTERM..."); + if (!g_application.m_ExitCodeSet) + g_application.SetExitCode(EXITCODE_RESTARTAPP); + g_application.Stop(EXITCODE_RESTARTAPP); +} int main(int argc, char* argv[]) { + // SIGTERM handler + struct sigaction action; + memset(&action, 0, sizeof(struct sigaction)); + action.sa_handler = xbmc_term_handler; + sigaction(SIGTERM, &action, NULL); + // set up some xbmc specific relationships XBMC::Context context; diff -Nur xbmc-15.0-Isengard.orig/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-15.0-Isengard/xbmc/peripherals/devices/PeripheralCecAdapter.cpp --- xbmc-15.0-Isengard.orig/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2015-07-25 08:01:50.542340001 -0500 @@ -767,7 +767,10 @@ CLog::Log(LOGDEBUG, "%s - received key %2x duration %d", __FUNCTION__, key.iButton, key.iDuration); CSingleLock lock(m_critSection); - if (key.iDuration > 0) + // avoid the queue getting too long + if (m_configuration.iButtonRepeatRateMs && m_buttonQueue.size() > 5) + return; + if (m_configuration.iButtonRepeatRateMs == 0 && key.iDuration > 0) { if (m_currentButton.iButton == key.iButton && m_currentButton.iDuration == 0) { @@ -1267,6 +1270,20 @@ m_configuration.bSendInactiveSource = config.bSendInactiveSource; bChanged |= SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); +#if defined(CEC_DOUBLE_TAP_TIMEOUT_MS_OLD) + m_configuration.iDoubleTapTimeout50Ms = config.iDoubleTapTimeout50Ms; + bChanged |= SetSetting("double_tap_timeout_ms", (int)m_configuration.iDoubleTapTimeout50Ms * 50); +#else + m_configuration.iDoubleTapTimeoutMs = config.iDoubleTapTimeoutMs; + bChanged |= SetSetting("double_tap_timeout_ms", (int)m_configuration.iDoubleTapTimeoutMs; +#endif + + m_configuration.iButtonRepeatRateMs = config.iButtonRepeatRateMs; + bChanged |= SetSetting("button_repeat_rate_ms", (int)m_configuration.iButtonRepeatRateMs); + + m_configuration.iButtonReleaseDelayMs = config.iButtonReleaseDelayMs; + bChanged |= SetSetting("button_release_delay_ms", (int)m_configuration.iButtonReleaseDelayMs); + m_configuration.iFirmwareVersion = config.iFirmwareVersion; m_configuration.bShutdownOnStandby = config.bShutdownOnStandby; @@ -1371,6 +1388,8 @@ // backwards compatibility. will be removed once the next major release of libCEC is out m_configuration.iDoubleTapTimeoutMs = GetSettingInt("double_tap_timeout_ms"); #endif + m_configuration.iButtonRepeatRateMs = GetSettingInt("button_repeat_rate_ms"); + m_configuration.iButtonReleaseDelayMs = GetSettingInt("button_release_delay_ms"); } void CPeripheralCecAdapter::ReadLogicalAddresses(const std::string &strString, cec_logical_addresses &addresses) diff -Nur xbmc-15.0-Isengard.orig/xbmc/settings/AdvancedSettings.cpp xbmc-15.0-Isengard/xbmc/settings/AdvancedSettings.cpp --- xbmc-15.0-Isengard.orig/xbmc/settings/AdvancedSettings.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/settings/AdvancedSettings.cpp 2015-07-25 08:01:50.622340002 -0500 @@ -106,6 +106,8 @@ return; m_audioHeadRoom = 0; + // OpenELEC workaround for broken AVRs + m_minimumSampleRate = 8000; m_ac3Gain = 12.0f; m_audioApplyDrc = -1.0f; m_dvdplayerIgnoreDTSinWAV = false; @@ -464,6 +466,7 @@ { XMLUtils::GetFloat(pElement, "ac3downmixgain", m_ac3Gain, -96.0f, 96.0f); XMLUtils::GetInt(pElement, "headroom", m_audioHeadRoom, 0, 12); + XMLUtils::GetInt(pElement, "minimumsamplerate", m_minimumSampleRate, 8000, 192000); XMLUtils::GetString(pElement, "defaultplayer", m_audioDefaultPlayer); // 101 on purpose - can be used to never automark as watched XMLUtils::GetFloat(pElement, "playcountminimumpercent", m_audioPlayCountMinimumPercent, 0.0f, 101.0f); diff -Nur xbmc-15.0-Isengard.orig/xbmc/settings/AdvancedSettings.h xbmc-15.0-Isengard/xbmc/settings/AdvancedSettings.h --- xbmc-15.0-Isengard.orig/xbmc/settings/AdvancedSettings.h 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/settings/AdvancedSettings.h 2015-07-25 08:01:50.622340002 -0500 @@ -140,6 +140,8 @@ static void SettingOptionsLoggingComponentsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); int m_audioHeadRoom; + // OpenELEC workaround for minimum sample Rate + int m_minimumSampleRate; float m_ac3Gain; std::string m_audioDefaultPlayer; float m_audioPlayCountMinimumPercent; diff -Nur xbmc-15.0-Isengard.orig/xbmc/storage/linux/UDevProvider.cpp xbmc-15.0-Isengard/xbmc/storage/linux/UDevProvider.cpp --- xbmc-15.0-Isengard.orig/xbmc/storage/linux/UDevProvider.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/storage/linux/UDevProvider.cpp 2015-07-25 08:01:50.514339999 -0500 @@ -152,6 +152,20 @@ continue; } + // OE: filter out openelec specific mounts + if (strstr(mountpoint, "/flash")) + { + udev_device_unref(device); + continue; + } + + if (strstr(mountpoint, "/storage")) + { + udev_device_unref(device); + continue; + } + // OE + // look for devices on the usb bus, or mounted on */media/ (sdcards), or optical devices const char *bus = udev_device_get_property_value(device, "ID_BUS"); const char *optical = udev_device_get_property_value(device, "ID_CDROM"); // matches also DVD, Blu-ray @@ -207,7 +221,7 @@ { // just go ahead and try to umount the disk // if it does umount, life is good, if not, no loss. - std::string cmd = "umount \"" + mountpath + "\""; + std::string cmd = "udevil umount \"" + mountpath + "\""; int status = system(cmd.c_str()); if (status == 0) diff -Nur xbmc-15.0-Isengard.orig/xbmc/utils/CPUInfo.cpp xbmc-15.0-Isengard/xbmc/utils/CPUInfo.cpp --- xbmc-15.0-Isengard.orig/xbmc/utils/CPUInfo.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/utils/CPUInfo.cpp 2015-07-25 08:01:50.510339999 -0500 @@ -271,6 +271,8 @@ m_fProcTemperature = fopen("/sys/class/thermal/thermal_zone0/temp", "r"); // On Raspberry PIs m_fCPUFreq = fopen ("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", "r"); + if (m_fCPUFreq == NULL) + m_fCPUFreq = fopen ("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq", "r"); if (!m_fCPUFreq) { m_cpuInfoForFreq = true; diff -Nur xbmc-15.0-Isengard.orig/xbmc/utils/SystemInfo.cpp xbmc-15.0-Isengard/xbmc/utils/SystemInfo.cpp --- xbmc-15.0-Isengard.orig/xbmc/utils/SystemInfo.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/utils/SystemInfo.cpp 2015-07-25 08:01:50.470340001 -0500 @@ -246,7 +246,6 @@ { m_info.systemUptime = GetSystemUpTime(false); m_info.systemTotalUptime = GetSystemUpTime(true); - m_info.internetState = GetInternetState(); m_info.videoEncoder = GetVideoEncoder(); m_info.cpuFrequency = GetCPUFreqInfo(); m_info.osVersionInfo = CSysInfo::GetOsPrettyNameWithVersion() + " (kernel: " + CSysInfo::GetKernelName() + " " + CSysInfo::GetKernelVersionFull() + ")"; @@ -1022,9 +1021,7 @@ bool CSysInfo::HasInternet() { - if (m_info.internetState != CSysData::UNKNOWN) - return m_info.internetState == CSysData::CONNECTED; - return (m_info.internetState = CSysInfoJob::GetInternetState()) == CSysData::CONNECTED; + return m_info.internetState == CSysData::UNKNOWN; } std::string CSysInfo::GetHddSpaceInfo(int drive, bool shortText) diff -Nur xbmc-15.0-Isengard.orig/xbmc/windowing/X11/WinSystemX11.cpp xbmc-15.0-Isengard/xbmc/windowing/X11/WinSystemX11.cpp --- xbmc-15.0-Isengard.orig/xbmc/windowing/X11/WinSystemX11.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/windowing/X11/WinSystemX11.cpp 2015-07-25 08:01:50.482340000 -0500 @@ -1143,8 +1143,6 @@ if (fullscreen && hasWM) { - Atom fs = XInternAtom(m_dpy, "_NET_WM_STATE_FULLSCREEN", True); - XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_STATE", True), XA_ATOM, 32, PropModeReplace, (unsigned char *) &fs, 1); // disable desktop compositing for KDE, when Kodi is in full-screen mode int one = 1; XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True), XA_CARDINAL, 32, diff -Nur xbmc-15.0-Isengard.orig/xbmc/windowing/X11/WinSystemX11.h xbmc-15.0-Isengard/xbmc/windowing/X11/WinSystemX11.h --- xbmc-15.0-Isengard.orig/xbmc/windowing/X11/WinSystemX11.h 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/windowing/X11/WinSystemX11.h 2015-07-25 08:01:50.510339999 -0500 @@ -54,6 +54,7 @@ virtual bool ResizeWindow(int newWidth, int newHeight, int newLeft, int newTop); virtual bool SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays); virtual void UpdateResolutions(); + virtual bool CanDoWindowed() { return false; } virtual int GetNumScreens() { return 1; } virtual int GetCurrentScreen() { return m_nScreen; } virtual void ShowOSMouse(bool show); diff -Nur xbmc-15.0-Isengard.orig/xbmc/windows/GUIWindowSystemInfo.cpp xbmc-15.0-Isengard/xbmc/windows/GUIWindowSystemInfo.cpp --- xbmc-15.0-Isengard.orig/xbmc/windows/GUIWindowSystemInfo.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/windows/GUIWindowSystemInfo.cpp 2015-07-25 08:01:50.470340001 -0500 @@ -125,7 +125,6 @@ SetControlLabel(i++, "%s: %s", 13160, NETWORK_GATEWAY_ADDRESS); SetControlLabel(i++, "%s: %s", 13161, NETWORK_DNS1_ADDRESS); SetControlLabel(i++, "%s: %s", 20307, NETWORK_DNS2_ADDRESS); - SetControlLabel(i++, "%s %s", 13295, SYSTEM_INTERNET_STATE); } else if (m_section == CONTROL_BT_VIDEO) { diff -Nur xbmc-15.0-Isengard.orig/xbmc/XBApplicationEx.cpp xbmc-15.0-Isengard/xbmc/XBApplicationEx.cpp --- xbmc-15.0-Isengard.orig/xbmc/XBApplicationEx.cpp 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/XBApplicationEx.cpp 2015-07-25 08:01:50.502340002 -0500 @@ -40,6 +40,7 @@ m_bStop = false; m_AppFocused = true; m_ExitCode = EXITCODE_QUIT; + m_ExitCodeSet = false; m_renderGUI = false; } diff -Nur xbmc-15.0-Isengard.orig/xbmc/XBApplicationEx.h xbmc-15.0-Isengard/xbmc/XBApplicationEx.h --- xbmc-15.0-Isengard.orig/xbmc/XBApplicationEx.h 2015-07-21 13:41:29.000000000 -0500 +++ xbmc-15.0-Isengard/xbmc/XBApplicationEx.h 2015-07-25 08:01:50.506340000 -0500 @@ -40,6 +40,7 @@ // Variables for timing bool m_bStop; int m_ExitCode; + bool m_ExitCodeSet; bool m_AppFocused; bool m_renderGUI;