summaryrefslogtreecommitdiff
path: root/package/kodi
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2015-07-25 08:28:49 -0500
committerWaldemar Brodkorb <wbx@openadk.org>2015-07-25 08:28:49 -0500
commit7e80d055ba427d11f7ca73ac8fd87c8bff4bd6b6 (patch)
tree5ccd8cb94eca52a0e0eb08a1d58293a2a5b436ce /package/kodi
parent0e27605d7b18a2e1dd2bad8b21008db5e8d3fb67 (diff)
add openelec patch for kodi
Diffstat (limited to 'package/kodi')
-rw-r--r--package/kodi/Makefile2
-rw-r--r--package/kodi/patches/openelec.patch1279
2 files changed, 1280 insertions, 1 deletions
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 @@
+ <keyboard>
+ <row>1234567890</row>
+ <row>qwertyuiop</row>
+- <row>asdfghjkl</row>
+- <row>zxcvbnm</row>
++ <row>asdfghjkl:</row>
++ <row>zxcvbnm./@</row>
+ </keyboard>
+ <keyboard modifiers="shift">
+ <row>1234567890</row>
+ <row>QWERTYUIOP</row>
+- <row>ASDFGHJKL</row>
+- <row>ZXCVBNM</row>
++ <row>ASDFGHJKL:</row>
++ <row>ZXCVBNM./@</row>
+ </keyboard>
+ <keyboard modifiers="symbol,shift+symbol">
+ <row>)!@#$%^&amp;*(</row>
+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 @@
+ <setting key="device_type" type="int" value="1" configurable="0" />
+ <setting key="wake_devices_advanced" type="string" value="" configurable="0" />
+ <setting key="standby_devices_advanced" type="string" value="" configurable="0" />
+- <setting key="double_tap_timeout_ms" type="int" min="0" value="300" configurable="0" />
++ <setting key="double_tap_timeout_ms" type="int" min="50" max="1000" step="50" value="300" label="38050" order="16" />
++ <setting key="button_repeat_rate_ms" type="int" min="0" max="250" step="10" value="0" label="38051" order="17" />
++ <setting key="button_release_delay_ms" type="int" min="0" max="500" step="50" value="0" label="38052" order="18" />
+ </peripheral>
+
+ <peripheral vendor_product="2548:1001,2548:1002" bus="usb" name="Pulse-Eight CEC Adapter" mapTo="cec">
+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 @@
+ </setting>
+ </group>
+ </category>
++ <category id="audiooutput">
++ <group id="1">
++ <setting id="audiooutput.supportdtshdcpudecoding" type="boolean" label="38120" help="38121">
++ <level>2</level>
++ <default>false</default>
++ <control type="toggle" />
++ <dependencies>
++ <dependency type="enable">
++ <or>
++ <condition setting="audiooutput.passthrough" operator="is">false</condition>
++ <and>
++ <condition setting="audiooutput.dtshdpassthrough" operator="is">false</condition>
++ <condition setting="audiooutput.dtspassthrough" operator="is">false</condition>
++ </and>
++ </or>
++ </dependency>
++ </dependencies>
++ </setting>
++ </group>
++ </category>
+ </section>
+ <section id="videos">
+ <category id="videoacceleration">
+diff -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 @@
+ </group>
+ </category>
+ <category id="audiooutput">
++ <group id="1">
++ <setting id="audiooutput.supportdtshdcpudecoding">
++ <default>true</default>
++ </setting>
++ </group>
+ <group id="3">
+ <setting id="audiooutput.ac3transcode" help="36429">
+ </setting>
+diff -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 @@
+ <setting id="audiooutput.processquality">
+ <default>101</default> <!-- AE_QUALITY_GPU -->
+ </setting>
++ <setting id="audiooutput.supportdtshdcpudecoding" type="boolean" label="38120" help="38121">
++ <level>2</level>
++ <default>false</default>
++ <control type="toggle" />
++ </setting>
+ </group>
+ <group id="3">
+ <setting id="audiooutput.ac3transcode" help="37024">
+diff -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 <h.leppkes@gmail.com>
++Date: Thu, 19 Mar 2015 23:56:22 +0100
++Subject: [PATCH] avcodec: add libdcadec decoder
++
++Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
++---
++ configure | 4 +
++ libavcodec/Makefile | 1 +
++ libavcodec/allcodecs.c | 1 +
++ libavcodec/libdcadec.c | 197 +++++++++++++++++++++++++++++++++++++++++++++++++
++ 4 files changed, 203 insertions(+)
++ create mode 100644 libavcodec/libdcadec.c
++
++diff --git a/configure b/configure
++index 1bf8f80..a449bc7 100755
++--- a/configure
+++++ b/configure
++@@ -210,6 +210,7 @@ External library support:
++ --enable-libcdio enable audio CD grabbing with libcdio [no]
++ --enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
++ and libraw1394 [no]
+++ --enable-libdcadec enable DCA decoding via libdcadec [no]
++ --enable-libfaac enable AAC encoding via libfaac [no]
++ --enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
++ --enable-libflite enable flite (voice synthesis) support via libflite [no]
++@@ -1353,6 +1354,7 @@ EXTERNAL_LIBRARY_LIST="
++ libcdio
++ libcelt
++ libdc1394
+++ libdcadec
++ libfaac
++ libfdk_aac
++ libflite
++@@ -2359,6 +2361,7 @@ vc1_parser_select="mpegvideo startcode vc1_decoder"
++ # external libraries
++ libaacplus_encoder_deps="libaacplus"
++ libcelt_decoder_deps="libcelt"
+++libdcadec_decoder_deps="libdcadec"
++ libfaac_encoder_deps="libfaac"
++ libfaac_encoder_select="audio_frame_queue"
++ libfdk_aac_decoder_deps="libfdk_aac"
++@@ -4922,6 +4925,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
++ { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
++ die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
++ enabled libcaca && require_pkg_config caca caca.h caca_create_canvas
+++enabled libdcadec && require libdcadec dca_context.h dcadec_context_create -ldcadec
++ enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
++ enabled libfdk_aac && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
++ flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
++diff --git a/libavcodec/Makefile b/libavcodec/Makefile
++index 4173f88..1a0c734 100644
++--- a/libavcodec/Makefile
+++++ b/libavcodec/Makefile
++@@ -732,6 +732,7 @@ OBJS-$(CONFIG_ELBG_FILTER) += elbg.o
++ # external codec libraries
++ OBJS-$(CONFIG_LIBAACPLUS_ENCODER) += libaacplus.o
++ OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o
+++OBJS-$(CONFIG_LIBDCADEC_DECODER) += libdcadec.o
++ OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o
++ OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o
++ OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o
++diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
++index 5194e74..bbf70a6 100644
++--- a/libavcodec/allcodecs.c
+++++ b/libavcodec/allcodecs.c
++@@ -512,6 +512,7 @@ void avcodec_register_all(void)
++
++ /* external libraries */
++ REGISTER_DECODER(LIBCELT, libcelt);
+++ REGISTER_DECODER(LIBDCADEC, libdcadec)
++ REGISTER_ENCODER(LIBFAAC, libfaac);
++ REGISTER_ENCDEC (LIBFDK_AAC, libfdk_aac);
++ REGISTER_ENCDEC (LIBGSM, libgsm);
++diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c
++new file mode 100644
++index 0000000..d060db5
++--- /dev/null
+++++ b/libavcodec/libdcadec.c
++@@ -0,0 +1,197 @@
+++/*
+++ * libdcadec decoder wrapper
+++ * Copyright (C) 2015 Hendrik Leppkes
+++ *
+++ * This file is part of FFmpeg.
+++ *
+++ * FFmpeg is free software; you can redistribute it and/or
+++ * modify it under the terms of the GNU Lesser General Public
+++ * License as published by the Free Software Foundation; either
+++ * version 2.1 of the License, or (at your option) any later version.
+++ *
+++ * FFmpeg is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+++ * Lesser General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU Lesser General Public
+++ * License along with FFmpeg; if not, write to the Free Software
+++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+++ */
+++
+++#include <dca_context.h>
+++
+++#include "libavutil/avassert.h"
+++#include "libavutil/channel_layout.h"
+++#include "libavutil/common.h"
+++#include "libavutil/opt.h"
+++#include "avcodec.h"
+++#include "dca.h"
+++#include "dca_syncwords.h"
+++#include "internal.h"
+++
+++typedef struct DCADecContext {
+++ struct dcadec_context *ctx;
+++ uint8_t *buffer;
+++ int buffer_size;
+++} DCADecContext;
+++
+++static int dcadec_decode_frame(AVCodecContext *avctx, void *data,
+++ int *got_frame_ptr, AVPacket *avpkt)
+++{
+++ DCADecContext *s = avctx->priv_data;
+++ AVFrame *frame = data;
+++ int ret, i, k;
+++ int **samples, nsamples, channel_mask, sample_rate, bits_per_sample, profile;
+++ uint32_t mrk;
+++ uint8_t *input = avpkt->data;
+++ int input_size = avpkt->size;
+++
+++ /* convert bytestream syntax to RAW BE format if required */
+++ mrk = AV_RB32(input);
+++ if (mrk != DCA_SYNCWORD_CORE_BE && mrk != DCA_SYNCWORD_SUBSTREAM) {
+++ s->buffer = av_fast_realloc(s->buffer, &s->buffer_size, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
+++ if (!s->buffer)
+++ return AVERROR(ENOMEM);
+++
+++ if ((ret = avpriv_dca_convert_bitstream(avpkt->data, avpkt->size, s->buffer, s->buffer_size)) < 0)
+++ return ret;
+++
+++ input = s->buffer;
+++ input_size = ret;
+++ }
+++
+++ if ((ret = dcadec_context_parse(s->ctx, input, input_size)) < 0) {
+++ av_log(avctx, AV_LOG_ERROR, "dcadec_context_parse() failed: %d (%s)\n", -ret, dcadec_strerror(ret));
+++ return AVERROR_EXTERNAL;
+++ }
+++ if ((ret = dcadec_context_filter(s->ctx, &samples, &nsamples, &channel_mask,
+++ &sample_rate, &bits_per_sample, &profile)) < 0) {
+++ av_log(avctx, AV_LOG_ERROR, "dcadec_context_filter() failed: %d (%s)\n", -ret, dcadec_strerror(ret));
+++ return AVERROR_EXTERNAL;
+++ }
+++
+++ avctx->channels = av_get_channel_layout_nb_channels(channel_mask);
+++ avctx->channel_layout = channel_mask;
+++ avctx->sample_rate = sample_rate;
+++
+++ av_assert0(bits_per_sample >= 16 && bits_per_sample <= 24);
+++ if (bits_per_sample == 16)
+++ avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
+++ else
+++ avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
+++
+++ avctx->bits_per_raw_sample = bits_per_sample;
+++
+++ switch (profile) {
+++ case DCADEC_PROFILE_DS:
+++ avctx->profile = FF_PROFILE_DTS;
+++ break;
+++ case DCADEC_PROFILE_DS_96_24:
+++ avctx->profile = FF_PROFILE_DTS_96_24;
+++ break;
+++ case DCADEC_PROFILE_DS_ES:
+++ avctx->profile = FF_PROFILE_DTS_ES;
+++ break;
+++ case DCADEC_PROFILE_HD_HRA:
+++ avctx->profile = FF_PROFILE_DTS_HD_HRA;
+++ break;
+++ case DCADEC_PROFILE_HD_MA:
+++ avctx->profile = FF_PROFILE_DTS_HD_MA;
+++ break;
+++ case DCADEC_PROFILE_EXPRESS:
+++ avctx->profile = FF_PROFILE_DTS_EXPRESS;
+++ break;
+++ case DCADEC_PROFILE_UNKNOWN:
+++ default:
+++ avctx->profile = FF_PROFILE_UNKNOWN;
+++ break;
+++ }
+++
+++ /* bitrate is only meaningful if there are no HD extensions, as they distort the bitrate */
+++ if (profile == DCADEC_PROFILE_DS || profile == DCADEC_PROFILE_DS_96_24 || profile == DCADEC_PROFILE_DS_ES) {
+++ struct dcadec_core_info *info = dcadec_context_get_core_info(s->ctx);
+++ avctx->bit_rate = info->bit_rate;
+++ dcadec_context_free_core_info(info);
+++ } else
+++ avctx->bit_rate = 0;
+++
+++ frame->nb_samples = nsamples;
+++ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+++ return ret;
+++
+++ for (i = 0; i < avctx->channels; i++) {
+++ if (frame->format == AV_SAMPLE_FMT_S16P) {
+++ int16_t *plane = (int16_t *)frame->extended_data[i];
+++ for (k = 0; k < nsamples; k++)
+++ plane[k] = samples[i][k];
+++ } else {
+++ int32_t *plane = (int32_t *)frame->extended_data[i];
+++ int shift = 32 - bits_per_sample;
+++ for (k = 0; k < nsamples; k++)
+++ plane[k] = samples[i][k] << shift;
+++ }
+++ }
+++
+++ *got_frame_ptr = 1;
+++
+++ return avpkt->size;
+++}
+++
+++static av_cold void dcadec_flush(AVCodecContext *avctx)
+++{
+++ DCADecContext *s = avctx->priv_data;
+++ dcadec_context_clear(s->ctx);
+++}
+++
+++static av_cold int dcadec_close(AVCodecContext *avctx)
+++{
+++ DCADecContext *s = avctx->priv_data;
+++
+++ dcadec_context_destroy(s->ctx);
+++ s->ctx = NULL;
+++
+++ av_freep(&s->buffer);
+++
+++ return 0;
+++}
+++
+++static av_cold int dcadec_init(AVCodecContext *avctx)
+++{
+++ DCADecContext *s = avctx->priv_data;
+++
+++ s->ctx = dcadec_context_create(0);
+++ if (!s->ctx)
+++ return AVERROR(ENOMEM);
+++
+++ avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
+++ avctx->bits_per_raw_sample = 24;
+++
+++ return 0;
+++}
+++
+++static const AVProfile profiles[] = {
+++ { FF_PROFILE_DTS, "DTS" },
+++ { FF_PROFILE_DTS_ES, "DTS-ES" },
+++ { FF_PROFILE_DTS_96_24, "DTS 96/24" },
+++ { FF_PROFILE_DTS_HD_HRA, "DTS-HD HRA" },
+++ { FF_PROFILE_DTS_HD_MA, "DTS-HD MA" },
+++ { FF_PROFILE_DTS_EXPRESS, "DTS Express" },
+++ { FF_PROFILE_UNKNOWN },
+++};
+++
+++AVCodec ff_libdcadec_decoder = {
+++ .name = "libdcadec",
+++ .long_name = NULL_IF_CONFIG_SMALL("dcadec DCA decoder"),
+++ .type = AVMEDIA_TYPE_AUDIO,
+++ .id = AV_CODEC_ID_DTS,
+++ .priv_data_size = sizeof(DCADecContext),
+++ .init = dcadec_init,
+++ .decode = dcadec_decode_frame,
+++ .close = dcadec_close,
+++ .flush = dcadec_flush,
+++ .capabilities = CODEC_CAP_DR1 | CODEC_CAP_CHANNEL_CONF,
+++ .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_S16P,
+++ AV_SAMPLE_FMT_NONE },
+++ .profiles = NULL_IF_CONFIG_SMALL(profiles),
+++};
++--
++1.9.1
++
+diff -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?= <kasper93@gmail.com>
++Date: Fri, 20 Mar 2015 01:58:25 +0100
++Subject: [PATCH] avcodec: Fix libdcadec include dir
++
++Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
++---
++ configure | 2 +-
++ libavcodec/libdcadec.c | 2 +-
++ 2 files changed, 2 insertions(+), 2 deletions(-)
++
++diff --git a/configure b/configure
++index a449bc7..1ef83e3 100755
++--- a/configure
+++++ b/configure
++@@ -4925,7 +4925,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
++ { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
++ die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
++ enabled libcaca && require_pkg_config caca caca.h caca_create_canvas
++-enabled libdcadec && require libdcadec dca_context.h dcadec_context_create -ldcadec
+++enabled libdcadec && require libdcadec libdcadec/dca_context.h dcadec_context_create -ldcadec
++ enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
++ enabled libfdk_aac && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
++ flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
++diff --git a/libavcodec/libdcadec.c b/libavcodec/libdcadec.c
++index d060db5..a28b983 100644
++--- a/libavcodec/libdcadec.c
+++++ b/libavcodec/libdcadec.c
++@@ -19,7 +19,7 @@
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++-#include <dca_context.h>
+++#include <libdcadec/dca_context.h>
++
++ #include "libavutil/avassert.h"
++ #include "libavutil/channel_layout.h"
++--
++1.9.1
++
+diff -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 <h.leppkes@gmail.com>
++Date: Thu, 19 Mar 2015 23:45:39 +0100
++Subject: [PATCH] avcodec: add profile define for DTS Express
++
++Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
++---
++ libavcodec/avcodec.h | 1 +
++ 1 file changed, 1 insertion(+)
++
++diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
++index cdc8aa1..48e212f 100644
++--- a/libavcodec/avcodec.h
+++++ b/libavcodec/avcodec.h
++@@ -2851,6 +2851,7 @@ typedef struct AVCodecContext {
++ #define FF_PROFILE_DTS_96_24 40
++ #define FF_PROFILE_DTS_HD_HRA 50
++ #define FF_PROFILE_DTS_HD_MA 60
+++#define FF_PROFILE_DTS_EXPRESS 70
++
++ #define FF_PROFILE_MPEG2_422 0
++ #define FF_PROFILE_MPEG2_HIGH 1
++--
++1.9.1
++
+diff -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 @@
+ <!-- RSS feeds. To have multiple feeds, just add a feed to the set. You can also have multiple sets. !-->
+ <!-- To use different sets in your skin, each must be called from skin with a unique id. !-->
+ <set id="1">
++ <feed updateinterval="30">http://feeds.openelec.tv/news</feed>
+ <feed updateinterval="30">http://feeds.xbmc.org/xbmc</feed>
+ <feed updateinterval="30">http://feeds.xbmc.org/latest_xbmc_addons</feed>
+ <feed updateinterval="30">http://feeds.xbmc.org/updated_xbmc_addons</feed>
+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 <string.h>
+ #include <ostream>
+
++#include <iostream>
++#include <dirent.h>
++#include <sys/stat.h>
++
+ 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<CService>(addon)->Start();
+
+@@ -645,6 +661,11 @@
+ if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false))
+ std::static_pointer_cast<CService>(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<CContextItemAddon>(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<CService>(localAddon)->Start();
+
+ if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM))
+ CContextMenuManager::Get().Register(std::static_pointer_cast<CContextItemAddon>(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<CService>(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;