[openbricks-][r15958] [panda] xbmc : bump version to 12.1

16 views
Skip to first unread message

h...@openbricks.org

unread,
Mar 29, 2013, 4:27:25 PM3/29/13
to com...@openbricks.org
changeset 70cac56d15b9 in /var/www/hg/openbricks
author: Thomas Genty <toml...@openbricks.org>
details: http://hg.openbricks.org/openbricks?cmd=changeset;node=70cac56d15b9
description:
[panda] xbmc : bump version to 12.1
diffstat:

config/defconfigs/geexbox-xbmc-omap4-pandaboard.conf | 4 +-
config/platforms/arm/omap4/packages/xbmc/meta | 5 -
config/platforms/arm/omap4/packages/xbmc/patches/210_remove-unwanted-buttons.diff | 73 -
config/platforms/arm/omap4/packages/xbmc/patches/400-add-gstreamer1.diff | 93 -
config/platforms/arm/omap4/packages/xbmc/patches/400_add-gstreamer1.diff | 92 +
config/platforms/arm/omap4/packages/xbmc/patches/401-add-gstreamer2.diff | 28 -
config/platforms/arm/omap4/packages/xbmc/patches/401_add-gstreamer2.diff | 27 +
config/platforms/arm/omap4/packages/xbmc/patches/403-gstplayer.diff | 1272 ----------
config/platforms/arm/omap4/packages/xbmc/patches/403_gstplayer.diff | 1272 ++++++++++
config/platforms/arm/omap4/packages/xbmc/patches/404-2c938f75ca4955de939f7cfe1474cdbb76efd7a4.diff | 64 -
config/platforms/arm/omap4/packages/xbmc/patches/404_gstplayerCoreFactory.diff | 60 +
config/platforms/arm/omap4/packages/xbmc/patches/405_53f3282afbea5dee285091a4cf27bc0645cc6543.diff | 15 -
config/platforms/arm/omap4/packages/xbmc/patches/405_gstplayerDefaultPlayer.diff | 16 +
config/platforms/arm/omap4/packages/xbmc/patches/406_0d5fda37b52505a35b10026d67528d28960cc7b5.diff | 12 -
config/platforms/arm/omap4/packages/xbmc/patches/407_862359516e9604fc6345e129140b5723fe5b480c.diff | 69 -
config/platforms/arm/omap4/packages/xbmc/patches/407_RenderManager.diff | 68 +
config/platforms/arm/omap4/packages/xbmc/patches/408_2604f6bdee6898e39f9541e6dda06a8d9a7f6b4f.diff | 840 ------
config/platforms/arm/omap4/packages/xbmc/patches/408a_eglimage-support.diff | 195 +
config/platforms/arm/omap4/packages/xbmc/patches/408b_eglimage-support.diff | 633 ++++
config/platforms/arm/omap4/packages/xbmc/patches/412_9421bf80e6f67dd3238970844399715c459311a8.diff | 4 +-
config/platforms/arm/omap4/packages/xbmc/patches/440_fix-cross-with-externalffmpeg.diff | 22 -
config/platforms/arm/omap4/packages/xbmc/patches/450_confluence.diff | 22 -
config/platforms/arm/omap4/packages/xbmc/patches/460_libnfs.diff | 156 -
config/platforms/arm/omap4/packages/xbmc/patches/480_fix_for_froyo.diff | 48 +
config/platforms/arm/omap4/packages/xbmc/patches/490_gstplayer-fix.diff | 112 +
config/platforms/arm/omap4/packages/xbmc/patches/495_eglimage-fix.diff | 11 +
config/platforms/arm/omap4/packages/xbmc/patches/500_SDL_Fix.diff | 14 +
config/platforms/arm/omap4/packages/xbmc/patches/506_build-native-texturepacker.diff | 39 -
config/platforms/arm/omap4/packages/xbmc/patches/600_nyxboard-tweaks.diff | 16 -
packages/xbmc/build | 4 +
30 files changed, 2556 insertions(+), 2730 deletions(-)

diffs (5495 lines):

