aboutsummaryrefslogtreecommitdiff
path: root/package/kodi
diff options
context:
space:
mode:
authorGravatar Bernd Kuhls <bernd.kuhls@t-online.de>2014-12-23 18:46:27 +0100
committerGravatar Thomas Petazzoni <thomas.petazzoni@free-electrons.com>2014-12-27 19:58:28 +0100
commit3578459748d80cd469729319543b199380a4370f (patch)
tree6e24ab45a2f8d7a729ae213a95f4cdf0854d4760 /package/kodi
parentbc5b451b5ea48eef88ed0713be0af1f65a3c015b (diff)
downloadbuildroot-3578459748d80cd469729319543b199380a4370f.tar.gz
buildroot-3578459748d80cd469729319543b199380a4370f.tar.bz2
package/xbmc: rename to 'kodi', the new upstream project name
Background information: http://xbmc.org/introducing-kodi-14. In a first step to bump version to 14.0-Helix, we move the xbmc package to a new directory called kodi. Appropriate Config.in.legacy variables are added. [Thomas: rename patches to the new convention.] Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Diffstat (limited to 'package/kodi')
-rw-r--r--package/kodi/0001-Fixup-include-path.patch81
-rw-r--r--package/kodi/0002-mathutil.patch213
-rw-r--r--package/kodi/0003-dbus.patch46
-rw-r--r--package/kodi/Config.in241
-rwxr-xr-xpackage/kodi/S50kodi39
-rwxr-xr-xpackage/kodi/br-kodi36
-rw-r--r--package/kodi/kodi.mk260
-rw-r--r--package/kodi/kodi.service12
8 files changed, 928 insertions, 0 deletions
diff --git a/package/kodi/0001-Fixup-include-path.patch b/package/kodi/0001-Fixup-include-path.patch
new file mode 100644
index 0000000000..be99bd6d50
--- /dev/null
+++ b/package/kodi/0001-Fixup-include-path.patch
@@ -0,0 +1,81 @@
+From 63c255f1f5d68363f49193aceed343e602dc8bdf Mon Sep 17 00:00:00 2001
+From: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
+Date: Thu, 26 Dec 2013 21:17:10 +0100
+Subject: [PATCH] Fixup include path
+
+Patch originally taken from :
+http://repository.timesys.com/buildsources/x/xbmc/xbmc-11.0/xbmc-11.0-fixups.patch
+
+Signed-off-by: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
+---
+ lib/enca/configure | 3 ---
+ lib/enca/configure.ac | 3 ---
+ lib/libdvd/libdvdread/misc/dvdread-config.sh | 6 +++---
+ lib/timidity/configure.in | 6 +++---
+ 4 files changed, 6 insertions(+), 12 deletions(-)
+
+diff --git a/lib/enca/configure b/lib/enca/configure
+index c839a51..7af5a09 100644
+--- a/lib/enca/configure
++++ b/lib/enca/configure
+@@ -12011,9 +12011,6 @@ fi
+ if test "$prefix" = "NONE"; then
+ LDFLAGS="$LDFLAGS -L$ac_default_prefix/lib"
+ CPPFLAGS="$CPPFLAGS -I$ac_default_prefix/include"
+-else
+- LDFLAGS="$LDFLAGS -L$prefix/lib"
+- CPPFLAGS="$CPPFLAGS -I$prefix/include"
+ fi
+
+
+diff --git a/lib/enca/configure.ac b/lib/enca/configure.ac
+index 41434df..47d5367 100644
+--- a/lib/enca/configure.ac
++++ b/lib/enca/configure.ac
+@@ -100,9 +100,6 @@ dnl Dirty path hack. Helps some people with badly set up search paths.
+ if test "$prefix" = "NONE"; then
+ LDFLAGS="$LDFLAGS -L$ac_default_prefix/lib"
+ CPPFLAGS="$CPPFLAGS -I$ac_default_prefix/include"
+-else
+- LDFLAGS="$LDFLAGS -L$prefix/lib"
+- CPPFLAGS="$CPPFLAGS -I$prefix/include"
+ fi
+
+ dnl Checks for libraries.
+diff --git a/lib/libdvd/libdvdread/misc/dvdread-config.sh b/lib/libdvd/libdvdread/misc/dvdread-config.sh
+index e170c7e..25ee893 100644
+--- a/lib/libdvd/libdvdread/misc/dvdread-config.sh
++++ b/lib/libdvd/libdvdread/misc/dvdread-config.sh
+@@ -48,9 +48,9 @@ if test "$echo_prefix" = "yes"; then
+ fi
+
+ if test "$echo_cflags" = "yes"; then
+- echo -I$prefix/include $extracflags
++ echo $extracflags
+ fi
+
+ if test "$echo_libs" = "yes"; then
+- echo -L$libdir $dvdreadlib
+-fi
++ echo $dvdreadlib
++fi
+diff --git a/lib/timidity/configure.in b/lib/timidity/configure.in
+index 9f2835b..733470a 100644
+--- a/lib/timidity/configure.in
++++ b/lib/timidity/configure.in
+@@ -100,9 +100,9 @@ done
+
+ # add $prefix if specified.
+ if test "x$prefix" != xNONE -a "x$prefix" != "x$ac_default_prefix" -a "x$prefix" != "x/usr"; then
+- LDFLAGS="-L$prefix/lib $LDFLAGS"
+- SHLDFLAGS="-L$prefix/lib $SHLDFLAGS"
+- CPPFLAGS="-I$prefix/include $CPPFLAGS"
++ LDFLAGS="$LDFLAGS"
++ SHLDFLAGS="$SHLDFLAGS"
++ CPPFLAGS="$CPPFLAGS"
+ fi
+
+ dnl add --with-includes, --with-libraries
+--
+1.8.5.2
+
diff --git a/package/kodi/0002-mathutil.patch b/package/kodi/0002-mathutil.patch
new file mode 100644
index 0000000000..33f91eb38a
--- /dev/null
+++ b/package/kodi/0002-mathutil.patch
@@ -0,0 +1,213 @@
+Taken from upstream PR: https://github.com/xbmc/xbmc/pull/3760
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+
+
+From 7388e8be7cd5e78100532ebf0dba15dccb7b03f8 Mon Sep 17 00:00:00 2001
+From: Ben Avison <bavison@riscosopen.org>
+Date: Tue, 3 Dec 2013 15:51:39 +0000
+Subject: [PATCH] Faster and simpler portable implementation of
+ MathUtils::round_int().
+
+Much as I like a bit of inline assembler, I have also removed the ARM versions
+of MathUtils::truncate_int() and MathUtils::round_int(). The former was just
+how any sane compiler should have assembled a cast from double to signed int
+anyway. The latter was a much too complicated way to achieve the desired
+effect, and was switched out in most ARM builds anyway in favour of the old
+portable implementation that used floor().
+
+Verified that MathUtils::test() still passes, and that GCC is now able to
+inline MathUtils::round_int(), where it didn't previously.
+
+I tested on a Raspberry Pi with the default theme, displaying the front page
+with the RSS ticker enabled. This saturates the CPU, so I'm measuring the
+improvement using the debug window's FPS figure. This patch improves this from
+~50.8 FPS to ~52.6 FPS.
+---
+ xbmc/utils/MathUtils.h | 129 +++++++++++++++++++++++--------------------------
+ 1 file changed, 61 insertions(+), 68 deletions(-)
+
+diff --git a/xbmc/utils/MathUtils.h b/xbmc/utils/MathUtils.h
+index 96af9f4..0dae77d 100644
+--- a/xbmc/utils/MathUtils.h
++++ b/xbmc/utils/MathUtils.h
+@@ -34,17 +34,13 @@
+
+ #if defined(__ppc__) || \
+ defined(__powerpc__) || \
+- (defined(TARGET_DARWIN_IOS) && defined(__llvm__)) || \
+- (defined(TARGET_ANDROID) && defined(__arm__)) || \
+- defined(TARGET_RASPBERRY_PI)
++ defined(__arm__)
+ #define DISABLE_MATHUTILS_ASM_ROUND_INT
+ #endif
+
+ #if defined(__ppc__) || \
+ defined(__powerpc__) || \
+- (defined(TARGET_DARWIN) && defined(__llvm__)) || \
+- (defined(TARGET_ANDROID) && defined(__arm__)) || \
+- defined(TARGET_RASPBERRY_PI)
++ defined(__arm__)
+ #define DISABLE_MATHUTILS_ASM_TRUNCATE_INT
+ #endif
+
+@@ -73,60 +69,63 @@
+ {
+ assert(x > static_cast<double>(INT_MIN / 2) - 1.0);
+ assert(x < static_cast<double>(INT_MAX / 2) + 1.0);
+- const float round_to_nearest = 0.5f;
+- int i;
+
+ #if defined(DISABLE_MATHUTILS_ASM_ROUND_INT)
+- i = floor(x + round_to_nearest);
+-
+-#elif defined(__arm__)
+- // From 'ARM-v7-M Architecture Reference Manual' page A7-569:
+- // "The floating-point to integer operation (vcvt) [normally] uses the Round towards Zero rounding mode"
+- // Because of this...we must use some less-than-straightforward logic to perform this operation without
+- // changing the rounding mode flags
+-
+- /* The assembly below implements the following logic:
+- if (x < 0)
+- inc = -0.5f
+- else
+- inc = 0.5f
+- int_val = trunc(x+inc);
+- err = x - int_val;
+- if (err == 0.5f)
+- int_val++;
+- return int_val;
+- */
++ /* This implementation warrants some further explanation.
++ *
++ * First, a couple of notes on rounding:
++ * 1) C casts from float/double to integer round towards zero.
++ * 2) Float/double additions are rounded according to the normal rules,
++ * in other words: on some architectures, it's fixed at compile-time,
++ * and on others it can be set using fesetround()). The following
++ * analysis assumes round-to-nearest with ties rounding to even. This
++ * is a fairly sensible choice, and is the default with ARM VFP.
++ *
++ * What this function wants is round-to-nearest with ties rounding to
++ * +infinity. This isn't an IEEE rounding mode, even if we could guarantee
++ * that all architectures supported fesetround(), which they don't. Instead,
++ * this adds an offset of 2147483648.5 (= 0x80000000.8p0), then casts to
++ * an unsigned int (crucially, all possible inputs are now in a range where
++ * round to zero acts the same as round to -infinity) and then subtracts
++ * 0x80000000 in the integer domain. The 0.5 component of the offset
++ * converts what is effectively a round down into a round to nearest, with
++ * ties rounding up, as desired.
++ *
++ * There is a catch, that because there is a double rounding, there is a
++ * small region where the input falls just *below* a tie, where the addition
++ * of the offset causes a round *up* to an exact integer, due to the finite
++ * level of precision available in floating point. You need to be aware of
++ * this when calling this function, although at present it is not believed
++ * that XBMC ever attempts to round numbers in this window.
++ *
++ * It is worth proving the size of the affected window. Recall that double
++ * precision employs a mantissa of 52 bits.
++ * 1) For all inputs -0.5 <= x <= INT_MAX
++ * Once the offset is applied, the most significant binary digit in the
++ * floating-point representation is +2^31.
++ * At this magnitude, the smallest step representable in double precision
++ * is 2^31 / 2^52 = 0.000000476837158203125
++ * So the size of the range which is rounded up due to the addition is
++ * half the size of this step, or 0.0000002384185791015625
++ *
++ * 2) For all inputs INT_MIN/2 < x < -0.5
++ * Once the offset is applied, the most significant binary digit in the
++ * floating-point representation is +2^30.
++ * At this magnitude, the smallest step representable in double precision
++ * is 2^30 / 2^52 = 0.0000002384185791015625
++ * So the size of the range which is rounded up due to the addition is
++ * half the size of this step, or 0.00000011920928955078125
++ *
++ * 3) For all inputs INT_MIN <= x <= INT_MIN/2
++ * The representation once the offset is applied has equal or greater
++ * precision than the input, so the addition does not cause rounding.
++ */
++ return ((unsigned int) (x + 0x80000000.8p0)) - 0x80000000;
+
+- __asm__ __volatile__ (
+-#if defined(__ARM_PCS_VFP)
+- "fconstd d1,#%G[rnd_val] \n\t" // Copy round_to_nearest into a working register (d1 = 0.5)
+ #else
+- "vmov.F64 d1,%[rnd_val] \n\t"
+-#endif
+- "fcmpezd %P[value] \n\t" // Check value against zero (value == 0?)
+- "fmstat \n\t" // Copy the floating-point status flags into the general-purpose status flags
+- "it mi \n\t"
+- "vnegmi.F64 d1, d1 \n\t" // if N-flag is set, negate round_to_nearest (if (value < 0) d1 = -1 * d1)
+- "vadd.F64 d1,%P[value],d1 \n\t" // Add round_to_nearest to value, store result in working register (d1 += value)
+- "vcvt.S32.F64 s3,d1 \n\t" // Truncate(round towards zero) (s3 = (int)d1)
+- "vmov %[result],s3 \n\t" // Store the integer result in a general-purpose register (result = s3)
+- "vcvt.F64.S32 d1,s3 \n\t" // Convert back to floating-point (d1 = (double)s3)
+- "vsub.F64 d1,%P[value],d1 \n\t" // Calculate the error (d1 = value - d1)
+-#if defined(__ARM_PCS_VFP)
+- "fconstd d2,#%G[rnd_val] \n\t" // d2 = 0.5;
+-#else
+- "vmov.F64 d2,%[rnd_val] \n\t"
+-#endif
+- "fcmped d1, d2 \n\t" // (d1 == 0.5?)
+- "fmstat \n\t" // Copy the floating-point status flags into the general-purpose status flags
+- "it eq \n\t"
+- "addeq %[result],#1 \n\t" // (if (d1 == d2) result++;)
+- : [result] "=r"(i) // Outputs
+- : [rnd_val] "Dv" (round_to_nearest), [value] "w"(x) // Inputs
+- : "d1", "d2", "s3" // Clobbers
+- );
+-
+-#elif defined(__SSE2__)
++ const float round_to_nearest = 0.5f;
++ int i;
++#if defined(__SSE2__)
+ const float round_dn_to_nearest = 0.4999999f;
+ i = (x > 0) ? _mm_cvttsd_si32(_mm_set_sd(x + round_to_nearest)) : _mm_cvttsd_si32(_mm_set_sd(x - round_dn_to_nearest));
+
+@@ -150,8 +149,8 @@
+ );
+
+ #endif
+-
+ return i;
++#endif
+ }
+
+ /*! \brief Truncate to nearest integer.
+@@ -165,20 +164,13 @@
+ {
+ assert(x > static_cast<double>(INT_MIN / 2) - 1.0);
+ assert(x < static_cast<double>(INT_MAX / 2) + 1.0);
+- int i;
+
+ #if defined(DISABLE_MATHUTILS_ASM_TRUNCATE_INT)
+- return i = (int)x;
+-
+-#elif defined(__arm__)
+- __asm__ __volatile__ (
+- "vcvt.S32.F64 %[result],%P[value] \n\t" // Truncate(round towards zero) and store the result
+- : [result] "=w"(i) // Outputs
+- : [value] "w"(x) // Inputs
+- );
+- return i;
++ return x;
+
+-#elif defined(TARGET_WINDOWS)
++#else
++ int i;
++#if defined(TARGET_WINDOWS)
+ const float round_towards_m_i = -0.5f;
+ __asm
+ {
+@@ -204,6 +196,7 @@
+ if (x < 0)
+ i = -i;
+ return (i);
++#endif
+ }
+
+ inline int64_t abs(int64_t a)
+--
+1.9.1
+
diff --git a/package/kodi/0003-dbus.patch b/package/kodi/0003-dbus.patch
new file mode 100644
index 0000000000..3b63b23b77
--- /dev/null
+++ b/package/kodi/0003-dbus.patch
@@ -0,0 +1,46 @@
+build: make D-Bus configurable
+
+Patch accepted upstream:
+https://github.com/xbmc/xbmc/commit/630f930d4c9c33230e9ff7df24f93afb3f05881f
+
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+
+diff -uNr xbmc-13.2-Gotham.org/configure.in xbmc-13.2-Gotham/configure.in
+--- xbmc-13.2-Gotham.org/configure.in 2014-08-17 15:19:05.000000000 +0200
++++ xbmc-13.2-Gotham/configure.in 2014-09-02 20:55:06.932442467 +0200
+@@ -129,6 +129,7 @@
+ goom_enabled="== GOOM enabled. =="
+ goom_disabled="== GOOM disabled. =="
+ alsa_disabled="== ALSA support disabled. =="
++dbus_disabled="== DBUS support disabled. =="
+ rsxs_enabled="== RSXS enabled. =="
+ rsxs_disabled="== RSXS disabled. =="
+ fishbmc_enabled="== FishBMC enabled. =="
+@@ -369,6 +370,12 @@
+ [use_alsa=$enableval],
+ [use_alsa=yes])
+
++AC_ARG_ENABLE([dbus],
++ [AS_HELP_STRING([--disable-dbus],
++ [disable DBUS support])],
++ [use_dbus=$enableval],
++ [use_dbus=yes])
++
+ AC_ARG_ENABLE([pulse],
+ [AS_HELP_STRING([--enable-pulse],
+ [enable PulseAudio support (default is auto)])],
+@@ -1253,10 +1260,14 @@
+ [INCLUDES="$INCLUDES $ALSA_CFLAGS"; LIBS="$LIBS $ALSA_LIBS"; use_alsa=yes],
+ AC_MSG_NOTICE($alsa_not_found); use_alsa=no)
+ fi
++if test "x$use_dbus" != "xno"; then
+ PKG_CHECK_MODULES([DBUS], [dbus-1],
+ [INCLUDES="$INCLUDES $DBUS_CFLAGS"; LIBS="$LIBS $DBUS_LIBS"; use_dbus=yes]; \
+ AC_DEFINE([HAVE_DBUS],[1],["Define to 1 if dbus is installed"]),
+ AC_MSG_NOTICE($missing_library); use_dbus=no)
++else
++ AC_MSG_NOTICE($dbus_disabled)
++fi
+ if test "x$use_sdl" != "xno"; then
+ PKG_CHECK_MODULES([SDL], [sdl],
+ [INCLUDES="$INCLUDES $SDL_CFLAGS"; LIBS="$LIBS $SDL_LIBS"],
diff --git a/package/kodi/Config.in b/package/kodi/Config.in
new file mode 100644
index 0000000000..1b0651213a
--- /dev/null
+++ b/package/kodi/Config.in
@@ -0,0 +1,241 @@
+config BR2_PACKAGE_KODI_ARCH_SUPPORTS
+ bool
+ default y if BR2_arm || BR2_i386 || BR2_x86_64
+
+comment "kodi needs a toolchain w/ C++, IPv6, largefile, threads, wchar"
+ depends on BR2_PACKAGE_KODI_ARCH_SUPPORTS
+ depends on !BR2_INET_IPV6 || !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_USE_WCHAR
+ depends on BR2_USE_MMU
+
+config BR2_PACKAGE_KODI_EGL_GLES
+ bool
+ default y
+ depends on BR2_PACKAGE_HAS_LIBEGL
+ depends on BR2_PACKAGE_HAS_LIBGLES
+ depends on !BR2_PACKAGE_KODI_GL # prefer GL if available
+
+config BR2_PACKAGE_KODI_GL
+ bool
+ default y
+ depends on BR2_PACKAGE_HAS_LIBGL
+ depends on !BR2_arm # kodi needs egl/gles on arm
+
+comment "kodi needs an OpenGL or an openGL ES and EGL backend"
+ depends on BR2_i386 || BR2_x86_64
+ depends on !BR2_PACKAGE_KODI_GL && !BR2_PACKAGE_KODI_EGL_GLES
+
+comment "kodi requires an OpenGL ES and EGL backend"
+ depends on BR2_arm
+ depends on !BR2_PACKAGE_KODI_EGL_GLES
+
+menuconfig BR2_PACKAGE_KODI
+ bool "kodi"
+ select BR2_NEEDS_HOST_JAVA
+ select BR2_PACKAGE_BOOST
+ select BR2_PACKAGE_BOOST_THREAD
+ select BR2_PACKAGE_BZIP2
+ select BR2_PACKAGE_EXPAT
+ select BR2_PACKAGE_FLAC
+ select BR2_PACKAGE_FONTCONFIG
+ select BR2_PACKAGE_FREETYPE
+ select BR2_PACKAGE_JASPER
+ select BR2_PACKAGE_JPEG
+ select BR2_PACKAGE_LIBASS
+ select BR2_PACKAGE_LIBCDIO
+ select BR2_PACKAGE_LIBCURL
+ select BR2_PACKAGE_LIBFRIBIDI
+ select BR2_PACKAGE_LIBGLEW if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_LIBGLU if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_LIBGCRYPT
+ select BR2_PACKAGE_LIBID3TAG
+ select BR2_PACKAGE_LIBMAD
+ select BR2_PACKAGE_LIBMODPLUG
+ select BR2_PACKAGE_LIBMPEG2
+ select BR2_PACKAGE_LIBOGG
+ select BR2_PACKAGE_LIBPLIST
+ select BR2_PACKAGE_LIBPNG
+ select BR2_PACKAGE_LIBSAMPLERATE
+ select BR2_PACKAGE_LIBUNGIF
+ select BR2_PACKAGE_LIBVORBIS
+ select BR2_PACKAGE_LIBXML2
+ select BR2_PACKAGE_LIBXSLT
+ select BR2_PACKAGE_LZO
+ select BR2_PACKAGE_NCURSES
+ select BR2_PACKAGE_OPENSSL
+ select BR2_PACKAGE_PCRE
+ select BR2_PACKAGE_PCRE_UCP
+ select BR2_PACKAGE_PYTHON
+ select BR2_PACKAGE_PYTHON_BSDDB
+ select BR2_PACKAGE_PYTHON_BZIP2
+ select BR2_PACKAGE_PYTHON_CURSES
+ select BR2_PACKAGE_PYTHON_PYEXPAT
+ select BR2_PACKAGE_PYTHON_READLINE
+ select BR2_PACKAGE_PYTHON_SQLITE
+ select BR2_PACKAGE_PYTHON_SSL
+ select BR2_PACKAGE_PYTHON_UNICODEDATA
+ select BR2_PACKAGE_PYTHON_ZLIB
+ select BR2_PACKAGE_READLINE
+ select BR2_PACKAGE_SDL if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_SDL_X11 if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_SDL_IMAGE if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_SQLITE
+ select BR2_PACKAGE_TAGLIB
+ select BR2_PACKAGE_TIFF
+ select BR2_PACKAGE_TINYXML
+ select BR2_PACKAGE_XLIB_XMU if BR2_PACKAGE_KODI_GL # needed by rsxs screensaver
+ select BR2_PACKAGE_XLIB_XRANDR if BR2_PACKAGE_KODI_GL
+ select BR2_PACKAGE_XLIB_XT if BR2_PACKAGE_KODI_GL # needed by rsxs screensaver
+ select BR2_PACKAGE_YAJL
+ select BR2_PACKAGE_ZLIB
+ depends on BR2_INET_IPV6
+ depends on BR2_INSTALL_LIBSTDCPP
+ depends on BR2_LARGEFILE
+ depends on BR2_TOOLCHAIN_HAS_THREADS
+ depends on BR2_PACKAGE_KODI_EGL_GLES || BR2_PACKAGE_KODI_GL
+ depends on BR2_USE_MMU # python
+ depends on BR2_USE_WCHAR
+ depends on BR2_PACKAGE_KODI_ARCH_SUPPORTS
+ help
+ Kodi is an award-winning free and open source (GPL) software
+ media player and entertainment hub for digital media.
+
+ http://kodi.tv
+
+if BR2_PACKAGE_KODI
+
+config BR2_PACKAGE_KODI_ALSA_LIB
+ bool "alsa"
+ select BR2_PACKAGE_ALSA_LIB
+ help
+ Enable alsa support.
+
+config BR2_PACKAGE_KODI_AVAHI
+ bool "avahi"
+ depends on !BR2_STATIC_LIBS # avahi
+ select BR2_PACKAGE_AVAHI
+ select BR2_PACKAGE_AVAHI_DAEMON
+ help
+ Enable Avahi support.
+ Select this if you want Kodi to support Bonjour protocol.
+
+config BR2_PACKAGE_KODI_DBUS
+ bool "dbus"
+ select BR2_PACKAGE_DBUS
+ help
+ Enable D-Bus support
+
+config BR2_PACKAGE_KODI_LIBBLURAY
+ bool "blu-ray"
+ select BR2_PACKAGE_LIBBLURAY
+ depends on !BR2_STATIC_LIBS
+ help
+ Enable Blu-ray input support.
+ Select this if you want to play back Blu-ray content.
+
+comment "libbluray support needs a toolchain w/ dynamic library"
+ depends on BR2_STATIC_LIBS
+
+config BR2_PACKAGE_KODI_GOOM
+ bool "goom screensaver"
+ depends on BR2_PACKAGE_KODI_GL
+ help
+ Enable goom screensaver
+
+comment "goom needs an OpenGL backend"
+ depends on !BR2_PACKAGE_KODI_GL
+
+config BR2_PACKAGE_KODI_RSXS
+ bool "rsxs screensaver"
+ depends on BR2_PACKAGE_KODI_GL
+ help
+ Enable goom screensaver
+
+comment "rsxs needs an OpenGL backend"
+ depends on !BR2_PACKAGE_KODI_GL
+
+config BR2_PACKAGE_KODI_LIBCEC
+ bool "hdmi cec"
+ depends on !BR2_STATIC_LIBS # libcec
+ depends on BR2_PACKAGE_HAS_UDEV
+ select BR2_PACKAGE_LIBCEC
+ help
+ Enable CEC (Consumer Electronics Control) support.
+ Select this if you want Kodi to support HDMI CEC.
+
+comment "hdmi cec support needs udev /dev management and a toolchain w/ dynamic library"
+ depends on BR2_STATIC_LIBS || !BR2_PACKAGE_HAS_UDEV
+
+config BR2_PACKAGE_KODI_LIBMICROHTTPD
+ bool "web server"
+ select BR2_PACKAGE_LIBMICROHTTPD
+ help
+ Enable webserver feature
+
+config BR2_PACKAGE_KODI_LIBNFS
+ bool "nfs"
+ depends on BR2_TOOLCHAIN_HAS_NATIVE_RPC
+ select BR2_PACKAGE_LIBNFS
+ help
+ Enable NFS server support.
+
+comment "nfs support needs a toolchain w/ RPC support"
+ depends on !BR2_TOOLCHAIN_HAS_NATIVE_RPC
+
+config BR2_PACKAGE_KODI_RTMPDUMP
+ bool "rtmp"
+ select BR2_PACKAGE_RTMPDUMP
+ help
+ Enable RTMP input support.
+ Select this if you want to play back rtmp stream.
+
+config BR2_PACKAGE_KODI_LIBSHAIRPLAY
+ bool "shairport"
+ select BR2_PACKAGE_LIBSHAIRPLAY
+ help
+ Enable Shairport support.
+ Select this if you want to stream content from an Apple device.
+
+config BR2_PACKAGE_KODI_LIBSMBCLIENT
+ bool "samba"
+ select BR2_PACKAGE_SAMBA
+ select BR2_PACKAGE_SAMBA_LIBSMBCLIENT
+ help
+ Enable Samba support
+
+config BR2_PACKAGE_KODI_LIBTHEORA
+ bool "theora"
+ select BR2_PACKAGE_LIBTHEORA
+ help
+ Enable Theora input support.
+ Select this if you want to play back OGG/OGV files (Video).
+
+config BR2_PACKAGE_KODI_LIBUSB
+ bool "usb"
+ select BR2_PACKAGE_LIBUSB
+ select BR2_PACKAGE_LIBUSB_COMPAT
+ help
+ Enable libusb support.
+
+config BR2_PACKAGE_KODI_LIBVA
+ bool "va"
+ select BR2_PACKAGE_LIBVA
+ depends on !BR2_STATIC_LIBS
+ help
+ Enable libva support.
+
+comment "libva support needs toolchain w/ dynamic library"
+ depends on BR2_STATIC_LIBS
+
+config BR2_PACKAGE_KODI_WAVPACK
+ bool "wavpack"
+ select BR2_PACKAGE_WAVPACK
+ help
+ Enable WAV input support.
+ Select this if you want to play back WV files.
+
+comment "Kodi addons"
+
+source "package/xbmc-addon-xvdr/Config.in"
+source "package/xbmc-pvr-addons/Config.in"
+
+endif # BR2_PACKAGE_KODI
diff --git a/package/kodi/S50kodi b/package/kodi/S50kodi
new file mode 100755
index 0000000000..3b0049f554
--- /dev/null
+++ b/package/kodi/S50kodi
@@ -0,0 +1,39 @@
+#!/bin/sh
+#
+# Starts Kodi
+#
+
+BIN=/usr/bin/br-kodi
+KODI=/usr/lib/xbmc/xbmc.bin
+KODI_ARGS="--standalone -fs -n"
+PIDFILE=/var/run/kodi.pid
+
+start() {
+ echo -n "Starting Kodi: "
+ start-stop-daemon -S -q -b -m -p $PIDFILE --exec $BIN -- $KODI $KODI_ARGS
+ [ $? = 0 ] && echo "OK" || echo "FAIL"
+}
+stop() {
+ echo -n "Stopping Kodi: "
+ start-stop-daemon -K -q -p $PIDFILE
+ [ $? = 0 ] && echo "OK" || echo "FAIL"
+}
+restart() {
+ stop
+ start
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart|reload)
+ restart
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart}"
+ exit 1
+esac
diff --git a/package/kodi/br-kodi b/package/kodi/br-kodi
new file mode 100755
index 0000000000..83d4d4e5ac
--- /dev/null
+++ b/package/kodi/br-kodi
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# We're called with the real Kodi executable as
+# first argument, followed by any Kodi extra args
+KODI="${1}"
+shift
+
+# In case someone asked we terminate, just kill
+# the Kodi process
+trap_kill() {
+ LOOP=0
+ killall "${KODI##*/}"
+}
+trap trap_kill INT QUIT TERM
+
+LOOP=1
+while [ ${LOOP} -eq 1 ]; do
+ # Hack: BusyBox ash does not catch signals while a non-builtin
+ # is running, and only catches the signal when the non-builtin
+ # command ends. So, we just background the Kodi binary, and wait
+ # for it. But BusyBox' ash's wait builtin does not return the
+ # exit code even if there was only one job (which is correct
+ # for POSIX). So we explicitly wait for the Kodi job
+ "${KODI}" "${@}" &
+ wait %1
+ ret=$?
+ case "${ret}" in
+ 0) ;;
+ 64) poweroff; LOOP=0;;
+ 66) reboot; LOOP=0;;
+ *) # Crash
+ sleep 1
+ ;;
+ esac
+done
+exit ${ret}
diff --git a/package/kodi/kodi.mk b/package/kodi/kodi.mk
new file mode 100644
index 0000000000..c462ab30da
--- /dev/null
+++ b/package/kodi/kodi.mk
@@ -0,0 +1,260 @@
+################################################################################
+#
+# kodi
+#
+################################################################################
+
+KODI_VERSION = 13.2-Gotham
+KODI_SITE = $(call github,xbmc,xbmc,$(KODI_VERSION))
+KODI_LICENSE = GPLv2
+KODI_LICENSE_FILES = LICENSE.GPL
+# Kodi needs host-sdl_image (and therefore host-sdl) for a host tools it builds
+# called TexturePacker. It is responsible to take all the images used in the
+# GUI and pack them in a blob.
+# http://wiki.xbmc.org/index.php?title=TexturePacker
+KODI_DEPENDENCIES = host-gawk host-gettext host-gperf host-infozip host-lzo host-sdl_image host-swig
+KODI_DEPENDENCIES += boost bzip2 expat flac fontconfig freetype jasper jpeg \
+ libass libcdio libcurl libfribidi libgcrypt libmad libmodplug libmpeg2 \
+ libogg libplist libpng libsamplerate libungif libvorbis libxml2 libxslt lzo ncurses \
+ openssl pcre python readline sqlite taglib tiff tinyxml yajl zlib
+
+# kodi@i386 depends on nasm
+KODI_DEPENDENCIES += $(if $(BR2_i386),host-nasm)
+
+# ffmpeg depends on yasm on MMX archs
+# kodi configure passes $(BR2_ARCH) to ffmpeg configure which adds
+# yasm as dependency for x86_64, even if BR2_x86_generic=y
+ifneq ($(BR2_X86_CPU_HAS_MMX)$(BR2_x86_64),)
+KODI_DEPENDENCIES += host-yasm
+endif
+
+KODI_CONF_ENV = \
+ PYTHON_VERSION="$(PYTHON_VERSION_MAJOR)" \
+ PYTHON_LDFLAGS="-lpython$(PYTHON_VERSION_MAJOR) -lpthread -ldl -lutil -lm" \
+ PYTHON_CPPFLAGS="-I$(STAGING_DIR)/usr/include/python$(PYTHON_VERSION_MAJOR)" \
+ PYTHON_SITE_PKG="$(STAGING_DIR)/usr/lib/python$(PYTHON_VERSION_MAJOR)/site-packages" \
+ PYTHON_NOVERSIONCHECK="no-check" \
+ use_texturepacker_native=yes \
+ USE_TEXTUREPACKER_NATIVE_ROOT="$(HOST_DIR)/usr" \
+ TEXTUREPACKER_NATIVE_ROOT="$(HOST_DIR)/usr"
+
+KODI_CONF_OPTS += \
+ --with-arch=$(BR2_ARCH) \
+ --disable-crystalhd \
+ --disable-dvdcss \
+ --disable-hal \
+ --disable-joystick \
+ --disable-mysql \
+ --disable-openmax \
+ --disable-optical-drive \
+ --disable-projectm \
+ --disable-pulse \
+ --disable-ssh \
+ --disable-vdpau \
+ --disable-vtbdecoder \
+ --enable-optimizations
+
+ifeq ($(BR2_PACKAGE_RPI_USERLAND),y)
+KODI_DEPENDENCIES += rpi-userland
+KODI_CONF_OPTS += --with-platform=raspberry-pi --enable-player=omxplayer
+KODI_CONF_ENV += INCLUDES="-I$(STAGING_DIR)/usr/include/interface/vcos/pthreads \
+ -I$(STAGING_DIR)/usr/include/interface/vmcs_host/linux" \
+ LIBS="-lvcos -lvchostif"
+endif
+
+ifeq ($(BR2_PACKAGE_LIBCAP),y)
+KODI_CONF_OPTS += --enable-libcap
+KODI_DEPENDENCIES += libcap
+else
+KODI_CONF_OPTS += --disable-libcap
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_DBUS),y)
+KODI_DEPENDENCIES += dbus
+KODI_CONF_OPTS += --enable-dbus
+else
+KODI_CONF_OPTS += --disable-dbus
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_ALSA_LIB),y)
+KODI_DEPENDENCIES += alsa-lib
+KODI_CONF_OPTS += --enable-alsa
+else
+KODI_CONF_OPTS += --disable-alsa
+endif
+
+ifeq ($(BR2_PACKAGE_LAME),y)
+KODI_DEPENDENCIES += lame
+KODI_CONF_OPTS += --enable-libmp3lame
+else
+KODI_CONF_OPTS += --disable-libmp3lame
+endif
+
+# quote from kodi/configure.in: "GLES overwrites GL if both set to yes."
+# we choose the opposite because opengl offers more features, like libva support
+ifeq ($(BR2_PACKAGE_KODI_GL),y)
+KODI_DEPENDENCIES += libglew libglu libgl sdl_image xlib_libX11 xlib_libXext \
+ xlib_libXmu xlib_libXrandr xlib_libXt
+KODI_CONF_OPTS += --enable-gl --enable-sdl --enable-x11 --enable-xrandr --disable-gles
+ifeq ($(BR2_PACKAGE_KODI_RSXS),y)
+# fix rsxs compile
+# make sure target libpng-config is used, options taken from rsxs-0.9/acinclude.m4
+KODI_CONF_ENV += \
+ jm_cv_func_gettimeofday_clobber=no \
+ mac_cv_pkg_png=$(STAGING_DIR)/usr/bin/libpng-config \
+ mac_cv_pkg_cppflags="`$(STAGING_DIR)/usr/bin/libpng-config --I_opts --cppflags`" \
+ mac_cv_pkg_cxxflags="`$(STAGING_DIR)/usr/bin/libpng-config --ccopts`" \
+ mac_cv_pkg_ldflags="`$(STAGING_DIR)/usr/bin/libpng-config --L_opts --R_opts`" \
+ mac_cv_pkg_libs="`$(STAGING_DIR)/usr/bin/libpng-config --libs`"
+KODI_CONF_OPTS += --enable-rsxs
+else
+KODI_CONF_OPTS += --disable-rsxs
+endif
+else
+KODI_CONF_OPTS += --disable-gl --disable-rsxs --disable-sdl --disable-x11 --disable-xrandr
+ifeq ($(BR2_PACKAGE_KODI_EGL_GLES),y)
+KODI_DEPENDENCIES += libegl libgles
+KODI_CONF_OPTS += --enable-gles
+else
+KODI_CONF_OPTS += --disable-gles
+endif
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_GOOM),y)
+KODI_CONF_OPTS += --enable-goom
+else
+KODI_CONF_OPTS += --disable-goom
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBUSB),y)
+KODI_DEPENDENCIES += libusb-compat
+KODI_CONF_OPTS += --enable-libusb
+else
+KODI_CONF_OPTS += --disable-libusb
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBMICROHTTPD),y)
+KODI_DEPENDENCIES += libmicrohttpd
+KODI_CONF_OPTS += --enable-webserver
+else
+KODI_CONF_OPTS += --disable-webserver
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBSMBCLIENT),y)
+KODI_DEPENDENCIES += samba
+KODI_CONF_OPTS += --enable-samba
+else
+KODI_CONF_OPTS += --disable-samba
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBNFS),y)
+KODI_DEPENDENCIES += libnfs
+KODI_CONF_OPTS += --enable-nfs
+else
+KODI_CONF_OPTS += --disable-nfs
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_RTMPDUMP),y)
+KODI_DEPENDENCIES += rtmpdump
+KODI_CONF_OPTS += --enable-rtmp
+else
+KODI_CONF_OPTS += --disable-rtmp
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBBLURAY),y)
+KODI_DEPENDENCIES += libbluray
+KODI_CONF_OPTS += --enable-libbluray
+else
+KODI_CONF_OPTS += --disable-libbluray
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBSHAIRPLAY),y)
+KODI_DEPENDENCIES += libshairplay
+KODI_CONF_OPTS += --enable-airplay
+else
+KODI_CONF_OPTS += --disable-airplay
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_AVAHI),y)
+KODI_DEPENDENCIES += avahi
+KODI_CONF_OPTS += --enable-avahi
+else
+KODI_CONF_OPTS += --disable-avahi
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBCEC),y)
+KODI_DEPENDENCIES += libcec
+KODI_CONF_OPTS += --enable-libcec
+else
+KODI_CONF_OPTS += --disable-libcec
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_WAVPACK),y)
+KODI_DEPENDENCIES += wavpack
+endif
+
+ifeq ($(BR2_PACKAGE_KODI_LIBTHEORA),y)
+KODI_DEPENDENCIES += libtheora
+endif
+
+# kodi needs libva & libva-glx
+ifeq ($(BR2_PACKAGE_KODI_LIBVA)$(BR2_PACKAGE_MESA3D_DRI_DRIVER),yy)
+KODI_DEPENDENCIES += mesa3d libva
+KODI_CONF_OPTS += --enable-vaapi
+else
+KODI_CONF_OPTS += --disable-vaapi
+endif
+
+# Add HOST_DIR to PATH for codegenerator.mk to find swig
+define KODI_BOOTSTRAP
+ cd $(@D) && PATH=$(BR_PATH) ./bootstrap
+endef
+KODI_PRE_CONFIGURE_HOOKS += KODI_BOOTSTRAP
+
+define KODI_CLEAN_UNUSED_ADDONS
+ rm -Rf $(TARGET_DIR)/usr/share/xbmc/addons/screensaver.rsxs.plasma
+ rm -Rf $(TARGET_DIR)/usr/share/xbmc/addons/visualization.milkdrop
+ rm -Rf $(TARGET_DIR)/usr/share/xbmc/addons/visualization.projectm
+ rm -Rf $(TARGET_DIR)/usr/share/xbmc/addons/visualization.itunes
+endef
+KODI_POST_INSTALL_TARGET_HOOKS += KODI_CLEAN_UNUSED_ADDONS
+
+define KODI_CLEAN_CONFLUENCE_SKIN
+ find $(TARGET_DIR)/usr/share/xbmc/addons/skin.confluence/media -name *.png -delete
+ find $(TARGET_DIR)/usr/share/xbmc/addons/skin.confluence/media -name *.jpg -delete
+endef
+KODI_POST_INSTALL_TARGET_HOOKS += KODI_CLEAN_CONFLUENCE_SKIN
+
+define KODI_INSTALL_BR_WRAPPER
+ $(INSTALL) -D -m 0755 package/kodi/br-kodi \
+ $(TARGET_DIR)/usr/bin/br-kodi
+endef
+KODI_POST_INSTALL_TARGET_HOOKS += KODI_INSTALL_BR_WRAPPER
+
+# When run from a startup script, Kodi has no $HOME where to store its
+# configuration, so ends up storing it in /.xbmc (yes, at the root of
+# the rootfs). This is a problem for read-only filesystems. But we can't
+# easily change that, so create /.xbmc as a symlink where we want the
+# config to eventually be.
+define KODI_INSTALL_CONFIG_DIR
+ $(INSTALL) -d -m 0755 $(TARGET_DIR)/var/kodi
+ ln -sf /var/kodi $(TARGET_DIR)/.xbmc
+endef
+KODI_POST_INSTALL_TARGET_HOOKS += KODI_INSTALL_CONFIG_DIR
+
+define KODI_INSTALL_INIT_SYSV
+ $(INSTALL) -D -m 755 package/kodi/S50kodi \
+ $(TARGET_DIR)/etc/init.d/S50kodi
+endef
+
+define KODI_INSTALL_INIT_SYSTEMD
+ $(INSTALL) -D -m 644 package/kodi/kodi.service \
+ $(TARGET_DIR)/etc/systemd/system/kodi.service
+
+ mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
+
+ ln -fs ../kodi.service \
+ $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/kodi.service
+endef
+
+$(eval $(autotools-package))
diff --git a/package/kodi/kodi.service b/package/kodi/kodi.service
new file mode 100644
index 0000000000..acd3b8e34b
--- /dev/null
+++ b/package/kodi/kodi.service
@@ -0,0 +1,12 @@
+[Unit]
+Description = Kodi Entertainment Center
+After = network.target
+
+[Service]
+Type = simple
+ExecStart = /usr/lib/xbmc/xbmc.bin --standalone -fs -n
+Restart = on-failure
+
+[Install]
+WantedBy = multi-user.target
+