From 7e80d055ba427d11f7ca73ac8fd87c8bff4bd6b6 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Sat, 25 Jul 2015 08:28:49 -0500 Subject: add openelec patch for kodi --- package/kodi/Makefile | 2 +- package/kodi/patches/openelec.patch | 1279 +++++++++++++++++++++++++++++++++++ 2 files changed, 1280 insertions(+), 1 deletion(-) create mode 100644 package/kodi/patches/openelec.patch (limited to 'package/kodi') diff --git a/package/kodi/Makefile b/package/kodi/Makefile index 0b7dfe9aa..fd971e0c2 100644 --- a/package/kodi/Makefile +++ b/package/kodi/Makefile @@ -5,7 +5,7 @@ include $(ADK_TOPDIR)/rules.mk PKG_NAME:= kodi PKG_VERSION:= 15.0 -PKG_RELEASE:= 1 +PKG_RELEASE:= 2 PKG_HASH:= 27dba173cfe74b323f4dbaa72ae2bfe5961f76c27bddcd5210253be91cae0dff PKG_DESCR:= software media player PKG_SECTION:= mm/video diff --git a/package/kodi/patches/openelec.patch b/package/kodi/patches/openelec.patch new file mode 100644 index 000000000..4136559ba --- /dev/null +++ b/package/kodi/patches/openelec.patch @@ -0,0 +1,1279 @@ +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; + -- cgit v1.2.3