diff -r 2e65fa4f618b -r 70cac56d15b9 config/defconfigs/geexbox-xbmc-omap4-pandaboard.conf
--- a/config/defconfigs/geexbox-xbmc-omap4-pandaboard.conf Thu Mar 28 07:37:37 2013 +0100
+++ b/config/defconfigs/geexbox-xbmc-omap4-pandaboard.conf Fri Mar 29 21:26:50 2013 +0100
@@ -840,7 +840,7 @@
# CONFIG_OPT_xbmc_externalffmpeglibav is not set
CONFIG_OPT_xbmc_pvr=y
CONFIG_OPT_xbmc_addons=y
-CONFIG_OPT_xbmc_libcec=y
+# CONFIG_OPT_xbmc_libcec is not set
CONFIG_OPT_xbmc_libnfs=y
# CONFIG_OPT_xbmc_afpclient is not set
# CONFIG_OPT_xbmc_airtunes is not set
@@ -868,7 +868,7 @@
# CONFIG_PKG_automounter-nfs is not set
# CONFIG_PKG_automounter-smb is not set
CONFIG_PKG_bftpd=y
-CONFIG_PKG_bluez=m
+CONFIG_PKG_bluez=y
CONFIG_OPT_bluez_devtools=y
CONFIG_OPT_bluez_alsa=y
CONFIG_PKG_connman=y
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/meta
--- a/config/platforms/arm/omap4/packages/xbmc/meta Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-PKG_NAME=xbmc
-PKG_VERSION=pvr-20120711-git71d53d1
-PKG_URL_PROTO=
-PKG_URL="$DISTRO_SRCS/$PKG_NAME-${PKG_VERSION}.tar.xz"
-PKG_REV=1
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/210_remove-unwanted-buttons.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/210_remove-unwanted-buttons.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-diff -Naur xbmc_originale/addons/skin.confluence/720p/DialogButtonMenu.xml xbmc_patchato/addons/skin.confluence/720p/DialogButtonMenu.xml
---- xbmc_originale/addons/skin.confluence/720p/DialogButtonMenu.xml 2012-01-24 07:38:55.000000000 +0100
-+++ xbmc_patchato/addons/skin.confluence/720p/DialogButtonMenu.xml 2012-01-27 20:37:56.959115546 +0100
-@@ -70,22 +70,6 @@
- <visible>system.getbool(input.enablemouse)</visible>
- </control>
- </control>
-- <control type="button" id="2">
-- <description>Exit button</description>
-- <width>340</width>
-- <height>40</height>
-- <textcolor>grey2</textcolor>
-- <focusedcolor>white</focusedcolor>
-- <align>center</align>
-- <textwidth>290</textwidth>
-- <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
-- <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
-- <onclick>XBMC.Quit()</onclick>
-- <pulseonselect>no</pulseonselect>
-- <font>font13</font>
-- <label>13012</label>
-- <visible>System.ShowExitButton</visible>
-- </control>
- <control type="button" id="3">
- <description>Shutdown button</description>
- <width>340</width>
-@@ -135,22 +119,6 @@
- <label>20151</label>
- <visible>System.HasAlarm(shutdowntimer)</visible>
- </control>
-- <control type="button" id="6">
-- <description>Suspend button</description>
-- <width>340</width>
-- <height>40</height>
-- <textcolor>grey2</textcolor>
-- <focusedcolor>white</focusedcolor>
-- <align>center</align>
-- <textwidth>290</textwidth>
-- <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
-- <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
-- <onclick>XBMC.Suspend()</onclick>
-- <visible>System.CanSuspend</visible>
-- <pulseonselect>no</pulseonselect>
-- <font>font13</font>
-- <label>13011</label>
-- </control>
- <control type="button" id="7">
- <description>Hibernate button</description>
- <width>340</width>
-@@ -183,24 +151,6 @@
- <font>font13</font>
- <label>13013</label>
- </control>
-- <control type="button" id="9">
-- <description>Logoff button</description>
-- <width>340</width>
-- <height>40</height>
-- <textcolor>grey2</textcolor>
-- <focusedcolor>white</focusedcolor>
-- <align>center</align>
-- <textwidth>290</textwidth>
-- <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
-- <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
-- <onclick>dialog.close(all,true)</onclick>
-- <onclick>System.LogOff</onclick>
-- <pulseonselect>no</pulseonselect>
-- <font>font13</font>
-- <label>$LOCALIZE[20126] $INFO[system.profilename]</label>
-- <visible>System.HasLoginScreen | IntegerGreaterThan(System.ProfileCount,1)</visible>
-- <visible>System.Loggedon</visible>
-- </control>
- <control type="togglebutton" id="10">
- <description>Master mode button</description>
- <width>340</width>
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/400-add-gstreamer1.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/400-add-gstreamer1.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-diff --git a/configure.in b/configure.in
-index bca9239..3b1a1f3 100755
---- a/configure.in
-+++ b/configure.in
-@@ -127,6 +127,8 @@ libusb_disabled_udev_found="== libusb disabled. =="
- libcec_enabled="== libcec enabled. =="
- libcec_disabled="== libcec disabled. CEC adapter support will not be available. =="
- libcec_disabled_missing_libs="== libcec disabled because both libudev and libusb are not available. CEC adapter support will not be available. =="
-+gstreamer_not_found="== GStreamer libraries not found. GStreamer support disabled. =="
-+gstreamer_disabled="== GStreamer support manually disabled. =="
-
- # External library message strings
- external_libraries_enabled="== Use of all supported external libraries enabled. =="
-@@ -223,6 +225,12 @@ AC_ARG_ENABLE([openmax],
- [use_openmax=$enableval],
- [use_openmax=auto])
-
-+AC_ARG_ENABLE([gstreamer],
-+ [AS_HELP_STRING([--enable-gstreamer],
-+ [enable GStreamer support (default is auto)])],
-+ [use_gstreamer=$enableval],
-+ [use_gstreamer=auto])
-+
- AC_ARG_ENABLE([tegra],
- [AS_HELP_STRING([--enable-tegra],
- [enable Tegra2 arm (default is no)])],
-@@ -1446,6 +1454,45 @@ AC_CHECK_HEADERS([yajl/yajl_version.h], [], [
- AC_DEFINE(YAJL_MAJOR, 1, [yajl version 1])
- ], [])
-
-+# GSTREAMER
-+if test "x$use_gstreamer" != "xno"; then
-+ if test "$host_vendor" = "apple" ; then
-+ if test "x$use_gstreamer" = "xyes"; then
-+ AC_MSG_ERROR([GStreamer not supported on this platform])
-+ else
-+ use_gstreamer="no"
-+ AC_MSG_NOTICE($gstreamer_disabled)
-+ fi
-+ USE_GSTREAMER=0
-+ else
-+ AC_SUBST(gstreamer_req, 0.10.0)
-+ AC_SUBST(gstreamer_plugins_base_req, 0.10.0)
-+ PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10 >= $gstreamer_req, HAVE_GSTREAMER=1, HAVE_GSTREAMER=0)
-+ PKG_CHECK_MODULES(GSTREAMER_BASE, gstreamer-base-0.10 >= $gstreamer_req, HAVE_GSTREAMER_BASE=1, HAVE_GSTREAMER_BASE=0)
-+ PKG_CHECK_MODULES(GSTREAMER_PLUGINS_BASE, gstreamer-plugins-base-0.10 >= $gstreamer_plugins_base_req, HAVE_GSTREAMER_PLUGINS_BASE=1, HAVE_GSTREAMER_PLUGINS_BASE=0)
-+ HAVE_GSTREAMER_APP=1
-+ AC_CHECK_LIB([gstapp-0.10], main, , HAVE_GSTREAMER_APP=0)
-+
-+ if test $HAVE_GSTREAMER -eq 1 -a $HAVE_GSTREAMER_BASE -eq 1 -a $HAVE_GSTREAMER_PLUGINS_BASE -eq 1 -a $HAVE_GSTREAMER_APP -eq 1; then
-+ INCLUDES="$INCLUDES $GSTREAMER_CFLAGS $GSTREAMER_BASE_CFLAGS $GSTREAMER_PLUGINS_BASE_CFLAGS"
-+ LIBS="$LIBS $GSTREAMER_LIBS $GSTREAMER_BASE_LIBS $GSTREAMER_PLUGINS_BASE_LIBS"
-+ USE_GSTREAMER=1
-+ AC_DEFINE([HAVE_LIBGSTREAMER], [1], [Define to 1 if you have the 'GStreamer' library.])
-+ else
-+ if test "x$use_gstreamer" = "xyes"; then
-+ AC_MSG_ERROR([$gstreamer_not_found])
-+ else
-+ use_gstreamer="no"
-+ USE_GSTREAMER=0
-+ AC_MSG_RESULT($gstreamer_not_found)
-+ fi
-+ fi
-+ fi
-+else
-+ USE_GSTREAMER=0
-+ AC_MSG_NOTICE($gstreamer_disabled)
-+fi
-+
- # platform specific bin utilities
- if test "$host_vendor" != "apple" ; then
- AC_CHECK_PROG(HAVE_GAWK,gawk,"yes","no",)
-@@ -1596,6 +1643,12 @@ else
- final_message="$final_message\n OpenMax:\tNo"
- fi
-
-+if test "$use_gstreamer" != "no"; then
-+ final_message="$final_message\n GStreamer:\tYes"
-+else
-+ final_message="$final_message\n GStreamer:\tNo"
-+fi
-+
- if test "$use_joystick" = "yes"; then
- final_message="$final_message\n Joystick:\tYes"
- SDL_DEFINES="$SDL_DEFINES -DHAS_SDL_JOYSTICK"
-@@ -1949,6 +2002,7 @@ AC_SUBST(USE_LIBAFPCLIENT)
- AC_SUBST(USE_AIRPLAY)
- AC_SUBST(USE_VDA)
- AC_SUBST(USE_OPENMAX)
-+AC_SUBST(USE_GSTREAMER)
- AC_SUBST(USE_PULSE)
- AC_SUBST(USE_XRANDR)
- AC_SUBST(USE_ALSA)
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/400_add-gstreamer1.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/400_add-gstreamer1.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,93 @@
+diff --git a/configure.in b/configure.in
+index 7889dde..9fa2be0 100644
+--- a/configure.in
++++ b/configure.in
+@@ -159,6 +159,8 @@ libcec_enabled="== libcec enabled. =="
+ libusb_disabled_udev_found="== libusb disabled. =="
+ libcec_enabled="== libcec enabled. =="
+ libcec_disabled="== libcec disabled. CEC adapter support will not be available. =="
++gstreamer_not_found="== GStreamer libraries not found. GStreamer support disabled. =="
++gstreamer_disabled="== GStreamer support manually disabled. =="
+
+ # External library message strings
+ external_libraries_enabled="== Use of all supported external libraries enabled. =="
+@@ -265,6 +267,12 @@ AC_ARG_ENABLE([openmax],
+ [enable OpenMax decoding (default is auto, requires OpenGLES)])],
+ [use_openmax=$enableval],
+ [use_openmax=auto])
++
++AC_ARG_ENABLE([gstreamer],
++ [AS_HELP_STRING([--enable-gstreamer],
++ [enable GStreamer support (default is auto)])],
++ [use_gstreamer=$enableval],
++ [use_gstreamer=auto])
+
+ AC_ARG_ENABLE([tegra],
+ [AS_HELP_STRING([--enable-tegra],
+@@ -1828,6 +1836,45 @@ case $add_players in
+ ;;
+ esac
+
++# GSTREAMER
++if test "x$use_gstreamer" != "xno"; then
++ if test "$host_vendor" = "apple" ; then
++ if test "x$use_gstreamer" = "xyes"; then
++ AC_MSG_ERROR([GStreamer not supported on this platform])
++ else
++ use_gstreamer="no"
++ AC_MSG_NOTICE($gstreamer_disabled)
++ fi
++ USE_GSTREAMER=0
++ else
++ AC_SUBST(gstreamer_req, 0.10.0)
++ AC_SUBST(gstreamer_plugins_base_req, 0.10.0)
++ PKG_CHECK_MODULES(GSTREAMER, gstreamer-0.10 >= $gstreamer_req, HAVE_GSTREAMER=1, HAVE_GSTREAMER=0)
++ PKG_CHECK_MODULES(GSTREAMER_BASE, gstreamer-base-0.10 >= $gstreamer_req, HAVE_GSTREAMER_BASE=1, HAVE_GSTREAMER_BASE=0)
++ PKG_CHECK_MODULES(GSTREAMER_PLUGINS_BASE, gstreamer-plugins-base-0.10 >= $gstreamer_plugins_base_req, HAVE_GSTREAMER_PLUGINS_BASE=1, HAVE_GSTREAMER_PLUGINS_BASE=0)
++ HAVE_GSTREAMER_APP=1
++ AC_CHECK_LIB([gstapp-0.10], main, , HAVE_GSTREAMER_APP=0)
++
++ if test $HAVE_GSTREAMER -eq 1 -a $HAVE_GSTREAMER_BASE -eq 1 -a $HAVE_GSTREAMER_PLUGINS_BASE -eq 1 -a $HAVE_GSTREAMER_APP -eq 1; then
++ INCLUDES="$INCLUDES $GSTREAMER_CFLAGS $GSTREAMER_BASE_CFLAGS $GSTREAMER_PLUGINS_BASE_CFLAGS"
++ LIBS="$LIBS $GSTREAMER_LIBS $GSTREAMER_BASE_LIBS $GSTREAMER_PLUGINS_BASE_LIBS"
++ USE_GSTREAMER=1
++ AC_DEFINE([HAVE_LIBGSTREAMER], [1], [Define to 1 if you have the 'GStreamer' library.])
++ else
++ if test "x$use_gstreamer" = "xyes"; then
++ AC_MSG_ERROR([$gstreamer_not_found])
++ else
++ use_gstreamer="no"
++ USE_GSTREAMER=0
++ AC_MSG_RESULT($gstreamer_not_found)
++ fi
++ fi
++ fi
++else
++ USE_GSTREAMER=0
++ AC_MSG_NOTICE($gstreamer_disabled)
++fi
++
+ # platform specific bin utilities
+ if test "$host_vendor" != "apple" ; then
+ AC_CHECK_PROG(HAVE_GAWK,gawk,"yes","no",)
+@@ -1978,6 +2025,12 @@ else
+ final_message="$final_message\n OpenMax:\tNo"
+ fi
+
++if test "$use_gstreamer" != "no"; then
++ final_message="$final_message\n GStreamer:\tYes"
++else
++ final_message="$final_message\n GStreamer:\tNo"
++fi
++
+ if test "$use_joystick" = "yes"; then
+ final_message="$final_message\n Joystick:\tYes"
+ SDL_DEFINES="$SDL_DEFINES -DHAS_SDL_JOYSTICK"
+@@ -2440,6 +2493,7 @@ AC_SUBST(USE_LIBAFPCLIENT)
+ AC_SUBST(USE_AIRPLAY)
+ AC_SUBST(USE_VDA)
+ AC_SUBST(USE_OPENMAX)
++AC_SUBST(USE_GSTREAMER)
+ AC_SUBST(USE_PULSE)
+ AC_SUBST(USE_XRANDR)
+ AC_SUBST(USE_ALSA)
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/401-add-gstreamer2.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/401-add-gstreamer2.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-diff --git a/Makefile.in b/Makefile.in
-index 9d850e4..8d5ec93 100755
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -18,8 +18,12 @@ DVDPLAYER_ARCHIVES=xbmc/cores/dvdplayer/DVDPlayer.a \
- xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxers.a \
- xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreams.a \
- xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitles.a
-+
-+
-+GSTPLAYER_ARCHIVES=xbmc/cores/gstplayer/GstPlayer.a
-
- DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \
-+ $(GSTPLAYER_ARCHIVES) \
- lib/SlingboxLib/SlingboxLib.a \
- lib/libRTV/librtv.a \
- lib/libUPnP/libupnp.a \
-diff --git a/configure.in b/configure.in
-index 3b1a1f3..10eab9b 100755
---- a/configure.in
-+++ b/configure.in
-@@ -1900,6 +1900,7 @@ OUTPUT_FILES="Makefile \
- xbmc/cdrip/Makefile \
- xbmc/cores/Makefile \
- xbmc/cores/VideoRenderers/Makefile \
-+ xbmc/cores/gstplayer/Makefile \
- xbmc/cores/dvdplayer/Makefile \
- lib/Makefile \
- lib/libdvd/Makefile \
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/401_add-gstreamer2.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/401_add-gstreamer2.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,29 @@
+diff --git a/Makefile.in b/Makefile.in
+index 31826b1..181d22f 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -20,8 +20,12 @@ DVDPLAYER_ARCHIVES=xbmc/cores/dvdplayer/DVDPlayer.a \
+ xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxers.a \
+ xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreams.a \
+ xbmc/cores/dvdplayer/DVDSubtitles/DVDSubtitles.a
++
++
++GSTPLAYER_ARCHIVES=xbmc/cores/gstplayer/GstPlayer.a
+
+ DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \
++ $(GSTPLAYER_ARCHIVES) \
+ lib/SlingboxLib/SlingboxLib.a \
+ lib/libRTV/librtv.a \
+ lib/libXDAAP/libxdaap.a \
+diff --git a/configure.in b/configure.in
+index 9fa2be0..29bb9a6 100644
+--- a/configure.in
++++ b/configure.in
+@@ -2377,6 +2377,7 @@ OUTPUT_FILES="Makefile \
+ xbmc/cdrip/Makefile \
+ xbmc/cores/Makefile \
+ xbmc/cores/VideoRenderers/Makefile \
++ xbmc/cores/gstplayer/Makefile \
+ xbmc/cores/dvdplayer/Makefile \
+ lib/Makefile \
+ lib/libdvd/Makefile \
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/403-gstplayer.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/403-gstplayer.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1275 +0,0 @@
-diff --git a/xbmc/cores/gstplayer/GstPlayer.cpp b/xbmc/cores/gstplayer/GstPlayer.cpp
-new file mode 100644
-index 0000000..201730d
---- /dev/null
-+++ b/xbmc/cores/gstplayer/GstPlayer.cpp
-@@ -0,0 +1,1068 @@
-+/*
-+ * Copyright (C) 2012 linaro
-+ * http://www.linaro.org
-+ *
-+ * This Program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This Program 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with XBMC; see the file COPYING. If not, write to
-+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-+ * http://www.gnu.org/copyleft/gpl.html
-+ *
-+ */
-+
-+#include "threads/SystemClock.h"
-+#include "system.h"
-+
-+#include "utils/LangCodeExpander.h"
-+#include "guilib/LocalizeStrings.h"
-+
-+#include "utils/URIUtils.h"
-+#include "GUIInfoManager.h"
-+#include "guilib/GUIWindowManager.h"
-+#include "Application.h"
-+#include "filesystem/File.h"
-+#include "pictures/Picture.h"
-+#include "DllSwScale.h"
-+#ifdef HAS_VIDEO_PLAYBACK
-+#include "cores/VideoRenderers/RenderManager.h"
-+#endif
-+#ifdef HAS_PERFORMANCE_SAMPLE
-+#include "xbmc/utils/PerformanceSample.h"
-+#else
-+#define MEASURE_FUNCTION
-+#endif
-+#include "settings/AdvancedSettings.h"
-+#include "FileItem.h"
-+#include "settings/GUISettings.h"
-+#include "GUIUserMessages.h"
-+#include "settings/Settings.h"
-+#include "utils/log.h"
-+#include "utils/TimeUtils.h"
-+#include "utils/StreamDetails.h"
-+#include "utils/StreamUtils.h"
-+#include "utils/Variant.h"
-+#include "storage/MediaManager.h"
-+#include "dialogs/GUIDialogBusy.h"
-+#include "dialogs/GUIDialogKaiToast.h"
-+#include "utils/StringUtils.h"
-+#include "Util.h"
-+#include <gst/app/gstappsink.h>
-+
-+#include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h"
-+
-+
-+
-+
-+#include "GstPlayer.h"
-+
-+
-+
-+#define LOAD_TAG(data, tags, tagid) \
-+ do {\
-+ if ((data)==NULL){\
-+ gchar * value;\
-+ if (gst_tag_list_get_string ((tags), (tagid), &value)){\
-+ (data) = value;\
-+ }\
-+ }\
-+ }while(0)
-+
-+#define APPEND_STR(string, data, prefix, postfix) \
-+ do {\
-+ if ((data)){\
-+ (string) += (prefix);\
-+ (string) += (data);\
-+ (string) += (postfix);\
-+ }\
-+ }while(0)
-+
-+
-+CGstPlayer::CGstPlayer(IPlayerCallback& callback)
-+: IPlayer(callback),
-+ CThread(),
-+ m_ready(true)
-+{
-+ m_bStop = true;
-+ m_paused = false;
-+ m_clock = 0;
-+ m_lastTime = 0;
-+ m_speed = 1;
-+ m_playbin = NULL;
-+ m_voutput_init = false;
-+ m_srcRect.SetRect(0.0f,0.0f,640.0f,480.0f);
-+ m_buffering = false;
-+ m_cache_level = 100;
-+ m_file_cnt = 0;
-+ gst_init(NULL, NULL);
-+}
-+
-+CGstPlayer::~CGstPlayer()
-+{
-+ CloseFile();
-+}
-+
-+bool CGstPlayer::LoadMediaInfo()
-+{
-+ if (m_playbin){
-+ int i;
-+ GstQuery *query;
-+
-+ g_object_get( G_OBJECT(m_playbin), "n-video", &m_mediainfo.video_num, NULL);
-+ g_object_get( G_OBJECT(m_playbin), "n-audio", &m_mediainfo.audio_num, NULL);
-+
-+ g_object_get( G_OBJECT(m_playbin), "current-audio", &m_audio_current, NULL);
-+ if (m_audio_current<0) m_audio_current=0;
-+ g_object_get( G_OBJECT(m_playbin), "current-video", &m_video_current, NULL);
-+ if (m_video_current<0) m_video_current=0;
-+
-+ query = gst_query_new_seeking (GST_FORMAT_TIME);
-+ if(gst_element_query (m_playbin, query))
-+ gst_query_parse_seeking (query, NULL, &m_mediainfo.seekable, NULL, NULL);
-+ else
-+ m_mediainfo.seekable=false;
-+ gst_query_unref (query);
-+
-+ if (m_mediainfo.audio_num){
-+ m_mediainfo.audio_info = (MediaAudioInfo*)g_malloc(sizeof(MediaAudioInfo)*m_mediainfo.audio_num);
-+ memset(m_mediainfo.audio_info, 0, (sizeof(MediaAudioInfo)*m_mediainfo.audio_num));
-+ }
-+
-+ if (m_mediainfo.video_num){
-+ m_mediainfo.video_info = (MediaVideoInfo*)g_malloc(sizeof(MediaVideoInfo)*m_mediainfo.video_num);
-+ memset(m_mediainfo.video_info, 0, (sizeof(MediaVideoInfo)*m_mediainfo.video_num));
-+ }
-+
-+ for (i=0;i<m_mediainfo.audio_num;i++)
-+ {
-+ GstTagList *tags = NULL;
-+
-+ g_signal_emit_by_name (G_OBJECT (m_playbin), "get-audio-tags", i, &tags);
-+
-+ if (tags) {
-+ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[i];
-+
-+ LOAD_TAG(ainfo->lang, tags, GST_TAG_LANGUAGE_CODE);
-+ LOAD_TAG(ainfo->codec, tags, GST_TAG_CODEC);
-+ if (ainfo->codec==NULL){
-+ LOAD_TAG(ainfo->codec, tags, GST_TAG_AUDIO_CODEC);
-+ }
-+
-+ gst_tag_list_get_uint(tags, GST_TAG_BITRATE, &ainfo->bitrate);
-+
-+ LOAD_TAG(m_mediainfo.container_format, tags, GST_TAG_CONTAINER_FORMAT);
-+ LOAD_TAG(m_mediainfo.title, tags, GST_TAG_TITLE);
-+ LOAD_TAG(m_mediainfo.artist, tags, GST_TAG_ARTIST);
-+ LOAD_TAG(m_mediainfo.description, tags, GST_TAG_DESCRIPTION);
-+ LOAD_TAG(m_mediainfo.album, tags, GST_TAG_ALBUM);
-+ LOAD_TAG(m_mediainfo.genre, tags, GST_TAG_GENRE);
-+
-+ gst_tag_list_free (tags);
-+ }
-+ }
-+
-+ for (i=0;i<m_mediainfo.video_num;i++)
-+ {
-+ GstTagList *tags = NULL;
-+
-+ g_signal_emit_by_name (G_OBJECT (m_playbin), "get-video-tags", i, &tags);
-+
-+ if (tags) {
-+ MediaVideoInfo * vinfo = &m_mediainfo.video_info[i];
-+
-+ LOAD_TAG(vinfo->codec, tags, GST_TAG_CODEC);
-+ if (vinfo->codec==NULL){
-+ LOAD_TAG(vinfo->codec, tags, GST_TAG_VIDEO_CODEC);
-+ }
-+ gst_tag_list_get_uint(tags, GST_TAG_BITRATE, &vinfo->bitrate);
-+
-+ LOAD_TAG(m_mediainfo.container_format, tags, GST_TAG_CONTAINER_FORMAT);
-+ LOAD_TAG(m_mediainfo.title, tags, GST_TAG_TITLE);
-+ LOAD_TAG(m_mediainfo.artist, tags, GST_TAG_ARTIST);
-+ LOAD_TAG(m_mediainfo.description, tags, GST_TAG_DESCRIPTION);
-+ LOAD_TAG(m_mediainfo.album, tags, GST_TAG_ALBUM);
-+ LOAD_TAG(m_mediainfo.genre, tags, GST_TAG_GENRE);
-+
-+ gst_tag_list_free (tags);
-+ }
-+ }
-+
-+ m_mediainfo.loaded = true;
-+ return true;
-+ }
-+ return false;
-+}
-+
-+int CGstPlayer::GetAudioStreamCount()
-+{
-+ return m_mediainfo.audio_num;
-+}
-+
-+void CGstPlayer::GetAudioStreamName(int iStream, CStdString& strStreamName)
-+{
-+ strStreamName = "";
-+ if ((m_playbin) && (m_mediainfo.audio_info) && (iStream<m_mediainfo.audio_num)){
-+ if (m_mediainfo.audio_info[iStream].lang){
-+ CStdString code = m_mediainfo.audio_info[iStream].lang;
-+ if (!g_LangCodeExpander.Lookup(strStreamName, code)) strStreamName = m_mediainfo.audio_info[iStream].lang;
-+ }
-+ strStreamName += " ";
-+ if (m_mediainfo.audio_info[iStream].codec){
-+ strStreamName += m_mediainfo.audio_info[iStream].codec;
-+ }
-+ }else{
-+ strStreamName += "Unknown";
-+ }
-+}
-+
-+int CGstPlayer::GetAudioStream()
-+{
-+ return m_audio_current;
-+}
-+
-+
-+int CGstPlayer::OutputPicture(GstBuffer * gstbuffer)
-+{
-+ /* picture buffer is not allowed to be modified in this call */
-+ DVDVideoPicture picture;
-+ DVDVideoPicture* pPicture = &picture;
-+ int result = 0;
-+ gint flags;
-+ double config_framerate = 30.0;
-+
-+ memset(pPicture, 0, sizeof(DVDVideoPicture));
-+
-+#ifdef HAS_VIDEO_PLAYBACK
-+
-+ GstCaps * caps = GST_BUFFER_CAPS(gstbuffer);
-+
-+ if (caps){
-+ gint width, height;
-+ guint32 format;
-+ GstStructure * structure = gst_caps_get_structure (caps, 0);
-+
-+ if (structure == NULL ||
-+ !gst_structure_get_int (structure, "width", &width) ||
-+ !gst_structure_get_int (structure, "height", &height) ||
-+ !gst_structure_get_fourcc (structure, "format", &format)){
-+
-+ CLog::Log(LOGERROR, "Unsupport output format");
-+ return -1;
-+ }
-+
-+ pPicture->iDisplayWidth = pPicture->iWidth = width;
-+ pPicture->iDisplayHeight = pPicture->iHeight = height;
-+
-+ if (format==GST_STR_FOURCC("NV12")){
-+ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
-+ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
-+ pPicture->iLineSize[0] = pPicture->iWidth;
-+ pPicture->iLineSize[1] = pPicture->iWidth;
-+ flags = CONF_FLAGS_FORMAT_NV12;
-+ }else if (format==GST_STR_FOURCC("I420")){
-+ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
-+ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
-+ pPicture->data[2] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height*5/4;
-+ pPicture->iLineSize[0] = pPicture->iWidth;
-+ pPicture->iLineSize[1] = pPicture->iWidth/2;
-+ pPicture->iLineSize[2] = pPicture->iWidth/2;
-+ flags = CONF_FLAGS_FORMAT_YV12;
-+ }else{
-+ CLog::Log(LOGERROR, "Unsupport output format");
-+ return -1;
-+ }
-+
-+ }else{
-+ return -1;
-+ }
-+
-+
-+ if ((m_output.width!=pPicture->iWidth) || (m_output.height!=pPicture->iHeight)){
-+ if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->extended_format))
-+ {
-+ CLog::Log(LOGNOTICE, "Failed to configure renderer");
-+ return -1;
-+ }
-+
-+ m_output.width=pPicture->iWidth;
-+ m_output.height=pPicture->iHeight;
-+ }
-+
-+ int index = g_renderManager.AddVideoPicture(*pPicture);
-+#if 0
-+ // video device might not be done yet
-+ while (index < 0 && !CThread::m_bStop &&
-+ CDVDClock::GetAbsoluteClock(false) < iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500) )
-+ {
-+ Sleep(1);
-+ index = g_renderManager.AddVideoPicture(*pPicture);
-+ }
-+#endif
-+ if (index < 0)
-+ return -1;
-+
-+ g_renderManager.FlipPage(CThread::m_bStop, 0LL, -1, FS_NONE);
-+
-+ return result;
-+
-+#endif
-+}
-+
-+
-+void CGstPlayer::SetAudioStream(int iStream)
-+{
-+ if ((m_playbin) && (iStream>=0) && (iStream<m_mediainfo.audio_num)){
-+ m_audio_current = iStream;
-+ g_object_set( G_OBJECT(m_playbin), "current-audio", iStream, NULL);
-+ }
-+}
-+
-+void CGstPlayer::CleanMediaInfo()
-+{
-+ int i;
-+
-+ if (m_mediainfo.container_format){
-+ g_free(m_mediainfo.container_format);
-+ m_mediainfo.container_format = NULL;
-+ }
-+ if (m_mediainfo.genre){
-+ g_free(m_mediainfo.genre);
-+ m_mediainfo.genre = NULL;
-+ }
-+ if (m_mediainfo.title){
-+ g_free(m_mediainfo.title);
-+ m_mediainfo.title = NULL;
-+ }
-+ if (m_mediainfo.artist){
-+ g_free(m_mediainfo.artist);
-+ m_mediainfo.artist = NULL;
-+ }
-+ if (m_mediainfo.description){
-+ g_free(m_mediainfo.description);
-+ m_mediainfo.description = NULL;
-+ }
-+ if (m_mediainfo.album){
-+ g_free(m_mediainfo.album);
-+ m_mediainfo.album = NULL;
-+ }
-+
-+
-+
-+
-+ if (m_mediainfo.audio_info){
-+ for (i=0;i<m_mediainfo.audio_num;i++){
-+ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[i];
-+
-+ if (ainfo->lang){
-+ g_free(ainfo->lang);
-+ ainfo->lang = NULL;
-+ }
-+ if (ainfo->codec){
-+ g_free(ainfo->codec);
-+ ainfo->codec = NULL;
-+ }
-+
-+ }
-+ g_free(m_mediainfo.audio_info);
-+ m_mediainfo.audio_info = NULL;
-+ }
-+
-+ if (m_mediainfo.video_info){
-+ for (i=0;i<m_mediainfo.video_num;i++){
-+ MediaVideoInfo * vinfo = &m_mediainfo.video_info[i];
-+ if (vinfo->codec){
-+ g_free(vinfo->codec);
-+ vinfo->codec = NULL;
-+ }
-+ }
-+ g_free(m_mediainfo.video_info);
-+ m_mediainfo.video_info = NULL;
-+ }
-+}
-+
-+void CGstPlayer::OnDecodedBuffer(GstElement *appsink, void *data)
-+{
-+ CGstPlayer *decoder = (CGstPlayer *)data;
-+
-+ GstBuffer *buffer = gst_app_sink_pull_buffer(GST_APP_SINK(appsink));
-+ if (buffer)
-+ {
-+ decoder->OutputPicture(buffer);
-+
-+ gst_buffer_unref(buffer);
-+ }
-+ else{
-+ CLog::Log(LOGERROR,"GStreamer: OnDecodedBuffer - Null Buffer");
-+ }
-+}
-+
-+
-+bool CGstPlayer::CreatePlayBin()
-+{
-+ GstElement *videosink, *audiosink=NULL;
-+ m_playbin = gst_element_factory_make("playbin2", "playbin0");
-+ if(!m_playbin)
-+ {
-+ CLog::Log(LOGERROR, "CreatePlayBin - gst_element_factory_make playbin2 failed");
-+ return false;
-+ }
-+
-+ //prepare videosink
-+ videosink = gst_element_factory_make("appsink", "videosink0");
-+ if(!videosink)
-+ {
-+ CLog::Log(LOGERROR, "CreatePlayBin - gst_element_factory_make appsink failed");
-+ return false;
-+ }
-+
-+ {
-+ g_object_set(G_OBJECT(videosink), "emit-signals", TRUE, "sync", TRUE, NULL);
-+ g_signal_connect(videosink, "new-buffer", G_CALLBACK(OnDecodedBuffer), this);
-+ }
-+
-+ g_object_set(G_OBJECT(m_playbin), "video-sink", videosink, NULL);
-+ //GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_TEXT | GST_PLAY_FLAG_SOFT_VOLUME
-+ g_object_set(G_OBJECT(m_playbin), "flags", 0x5F, NULL);
-+
-+ m_bus = gst_pipeline_get_bus(GST_PIPELINE(m_playbin));
-+ if( NULL == m_bus )
-+ {
-+ CLog::Log(LOGERROR, "%s(): Failed in gst_pipeline_get_bus()!", __FUNCTION__);
-+ return false;
-+ }
-+ return true;
-+}
-+
-+bool CGstPlayer::DestroyPlayBin()
-+{
-+ gst_object_unref(m_playbin);
-+ m_playbin = NULL;
-+ gst_object_unref(m_bus);
-+ m_bus = NULL;
-+ return true;
-+}
-+
-+bool CGstPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options)
-+{
-+ if (m_playbin){
-+ CloseFile();
-+ }
-+
-+ m_clock = 0;
-+ m_bStop = false;
-+ m_item = file;
-+ m_starttime = (gint64)(options.starttime*1000000000);
-+
-+ memset(&m_mediainfo, 0, sizeof(MediaInfo));
-+
-+ m_audio_current = 0;
-+ m_video_current = 0;
-+
-+
-+ g_renderManager.PreInit();
-+
-+ m_buffering = false;
-+ m_cache_level = 100;
-+
-+ m_quit_msg = false;
-+ m_cancelled = false;
-+
-+ if(!CreatePlayBin())
-+ return false;
-+
-+ m_ready.Reset();
-+ //CLog::Log(LOGNOTICE, "Player thread create");
-+ Create();
-+ //if(!m_ready.WaitMSec(2000))
-+ {
-+ //CLog::Log(LOGNOTICE, "Player thread start timeout");
-+ CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY);
-+ dialog->Show();
-+ while(!m_ready.WaitMSec(10))
-+ {
-+ g_windowManager.Process(CTimeUtils::GetFrameTime());
-+ if(dialog->IsCanceled())
-+ {
-+ m_cancelled = true;
-+ m_ready.Wait();
-+ break;
-+ }
-+ }
-+ dialog->Close();
-+ }
-+
-+ //CLog::Log(LOGNOTICE, "Player thread create success");
-+ if(m_bStop)
-+ return false;
-+
-+ m_callback.OnPlayBackStarted();
-+
-+ //CLog::Log(LOGNOTICE, "GxPlayer OpenFile return");
-+ return true;
-+}
-+
-+bool CGstPlayer::CloseFile()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+
-+ m_bStop = true;
-+ m_paused = false;
-+ m_quit_msg = true;
-+
-+ if(m_bus)
-+ gst_bus_post(m_bus, gst_message_new_custom(GST_MESSAGE_APPLICATION, NULL, gst_structure_new("quit", NULL)));
-+
-+ CLog::Log(LOGNOTICE, "CloseFile - Stopping Thread");
-+ StopThread();
-+
-+ if (m_playbin)
-+ DestroyPlayBin();
-+
-+ CleanMediaInfo();
-+
-+ g_renderManager.UnInit();
-+
-+ m_callback.OnPlayBackStopped();
-+ return true;
-+}
-+
-+bool CGstPlayer::IsPlaying() const
-+{
-+ return !m_bStop;
-+}
-+
-+void CGstPlayer::ResetUrlInfo()
-+{
-+ m_username.clear();
-+ m_password.clear();
-+}
-+
-+CStdString CGstPlayer::ParseAndCorrectUrl(CURL &url)
-+{
-+ CStdString strProtocol = url.GetTranslatedProtocol();
-+ CStdString ret;
-+ url.SetProtocol(strProtocol);
-+
-+ ResetUrlInfo();
-+ if(url.IsLocal()) { //local file
-+ CStdString path = url.GetFileName();
-+ gchar *fname = NULL;
-+ if(url.IsFullPath(path))
-+ fname = g_strdup(path.c_str());
-+ else {
-+ gchar *pwd = g_get_current_dir();
-+ fname = g_strdup_printf("%s/%s", pwd, path.c_str());
-+ g_free(pwd);
-+ }
-+ url.SetFileName(CStdString(fname));
-+ url.SetProtocol("file");
-+ g_free(fname);
-+ }
-+ else if( strProtocol.Equals("http")
-+ || strProtocol.Equals("https"))
-+ {
-+
-+ // replace invalid spaces
-+ CStdString strFileName = url.GetFileName();
-+ strFileName.Replace(" ", "%20");
-+ url.SetFileName(strFileName);
-+
-+ // get username and password
-+ m_username = url.GetUserName();
-+ m_password = url.GetPassWord();
-+
-+ }
-+
-+ if (m_username.length() > 0 && m_password.length() > 0)
-+ ret = url.GetWithoutUserDetails();
-+ else
-+ ret = url.Get();
-+ return ret;
-+}
-+
-+bool CGstPlayer::SetAndWaitPlaybinState(GstState newstate, int timeout)
-+{
-+ GstStateChangeReturn ret;
-+
-+
-+ if (m_playbin){
-+ ret = gst_element_set_state(m_playbin, newstate);
-+ if (ret==GST_STATE_CHANGE_ASYNC){
-+ GstState current, pending;
-+ do{
-+ ret = gst_element_get_state(m_playbin, &current, &pending, GST_SECOND);
-+ }while((m_cancelled==false)&&(ret==GST_STATE_CHANGE_ASYNC) && (timeout-->=0));
-+ }
-+
-+ if ((ret==GST_STATE_CHANGE_FAILURE)||(ret==GST_STATE_CHANGE_ASYNC)){
-+ return false;
-+ }else{
-+ return true;
-+ }
-+ }
-+ return false;
-+
-+}
-+
-+
-+
-+
-+
-+void CGstPlayer::Process()
-+{
-+ bool ret;
-+ GstEvent *seek_event;
-+ GstMessage *msg;
-+ GstState old, current, pending;
-+ bool eos = false;
-+ int i;
-+ CLog::Log(LOGNOTICE, "Player thread start %p", m_playbin);
-+ if (m_playbin) {
-+ CURL url = m_item.GetAsUrl();
-+ CStdString uri = ParseAndCorrectUrl(url);
-+ CLog::Log(LOGNOTICE, "Play uri %s", uri.c_str());
-+ g_object_set(G_OBJECT(m_playbin), "uri", uri.c_str(), NULL);
-+
-+ if ((SetAndWaitPlaybinState(GST_STATE_PAUSED, 60)==false) || (m_cancelled)){
-+ m_bStop = true;
-+ m_ready.Set();
-+ goto finish;
-+ }
-+ if (m_starttime) {
-+ seek_event = gst_event_new_seek(1.0, GST_FORMAT_TIME,
-+ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
-+ GST_SEEK_TYPE_SET, m_starttime,
-+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
-+ gst_element_send_event(m_playbin, seek_event);
-+ }
-+ LoadMediaInfo();
-+
-+ if (SetAndWaitPlaybinState(GST_STATE_PLAYING, 10)==false){
-+
-+ m_bStop = true;
-+ m_ready.Set();
-+ goto finish;
-+ }
-+
-+ g_renderManager.SetViewMode(g_settings.m_currentVideoSettings.m_ViewMode);
-+ }
-+
-+ m_ready.Set();
-+
-+ while(!m_quit_msg && !eos) {
-+ msg = gst_bus_timed_pop(m_bus, 1000000000);
-+ if(msg) {
-+ if(GST_MESSAGE_SRC(msg) == GST_OBJECT(m_playbin)) { //playbin message
-+ switch(msg->type) {
-+ case GST_MESSAGE_EOS:
-+ {
-+ CLog::Log(LOGNOTICE, "Media EOS");
-+ eos = true;
-+ break;
-+ }
-+ case GST_MESSAGE_ERROR:
-+ {
-+ CLog::Log(LOGERROR, "Media Error");
-+ eos = true;
-+ break;
-+ }
-+
-+ case GST_MESSAGE_STATE_CHANGED:
-+ {
-+ break;
-+ }
-+
-+ default:
-+ break;
-+ }
-+ }
-+ else {
-+ if(msg->type == GST_MESSAGE_APPLICATION && GST_MESSAGE_SRC(msg) == NULL) {
-+ const GstStructure *s = gst_message_get_structure(msg);
-+ const gchar *name = gst_structure_get_name(s);
-+ if(!g_strcmp0(name, "pause")) {
-+ if(!m_buffering && !m_paused)
-+ gst_element_set_state(m_playbin, GST_STATE_PLAYING);
-+ else
-+ gst_element_set_state(m_playbin, GST_STATE_PAUSED);
-+ }
-+ else if(!g_strcmp0(name, "quit")) {
-+ //will quit by m_quit_msg
-+ }
-+ }
-+ else if(msg->type == GST_MESSAGE_BUFFERING)
-+ {
-+ gst_message_parse_buffering(msg, &m_cache_level);
-+ if(m_cache_level == 0) {
-+ m_buffering = true;
-+ gst_element_set_state(m_playbin, GST_STATE_PAUSED);
-+ }
-+ else if(m_cache_level >= 100) {
-+ m_buffering = false;
-+ if(!m_paused) {
-+ gst_element_set_state(m_playbin, GST_STATE_PLAYING);
-+ }
-+ }
-+ }
-+ }
-+ gst_message_unref(msg);
-+ }
-+ }
-+finish:
-+ CLog::Log(LOGNOTICE, "Player stop begin");
-+ gst_bus_set_flushing(m_bus, TRUE);
-+
-+ if (SetAndWaitPlaybinState(GST_STATE_NULL,30)==false){
-+
-+ CLog::Log(LOGERROR, "Stop player failed");
-+ }
-+ m_bStop = true;
-+ if(eos)
-+ m_callback.OnPlayBackEnded();
-+ CLog::Log(LOGNOTICE, "Player thread end");
-+}
-+
-+void CGstPlayer::Pause()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+
-+ m_paused = !m_paused;
-+ if (m_bus){
-+ gst_bus_post(m_bus, gst_message_new_custom(GST_MESSAGE_APPLICATION, NULL, gst_structure_new("pause", NULL)));
-+ }
-+ if (!m_paused) {
-+ m_callback.OnPlayBackResumed();
-+ }
-+ else {
-+ m_callback.OnPlayBackPaused();
-+ }
-+}
-+
-+bool CGstPlayer::IsPaused() const
-+{
-+ return m_paused || m_buffering;
-+}
-+
-+bool CGstPlayer::HasVideo() const
-+{
-+ return (m_mediainfo.video_num>0);
-+}
-+
-+bool CGstPlayer::HasAudio() const
-+{
-+ return (m_mediainfo.audio_num>0);
-+}
-+
-+int CGstPlayer::GetCacheLevel() const
-+{
-+ return m_cache_level;
-+}
-+
-+void CGstPlayer::SwitchToNextLanguage()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+}
-+
-+void CGstPlayer::ToggleSubtitles()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+}
-+
-+bool CGstPlayer::CanSeek()
-+{
-+ return m_mediainfo.seekable;
-+}
-+
-+void CGstPlayer::Seek(bool bPlus, bool bLargeStep)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+}
-+
-+void CGstPlayer::SetVolume(long nVolume)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]--- %ld", __FUNCTION__, nVolume);
-+ if(m_playbin)
-+ {
-+ double linear;
-+ if(nVolume <= VOLUME_MINIMUM)
-+ linear = 0.0;
-+ else
-+ {
-+ linear = pow(10.0, (double)nVolume/1000.0);
-+ linear = cbrt(linear);
-+ if(linear > 10.0)
-+ linear = 10.0;
-+ }
-+ g_object_set(G_OBJECT(m_playbin), "volume", linear, NULL);
-+ }
-+}
-+
-+void CGstPlayer::GetAudioInfo(CStdString& strAudioInfo)
-+{
-+ strAudioInfo = "Audio (";
-+ if (m_mediainfo.audio_info){
-+ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[m_audio_current];
-+ APPEND_STR(strAudioInfo, ainfo->codec, "Codec: ", ", ");
-+ APPEND_STR(strAudioInfo, ainfo->lang, "Language: ", ", ");
-+ if (ainfo->bitrate){
-+ CStdString bitstr;
-+ bitstr.Format("Bitrate: %d", ainfo->bitrate);
-+ strAudioInfo += bitstr;
-+ }
-+ }
-+ strAudioInfo += ")";
-+
-+}
-+
-+void CGstPlayer::GetVideoInfo(CStdString& strVideoInfo)
-+{
-+ strVideoInfo = "Video (";
-+ if (m_mediainfo.video_info){
-+ MediaVideoInfo * vinfo = &m_mediainfo.video_info[m_video_current];
-+ APPEND_STR(strVideoInfo, vinfo->codec, "Codec: ", ", ");
-+ if (vinfo->bitrate){
-+ CStdString bitstr;
-+ bitstr.Format("Bitrate: %d", vinfo->bitrate);
-+ strVideoInfo += bitstr;
-+ }
-+ }
-+ strVideoInfo += ")";
-+}
-+
-+void CGstPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
-+{
-+ strGeneralInfo = "";
-+ APPEND_STR(strGeneralInfo, m_mediainfo.title, "Title :", ", ");
-+ APPEND_STR(strGeneralInfo, m_mediainfo.artist, "Artist: ", ", ");
-+ APPEND_STR(strGeneralInfo, m_mediainfo.genre, "Genre: ", ", ");
-+ APPEND_STR(strGeneralInfo, m_mediainfo.album, "Album: ", ", ");
-+ APPEND_STR(strGeneralInfo, m_mediainfo.description, "Desc: ", ", ");
-+ APPEND_STR(strGeneralInfo, m_mediainfo.container_format, "Format: ", "");
-+}
-+
-+void CGstPlayer::SwitchToNextAudioLanguage()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+}
-+
-+void CGstPlayer::SeekPercentage(float iPercent)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ __int64 iTotalMsec = GetTotalTime() * 1000;
-+ __int64 iTime = (__int64)(iTotalMsec * iPercent / 100);
-+ SeekTime(iTime);
-+}
-+
-+float CGstPlayer::GetPercentage()
-+{
-+ __int64 iTotalTime = GetTotalTime() * 1000;
-+ //CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ if (iTotalTime != 0)
-+ {
-+ return GetTime() * 100 / (float)iTotalTime;
-+ }
-+ return 0.0f;
-+}
-+
-+
-+void CGstPlayer::SetSinkRenderDelay(GstElement * ele, guint64 renderDelay)
-+{
-+ if (GST_IS_BIN(ele)){
-+ GstIterator *elem_it = NULL;
-+ gboolean done = FALSE;
-+ elem_it = gst_bin_iterate_sinks (GST_BIN (ele));
-+ while (!done) {
-+ GstElement *element = NULL;
-+
-+ switch (gst_iterator_next (elem_it, ((void **)&element))) {
-+ case GST_ITERATOR_OK:
-+ if (element ) {
-+ g_object_set( G_OBJECT(element), "render-delay", renderDelay, NULL);
-+ }
-+ gst_object_unref (element);
-+ break;
-+ case GST_ITERATOR_RESYNC:
-+ gst_iterator_resync (elem_it);
-+ break;
-+ case GST_ITERATOR_ERROR:
-+ done = TRUE;
-+ break;
-+ case GST_ITERATOR_DONE:
-+ done = TRUE;
-+ break;
-+ }
-+ }
-+ gst_iterator_free (elem_it);
-+ }else{
-+ g_object_set( G_OBJECT(ele), "render-delay", renderDelay, NULL);
-+ }
-+}
-+
-+//This is how much audio is delayed to video, we count the oposite in the dvdplayer
-+void CGstPlayer::SetAVDelay(float fValue)
-+{
-+ if ((m_playbin) && (m_mediainfo.audio_num) && (m_mediainfo.video_num)){
-+ GstElement * videosink = NULL;
-+ GstElement * audiosink = NULL;
-+ guint64 value64=0;
-+
-+ g_object_get( G_OBJECT(m_playbin), "video-sink", &videosink, NULL);
-+ g_object_get( G_OBJECT(m_playbin), "audio-sink", &audiosink, NULL);
-+
-+ if ((videosink==NULL) || (audiosink==NULL)){
-+ goto bail;
-+ }
-+
-+ if (fValue>=0.0){
-+ SetSinkRenderDelay(videosink, value64);
-+ value64 = (guint64)(fValue*GST_SECOND);
-+ SetSinkRenderDelay(audiosink, value64);
-+ }else{
-+ SetSinkRenderDelay(audiosink, value64);
-+ value64 = (guint64)(-fValue*GST_SECOND);
-+ SetSinkRenderDelay(videosink, value64);
-+ }
-+bail:
-+ if (videosink){
-+ g_object_unref(G_OBJECT(videosink));
-+ }
-+ if (audiosink){
-+ g_object_unref(G_OBJECT(audiosink));
-+ }
-+ }
-+}
-+
-+float CGstPlayer::GetAVDelay()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ return 0.0f;
-+}
-+
-+void CGstPlayer::SetSubTitleDelay(float fValue)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+}
-+
-+float CGstPlayer::GetSubTitleDelay()
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ return 0.0;
-+}
-+
-+void CGstPlayer::SeekTime(__int64 iTime)
-+{
-+ GstEvent *seek_event;
-+ CLog::Log(LOGNOTICE, "---[%s]---%lld", __FUNCTION__, iTime);
-+
-+ m_clock = iTime;
-+ if (m_playbin){
-+ seek_event = gst_event_new_seek(1.0, GST_FORMAT_TIME,
-+ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
-+ GST_SEEK_TYPE_SET, iTime*1000000,
-+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
-+ gst_element_send_event(m_playbin, seek_event);
-+ }
-+
-+ CLog::Log(LOGNOTICE, "---[%s finish]---%lld", __FUNCTION__, iTime);
-+ g_infoManager.m_performingSeek = false;
-+ m_callback.OnPlayBackSeek((int)iTime, 0);
-+ CLog::Log(LOGNOTICE, "---[%s nretun]---%lld", __FUNCTION__, iTime);
-+}
-+
-+// return the time in milliseconds
-+__int64 CGstPlayer::GetTime()
-+{
-+ gint64 elapsed = 0;
-+ if (m_playbin) {
-+ GstFormat fmt = GST_FORMAT_TIME;
-+ if (TRUE==gst_element_query_position(m_playbin, &fmt, &elapsed)){
-+ m_clock = elapsed/1000000;
-+ }
-+ }
-+ return m_clock;
-+}
-+
-+// return length in seconds.. this should be changed to return in milleseconds throughout xbmc
-+int CGstPlayer::GetTotalTime()
-+{
-+ int totaltime = 0;
-+ if (m_playbin){
-+ gint64 duration = 0;
-+ GstFormat fmt = GST_FORMAT_TIME;
-+ gst_element_query_duration(m_playbin, &fmt, &duration);
-+ totaltime = duration/1000000000;
-+ }
-+ //CLog::Log(LOGNOTICE, "---[%s]--- %d", __FUNCTION__, totaltime);
-+ return totaltime;
-+}
-+
-+void CGstPlayer::SetPlaybackRate(int iSpeed, gint64 pos)
-+{
-+ GstEvent *event;
-+ if(iSpeed > 0)
-+ event = gst_event_new_seek(iSpeed, GST_FORMAT_TIME,
-+ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
-+ GST_SEEK_TYPE_SET, pos,
-+ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
-+ else
-+ event = gst_event_new_seek(iSpeed, GST_FORMAT_TIME,
-+ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
-+ GST_SEEK_TYPE_SET, 0,
-+ GST_SEEK_TYPE_SET, pos);
-+ gst_element_send_event(m_playbin, event);
-+}
-+
-+void CGstPlayer::ToFFRW(int iSpeed)
-+{
-+ gint64 elapsed = 0;
-+ GstFormat fmt = GST_FORMAT_TIME;
-+ CLog::Log(LOGNOTICE, "---[%s]-%d--", __FUNCTION__, iSpeed);
-+ m_speed = iSpeed;
-+
-+ if (m_playbin){
-+ if(gst_element_query_position(m_playbin, &fmt, &elapsed)) {
-+ /*
-+ if(iSpeed == 1)
-+ g_object_set(G_OBJECT(m_playbin), "mute", FALSE, NULL);
-+ else
-+ g_object_set(G_OBJECT(m_playbin), "mute", TRUE, NULL);
-+ */
-+ SetPlaybackRate(iSpeed, elapsed);
-+ m_callback.OnPlayBackSpeedChanged(iSpeed);
-+ }
-+ }
-+}
-+
-+
-+CStdString CGstPlayer::GetPlayerState()
-+{
-+ //CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ return "";
-+}
-+
-+bool CGstPlayer::SetPlayerState(CStdString state)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ return true;
-+}
-+
-+bool CGstPlayer::OnAction(const CAction &action)
-+{
-+ //CLog::Log(LOGNOTICE, "on action id %d", action.id);
-+ return false;
-+}
-+
-+void CGstPlayer::GetVideoRect(CRect& SrcRect, CRect& DestRect)
-+{
-+ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
-+ g_renderManager.GetVideoRect(SrcRect, DestRect);
-+}
-+
-diff --git a/xbmc/cores/gstplayer/GstPlayer.h b/xbmc/cores/gstplayer/GstPlayer.h
-new file mode 100644
-index 0000000..dad24a2
---- /dev/null
-+++ b/xbmc/cores/gstplayer/GstPlayer.h
-@@ -0,0 +1,176 @@
-+/*
-+ * Copyright (C) 2012 linaro
-+ * http://www.linaro.org
-+ *
-+ * This Program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This Program 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with XBMC; see the file COPYING. If not, write to
-+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-+ * http://www.gnu.org/copyleft/gpl.html
-+ *
-+ */
-+
-+#pragma once
-+#include "cores/IPlayer.h"
-+#include "threads/Thread.h"
-+#include <gst/gst.h>
-+
-+typedef struct{
-+ gchar * codec;
-+ gchar * lang;
-+ guint bitrate;
-+} MediaAudioInfo;
-+
-+typedef struct {
-+ gchar * codec;
-+ guint bitrate;
-+} MediaVideoInfo;
-+
-+typedef struct{
-+ bool loaded;
-+ gint video_num;
-+ gint audio_num;
-+ gint sub_num;
-+ gchar * container_format;
-+ gchar * title;
-+ gchar * genre;
-+ gchar * artist;
-+ gchar * description;
-+ gchar * album;
-+ gboolean seekable;
-+ MediaAudioInfo * audio_info;
-+ MediaVideoInfo * video_info;
-+} MediaInfo;
-+
-+class CGstPlayer : public IPlayer, public CThread
-+{
-+public:
-+ CGstPlayer(IPlayerCallback& callback);
-+ virtual ~CGstPlayer();
-+ virtual void RegisterAudioCallback(IAudioCallback* pCallback) {}
-+ virtual void UnRegisterAudioCallback() {}
-+ virtual bool OpenFile(const CFileItem& file, const CPlayerOptions &options);
-+ virtual bool CloseFile();
-+ virtual bool IsPlaying() const;
-+ virtual void Pause();
-+ virtual bool IsPaused() const;
-+ virtual bool HasVideo() const;
-+ virtual bool HasAudio() const;
-+ virtual void ToggleOSD() { }; // empty
-+ virtual void SwitchToNextLanguage();
-+ virtual void ToggleSubtitles();
-+ virtual bool CanSeek();
-+ virtual void Seek(bool bPlus, bool bLargeStep);
-+ virtual void SeekPercentage(float iPercent);
-+ virtual float GetPercentage();
-+ virtual void SetVolume(long nVolume);
-+ virtual void SetDynamicRangeCompression(long drc) {}
-+ virtual void SetContrast(bool bPlus) {}
-+ virtual void SetBrightness(bool bPlus) {}
-+ virtual void SetHue(bool bPlus) {}
-+ virtual void SetSaturation(bool bPlus) {}
-+ virtual void GetAudioInfo(CStdString& strAudioInfo);
-+ virtual void GetVideoInfo(CStdString& strVideoInfo);
-+ virtual void GetGeneralInfo( CStdString& strVideoInfo);
-+ virtual void Update(bool bPauseDrawing) {}
-+ virtual void SwitchToNextAudioLanguage();
-+ virtual bool CanRecord() { return false; }
-+ virtual bool IsRecording() { return false; }
-+ virtual bool Record(bool bOnOff) { return false; }
-+ virtual void SetAVDelay(float fValue = 0.0f);
-+ virtual float GetAVDelay();
-+ virtual bool OnAction(const CAction &action);
-+ virtual void GetVideoRect(CRect& SrcRect, CRect& DestRect);
-+
-+ virtual void SetSubTitleDelay(float fValue = 0.0f);
-+ virtual float GetSubTitleDelay();
-+
-+ virtual void SeekTime(__int64 iTime);
-+ virtual __int64 GetTime();
-+ virtual int GetTotalTime();
-+ virtual void ToFFRW(int iSpeed);
-+ virtual void DoAudioWork() {}
-+
-+ virtual CStdString GetPlayerState();
-+ virtual bool SetPlayerState(CStdString state);
-+
-+
-+ virtual int GetCacheLevel() const ;
-+ virtual bool IsCaching() const { return m_buffering == TRUE; }
-+ virtual bool LoadMediaInfo();
-+
-+ virtual int GetAudioStreamCount();
-+ virtual void GetAudioStreamName(int iStream, CStdString &strStreamName);
-+ virtual void SetAudioStream(int iStream);
-+ virtual int GetAudioStream();
-+
-+
-+private:
-+ virtual void Process();
-+ bool CreatePlayBin();
-+ bool DestroyPlayBin();
-+ void SetPlaybackRate(int iSpeed, gint64 pos);
-+ CStdString ParseAndCorrectUrl(CURL &url);
-+ void ResetUrlInfo();
-+ void SetSinkRenderDelay(GstElement * ele, guint64 renderDelay);
-+ void CleanMediaInfo();
-+ int OutputPicture(GstBuffer * gstbuffer);
-+ bool SetAndWaitPlaybinState(GstState newstate, int timeout);
-+
-+ CFileItem m_item;
-+
-+ CRect m_srcRect;
-+ CRect m_destRect;
-+ static void OnDecodedBuffer(GstElement *appsink, void *data);
-+
-+ bool m_buffering;
-+ gint m_cache_level;
-+
-+ bool m_paused;
-+ bool m_quit_msg;
-+ __int64 m_clock;
-+ DWORD m_lastTime;
-+ bool m_voutput_init;
-+ int m_speed;
-+ bool m_cancelled;
-+ gint64 m_starttime;
-+ CEvent m_ready;
-+
-+ MediaInfo m_mediainfo;
-+ GstBus *m_bus;
-+ GstElement *m_playbin;
-+
-+ int m_file_cnt;
-+
-+ int m_audio_current;
-+ int m_video_current;
-+
-+ struct SOutputConfiguration
-+ {
-+ unsigned int width;
-+ unsigned int height;
-+ unsigned int dwidth;
-+ unsigned int dheight;
-+ unsigned int color_format;
-+ unsigned int extended_format;
-+ unsigned int color_matrix : 4;
-+ unsigned int color_range : 1;
-+ unsigned int chroma_position;
-+ unsigned int color_primaries;
-+ unsigned int color_transfer;
-+ double framerate;
-+ } m_output;
-+
-+ CStdString m_username;
-+ CStdString m_password;
-+ std::map<CStdString, CStdString> m_requestheaders;
-+};
-diff --git a/xbmc/cores/gstplayer/Makefile.in b/xbmc/cores/gstplayer/Makefile.in
-new file mode 100644
-index 0000000..1588fd0
---- /dev/null
-+++ b/xbmc/cores/gstplayer/Makefile.in
-@@ -0,0 +1,12 @@
-+INCLUDES=-I../../.. -I. -I.. -I../../ -I../../linux -I../../utils -I../../../guilib -I../../lib -I../dvdplayer/Codecs/ffmpeg
-+
-+
-+CXXFLAGS+=-D__STDC_FORMAT_MACROS
-+
-+SRCS= GstPlayer.cpp
-+
-+LIB= GstPlayer.a
-+
-+include ../../../Makefile.include
-+-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
-+
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/403_gstplayer.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/403_gstplayer.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,1275 @@
+diff --git a/xbmc/cores/gstplayer/GstPlayer.cpp b/xbmc/cores/gstplayer/GstPlayer.cpp
+new file mode 100644
+index 0000000..201730d
+--- /dev/null
++++ b/xbmc/cores/gstplayer/GstPlayer.cpp
+@@ -0,0 +1,1068 @@
++/*
++ * Copyright (C) 2012 linaro
++ * http://www.linaro.org
++ *
++ * This Program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This Program 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with XBMC; see the file COPYING. If not, write to
++ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
++ * http://www.gnu.org/copyleft/gpl.html
++ *
++ */
++
++#include "threads/SystemClock.h"
++#include "system.h"
++
++#include "utils/LangCodeExpander.h"
++#include "guilib/LocalizeStrings.h"
++
++#include "utils/URIUtils.h"
++#include "GUIInfoManager.h"
++#include "guilib/GUIWindowManager.h"
++#include "Application.h"
++#include "filesystem/File.h"
++#include "pictures/Picture.h"
++#include "DllSwScale.h"
++#if defined(HAS_VIDEO_PLAYBACK)
++#include "cores/VideoRenderers/RenderManager.h"
++#endif
++#if defined(HAS_PERFORMANCE_SAMPLE)
++#include "xbmc/utils/PerformanceSample.h"
++#else
++#define MEASURE_FUNCTION
++#endif
++#include "settings/AdvancedSettings.h"
++#include "FileItem.h"
++#include "settings/GUISettings.h"
++#include "GUIUserMessages.h"
++#include "settings/Settings.h"
++#include "utils/log.h"
++#include "utils/TimeUtils.h"
++#include "utils/StreamDetails.h"
++#include "utils/StreamUtils.h"
++#include "utils/Variant.h"
++#include "storage/MediaManager.h"
++#include "dialogs/GUIDialogBusy.h"
++#include "dialogs/GUIDialogKaiToast.h"
++#include "utils/StringUtils.h"
++#include "Util.h"
++#include <gst/app/gstappsink.h>
++
++#include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h"
++
++
++
++
++#include "GstPlayer.h"
++
++
++
++#define LOAD_TAG(data, tags, tagid) \
++ do {\
++ if ((data)==NULL){\
++ gchar * value;\
++ if (gst_tag_list_get_string ((tags), (tagid), &value)){\
++ (data) = value;\
++ }\
++ }\
++ }while(0)
++
++#define APPEND_STR(string, data, prefix, postfix) \
++ do {\
++ if ((data)){\
++ (string) += (prefix);\
++ (string) += (data);\
++ (string) += (postfix);\
++ }\
++ }while(0)
++
++
++CGstPlayer::CGstPlayer(IPlayerCallback& callback)
++: IPlayer(callback),
++ CThread(),
++ m_ready(true)
++{
++ m_bStop = true;
++ m_paused = false;
++ m_clock = 0;
++ m_lastTime = 0;
++ m_speed = 1;
++ m_playbin = NULL;
++ m_voutput_init = false;
++ m_srcRect.SetRect(0.0f,0.0f,640.0f,480.0f);
++ m_buffering = false;
++ m_cache_level = 100;
++ m_file_cnt = 0;
++ gst_init(NULL, NULL);
++}
++
++CGstPlayer::~CGstPlayer()
++{
++ CloseFile();
++}
++
++bool CGstPlayer::LoadMediaInfo()
++{
++ if (m_playbin){
++ int i;
++ GstQuery *query;
++
++ g_object_get( G_OBJECT(m_playbin), "n-video", &m_mediainfo.video_num, NULL);
++ g_object_get( G_OBJECT(m_playbin), "n-audio", &m_mediainfo.audio_num, NULL);
++
++ g_object_get( G_OBJECT(m_playbin), "current-audio", &m_audio_current, NULL);
++ if (m_audio_current<0) m_audio_current=0;
++ g_object_get( G_OBJECT(m_playbin), "current-video", &m_video_current, NULL);
++ if (m_video_current<0) m_video_current=0;
++
++ query = gst_query_new_seeking (GST_FORMAT_TIME);
++ if(gst_element_query (m_playbin, query))
++ gst_query_parse_seeking (query, NULL, &m_mediainfo.seekable, NULL, NULL);
++ else
++ m_mediainfo.seekable=false;
++ gst_query_unref (query);
++
++ if (m_mediainfo.audio_num){
++ m_mediainfo.audio_info = (MediaAudioInfo*)g_malloc(sizeof(MediaAudioInfo)*m_mediainfo.audio_num);
++ memset(m_mediainfo.audio_info, 0, (sizeof(MediaAudioInfo)*m_mediainfo.audio_num));
++ }
++
++ if (m_mediainfo.video_num){
++ m_mediainfo.video_info = (MediaVideoInfo*)g_malloc(sizeof(MediaVideoInfo)*m_mediainfo.video_num);
++ memset(m_mediainfo.video_info, 0, (sizeof(MediaVideoInfo)*m_mediainfo.video_num));
++ }
++
++ for (i=0;i<m_mediainfo.audio_num;i++)
++ {
++ GstTagList *tags = NULL;
++
++ g_signal_emit_by_name (G_OBJECT (m_playbin), "get-audio-tags", i, &tags);
++
++ if (tags) {
++ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[i];
++
++ LOAD_TAG(ainfo->lang, tags, GST_TAG_LANGUAGE_CODE);
++ LOAD_TAG(ainfo->codec, tags, GST_TAG_CODEC);
++ if (ainfo->codec==NULL){
++ LOAD_TAG(ainfo->codec, tags, GST_TAG_AUDIO_CODEC);
++ }
++
++ gst_tag_list_get_uint(tags, GST_TAG_BITRATE, &ainfo->bitrate);
++
++ LOAD_TAG(m_mediainfo.container_format, tags, GST_TAG_CONTAINER_FORMAT);
++ LOAD_TAG(m_mediainfo.title, tags, GST_TAG_TITLE);
++ LOAD_TAG(m_mediainfo.artist, tags, GST_TAG_ARTIST);
++ LOAD_TAG(m_mediainfo.description, tags, GST_TAG_DESCRIPTION);
++ LOAD_TAG(m_mediainfo.album, tags, GST_TAG_ALBUM);
++ LOAD_TAG(m_mediainfo.genre, tags, GST_TAG_GENRE);
++
++ gst_tag_list_free (tags);
++ }
++ }
++
++ for (i=0;i<m_mediainfo.video_num;i++)
++ {
++ GstTagList *tags = NULL;
++
++ g_signal_emit_by_name (G_OBJECT (m_playbin), "get-video-tags", i, &tags);
++
++ if (tags) {
++ MediaVideoInfo * vinfo = &m_mediainfo.video_info[i];
++
++ LOAD_TAG(vinfo->codec, tags, GST_TAG_CODEC);
++ if (vinfo->codec==NULL){
++ LOAD_TAG(vinfo->codec, tags, GST_TAG_VIDEO_CODEC);
++ }
++ gst_tag_list_get_uint(tags, GST_TAG_BITRATE, &vinfo->bitrate);
++
++ LOAD_TAG(m_mediainfo.container_format, tags, GST_TAG_CONTAINER_FORMAT);
++ LOAD_TAG(m_mediainfo.title, tags, GST_TAG_TITLE);
++ LOAD_TAG(m_mediainfo.artist, tags, GST_TAG_ARTIST);
++ LOAD_TAG(m_mediainfo.description, tags, GST_TAG_DESCRIPTION);
++ LOAD_TAG(m_mediainfo.album, tags, GST_TAG_ALBUM);
++ LOAD_TAG(m_mediainfo.genre, tags, GST_TAG_GENRE);
++
++ gst_tag_list_free (tags);
++ }
++ }
++
++ m_mediainfo.loaded = true;
++ return true;
++ }
++ return false;
++}
++
++int CGstPlayer::GetAudioStreamCount()
++{
++ return m_mediainfo.audio_num;
++}
++
++void CGstPlayer::GetAudioStreamName(int iStream, CStdString& strStreamName)
++{
++ strStreamName = "";
++ if ((m_playbin) && (m_mediainfo.audio_info) && (iStream<m_mediainfo.audio_num)){
++ if (m_mediainfo.audio_info[iStream].lang){
++ CStdString code = m_mediainfo.audio_info[iStream].lang;
++ if (!g_LangCodeExpander.Lookup(strStreamName, code)) strStreamName = m_mediainfo.audio_info[iStream].lang;
++ }
++ strStreamName += " ";
++ if (m_mediainfo.audio_info[iStream].codec){
++ strStreamName += m_mediainfo.audio_info[iStream].codec;
++ }
++ }else{
++ strStreamName += "Unknown";
++ }
++}
++
++int CGstPlayer::GetAudioStream()
++{
++ return m_audio_current;
++}
++
++
++int CGstPlayer::OutputPicture(GstBuffer * gstbuffer)
++{
++ /* picture buffer is not allowed to be modified in this call */
++ DVDVideoPicture picture;
++ DVDVideoPicture* pPicture = &picture;
++ int result = 0;
++ gint flags;
++ double config_framerate = 30.0;
++
++ memset(pPicture, 0, sizeof(DVDVideoPicture));
++
++#ifdef HAS_VIDEO_PLAYBACK
++
++ GstCaps * caps = GST_BUFFER_CAPS(gstbuffer);
++
++ if (caps){
++ gint width, height;
++ guint32 format;
++ GstStructure * structure = gst_caps_get_structure (caps, 0);
++
++ if (structure == NULL ||
++ !gst_structure_get_int (structure, "width", &width) ||
++ !gst_structure_get_int (structure, "height", &height) ||
++ !gst_structure_get_fourcc (structure, "format", &format)){
++
++ CLog::Log(LOGERROR, "Unsupport output format");
++ return -1;
++ }
++
++ pPicture->iDisplayWidth = pPicture->iWidth = width;
++ pPicture->iDisplayHeight = pPicture->iHeight = height;
++
++ if (format==GST_STR_FOURCC("NV12")){
++ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
++ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
++ pPicture->iLineSize[0] = pPicture->iWidth;
++ pPicture->iLineSize[1] = pPicture->iWidth;
++ flags = CONF_FLAGS_FORMAT_NV12;
++ }else if (format==GST_STR_FOURCC("I420")){
++ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
++ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
++ pPicture->data[2] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height*5/4;
++ pPicture->iLineSize[0] = pPicture->iWidth;
++ pPicture->iLineSize[1] = pPicture->iWidth/2;
++ pPicture->iLineSize[2] = pPicture->iWidth/2;
++ flags = CONF_FLAGS_FORMAT_YV12;
++ }else{
++ CLog::Log(LOGERROR, "Unsupport output format");
++ return -1;
++ }
++
++ }else{
++ return -1;
++ }
++
++
++ if ((m_output.width!=pPicture->iWidth) || (m_output.height!=pPicture->iHeight)){
++ if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->extended_format))
++ {
++ CLog::Log(LOGNOTICE, "Failed to configure renderer");
++ return -1;
++ }
++
++ m_output.width=pPicture->iWidth;
++ m_output.height=pPicture->iHeight;
++ }
++
++ int index = g_renderManager.AddVideoPicture(*pPicture);
++#if 0
++ // video device might not be done yet
++ while (index < 0 && !CThread::m_bStop &&
++ CDVDClock::GetAbsoluteClock(false) < iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500) )
++ {
++ Sleep(1);
++ index = g_renderManager.AddVideoPicture(*pPicture);
++ }
++#endif
++ if (index < 0)
++ return -1;
++
++ g_renderManager.FlipPage(CThread::m_bStop, 0LL, -1, FS_NONE);
++
++ return result;
++
++#endif
++}
++
++
++void CGstPlayer::SetAudioStream(int iStream)
++{
++ if ((m_playbin) && (iStream>=0) && (iStream<m_mediainfo.audio_num)){
++ m_audio_current = iStream;
++ g_object_set( G_OBJECT(m_playbin), "current-audio", iStream, NULL);
++ }
++}
++
++void CGstPlayer::CleanMediaInfo()
++{
++ int i;
++
++ if (m_mediainfo.container_format){
++ g_free(m_mediainfo.container_format);
++ m_mediainfo.container_format = NULL;
++ }
++ if (m_mediainfo.genre){
++ g_free(m_mediainfo.genre);
++ m_mediainfo.genre = NULL;
++ }
++ if (m_mediainfo.title){
++ g_free(m_mediainfo.title);
++ m_mediainfo.title = NULL;
++ }
++ if (m_mediainfo.artist){
++ g_free(m_mediainfo.artist);
++ m_mediainfo.artist = NULL;
++ }
++ if (m_mediainfo.description){
++ g_free(m_mediainfo.description);
++ m_mediainfo.description = NULL;
++ }
++ if (m_mediainfo.album){
++ g_free(m_mediainfo.album);
++ m_mediainfo.album = NULL;
++ }
++
++
++
++
++ if (m_mediainfo.audio_info){
++ for (i=0;i<m_mediainfo.audio_num;i++){
++ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[i];
++
++ if (ainfo->lang){
++ g_free(ainfo->lang);
++ ainfo->lang = NULL;
++ }
++ if (ainfo->codec){
++ g_free(ainfo->codec);
++ ainfo->codec = NULL;
++ }
++
++ }
++ g_free(m_mediainfo.audio_info);
++ m_mediainfo.audio_info = NULL;
++ }
++
++ if (m_mediainfo.video_info){
++ for (i=0;i<m_mediainfo.video_num;i++){
++ MediaVideoInfo * vinfo = &m_mediainfo.video_info[i];
++ if (vinfo->codec){
++ g_free(vinfo->codec);
++ vinfo->codec = NULL;
++ }
++ }
++ g_free(m_mediainfo.video_info);
++ m_mediainfo.video_info = NULL;
++ }
++}
++
++void CGstPlayer::OnDecodedBuffer(GstElement *appsink, void *data)
++{
++ CGstPlayer *decoder = (CGstPlayer *)data;
++
++ GstBuffer *buffer = gst_app_sink_pull_buffer(GST_APP_SINK(appsink));
++ if (buffer)
++ {
++ decoder->OutputPicture(buffer);
++
++ gst_buffer_unref(buffer);
++ }
++ else{
++ CLog::Log(LOGERROR,"GStreamer: OnDecodedBuffer - Null Buffer");
++ }
++}
++
++
++bool CGstPlayer::CreatePlayBin()
++{
++ GstElement *videosink, *audiosink=NULL;
++ m_playbin = gst_element_factory_make("playbin2", "playbin0");
++ if(!m_playbin)
++ {
++ CLog::Log(LOGERROR, "CreatePlayBin - gst_element_factory_make playbin2 failed");
++ return false;
++ }
++
++ //prepare videosink
++ videosink = gst_element_factory_make("appsink", "videosink0");
++ if(!videosink)
++ {
++ CLog::Log(LOGERROR, "CreatePlayBin - gst_element_factory_make appsink failed");
++ return false;
++ }
++
++ {
++ g_object_set(G_OBJECT(videosink), "emit-signals", TRUE, "sync", TRUE, NULL);
++ g_signal_connect(videosink, "new-buffer", G_CALLBACK(OnDecodedBuffer), this);
++ }
++
++ g_object_set(G_OBJECT(m_playbin), "video-sink", videosink, NULL);
++ //GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_TEXT | GST_PLAY_FLAG_SOFT_VOLUME
++ g_object_set(G_OBJECT(m_playbin), "flags", 0x5F, NULL);
++
++ m_bus = gst_pipeline_get_bus(GST_PIPELINE(m_playbin));
++ if( NULL == m_bus )
++ {
++ CLog::Log(LOGERROR, "%s(): Failed in gst_pipeline_get_bus()!", __FUNCTION__);
++ return false;
++ }
++ return true;
++}
++
++bool CGstPlayer::DestroyPlayBin()
++{
++ gst_object_unref(m_playbin);
++ m_playbin = NULL;
++ gst_object_unref(m_bus);
++ m_bus = NULL;
++ return true;
++}
++
++bool CGstPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options)
++{
++ if (m_playbin){
++ CloseFile();
++ }
++
++ m_clock = 0;
++ m_bStop = false;
++ m_item = file;
++ m_starttime = (gint64)(options.starttime*1000000000);
++
++ memset(&m_mediainfo, 0, sizeof(MediaInfo));
++
++ m_audio_current = 0;
++ m_video_current = 0;
++
++
++ g_renderManager.PreInit();
++
++ m_buffering = false;
++ m_cache_level = 100;
++
++ m_quit_msg = false;
++ m_cancelled = false;
++
++ if(!CreatePlayBin())
++ return false;
++
++ m_ready.Reset();
++ //CLog::Log(LOGNOTICE, "Player thread create");
++ Create();
++ //if(!m_ready.WaitMSec(2000))
++ {
++ //CLog::Log(LOGNOTICE, "Player thread start timeout");
++ CGUIDialogBusy* dialog = (CGUIDialogBusy*)g_windowManager.GetWindow(WINDOW_DIALOG_BUSY);
++ dialog->Show();
++ while(!m_ready.WaitMSec(10))
++ {
++ g_windowManager.Process(CTimeUtils::GetFrameTime());
++ if(dialog->IsCanceled())
++ {
++ m_cancelled = true;
++ m_ready.Wait();
++ break;
++ }
++ }
++ dialog->Close();
++ }
++
++ //CLog::Log(LOGNOTICE, "Player thread create success");
++ if(m_bStop)
++ return false;
++
++ m_callback.OnPlayBackStarted();
++
++ //CLog::Log(LOGNOTICE, "GxPlayer OpenFile return");
++ return true;
++}
++
++bool CGstPlayer::CloseFile()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++
++ m_bStop = true;
++ m_paused = false;
++ m_quit_msg = true;
++
++ if(m_bus)
++ gst_bus_post(m_bus, gst_message_new_custom(GST_MESSAGE_APPLICATION, NULL, gst_structure_new("quit", NULL)));
++
++ CLog::Log(LOGNOTICE, "CloseFile - Stopping Thread");
++ StopThread();
++
++ if (m_playbin)
++ DestroyPlayBin();
++
++ CleanMediaInfo();
++
++ g_renderManager.UnInit();
++
++ m_callback.OnPlayBackStopped();
++ return true;
++}
++
++bool CGstPlayer::IsPlaying() const
++{
++ return !m_bStop;
++}
++
++void CGstPlayer::ResetUrlInfo()
++{
++ m_username.clear();
++ m_password.clear();
++}
++
++CStdString CGstPlayer::ParseAndCorrectUrl(CURL &url)
++{
++ CStdString strProtocol = url.GetTranslatedProtocol();
++ CStdString ret;
++ url.SetProtocol(strProtocol);
++
++ ResetUrlInfo();
++ if(url.IsLocal()) { //local file
++ CStdString path = url.GetFileName();
++ gchar *fname = NULL;
++ if(url.IsFullPath(path))
++ fname = g_strdup(path.c_str());
++ else {
++ gchar *pwd = g_get_current_dir();
++ fname = g_strdup_printf("%s/%s", pwd, path.c_str());
++ g_free(pwd);
++ }
++ url.SetFileName(CStdString(fname));
++ url.SetProtocol("file");
++ g_free(fname);
++ }
++ else if( strProtocol.Equals("http")
++ || strProtocol.Equals("https"))
++ {
++
++ // replace invalid spaces
++ CStdString strFileName = url.GetFileName();
++ strFileName.Replace(" ", "%20");
++ url.SetFileName(strFileName);
++
++ // get username and password
++ m_username = url.GetUserName();
++ m_password = url.GetPassWord();
++
++ }
++
++ if (m_username.length() > 0 && m_password.length() > 0)
++ ret = url.GetWithoutUserDetails();
++ else
++ ret = url.Get();
++ return ret;
++}
++
++bool CGstPlayer::SetAndWaitPlaybinState(GstState newstate, int timeout)
++{
++ GstStateChangeReturn ret;
++
++
++ if (m_playbin){
++ ret = gst_element_set_state(m_playbin, newstate);
++ if (ret==GST_STATE_CHANGE_ASYNC){
++ GstState current, pending;
++ do{
++ ret = gst_element_get_state(m_playbin, &current, &pending, GST_SECOND);
++ }while((m_cancelled==false)&&(ret==GST_STATE_CHANGE_ASYNC) && (timeout-->=0));
++ }
++
++ if ((ret==GST_STATE_CHANGE_FAILURE)||(ret==GST_STATE_CHANGE_ASYNC)){
++ return false;
++ }else{
++ return true;
++ }
++ }
++ return false;
++
++}
++
++
++
++
++
++void CGstPlayer::Process()
++{
++ bool ret;
++ GstEvent *seek_event;
++ GstMessage *msg;
++ GstState old, current, pending;
++ bool eos = false;
++ int i;
++ CLog::Log(LOGNOTICE, "Player thread start %p", m_playbin);
++ if (m_playbin) {
++ CURL url = m_item.GetAsUrl();
++ CStdString uri = ParseAndCorrectUrl(url);
++ CLog::Log(LOGNOTICE, "Play uri %s", uri.c_str());
++ g_object_set(G_OBJECT(m_playbin), "uri", uri.c_str(), NULL);
++
++ if ((SetAndWaitPlaybinState(GST_STATE_PAUSED, 60)==false) || (m_cancelled)){
++ m_bStop = true;
++ m_ready.Set();
++ goto finish;
++ }
++ if (m_starttime) {
++ seek_event = gst_event_new_seek(1.0, GST_FORMAT_TIME,
++ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
++ GST_SEEK_TYPE_SET, m_starttime,
++ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
++ gst_element_send_event(m_playbin, seek_event);
++ }
++ LoadMediaInfo();
++
++ if (SetAndWaitPlaybinState(GST_STATE_PLAYING, 10)==false){
++
++ m_bStop = true;
++ m_ready.Set();
++ goto finish;
++ }
++
++ g_renderManager.SetViewMode(g_settings.m_currentVideoSettings.m_ViewMode);
++ }
++
++ m_ready.Set();
++
++ while(!m_quit_msg && !eos) {
++ msg = gst_bus_timed_pop(m_bus, 1000000000);
++ if(msg) {
++ if(GST_MESSAGE_SRC(msg) == GST_OBJECT(m_playbin)) { //playbin message
++ switch(msg->type) {
++ case GST_MESSAGE_EOS:
++ {
++ CLog::Log(LOGNOTICE, "Media EOS");
++ eos = true;
++ break;
++ }
++ case GST_MESSAGE_ERROR:
++ {
++ CLog::Log(LOGERROR, "Media Error");
++ eos = true;
++ break;
++ }
++
++ case GST_MESSAGE_STATE_CHANGED:
++ {
++ break;
++ }
++
++ default:
++ break;
++ }
++ }
++ else {
++ if(msg->type == GST_MESSAGE_APPLICATION && GST_MESSAGE_SRC(msg) == NULL) {
++ const GstStructure *s = gst_message_get_structure(msg);
++ const gchar *name = gst_structure_get_name(s);
++ if(!g_strcmp0(name, "pause")) {
++ if(!m_buffering && !m_paused)
++ gst_element_set_state(m_playbin, GST_STATE_PLAYING);
++ else
++ gst_element_set_state(m_playbin, GST_STATE_PAUSED);
++ }
++ else if(!g_strcmp0(name, "quit")) {
++ //will quit by m_quit_msg
++ }
++ }
++ else if(msg->type == GST_MESSAGE_BUFFERING)
++ {
++ gst_message_parse_buffering(msg, &m_cache_level);
++ if(m_cache_level == 0) {
++ m_buffering = true;
++ gst_element_set_state(m_playbin, GST_STATE_PAUSED);
++ }
++ else if(m_cache_level >= 100) {
++ m_buffering = false;
++ if(!m_paused) {
++ gst_element_set_state(m_playbin, GST_STATE_PLAYING);
++ }
++ }
++ }
++ }
++ gst_message_unref(msg);
++ }
++ }
++finish:
++ CLog::Log(LOGNOTICE, "Player stop begin");
++ gst_bus_set_flushing(m_bus, TRUE);
++
++ if (SetAndWaitPlaybinState(GST_STATE_NULL,30)==false){
++
++ CLog::Log(LOGERROR, "Stop player failed");
++ }
++ m_bStop = true;
++ if(eos)
++ m_callback.OnPlayBackEnded();
++ CLog::Log(LOGNOTICE, "Player thread end");
++}
++
++void CGstPlayer::Pause()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++
++ m_paused = !m_paused;
++ if (m_bus){
++ gst_bus_post(m_bus, gst_message_new_custom(GST_MESSAGE_APPLICATION, NULL, gst_structure_new("pause", NULL)));
++ }
++ if (!m_paused) {
++ m_callback.OnPlayBackResumed();
++ }
++ else {
++ m_callback.OnPlayBackPaused();
++ }
++}
++
++bool CGstPlayer::IsPaused() const
++{
++ return m_paused || m_buffering;
++}
++
++bool CGstPlayer::HasVideo() const
++{
++ return (m_mediainfo.video_num>0);
++}
++
++bool CGstPlayer::HasAudio() const
++{
++ return (m_mediainfo.audio_num>0);
++}
++
++int CGstPlayer::GetCacheLevel() const
++{
++ return m_cache_level;
++}
++
++void CGstPlayer::SwitchToNextLanguage()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++}
++
++void CGstPlayer::ToggleSubtitles()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++}
++
++bool CGstPlayer::CanSeek()
++{
++ return m_mediainfo.seekable;
++}
++
++void CGstPlayer::Seek(bool bPlus, bool bLargeStep)
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++}
++
++void CGstPlayer::SetVolume(long nVolume)
++{
++ CLog::Log(LOGNOTICE, "---[%s]--- %ld", __FUNCTION__, nVolume);
++ if(m_playbin)
++ {
++ double linear;
++ if(nVolume <= VOLUME_MINIMUM)
++ linear = 0.0;
++ else
++ {
++ linear = pow(10.0, (double)nVolume/1000.0);
++ linear = cbrt(linear);
++ if(linear > 10.0)
++ linear = 10.0;
++ }
++ g_object_set(G_OBJECT(m_playbin), "volume", linear, NULL);
++ }
++}
++
++void CGstPlayer::GetAudioInfo(CStdString& strAudioInfo)
++{
++ strAudioInfo = "Audio (";
++ if (m_mediainfo.audio_info){
++ MediaAudioInfo * ainfo = &m_mediainfo.audio_info[m_audio_current];
++ APPEND_STR(strAudioInfo, ainfo->codec, "Codec: ", ", ");
++ APPEND_STR(strAudioInfo, ainfo->lang, "Language: ", ", ");
++ if (ainfo->bitrate){
++ CStdString bitstr;
++ bitstr.Format("Bitrate: %d", ainfo->bitrate);
++ strAudioInfo += bitstr;
++ }
++ }
++ strAudioInfo += ")";
++
++}
++
++void CGstPlayer::GetVideoInfo(CStdString& strVideoInfo)
++{
++ strVideoInfo = "Video (";
++ if (m_mediainfo.video_info){
++ MediaVideoInfo * vinfo = &m_mediainfo.video_info[m_video_current];
++ APPEND_STR(strVideoInfo, vinfo->codec, "Codec: ", ", ");
++ if (vinfo->bitrate){
++ CStdString bitstr;
++ bitstr.Format("Bitrate: %d", vinfo->bitrate);
++ strVideoInfo += bitstr;
++ }
++ }
++ strVideoInfo += ")";
++}
++
++void CGstPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
++{
++ strGeneralInfo = "";
++ APPEND_STR(strGeneralInfo, m_mediainfo.title, "Title :", ", ");
++ APPEND_STR(strGeneralInfo, m_mediainfo.artist, "Artist: ", ", ");
++ APPEND_STR(strGeneralInfo, m_mediainfo.genre, "Genre: ", ", ");
++ APPEND_STR(strGeneralInfo, m_mediainfo.album, "Album: ", ", ");
++ APPEND_STR(strGeneralInfo, m_mediainfo.description, "Desc: ", ", ");
++ APPEND_STR(strGeneralInfo, m_mediainfo.container_format, "Format: ", "");
++}
++
++void CGstPlayer::SwitchToNextAudioLanguage()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++}
++
++void CGstPlayer::SeekPercentage(float iPercent)
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ __int64 iTotalMsec = GetTotalTime() * 1000;
++ __int64 iTime = (__int64)(iTotalMsec * iPercent / 100);
++ SeekTime(iTime);
++}
++
++float CGstPlayer::GetPercentage()
++{
++ __int64 iTotalTime = GetTotalTime() * 1000;
++ //CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ if (iTotalTime != 0)
++ {
++ return GetTime() * 100 / (float)iTotalTime;
++ }
++ return 0.0f;
++}
++
++
++void CGstPlayer::SetSinkRenderDelay(GstElement * ele, guint64 renderDelay)
++{
++ if (GST_IS_BIN(ele)){
++ GstIterator *elem_it = NULL;
++ gboolean done = FALSE;
++ elem_it = gst_bin_iterate_sinks (GST_BIN (ele));
++ while (!done) {
++ GstElement *element = NULL;
++
++ switch (gst_iterator_next (elem_it, ((void **)&element))) {
++ case GST_ITERATOR_OK:
++ if (element ) {
++ g_object_set( G_OBJECT(element), "render-delay", renderDelay, NULL);
++ }
++ gst_object_unref (element);
++ break;
++ case GST_ITERATOR_RESYNC:
++ gst_iterator_resync (elem_it);
++ break;
++ case GST_ITERATOR_ERROR:
++ done = TRUE;
++ break;
++ case GST_ITERATOR_DONE:
++ done = TRUE;
++ break;
++ }
++ }
++ gst_iterator_free (elem_it);
++ }else{
++ g_object_set( G_OBJECT(ele), "render-delay", renderDelay, NULL);
++ }
++}
++
++//This is how much audio is delayed to video, we count the oposite in the dvdplayer
++void CGstPlayer::SetAVDelay(float fValue)
++{
++ if ((m_playbin) && (m_mediainfo.audio_num) && (m_mediainfo.video_num)){
++ GstElement * videosink = NULL;
++ GstElement * audiosink = NULL;
++ guint64 value64=0;
++
++ g_object_get( G_OBJECT(m_playbin), "video-sink", &videosink, NULL);
++ g_object_get( G_OBJECT(m_playbin), "audio-sink", &audiosink, NULL);
++
++ if ((videosink==NULL) || (audiosink==NULL)){
++ goto bail;
++ }
++
++ if (fValue>=0.0){
++ SetSinkRenderDelay(videosink, value64);
++ value64 = (guint64)(fValue*GST_SECOND);
++ SetSinkRenderDelay(audiosink, value64);
++ }else{
++ SetSinkRenderDelay(audiosink, value64);
++ value64 = (guint64)(-fValue*GST_SECOND);
++ SetSinkRenderDelay(videosink, value64);
++ }
++bail:
++ if (videosink){
++ g_object_unref(G_OBJECT(videosink));
++ }
++ if (audiosink){
++ g_object_unref(G_OBJECT(audiosink));
++ }
++ }
++}
++
++float CGstPlayer::GetAVDelay()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ return 0.0f;
++}
++
++void CGstPlayer::SetSubTitleDelay(float fValue)
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++}
++
++float CGstPlayer::GetSubTitleDelay()
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ return 0.0;
++}
++
++void CGstPlayer::SeekTime(__int64 iTime)
++{
++ GstEvent *seek_event;
++ CLog::Log(LOGNOTICE, "---[%s]---%lld", __FUNCTION__, iTime);
++
++ m_clock = iTime;
++ if (m_playbin){
++ seek_event = gst_event_new_seek(1.0, GST_FORMAT_TIME,
++ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
++ GST_SEEK_TYPE_SET, iTime*1000000,
++ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
++ gst_element_send_event(m_playbin, seek_event);
++ }
++
++ CLog::Log(LOGNOTICE, "---[%s finish]---%lld", __FUNCTION__, iTime);
++ g_infoManager.m_performingSeek = false;
++ m_callback.OnPlayBackSeek((int)iTime, 0);
++ CLog::Log(LOGNOTICE, "---[%s nretun]---%lld", __FUNCTION__, iTime);
++}
++
++// return the time in milliseconds
++__int64 CGstPlayer::GetTime()
++{
++ gint64 elapsed = 0;
++ if (m_playbin) {
++ GstFormat fmt = GST_FORMAT_TIME;
++ if (TRUE==gst_element_query_position(m_playbin, &fmt, &elapsed)){
++ m_clock = elapsed/1000000;
++ }
++ }
++ return m_clock;
++}
++
++// return length in seconds.. this should be changed to return in milleseconds throughout xbmc
++int CGstPlayer::GetTotalTime()
++{
++ int totaltime = 0;
++ if (m_playbin){
++ gint64 duration = 0;
++ GstFormat fmt = GST_FORMAT_TIME;
++ gst_element_query_duration(m_playbin, &fmt, &duration);
++ totaltime = duration/1000000000;
++ }
++ //CLog::Log(LOGNOTICE, "---[%s]--- %d", __FUNCTION__, totaltime);
++ return totaltime;
++}
++
++void CGstPlayer::SetPlaybackRate(int iSpeed, gint64 pos)
++{
++ GstEvent *event;
++ if(iSpeed > 0)
++ event = gst_event_new_seek(iSpeed, GST_FORMAT_TIME,
++ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
++ GST_SEEK_TYPE_SET, pos,
++ GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
++ else
++ event = gst_event_new_seek(iSpeed, GST_FORMAT_TIME,
++ (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
++ GST_SEEK_TYPE_SET, 0,
++ GST_SEEK_TYPE_SET, pos);
++ gst_element_send_event(m_playbin, event);
++}
++
++void CGstPlayer::ToFFRW(int iSpeed)
++{
++ gint64 elapsed = 0;
++ GstFormat fmt = GST_FORMAT_TIME;
++ CLog::Log(LOGNOTICE, "---[%s]-%d--", __FUNCTION__, iSpeed);
++ m_speed = iSpeed;
++
++ if (m_playbin){
++ if(gst_element_query_position(m_playbin, &fmt, &elapsed)) {
++ /*
++ if(iSpeed == 1)
++ g_object_set(G_OBJECT(m_playbin), "mute", FALSE, NULL);
++ else
++ g_object_set(G_OBJECT(m_playbin), "mute", TRUE, NULL);
++ */
++ SetPlaybackRate(iSpeed, elapsed);
++ m_callback.OnPlayBackSpeedChanged(iSpeed);
++ }
++ }
++}
++
++
++CStdString CGstPlayer::GetPlayerState()
++{
++ //CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ return "";
++}
++
++bool CGstPlayer::SetPlayerState(CStdString state)
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ return true;
++}
++
++bool CGstPlayer::OnAction(const CAction &action)
++{
++ //CLog::Log(LOGNOTICE, "on action id %d", action.id);
++ return false;
++}
++
++void CGstPlayer::GetVideoRect(CRect& SrcRect, CRect& DestRect)
++{
++ CLog::Log(LOGNOTICE, "---[%s]---", __FUNCTION__);
++ g_renderManager.GetVideoRect(SrcRect, DestRect);
++}
++
+diff --git a/xbmc/cores/gstplayer/GstPlayer.h b/xbmc/cores/gstplayer/GstPlayer.h
+new file mode 100644
+index 0000000..dad24a2
+--- /dev/null
++++ b/xbmc/cores/gstplayer/GstPlayer.h
+@@ -0,0 +1,176 @@
++/*
++ * Copyright (C) 2012 linaro
++ * http://www.linaro.org
++ *
++ * This Program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This Program 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with XBMC; see the file COPYING. If not, write to
++ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
++ * http://www.gnu.org/copyleft/gpl.html
++ *
++ */
++
++#pragma once
++#include "cores/IPlayer.h"
++#include "threads/Thread.h"
++#include <gst/gst.h>
++
++typedef struct{
++ gchar * codec;
++ gchar * lang;
++ guint bitrate;
++} MediaAudioInfo;
++
++typedef struct {
++ gchar * codec;
++ guint bitrate;
++} MediaVideoInfo;
++
++typedef struct{
++ bool loaded;
++ gint video_num;
++ gint audio_num;
++ gint sub_num;
++ gchar * container_format;
++ gchar * title;
++ gchar * genre;
++ gchar * artist;
++ gchar * description;
++ gchar * album;
++ gboolean seekable;
++ MediaAudioInfo * audio_info;
++ MediaVideoInfo * video_info;
++} MediaInfo;
++
++class CGstPlayer : public IPlayer, public CThread
++{
++public:
++ CGstPlayer(IPlayerCallback& callback);
++ virtual ~CGstPlayer();
++ virtual void RegisterAudioCallback(IAudioCallback* pCallback) {}
++ virtual void UnRegisterAudioCallback() {}
++ virtual bool OpenFile(const CFileItem& file, const CPlayerOptions &options);
++ virtual bool CloseFile();
++ virtual bool IsPlaying() const;
++ virtual void Pause();
++ virtual bool IsPaused() const;
++ virtual bool HasVideo() const;
++ virtual bool HasAudio() const;
++ virtual void ToggleOSD() { }; // empty
++ virtual void SwitchToNextLanguage();
++ virtual void ToggleSubtitles();
++ virtual bool CanSeek();
++ virtual void Seek(bool bPlus, bool bLargeStep);
++ virtual void SeekPercentage(float iPercent);
++ virtual float GetPercentage();
++ virtual void SetVolume(long nVolume);
++ virtual void SetDynamicRangeCompression(long drc) {}
++ virtual void SetContrast(bool bPlus) {}
++ virtual void SetBrightness(bool bPlus) {}
++ virtual void SetHue(bool bPlus) {}
++ virtual void SetSaturation(bool bPlus) {}
++ virtual void GetAudioInfo(CStdString& strAudioInfo);
++ virtual void GetVideoInfo(CStdString& strVideoInfo);
++ virtual void GetGeneralInfo( CStdString& strVideoInfo);
++ virtual void Update(bool bPauseDrawing) {}
++ virtual void SwitchToNextAudioLanguage();
++ virtual bool CanRecord() { return false; }
++ virtual bool IsRecording() { return false; }
++ virtual bool Record(bool bOnOff) { return false; }
++ virtual void SetAVDelay(float fValue = 0.0f);
++ virtual float GetAVDelay();
++ virtual bool OnAction(const CAction &action);
++ virtual void GetVideoRect(CRect& SrcRect, CRect& DestRect);
++
++ virtual void SetSubTitleDelay(float fValue = 0.0f);
++ virtual float GetSubTitleDelay();
++
++ virtual void SeekTime(__int64 iTime);
++ virtual __int64 GetTime();
++ virtual int GetTotalTime();
++ virtual void ToFFRW(int iSpeed);
++ virtual void DoAudioWork() {}
++
++ virtual CStdString GetPlayerState();
++ virtual bool SetPlayerState(CStdString state);
++
++
++ virtual int GetCacheLevel() const ;
++ virtual bool IsCaching() const { return m_buffering == TRUE; }
++ virtual bool LoadMediaInfo();
++
++ virtual int GetAudioStreamCount();
++ virtual void GetAudioStreamName(int iStream, CStdString &strStreamName);
++ virtual void SetAudioStream(int iStream);
++ virtual int GetAudioStream();
++
++
++private:
++ virtual void Process();
++ bool CreatePlayBin();
++ bool DestroyPlayBin();
++ void SetPlaybackRate(int iSpeed, gint64 pos);
++ CStdString ParseAndCorrectUrl(CURL &url);
++ void ResetUrlInfo();
++ void SetSinkRenderDelay(GstElement * ele, guint64 renderDelay);
++ void CleanMediaInfo();
++ int OutputPicture(GstBuffer * gstbuffer);
++ bool SetAndWaitPlaybinState(GstState newstate, int timeout);
++
++ CFileItem m_item;
++
++ CRect m_srcRect;
++ CRect m_destRect;
++ static void OnDecodedBuffer(GstElement *appsink, void *data);
++
++ bool m_buffering;
++ gint m_cache_level;
++
++ bool m_paused;
++ bool m_quit_msg;
++ __int64 m_clock;
++ DWORD m_lastTime;
++ bool m_voutput_init;
++ int m_speed;
++ bool m_cancelled;
++ gint64 m_starttime;
++ CEvent m_ready;
++
++ MediaInfo m_mediainfo;
++ GstBus *m_bus;
++ GstElement *m_playbin;
++
++ int m_file_cnt;
++
++ int m_audio_current;
++ int m_video_current;
++
++ struct SOutputConfiguration
++ {
++ unsigned int width;
++ unsigned int height;
++ unsigned int dwidth;
++ unsigned int dheight;
++ unsigned int color_format;
++ unsigned int extended_format;
++ unsigned int color_matrix : 4;
++ unsigned int color_range : 1;
++ unsigned int chroma_position;
++ unsigned int color_primaries;
++ unsigned int color_transfer;
++ double framerate;
++ } m_output;
++
++ CStdString m_username;
++ CStdString m_password;
++ std::map<CStdString, CStdString> m_requestheaders;
++};
+diff --git a/xbmc/cores/gstplayer/Makefile.in b/xbmc/cores/gstplayer/Makefile.in
+new file mode 100644
+index 0000000..1588fd0
+--- /dev/null
++++ b/xbmc/cores/gstplayer/Makefile.in
+@@ -0,0 +1,12 @@
++INCLUDES=-I../../.. -I. -I.. -I../../ -I../../linux -I../../utils -I../../../guilib -I../../lib -I../dvdplayer/Codecs/ffmpeg
++
++
++CXXFLAGS+=-D__STDC_FORMAT_MACROS
++
++SRCS= GstPlayer.cpp
++
++LIB= GstPlayer.a
++
++include ../../../Makefile.include
++-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
++
+
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/404-2c938f75ca4955de939f7cfe1474cdbb76efd7a4.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/404-2c938f75ca4955de939f7cfe1474cdbb76efd7a4.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-diff --git a/xbmc/cores/playercorefactory/PlayerCoreConfig.h b/xbmc/cores/playercorefactory/PlayerCoreConfig.h
-index b4d741e..0665679 100644
---- a/xbmc/cores/playercorefactory/PlayerCoreConfig.h
-+++ b/xbmc/cores/playercorefactory/PlayerCoreConfig.h
-@@ -24,6 +24,10 @@
- #include "cores/IPlayer.h"
- #include "PlayerCoreFactory.h"
- #include "cores/dvdplayer/DVDPlayer.h"
-+#if HAVE_LIBGSTREAMER
-+#include "cores/gstplayer/GstPlayer.h"
-+#endif
-+
- #include "cores/paplayer/PAPlayer.h"
- #include "cores/ExternalPlayer/ExternalPlayer.h"
- #include "utils/log.h"
-@@ -72,6 +76,9 @@ class CPlayerCoreConfig
- {
- case EPC_MPLAYER:
- case EPC_DVDPLAYER: pPlayer = new CDVDPlayer(callback); break;
-+#if HAVE_LIBGSTREAMER
-+ case EPC_GSTPLAYER: pPlayer = new CGstPlayer(callback); break;
-+#endif
- case EPC_PAPLAYER: pPlayer = new PAPlayer(callback); break;
- case EPC_EXTPLAYER: pPlayer = new CExternalPlayer(callback); break;
- default: return NULL;
-diff --git a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
-index 3aaf546..c1e28d1 100644
---- a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
-+++ b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
-@@ -273,8 +273,11 @@ bool CPlayerCoreFactory::LoadConfiguration(TiXmlElement* pConfig, bool clear)
- s_vecCoreConfigs.push_back(dvdplayer);
-
- // Don't remove this, its a placeholder for the old MPlayer core, it would break scripts
-- CPlayerCoreConfig* mplayer = new CPlayerCoreConfig("oldmplayercore", EPC_DVDPLAYER, NULL);
-- s_vecCoreConfigs.push_back(mplayer);
-+
-+#if HAVE_LIBGSTREAMER
-+ CPlayerCoreConfig* gstplayer = new CPlayerCoreConfig("GstPlayer", EPC_GSTPLAYER, NULL);
-+ s_vecCoreConfigs.push_back(gstplayer);
-+#endif
-
- CPlayerCoreConfig* paplayer = new CPlayerCoreConfig("PAPlayer", EPC_PAPLAYER, NULL);
- paplayer->m_bPlaysAudio = true;
-@@ -304,6 +307,9 @@ bool CPlayerCoreFactory::LoadConfiguration(TiXmlElement* pConfig, bool clear)
-
- EPLAYERCORES eCore = EPC_NONE;
- if (type == "dvdplayer" || type == "mplayer") eCore = EPC_DVDPLAYER;
-+#if HAVE_LIBGSTREAMER
-+ if (type == "gstplayer") eCore = EPC_GSTPLAYER;
-+#endif
- if (type == "paplayer" ) eCore = EPC_PAPLAYER;
- if (type == "externalplayer" ) eCore = EPC_EXTPLAYER;
-
-diff --git a/xbmc/cores/playercorefactory/PlayerCoreFactory.h b/xbmc/cores/playercorefactory/PlayerCoreFactory.h
-index 04ac1dc..3c9f03b 100644
---- a/xbmc/cores/playercorefactory/PlayerCoreFactory.h
-+++ b/xbmc/cores/playercorefactory/PlayerCoreFactory.h
-@@ -35,6 +35,9 @@ enum EPLAYERCORES
- {
- EPC_NONE,
- EPC_DVDPLAYER,
-+#if HAVE_LIBGSTREAMER
-+ EPC_GSTPLAYER,
-+#endif
- EPC_MPLAYER,
- EPC_PAPLAYER,
- EPC_EXTPLAYER
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/404_gstplayerCoreFactory.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/404_gstplayerCoreFactory.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,63 @@
+diff --git a/xbmc/cores/playercorefactory/PlayerCoreConfig.h b/xbmc/cores/playercorefactory/PlayerCoreConfig.h
+index a12cc90..26f327a 100644
+--- a/xbmc/cores/playercorefactory/PlayerCoreConfig.h
++++ b/xbmc/cores/playercorefactory/PlayerCoreConfig.h
+@@ -30,6 +30,9 @@
+ #if defined(HAS_OMXPLAYER)
+ #include "cores/omxplayer/OMXPlayer.h"
+ #endif
++#if defined(HAS_GSTPLAYER)
++#include "cores/gstplayer/GstPlayer.h"
++#endif
+ #include "cores/ExternalPlayer/ExternalPlayer.h"
+ #include "utils/log.h"
+
+@@ -97,6 +100,9 @@ public:
+ #if defined(HAS_OMXPLAYER)
+ case EPC_OMXPLAYER: pPlayer = new COMXPlayer(callback); break;
+ #endif
++#if defined(HAS_GSTPLAYER)
++ case EPC_GSTPLAYER: pPlayer = new CGstPlayer(callback); break;
++#endif
+ default: return NULL;
+ }
+
+diff --git a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
+index 5f0eaa2..243627b 100644
+--- a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
++++ b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
+@@ -293,6 +293,12 @@ bool CPlayerCoreFactory::LoadConfiguration(TiXmlElement* pConfig, bool clear)
+ s_vecCoreConfigs.push_back(omxplayer);
+ #endif
+
++#if defined(HAS_GSTPLAYER)
++ CPlayerCoreConfig* gstplayer = new CPlayerCoreConfig("GstPlayer", EPC_GSTPLAYER, NULL);
++ gstplayer->m_bPlaysVideo = true;
++ s_vecCoreConfigs.push_back(gstplayer);
++#endif
++
+ for(std::vector<CPlayerSelectionRule *>::iterator it = s_vecCoreSelectionRules.begin(); it != s_vecCoreSelectionRules.end(); it++)
+ delete *it;
+ s_vecCoreSelectionRules.clear();
+@@ -319,6 +325,7 @@ bool CPlayerCoreFactory::LoadConfiguration(TiXmlElement* pConfig, bool clear)
+ if (type == "dvdplayer" || type == "mplayer") eCore = EPC_DVDPLAYER;
+ if (type == "paplayer" ) eCore = EPC_PAPLAYER;
+ if (type == "externalplayer" ) eCore = EPC_EXTPLAYER;
++ if (type == "gstplayer") eCore = EPC_GSTPLAYER;
+
+ if (eCore != EPC_NONE)
+ {
+diff --git a/xbmc/cores/playercorefactory/PlayerCoreFactory.h b/xbmc/cores/playercorefactory/PlayerCoreFactory.h
+index 07fecb0..a895bc2 100644
+--- a/xbmc/cores/playercorefactory/PlayerCoreFactory.h
++++ b/xbmc/cores/playercorefactory/PlayerCoreFactory.h
+@@ -42,6 +42,9 @@ enum EPLAYERCORES
+ #if defined(HAS_OMXPLAYER)
+ EPC_OMXPLAYER,
+ #endif
++#if defined(HAS_GSTPLAYER)
++ EPC_GSTPLAYER,
++#endif
+ EPC_EXTPLAYER
+ };
+
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/405_53f3282afbea5dee285091a4cf27bc0645cc6543.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/405_53f3282afbea5dee285091a4cf27bc0645cc6543.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
-index 17dc021..d1540a6 100644
---- a/xbmc/settings/AdvancedSettings.cpp
-+++ b/xbmc/settings/AdvancedSettings.cpp
-@@ -83,7 +83,11 @@ void CAdvancedSettings::Initialize()
- m_videoBlackBarColour = 0;
- m_videoPPFFmpegDeint = "linblenddeint";
- m_videoPPFFmpegPostProc = "ha:128:7,va,dr";
-+#if HAVE_LIBGSTREAMER
-+ m_videoDefaultPlayer = "gstplayer";
-+#else
- m_videoDefaultPlayer = "dvdplayer";
-+#endif
- m_videoDefaultDVDPlayer = "dvdplayer";
- m_videoIgnoreSecondsAtStart = 3*60;
- m_videoIgnorePercentAtEnd = 8.0f;
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/405_gstplayerDefaultPlayer.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/405_gstplayerDefaultPlayer.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,17 @@
+diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
+index fb2e64d..b67419c 100644
+--- a/xbmc/settings/AdvancedSettings.cpp
++++ b/xbmc/settings/AdvancedSettings.cpp
+@@ -93,7 +93,11 @@ void CAdvancedSettings::Initialize()
+ m_videoBlackBarColour = 0;
+ m_videoPPFFmpegDeint = "linblenddeint";
+ m_videoPPFFmpegPostProc = "ha:128:7,va,dr";
+- m_videoDefaultPlayer = "dvdplayer";
++ #if defined(HAS_GSTPLAYER)
++ m_videoDefaultPlayer = "gstplayer";
++ #else
++ m_videoDefaultPlayer = "dvdplayer";
++ #endif
+ m_videoDefaultDVDPlayer = "dvdplayer";
+ m_videoIgnoreSecondsAtStart = 3*60;
+ m_videoIgnorePercentAtEnd = 8.0f;
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/406_0d5fda37b52505a35b10026d67528d28960cc7b5.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/406_0d5fda37b52505a35b10026d67528d28960cc7b5.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-index 6af7ebf..d27ddd1 100644
---- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-@@ -331,7 +331,7 @@ void CLinuxRendererGLES::LoadPlane( YUVPLANE& plane, int type, unsigned flipinde
- // OpenGL ES does not support strided texture input. Make a copy without stride
- if(stride != width)
- {
-- pixelVector = (char *)malloc(width * height * width);
-+ pixelVector = (char *)malloc(width * height);
-
- const char *src = (const char *)data;
- char *dst = pixelVector;
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/407_862359516e9604fc6345e129140b5723fe5b480c.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/407_862359516e9604fc6345e129140b5723fe5b480c.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
-index b917860..af12cbd 100644
---- a/xbmc/cores/VideoRenderers/RenderManager.cpp
-+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
-@@ -514,23 +514,26 @@ void CXBMCRenderManager::RemoveCapture(CRenderCapture* capture)
-
- void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/)
- {
-- if(timestamp - GetPresentTime() > MAXPRESENTDELAY)
-- timestamp = GetPresentTime() + MAXPRESENTDELAY;
-+ if (timestamp != 0.0)
-+ {
-+ if(timestamp - GetPresentTime() > MAXPRESENTDELAY)
-+ timestamp = GetPresentTime() + MAXPRESENTDELAY;
-
-- /* can't flip, untill timestamp */
-- if(!g_graphicsContext.IsFullScreenVideo())
-- WaitPresentTime(timestamp);
-+ /* can't flip, untill timestamp */
-+ if(!g_graphicsContext.IsFullScreenVideo())
-+ WaitPresentTime(timestamp);
-
-- /* make sure any queued frame was fully presented */
-- double timeout = m_presenttime + 1.0;
-- while(m_presentstep != PRESENT_IDLE && !bStop)
-- {
-- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
-+ /* make sure any queued frame was fully presented */
-+ double timeout = m_presenttime + 1.0;
-+ while(m_presentstep != PRESENT_IDLE && !bStop)
- {
-- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame");
-- return;
-- }
-- };
-+ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
-+ {
-+ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame");
-+ return;
-+ }
-+ };
-+ }
-
- if(bStop)
- return;
-@@ -582,14 +585,18 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
- }
-
- g_application.NewFrame();
-- /* wait untill render thread have flipped buffers */
-- timeout = m_presenttime + 1.0;
-- while(m_presentstep == PRESENT_FLIP && !bStop)
-+
-+ if (timestamp != 0.0)
- {
-- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
-+ /* wait untill render thread have flipped buffers */
-+ double timeout = m_presenttime + 1.0;
-+ while(m_presentstep == PRESENT_FLIP && !bStop)
- {
-- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete");
-- return;
-+ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
-+ {
-+ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete");
-+ return;
-+ }
- }
- }
- }
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/407_RenderManager.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/407_RenderManager.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,69 @@
+diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
+index d22287d..40b9184 100644
+--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
+@@ -536,23 +536,26 @@ void CXBMCRenderManager::SetViewMode(int iViewMode)
+
+ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/)
+ {
+- if(timestamp - GetPresentTime() > MAXPRESENTDELAY)
+- timestamp = GetPresentTime() + MAXPRESENTDELAY;
++ if (timestamp != 0.0)
++ {
++ if(timestamp - GetPresentTime() > MAXPRESENTDELAY)
++ timestamp = GetPresentTime() + MAXPRESENTDELAY;
+
+- /* can't flip, untill timestamp */
+- if(!g_graphicsContext.IsFullScreenVideo())
+- WaitPresentTime(timestamp);
++ /* can't flip, untill timestamp */
++ if(!g_graphicsContext.IsFullScreenVideo())
++ WaitPresentTime(timestamp);
+
+- /* make sure any queued frame was fully presented */
+- double timeout = m_presenttime + 1.0;
+- while(m_presentstep != PRESENT_IDLE && !bStop)
+- {
+- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
++ /* make sure any queued frame was fully presented */
++ double timeout = m_presenttime + 1.0;
++ while(m_presentstep != PRESENT_IDLE && !bStop)
+ {
+- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame");
+- return;
+- }
+- };
++ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
++ {
++ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for previous frame");
++ return;
++ }
++ };
++ }
+
+ if(bStop)
+ return;
+@@ -604,14 +607,17 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
+ }
+
+ g_application.NewFrame();
+- /* wait untill render thread have flipped buffers */
+- timeout = m_presenttime + 1.0;
+- while(m_presentstep == PRESENT_FLIP && !bStop)
++ if (timestamp != 0.0)
+ {
+- if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
++ /* wait untill render thread have flipped buffers */
++ timeout = m_presenttime + 1.0;
++ while(m_presentstep == PRESENT_FLIP && !bStop)
+ {
+- CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete");
+- return;
++ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
++ {
++ CLog::Log(LOGWARNING, "CRenderManager::FlipPage - timeout waiting for flip to complete");
++ return;
++ }
+ }
+ }
+ }
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/408_2604f6bdee6898e39f9541e6dda06a8d9a7f6b4f.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/408_2604f6bdee6898e39f9541e6dda06a8d9a7f6b4f.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,852 +0,0 @@
-diff --git a/system/shaders/yuv2rgb_egl_image_external_gles.glsl b/system/shaders/yuv2rgb_egl_image_external_gles.glsl
-new file mode 100644
-index 0000000..6914f88
---- /dev/null
-+++ b/system/shaders/yuv2rgb_egl_image_external_gles.glsl
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright (C) 2010 Team XBMC
-+ * http://www.xbmc.org
-+ *
-+ * This Program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This Program 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with XBMC; see the file COPYING. If not, write to
-+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-+ * http://www.gnu.org/copyleft/gpl.html
-+ *
-+ */
-+
-+/*
-+ * The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which
-+ * is defined by the GL_OES_EGL_image_external OpenGL ES extension. This
-+ * limits how the texture may be used. Each time the texture is bound it
-+ * must be bound to the GL_TEXTURE_EXTERNAL_OES target rather than the
-+ * GL_TEXTURE_2D target. Additionally, any OpenGL ES 2.0 shader that samples
-+ * from the texture must declare its use of this extension using, for example,
-+ * an "#extension GL_OES_EGL_image_external : require" directive. Such shaders
-+ * must also access the texture using the samplerExternalOES GLSL sampler type.
-+ */
-+
-+#extension GL_OES_EGL_image_external : require
-+
-+precision mediump float;
-+
-+uniform samplerExternalOES m_samp;
-+varying vec2 m_cord;
-+uniform float m_alpha;
-+
-+void main()
-+{
-+ vec4 rgb = texture2D(m_samp, m_cord);
-+ rgb.a = m_alpha;
-+ gl_FragColor = rgb;
-+}
-diff --git a/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl b/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl
-new file mode 100644
-index 0000000..c3f1f14
---- /dev/null
-+++ b/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl
-@@ -0,0 +1,33 @@
-+/*
-+ * Copyright (C) 2010 Team XBMC
-+ * http://www.xbmc.org
-+ *
-+ * This Program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This Program 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with XBMC; see the file COPYING. If not, write to
-+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-+ * http://www.gnu.org/copyleft/gpl.html
-+ *
-+ */
-+
-+attribute vec4 m_attrpos;
-+attribute vec2 m_attrcord;
-+varying vec2 m_cord;
-+uniform mat4 m_proj;
-+uniform mat4 m_model;
-+
-+void main ()
-+{
-+ mat4 mvp = m_proj * m_model;
-+ gl_Position = mvp * m_attrpos;
-+ m_cord = m_attrcord;
-+}
-diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h
-index af51852..7373a69 100644
---- a/xbmc/cores/VideoRenderers/BaseRenderer.h
-+++ b/xbmc/cores/VideoRenderers/BaseRenderer.h
-@@ -32,8 +32,9 @@
- BYTE * plane[MAX_PLANES];
- int planesize[MAX_PLANES];
- unsigned stride[MAX_PLANES];
-- unsigned width;
-- unsigned height;
-+ unsigned cropX, cropY; /* crop position */
-+ unsigned cropWidth, cropHeight; /* crop dimensions */
-+ unsigned width, height; /* original dimensions */
- unsigned flags;
-
- unsigned cshift_x; /* this is the chroma shift used */
-diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-index d27ddd1..498c63b 100644
---- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
-@@ -55,6 +55,9 @@
- #include "osx/DarwinUtils.h"
- #endif
-
-+
-+#include <EGL/eglext.h>
-+
- using namespace Shaders;
-
- CLinuxRendererGLES::YUVBUFFER::YUVBUFFER()
-@@ -70,7 +73,7 @@
-
- CLinuxRendererGLES::CLinuxRendererGLES()
- {
-- m_textureTarget = GL_TEXTURE_2D;
-+ memset(m_buffers, 0, sizeof(m_buffers));
- for (int i = 0; i < NUM_BUFFERS; i++)
- {
- m_eventTexturesDone[i] = new CEvent(false,true);
-@@ -105,13 +108,30 @@
-
- m_dllSwScale = new DllSwScale;
- m_sw_context = NULL;
-+
-+ glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)
-+ eglGetProcAddress("glEGLImageTargetTexture2DOES");
-+
-+ m_textureTarget = GL_TEXTURE_2D;
-+}
-+
-+void CLinuxRendererGLES::UnRefBuf(int index)
-+{
-+ YUVBUFFER &buf = m_buffers[index];
-+ if (buf.eglImageHandle)
-+ {
-+ buf.eglImageHandle->UnRef();
-+ buf.eglImageHandle = NULL;
-+ }
- }
-
- CLinuxRendererGLES::~CLinuxRendererGLES()
- {
- UnInit();
-- for (int i = 0; i < NUM_BUFFERS; i++)
-+ for (int i = 0; i < NUM_BUFFERS; i++) {
-+ UnRefBuf(i);
- delete m_eventTexturesDone[i];
-+ }
-
- if (m_rgbBuffer != NULL) {
- delete [] m_rgbBuffer;
-@@ -130,7 +150,7 @@
-
- void CLinuxRendererGLES::ManageTextures()
- {
-- m_NumYV12Buffers = 2;
-+ m_NumYV12Buffers = NUM_BUFFERS;
- //m_iYV12RenderBuffer = 0;
- return;
- }
-@@ -264,17 +284,36 @@ void CLinuxRendererGLES::CalculateTextureSourceRects(int source, int num_planes)
- YUVBUFFER& buf = m_buffers[source];
- YV12Image* im = &buf.image;
- YUVFIELDS& fields = buf.fields;
-+ int cropX, cropY, cropWidth, cropHeight;
-+
-+ cropX = im->cropX;
-+ cropY = im->cropY;
-+ cropWidth = im->cropWidth;
-+ cropHeight = im->cropHeight;
-+
-+ //CLog::Log(LOGDEBUG, "GL: crop: %d,%d - %dx%d", cropX, cropY, cropWidth, cropHeight);
-+
-+ /* if we have bogus crop coords, fallback to no cropping */
-+ if ((cropWidth == 0) || (cropHeight == 0))
-+ {
-+ cropX = cropY = 0;
-+ cropWidth = m_sourceWidth;
-+ cropHeight = m_sourceHeight;
-+ }
-
- // calculate the source rectangle
-- for(int field = 0; field < 3; field++)
-+ for(int field = 0; field < (buf.eglImageHandle ? 1 : 3); field++)
- {
- for(int plane = 0; plane < num_planes; plane++)
- {
- YUVPLANE& p = fields[field][plane];
-
-- p.rect = m_sourceRect;
-- p.width = im->width;
-- p.height = im->height;
-+ p.rect.x1 = cropX;
-+ p.rect.y1 = cropY;
-+ p.rect.x2 = cropX + cropWidth;
-+ p.rect.y2 = cropY + cropHeight;
-+ p.width = cropWidth;
-+ p.height = cropHeight;
-
- if(field != FIELD_FULL)
- {
-@@ -305,7 +344,8 @@ void CLinuxRendererGLES::CalculateTextureSourceRects(int source, int num_planes)
- p.rect.y2 /= 1 << im->cshift_y;
- }
-
-- if (m_textureTarget == GL_TEXTURE_2D)
-+ if ((m_textureTarget == GL_TEXTURE_2D) ||
-+ (m_textureTarget == GL_TEXTURE_EXTERNAL_OES))
- {
- p.height /= p.texheight;
- p.rect.y1 /= p.texheight;
-@@ -508,7 +548,7 @@ unsigned int CLinuxRendererGLES::PreInit()
- m_resolution = RES_DESKTOP;
-
- m_iYV12RenderBuffer = 0;
-- m_NumYV12Buffers = 2;
-+ m_NumYV12Buffers = NUM_BUFFERS;
-
- // setup the background colour
- m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff;
-@@ -631,9 +671,17 @@ void CLinuxRendererGLES::LoadShaders(int field)
- // Try GLSL shaders if supported and user requested auto or GLSL.
- if (glCreateProgram)
- {
-- // create regular progressive scan shader
-- m_pYUVShader = new YUV2RGBProgressiveShader(false, m_iFlags);
-- CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
-+ if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_EGLIMG)
-+ {
-+ m_pYUVShader = new EGLImageExternalShader();
-+ CLog::Log(LOGNOTICE, "GL: Selecting eglImage shader");
-+ }
-+ else
-+ {
-+ // create regular progressive scan shader
-+ m_pYUVShader = new YUV2RGBProgressiveShader(false, m_iFlags);
-+ CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
-+ }
-
- if (m_pYUVShader && m_pYUVShader->CompileAndLink())
- {
-@@ -682,6 +730,12 @@ void CLinuxRendererGLES::LoadShaders(int field)
- m_textureCreate = &CLinuxRendererGLES::CreateBYPASSTexture;
- m_textureDelete = &CLinuxRendererGLES::DeleteBYPASSTexture;
- }
-+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_EGLIMG)
-+ {
-+ m_textureUpload = &CLinuxRendererGLES::UploadEGLIMAGETexture;
-+ m_textureCreate = &CLinuxRendererGLES::CreateEGLIMAGETexture;
-+ m_textureDelete = &CLinuxRendererGLES::DeleteEGLIMAGETexture;
-+ }
- else
- {
- // default to YV12 texture handlers
-@@ -778,8 +832,9 @@ void CLinuxRendererGLES::Render(DWORD flags, int index)
-
- void CLinuxRendererGLES::RenderSinglePass(int index, int field)
- {
-- YV12Image &im = m_buffers[index].image;
-- YUVFIELDS &fields = m_buffers[index].fields;
-+ YUVBUFFER &buf = m_buffers[index];
-+ YV12Image &im = buf.image;
-+ YUVFIELDS &fields = buf.fields;
- YUVPLANES &planes = fields[field];
-
- if (m_reloadShaders)
-@@ -790,20 +845,29 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
-
- glDisable(GL_DEPTH_TEST);
-
-+ /* note: with eglimageexternal, we have just a single YUV texture,
-+ * rather than one texture per plane. So what is referred below
-+ * as the 'Y' texture is actually the 'YUV' texture, and 'U' & 'V'
-+ * textures are unused.
-+ */
-+
- // Y
- glActiveTexture(GL_TEXTURE0);
- glEnable(m_textureTarget);
- glBindTexture(m_textureTarget, planes[0].id);
-
-- // U
-- glActiveTexture(GL_TEXTURE1);
-- glEnable(m_textureTarget);
-- glBindTexture(m_textureTarget, planes[1].id);
-+ if (!buf.eglImageHandle)
-+ {
-+ // U
-+ glActiveTexture(GL_TEXTURE1);
-+ glEnable(m_textureTarget);
-+ glBindTexture(m_textureTarget, planes[1].id);
-
-- // V
-- glActiveTexture(GL_TEXTURE2);
-- glEnable(m_textureTarget);
-- glBindTexture(m_textureTarget, planes[2].id);
-+ // V
-+ glActiveTexture(GL_TEXTURE2);
-+ glEnable(m_textureTarget);
-+ glBindTexture(m_textureTarget, planes[2].id);
-+ }
-
- glActiveTexture(GL_TEXTURE0);
- VerifyGLState();
-@@ -831,13 +895,19 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
-
- glVertexAttribPointer(vertLoc, 3, GL_FLOAT, 0, 0, m_vert);
- glVertexAttribPointer(Yloc, 2, GL_FLOAT, 0, 0, m_tex[0]);
-- glVertexAttribPointer(Uloc, 2, GL_FLOAT, 0, 0, m_tex[1]);
-- glVertexAttribPointer(Vloc, 2, GL_FLOAT, 0, 0, m_tex[2]);
-+ if (!buf.eglImageHandle)
-+ {
-+ glVertexAttribPointer(Uloc, 2, GL_FLOAT, 0, 0, m_tex[1]);
-+ glVertexAttribPointer(Vloc, 2, GL_FLOAT, 0, 0, m_tex[2]);
-+ }
-
- glEnableVertexAttribArray(vertLoc);
- glEnableVertexAttribArray(Yloc);
-- glEnableVertexAttribArray(Uloc);
-- glEnableVertexAttribArray(Vloc);
-+ if (!buf.eglImageHandle)
-+ {
-+ glEnableVertexAttribArray(Uloc);
-+ glEnableVertexAttribArray(Vloc);
-+ }
-
- // Setup vertex position values
- m_vert[0][0] = m_vert[3][0] = m_destRect.x1;
-@@ -847,7 +917,7 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
- m_vert[0][2] = m_vert[1][2] = m_vert[2][2] = m_vert[3][2] = 0.0f;
-
- // Setup texture coordinates
-- for (int i=0; i<3; i++)
-+ for (int i = 0; i < (buf.eglImageHandle ? 1 : 3); i++)
- {
- m_tex[i][0][0] = m_tex[i][3][0] = planes[i].rect.x1;
- m_tex[i][0][1] = m_tex[i][1][1] = planes[i].rect.y1;
-@@ -864,14 +934,17 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
-
- glDisableVertexAttribArray(vertLoc);
- glDisableVertexAttribArray(Yloc);
-- glDisableVertexAttribArray(Uloc);
-- glDisableVertexAttribArray(Vloc);
-+ if (!buf.eglImageHandle)
-+ {
-+ glDisableVertexAttribArray(Uloc);
-+ glDisableVertexAttribArray(Vloc);
-
-- glActiveTexture(GL_TEXTURE1);
-- glDisable(m_textureTarget);
-+ glActiveTexture(GL_TEXTURE1);
-+ glDisable(m_textureTarget);
-
-- glActiveTexture(GL_TEXTURE2);
-- glDisable(m_textureTarget);
-+ glActiveTexture(GL_TEXTURE2);
-+ glDisable(m_textureTarget);
-+ }
-
- glActiveTexture(GL_TEXTURE0);
- glDisable(m_textureTarget);
-@@ -1307,6 +1380,97 @@ bool CLinuxRendererGLES::RenderCapture(CRenderCapture* capture)
- }
-
- //********************************************************************************************************
-+// eglImage Texture creation, deletion, copying + clearing
-+//********************************************************************************************************
-+
-+void CLinuxRendererGLES::UploadEGLIMAGETexture(int index)
-+{
-+ YUVBUFFER &buf = m_buffers[index];
-+ YV12Image &im = buf.image;
-+ YUVFIELDS &fields = buf.fields;
-+ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
-+
-+#if defined(HAVE_LIBOPENMAX)
-+ if (!(im.flags&IMAGE_FLAG_READY) || buf.openMaxBuffer)
-+#else
-+ if (!(im.flags&IMAGE_FLAG_READY))
-+#endif
-+ {
-+ m_eventTexturesDone[index]->Set();
-+ return;
-+ }
-+
-+ glEnable(m_textureTarget);
-+ glBindTexture(m_textureTarget, plane.id);
-+ glEGLImageTargetTexture2DOES(m_textureTarget, buf.eglImageHandle->Get());
-+
-+ VerifyGLState();
-+
-+ m_eventTexturesDone[index]->Set();
-+
-+ CalculateTextureSourceRects(index, 1);
-+
-+ glDisable(m_textureTarget);
-+}
-+
-+void CLinuxRendererGLES::DeleteEGLIMAGETexture(int index)
-+{
-+ YUVBUFFER &buf = m_buffers[index];
-+ YUVFIELDS &fields = buf.fields;
-+ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
-+
-+ if (plane.id == 0)
-+ return;
-+
-+ /* finish up all textures, and delete them */
-+ g_graphicsContext.BeginPaint(); //FIXME
-+
-+ if (glIsTexture(plane.id))
-+ glDeleteTextures(1, &plane.id);
-+
-+ plane.id = 0;
-+
-+ UnRefBuf(index);
-+
-+ g_graphicsContext.EndPaint();
-+}
-+
-+bool CLinuxRendererGLES::CreateEGLIMAGETexture(int index)
-+{
-+ YUVBUFFER &buf = m_buffers[index];
-+ YUVFIELDS &fields = buf.fields;
-+ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
-+
-+ /* only use single-pass for egl-image-external */
-+ m_renderQuality = RQ_SINGLEPASS;
-+ m_textureTarget = GL_TEXTURE_EXTERNAL_OES;
-+
-+ DeleteEGLIMAGETexture(index);
-+
-+ glEnable(m_textureTarget);
-+
-+ if (!glIsTexture(plane.id))
-+ {
-+ glGenTextures(1, &plane.id);
-+ VerifyGLState();
-+ }
-+
-+ glBindTexture(m_textureTarget, plane.id);
-+
-+ // glTexImage2D(m_textureTarget, 0, GL_RGBA, plane.texwidth, plane.texheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-+
-+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-+ VerifyGLState();
-+
-+ m_eventTexturesDone[index]->Set();
-+
-+ return true;
-+}
-+
-+//********************************************************************************************************
- // YV12 Texture creation, deletion, copying + clearing
- //********************************************************************************************************
- void CLinuxRendererGLES::UploadYV12Texture(int source)
-@@ -1554,7 +1718,7 @@ bool CLinuxRendererGLES::CreateYV12Texture(int index)
- }
- }
-
-- for(int p = 0; p < 3; p++)
-+ for(int p = 0; p < MAX_PLANES; p++)
- {
- YUVPLANE &plane = planes[p];
- if (plane.texwidth * plane.texheight == 0)
-@@ -1747,7 +1911,8 @@ void CLinuxRendererGLES::SetTextureFilter(GLenum method)
- {
- for (int i = 0 ; i<m_NumYV12Buffers ; i++)
- {
-- YUVFIELDS &fields = m_buffers[i].fields;
-+ YUVBUFFER &buf = m_buffers[i];
-+ YUVFIELDS &fields = buf.fields;
-
- for (int f = FIELD_FULL; f<=FIELD_BOT ; f++)
- {
-@@ -1756,7 +1921,7 @@ void CLinuxRendererGLES::SetTextureFilter(GLenum method)
- glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, method);
- VerifyGLState();
-
-- if (!(m_renderMethod & RENDER_SW))
-+ if (!((m_renderMethod & RENDER_SW) || buf.eglImageHandle))
- {
- glBindTexture(m_textureTarget, fields[f][1].id);
- glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, method);
-@@ -1884,5 +2049,43 @@ void CLinuxRendererGLES::AddProcessor(CDVDVideoCodecVideoToolBox* vtb, DVDVideoP
- }
- #endif
-
-+/* for decoders using eglImage:
-+ */
-+void CLinuxRendererGLES::AddProcessor(DVDVideoPicture *picture)
-+{
-+ int index = NextYV12Texture();
-+ YUVBUFFER &buf = m_buffers[index];
-+ YV12Image &im = buf.image;
-+ YUVFIELDS &fields = buf.fields;
-+ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
-+
-+ UnRefBuf(index);
-+
-+ im.cropX = picture->iDisplayX;
-+ im.cropY = picture->iDisplayY;
-+ im.cropHeight = picture->iDisplayHeight;
-+ im.cropWidth = picture->iDisplayWidth;
-+ im.width = m_sourceWidth;
-+ im.height = m_sourceHeight;
-+ im.cshift_x = 1;
-+ im.cshift_y = 1;
-+ buf.pts = picture->pts;
-+ buf.eglImageHandle = picture->eglImageHandle->Ref();
-+
-+ plane.texwidth = im.width;
-+ plane.texheight = im.height;
-+
-+ if(m_renderMethod & RENDER_POT)
-+ {
-+ plane.texwidth = NP2(plane.texwidth);
-+ plane.texheight = NP2(plane.texheight);
-+ }
-+
-+ // some sanity checking for now.. I plan to move the eglImage related
-+ // stuff into the union, but need to be sure that no one is still using
-+ // the data/iLineSize fields..
-+ if (picture->data[0] || picture->iLineSize[0])
-+ printf("warning: data/iLineSize is not zero!\n");
-+}
-
- #endif
-diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
-index 3c7852a..5b74f30 100644
---- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
-+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
-@@ -24,6 +24,11 @@
-
- #if HAS_GLES == 2
-
-+#include <GLES2/gl2.h>
-+#include <GLES2/gl2ext.h>
-+#include <EGL/egl.h>
-+#include <EGL/eglext.h>
-+
- #include "xbmc/guilib/FrameBufferObject.h"
- #include "xbmc/guilib/Shader.h"
- #include "settings/VideoSettings.h"
-@@ -39,7 +44,7 @@
- namespace Shaders { class BaseVideoFilterShader; }
- class COpenMaxVideo;
-
--#define NUM_BUFFERS 3
-+#define NUM_BUFFERS 5
-
-
- #undef ALIGN
-@@ -160,6 +165,9 @@ class CLinuxRendererGLES : public CBaseRenderer
- #ifdef HAVE_VIDEOTOOLBOXDECODER
- virtual void AddProcessor(CDVDVideoCodecVideoToolBox* vtb, DVDVideoPicture *picture);
- #endif
-+ /* for eglImage case: */
-+ void AddProcessor(DVDVideoPicture *picture);
-+
- protected:
- virtual void Render(DWORD flags, int index);
-
-@@ -169,6 +177,7 @@ class CLinuxRendererGLES : public CBaseRenderer
- virtual void LoadShaders(int field=FIELD_FULL);
- void SetTextureFilter(GLenum method);
- void UpdateVideoFilter();
-+ void UnRefBuf(int index);
-
- // textures
- void (CLinuxRendererGLES::*m_textureUpload)(int index);
-@@ -179,6 +188,10 @@ class CLinuxRendererGLES : public CBaseRenderer
- void DeleteYV12Texture(int index);
- bool CreateYV12Texture(int index);
-
-+ void UploadEGLIMAGETexture(int index);
-+ void DeleteEGLIMAGETexture(int index);
-+ bool CreateEGLIMAGETexture(int index);
-+
- void UploadCVRefTexture(int index);
- void DeleteCVRefTexture(int index);
- bool CreateCVRefTexture(int index);
-@@ -242,6 +255,9 @@ class CLinuxRendererGLES : public CBaseRenderer
- YV12Image image;
- unsigned flipindex; /* used to decide if this has been uploaded */
-
-+ double pts; // for debugging A/V sync in rendering
-+ EGLImageHandle *eglImageHandle;
-+
- #ifdef HAVE_LIBOPENMAX
- OpenMaxVideoBuffer *openMaxBuffer;
- #endif
-@@ -261,6 +277,8 @@ class CLinuxRendererGLES : public CBaseRenderer
- , unsigned width, unsigned height
- , int stride, void* data );
-
-+ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
-+
- Shaders::BaseYUV2RGBShader *m_pYUVShader;
- Shaders::BaseVideoFilterShader *m_pVideoFilterShader;
- ESCALINGMETHOD m_scalingMethod;
-diff --git a/xbmc/cores/VideoRenderers/RenderFlags.h b/xbmc/cores/VideoRenderers/RenderFlags.h
-index f663380..1ab788c 100644
---- a/xbmc/cores/VideoRenderers/RenderFlags.h
-+++ b/xbmc/cores/VideoRenderers/RenderFlags.h
-@@ -80,4 +80,5 @@
- #define CONF_FLAGS_FORMAT_OMXEGL 0x040000
- #define CONF_FLAGS_FORMAT_CVBREF 0x080000
- #define CONF_FLAGS_FORMAT_BYPASS 0x100000
-+#define CONF_FLAGS_FORMAT_EGLIMG 0x200000
- #endif
-diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
-index af12cbd..1846a22 100644
---- a/xbmc/cores/VideoRenderers/RenderManager.cpp
-+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
-@@ -794,6 +794,8 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic)
- else if(pic.format == DVDVideoPicture::FMT_CVBREF)
- m_pRenderer->AddProcessor(pic.vtb, &pic);
- #endif
-+ else if(pic.format == DVDVideoPicture::FMT_EGLIMG)
-+ m_pRenderer->AddProcessor(&pic);
- #ifdef HAVE_LIBVA
- else if(pic.format == DVDVideoPicture::FMT_VAAPI)
- m_pRenderer->AddProcessor(*pic.vaapi);
-diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
-index fa9f68a..f46d3c4 100644
---- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
-+++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
-@@ -263,6 +263,62 @@ bool BaseYUV2RGBGLSLShader::OnEnabled()
- }
- #endif
-
-+
-+//////////////////////////////////////////////////////////////////////
-+// EGLImageExternalShader - YUV2RGB GL_OES_EGL_image_external extension
-+// NOTE: this is a bit ugly, because don't have separate Y/U/V textures
-+// (we just hijack the Y texture for now), and don't really have all
-+// these other parameters (CSC matrix, etc..)
-+//////////////////////////////////////////////////////////////////////
-+
-+EGLImageExternalShader::EGLImageExternalShader()
-+{
-+#ifdef HAS_GL
-+# error "Is this supported in GL??"
-+#elif HAS_GLES == 2
-+
-+ m_width = 1;
-+ m_height = 1;
-+ m_hYTex = -1;
-+ m_hVertex = -1;
-+ m_hYcoord = -1;
-+ m_hProj = -1;
-+ m_hModel = -1;
-+ m_hAlpha = -1;
-+
-+ VertexShader()->LoadSource("yuv2rgb_vertex_egl_image_external_gles.glsl", m_defines);
-+ PixelShader()->LoadSource("yuv2rgb_egl_image_external_gles.glsl", m_defines);
-+#endif
-+}
-+
-+void EGLImageExternalShader::OnCompiledAndLinked()
-+{
-+ m_hAlpha = glGetUniformLocation(ProgramHandle(), "m_alpha");
-+ m_hProj = glGetUniformLocation(ProgramHandle(), "m_proj");
-+ m_hModel = glGetUniformLocation(ProgramHandle(), "m_model");
-+ m_hVertex = glGetAttribLocation(ProgramHandle(), "m_attrpos");
-+ m_hYcoord = glGetAttribLocation(ProgramHandle(), "m_attrcord");
-+ m_hYTex = glGetUniformLocation(ProgramHandle(), "m_samp");
-+
-+printf("m_hVertex=%d, m_hYcoord=%d, m_hYTex=%d\n", m_hVertex, m_hYcoord, m_hYTex);
-+printf("m_hAlpha=%d, m_hProj=%d, m_hModel=%d", m_hAlpha, m_hProj, m_hModel);
-+
-+ VerifyGLState();
-+}
-+
-+bool EGLImageExternalShader::OnEnabled()
-+{
-+ // set shader attributes once enabled
-+ glUniform1i(m_hYTex, 0);
-+ glUniformMatrix4fv(m_hProj, 1, GL_FALSE, m_proj);
-+ glUniformMatrix4fv(m_hModel, 1, GL_FALSE, m_model);
-+ glUniform1f(m_hAlpha, m_alpha);
-+
-+ VerifyGLState();
-+ return true;
-+}
-+
-+
- //////////////////////////////////////////////////////////////////////
- // YUV2RGBProgressiveShader - YUV2RGB with no deinterlacing
- // Use for weave deinterlacing / progressive
-diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
-index bcc3a17..b6e2d49 100644
---- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
-+++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
-@@ -164,6 +164,36 @@ void CalculateYUVMatrix(TransformMatrix &matrix
- };
- #endif
-
-+ class EGLImageExternalShader : public BaseYUV2RGBShader, public CGLSLShaderProgram
-+ {
-+ public:
-+ EGLImageExternalShader();
-+ virtual void SetWidth(int w) { m_width = w; }
-+ virtual void SetHeight(int h) { m_height = h; }
-+ virtual GLint GetVertexLoc() { return m_hVertex; }
-+ virtual GLint GetYcoordLoc() { return m_hYcoord; }
-+
-+ virtual void SetMatrices(GLfloat *p, GLfloat *m) { m_proj = p; m_model = m; }
-+ virtual void SetAlpha(GLfloat alpha) { m_alpha = alpha; }
-+
-+ protected:
-+ void OnCompiledAndLinked();
-+ bool OnEnabled();
-+
-+ string m_defines;
-+ int m_width;
-+ int m_height;
-+ GLint m_hYTex;
-+ GLint m_hVertex;
-+ GLint m_hYcoord;
-+ GLint m_hProj;
-+ GLint m_hModel;
-+ GLint m_hAlpha;
-+ GLfloat *m_proj;
-+ GLfloat *m_model;
-+ GLfloat m_alpha;
-+ };
-+
- class YUV2RGBProgressiveShader : public BaseYUV2RGBGLSLShader
- {
- public:
-diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
-index e4bd9c9..8f5100e 100644
---- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
-+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
-@@ -22,6 +22,7 @@
- */
-
- #include "system.h"
-+#include "threads/SingleLock.h"
-
- #include <vector>
-
-@@ -34,6 +35,7 @@
-
- namespace DXVA { class CSurfaceContext; }
- namespace VAAPI { struct CHolder; }
-+class CDVDVideoCodec;
- class CVDPAU;
- class COpenMax;
- class COpenMaxVideo;
-@@ -43,6 +45,20 @@
- struct __CVBuffer;
- #endif
-
-+class EGLImageHandle
-+{
-+public:
-+ EGLImageHandle()
-+ {
-+ }
-+ virtual ~EGLImageHandle()
-+ {
-+ }
-+ virtual EGLImageKHR Get() = 0;
-+ virtual EGLImageHandle * Ref() = 0;
-+ virtual void UnRef() = 0;
-+};
-+
- // should be entirely filled by all codecs
- struct DVDVideoPicture
- {
-@@ -77,6 +93,11 @@ struct DVDVideoPicture
- #endif
- };
-
-+ // XXX move this into union, and use instead of data/iLineSize!!
-+ struct {
-+ EGLImageHandle *eglImageHandle;
-+ };
-+
- unsigned int iFlags;
-
- double iRepeatPicture;
-@@ -96,6 +117,7 @@ struct DVDVideoPicture
-
- unsigned int iWidth;
- unsigned int iHeight;
-+ unsigned int iDisplayX, iDisplayY;
- unsigned int iDisplayWidth; // width of the picture without black bars
- unsigned int iDisplayHeight; // height of the picture without black bars
-
-@@ -109,6 +131,7 @@ struct DVDVideoPicture
- FMT_VAAPI,
- FMT_OMXEGL,
- FMT_CVBREF,
-+ FMT_EGLIMG,
- } format;
- };
-
-@@ -185,6 +208,8 @@ class CDVDVideoCodec
- */
- virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture)
- {
-+ if (pDvdVideoPicture->eglImageHandle)
-+ pDvdVideoPicture->eglImageHandle->UnRef();
- memset(pDvdVideoPicture, 0, sizeof(DVDVideoPicture));
- return true;
- }
-diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
-index e28faaf..4852885 100644
---- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
-+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
-@@ -1052,6 +1052,10 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
- flags |= CONF_FLAGS_FORMAT_CVBREF;
- formatstr = "BGRA";
- break;
-+ case DVDVideoPicture::FMT_EGLIMG:
-+ flags |= CONF_FLAGS_FORMAT_EGLIMG;
-+ formatstr = "EGLIMG";
-+ break;
- }
-
- if(m_bAllowFullscreen)
-diff --git a/xbmc/system.h b/xbmc/system.h
-index b10ebae..4eba449 100644
---- a/xbmc/system.h
-+++ b/xbmc/system.h
-@@ -267,6 +267,8 @@
- #else
- #include <GLES2/gl2.h>
- #include <GLES2/gl2ext.h>
-+ #include <EGL/egl.h>
-+ #include <EGL/eglext.h>
- #endif
- #endif
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/408a_eglimage-support.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/408a_eglimage-support.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,199 @@
+diff --git a/system/shaders/yuv2rgb_egl_image_external_gles.glsl b/system/shaders/yuv2rgb_egl_image_external_gles.glsl
+new file mode 100644
+index 0000000..6914f88
+--- /dev/null
++++ b/system/shaders/yuv2rgb_egl_image_external_gles.glsl
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2010 Team XBMC
++ * http://www.xbmc.org
++ *
++ * This Program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This Program 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with XBMC; see the file COPYING. If not, write to
++ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
++ * http://www.gnu.org/copyleft/gpl.html
++ *
++ */
++
++/*
++ * The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which
++ * is defined by the GL_OES_EGL_image_external OpenGL ES extension. This
++ * limits how the texture may be used. Each time the texture is bound it
++ * must be bound to the GL_TEXTURE_EXTERNAL_OES target rather than the
++ * GL_TEXTURE_2D target. Additionally, any OpenGL ES 2.0 shader that samples
++ * from the texture must declare its use of this extension using, for example,
++ * an "#extension GL_OES_EGL_image_external : require" directive. Such shaders
++ * must also access the texture using the samplerExternalOES GLSL sampler type.
++ */
++
++#extension GL_OES_EGL_image_external : require
++
++precision mediump float;
++
++uniform samplerExternalOES m_samp;
++varying vec2 m_cord;
++uniform float m_alpha;
++
++void main()
++{
++ vec4 rgb = texture2D(m_samp, m_cord);
++ rgb.a = m_alpha;
++ gl_FragColor = rgb;
++}
+diff --git a/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl b/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl
+new file mode 100644
+index 0000000..c3f1f14
+--- /dev/null
++++ b/system/shaders/yuv2rgb_vertex_egl_image_external_gles.glsl
+@@ -0,0 +1,33 @@
++/*
++ * Copyright (C) 2010 Team XBMC
++ * http://www.xbmc.org
++ *
++ * This Program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This Program 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with XBMC; see the file COPYING. If not, write to
++ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
++ * http://www.gnu.org/copyleft/gpl.html
++ *
++ */
++
++attribute vec4 m_attrpos;
++attribute vec2 m_attrcord;
++varying vec2 m_cord;
++uniform mat4 m_proj;
++uniform mat4 m_model;
++
++void main ()
++{
++ mat4 mvp = m_proj * m_model;
++ gl_Position = mvp * m_attrpos;
++ m_cord = m_attrcord;
++}
+diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
+index fa9f68a..f46d3c4 100644
+--- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
++++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp
+@@ -263,6 +263,62 @@ bool BaseYUV2RGBGLSLShader::OnEnabled()
+ }
+ #endif
+
++
++//////////////////////////////////////////////////////////////////////
++// EGLImageExternalShader - YUV2RGB GL_OES_EGL_image_external extension
++// NOTE: this is a bit ugly, because don't have separate Y/U/V textures
++// (we just hijack the Y texture for now), and don't really have all
++// these other parameters (CSC matrix, etc..)
++//////////////////////////////////////////////////////////////////////
++
++EGLImageExternalShader::EGLImageExternalShader()
++{
++#ifdef HAS_GL
++# error "Is this supported in GL??"
++#elif HAS_GLES == 2
++
++ m_width = 1;
++ m_height = 1;
++ m_hYTex = -1;
++ m_hVertex = -1;
++ m_hYcoord = -1;
++ m_hProj = -1;
++ m_hModel = -1;
++ m_hAlpha = -1;
++
++ VertexShader()->LoadSource("yuv2rgb_vertex_egl_image_external_gles.glsl", m_defines);
++ PixelShader()->LoadSource("yuv2rgb_egl_image_external_gles.glsl", m_defines);
++#endif
++}
++
++void EGLImageExternalShader::OnCompiledAndLinked()
++{
++ m_hAlpha = glGetUniformLocation(ProgramHandle(), "m_alpha");
++ m_hProj = glGetUniformLocation(ProgramHandle(), "m_proj");
++ m_hModel = glGetUniformLocation(ProgramHandle(), "m_model");
++ m_hVertex = glGetAttribLocation(ProgramHandle(), "m_attrpos");
++ m_hYcoord = glGetAttribLocation(ProgramHandle(), "m_attrcord");
++ m_hYTex = glGetUniformLocation(ProgramHandle(), "m_samp");
++
++printf("m_hVertex=%d, m_hYcoord=%d, m_hYTex=%d\n", m_hVertex, m_hYcoord, m_hYTex);
++printf("m_hAlpha=%d, m_hProj=%d, m_hModel=%d", m_hAlpha, m_hProj, m_hModel);
++
++ VerifyGLState();
++}
++
++bool EGLImageExternalShader::OnEnabled()
++{
++ // set shader attributes once enabled
++ glUniform1i(m_hYTex, 0);
++ glUniformMatrix4fv(m_hProj, 1, GL_FALSE, m_proj);
++ glUniformMatrix4fv(m_hModel, 1, GL_FALSE, m_model);
++ glUniform1f(m_hAlpha, m_alpha);
++
++ VerifyGLState();
++ return true;
++}
++
++
+ //////////////////////////////////////////////////////////////////////
+ // YUV2RGBProgressiveShader - YUV2RGB with no deinterlacing
+ // Use for weave deinterlacing / progressive
+diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
+index bcc3a17..b6e2d49 100644
+--- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
++++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.h
+@@ -164,6 +164,36 @@ void CalculateYUVMatrix(TransformMatrix &matrix
+ };
+ #endif
+
++ class EGLImageExternalShader : public BaseYUV2RGBShader, public CGLSLShaderProgram
++ {
++ public:
++ EGLImageExternalShader();
++ virtual void SetWidth(int w) { m_width = w; }
++ virtual void SetHeight(int h) { m_height = h; }
++ virtual GLint GetVertexLoc() { return m_hVertex; }
++ virtual GLint GetYcoordLoc() { return m_hYcoord; }
++
++ virtual void SetMatrices(GLfloat *p, GLfloat *m) { m_proj = p; m_model = m; }
++ virtual void SetAlpha(GLfloat alpha) { m_alpha = alpha; }
++
++ protected:
++ void OnCompiledAndLinked();
++ bool OnEnabled();
++
++ string m_defines;
++ int m_width;
++ int m_height;
++ GLint m_hYTex;
++ GLint m_hVertex;
++ GLint m_hYcoord;
++ GLint m_hProj;
++ GLint m_hModel;
++ GLint m_hAlpha;
++ GLfloat *m_proj;
++ GLfloat *m_model;
++ GLfloat m_alpha;
++ };
++
+ class YUV2RGBProgressiveShader : public BaseYUV2RGBGLSLShader
+ {
+ public:
\ No newline at end of file
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/408b_eglimage-support.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/408b_eglimage-support.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,641 @@
+diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h
+index fdd0ad4..587256c 100644
+--- a/xbmc/cores/VideoRenderers/BaseRenderer.h
++++ b/xbmc/cores/VideoRenderers/BaseRenderer.h
+@@ -32,8 +32,9 @@ typedef struct YV12Image
+ BYTE * plane[MAX_PLANES];
+ int planesize[MAX_PLANES];
+ unsigned stride[MAX_PLANES];
+- unsigned width;
+- unsigned height;
++ unsigned cropX, cropY; /* crop position */
++ unsigned cropWidth, cropHeight; /* crop dimensions */
++ unsigned width, height; /* original dimensions */
+ unsigned flags;
+
+ unsigned cshift_x; /* this is the chroma shift used */
+diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+index 40c91a5..111e282 100644
+--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+@@ -47,6 +47,7 @@
+ #include "RenderCapture.h"
+ #include "RenderFormats.h"
+ #include "xbmc/Application.h"
++#include <EGL/eglext.h>
+
+ #if defined(__ARM_NEON__)
+ #include "yuv2rgb.neon.h"
+@@ -75,7 +76,7 @@ CLinuxRendererGLES::YUVBUFFER::~YUVBUFFER()
+
+ CLinuxRendererGLES::CLinuxRendererGLES()
+ {
+- m_textureTarget = GL_TEXTURE_2D;
++ memset(m_buffers, 0, sizeof(m_buffers));
+ for (int i = 0; i < NUM_BUFFERS; i++)
+ {
+ m_eventTexturesDone[i] = new CEvent(false,true);
+@@ -112,13 +113,30 @@ CLinuxRendererGLES::CLinuxRendererGLES()
+
+ m_dllSwScale = new DllSwScale;
+ m_sw_context = NULL;
++
++ glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)
++ eglGetProcAddress("glEGLImageTargetTexture2DOES");
++
++ m_textureTarget = GL_TEXTURE_2D;
++}
++
++void CLinuxRendererGLES::UnRefBuf(int index)
++{
++ YUVBUFFER &buf = m_buffers[index];
++ if (buf.eglImageHandle)
++ {
++ buf.eglImageHandle->UnRef();
++ buf.eglImageHandle = NULL;
++ }
+ }
+
+ CLinuxRendererGLES::~CLinuxRendererGLES()
+ {
+ UnInit();
+- for (int i = 0; i < NUM_BUFFERS; i++)
+- delete m_eventTexturesDone[i];
++ for (int i = 0; i < NUM_BUFFERS; i++) {
++ UnRefBuf(i);
++ delete m_eventTexturesDone[i];
++ }
+
+ if (m_rgbBuffer != NULL) {
+ delete [] m_rgbBuffer;
+@@ -137,7 +155,7 @@ CLinuxRendererGLES::~CLinuxRendererGLES()
+
+ void CLinuxRendererGLES::ManageTextures()
+ {
+- m_NumYV12Buffers = 2;
++ m_NumYV12Buffers = NUM_BUFFERS;
+ //m_iYV12RenderBuffer = 0;
+ return;
+ }
+@@ -285,17 +303,36 @@ void CLinuxRendererGLES::CalculateTextureSourceRects(int source, int num_planes)
+ YUVBUFFER& buf = m_buffers[source];
+ YV12Image* im = &buf.image;
+ YUVFIELDS& fields = buf.fields;
++ int cropX, cropY, cropWidth, cropHeight;
++
++ cropX = im->cropX;
++ cropY = im->cropY;
++ cropWidth = im->cropWidth;
++ cropHeight = im->cropHeight;
++
++ //CLog::Log(LOGDEBUG, "GL: crop: %d,%d - %dx%d", cropX, cropY, cropWidth, cropHeight);
++
++ /* if we have bogus crop coords, fallback to no cropping */
++ if ((cropWidth == 0) || (cropHeight == 0))
++ {
++ cropX = cropY = 0;
++ cropWidth = m_sourceWidth;
++ cropHeight = m_sourceHeight;
++ }
+
+ // calculate the source rectangle
+- for(int field = 0; field < 3; field++)
++ for(int field = 0; field < (buf.eglImageHandle ? 1 : 3); field++)
+ {
+ for(int plane = 0; plane < num_planes; plane++)
+ {
+ YUVPLANE& p = fields[field][plane];
+
+- p.rect = m_sourceRect;
+- p.width = im->width;
+- p.height = im->height;
++ p.rect.x1 = cropX;
++ p.rect.y1 = cropY;
++ p.rect.x2 = cropX + cropWidth;
++ p.rect.y2 = cropY + cropHeight;
++ p.width = cropWidth;
++ p.height = cropHeight;
+
+ if(field != FIELD_FULL)
+ {
+@@ -326,7 +363,8 @@ void CLinuxRendererGLES::CalculateTextureSourceRects(int source, int num_planes)
+ p.rect.y2 /= 1 << im->cshift_y;
+ }
+
+- if (m_textureTarget == GL_TEXTURE_2D)
++ if ((m_textureTarget == GL_TEXTURE_2D) ||
++ (m_textureTarget == GL_TEXTURE_EXTERNAL_OES))
+ {
+ p.height /= p.texheight;
+ p.rect.y1 /= p.texheight;
+@@ -513,7 +551,7 @@ unsigned int CLinuxRendererGLES::PreInit()
+ m_resolution = RES_DESKTOP;
+
+ m_iYV12RenderBuffer = 0;
+- m_NumYV12Buffers = 2;
++ m_NumYV12Buffers = NUM_BUFFERS;
+
+ m_formats.push_back(RENDER_FMT_YUV420P);
+ m_formats.push_back(RENDER_FMT_BYPASS);
+@@ -645,9 +683,17 @@ void CLinuxRendererGLES::LoadShaders(int field)
+ // Try GLSL shaders if supported and user requested auto or GLSL.
+ if (glCreateProgram)
+ {
+- // create regular progressive scan shader
+- m_pYUVShader = new YUV2RGBProgressiveShader(false, m_iFlags, m_format);
+- CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
++ if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_EGLIMG)
++ {
++ m_pYUVShader = new EGLImageExternalShader();
++ CLog::Log(LOGNOTICE, "GL: Selecting eglImage shader");
++ }
++ else
++ {
++ // create regular progressive scan shader
++ m_pYUVShader = new YUV2RGBProgressiveShader(false, m_iFlags);
++ CLog::Log(LOGNOTICE, "GL: Selecting Single Pass YUV 2 RGB shader");
++ }
+
+ if (m_pYUVShader && m_pYUVShader->CompileAndLink())
+ {
+@@ -696,6 +742,12 @@ void CLinuxRendererGLES::LoadShaders(int field)
+ m_textureCreate = &CLinuxRendererGLES::CreateBYPASSTexture;
+ m_textureDelete = &CLinuxRendererGLES::DeleteBYPASSTexture;
+ }
++ else if (m_format == RENDER_FMT_EGLIMG)
++ {
++ m_textureUpload = &CLinuxRendererGLES::UploadEGLIMAGETexture;
++ m_textureCreate = &CLinuxRendererGLES::CreateEGLIMAGETexture;
++ m_textureDelete = &CLinuxRendererGLES::DeleteEGLIMAGETexture;
++ }
+ else
+ {
+ // default to YV12 texture handlers
+@@ -819,8 +871,9 @@ void CLinuxRendererGLES::Render(DWORD flags, int index)
+
+ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
+ {
+- YV12Image &im = m_buffers[index].image;
+- YUVFIELDS &fields = m_buffers[index].fields;
++ YUVBUFFER &buf = m_buffers[index];
++ YV12Image &im = buf.image;
++ YUVFIELDS &fields = buf.fields;
+ YUVPLANES &planes = fields[field];
+
+ if (m_reloadShaders)
+@@ -831,20 +884,28 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
+
+ glDisable(GL_DEPTH_TEST);
+
++ /* note: with eglimageexternal, we have just a single YUV texture,
++ * rather than one texture per plane. So what is referred below
++ * as the 'Y' texture is actually the 'YUV' texture, and 'U' & 'V'
++ * textures are unused.
++ */
++
+ // Y
+ glActiveTexture(GL_TEXTURE0);
+ glEnable(m_textureTarget);
+ glBindTexture(m_textureTarget, planes[0].id);
+
+- // U
+- glActiveTexture(GL_TEXTURE1);
+- glEnable(m_textureTarget);
+- glBindTexture(m_textureTarget, planes[1].id);
++ if (!buf.eglImageHandle) {
++ // U
++ glActiveTexture(GL_TEXTURE1);
++ glEnable(m_textureTarget);
++ glBindTexture(m_textureTarget, planes[1].id);
+
+- // V
+- glActiveTexture(GL_TEXTURE2);
+- glEnable(m_textureTarget);
+- glBindTexture(m_textureTarget, planes[2].id);
++ // V
++ glActiveTexture(GL_TEXTURE2);
++ glEnable(m_textureTarget);
++ glBindTexture(m_textureTarget, planes[2].id);
++ }
+
+ glActiveTexture(GL_TEXTURE0);
+ VerifyGLState();
+@@ -872,13 +933,19 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
+
+ glVertexAttribPointer(vertLoc, 3, GL_FLOAT, 0, 0, m_vert);
+ glVertexAttribPointer(Yloc, 2, GL_FLOAT, 0, 0, m_tex[0]);
+- glVertexAttribPointer(Uloc, 2, GL_FLOAT, 0, 0, m_tex[1]);
+- glVertexAttribPointer(Vloc, 2, GL_FLOAT, 0, 0, m_tex[2]);
++ if (!buf.eglImageHandle)
++ {
++ glVertexAttribPointer(Uloc, 2, GL_FLOAT, 0, 0, m_tex[1]);
++ glVertexAttribPointer(Vloc, 2, GL_FLOAT, 0, 0, m_tex[2]);
++ }
+
+ glEnableVertexAttribArray(vertLoc);
+ glEnableVertexAttribArray(Yloc);
+- glEnableVertexAttribArray(Uloc);
+- glEnableVertexAttribArray(Vloc);
++ if (!buf.eglImageHandle)
++ {
++ glEnableVertexAttribArray(Uloc);
++ glEnableVertexAttribArray(Vloc);
++ }
+
+ // Setup vertex position values
+ for(int i = 0; i < 4; i++)
+@@ -889,7 +956,7 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
+ }
+
+ // Setup texture coordinates
+- for (int i=0; i<3; i++)
++ for (int i = 0; i < (buf.eglImageHandle ? 1 : 3); i++)
+ {
+ m_tex[i][0][0] = m_tex[i][3][0] = planes[i].rect.x1;
+ m_tex[i][0][1] = m_tex[i][1][1] = planes[i].rect.y1;
+@@ -906,14 +973,17 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field)
+
+ glDisableVertexAttribArray(vertLoc);
+ glDisableVertexAttribArray(Yloc);
+- glDisableVertexAttribArray(Uloc);
+- glDisableVertexAttribArray(Vloc);
++ if (!buf.eglImageHandle)
++ {
++ glDisableVertexAttribArray(Uloc);
++ glDisableVertexAttribArray(Vloc);
+
+- glActiveTexture(GL_TEXTURE1);
+- glDisable(m_textureTarget);
++ glActiveTexture(GL_TEXTURE1);
++ glDisable(m_textureTarget);
+
+- glActiveTexture(GL_TEXTURE2);
+- glDisable(m_textureTarget);
++ glActiveTexture(GL_TEXTURE2);
++ glDisable(m_textureTarget);
++ }
+
+ glActiveTexture(GL_TEXTURE0);
+ glDisable(m_textureTarget);
+@@ -1354,6 +1424,97 @@ bool CLinuxRendererGLES::RenderCapture(CRenderCapture* capture)
+ }
+
+ //********************************************************************************************************
++// eglImage Texture creation, deletion, copying + clearing
++//********************************************************************************************************
++
++void CLinuxRendererGLES::UploadEGLIMAGETexture(int index)
++{
++ YUVBUFFER &buf = m_buffers[index];
++ YV12Image &im = buf.image;
++ YUVFIELDS &fields = buf.fields;
++ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
++
++#if defined(HAVE_LIBOPENMAX)
++ if (!(im.flags&IMAGE_FLAG_READY) || buf.openMaxBuffer)
++#else
++ if (!(im.flags&IMAGE_FLAG_READY))
++#endif
++ {
++ m_eventTexturesDone[index]->Set();
++ return;
++ }
++
++ glEnable(m_textureTarget);
++ glBindTexture(m_textureTarget, plane.id);
++ glEGLImageTargetTexture2DOES(m_textureTarget, buf.eglImageHandle->Get());
++
++ VerifyGLState();
++
++ m_eventTexturesDone[index]->Set();
++
++ CalculateTextureSourceRects(index, 1);
++
++ glDisable(m_textureTarget);
++}
++
++void CLinuxRendererGLES::DeleteEGLIMAGETexture(int index)
++{
++ YUVBUFFER &buf = m_buffers[index];
++ YUVFIELDS &fields = buf.fields;
++ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
++
++ if (plane.id == 0)
++ return;
++
++ /* finish up all textures, and delete them */
++ g_graphicsContext.BeginPaint(); //FIXME
++
++ if (glIsTexture(plane.id))
++ glDeleteTextures(1, &plane.id);
++
++ plane.id = 0;
++
++ UnRefBuf(index);
++
++ g_graphicsContext.EndPaint();
++}
++
++bool CLinuxRendererGLES::CreateEGLIMAGETexture(int index)
++{
++ YUVBUFFER &buf = m_buffers[index];
++ YUVFIELDS &fields = buf.fields;
++ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
++
++ /* only use single-pass for egl-image-external */
++ m_renderQuality = RQ_SINGLEPASS;
++ m_textureTarget = GL_TEXTURE_EXTERNAL_OES;
++
++ DeleteEGLIMAGETexture(index);
++
++ glEnable(m_textureTarget);
++
++ if (!glIsTexture(plane.id))
++ {
++ glGenTextures(1, &plane.id);
++ VerifyGLState();
++ }
++
++ glBindTexture(m_textureTarget, plane.id);
++
++ // glTexImage2D(m_textureTarget, 0, GL_RGBA, plane.texwidth, plane.texheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
++
++ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
++ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
++ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
++ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
++ VerifyGLState();
++
++ m_eventTexturesDone[index]->Set();
++
++ return true;
++}
++
++//********************************************************************************************************
+ // YV12 Texture creation, deletion, copying + clearing
+ //********************************************************************************************************
+ void CLinuxRendererGLES::UploadYV12Texture(int source)
+@@ -1606,7 +1767,7 @@ bool CLinuxRendererGLES::CreateYV12Texture(int index)
+ }
+ }
+
+- for(int p = 0; p < 3; p++)
++ for(int p = 0; p < MAX_PLANES; p++)
+ {
+ YUVPLANE &plane = planes[p];
+ if (plane.texwidth * plane.texheight == 0)
+@@ -1799,7 +1960,8 @@ void CLinuxRendererGLES::SetTextureFilter(GLenum method)
+ {
+ for (int i = 0 ; i<m_NumYV12Buffers ; i++)
+ {
+- YUVFIELDS &fields = m_buffers[i].fields;
++ YUVBUFFER &buf = m_buffers[i];
++ YUVFIELDS &fields = buf.fields;
+
+ for (int f = FIELD_FULL; f<=FIELD_BOT ; f++)
+ {
+@@ -1808,7 +1970,7 @@ void CLinuxRendererGLES::SetTextureFilter(GLenum method)
+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, method);
+ VerifyGLState();
+
+- if (!(m_renderMethod & RENDER_SW))
++ if (!((m_renderMethod & RENDER_SW) || buf.eglImageHandle))
+ {
+ glBindTexture(m_textureTarget, fields[f][1].id);
+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, method);
+@@ -1983,5 +2145,44 @@ void CLinuxRendererGLES::AddProcessor(struct __CVBuffer *cvBufferRef)
+ }
+ #endif
+
++/* for decoders using eglImage:
++ */
++void CLinuxRendererGLES::AddProcessor(DVDVideoPicture *picture)
++{
++ int index = NextYV12Texture();
++ YUVBUFFER &buf = m_buffers[index];
++ YV12Image &im = buf.image;
++ YUVFIELDS &fields = buf.fields;
++ YUVPLANE &plane = fields[0][0]; /* for eglimageexternal, use only one texture */
++
++ UnRefBuf(index);
++
++ im.cropX = picture->iDisplayX;
++ im.cropY = picture->iDisplayY;
++ im.cropHeight = picture->iDisplayHeight;
++ im.cropWidth = picture->iDisplayWidth;
++ im.width = m_sourceWidth;
++ im.height = m_sourceHeight;
++ im.cshift_x = 1;
++ im.cshift_y = 1;
++ buf.pts = picture->pts;
++ buf.eglImageHandle = picture->eglImageHandle->Ref();
++
++ plane.texwidth = im.width;
++ plane.texheight = im.height;
++
++ if(m_renderMethod & RENDER_POT)
++ {
++ plane.texwidth = NP2(plane.texwidth);
++ plane.texheight = NP2(plane.texheight);
++ }
++
++ // some sanity checking for now.. I plan to move the eglImage related
++ // stuff into the union, but need to be sure that no one is still using
++ // the data/iLineSize fields..
++ if (picture->data[0] || picture->iLineSize[0])
++ printf("warning: data/iLineSize is not zero!\n");
++}
++
+ #endif
+
+diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
+index 76b5437..1ea6336 100644
+--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
+@@ -23,6 +23,11 @@
+
+ #if HAS_GLES == 2
+
++#include <GLES2/gl2.h>
++#include <GLES2/gl2ext.h>
++#include <EGL/egl.h>
++#include <EGL/eglext.h>
++
+ #include "system_gl.h"
+
+ #include "xbmc/guilib/FrameBufferObject.h"
+@@ -41,7 +46,7 @@ namespace Shaders { class BaseVideoFilterShader; }
+ class COpenMaxVideo;
+ typedef std::vector<int> Features;
+
+-#define NUM_BUFFERS 3
++#define NUM_BUFFERS 5
+
+
+ #undef ALIGN
+@@ -158,6 +163,8 @@ public:
+ #ifdef HAVE_VIDEOTOOLBOXDECODER
+ virtual void AddProcessor(struct __CVBuffer *cvBufferRef);
+ #endif
++ /* for eglImage case: */
++ void AddProcessor(DVDVideoPicture *picture);
+
+ protected:
+ virtual void Render(DWORD flags, int index);
+@@ -168,12 +175,17 @@ protected:
+ virtual void LoadShaders(int field=FIELD_FULL);
+ void SetTextureFilter(GLenum method);
+ void UpdateVideoFilter();
++ void UnRefBuf(int index);
+
+ // textures
+ void (CLinuxRendererGLES::*m_textureUpload)(int index);
+ void (CLinuxRendererGLES::*m_textureDelete)(int index);
+ bool (CLinuxRendererGLES::*m_textureCreate)(int index);
+
++ void UploadEGLIMAGETexture(int index);
++ void DeleteEGLIMAGETexture(int index);
++ bool CreateEGLIMAGETexture(int index);
++
+ void UploadYV12Texture(int index);
+ void DeleteYV12Texture(int index);
+ bool CreateYV12Texture(int index);
+@@ -242,6 +254,8 @@ protected:
+ YUVFIELDS fields;
+ YV12Image image;
+ unsigned flipindex; /* used to decide if this has been uploaded */
++ double pts; // for debugging A/V sync in rendering
++ EGLImageHandle *eglImageHandle;
+
+ #ifdef HAVE_LIBOPENMAX
+ OpenMaxVideoBuffer *openMaxBuffer;
+@@ -262,6 +276,8 @@ protected:
+ , unsigned width, unsigned height
+ , int stride, void* data );
+
++ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
++
+ Shaders::BaseYUV2RGBShader *m_pYUVShader;
+ Shaders::BaseVideoFilterShader *m_pVideoFilterShader;
+ ESCALINGMETHOD m_scalingMethod;
+diff --git a/xbmc/cores/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoRenderers/RenderFormats.h
+index 09f8f5d..04175df 100644
+--- a/xbmc/cores/VideoRenderers/RenderFormats.h
++++ b/xbmc/cores/VideoRenderers/RenderFormats.h
+@@ -34,6 +34,7 @@ enum ERenderFormat {
+ RENDER_FMT_OMXEGL,
+ RENDER_FMT_CVBREF,
+ RENDER_FMT_BYPASS,
++ RENDER_FMT_EGLIMG
+ };
+
+ #endif
+diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
+index 40b9184..cf45e72 100644
+--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
+@@ -834,6 +834,10 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic)
+ {
+ CDVDCodecUtils::CopyDXVA2Picture(&image, &pic);
+ }
++ else if(pic.format == RENDER_FMT_EGLIMG)
++ {
++ m_pRenderer->AddProcessor(&pic);
++ }
+ #ifdef HAVE_LIBVDPAU
+ else if(pic.format == RENDER_FMT_VDPAU)
+ m_pRenderer->AddProcessor(pic.vdpau);
+diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
+index 1d8bad3..270085c 100644
+--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
+@@ -21,6 +21,7 @@
+ */
+
+ #include "system.h"
++#include "threads/SingleLock.h"
+
+ #include <vector>
+ #include "cores/VideoRenderers/RenderFormats.h"
+@@ -34,11 +35,26 @@
+
+ namespace DXVA { class CSurfaceContext; }
+ namespace VAAPI { struct CHolder; }
++class CDVDVideoCodec;
+ class CVDPAU;
+ class COpenMax;
+ class COpenMaxVideo;
+ struct OpenMaxVideoBuffer;
+
++class EGLImageHandle
++{
++public:
++ EGLImageHandle()
++ {
++ }
++ virtual ~EGLImageHandle()
++ {
++ }
++ virtual EGLImageKHR Get() = 0;
++ virtual EGLImageHandle * Ref() = 0;
++ virtual void UnRef() = 0;
++};
++
+ // should be entirely filled by all codecs
+ struct DVDVideoPicture
+ {
+@@ -71,6 +87,11 @@ struct DVDVideoPicture
+ };
+ };
+
++ // XXX move this into union, and use instead of data/iLineSize!!
++ struct {
++ EGLImageHandle *eglImageHandle;
++ };
++
+ unsigned int iFlags;
+
+ double iRepeatPicture;
+@@ -90,6 +111,7 @@ struct DVDVideoPicture
+
+ unsigned int iWidth;
+ unsigned int iHeight;
++ unsigned int iDisplayX, iDisplayY;
+ unsigned int iDisplayWidth; // width of the picture without black bars
+ unsigned int iDisplayHeight; // height of the picture without black bars
+
+@@ -169,6 +191,8 @@ public:
+ */
+ virtual bool ClearPicture(DVDVideoPicture* pDvdVideoPicture)
+ {
++ if (pDvdVideoPicture->eglImageHandle)
++ pDvdVideoPicture->eglImageHandle->UnRef();
+ memset(pDvdVideoPicture, 0, sizeof(DVDVideoPicture));
+ return true;
+ }
+diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
+index 3008c25..7b266a2 100644
+--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
+@@ -1115,6 +1115,9 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
+ case RENDER_FMT_DXVA:
+ formatstr = "DXVA";
+ break;
++ case RENDER_FMT_EGLIMG:
++ formatstr = "EGLIMG";
++ break;
+ case RENDER_FMT_VAAPI:
+ formatstr = "VAAPI";
+ break;
+diff --git a/xbmc/system_gl.h b/xbmc/system_gl.h
+index 4136277..f424e9e 100644
+--- a/xbmc/system_gl.h
++++ b/xbmc/system_gl.h
+@@ -50,5 +50,7 @@
+ #else
+ #include <GLES2/gl2.h>
+ #include <GLES2/gl2ext.h>
++ #include <EGL/egl.h>
++ #include <EGL/eglext.h>
+ #endif
+ #endif
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/412_9421bf80e6f67dd3238970844399715c459311a8.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/412_9421bf80e6f67dd3238970844399715c459311a8.diff Thu Mar 28 07:37:37 2013 +0100
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/412_9421bf80e6f67dd3238970844399715c459311a8.diff Fri Mar 29 21:26:50 2013 +0100
@@ -5,6 +5,6 @@
@@ -1,3 +1,5 @@
+CXXFLAGS+=-DMESA_EGL_NO_X11_HEADERS
+
- SRCS=ApplicationOperations.cpp \
+ SRCS=AddonsOperations.cpp \
+ ApplicationOperations.cpp \
AudioLibrary.cpp \
- FileItemHandler.cpp \
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/440_fix-cross-with-externalffmpeg.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/440_fix-cross-with-externalffmpeg.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-diff -Naur xbmc-pvr-20120428-gite714180/configure.in xbmc-pvr-20120428-gite714180a/configure.in
---- xbmc-pvr-20120428-gite714180/configure.in 2012-05-26 19:14:03.898018585 -0700
-+++ xbmc-pvr-20120428-gite714180a/configure.in 2012-05-26 19:19:30.137534896 -0700
-@@ -1244,6 +1244,11 @@
- USE_EXTERNAL_FFMPEG=1
- AC_DEFINE([USE_EXTERNAL_FFMPEG], [1], [Whether to use external FFmpeg libraries.])
-
-+ if test "x$cross_compiling" = "xyes"; then
-+ if test "x$use_vdpau" = "xyes"; then
-+ AC_MSG_NOTICE("Skipping VDPAU test as we are cross compiling")
-+ fi
-+ else
- # Disable vdpau support if external libavcodec doesn't have it
- AC_RUN_IFELSE(
- AC_LANG_PROGRAM([[#include <libavcodec/avcodec.h>]],
-@@ -1256,6 +1261,7 @@
- use_vdpau=no
- AC_MSG_RESULT($ffmpeg_vdpau_not_supported)
- fi])
-+ fi
-
- # Other headers to include if available.
- AC_CHECK_HEADERS([libavutil/mathematics.h],,)
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/450_confluence.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/450_confluence.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-iff --git a/addons/skin.confluence/720p/DialogButtonMenu.xml b/addons/skin.confluence/720p/DialogButtonMenu.xml
-index 0ae22e8..5372255 100644
---- a/addons/skin.confluence/720p/DialogButtonMenu.xml
-+++ b/addons/skin.confluence/720p/DialogButtonMenu.xml
-@@ -96,7 +96,7 @@
- <textwidth>290</textwidth>
- <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
- <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
-+ <onclick>XBMC.Powerdown()</onclick>
-- <onclick>XBMC.System.Exec(/sbin/poweroff)</onclick>
- <visible>System.CanPowerDown</visible>
- <pulseonselect>no</pulseonselect>
- <font>font13</font>
-@@ -177,7 +177,7 @@
- <textwidth>290</textwidth>
- <texturefocus border="25,5,25,5">ShutdownButtonFocus.png</texturefocus>
- <texturenofocus border="25,5,25,5">ShutdownButtonNoFocus.png</texturenofocus>
-+ <onclick>XBMC.Reset()</onclick>
-- <onclick>XBMC.System.Exec(/sbin/reboot)</onclick>
- <visible>System.CanReboot</visible>
- <pulseonselect>no</pulseonselect>
- <font>font13</font>
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/460_libnfs.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/460_libnfs.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-diff -Naur a/xbmc/filesystem//DllLibNfs.h b/xbmc/filesystem//DllLibNfs.h
---- a/xbmc/filesystem//DllLibNfs.h 2012-07-11 21:58:21.000000000 +0200
-+++ b/xbmc/filesystem//DllLibNfs.h 2012-07-31 15:45:07.136323415 +0200
-@@ -44,8 +44,8 @@
- virtual void free_nfs_srvr_list(struct nfs_server_list *srv)=0;
- virtual struct nfs_context *nfs_init_context(void)=0;
- virtual void nfs_destroy_context(struct nfs_context *nfs)=0;
-- virtual size_t nfs_get_readmax(struct nfs_context *nfs)=0;
-- virtual size_t nfs_get_writemax(struct nfs_context *nfs)=0;
-+ virtual uint64_t nfs_get_readmax(struct nfs_context *nfs)=0;
-+ virtual uint64_t nfs_get_writemax(struct nfs_context *nfs)=0;
- virtual char *nfs_get_error(struct nfs_context *nfs)=0;
- virtual int nfs_close(struct nfs_context *nfs, struct nfsfh *nfsfh)=0;
- virtual int nfs_fsync(struct nfs_context *nfs, struct nfsfh *nfsfh)=0;
-@@ -57,8 +57,8 @@
- virtual int nfs_mount(struct nfs_context *nfs, const char *server, const char *exportname)=0;
- virtual int nfs_stat(struct nfs_context *nfs, const char *path, struct stat *st)=0;
- virtual int nfs_fstat(struct nfs_context *nfs, struct nfsfh *nfsfh, struct stat *st)=0;
-- virtual int nfs_truncate(struct nfs_context *nfs, const char *path, off64_t length)=0;
-- virtual int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t length)=0;
-+ virtual int nfs_truncate(struct nfs_context *nfs, const char *path, uint64_t length)=0;
-+ virtual int nfs_ftruncate(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t length)=0;
- virtual int nfs_opendir(struct nfs_context *nfs, const char *path, struct nfsdir **nfsdir)=0;
- virtual int nfs_statvfs(struct nfs_context *nfs, const char *path, struct statvfs *svfs)=0;
- virtual int nfs_chmod(struct nfs_context *nfs, const char *path, int mode)=0;
-@@ -73,12 +73,12 @@
- virtual int nfs_chown(struct nfs_context *nfs, const char *path, int uid, int gid)=0;
- virtual int nfs_fchown(struct nfs_context *nfs, struct nfsfh *nfsfh, int uid, int gid)=0;
- virtual int nfs_open(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh)=0;
-- virtual int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf)=0;
-- virtual int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, size_t count, char *buf)=0;
-+ virtual int nfs_read(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buf)=0;
-+ virtual int nfs_write(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t count, char *buf)=0;
- virtual int nfs_creat(struct nfs_context *nfs, const char *path, int mode, struct nfsfh **nfsfh)=0;
-- virtual int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, size_t count, char *buf)=0;
-- virtual int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, size_t count, char *buf)=0;
-- virtual int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, off64_t offset, int whence, off64_t *current_offset)=0;
-+ virtual int nfs_pread(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buf)=0;
-+ virtual int nfs_pwrite(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, uint64_t count, char *buf)=0;
-+ virtual int nfs_lseek(struct nfs_context *nfs, struct nfsfh *nfsfh, uint64_t offset, int whence, uint64_t *current_offset)=0;
- };
-
- class DllLibNfs : public DllDynamic, DllLibNfsInterface
-@@ -90,8 +90,8 @@
- DEFINE_METHOD1(struct exportnode *, mount_getexports, (const char *p1))
- DEFINE_METHOD1(void, mount_free_export_list, (struct exportnode *p1))
- DEFINE_METHOD1(void, nfs_destroy_context, (struct nfs_context *p1))
-- DEFINE_METHOD1(size_t, nfs_get_readmax, (struct nfs_context *p1))
-- DEFINE_METHOD1(size_t, nfs_get_writemax, (struct nfs_context *p1))
-+ DEFINE_METHOD1(uint64_t, nfs_get_readmax, (struct nfs_context *p1))
-+ DEFINE_METHOD1(uint64_t, nfs_get_writemax, (struct nfs_context *p1))
- DEFINE_METHOD1(char *, nfs_get_error, (struct nfs_context *p1))
- DEFINE_METHOD2(struct nfsdirent *, nfs_readdir, (struct nfs_context *p1, struct nfsdir *p2))
- DEFINE_METHOD2(int, nfs_fsync, (struct nfs_context *p1, struct nfsfh *p2))
-@@ -103,8 +103,8 @@
- DEFINE_METHOD3(int, nfs_mount, (struct nfs_context *p1, const char *p2, const char *p3))
- DEFINE_METHOD3(int, nfs_stat, (struct nfs_context *p1, const char *p2, struct stat *p3))
- DEFINE_METHOD3(int, nfs_fstat, (struct nfs_context *p1, struct nfsfh *p2, struct stat *p3))
-- DEFINE_METHOD3(int, nfs_truncate, (struct nfs_context *p1, const char *p2, off64_t p3))
-- DEFINE_METHOD3(int, nfs_ftruncate, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3))
-+ DEFINE_METHOD3(int, nfs_truncate, (struct nfs_context *p1, const char *p2, uint64_t p3))
-+ DEFINE_METHOD3(int, nfs_ftruncate, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3))
- DEFINE_METHOD3(int, nfs_opendir, (struct nfs_context *p1, const char *p2, struct nfsdir **p3))
- DEFINE_METHOD3(int, nfs_statvfs, (struct nfs_context *p1, const char *p2, struct statvfs *p3))
- DEFINE_METHOD3(int, nfs_chmod, (struct nfs_context *p1, const char *p2, int p3))
-@@ -116,15 +116,15 @@
- DEFINE_METHOD3(int, nfs_rename, (struct nfs_context *p1, const char *p2, const char *p3))
- DEFINE_METHOD3(int, nfs_link, (struct nfs_context *p1, const char *p2, const char *p3))
- DEFINE_METHOD4(int, nfs_open, (struct nfs_context *p1, const char *p2, int p3, struct nfsfh **p4))
-- DEFINE_METHOD4(int, nfs_read, (struct nfs_context *p1, struct nfsfh *p2, size_t p3, char *p4))
-- DEFINE_METHOD4(int, nfs_write, (struct nfs_context *p1, struct nfsfh *p2, size_t p3, char *p4))
-+ DEFINE_METHOD4(int, nfs_read, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, char *p4))
-+ DEFINE_METHOD4(int, nfs_write, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, char *p4))
- DEFINE_METHOD4(int, nfs_creat, (struct nfs_context *p1, const char *p2, int p3, struct nfsfh **p4))
- DEFINE_METHOD4(int, nfs_readlink, (struct nfs_context *p1, const char *p2, char *p3, int p4))
- DEFINE_METHOD4(int, nfs_chown, (struct nfs_context *p1, const char *p2, int p3, int p4))
- DEFINE_METHOD4(int, nfs_fchown, (struct nfs_context *p1, struct nfsfh *p2, int p3, int p4))
-- DEFINE_METHOD5(int, nfs_pread, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, size_t p4, char *p5))
-- DEFINE_METHOD5(int, nfs_pwrite, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, size_t p4, char *p5))
-- DEFINE_METHOD5(int, nfs_lseek, (struct nfs_context *p1, struct nfsfh *p2, off64_t p3, int p4, off64_t *p5))
-+ DEFINE_METHOD5(int, nfs_pread, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, uint64_t p4, char *p5))
-+ DEFINE_METHOD5(int, nfs_pwrite, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, uint64_t p4, char *p5))
-+ DEFINE_METHOD5(int, nfs_lseek, (struct nfs_context *p1, struct nfsfh *p2, uint64_t p3, int p4, uint64_t *p5))
-
-
-
-diff -Naur a/xbmc/filesystem//FileNFS.cpp b/xbmc/filesystem//FileNFS.cpp
---- a/xbmc/filesystem//FileNFS.cpp 2012-07-11 21:58:21.000000000 +0200
-+++ b/xbmc/filesystem//FileNFS.cpp 2012-07-31 15:50:56.806836273 +0200
-@@ -365,7 +365,7 @@
- //we were before
- void CNfsConnection::keepAlive(struct nfsfh *_pFileHandle)
- {
-- off64_t offset = 0;
-+ uint64_t offset = 0;
- char buffer[32];
- CLog::Log(LOGNOTICE, "NFS: sending keep alive after %i s.",KEEP_ALIVE_TIMEOUT/2);
- CSingleLock lock(*this);
-@@ -451,7 +451,7 @@
- int64_t CFileNFS::GetPosition()
- {
- int ret = 0;
-- off64_t offset = 0;
-+ uint64_t offset = 0;
- CSingleLock lock(gNfsConnection);
-
- if (gNfsConnection.GetNfsContext() == NULL || m_pFileHandle == NULL) return 0;
-@@ -577,7 +577,7 @@
-
- if (m_pFileHandle == NULL || m_pNfsContext == NULL ) return 0;
-
-- numberOfBytesRead = gNfsConnection.GetImpl()->nfs_read(m_pNfsContext, m_pFileHandle, (size_t)uiBufSize, (char *)lpBuf);
-+ numberOfBytesRead = gNfsConnection.GetImpl()->nfs_read(m_pNfsContext, m_pFileHandle, uiBufSize, (char *)lpBuf);
-
- lock.Leave();//no need to keep the connection lock after that
-
-@@ -595,7 +595,7 @@
- int64_t CFileNFS::Seek(int64_t iFilePosition, int iWhence)
- {
- int ret = 0;
-- off64_t offset = 0;
-+ uint64_t offset = 0;
-
- CSingleLock lock(gNfsConnection);
- if (m_pFileHandle == NULL || m_pNfsContext == NULL) return -1;
-@@ -657,7 +657,7 @@
- //write chunk
- writtenBytes = gNfsConnection.GetImpl()->nfs_write(m_pNfsContext,
- m_pFileHandle,
-- (size_t)chunkSize,
-+ chunkSize,
- (char *)lpBuf + numberOfBytesWritten);
- //decrease left bytes
- leftBytes-= writtenBytes;
-diff -Naur a/xbmc/filesystem//FileNFS.h b/xbmc/filesystem//FileNFS.h
---- a/xbmc/filesystem//FileNFS.h 2012-07-11 21:58:21.000000000 +0200
-+++ b/xbmc/filesystem//FileNFS.h 2012-07-31 15:52:40.706988663 +0200
-@@ -65,8 +65,8 @@
- ~CNfsConnection();
- bool Connect(const CURL &url, CStdString &relativePath);
- struct nfs_context *GetNfsContext(){return m_pNfsContext;}
-- size_t GetMaxReadChunkSize(){return m_readChunkSize;}
-- size_t GetMaxWriteChunkSize(){return m_writeChunkSize;}
-+ uint64_t GetMaxReadChunkSize(){return m_readChunkSize;}
-+ uint64_t GetMaxWriteChunkSize(){return m_writeChunkSize;}
- DllLibNfs *GetImpl(){return m_pLibNfs;}
- std::list<CStdString> GetExportList(const CURL &url);
- //this functions splits the url into the exportpath (feed to mount) and the rest of the path
-@@ -96,8 +96,8 @@
- CStdString m_exportPath;//current connected export path
- CStdString m_hostName;//current connected host
- CStdString m_resolvedHostName;//current connected host - as ip
-- size_t m_readChunkSize;//current read chunksize of connected server
-- size_t m_writeChunkSize;//current write chunksize of connected server
-+ uint64_t m_readChunkSize;//current read chunksize of connected server
-+ uint64_t m_writeChunkSize;//current write chunksize of connected server
- int m_OpenConnections;//number of open connections
- unsigned int m_IdleTimeout;//timeout for idle connection close and dyunload
- tFileKeepAliveMap m_KeepAliveTimeouts;//mapping filehandles to its idle timeout
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/480_fix_for_froyo.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/480_fix_for_froyo.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,52 @@
+diff --git a/configure.in b/configure.in
+index 722e30b..402bf29 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1865,6 +1865,7 @@ if test "x$use_gstreamer" != "xno"; then
+ INCLUDES="$INCLUDES $GSTREAMER_CFLAGS $GSTREAMER_BASE_CFLAGS $GSTREAMER_PLUGINS_BASE_CFLAGS"
+ LIBS="$LIBS $GSTREAMER_LIBS $GSTREAMER_BASE_LIBS $GSTREAMER_PLUGINS_BASE_LIBS"
+ USE_GSTREAMER=1
++ XB_ADD_PLAYER([GSTPLAYER], [gstplayer])
+ AC_DEFINE([HAVE_LIBGSTREAMER], [1], [Define to 1 if you have the 'GStreamer' library.])
+ else
+ if test "x$use_gstreamer" = "xyes"; then
+diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+index 111e282..b76c990 100644
+--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+@@ -683,7 +688,7 @@ void CLinuxRendererGLES::LoadShaders(int field)
+ // Try GLSL shaders if supported and user requested auto or GLSL.
+ if (glCreateProgram)
+ {
+- if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_EGLIMG)
++ if (m_format == RENDER_FMT_EGLIMG)
+ {
+ m_pYUVShader = new EGLImageExternalShader();
+ CLog::Log(LOGNOTICE, "GL: Selecting eglImage shader");
+diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
+index cf45e72..950ee8c 100644
+--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
+@@ -610,7 +610,7 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
+ if (timestamp != 0.0)
+ {
+ /* wait untill render thread have flipped buffers */
+- timeout = m_presenttime + 1.0;
++ double timeout = m_presenttime + 1.0;
+ while(m_presentstep == PRESENT_FLIP && !bStop)
+ {
+ if(!m_presentevent.WaitMSec(100) && GetPresentTime() > timeout && !bStop)
+diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
+index 270085c..a2c39af 100644
+--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
+@@ -21,6 +21,7 @@
+ */
+
+ #include "system.h"
++#include "system_gl.h"
+ #include "threads/SingleLock.h"
+
+ #include <vector>
+
+
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/490_gstplayer-fix.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/490_gstplayer-fix.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,116 @@
+diff --git a/configure.in b/configure.in
+index 402bf29..db27a3f 100644
+--- a/configure.in
++++ b/configure.in
+@@ -505,7 +505,7 @@ AC_ARG_ENABLE([libcap],
+
+ AC_ARG_ENABLE([player],
+ [AS_HELP_STRING([--enable-player],
+- [enable additional players from a list of comma separated names, (default is none, choices are amlplayer, omxplayer)])],
++ [enable additional players from a list of comma separated names, (default is none, choices are amlplayer, omxplayer, gstplayer)])],
+ [add_players=$enableval],
+ [add_players=no])
+
+diff --git a/xbmc/cores/gstplayer/GstPlayer.cpp b/xbmc/cores/gstplayer/GstPlayer.cpp
+index 365f1b4..37a7338 100644
+--- a/xbmc/cores/gstplayer/GstPlayer.cpp
++++ b/xbmc/cores/gstplayer/GstPlayer.cpp
+@@ -55,6 +55,7 @@
+ #include "dialogs/GUIDialogKaiToast.h"
+ #include "utils/StringUtils.h"
+ #include "Util.h"
++#include "URL.h"
+ #include "DVDInputStreams/DVDInputStream.h"
+ #include "DVDInputStreams/DVDInputStreamFile.h"
+ #include "DVDInputStreams/DVDFactoryInputStream.h"
+@@ -893,7 +894,7 @@ CCriticalSection TIRawVideoEGLImageHandle::m_monitorLock;
+
+ CGstPlayer::CGstPlayer(IPlayerCallback& callback)
+ : IPlayer(callback),
+- CThread(),
++ CThread("CGstPlayer"),
+ m_ready(true)
+ {
+ m_bStop = true;
+@@ -1087,15 +1088,13 @@ int CGstPlayer::OutputPicture(GstBuffer * gstbuffer)
+ }
+
+ if (pPicture->eglImageHandle) {
+- pPicture->format = DVDVideoPicture::FMT_EGLIMG;
+- flags = CONF_FLAGS_FORMAT_EGLIMG;
++ pPicture->format = RENDER_FMT_EGLIMG;
+ } else if (format==GST_STR_FOURCC("NV12")) {
+ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
+ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
+ pPicture->iLineSize[0] = pPicture->iWidth;
+ pPicture->iLineSize[1] = pPicture->iWidth;
+- pPicture->format = DVDVideoPicture::FMT_NV12;
+- flags = CONF_FLAGS_FORMAT_NV12;
++ pPicture->format = RENDER_FMT_NV12;
+ } else if (format==GST_STR_FOURCC("I420")) {
+ pPicture->data[0] = GST_BUFFER_DATA(gstbuffer);
+ pPicture->data[1] = GST_BUFFER_DATA(gstbuffer)+m_output.width*m_output.height;
+@@ -1103,8 +1102,7 @@ int CGstPlayer::OutputPicture(GstBuffer * gstbuffer)
+ pPicture->iLineSize[0] = pPicture->iWidth;
+ pPicture->iLineSize[1] = pPicture->iWidth/2;
+ pPicture->iLineSize[2] = pPicture->iWidth/2;
+- pPicture->format = DVDVideoPicture::FMT_YUV420P;
+- flags = CONF_FLAGS_FORMAT_YV12;
++ pPicture->format = RENDER_FMT_YUV420P;
+ } else {
+ CLog::Log(LOGERROR, "Unsupport output format");
+ return -1;
+@@ -1116,7 +1114,7 @@ int CGstPlayer::OutputPicture(GstBuffer * gstbuffer)
+
+
+ if ((m_output.width!=pPicture->iWidth) || (m_output.height!=pPicture->iHeight)){
+- if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->extended_format))
++ if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->format, pPicture->extended_format, 0))
+ {
+ CLog::Log(LOGNOTICE, "Failed to configure renderer");
+ return -1;
+@@ -1896,7 +1894,7 @@ __int64 CGstPlayer::GetTime()
+ }
+
+ // return length in seconds.. this should be changed to return in milleseconds throughout xbmc
+-int CGstPlayer::GetTotalTime()
++int64_t CGstPlayer::GetTotalTime()
+ {
+ int totaltime = 0;
+ if (m_playbin){
+@@ -1906,7 +1904,7 @@ int CGstPlayer::GetTotalTime()
+ totaltime = duration/1000000000;
+ }
+ //CLog::Log(LOGNOTICE, "---[%s]--- %d", __FUNCTION__, totaltime);
+- return totaltime;
++ return (int64_t)totaltime;
+ }
+
+ void CGstPlayer::SetPlaybackRate(int iSpeed, gint64 pos)
+diff --git a/xbmc/cores/gstplayer/GstPlayer.h b/xbmc/cores/gstplayer/GstPlayer.h
+index aeb6f1a..fe289a6 100644
+--- a/xbmc/cores/gstplayer/GstPlayer.h
++++ b/xbmc/cores/gstplayer/GstPlayer.h
+@@ -96,7 +96,7 @@ public:
+
+ virtual void SeekTime(__int64 iTime);
+ virtual __int64 GetTime();
+- virtual int GetTotalTime();
++ virtual int64_t GetTotalTime();
+ virtual void ToFFRW(int iSpeed);
+ virtual void DoAudioWork() {}
+
+diff --git a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
+index 243627b..1cbb9c9 100644
+--- a/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
++++ b/xbmc/cores/playercorefactory/PlayerCoreFactory.cpp
+@@ -294,7 +294,8 @@ bool CPlayerCoreFactory::LoadConfiguration(TiXmlElement* pConfig, bool clear)
+ #endif
+
+ #if defined(HAS_GSTPLAYER)
+- CPlayerCoreConfig* gstplayer = new CPlayerCoreConfig("GstPlayer", EPC_GSTPLAYER, NULL);
++ CPlayerCoreConfig* gstplayer = new CPlayerCoreConfig("GSTPlayer", EPC_GSTPLAYER, NULL);
++ gstplayer->m_bPlaysAudio = true;
+ gstplayer->m_bPlaysVideo = true;
+ s_vecCoreConfigs.push_back(gstplayer);
+ #endif
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/495_eglimage-fix.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/495_eglimage-fix.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,12 @@
+diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+index b76c990..2ba67af 100644
+--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
+@@ -566,6 +566,7 @@ unsigned int CLinuxRendererGLES::PreInit()
+ #ifdef HAVE_VIDEOTOOLBOXDECODER
+ m_formats.push_back(RENDER_FMT_CVBREF);
+ #endif
++ m_formats.push_back(RENDER_FMT_EGLIMG);
+
+ // setup the background colour
+ m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff;
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/500_SDL_Fix.diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/config/platforms/arm/omap4/packages/xbmc/patches/500_SDL_Fix.diff Fri Mar 29 21:26:50 2013 +0100
@@ -0,0 +1,15 @@
+diff --git a/xbmc/windowing/X11/WinSystemX11GLES.cpp b/xbmc/windowing/X11/WinSystemX11GLES.cpp
+index 26f763a..bfddbb9 100644
+--- a/xbmc/windowing/X11/WinSystemX11GLES.cpp
++++ b/xbmc/windowing/X11/WinSystemX11GLES.cpp
+@@ -160,8 +160,8 @@ bool CWinSystemX11GLES::CreateNewWindow(const CStdString& name, bool fullScreen,
+
+ CTexture iconTexture;
+ iconTexture.LoadFromFile("special://xbmc/media/icon.png");
+
+- SDL_WM_SetIcon(SDL_CreateRGBSurfaceFrom(iconTexture.GetPixels(), iconTexture.GetWidth(), iconTexture.GetHeight(), BPP, iconTexture.GetPitch(), 0xff0000, 0x00ff00, 0x0000ff, 0xff000000L), NULL);
++ SDL_WM_SetIcon(SDL_CreateRGBSurfaceFrom(iconTexture.GetPixels(), 256, 256, BPP, 256, 0xff0000, 0x00ff00, 0x0000ff, 0xff000000), NULL);
+ SDL_WM_SetCaption("XBMC Media Center", NULL);
+
+ m_bWindowCreated = true;
+
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/506_build-native-texturepacker.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/506_build-native-texturepacker.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-diff -Naur c/tools/TexturePacker/Makefile.in d/tools/TexturePacker/Makefile.in
---- c/tools/TexturePacker/Makefile.in 2012-07-11 21:58:21.000000000 +0200
-+++ d/tools/TexturePacker/Makefile.in 2012-10-28 13:32:40.000000000 +0100
-@@ -3,26 +3,25 @@
- DEFINES += -DHOST_BIGENDIAN
- endif
-
--CXXFLAGS+= \
-- -I. \
-- -I@abs_top_srcdir@/lib \
-- -I@abs_top_srcdir@/xbmc \
-- -I@abs_top_srcdir@/xbmc/linux
--
- ifeq (@USE_TEXTUREPACKER_NATIVE@,1)
- NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@
- ifdef NATIVE_ROOT_PATH
-+CXXFLAGS = -I$(NATIVE_ROOT_PATH)/include
-+LIBS = -L$(NATIVE_ROOT_PATH)/lib
-+endif
- ifeq ($(findstring osx,@ARCH@),osx)
- CXXFLAGS+= -m32
- endif
--CXXFLAGS+= -I$(NATIVE_ROOT_PATH)/include
--LIBS += -L$(NATIVE_ROOT_PATH)/lib
--endif
- LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native
- else
- LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish
- endif
-
-+CXXFLAGS+= \
-+ -I. \
-+ -I@abs_top_srcdir@/lib \
-+ -I@abs_top_srcdir@/xbmc \
-+ -I@abs_top_srcdir@/xbmc/linux
-+LIBS += -lSDL_image -lSDL -llzo2 -lpthread -ljpeg -lpng -lz
--LIBS += -lSDL_image -lSDL -llzo2
-
- SRCS = \
-
diff -r 2e65fa4f618b -r 70cac56d15b9 config/platforms/arm/omap4/packages/xbmc/patches/600_nyxboard-tweaks.diff
--- a/config/platforms/arm/omap4/packages/xbmc/patches/600_nyxboard-tweaks.diff Thu Mar 28 07:37:37 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-diff -Naur xbmc-pvr-20120711-git71d53d1/system/peripherals.xml xbmc-pvr-20120711-git71d53d1a/system/peripherals.xml
---- xbmc-pvr-20120711-git71d53d1/system/peripherals.xml 2012-07-11 12:59:17.000000000 -0700
-+++ xbmc-pvr-20120711-git71d53d1a/system/peripherals.xml 2012-10-23 21:55:21.546203259 -0700
-@@ -2,11 +2,11 @@
- <peripheral vendor_product="1915:003B,22B8:003B" bus="usb" name="Motorola Nyxboard Hybrid" mapTo="nyxboard">
- <setting key="do_not_use_custom_keymap" type="bool" value="0" label="35009" order="1" />
- <setting key="keymap" value="nyxboard" label="35007" configurable="0" />
-- <setting key="enable_flip_commands" type="bool" value="1" label="36005" order="2" />
-+ <setting key="enable_flip_commands" type="bool" value="0" label="36005" order="2" />
- <setting key="flip_keyboard" value="XBMC.VideoLibrary.Search" label="36002" order="3" />
- <setting key="flip_remote" value="Dialog.Close(virtualkeyboard)" label="36003" order="4" />
- <setting key="key_user" value="" label="36004" order="5" />
-- <setting key="key_power" value="XBMC.ShutDown()" label="13015" order="6" />
-+ <setting key="key_power" value="ActivateWindow(shutdownmenu)" label="13015" order="6" />
- </peripheral>
-
- <peripheral vendor_product="2548:1001" bus="usb" name="Pulse-Eight CEC Adapter" mapTo="cec">
diff -r 2e65fa4f618b -r 70cac56d15b9 packages/xbmc/build
--- a/packages/xbmc/build Thu Mar 28 07:37:37 2013 +0100
+++ b/packages/xbmc/build Fri Mar 29 21:26:50 2013 +0100
@@ -63,6 +63,10 @@
fi
fi

+if [ "$TARGET_MACHINE" = pandaboard ]; then
+ EXTRA_CONFIG="$EXTRA_CONFIG --enable-player=gstplayer"
+fi
+
if [ "$FPU_OPTIMIZATIONS" = "neon" -o "$FPU_OPTIMIZATIONS" = "neon-vfp4" ]; then
EXTRA_CONFIG="$EXTRA_CONFIG --enable-neon"
fi

Thomas Genty

unread,
Mar 29, 2013, 4:30:14 PM3/29/13
to openbrick...@googlegroups.com
Le 29/03/2013 21:27, h...@openbricks.org a �crit :
> changeset 70cac56d15b9 in /var/www/hg/openbricks
> author: Thomas Genty<toml...@openbricks.org>
> details:http://hg.openbricks.org/openbricks?cmd=changeset;node=70cac56d15b9
> description:
> [panda] xbmc : bump version to 12.1
some patches are from Milan Babel

Tom
Reply all
Reply to author
Forward
0 new messages