From ca2df8933fef56800021702e74f04d642754a89c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 20:58:42 +0200 Subject: [PATCH 01/32] xorg-server: update to xorg-server-1.12.4 Signed-off-by: Stephan Raue --- packages/x11/xserver/xorg-server/meta | 2 +- ..._pkg_config.patch => xorg-server-1.12.4-05_pkg_config.patch} | 0 ...t_radeon.patch => xorg-server-1.12.4-14-detect_radeon.patch} | 0 ...tch => xorg-server-1.12.4-20_extra_modelines_fromxorg.patch} | 0 ...le_fixes.patch => xorg-server-1.12.4-81-compile_fixes.patch} | 0 5 files changed, 1 insertion(+), 1 deletion(-) rename packages/x11/xserver/xorg-server/patches/{xorg-server-1.12.3-05_pkg_config.patch => xorg-server-1.12.4-05_pkg_config.patch} (100%) rename packages/x11/xserver/xorg-server/patches/{xorg-server-1.12.3-14-detect_radeon.patch => xorg-server-1.12.4-14-detect_radeon.patch} (100%) rename packages/x11/xserver/xorg-server/patches/{xorg-server-1.12.3-20_extra_modelines_fromxorg.patch => xorg-server-1.12.4-20_extra_modelines_fromxorg.patch} (100%) rename packages/x11/xserver/xorg-server/patches/{xorg-server-1.12.3-81-compile_fixes.patch => xorg-server-1.12.4-81-compile_fixes.patch} (100%) diff --git a/packages/x11/xserver/xorg-server/meta b/packages/x11/xserver/xorg-server/meta index 8777e07bb78..da38761fad2 100644 --- a/packages/x11/xserver/xorg-server/meta +++ b/packages/x11/xserver/xorg-server/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xorg-server" -PKG_VERSION="1.12.3" +PKG_VERSION="1.12.4" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-05_pkg_config.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-05_pkg_config.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-05_pkg_config.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-05_pkg_config.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-14-detect_radeon.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-14-detect_radeon.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-14-detect_radeon.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-14-detect_radeon.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-20_extra_modelines_fromxorg.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-20_extra_modelines_fromxorg.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-20_extra_modelines_fromxorg.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-20_extra_modelines_fromxorg.patch diff --git a/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-81-compile_fixes.patch b/packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-81-compile_fixes.patch similarity index 100% rename from packages/x11/xserver/xorg-server/patches/xorg-server-1.12.3-81-compile_fixes.patch rename to packages/x11/xserver/xorg-server/patches/xorg-server-1.12.4-81-compile_fixes.patch From 5200947deafeaacb255decc6c8b476a767bff553 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 20:59:49 +0200 Subject: [PATCH 02/32] xf86-video-intel: update to xf86-video-intel-2.20.5 Signed-off-by: Stephan Raue --- packages/x11/driver/xf86-video-intel/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/driver/xf86-video-intel/meta b/packages/x11/driver/xf86-video-intel/meta index 0621216fbbf..fe11d5e6265 100644 --- a/packages/x11/driver/xf86-video-intel/meta +++ b/packages/x11/driver/xf86-video-intel/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xf86-video-intel" -PKG_VERSION="2.20.4" +PKG_VERSION="2.20.5" PKG_REV="1" PKG_ARCH="i386 x86_64" PKG_LICENSE="OSS" From b895d13145c41923bd0f37c0ae712d54d37a7d6a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:10:45 +0200 Subject: [PATCH 03/32] gdk-pixbuf: update to gdk-pixbuf-2.26.3 Signed-off-by: Stephan Raue --- packages/x11/toolkits/gdk-pixbuf/meta | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/x11/toolkits/gdk-pixbuf/meta b/packages/x11/toolkits/gdk-pixbuf/meta index febb29cb34e..2d3aa572dcc 100644 --- a/packages/x11/toolkits/gdk-pixbuf/meta +++ b/packages/x11/toolkits/gdk-pixbuf/meta @@ -19,12 +19,12 @@ ################################################################################ PKG_NAME="gdk-pixbuf" -PKG_VERSION="2.24.1" +PKG_VERSION="2.26.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="OSS" PKG_SITE="http://www.gtk.org/" -PKG_URL="http://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/2.24/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_URL="http://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/2.26/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_DEPENDS="glib" PKG_BUILD_DEPENDS="toolchain glib libjpeg-turbo libpng jasper" PKG_PRIORITY="optional" From 9ce867cbfb049040738fdda94050b7fa1f428edc Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:11:16 +0200 Subject: [PATCH 04/32] busybox: add upstream patches Signed-off-by: Stephan Raue --- .../patches/busybox-1.20.2-kernel_ver.patch | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch diff --git a/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch b/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch new file mode 100644 index 00000000000..456fb08e110 --- /dev/null +++ b/packages/sysutils/busybox/patches/busybox-1.20.2-kernel_ver.patch @@ -0,0 +1,25 @@ +--- busybox-1.20.2/libbb/kernel_version.c ++++ busybox-1.20.2-kernel_ver/libbb/kernel_version.c +@@ -20,18 +20,15 @@ + int FAST_FUNC get_linux_version_code(void) + { + struct utsname name; +- char *s; ++ char *s, *t; + int i, r; + +- if (uname(&name) == -1) { +- bb_perror_msg("can't get system information"); +- return 0; +- } +- ++ uname(&name); /* never fails */ + s = name.release; + r = 0; + for (i = 0; i < 3; i++) { +- r = r * 256 + atoi(strtok(s, ".")); ++ t = strtok(s, "."); ++ r = r * 256 + (t ? atoi(t) : 0); + s = NULL; + } + return r; From 7d931cc308629b9269b7cd64dafd38a321b39941 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:12:14 +0200 Subject: [PATCH 05/32] nasm: update to nasm-2.10.04 Signed-off-by: Stephan Raue --- packages/toolchain/lang/nasm/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolchain/lang/nasm/meta b/packages/toolchain/lang/nasm/meta index cbe9565a7d1..835e3605075 100644 --- a/packages/toolchain/lang/nasm/meta +++ b/packages/toolchain/lang/nasm/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="nasm" -PKG_VERSION="2.10.03" +PKG_VERSION="2.10.04" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 1fdc35a5b1183bbc80ae9b99444828ed511948c8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:12:55 +0200 Subject: [PATCH 06/32] cmake: update to cmake-2.8.9 Signed-off-by: Stephan Raue --- packages/toolchain/devel/cmake/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolchain/devel/cmake/meta b/packages/toolchain/devel/cmake/meta index 6818e15f181..e736fae1307 100644 --- a/packages/toolchain/devel/cmake/meta +++ b/packages/toolchain/devel/cmake/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="cmake" -PKG_VERSION="2.8.8" +PKG_VERSION="2.8.9" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD" From 9b436e1284510632521ca163a5803c0ca9a43a88 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:13:31 +0200 Subject: [PATCH 07/32] mysql: update to mysql-5.1.65 Signed-off-by: Stephan Raue --- packages/databases/mysql/meta | 2 +- ...osscompiling.patch => mysql-5.1.65-010_crosscompiling.patch} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/databases/mysql/patches/{mysql-5.1.63-010_crosscompiling.patch => mysql-5.1.65-010_crosscompiling.patch} (100%) diff --git a/packages/databases/mysql/meta b/packages/databases/mysql/meta index b3541251a33..ea7076e8636 100644 --- a/packages/databases/mysql/meta +++ b/packages/databases/mysql/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="mysql" -PKG_VERSION="5.1.63" +PKG_VERSION="5.1.65" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="LGPL" diff --git a/packages/databases/mysql/patches/mysql-5.1.63-010_crosscompiling.patch b/packages/databases/mysql/patches/mysql-5.1.65-010_crosscompiling.patch similarity index 100% rename from packages/databases/mysql/patches/mysql-5.1.63-010_crosscompiling.patch rename to packages/databases/mysql/patches/mysql-5.1.65-010_crosscompiling.patch From d4f9a02a8678b898c4aada58d61571b9e1a03313 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:13:58 +0200 Subject: [PATCH 08/32] libaacs: update to libaacs-0.5.0 Signed-off-by: Stephan Raue --- packages/multimedia/libaacs/meta | 2 +- ...aacs-0.4.0-bison_2.6.patch => libaacs-0.5.0-bison_2.6.patch} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/multimedia/libaacs/patches/{libaacs-0.4.0-bison_2.6.patch => libaacs-0.5.0-bison_2.6.patch} (100%) diff --git a/packages/multimedia/libaacs/meta b/packages/multimedia/libaacs/meta index 3a278677ff8..934e1e51770 100644 --- a/packages/multimedia/libaacs/meta +++ b/packages/multimedia/libaacs/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libaacs" -PKG_VERSION="0.4.0" +PKG_VERSION="0.5.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/multimedia/libaacs/patches/libaacs-0.4.0-bison_2.6.patch b/packages/multimedia/libaacs/patches/libaacs-0.5.0-bison_2.6.patch similarity index 100% rename from packages/multimedia/libaacs/patches/libaacs-0.4.0-bison_2.6.patch rename to packages/multimedia/libaacs/patches/libaacs-0.5.0-bison_2.6.patch From 28d71821e6812884077c9168e22bf1d8c748e581 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:21:08 +0200 Subject: [PATCH 09/32] gdb: update to gdb-7.5 Signed-off-by: Stephan Raue --- packages/debug/gdb/meta | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/debug/gdb/meta b/packages/debug/gdb/meta index d411673cb9c..f8a6f27f33d 100644 --- a/packages/debug/gdb/meta +++ b/packages/debug/gdb/meta @@ -19,13 +19,13 @@ ################################################################################ PKG_NAME="gdb" -PKG_VERSION="7.4.50.20120716" +PKG_VERSION="7.5" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.gnu.org/software/gdb/" -#PKG_URL="http://ftp.gnu.org/gnu/gdb/$PKG_NAME-$PKG_VERSION.tar.bz2" -PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" +PKG_URL="http://ftp.gnu.org/gnu/gdb/$PKG_NAME-$PKG_VERSION.tar.bz2" +#PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" PKG_DEPENDS="zlib ncurses expat" PKG_BUILD_DEPENDS="toolchain zlib ncurses expat" PKG_PRIORITY="optional" From c03cef9ccedac76c225977cbeba98927719d2a5b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:21:40 +0200 Subject: [PATCH 10/32] glew: update to glew-1.9.0 Signed-off-by: Stephan Raue --- packages/graphics/glew/meta | 2 +- .../patches/glew-1.7.0-crosscompile.patch | 31 ------------------- 2 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch diff --git a/packages/graphics/glew/meta b/packages/graphics/glew/meta index 286065b2c75..47b37702d58 100644 --- a/packages/graphics/glew/meta +++ b/packages/graphics/glew/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="glew" -PKG_VERSION="1.8.0" +PKG_VERSION="1.9.0" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="BSD" diff --git a/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch b/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch deleted file mode 100644 index 4fac7bebbfd..00000000000 --- a/packages/graphics/glew/patches/glew-1.7.0-crosscompile.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -Naur glew-1.7.0/config/Makefile.linux glew-1.7.0.patch/config/Makefile.linux ---- glew-1.7.0/config/Makefile.linux 2011-08-25 16:17:55.000000000 +0200 -+++ glew-1.7.0.patch/config/Makefile.linux 2012-01-27 18:52:20.764675791 +0100 -@@ -1,15 +1,7 @@ - NAME = $(GLEW_NAME) --CC = cc --LD = cc - PICFLAG = -fPIC - M_ARCH ?= $(shell uname -m) --ifeq (x86_64,${M_ARCH}) --LDFLAGS.EXTRA = -L/usr/X11R6/lib64 --LIBDIR = $(GLEW_DEST)/lib64 --else --LDFLAGS.EXTRA = -L/usr/X11R6/lib - LIBDIR = $(GLEW_DEST)/lib --endif - LDFLAGS.GL = -lXmu -lXi -lGLU -lGL -lXext -lX11 - LDFLAGS.STATIC = -Wl,-Bstatic - LDFLAGS.DYNAMIC = -Wl,-Bdynamic -diff -Naur glew-1.7.0/Makefile glew-1.7.0.patch/Makefile ---- glew-1.7.0/Makefile 2012-01-27 18:50:02.004347735 +0100 -+++ glew-1.7.0.patch/Makefile 2012-01-27 18:50:27.970848891 +0100 -@@ -56,7 +56,7 @@ - - AR = ar - INSTALL = install --STRIP = strip -+STRIP ?= strip - RM = rm -f - LN = ln -sf - ifeq ($(MAKECMDGOALS), debug) From ea6f551848ff2bf63bf8024239e8aba86b1b9b32 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:22:22 +0200 Subject: [PATCH 11/32] libbluray: update to libbluray-0.2.3 Signed-off-by: Stephan Raue --- packages/multimedia/libbluray/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/multimedia/libbluray/meta b/packages/multimedia/libbluray/meta index 55144a00807..fb6bc7d77eb 100644 --- a/packages/multimedia/libbluray/meta +++ b/packages/multimedia/libbluray/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="libbluray" -PKG_VERSION="0.2.2" +PKG_VERSION="0.2.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 4b16b7d0a3eef706fbae412dce928966b73f02ad Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 28 Aug 2012 23:22:56 +0200 Subject: [PATCH 12/32] automake: update to automake-1.12.3 Signed-off-by: Stephan Raue --- packages/toolchain/devel/autotools/automake/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolchain/devel/autotools/automake/meta b/packages/toolchain/devel/autotools/automake/meta index e565d6d4169..21b89ee9f11 100644 --- a/packages/toolchain/devel/autotools/automake/meta +++ b/packages/toolchain/devel/autotools/automake/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="automake" -PKG_VERSION="1.12.2" +PKG_VERSION="1.12.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From 28ef25041c80a37a8a560141fbc61ce3121a5d0a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 2 Sep 2012 13:54:34 +0200 Subject: [PATCH 13/32] xf86-video-intel: update to xf86-video-intel-2.20.6 Signed-off-by: Stephan Raue --- packages/x11/driver/xf86-video-intel/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x11/driver/xf86-video-intel/meta b/packages/x11/driver/xf86-video-intel/meta index fe11d5e6265..13b8aa96035 100644 --- a/packages/x11/driver/xf86-video-intel/meta +++ b/packages/x11/driver/xf86-video-intel/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xf86-video-intel" -PKG_VERSION="2.20.5" +PKG_VERSION="2.20.6" PKG_REV="1" PKG_ARCH="i386 x86_64" PKG_LICENSE="OSS" From 3b5020c88057f306324445ad139cfdf0b7041b0c Mon Sep 17 00:00:00 2001 From: lissyx Date: Sun, 2 Sep 2012 22:41:52 +0200 Subject: [PATCH 14/32] Integrating patch to fix iMon Knob Pad On Raspberry Pi, the iMon Knob Pad is totally unusable, either in mouse or keyboard, because of a bug in the driver that misinterprets relative movements to simulate the mouse or key presses. The patch has been proposed upstream. --- ...Mon-Knob-event-interpretation-issues.patch | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch diff --git a/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch b/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch new file mode 100644 index 00000000000..1f9db714632 --- /dev/null +++ b/packages/linux/patches/linux-3.2.28-999-fix-iMon-Knob-event-interpretation-issues.patch @@ -0,0 +1,59 @@ +From cca7718a9902a4d5cffbf158b5853980a08ef930 Mon Sep 17 00:00:00 2001 +From: Alexandre Lissy +Date: Sun, 2 Sep 2012 20:35:20 +0200 +Subject: [PATCH] fix: iMon Knob event interpretation issues + +Events for the iMon Knob pad where not correctly interpreted, resulting +in buggy mouse movements (cursor going straight out of the screen), key +pad only generating KEY_RIGHT and KEY_DOWN events. A reproducer is: + +int main(int argc, char ** argv) +{ + char rel_x = 0x00; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + rel_x = 0x0f; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + rel_x |= ~0x0f; printf("rel_x:%d @%s:%d\n", rel_x, __FILE__, __LINE__); + + return 0; +} + +(running on x86 or amd64) +$ ./test +rel_x:0 @test.c:6 +rel_x:15 @test.c:7 +rel_x:-1 @test.c:8 + +(running on armv6) +rel_x:0 @test.c:6 +rel_x:15 @test.c:7 +rel_x:255 @test.c:8 + +Forcing the rel_x and rel_y variables as signed char fixes the issue. +--- + drivers/media/rc/imon.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c +index 5dd0386..9d30ca9 100644 +--- a/drivers/media/rc/imon.c ++++ b/drivers/media/rc/imon.c +@@ -1225,7 +1225,7 @@ static u32 imon_panel_key_lookup(u64 code) + static bool imon_mouse_event(struct imon_context *ictx, + unsigned char *buf, int len) + { +- char rel_x = 0x00, rel_y = 0x00; ++ signed char rel_x = 0x00, rel_y = 0x00; + u8 right_shift = 1; + bool mouse_input = true; + int dir = 0; +@@ -1301,7 +1301,7 @@ static void imon_touch_event(struct imon_context *ictx, unsigned char *buf) + static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf) + { + int dir = 0; +- char rel_x = 0x00, rel_y = 0x00; ++ signed char rel_x = 0x00, rel_y = 0x00; + u16 timeout, threshold; + u32 scancode = KEY_RESERVED; + unsigned long flags; +-- +1.7.9.5 + From 0e7f12962148e0ff4454f545a240064be62621a4 Mon Sep 17 00:00:00 2001 From: Gregor Fuis Date: Tue, 28 Aug 2012 23:13:29 +0200 Subject: [PATCH 15/32] xbmc-pvr: update to xbmc-pvr-11.0.2 --- .../mediacenter/xbmc-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc/build | 2 +- packages/mediacenter/xbmc/meta | 6 +- ...mc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch | 13 +- .../xbmc-pvr-11.0.1-801.01-cec-PR570.patch | 1975 ---------- ...1-801.02-cec-fixed_possible_deadlock.patch | 29 - ...is_stopped_before_starting_a_new_one.patch | 41 - .../xbmc-pvr-11.0.1-801.04-cec-PR887.patch | 630 ---- ...-add_support_to_specify_GIT_REV-0.1.patch} | 0 ...vr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch} | 0 ...c-pvr-11.0.2-311-fix_rsxs_build-0.1.patch} | 0 ...-texturepacker-hostflags-and-rework.patch} | 0 ...x_playpause_problem_ticket_7338-0.1.patch} | 0 ...1.0.2-402-enable_yasm_in_ffmpeg-0.1.patch} | 0 ...c-pvr-11.0.2-404-add_lame_check-0.6.patch} | 0 ...ONOPTIMIZE_with_external_Python-0.1.patch} | 0 ...r-11.0.2-452-change_lcd_content-0.1.patch} | 0 ....2-453-add_openelec.tv_RSS_news-0.1.patch} | 0 ...vr-11.0.2-454-disable_backslash-0.1.patch} | 0 ...11.0.2-457-fix_connection_check-0.1.patch} | 0 ...-11.0.2-463-add_remote_devinput-0.1.patch} | 0 ... xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch} | 0 ... xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch} | 0 ...vr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch | 3239 +++++++++++++++++ ...-901.01-ffmpeg-10.2-28b186f.patch.disable} | 0 ....03-ffmpeg_crystalhd_implementation.patch} | 0 ...901.41-avfilter-depends-on-avformat.patch} | 0 ....0.2-902.00-vdpau_reset_pvr_changes.patch} | 0 ...1-xvba_support_vdpau_rework-c633159.patch} | 0 ...-11.0.2-902.02-xvba_support-gcc-4.7.patch} | 0 ...902.03-fix_configure_in_VDPAU_detect.patch | 15 + ...c-pvr-11.0.2-902.11-disable_interop.patch} | 0 ...lete_texture_targets_on_reconfigure.patch} | 0 ...VTS_in_dvd_could_end_up_not_showing.patch} | 0 ...mc-pvr-11.0.2-981-toggleButtonState.patch} | 0 ...t-be-remount-in-DeviceChanged-event.patch} | 0 ...ed-failure-to-broswe-for-smb-shares.patch} | 0 ...ical-devices-in-DeviceChanged-event.patch} | 0 ...atch => xbmc-pvr-11.0.2-990-wiimote.patch} | 0 ...mer_at_suspend_or_hibernate.patch.disable} | 0 ...=> xbmc-pvr-11.0.2-999-crosscompile.patch} | 0 ...1.0.2-999.002-268d6a0-fix_ASIC_hang.patch} | 0 ... xbmc-pvr-11.0.2-999.003-rar-PR1147.patch} | 0 ...2-999.011-airtunes_reapply_lost_fix.patch} | 0 ...tion_for_windows_using_libshairplay.patch} | 0 ...-airtunes-add_dmap_metadata_parsing.patch} | 0 ...r-11.0.2-999.021-libnfs-1.3_support.patch} | 0 ...2-999.055-search-dialogs-workaround.patch} | 0 ....0.2-999.056-remove-broken-scrapers.patch} | 0 49 files changed, 3268 insertions(+), 2684 deletions(-) delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch => xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch => xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch => xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch => xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch => xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch => xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch => xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch => xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch => xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch => xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch => xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch => xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch => xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch => xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch => xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch} (100%) create mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch => xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch => xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch => xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-902.00-vdpau_reset_pvr_changes.patch => xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch => xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch => xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch} (100%) create mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-902.11-disable_interop.patch => xbmc-pvr-11.0.2-902.11-disable_interop.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch => xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch => xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-981-toggleButtonState.patch => xbmc-pvr-11.0.2-981-toggleButtonState.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch => xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch => xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch => xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-990-wiimote.patch => xbmc-pvr-11.0.2-990-wiimote.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch => xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999-crosscompile.patch => xbmc-pvr-11.0.2-999-crosscompile.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch => xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.003-rar-PR1147.patch => xbmc-pvr-11.0.2-999.003-rar-PR1147.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch => xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch => xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch => xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch => xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch => xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.1-999.056-remove-broken-scrapers.patch => xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch} (100%) diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index 5a2d5cbf30d..f7ebd60761d 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -20,7 +20,7 @@ PKG_NAME="xbmc-theme-Confluence" if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.1" + PKG_VERSION="pvr-11.0.2" else PKG_VERSION="11.0.1" fi diff --git a/packages/mediacenter/xbmc/build b/packages/mediacenter/xbmc/build index 946ddd9e805..479f94d1cdf 100755 --- a/packages/mediacenter/xbmc/build +++ b/packages/mediacenter/xbmc/build @@ -172,7 +172,7 @@ fi LDFLAGS=`echo $LDFLAGS | sed -e "s|-Wl,--as-needed||"` # dont build parallel - MAKEFLAGS=-j1 +# MAKEFLAGS=-j1 export PYTHON_VERSION="2.7" export PYTHON_CPPFLAGS="-I$SYSROOT_PREFIX/usr/include/python$PYTHON_VERSION" diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta index 5b72a64b00e..01138582048 100644 --- a/packages/mediacenter/xbmc/meta +++ b/packages/mediacenter/xbmc/meta @@ -20,7 +20,7 @@ PKG_NAME="xbmc" if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.1" + PKG_VERSION="pvr-11.0.2" else PKG_VERSION="11.0.1" fi @@ -29,8 +29,8 @@ PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.xbmc.org" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" -PKG_DEPENDS="boost Python zlib bzip2 systemd pcre ffmpeg alsa-lib libass curl libssh rtmpdump fontconfig freetype libmad libogg libvorbis libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite alsa bc xbmc-addon-settings" -PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre alsa-lib ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libvorbis libcdio libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite mysql" +PKG_DEPENDS="boost Python zlib bzip2 systemd pcre ffmpeg alsa-lib libass curl libssh rtmpdump fontconfig tinyxml freetype libmad libogg libvorbis libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite alsa bc xbmc-addon-settings" +PKG_BUILD_DEPENDS="toolchain boost Python zlib bzip2 systemd lzo pcre alsa-lib ffmpeg libass enca curl libssh rtmpdump fontconfig fribidi tinyxml libjpeg-turbo libpng tiff freetype jasper libmad libsamplerate libogg libvorbis libcdio libmodplug faad2 flac lame libmpeg2 SDL SDL_mixer SDL_image yajl sqlite mysql" PKG_PRIORITY="optional" PKG_SECTION="mediacenter" PKG_SHORTDESC="xbmc: XBMC Mediacenter" diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch index d505fdb2d61..73e25bd3af7 100644 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch @@ -2325,7 +2325,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. } } -@@ -809,20 +768,9 @@ +@@ -809,24 +768,9 @@ { int result, frames; @@ -2333,6 +2333,9 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. - if (frame) { +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); +-#else -#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); -#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) @@ -2342,11 +2345,12 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. -#else - result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); -#endif +-#endif - if (result < 0) { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); -@@ -830,7 +778,13 @@ +@@ -834,7 +778,13 @@ } } @@ -2361,7 +2365,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); return VC_ERROR; -@@ -838,19 +792,9 @@ +@@ -842,19 +792,9 @@ if (frames > 0) { @@ -2383,7 +2387,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. { CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); return VC_ERROR; -@@ -861,11 +805,11 @@ +@@ -865,11 +805,11 @@ else m_pFrame->repeat_pict = -(frames - 1); @@ -2399,6 +2403,7 @@ diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg. if(frames > 1) return VC_PICTURE; + diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h --- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 +++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-06-05 15:19:23.946496292 +0200 diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch deleted file mode 100644 index 0a689551414..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.01-cec-PR570.patch +++ /dev/null @@ -1,1975 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:03:25.176271190 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.1.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:03:25.195271549 +0200 -@@ -2831,6 +2831,7 @@ - Device removed - Keymap to use for this device - Keymap enabled -+ Do not use the custom keymap for this device - - Location - Class -@@ -2845,16 +2846,23 @@ - Press "user" button command - Enable switch side commands - Could not open the adapter -- Power on the TV when starting XBMC -- Power off devices when stopping XBMC -+ Devices to power on the TV when starting XBMC -+ Devices to power off devices when stopping XBMC - Put devices in standby mode when activating screensaver - - Could not detect the CEC port. Set it up manually. -- Could not detect the CEC adapter. -- Unsupported libcec interface version. %d is greater than the version XBMC supports (%d) -+ Could not initialise the CEC adapter. Check your settings. -+ Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) - Put this PC in standby mode when the TV is switched off - HDMI port number - Connected -- Adapter found, but libcec is not available -+ Adapter found, but libCEC is not available - Use the TV's language setting -+ Connected to HDMI device -+ Make XBMC the active source when starting -+ Physical address (overrules HDMI port) -+ COM port (leave empty unless needed) -+ Configuration updated -+ Failed to set the new configuration. Please check your settings. -+ Send 'inactive source' command when stopping XBMC - -diff -Naur xbmc-pvr-11.0.1/lib/libcec/Makefile xbmc-pvr-11.0.1.patch/lib/libcec/Makefile ---- xbmc-pvr-11.0.1/lib/libcec/Makefile 2012-03-27 17:55:40.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/libcec/Makefile 2012-04-17 14:03:25.202271682 +0200 -@@ -7,17 +7,17 @@ - - # lib name, version - LIBNAME=libcec --VERSION=1.2.0 -+VERSION=latest - SOURCE=$(LIBNAME)-$(VERSION) - - # download location and format --BASE_URL=http://mirrors.xbmc.org/build-deps/darwin-libs --ARCHIVE=$(SOURCE).tar.gz -+BASE_URL=http://packages.pulse-eight.net/pulse/sources/libcec -+ARCHIVE=$(SOURCE).tar.bz2 - TARBALLS_LOCATION=. - RETRIEVE_TOOL=/usr/bin/curl - RETRIEVE_TOOL_FLAGS=-Ls --create-dirs --output $(TARBALLS_LOCATION)/$(ARCHIVE) - ARCHIVE_TOOL=tar --ARCHIVE_TOOL_FLAGS=xf -+ARCHIVE_TOOL_FLAGS=jxf - - PREFIX ?= /usr/local - LIBCEC_CONFIGOPTS ?= --prefix=$(PREFIX) -@@ -25,30 +25,30 @@ - # configuration settings - CONFIGURE=./configure CFLAGS=-D_FILE_OFFSET_BITS=64 $(LIBCEC_CONFIGOPTS) - --SO_NAME=$(SOURCE)/.libs/$(LIBNAME).so -+SO_NAME=$(LIBNAME)/.libs/$(LIBNAME).so - - all: $(SO_NAME) - - $(TARBALLS_LOCATION)/$(ARCHIVE): - $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - --$(SOURCE): $(TARBALLS_LOCATION)/$(ARCHIVE) -- rm -rf $(SOURCE) -+$(LIBNAME): $(TARBALLS_LOCATION)/$(ARCHIVE) -+ rm -rf $(LIBNAME) - $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -- echo $(SOURCE) > .gitignore -- cd $(SOURCE); autoreconf -vif -- cd $(SOURCE); $(CONFIGURE) -+ echo $(LIBNAME) > .gitignore -+ cd $(LIBNAME); autoreconf -vif -+ cd $(LIBNAME); $(CONFIGURE) - --$(SO_NAME): $(SOURCE) -- make -j 1 -C $(SOURCE) -+$(SO_NAME): $(LIBNAME) -+ make -j 1 -C $(LIBNAME) - - install: -- make -C $(SOURCE) install -+ make -C $(LIBNAME) install - ldconfig - - clean: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - - distclean:: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:03:25.196271568 +0200 -@@ -1,22 +1,29 @@ - - -- -+ - -- -- -- -- -+ -+ -+ -+ - - -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.cpp xbmc-pvr-11.0.1.patch/xbmc/Application.cpp ---- xbmc-pvr-11.0.1/xbmc/Application.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.cpp 2012-04-17 14:06:37.605914462 +0200 -@@ -160,9 +160,6 @@ - #endif - #include "interfaces/AnnouncementManager.h" - #include "peripherals/Peripherals.h" --#ifdef HAVE_LIBCEC --#include "peripherals/devices/PeripheralCecAdapter.h" --#endif - #include "peripherals/dialogs/GUIDialogPeripheralManager.h" - #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" - -@@ -2618,6 +2615,9 @@ - } - } - -+ if (g_peripherals.OnAction(action)) -+ return true; -+ - if (action.GetID() == ACTION_MUTE) - { - ToggleMute(); -@@ -2893,23 +2893,9 @@ - - bool CApplication::ProcessPeripherals(float frameTime) - { --#ifdef HAVE_LIBCEC -- vector peripherals; -- if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -- { -- for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -- { -- CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -- if (cecDevice && cecDevice->GetButton()) -- { -- CKey key(cecDevice->GetButton(), cecDevice->GetHoldTime()); -- cecDevice->ResetButton(); -- return OnKey(key); -- } -- } -- } --#endif -- -+ CKey key; -+ if (g_peripherals.GetNextKeypress(frameTime, key)) -+ return OnKey(key); - return false; - } - -@@ -3365,7 +3351,8 @@ - { - try - { -- CAnnouncementManager::Announce(System, "xbmc", "OnQuit"); -+ CVariant vExitCode(exitCode); -+ CAnnouncementManager::Announce(System, "xbmc", "OnQuit", vExitCode); - - // cancel any jobs from the jobmanager - CJobManager::GetInstance().CancelJobs(); -@@ -5123,6 +5110,8 @@ - - bool CApplication::IsMuted() const - { -+ if (g_peripherals.IsMuted()) -+ return true; - return g_settings.m_bMute; - } - -@@ -5136,6 +5125,9 @@ - - void CApplication::Mute() - { -+ if (g_peripherals.Mute()) -+ return; -+ - g_settings.m_iPreMuteVolumeLevel = GetVolume(); - SetVolume(0); - g_settings.m_bMute = true; -@@ -5143,6 +5135,9 @@ - - void CApplication::UnMute() - { -+ if (g_peripherals.UnMute()) -+ return; -+ - SetVolume(g_settings.m_iPreMuteVolumeLevel); - g_settings.m_iPreMuteVolumeLevel = 0; - g_settings.m_bMute = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:03:25.211271852 +0200 -@@ -18,8 +18,8 @@ - * http://www.gnu.org/copyleft/gpl.html - * - */ --#include "system.h" - -+#include "system.h" - #if defined(HAVE_LIBCEC) - #include "PeripheralCecAdapter.h" - #include "input/XBIRRemote.h" -@@ -31,36 +31,40 @@ - #include "peripherals/Peripherals.h" - #include "peripherals/bus/PeripheralBus.h" - #include "settings/GUISettings.h" -+#include "settings/Settings.h" - #include "utils/log.h" -+#include "utils/Variant.h" - --#include -+#include - - using namespace PERIPHERALS; - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 1 -+#define CEC_LIB_SUPPORTED_VERSION 0x1500 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -+#define VOLUME_CHANGE_TIMEOUT 250 -+#define VOLUME_REFRESH_TIMEOUT 100 - - class DllLibCECInterface - { - public: - virtual ~DllLibCECInterface() {} -- virtual ICECAdapter* CECInit(const char *interfaceName, cec_device_type_list types)=0; -- virtual void* CECDestroy(ICECAdapter *adapter)=0; -+ virtual ICECAdapter* CECInitialise(libcec_configuration *configuration)=0; -+ virtual void* CECDestroy(ICECAdapter *adapter)=0; - }; - - class DllLibCEC : public DllDynamic, DllLibCECInterface - { - DECLARE_DLL_WRAPPER(DllLibCEC, DLL_PATH_LIBCEC) - -- DEFINE_METHOD2(ICECAdapter*, CECInit, (const char *p1, cec_device_type_list p2)) -- DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) -+ DEFINE_METHOD1(ICECAdapter*, CECInitialise, (libcec_configuration *p1)) -+ DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) - - BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD_RENAME(CECInit, CECInit) -+ RESOLVE_METHOD_RENAME(CECInitialise, CECInitialise) - RESOLVE_METHOD_RENAME(CECDestroy, CECDestroy) - END_METHOD_RESOLVE() - }; -@@ -71,41 +75,19 @@ - m_bStarted(false), - m_bHasButton(false), - m_bIsReady(false), -+ m_bHasConnectedAudioSystem(false), - m_strMenuLanguage("???"), -- m_lastKeypress(0) -+ m_lastKeypress(0), -+ m_lastChange(VOLUME_CHANGE_NONE), -+ m_iExitCode(0), -+ m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC - { - m_button.iButton = 0; - m_button.iDuration = 0; - m_screensaverLastActivated.SetValid(false); -- m_dll = new DllLibCEC; -- if (m_dll->Load() && m_dll->IsLoaded()) -- { -- cec_device_type_list typeList; -- typeList.clear(); -- typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE); -- m_cecAdapter = m_dll->CECInit("XBMC", typeList); -- } -- else -- m_cecAdapter = NULL; -- -- if (!m_cecAdapter || m_cecAdapter->GetMinLibVersion() > CEC_LIB_SUPPORTED_VERSION) -- { -- /* unsupported libcec version */ -- CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); - -- CStdString strMessage; -- strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -- m_bError = true; -- if (m_cecAdapter) -- m_dll->CECDestroy(m_cecAdapter); -- m_cecAdapter = NULL; -- } -- else -- { -- CLog::Log(LOGDEBUG, "%s - using libCEC v%d.%d", __FUNCTION__, m_cecAdapter->GetLibVersionMajor(), m_cecAdapter->GetLibVersionMinor()); -- m_features.push_back(FEATURE_CEC); -- } -+ m_configuration.Clear(); -+ m_features.push_back(FEATURE_CEC); - } - - CPeripheralCecAdapter::~CPeripheralCecAdapter(void) -@@ -117,7 +99,6 @@ - - if (m_dll && m_cecAdapter) - { -- FlushLog(); - m_dll->CECDestroy(m_cecAdapter); - m_cecAdapter = NULL; - delete m_dll; -@@ -129,60 +110,94 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_cecAdapter->SetInactiveView(); -- if (GetSettingBool("cec_power_off_shutdown")) -- m_cecAdapter->StandbyDevices(); -+ m_iExitCode = data.asInteger(0); -+ StopThread(false); - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && GetSettingBool("cec_standby_screensaver") && m_bIsReady) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) - { -- m_cecAdapter->PowerOnDevices(); -+ if (m_configuration.bPowerOffScreensaver == 1) -+ { -+ // power off/on on screensaver is set, and devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); -+ } - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && GetSettingBool("cec_standby_screensaver")) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && m_bIsReady) - { - // Don't put devices to standby if application is currently playing -- if (!g_application.IsPlaying() || g_application.IsPaused()) -+ if ((!g_application.IsPlaying() || g_application.IsPaused()) && m_configuration.bPowerOffScreensaver == 1) - { - m_screensaverLastActivated = CDateTime::GetCurrentDateTime(); -- m_cecAdapter->StandbyDevices(); -+ // only power off when we're the active source -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ m_cecAdapter->StandbyDevices(CECDEVICE_BROADCAST); - } - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { -- if (GetSettingBool("cec_power_off_shutdown") && m_bIsReady) -- m_cecAdapter->StandbyDevices(); -+ // this will also power off devices when we're the active source - CSingleLock lock(m_critSection); - m_bStop = true; - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -+ // reconnect to the device - CSingleLock lock(m_critSection); - CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ -+ // close the previous connection - m_cecAdapter->Close(); - -- CStdString strPort = GetComPort(); -- if (!strPort.empty()) -- { -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__); -- FlushLog(); -- m_bStop = true; -- } -- else -- { -- if (GetSettingBool("cec_power_on_startup")) -- PowerOnCecDevices(CECDEVICE_TV); -- m_cecAdapter->SetActiveView(); -- } -- } -+ // and open a new one -+ m_bStop = false; -+ Create(); - } - } - - bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature) - { -- if (feature == FEATURE_CEC && !m_bStarted) -+ if (feature == FEATURE_CEC && !m_bStarted && GetSettingBool("enabled")) - { -+ SetConfigurationFromSettings(); -+ m_callbacks.CBCecLogMessage = &CecLogMessage; -+ m_callbacks.CBCecKeyPress = &CecKeyPress; -+ m_callbacks.CBCecCommand = &CecCommand; -+ m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_configuration.callbackParam = this; -+ m_configuration.callbacks = &m_callbacks; -+ -+ m_dll = new DllLibCEC; -+ if (m_dll->Load() && m_dll->IsLoaded()) -+ m_cecAdapter = m_dll->CECInitialise(&m_configuration); -+ else -+ return false; -+ -+ if (m_configuration.serverVersion < CEC_LIB_SUPPORTED_VERSION) -+ { -+ /* unsupported libcec version */ -+ CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ -+ CStdString strMessage; -+ strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -+ m_bError = true; -+ if (m_cecAdapter) -+ m_dll->CECDestroy(m_cecAdapter); -+ m_cecAdapter = NULL; -+ -+ m_features.clear(); -+ return false; -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ } -+ - m_bStarted = true; - Create(); - } -@@ -221,23 +236,20 @@ - return strPort; - } - --void CPeripheralCecAdapter::Process(void) -+bool CPeripheralCecAdapter::OpenConnection(void) - { -+ bool bIsOpen(false); -+ - if (!GetSettingBool("enabled")) - { - CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__); - m_bStarted = false; -- return; -+ return bIsOpen; - } - - CStdString strPort = GetComPort(); - if (strPort.empty()) -- return; -- -- // set correct physical address from peripheral settings -- int iHdmiPort = GetSettingInt("cec_hdmi_port"); -- SetHdmiPort(iHdmiPort); -- FlushLog(); -+ return bIsOpen; - - // open the CEC adapter - CLog::Log(LOGDEBUG, "%s - opening a connection to the CEC adapter: %s", __FUNCTION__, strPort.c_str()); -@@ -247,100 +259,221 @@ - strMessage.Format(g_localizeStrings.Get(21336), g_localizeStrings.Get(36000)); - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strMessage); - -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- FlushLog(); -- CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -- m_bStarted = false; -- return; -- } -+ bool bConnectionFailedDisplayed(false); - -- CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -- m_bIsReady = true; -- CAnnouncementManager::AddAnnouncer(this); -- -- if (GetSettingBool("cec_power_on_startup")) -+ while (!m_bStop && !bIsOpen) - { -- PowerOnCecDevices(CECDEVICE_TV); -- FlushLog(); -+ if ((bIsOpen = m_cecAdapter->Open(strPort.c_str(), 10000)) == false) -+ { -+ CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -+ if (!bConnectionFailedDisplayed) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -+ bConnectionFailedDisplayed = true; -+ -+ Sleep(10000); -+ } - } - -- if (GetSettingBool("use_tv_menu_language")) -+ if (bIsOpen) - { -- cec_menu_language language; -- if (m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -- SetMenuLanguage(language.language); -+ CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -+ -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); - } - -- m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(36016)); -+ return bIsOpen; -+} -+ -+void CPeripheralCecAdapter::Process(void) -+{ -+ if (!OpenConnection()) -+ return; -+ -+ CAnnouncementManager::AddAnnouncer(this); -+ -+ m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -+ m_queryThread->Create(false); - - while (!m_bStop) - { -- FlushLog(); - if (!m_bStop) -- ProcessNextCommand(); -+ ProcessVolumeChange(); -+ - if (!m_bStop) - Sleep(5); - } - -+ delete m_queryThread; -+ -+ if (m_iExitCode != EXITCODE_REBOOT) -+ { -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ { -+ if (!m_configuration.powerOffDevices.IsEmpty()) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending standby commands", __FUNCTION__); -+ m_cecAdapter->StandbyDevices(); -+ } -+ else if (m_configuration.bSendInactiveSource == 1) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__); -+ m_cecAdapter->SetInactiveView(); -+ } -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - XBMC is not the active source, not sending any standby commands", __FUNCTION__); -+ } -+ } -+ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); - m_bStarted = false; - } - --bool CPeripheralCecAdapter::PowerOnCecDevices(cec_logical_address iLogicalAddress) -+bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) - { -- bool bReturn(false); -+ CSingleLock lock(m_critSection); -+ return m_bHasConnectedAudioSystem; -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::SetAudioSystemConnected(bool bSetTo) -+{ -+ CSingleLock lock(m_critSection); -+ m_bHasConnectedAudioSystem = bSetTo; -+} -+ -+void CPeripheralCecAdapter::ScheduleVolumeUp(void) -+{ - { -- CLog::Log(LOGDEBUG, "%s - powering on CEC capable device with address %1x", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->PowerOnDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+ Sleep(5); -+} - -- return bReturn; -+void CPeripheralCecAdapter::ScheduleVolumeDown(void) -+{ -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } -+ Sleep(5); - } - --bool CPeripheralCecAdapter::StandbyCecDevices(cec_logical_address iLogicalAddress) -+void CPeripheralCecAdapter::ScheduleMute(void) - { -- bool bReturn(false); -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); -+ } -+ Sleep(5); -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::ProcessVolumeChange(void) -+{ -+ bool bSendRelease(false); -+ CecVolumeChange pendingVolumeChange = VOLUME_CHANGE_NONE; - { -- CLog::Log(LOGDEBUG, "%s - putting CEC capable devices with address %1x in standby mode", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->StandbyDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ if (m_volumeChangeQueue.size() > 0) -+ { -+ /* get the first change from the queue */ -+ pendingVolumeChange = m_volumeChangeQueue.front(); -+ m_volumeChangeQueue.pop(); -+ -+ /* remove all dupe entries */ -+ while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange) -+ m_volumeChangeQueue.pop(); -+ -+ /* send another keypress after VOLUME_REFRESH_TIMEOUT ms */ -+ bool bRefresh(m_lastKeypress + VOLUME_REFRESH_TIMEOUT < XbmcThreads::SystemClockMillis()); -+ -+ /* only send the keypress when it hasn't been sent yet */ -+ if (pendingVolumeChange != m_lastChange) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ m_lastChange = pendingVolumeChange; -+ } -+ else if (bRefresh) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ pendingVolumeChange = m_lastChange; -+ } -+ else -+ pendingVolumeChange = VOLUME_CHANGE_NONE; -+ } -+ else if (m_lastKeypress > 0 && m_lastKeypress + VOLUME_CHANGE_TIMEOUT < XbmcThreads::SystemClockMillis()) -+ { -+ /* send a key release */ -+ m_lastKeypress = 0; -+ bSendRelease = true; -+ m_lastChange = VOLUME_CHANGE_NONE; -+ } - } - -- return bReturn; -+ switch (pendingVolumeChange) -+ { -+ case VOLUME_CHANGE_UP: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_UP, false); -+ break; -+ case VOLUME_CHANGE_DOWN: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_DOWN, false); -+ break; -+ case VOLUME_CHANGE_MUTE: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_MUTE, false); -+ { -+ CSingleLock lock(m_critSection); -+ m_bIsMuted = !m_bIsMuted; -+ } -+ break; -+ case VOLUME_CHANGE_NONE: -+ if (bSendRelease) -+ m_cecAdapter->SendKeyRelease(CECDEVICE_AUDIOSYSTEM, false); -+ break; -+ } - } - --bool CPeripheralCecAdapter::SendPing(void) -+void CPeripheralCecAdapter::VolumeUp(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- CLog::Log(LOGDEBUG, "%s - sending ping to the CEC adapter", __FUNCTION__); -- bReturn = m_cecAdapter->PingAdapter(); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+} - -- return bReturn; -+void CPeripheralCecAdapter::VolumeDown(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } - } - --bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort) -+void CPeripheralCecAdapter::Mute(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- if (iHdmiPort <= 0 || iHdmiPort > 16) -- iHdmiPort = 1; -- CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d", __FUNCTION__, iHdmiPort); -- bReturn = m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); - } -+} - -- return bReturn; -+bool CPeripheralCecAdapter::IsMuted(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ return m_bIsMuted; -+ } -+ return false; - } - - void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage) -@@ -404,10 +537,13 @@ - CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage); - } - --void CPeripheralCecAdapter::ProcessNextCommand(void) -+int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command &command) - { -- cec_command command; -- if (m_cecAdapter && m_bIsReady && m_cecAdapter->GetNextCommand(&command)) -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ if (adapter->m_bIsReady) - { - CLog::Log(LOGDEBUG, "%s - processing command: initiator=%1x destination=%1x opcode=%02x", __FUNCTION__, command.initiator, command.destination, command.opcode); - -@@ -416,21 +552,21 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && GetSettingBool("standby_pc_on_tv_standby") && -- (!m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) -+ if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { -- m_bStarted = false; -+ adapter->m_bStarted = false; - g_application.getApplicationMessenger().Suspend(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -- if (GetSettingBool("use_tv_menu_language") && command.initiator == CECDEVICE_TV && command.parameters.size == 3) -+ if (adapter->m_configuration.bUseTVMenuLanguage == 1 && command.initiator == CECDEVICE_TV && command.parameters.size == 3) - { - char strNewLanguage[4]; - for (int iPtr = 0; iPtr < 3; iPtr++) - strNewLanguage[iPtr] = command.parameters[iPtr]; - strNewLanguage[3] = 0; -- SetMenuLanguage(strNewLanguage); -+ adapter->SetMenuLanguage(strNewLanguage); - } - break; - case CEC_OPCODE_DECK_CONTROL: -@@ -438,11 +574,11 @@ - command.parameters.size == 1 && - command.parameters[0] == CEC_DECK_CONTROL_MODE_STOP) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_STOP; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - break; - case CEC_OPCODE_PLAY: -@@ -451,26 +587,58 @@ - { - if (command.parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PLAY; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - else if (command.parameters[0] == CEC_PLAY_MODE_PLAY_STILL) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PAUSE; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - } - break; -+ case CEC_OPCODE_REPORT_POWER_STATUS: -+ if (command.initiator == CECDEVICE_TV && -+ command.parameters.size == 1 && -+ command.parameters[0] == CEC_POWER_STATUS_ON && -+ adapter->m_queryThread) -+ { -+ adapter->m_queryThread->Signal(); -+ } -+ break; - default: - break; - } - } -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration &config) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->SetConfigurationFromLibCEC(config); -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->m_buttonQueue.push(key); -+ return 1; - } - - bool CPeripheralCecAdapter::GetNextCecKey(cec_keypress &key) -@@ -483,10 +651,6 @@ - m_buttonQueue.pop(); - bReturn = true; - } -- else if (m_cecAdapter->GetNextKeypress(&key)) -- { -- bReturn = true; -- } - - return bReturn; - } -@@ -726,41 +890,43 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else if (strChangedSetting.Equals("cec_hdmi_port")) -+ else - { -- SetHdmiPort(GetSettingInt("cec_hdmi_port")); -+ SetConfigurationFromSettings(); -+ m_queryThread->UpdateConfiguration(&m_configuration); - } - } - --void CPeripheralCecAdapter::FlushLog(void) -+int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) - { -- cec_log_message message; -- while (m_cecAdapter && m_cecAdapter->GetNextLogMessage(&message)) -- { -- int iLevel = -1; -- switch (message.level) -- { -- case CEC_LOG_ERROR: -- iLevel = LOGERROR; -- break; -- case CEC_LOG_WARNING: -- iLevel = LOGWARNING; -- break; -- case CEC_LOG_NOTICE: -- iLevel = LOGDEBUG; -- break; -- case CEC_LOG_TRAFFIC: -- case CEC_LOG_DEBUG: -- if (GetSettingBool("cec_debug_logging")) -- iLevel = LOGDEBUG; -- break; -- default: -- break; -- } -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; - -- if (iLevel >= 0) -- CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ int iLevel = -1; -+ switch (message.level) -+ { -+ case CEC_LOG_ERROR: -+ iLevel = LOGERROR; -+ break; -+ case CEC_LOG_WARNING: -+ iLevel = LOGWARNING; -+ break; -+ case CEC_LOG_NOTICE: -+ iLevel = LOGDEBUG; -+ break; -+ case CEC_LOG_TRAFFIC: -+ case CEC_LOG_DEBUG: -+ iLevel = LOGDEBUG; -+ break; -+ default: -+ break; - } -+ -+ if (iLevel >= 0) -+ CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ -+ return 1; - } - - bool CPeripheralCecAdapter::TranslateComPort(CStdString &strLocation) -@@ -774,4 +940,301 @@ - - return false; - } -+ -+void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configuration &config) -+{ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ m_configuration.deviceTypes.Add(config.deviceTypes[0]); -+ SetSetting("device_type", (int)config.deviceTypes[0]); -+ -+ // set the connected device -+ m_configuration.baseDevice = config.baseDevice; -+ SetSetting("connected_device", (int)config.baseDevice); -+ -+ // set the HDMI port number -+ m_configuration.iHDMIPort = config.iHDMIPort; -+ SetSetting("cec_hdmi_port", config.iHDMIPort); -+ -+ // set the physical address, when baseDevice or iHDMIPort are not set -+ if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ { -+ m_configuration.iPhysicalAddress = config.iPhysicalAddress; -+ CStdString strPhysicalAddress; -+ strPhysicalAddress.Format("%x", config.iPhysicalAddress); -+ SetSetting("physical_address", strPhysicalAddress); -+ } -+ -+ // set the tv vendor override -+ m_configuration.tvVendor = config.tvVendor; -+ SetSetting("tv_vendor", (int)config.tvVendor); -+ -+ // set the devices to wake when starting -+ m_configuration.wakeDevices = config.wakeDevices; -+ CStdString strWakeDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.wakeDevices[iPtr]) -+ strWakeDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strWakeDevices.Trim()); -+ -+ // set the devices to power off when stopping -+ m_configuration.powerOffDevices = config.powerOffDevices; -+ CStdString strPowerOffDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.powerOffDevices[iPtr]) -+ strPowerOffDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ -+ // set the boolean settings -+ m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -+ SetSetting("use_tv_menu_language", m_configuration.bUseTVMenuLanguage == 1); -+ -+ m_configuration.bActivateSource = config.bActivateSource; -+ SetSetting("activate_source", m_configuration.bActivateSource == 1); -+ -+ m_configuration.bPowerOffScreensaver = config.bPowerOffScreensaver; -+ SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); -+ -+ m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -+ SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) -+ m_configuration.bSendInactiveSource = config.bSendInactiveSource; -+ SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+} -+ -+void CPeripheralCecAdapter::SetConfigurationFromSettings(void) -+{ -+ // client version 1.5.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ -+ // device name 'XBMC' -+ snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -+ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ int iDeviceType = GetSettingInt("device_type"); -+ if (iDeviceType != (int)CEC_DEVICE_TYPE_RECORDING_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_PLAYBACK_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_TUNER) -+ iDeviceType = (int)CEC_DEVICE_TYPE_RECORDING_DEVICE; -+ m_configuration.deviceTypes.Add((cec_device_type)iDeviceType); -+ -+ // always try to autodetect the address. -+ // when the firmware supports this, it will override the physical address, connected device and hdmi port settings -+ m_configuration.bAutodetectAddress = 1; -+ -+ // set the physical address -+ // when set, it will override the connected device and hdmi port settings -+ CStdString strPhysicalAddress = GetSettingString("physical_address"); -+ int iPhysicalAddress; -+ if (sscanf(strPhysicalAddress.c_str(), "%x", &iPhysicalAddress) == 1 && iPhysicalAddress > 0 && iPhysicalAddress < 0xFFFF) -+ m_configuration.iPhysicalAddress = iPhysicalAddress; -+ -+ // set the connected device -+ int iConnectedDevice = GetSettingInt("connected_device"); -+ if (iConnectedDevice == 0 || iConnectedDevice == 5) -+ m_configuration.baseDevice = (cec_logical_address)iConnectedDevice; -+ -+ // set the HDMI port number -+ int iHDMIPort = GetSettingInt("cec_hdmi_port"); -+ if (iHDMIPort >= 0 && iHDMIPort <= 4) -+ m_configuration.iHDMIPort = iHDMIPort; -+ -+ // set the tv vendor override -+ int iVendor = GetSettingInt("tv_vendor"); -+ if (iVendor > 0 && iVendor < 0xFFFFFF) -+ m_configuration.tvVendor = iVendor; -+ -+ // read the devices to wake when starting -+ CStdString strWakeDevices = CStdString(GetSettingString("wake_devices")).Trim(); -+ m_configuration.wakeDevices.Clear(); -+ ReadLogicalAddresses(strWakeDevices, m_configuration.wakeDevices); -+ -+ // read the devices to power off when stopping -+ CStdString strStandbyDevices = CStdString(GetSettingString("standby_devices")).Trim(); -+ m_configuration.powerOffDevices.Clear(); -+ ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); -+ -+ // always get the settings from the rom, when supported by the firmware -+ m_configuration.bGetSettingsFromROM = 1; -+ -+ // read the boolean settings -+ m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; -+ m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; -+ m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -+ m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; -+ m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+} -+ -+void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -+{ -+ for (size_t iPtr = 0; iPtr < strString.size(); iPtr++) -+ { -+ CStdString strDevice = CStdString(strString.substr(iPtr, 1)).Trim(); -+ if (!strDevice.IsEmpty()) -+ { -+ int iDevice(0); -+ if (sscanf(strDevice.c_str(), "%x", &iDevice) == 1 && iDevice >= 0 && iDevice <= 0xF) -+ addresses.Set((cec_logical_address)iDevice); -+ } -+ } -+} -+ -+CPeripheralCecAdapterUpdateThread::CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, libcec_configuration *configuration) : -+ CThread("CEC Adapter Update Thread"), -+ m_adapter(adapter), -+ m_configuration(*configuration), -+ m_bNextConfigurationScheduled(false), -+ m_bIsUpdating(true) -+{ -+ m_nextConfiguration.Clear(); -+ m_event.Reset(); -+} -+ -+CPeripheralCecAdapterUpdateThread::~CPeripheralCecAdapterUpdateThread(void) -+{ -+ StopThread(false); -+ m_event.Set(); -+ StopThread(true); -+} -+ -+void CPeripheralCecAdapterUpdateThread::Signal(void) -+{ -+ m_event.Set(); -+} -+ -+bool CPeripheralCecAdapterUpdateThread::UpdateConfiguration(libcec_configuration *configuration) -+{ -+ CSingleLock lock(m_critSection); -+ if (m_bIsUpdating) -+ { -+ m_bNextConfigurationScheduled = true; -+ m_nextConfiguration = *configuration; -+ } -+ else -+ { -+ m_configuration = *configuration; -+ m_event.Set(); -+ } -+ return true; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::WaitReady(void) -+{ -+ // don't wait if we're not powering up anything -+ if (m_configuration.wakeDevices.IsEmpty() && m_configuration.bActivateSource == 0) -+ return true; -+ -+ // wait for the TV if we're configured to become the active source. -+ // wait for the first device in the wake list otherwise. -+ cec_logical_address waitFor = (m_configuration.bActivateSource == 1) ? -+ CECDEVICE_TV : -+ m_configuration.wakeDevices.primary; -+ -+ cec_power_status powerStatus(CEC_POWER_STATUS_UNKNOWN); -+ bool bContinue(true); -+ while (bContinue && !m_adapter->m_bStop && !m_bStop && powerStatus != CEC_POWER_STATUS_ON) -+ { -+ powerStatus = m_adapter->m_cecAdapter->GetDevicePowerStatus(waitFor); -+ if (powerStatus != CEC_POWER_STATUS_ON) -+ bContinue = !m_event.WaitMSec(1000); -+ } -+ -+ return powerStatus == CEC_POWER_STATUS_ON; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::SetInitialConfiguration(void) -+{ -+ // devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_adapter->m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_adapter->m_cecAdapter->SetActiveSource(); -+ -+ // wait until devices are powered up -+ if (!WaitReady()) -+ return false; -+ -+ // request the menu language of the TV -+ if (m_configuration.bUseTVMenuLanguage == 1) -+ { -+ cec_menu_language language; -+ if (m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -+ m_adapter->SetMenuLanguage(language.language); -+ } -+ -+ // request the OSD name of the TV -+ CStdString strNotification; -+ cec_osd_name tvName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV); -+ strNotification.Format("%s: %s", g_localizeStrings.Get(36016), tvName.name); -+ -+ /* disable the mute setting when an amp is found, because the amp handles the mute setting and -+ set PCM output to 100% */ -+ if (m_adapter->m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM)) -+ { -+ // request the OSD name of the amp -+ cec_osd_name ampName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM); -+ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name); -+ strNotification.AppendFormat(" - %s", ampName.name); -+ -+ // set amp present -+ m_adapter->SetAudioSystemConnected(true); -+ g_settings.m_bMute = false; -+ g_settings.m_nVolumeLevel = VOLUME_MAXIMUM; -+ } -+ -+ m_adapter->m_bIsReady = true; -+ -+ // try to send an OSD string to the TV -+ m_adapter->m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -+ // and let the gui know that we're done -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strNotification); -+ -+ CSingleLock lock(m_critSection); -+ m_bIsUpdating = false; -+ return true; -+} -+ -+void CPeripheralCecAdapterUpdateThread::Process(void) -+{ -+ // set the initial configuration -+ if (!SetInitialConfiguration()) -+ return; -+ -+ // and wait for updates -+ bool bUpdate(false); -+ while (!m_bStop) -+ { -+ // update received -+ if (m_event.WaitMSec(500) || bUpdate) -+ { -+ if (m_bStop) -+ return; -+ // set the new configuration -+ bool bConfigSet(m_adapter->m_cecAdapter->SetConfiguration(&m_configuration)); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(bConfigSet ? 36023 : 36024)); -+ { -+ CSingleLock lock(m_critSection); -+ bUpdate = m_bNextConfigurationScheduled; -+ if (bUpdate) -+ { -+ // another update is scheduled -+ m_bNextConfigurationScheduled = false; -+ m_configuration = m_nextConfiguration; -+ } -+ else -+ { -+ // nothing left to do, wait for updates -+ m_bIsUpdating = false; -+ m_event.Reset(); -+ } -+ } -+ } -+ } -+} -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:05:05.882177854 +0200 -@@ -20,7 +20,28 @@ - * - */ - --#if defined(HAVE_LIBCEC) -+#if !defined(HAVE_LIBCEC) -+#include "Peripheral.h" -+ -+// an empty implementation, so CPeripherals can be compiled without a bunch of #ifdef's when libCEC is not available -+namespace PERIPHERALS -+{ -+ class CPeripheralCecAdapter : public CPeripheral -+ { -+ public: -+ bool HasConnectedAudioSystem(void) { return false; } -+ void ScheduleVolumeUp(void) {} -+ void ScheduleVolumeDown(void) {} -+ bool IsMuted(void) { return false; } -+ void ScheduleMute(void) {} -+ -+ WORD GetButton(void) { return 0; } -+ unsigned int GetHoldTime(void) { return 0; } -+ void ResetButton(void) {} -+ }; -+} -+ -+#else - - #include "PeripheralHID.h" - #include "interfaces/AnnouncementManager.h" -@@ -32,7 +53,7 @@ - #ifdef isset - #undef isset - #endif --#include -+#include - - class DllLibCEC; - -@@ -43,25 +64,40 @@ - - namespace PERIPHERALS - { -+ class CPeripheralCecAdapterUpdateThread; -+ - typedef struct - { - WORD iButton; - unsigned int iDuration; - } CecButtonPress; - -+ typedef enum -+ { -+ VOLUME_CHANGE_NONE, -+ VOLUME_CHANGE_UP, -+ VOLUME_CHANGE_DOWN, -+ VOLUME_CHANGE_MUTE -+ } CecVolumeChange; - - class CPeripheralCecAdapter : public CPeripheralHID, public ANNOUNCEMENT::IAnnouncer, private CThread - { -+ friend class CPeripheralCecAdapterUpdateThread; -+ - public: - CPeripheralCecAdapter(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId); - virtual ~CPeripheralCecAdapter(void); - - virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); -- virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress); -- virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress); -- -- virtual bool SendPing(void); -- virtual bool SetHdmiPort(int iHdmiPort); -+ virtual bool HasConnectedAudioSystem(void); -+ virtual void SetAudioSystemConnected(bool bSetTo); -+ virtual void ScheduleVolumeUp(void); -+ virtual void VolumeUp(void); -+ virtual void ScheduleVolumeDown(void); -+ virtual void VolumeDown(void); -+ virtual void ScheduleMute(void); -+ virtual void Mute(void); -+ virtual bool IsMuted(void); - - virtual void OnSettingChanged(const CStdString &strChangedSetting); - -@@ -71,27 +107,66 @@ - virtual CStdString GetComPort(void); - - protected: -- virtual void FlushLog(void); -- virtual bool GetNextCecKey(CEC::cec_keypress &key); -+ virtual bool OpenConnection(void); -+ virtual void SetConfigurationFromSettings(void); -+ virtual void SetConfigurationFromLibCEC(const CEC::libcec_configuration &config); -+ static void ReadLogicalAddresses(const CStdString &strString, CEC::cec_logical_addresses &addresses); -+ static int CecKeyPress(void *cbParam, const CEC::cec_keypress &key); -+ static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); -+ static int CecCommand(void *cbParam, const CEC::cec_command &command); -+ static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ - virtual bool GetNextKey(void); -+ virtual bool GetNextCecKey(CEC::cec_keypress &key); - virtual bool InitialiseFeature(const PeripheralFeature feature); - virtual void Process(void); -- virtual void ProcessNextCommand(void); -+ virtual void ProcessVolumeChange(void); - virtual void SetMenuLanguage(const char *strLanguage); - static bool FindConfigLocation(CStdString &strString); - static bool TranslateComPort(CStdString &strPort); - -- DllLibCEC* m_dll; -- CEC::ICECAdapter* m_cecAdapter; -- bool m_bStarted; -- bool m_bHasButton; -- bool m_bIsReady; -- CStdString m_strMenuLanguage; -- CDateTime m_screensaverLastActivated; -- CecButtonPress m_button; -- std::queue m_buttonQueue; -- unsigned int m_lastKeypress; -- CCriticalSection m_critSection; -+ DllLibCEC* m_dll; -+ CEC::ICECAdapter* m_cecAdapter; -+ bool m_bStarted; -+ bool m_bHasButton; -+ bool m_bIsReady; -+ bool m_bHasConnectedAudioSystem; -+ CStdString m_strMenuLanguage; -+ CDateTime m_screensaverLastActivated; -+ CecButtonPress m_button; -+ std::queue m_buttonQueue; -+ std::queue m_volumeChangeQueue; -+ unsigned int m_lastKeypress; -+ CecVolumeChange m_lastChange; -+ int m_iExitCode; -+ bool m_bIsMuted; -+ CPeripheralCecAdapterUpdateThread*m_queryThread; -+ CEC::ICECCallbacks m_callbacks; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ }; -+ -+ class CPeripheralCecAdapterUpdateThread : public CThread -+ { -+ public: -+ CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, CEC::libcec_configuration *configuration); -+ virtual ~CPeripheralCecAdapterUpdateThread(void); -+ -+ virtual void Signal(void); -+ virtual bool UpdateConfiguration(CEC::libcec_configuration *configuration); -+ -+ protected: -+ virtual bool WaitReady(void); -+ virtual bool SetInitialConfiguration(void); -+ virtual void Process(void); -+ -+ CPeripheralCecAdapter * m_adapter; -+ CEvent m_event; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ CEC::libcec_configuration m_nextConfiguration; -+ bool m_bNextConfigurationScheduled; -+ bool m_bIsUpdating; - }; - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:03:25.174271152 +0200 -@@ -30,6 +30,14 @@ - using namespace PERIPHERALS; - using namespace std; - -+struct SortBySettingsOrder -+{ -+ bool operator()(const CSetting *left, const CSetting *right) -+ { -+ return left->GetOrder() < right->GetOrder(); -+ } -+}; -+ - CPeripheral::CPeripheral(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId) : - m_type(type), - m_busType(busType), -@@ -168,6 +176,15 @@ - return m_subDevices.size() > 0; - } - -+vector CPeripheral::GetSettings(void) const -+{ -+ vector settings; -+ for (map::const_iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ settings.push_back(it->second); -+ sort(settings.begin(), settings.end(), SortBySettingsOrder()); -+ return settings; -+} -+ - void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) - { - if (!setting) -@@ -183,7 +200,7 @@ - case SETTINGS_TYPE_BOOL: - { - const CSettingBool *mappedSetting = (const CSettingBool *) setting; -- CSettingBool *boolSetting = new CSettingBool(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); -+ CSettingBool *boolSetting = new CSettingBool(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); - if (boolSetting) - { - boolSetting->SetVisible(mappedSetting->IsVisible()); -@@ -194,7 +211,7 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -@@ -205,7 +222,7 @@ - case SETTINGS_TYPE_FLOAT: - { - const CSettingFloat *mappedSetting = (const CSettingFloat *) setting; -- CSettingFloat *floatSetting = new CSettingFloat(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); -+ CSettingFloat *floatSetting = new CSettingFloat(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); - if (floatSetting) - { - floatSetting->SetVisible(mappedSetting->IsVisible()); -@@ -216,7 +233,7 @@ - case SETTINGS_TYPE_STRING: - { - const CSettingString *mappedSetting = (const CSettingString *) setting; -- CSettingString *stringSetting = new CSettingString(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); -+ CSettingString *stringSetting = new CSettingString(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); - if (stringSetting) - { - stringSetting->SetVisible(mappedSetting->IsVisible()); -@@ -323,7 +340,7 @@ - bool bChanged(boolSetting->GetData() != bValue); - boolSetting->SetData(bValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -339,7 +356,7 @@ - bool bChanged(intSetting->GetData() != iValue); - intSetting->SetData(iValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -355,11 +372,26 @@ - bool bChanged(floatSetting->GetData() != fValue); - floatSetting->SetData(fValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } - -+void CPeripheral::SetSettingVisible(const CStdString &strKey, bool bSetTo) -+{ -+ map::iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ (*it).second->SetVisible(bSetTo); -+} -+ -+bool CPeripheral::IsSettingVisible(const CStdString &strKey) const -+{ -+ map::const_iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ return (*it).second->IsVisible(); -+ return false; -+} -+ - void CPeripheral::SetSetting(const CStdString &strKey, const CStdString &strValue) - { - map::iterator it = m_settings.find(strKey); -@@ -373,7 +405,7 @@ - bool bChanged(!stringSetting->GetData().Equals(strValue)); - stringSetting->SetData(strValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - else if ((*it).second->GetType() == SETTINGS_TYPE_INT) -@@ -436,7 +468,7 @@ - - if (!bExiting) - { -- for (vector::iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) -+ for (set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) - OnSettingChanged(*it); - } - m_changedSettings.clear(); -@@ -467,7 +499,7 @@ - map::iterator it = m_settings.begin(); - while (it != m_settings.end()) - { -- m_changedSettings.push_back((*it).first); -+ m_changedSettings.insert((*it).first); - ++it; - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:03:25.174271152 +0200 -@@ -20,7 +20,7 @@ - * - */ - --#include -+#include - #include "utils/StdString.h" - #include "peripherals/PeripheralTypes.h" - -@@ -128,6 +128,8 @@ - */ - virtual const CStdString GetSettingString(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, const CStdString &strValue); -+ virtual void SetSettingVisible(const CStdString &strKey, bool bSetTo); -+ virtual bool IsSettingVisible(const CStdString &strKey) const; - - virtual int GetSettingInt(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, int iValue); -@@ -142,6 +144,8 @@ - virtual void LoadPersistedSettings(void); - virtual void ResetDefaultSettings(void); - -+ virtual std::vector GetSettings(void) const; -+ - virtual bool ErrorOccured(void) const { return m_bError; } - - protected: -@@ -163,6 +167,6 @@ - std::vector m_features; - std::vector m_subDevices; - std::map m_settings; -- std::vector m_changedSettings; -+ std::set m_changedSettings; - }; - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp 2012-04-17 14:03:25.173271133 +0200 -@@ -37,7 +37,7 @@ - - CPeripheralHID::~CPeripheralHID(void) - { -- if (!m_strKeymap.IsEmpty() && GetSettingBool("keymap_enabled")) -+ if (!m_strKeymap.IsEmpty() && !GetSettingBool("do_not_use_custom_keymap")) - { - CLog::Log(LOGDEBUG, "%s - switching active keymapping to: default", __FUNCTION__); - CButtonTranslator::GetInstance().RemoveDevice(m_strKeymap); -@@ -59,9 +59,12 @@ - SetSetting("keymap", m_strKeymap); - } - -+ if (!IsSettingVisible("keymap")) -+ SetSettingVisible("do_not_use_custom_keymap", false); -+ - if (!m_strKeymap.IsEmpty()) - { -- bool bKeymapEnabled(GetSettingBool("keymap_enabled")); -+ bool bKeymapEnabled(!GetSettingBool("do_not_use_custom_keymap")); - if (bKeymapEnabled) - { - CLog::Log(LOGDEBUG, "%s - adding keymapping for: %s", __FUNCTION__, m_strKeymap.c_str()); -@@ -82,7 +85,7 @@ - - void CPeripheralHID::OnSettingChanged(const CStdString &strChangedSetting) - { -- if (m_bInitialised && ((strChangedSetting.Equals("keymap") && GetSettingBool("keymap_enabled")) || strChangedSetting.Equals("keymap_enabled"))) -+ if (m_bInitialised && ((strChangedSetting.Equals("keymap") && !GetSettingBool("do_not_use_custom_keymap")) || strChangedSetting.Equals("keymap_enabled"))) - { - m_bInitialised = false; - InitialiseFeature(FEATURE_HID); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:03:25.169271055 +0200 -@@ -66,17 +66,15 @@ - - if (m_item) - { -- int iIndex = 1; - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (peripheral) - { -- map::iterator it = peripheral->m_settings.begin(); -- while (it != peripheral->m_settings.end()) -+ vector settings = peripheral->GetSettings(); -+ for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) - { -- CSetting *setting = (*it).second; -+ CSetting *setting = settings[iPtr]; - if (!setting->IsVisible()) - { -- ++it; - CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); - continue; - } -@@ -89,7 +87,7 @@ - if (boolSetting) - { - m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData())); -- AddBool(iIndex++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); -+ AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); - } - } - break; -@@ -99,7 +97,7 @@ - if (intSetting) - { - m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(iIndex++, intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); - } - } - break; -@@ -109,7 +107,7 @@ - if (floatSetting) - { - m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData())); -- AddSlider(iIndex++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); -+ AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); - } - } - break; -@@ -119,7 +117,7 @@ - if (stringSetting) - { - m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData())); -- AddString(iIndex, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); -+ AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); - } - } - break; -@@ -128,7 +126,6 @@ - CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); - break; - } -- ++it; - } - } - else -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:03:25.213271888 +0200 -@@ -27,9 +27,7 @@ - #include "devices/PeripheralNIC.h" - #include "devices/PeripheralNyxboard.h" - #include "devices/PeripheralTuner.h" --#if defined(HAVE_LIBCEC) - #include "devices/PeripheralCecAdapter.h" --#endif - #include "bus/PeripheralBusUSB.h" - #include "dialogs/GUIDialogPeripheralManager.h" - -@@ -43,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "guilib/Key.h" - - using namespace PERIPHERALS; - using namespace XFILE; -@@ -447,6 +446,8 @@ - void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, map &m_settings) - { - TiXmlElement *currentNode = xmlNode->FirstChildElement("setting"); -+ int iMaxOrder(0); -+ - while (currentNode) - { - CSetting *setting = NULL; -@@ -492,10 +493,32 @@ - } - - //TODO add more types if needed -+ -+ /* set the visibility */ - setting->SetVisible(bConfigurable); -+ -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; -+ -+ /* and add this new setting */ - m_settings[strKey] = setting; -+ - currentNode = currentNode->NextSiblingElement("setting"); - } -+ -+ /* add the settings without an order attribute or an invalid order attribute set at the end */ -+ for (map::iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ { -+ if (it->second->GetOrder() == 0) -+ it->second->SetOrder(++iMaxOrder); -+ } - } - - void CPeripherals::GetDirectory(const CStdString &strPath, CFileItemList &items) const -@@ -531,3 +554,89 @@ - - return NULL; - } -+ -+bool CPeripherals::OnAction(const CAction &action) -+{ -+ if (action.GetID() == ACTION_MUTE) -+ { -+ return ToggleMute(); -+ } -+ -+ if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) -+ { -+ vector peripherals; -+ if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ if (action.GetID() == ACTION_VOLUME_UP) -+ cecDevice->ScheduleVolumeUp(); -+ else -+ cecDevice->ScheduleVolumeDown(); -+ return true; -+ } -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::IsMuted(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->IsMuted()) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::ToggleMute(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ cecDevice->ScheduleMute(); -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::GetNextKeypress(float frameTime, CKey &key) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->GetButton()) -+ { -+ CKey newKey(cecDevice->GetButton(), cecDevice->GetHoldTime()); -+ cecDevice->ResetButton(); -+ key = newKey; -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.h 2012-04-17 14:03:25.213271888 +0200 -@@ -29,6 +29,8 @@ - class CSetting; - class CSettingsCategory; - class TiXmlElement; -+class CAction; -+class CKey; - - namespace PERIPHERALS - { -@@ -147,6 +149,54 @@ - */ - virtual CPeripheral *GetByPath(const CStdString &strPath) const; - -+ /*! -+ * @brief Try to let one of the peripherals handle an action. -+ * @param action The change to handle. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool OnAction(const CAction &action); -+ -+ /*! -+ * @brief Check whether there's a peripheral that reports to be muted. -+ * @return True when at least one peripheral reports to be muted, false otherwise. -+ */ -+ virtual bool IsMuted(void); -+ -+ /*! -+ * @brief Try to toggle the mute status via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool ToggleMute(void); -+ -+ /*! -+ * @brief Try to mute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool Mute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to unmute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool UnMute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to get a keypress from a peripheral. -+ * @param frameTime The current frametime. -+ * @param key The fetched key. -+ * @return True when a keypress was fetched, false otherwise. -+ */ -+ virtual bool GetNextKeypress(float frameTime, CKey &key); -+ -+ bool SupportsCEC(void) const -+ { -+#if defined(HAVE_LIBCEC) -+ return true; -+#else -+ return false; -+#endif -+ } -+ - private: - CPeripherals(void); - bool LoadMappings(void); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch deleted file mode 100644 index d08d45ece70..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.02-cec-fixed_possible_deadlock.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 35e4a2eb5515fe72d87b6d78b0567609df79df2b Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:30:25 +0200 -Subject: [PATCH] fixed: possible deadlock - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 0cb6602..1c91341 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -140,8 +140,10 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { - // this will also power off devices when we're the active source -- CSingleLock lock(m_critSection); -- m_bStop = true; -+ { -+ CSingleLock lock(m_critSection); -+ m_bStop = true; -+ } - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch deleted file mode 100644 index c186e4d62af..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch +++ /dev/null @@ -1,41 +0,0 @@ -From de4cd8d63257af1cb9060c4b2b304a82655adb99 Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:31:46 +0200 -Subject: [PATCH] fixed: make sure the old thread is stopped before starting a - new one, fixes throwing an exception in the main thread - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 14 ++++++++------ - 1 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 1c91341..a898a16 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -148,15 +148,17 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -- // reconnect to the device -- CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ { -+ // reconnect to the device -+ CSingleLock lock(m_critSection); -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); - -- // close the previous connection -- m_cecAdapter->Close(); -+ // close the previous connection -+ m_cecAdapter->Close(); -+ } - - // and open a new one -- m_bStop = false; -+ StopThread(); - Create(); - } - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index f870fbb3b6e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,630 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-04-17 14:08:05.972587511 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:18:39.755586920 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.6.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-04-17 14:08:05.974587546 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -2853,7 +2853,7 @@ - Could not detect the CEC port. Set it up manually. - Could not initialise the CEC adapter. Check your settings. - Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) -- Put this PC in standby mode when the TV is switched off -+ When the TV is switched off - HDMI port number - Connected - Adapter found, but libCEC is not available -@@ -2865,4 +2865,7 @@ - Configuration updated - Failed to set the new configuration. Please check your settings. - Send 'inactive source' command when stopping XBMC -+ Put devices in standby mode when putting the PC in standby -+ This device needs servicing -+ Ignore - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-04-17 14:08:05.975587564 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -14,13 +14,14 @@ - - - -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ - - - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp 2012-04-17 14:18:39.758586977 +0200 -@@ -323,6 +323,7 @@ - peripheralFile->SetProperty("bus", PeripheralTypeTranslator::BusTypeToString(peripheral->GetBusType())); - peripheralFile->SetProperty("location", peripheral->Location()); - peripheralFile->SetProperty("class", PeripheralTypeTranslator::TypeToString(peripheral->Type())); -+ peripheralFile->SetProperty("version", peripheral->GetVersionInfo()); - items.Add(peripheralFile); - } - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:17:35.207364830 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:18:39.760587015 +0200 -@@ -41,7 +41,7 @@ - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 0x1500 -+#define CEC_LIB_SUPPORTED_VERSION 0x1600 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -@@ -80,7 +80,9 @@ - m_lastKeypress(0), - m_lastChange(VOLUME_CHANGE_NONE), - m_iExitCode(0), -- m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bIsMuted(false), // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bGoingToStandby(false), -+ m_bIsRunning(false) - { - m_button.iButton = 0; - m_button.iDuration = 0; -@@ -96,6 +98,7 @@ - - m_bStop = true; - StopThread(true); -+ CAnnouncementManager::RemoveAnnouncer(this); - - if (m_dll && m_cecAdapter) - { -@@ -110,7 +113,11 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_iExitCode = data.asInteger(0); -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = data.asInteger(0); -+ } -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(false); - } - else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) -@@ -142,23 +149,22 @@ - // this will also power off devices when we're the active source - { - CSingleLock lock(m_critSection); -- m_bStop = true; -+ m_bGoingToStandby = false; - } -- WaitForThreadExit(0); -+ StopThread(); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { - { -- // reconnect to the device - CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -- -- // close the previous connection -- m_cecAdapter->Close(); -+ m_iExitCode = EXITCODE_RESTARTAPP; - } - -- // and open a new one -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(); -+ -+ // and open a new one - Create(); - } - } -@@ -172,6 +178,7 @@ - m_callbacks.CBCecKeyPress = &CecKeyPress; - m_callbacks.CBCecCommand = &CecCommand; - m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_callbacks.CBCecAlert = &CecAlert; - m_configuration.callbackParam = this; - m_configuration.callbacks = &m_callbacks; - -@@ -200,6 +207,8 @@ - else - { - CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ if (m_configuration.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); - } - - m_bStarted = true; -@@ -297,6 +306,13 @@ - if (!OpenConnection()) - return; - -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = EXITCODE_QUIT; -+ m_bGoingToStandby = false; -+ m_bIsRunning = true; -+ } -+ - CAnnouncementManager::AddAnnouncer(this); - - m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -@@ -312,8 +328,17 @@ - } - - delete m_queryThread; -+ m_queryThread = NULL; -+ -+ bool bSendStandbyCommands(false); -+ { -+ CSingleLock lock(m_critSection); -+ bSendStandbyCommands = m_iExitCode != EXITCODE_REBOOT && -+ m_iExitCode != EXITCODE_RESTARTAPP && -+ (!m_bGoingToStandby || GetSettingBool("standby_tv_on_pc_standby")); -+ } - -- if (m_iExitCode != EXITCODE_REBOOT) -+ if (bSendStandbyCommands) - { - if (m_cecAdapter->IsLibCECActiveSource()) - { -@@ -337,7 +362,12 @@ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); -- m_bStarted = false; -+ -+ { -+ CSingleLock lock(m_critSection); -+ m_bStarted = false; -+ m_bIsRunning = false; -+ } - } - - bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) -@@ -556,11 +586,15 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ if (command.initiator == CECDEVICE_TV && -+ (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_configuration.bShutdownOnStandby == 1) && - (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { - adapter->m_bStarted = false; -- g_application.getApplicationMessenger().Suspend(); -+ if (adapter->m_configuration.bPowerOffOnStandby == 1) -+ g_application.getApplicationMessenger().Suspend(); -+ else if (adapter->m_configuration.bShutdownOnStandby == 1) -+ g_application.getApplicationMessenger().Shutdown(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -@@ -634,6 +668,30 @@ - return 1; - } - -+int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter &data) -+{ -+ (void)data; -+ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ int iAlertString(0); -+ switch (alert) -+ { -+ case CEC_ALERT_SERVICE_DEVICE: -+ iAlertString = 36027; -+ break; -+ default: -+ break; -+ } -+ -+ if (iAlertString) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(iAlertString)); -+ -+ return 1; -+} -+ - int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) - { - CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -@@ -695,6 +753,10 @@ - case CEC_USER_CONTROL_CODE_RIGHT_DOWN: - iButton = XINPUT_IR_REMOTE_RIGHT; - break; -+ case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: -+ case CEC_USER_CONTROL_CODE_SETUP_MENU: -+ case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -+ case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_ROOT_MENU: - iButton = XINPUT_IR_REMOTE_MENU; - break; -@@ -711,7 +773,11 @@ - iButton = XINPUT_IR_REMOTE_CHANNEL_PLUS; - break; - case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: -+#if defined(XINPUT_IR_REMOTE_TELETEXT) -+ iButton = XINPUT_IR_REMOTE_TELETEXT; // only supported by the pvr branch -+#else - iButton = XINPUT_IR_REMOTE_BACK; -+#endif - break; - case CEC_USER_CONTROL_CODE_SOUND_SELECT: - iButton = XINPUT_IR_REMOTE_LANGUAGE; -@@ -806,13 +872,23 @@ - case CEC_USER_CONTROL_CODE_F4_YELLOW: - iButton = XINPUT_IR_REMOTE_YELLOW; - break; -+ case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: -+#if defined(XINPUT_IR_REMOTE_GUIDE) -+ iButton = XINPUT_IR_REMOTE_GUIDE; -+#else -+ bHasButton = false; -+#endif -+ break; -+ case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: -+#if defined(XINPUT_IR_REMOTE_LIVE_TV) -+ iButton = XINPUT_IR_REMOTE_LIVE_TV; -+#else -+ bHasButton = false; -+#endif -+ break; - case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: - case CEC_USER_CONTROL_CODE_EJECT: -- case CEC_USER_CONTROL_CODE_SETUP_MENU: -- case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -- case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_DOT: -- case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: - case CEC_USER_CONTROL_CODE_INPUT_SELECT: - case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: - case CEC_USER_CONTROL_CODE_HELP: -@@ -821,7 +897,6 @@ - case CEC_USER_CONTROL_CODE_ANGLE: - case CEC_USER_CONTROL_CODE_SUB_PICTURE: - case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: -- case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: - case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: - case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: - case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: -@@ -894,11 +969,15 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else -+ else if (IsRunning()) - { - SetConfigurationFromSettings(); - m_queryThread->UpdateConfiguration(&m_configuration); - } -+ else -+ { -+ InitialiseFeature(FEATURE_CEC); -+ } - } - - int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) -@@ -962,7 +1041,7 @@ - - // set the physical address, when baseDevice or iHDMIPort are not set - if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -- m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 15) - { - m_configuration.iPhysicalAddress = config.iPhysicalAddress; - CStdString strPhysicalAddress; -@@ -977,7 +1056,7 @@ - // set the devices to wake when starting - m_configuration.wakeDevices = config.wakeDevices; - CStdString strWakeDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.wakeDevices[iPtr]) - strWakeDevices.AppendFormat(" %X", iPtr); - SetSetting("wake_devices", strWakeDevices.Trim()); -@@ -985,10 +1064,10 @@ - // set the devices to power off when stopping - m_configuration.powerOffDevices = config.powerOffDevices; - CStdString strPowerOffDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.powerOffDevices[iPtr]) - strPowerOffDevices.AppendFormat(" %X", iPtr); -- SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ SetSetting("standby_devices", strPowerOffDevices.Trim()); - - // set the boolean settings - m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -@@ -1001,17 +1080,27 @@ - SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); - - m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -- SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); - - if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) - m_configuration.bSendInactiveSource = config.bSendInactiveSource; - SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ { -+ m_configuration.iFirmwareVersion = config.iFirmwareVersion; -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); -+ m_configuration.bShutdownOnStandby = config.bShutdownOnStandby; -+ } -+ -+ SetSetting("standby_pc_on_tv_standby", -+ m_configuration.bPowerOffOnStandby == 1 ? 13011 : -+ m_configuration.bShutdownOnStandby == 1 ? 13005 : 36028); - } - - void CPeripheralCecAdapter::SetConfigurationFromSettings(void) - { -- // client version 1.5.0 -- m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ // client version 1.6.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_6_0; - - // device name 'XBMC' - snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -@@ -1061,15 +1150,16 @@ - m_configuration.powerOffDevices.Clear(); - ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); - -- // always get the settings from the rom, when supported by the firmware -- m_configuration.bGetSettingsFromROM = 1; -- - // read the boolean settings - m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; - m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; - m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -- m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; - m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+ -+ // read the mutually exclusive boolean settings -+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby")); -+ m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0; -+ m_configuration.bShutdownOnStandby = iStandbyAction == 13005 ? 1 : 0; - } - - void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -@@ -1203,6 +1293,12 @@ - return true; - } - -+bool CPeripheralCecAdapter::IsRunning(void) const -+{ -+ CSingleLock lock(m_critSection); -+ return m_bIsRunning; -+} -+ - void CPeripheralCecAdapterUpdateThread::Process(void) - { - // set the initial configuration -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:08:06.071589381 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:18:39.761587034 +0200 -@@ -115,6 +115,8 @@ - static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); - static int CecCommand(void *cbParam, const CEC::cec_command &command); - static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ static int CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter &data); -+ bool IsRunning(void) const; - - virtual bool GetNextKey(void); - virtual bool GetNextCecKey(CEC::cec_keypress &key); -@@ -140,6 +142,8 @@ - CecVolumeChange m_lastChange; - int m_iExitCode; - bool m_bIsMuted; -+ bool m_bGoingToStandby; -+ bool m_bIsRunning; - CPeripheralCecAdapterUpdateThread*m_queryThread; - CEC::ICECCallbacks m_callbacks; - CCriticalSection m_critSection; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -211,7 +211,15 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting(NULL); -+ if (mappedSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ } -+ else if (mappedSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_entries, mappedSetting->GetControlType()); -+ } - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:18:39.758586977 +0200 -@@ -53,6 +53,7 @@ - const CStdString &DeviceName(void) const { return m_strDeviceName; } - bool IsHidden(void) const { return m_bHidden; } - void SetHidden(bool bSetTo = true) { m_bHidden = bSetTo; } -+ const CStdString &GetVersionInfo(void) const { return m_strVersionInfo; } - - /*! - * @brief Check whether this device has the given feature. -@@ -161,6 +162,7 @@ - CStdString m_strVendorId; - int m_iProductId; - CStdString m_strProductId; -+ CStdString m_strVersionInfo; - bool m_bInitialised; - bool m_bHidden; - bool m_bError; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:08:06.105590023 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:18:39.753586884 +0200 -@@ -51,6 +51,7 @@ - delete m_item; - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -@@ -96,8 +97,23 @@ - CSettingInt *intSetting = (CSettingInt *) setting; - if (intSetting) - { -- m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ if (intSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ } -+ else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData())); -+ vector > entries; -+ map::iterator entriesItr = intSetting->m_entries.begin(); -+ while (entriesItr != intSetting->m_entries.end()) -+ { -+ entries.push_back(make_pair(entriesItr->first, entriesItr->second)); -+ ++entriesItr; -+ } -+ AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries); -+ } - } - } - break; -@@ -160,6 +176,13 @@ - ++intItr; - } - -+ map::iterator intTextItr = m_intTextSettings.begin(); -+ while (intTextItr != m_intTextSettings.end()) -+ { -+ peripheral->SetSetting((*intTextItr).first, (*intTextItr).second); -+ ++intTextItr; -+ } -+ - map::iterator floatItr = m_floatSettings.begin(); - while (floatItr != m_floatSettings.end()) - { -@@ -210,6 +233,7 @@ - /* clear the settings */ - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-04-17 14:18:39.753586884 +0200 -@@ -44,6 +44,7 @@ - bool m_bIsInitialising; - std::map m_boolSettings; - std::map m_intSettings; -+ std::map m_intTextSettings; - std::map m_floatSettings; - std::map m_stringSettings; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:08:06.106590043 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -41,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "Util.h" - #include "guilib/Key.h" - - using namespace PERIPHERALS; -@@ -486,29 +487,46 @@ - float fMax = currentNode->Attribute("max") ? (float) atof(currentNode->Attribute("max")) : 0; - setting = new CSettingFloat(0, strKey, iLabelId, fValue, fMin, fStep, fMax, SPIN_CONTROL_FLOAT); - } -+ else if (strSettingsType.Equals("enum")) -+ { -+ CStdString strEnums(currentNode->Attribute("lvalues")); -+ if (!strEnums.IsEmpty()) -+ { -+ map enums; -+ vector valuesVec; -+ CUtil::Tokenize(strEnums, valuesVec, "|"); -+ for (unsigned int i = 0; i < valuesVec.size(); i++) -+ enums.insert(make_pair(atoi(valuesVec[i]), atoi(valuesVec[i]))); -+ int iValue = currentNode->Attribute("value") ? atoi(currentNode->Attribute("value")) : 0; -+ setting = new CSettingInt(0, strKey, iLabelId, iValue, enums, SPIN_CONTROL_TEXT); -+ } -+ } - else - { - CStdString strValue(currentNode->Attribute("value")); - setting = new CSettingString(0, strKey, iLabelId, strValue, EDIT_CONTROL_INPUT, !bConfigurable, -1); - } - -- //TODO add more types if needed -+ if (setting) -+ { -+ //TODO add more types if needed - -- /* set the visibility */ -- setting->SetVisible(bConfigurable); -+ /* set the visibility */ -+ setting->SetVisible(bConfigurable); - -- /* set the order */ -- int iOrder(0); -- currentNode->Attribute("order", &iOrder); -- /* if the order attribute is invalid or 0, then the setting will be added at the end */ -- if (iOrder < 0) -- iOrder = 0; -- setting->SetOrder(iOrder); -- if (iOrder > iMaxOrder) -- iMaxOrder = iOrder; -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; - -- /* and add this new setting */ -- m_settings[strKey] = setting; -+ /* and add this new setting */ -+ m_settings[strKey] = setting; -+ } - - currentNode = currentNode->NextSiblingElement("setting"); - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-404-add_lame_check-0.6.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.01-cdrip-PR616.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-806.02-cdrip-PR718.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch new file mode 100644 index 00000000000..10c105e1a78 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch @@ -0,0 +1,3239 @@ +diff --git a/configure.in b/configure.in +index c8bf4f1..fe7c790 100755 +--- a/configure.in ++++ b/configure.in +@@ -2052,7 +2052,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ + --disable-amd3dnow \ + --disable-armv5te \ + --disable-armv6t2 \ +- --disable-static \ ++ --enable-static \ + `if test "$use_debug" = "no"; then echo --disable-debug; fi` \ + --disable-muxers \ + --enable-muxer=spdif \ +@@ -2066,7 +2066,6 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ + --disable-ffplay \ + --disable-ffserver \ + --disable-ffmpeg \ +- --enable-shared \ + --disable-doc \ + --disable-decoder=mpeg_xvmc \ + --enable-postproc \ +@@ -2074,6 +2073,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ + --enable-protocol=http \ + --enable-pthreads \ + --enable-runtime-cpudetect \ ++ --disable-openmp \ + --cc="$CC" && + sed -ie "s#YASM=yasm#YASM=${prefix}/bin/yasm#" config.mak && + sed -ie "s#YASMDEP=yasm#YASMDEP=${prefix}/bin/yasm#" config.mak && +diff --git a/lib/DllAvCodec.h b/lib/DllAvCodec.h +index 463ab48..1ab00ea 100644 +--- a/lib/DllAvCodec.h ++++ b/lib/DllAvCodec.h +@@ -24,7 +24,7 @@ + #include "config.h" + #endif + #include "DynamicDll.h" +-#include "DllAvCore.h" ++#include "DllAvUtil.h" + #include "utils/log.h" + + extern "C" { +@@ -76,28 +76,6 @@ extern "C" { + #endif + } + +-/* Some convenience macros introduced at this particular revision of libavcodec. +- */ +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,25,0) +-#define CH_LAYOUT_5POINT0_BACK (CH_LAYOUT_SURROUND|CH_BACK_LEFT|CH_BACK_RIGHT) +-#define CH_LAYOUT_5POINT1_BACK (CH_LAYOUT_5POINT0_BACK|CH_LOW_FREQUENCY) +-#undef CH_LAYOUT_7POINT1_WIDE +-#define CH_LAYOUT_7POINT1_WIDE (CH_LAYOUT_5POINT1_BACK|\ +- CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER) +-#endif +- +-#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,64,0) +-// API added on: 2010-03-31 +-#define AVMediaType CodecType +-#define AVMEDIA_TYPE_UNKNOWN CODEC_TYPE_UNKNOWN +-#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO +-#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO +-#define AVMEDIA_TYPE_DATA CODEC_TYPE_DATA +-#define AVMEDIA_TYPE_SUBTITLE CODEC_TYPE_SUBTITLE +-#define AVMEDIA_TYPE_ATTACHMENT CODEC_TYPE_ATTACHMENT +-#define AVMEDIA_TYPE_NB CODEC_TYPE_NB +-#endif +- + #include "threads/SingleLock.h" + + class DllAvCodecInterface +@@ -106,20 +84,20 @@ public: + virtual ~DllAvCodecInterface() {} + virtual void avcodec_register_all(void)=0; + virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0; +- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec)=0; ++ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)=0; + virtual AVCodec *avcodec_find_decoder(enum CodecID id)=0; + virtual AVCodec *avcodec_find_encoder(enum CodecID id)=0; + virtual int avcodec_close_dont_call(AVCodecContext *avctx)=0; + virtual AVFrame *avcodec_alloc_frame(void)=0; + virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height)=0; + virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)=0; +- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt)=0; ++ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)=0; + virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)=0; + virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples)=0; + virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height)=0; +- virtual AVCodecContext *avcodec_alloc_context(void)=0; ++ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec)=0; + virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)=0; +- virtual void avcodec_get_context_defaults(AVCodecContext *s)=0; ++ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec)=0; + virtual AVCodecParserContext *av_parser_init(int codec_id)=0; + virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, +@@ -137,7 +115,6 @@ public: + virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt)=0; + virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)=0; + virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)=0; +- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count)=0; + virtual AVCodec *av_codec_next(AVCodec *c)=0; + virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, + enum AVSampleFormat in_fmt , int in_channels, +@@ -151,7 +128,7 @@ public: + virtual int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name)=0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + + // Use direct layer + class DllAvCodec : public DllDynamic, DllAvCodecInterface +@@ -166,12 +143,12 @@ public: + ::avcodec_register_all(); + } + virtual void avcodec_flush_buffers(AVCodecContext *avctx) { ::avcodec_flush_buffers(avctx); } +- virtual int avcodec_open(AVCodecContext *avctx, AVCodec *codec) ++ virtual int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) + { + CSingleLock lock(DllAvCodec::m_critSection); +- return ::avcodec_open(avctx, codec); ++ return ::avcodec_open2(avctx, codec, options); + } +- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec) { *(int *)0x0 = 0; return 0; } ++ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { *(int *)0x0 = 0; return 0; } + virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(int *)0x0 = 0; return 0; } + virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); } + virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); } +@@ -182,33 +159,21 @@ public: + } + virtual AVFrame *avcodec_alloc_frame() { return ::avcodec_alloc_frame(); } + virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height) { return ::avpicture_fill(picture, ptr, pix_fmt, width, height); } +-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,23,0) +- // API added on: 2009-04-07 + virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video2(avctx, picture, got_picture_ptr, avpkt); } +- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio3(avctx, samples, frame_size_ptr, avpkt); } ++ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio4(avctx, frame, got_frame_ptr, avpkt); } + virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, avpkt); } +-#else +- virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video(avctx, picture, got_picture_ptr, avpkt->data, avpkt->size); } +- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio2(avctx, samples, frame_size_ptr, avpkt->data, avpkt->size); } +- virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle(avctx, sub, got_sub_ptr, avpkt->data, avpkt->size); } +-#endif + virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples) { return ::avcodec_encode_audio(avctx, buf, buf_size, samples); } + virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height) { return ::avpicture_get_size(pix_fmt, width, height); } +- virtual AVCodecContext *avcodec_alloc_context() { return ::avcodec_alloc_context(); } ++ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec) { return ::avcodec_alloc_context3(codec); } + virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { ::avcodec_string(buf, buf_size, enc, encode); } +- virtual void avcodec_get_context_defaults(AVCodecContext *s) { ::avcodec_get_context_defaults(s); } ++ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec) { ::avcodec_get_context_defaults3(s, codec); } + + virtual AVCodecParserContext *av_parser_init(int codec_id) { return ::av_parser_init(codec_id); } + virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, + const uint8_t *buf, int buf_size, + int64_t pts, int64_t dts, int64_t pos) + { +-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,21,0) +- // API added on : 2009-03-05 + return ::av_parser_parse2(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts, pos); +-#else +- return ::av_parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts); +-#endif + } + virtual void av_parser_close(AVCodecParserContext *s) { ::av_parser_close(s); } + +@@ -225,7 +190,6 @@ public: + virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic) { return ::avcodec_default_get_buffer(s, pic); } + virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic) { ::avcodec_default_release_buffer(s, pic); } + virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) { return ::avcodec_default_get_format(s, fmt); } +- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count) { return ::avcodec_thread_init(s, thread_count); } + virtual AVCodec *av_codec_next(AVCodec *c) { return ::av_codec_next(c); } + virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, + enum AVSampleFormat in_fmt , int in_channels, +@@ -256,12 +220,12 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + { + DECLARE_DLL_WRAPPER(DllAvCodec, DLL_PATH_LIBAVCODEC) + DEFINE_FUNC_ALIGNED1(void, __cdecl, avcodec_flush_buffers, AVCodecContext*) +- DEFINE_FUNC_ALIGNED2(int, __cdecl, avcodec_open_dont_call, AVCodecContext*, AVCodec *) ++ DEFINE_FUNC_ALIGNED3(int, __cdecl, avcodec_open2_dont_call, AVCodecContext*, AVCodec *, AVDictionary **) + DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_video2, AVCodecContext*, AVFrame*, int*, AVPacket*) +- DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio3, AVCodecContext*, int16_t*, int*, AVPacket*) ++ DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio4, AVCodecContext*, AVFrame*, int*, AVPacket*) + DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_subtitle2, AVCodecContext*, AVSubtitle*, int*, AVPacket*) + DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_encode_audio, AVCodecContext*, uint8_t*, int, const short*) +- DEFINE_FUNC_ALIGNED0(AVCodecContext*, __cdecl, avcodec_alloc_context) ++ DEFINE_FUNC_ALIGNED1(AVCodecContext*, __cdecl, avcodec_alloc_context3, AVCodec *) + DEFINE_FUNC_ALIGNED1(AVCodecParserContext*, __cdecl, av_parser_init, int) + DEFINE_FUNC_ALIGNED9(int, __cdecl, av_parser_parse2, AVCodecParserContext*,AVCodecContext*, uint8_t**, int*, const uint8_t*, int, int64_t, int64_t, int64_t) + DEFINE_METHOD1(int, av_dup_packet, (AVPacket *p1)) +@@ -278,7 +242,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5)) + DEFINE_METHOD3(int, avpicture_get_size, (PixelFormat p1, int p2, int p3)) + DEFINE_METHOD4(void, avcodec_string, (char *p1, int p2, AVCodecContext *p3, int p4)) +- DEFINE_METHOD1(void, avcodec_get_context_defaults, (AVCodecContext *p1)) ++ DEFINE_METHOD2(void, avcodec_get_context_defaults3, (AVCodecContext *p1, AVCodec *p2)) + DEFINE_METHOD1(void, av_parser_close, (AVCodecParserContext *p1)) + DEFINE_METHOD1(void, avpicture_free, (AVPicture *p1)) + DEFINE_METHOD1(AVBitStreamFilterContext*, av_bitstream_filter_init, (const char *p1)) +@@ -290,7 +254,6 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + DEFINE_METHOD2(void, avcodec_default_release_buffer, (AVCodecContext *p1, AVFrame *p2)) + DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2)) + +- DEFINE_METHOD2(int, avcodec_thread_init, (AVCodecContext *p1, int p2)) + DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1)) + DEFINE_METHOD6(AVAudioConvert*, av_audio_convert_alloc, (enum AVSampleFormat p1, int p2, + enum AVSampleFormat p3, int p4, +@@ -301,7 +264,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + const void * const p4[6], const int p5[6], int p6)) + BEGIN_METHOD_RESOLVE() + RESOLVE_METHOD(avcodec_flush_buffers) +- RESOLVE_METHOD_RENAME(avcodec_open,avcodec_open_dont_call) ++ RESOLVE_METHOD_RENAME(avcodec_open2,avcodec_open2_dont_call) + RESOLVE_METHOD_RENAME(avcodec_close,avcodec_close_dont_call) + RESOLVE_METHOD(avcodec_find_decoder) + RESOLVE_METHOD(avcodec_find_encoder) +@@ -309,13 +272,13 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + RESOLVE_METHOD_RENAME(avcodec_register_all, avcodec_register_all_dont_call) + RESOLVE_METHOD(avpicture_fill) + RESOLVE_METHOD(avcodec_decode_video2) +- RESOLVE_METHOD(avcodec_decode_audio3) ++ RESOLVE_METHOD(avcodec_decode_audio4) + RESOLVE_METHOD(avcodec_decode_subtitle2) + RESOLVE_METHOD(avcodec_encode_audio) + RESOLVE_METHOD(avpicture_get_size) +- RESOLVE_METHOD(avcodec_alloc_context) ++ RESOLVE_METHOD(avcodec_alloc_context3) + RESOLVE_METHOD(avcodec_string) +- RESOLVE_METHOD(avcodec_get_context_defaults) ++ RESOLVE_METHOD(avcodec_get_context_defaults3) + RESOLVE_METHOD(av_parser_init) + RESOLVE_METHOD(av_parser_parse2) + RESOLVE_METHOD(av_parser_close) +@@ -328,7 +291,6 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + RESOLVE_METHOD(avcodec_default_get_buffer) + RESOLVE_METHOD(avcodec_default_release_buffer) + RESOLVE_METHOD(avcodec_default_get_format) +- RESOLVE_METHOD(avcodec_thread_init) + RESOLVE_METHOD(av_codec_next) + RESOLVE_METHOD(av_audio_convert_alloc) + RESOLVE_METHOD(av_audio_convert_free) +@@ -339,15 +301,15 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface + END_METHOD_RESOLVE() + + /* dependencies of libavcodec */ +- DllAvCore m_dllAvCore; ++ DllAvUtil m_dllAvUtil; + // DllAvUtil loaded implicitely by m_dllAvCore + + public: + static CCriticalSection m_critSection; +- int avcodec_open(AVCodecContext *avctx, AVCodec *codec) ++ int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) + { + CSingleLock lock(DllAvCodec::m_critSection); +- return avcodec_open_dont_call(avctx,codec); ++ return avcodec_open2_dont_call(avctx,codec, options); + } + int avcodec_close(AVCodecContext *avctx) + { +@@ -361,7 +323,7 @@ public: + } + virtual bool Load() + { +- if (!m_dllAvCore.Load()) ++ if (!m_dllAvUtil.Load()) + return false; + return DllDynamic::Load(); + } +diff --git a/lib/DllAvCore.h b/lib/DllAvCore.h +deleted file mode 100644 +index 92a7ab7..0000000 +--- a/lib/DllAvCore.h ++++ /dev/null +@@ -1,182 +0,0 @@ +-#pragma once +-/* +- * Copyright (C) 2005-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, Inc., 51 Franklin Street, Fifth Floor, +- * Boston, MA 02110-1301, USA. +- * http://www.gnu.org/copyleft/gpl.html +- * +- */ +- +-#if (defined HAVE_CONFIG_H) && (!defined WIN32) +- #include "config.h" +-#endif +-#include "DynamicDll.h" +-#include "DllAvUtil.h" +-#include "utils/log.h" +- +-extern "C" { +-#ifdef USE_EXTERNAL_FFMPEG +- #ifdef HAVE_LIBAVUTIL_SAMPLEFMT_H +- // libavcore was merged to libavutil on 2010-02-15 +- #include +- #include +- #endif +- +- #ifdef HAVE_LIBAVCORE_AVCORE_H +- #include +- #endif +- #ifdef HAVE_LIBAVCORE_SAMPLEFMT_H +- #include +- #endif +- +- /* Needed for old FFmpeg versions as used below */ +- #ifdef HAVE_LIBAVCODEC_AVCODEC_H +- #include +- #else +- #include +- #endif +-#else +- #include "libavcore/avcore.h" +- #include "libavcore/samplefmt.h" +-#endif +-} +- +-/* Compatibility for old external FFmpeg versions. */ +- +-#ifdef USE_EXTERNAL_FFMPEG +- +-#ifndef LIBAVCORE_VERSION_INT +-// API added on: 2010-07-21, removed on 2010-02-15 +-#define LIBAVCORE_VERSION_INT 0 +-#endif +- +-#ifndef AV_SAMPLE_FMT_NONE +-// API added on: 2010-11-02 +-#define AVSampleFormat SampleFormat +-#define AV_SAMPLE_FMT_NONE SAMPLE_FMT_NONE +-#define AV_SAMPLE_FMT_U8 SAMPLE_FMT_U8 +-#define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16 +-#define AV_SAMPLE_FMT_S32 SAMPLE_FMT_S32 +-#define AV_SAMPLE_FMT_FLT SAMPLE_FMT_FLT +-#define AV_SAMPLE_FMT_DBL SAMPLE_FMT_DBL +-#endif +- +-#ifndef AV_CH_FRONT_LEFT +-// API added on: 2010-11-21 +-#define AV_CH_FRONT_LEFT CH_FRONT_LEFT +-#define AV_CH_FRONT_RIGHT CH_FRONT_RIGHT +-#define AV_CH_FRONT_CENTER CH_FRONT_CENTER +-#define AV_CH_LOW_FREQUENCY CH_LOW_FREQUENCY +-#define AV_CH_BACK_LEFT CH_BACK_LEFT +-#define AV_CH_BACK_RIGHT CH_BACK_RIGHT +-#define AV_CH_FRONT_LEFT_OF_CENTER CH_FRONT_LEFT_OF_CENTER +-#define AV_CH_FRONT_RIGHT_OF_CENTER CH_FRONT_RIGHT_OF_CENTER +-#define AV_CH_BACK_CENTER CH_BACK_CENTER +-#define AV_CH_SIDE_LEFT CH_SIDE_LEFT +-#define AV_CH_SIDE_RIGHT CH_SIDE_RIGHT +-#define AV_CH_TOP_CENTER CH_TOP_CENTER +-#define AV_CH_TOP_FRONT_LEFT CH_TOP_FRONT_LEFT +-#define AV_CH_TOP_FRONT_CENTER CH_TOP_FRONT_CENTER +-#define AV_CH_TOP_FRONT_RIGHT CH_TOP_FRONT_RIGHT +-#define AV_CH_TOP_BACK_LEFT CH_TOP_BACK_LEFT +-#define AV_CH_TOP_BACK_CENTER CH_TOP_BACK_CENTER +-#define AV_CH_TOP_BACK_RIGHT CH_TOP_BACK_RIGHT +-#define AV_CH_STEREO_LEFT CH_STEREO_LEFT +-#define AV_CH_STEREO_RIGHT CH_STEREO_RIGHT +- +-#define AV_CH_LAYOUT_NATIVE CH_LAYOUT_NATIVE +- +-#define AV_CH_LAYOUT_MONO CH_LAYOUT_MONO +-#define AV_CH_LAYOUT_STEREO CH_LAYOUT_STEREO +-#define AV_CH_LAYOUT_2_1 CH_LAYOUT_2_1 +-#define AV_CH_LAYOUT_SURROUND CH_LAYOUT_SURROUND +-#define AV_CH_LAYOUT_4POINT0 CH_LAYOUT_4POINT0 +-#define AV_CH_LAYOUT_2_2 CH_LAYOUT_2_2 +-#define AV_CH_LAYOUT_QUAD CH_LAYOUT_QUAD +-#define AV_CH_LAYOUT_5POINT0 CH_LAYOUT_5POINT0 +-#define AV_CH_LAYOUT_5POINT1 CH_LAYOUT_5POINT1 +-#define AV_CH_LAYOUT_5POINT0_BACK CH_LAYOUT_5POINT0_BACK +-#define AV_CH_LAYOUT_5POINT1_BACK CH_LAYOUT_5POINT1_BACK +-#define AV_CH_LAYOUT_7POINT0 CH_LAYOUT_7POINT0 +-#define AV_CH_LAYOUT_7POINT1 CH_LAYOUT_7POINT1 +-#define AV_CH_LAYOUT_7POINT1_WIDE CH_LAYOUT_7POINT1_WIDE +-#define AV_CH_LAYOUT_STEREO_DOWNMIX CH_LAYOUT_STEREO_DOWNMIX +-#endif +- +-#endif // USE_EXTERNAL_FFMPEG +- +-class DllAvCoreInterface +-{ +-public: +- virtual ~DllAvCoreInterface() {} +- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) = 0; +-}; +- +-#if (defined USE_EXTERNAL_FFMPEG) +- +-// Use direct layer +-class DllAvCore : public DllDynamic, DllAvCoreInterface +-{ +-public: +- virtual ~DllAvCore() {} +-#if LIBAVCORE_VERSION_INT >= AV_VERSION_INT(0,12,0) || LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,38,0) +- // API added on: 2010-11-02, moved to libavutil on 2010-02-15 +- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_fmt(sample_fmt); } +-#else +- // from avcodec.h +- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_format(sample_fmt); } +-#endif +- +- // DLL faking. +- virtual bool ResolveExports() { return true; } +- virtual bool Load() { +-#if LIBAVCORE_VERSION_INT > 0 +- CLog::Log(LOGDEBUG, "DllAvCore: Using libavcore system library"); +-#endif +- return true; +- } +- virtual void Unload() {} +-}; +- +-#else +- +-class DllAvCore : public DllDynamic, DllAvCoreInterface +-{ +- DECLARE_DLL_WRAPPER(DllAvCore, DLL_PATH_LIBAVCORE) +- +- LOAD_SYMBOLS() +- +- DEFINE_METHOD1(int, av_get_bits_per_sample_fmt, (enum AVSampleFormat p1)) +- +- BEGIN_METHOD_RESOLVE() +- RESOLVE_METHOD(av_get_bits_per_sample_fmt) +- END_METHOD_RESOLVE() +- +- /* dependency of libavcore */ +- DllAvUtil m_dllAvUtil; +- +-public: +- virtual bool Load() +- { +- if (!m_dllAvUtil.Load()) +- return false; +- return DllDynamic::Load(); +- } +-}; +- +-#endif +- +diff --git a/lib/DllAvFilter.h b/lib/DllAvFilter.h +index a421225..e363082 100644 +--- a/lib/DllAvFilter.h ++++ b/lib/DllAvFilter.h +@@ -24,8 +24,8 @@ + #include "config.h" + #endif + #include "DynamicDll.h" +-#include "DllAvCore.h" + #include "DllAvCodec.h" ++#include "DllSwResample.h" + #include "utils/log.h" + + extern "C" { +@@ -43,28 +43,17 @@ extern "C" { + #if (defined USE_EXTERNAL_FFMPEG) + #if (defined HAVE_LIBAVFILTER_AVFILTER_H) + #include ++ #include ++ #include + #elif (defined HAVE_FFMPEG_AVFILTER_H) + #include +- #endif +- /* for av_vsrc_buffer_add_frame */ +- #if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- #include +- #else +- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) +- #include +- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame); +- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame, int64_t pts); +- #else +- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, +- AVFrame *frame, int64_t pts, AVRational pixel_aspect); +- #endif ++ #include ++ #include + #endif + #else + #include "libavfilter/avfiltergraph.h" ++ #include "libavfilter/buffersink.h" ++ #include "libavfilter/avcodec.h" + #endif + } + +@@ -86,25 +75,16 @@ public: + virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)=0; + virtual int avfilter_poll_frame(AVFilterLink *link)=0; + virtual int avfilter_request_frame(AVFilterLink *link)=0; +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; +-#else +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) + virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags)=0; +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame)=0; +-#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts)=0; +-#else +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; +-#endif +-#endif + virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0; + virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0; + virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)=0; ++ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags)=0; ++ virtual AVBufferSinkParams *av_buffersink_params_alloc()=0; ++ virtual int av_buffersink_poll_frame(AVFilterContext *ctx)=0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + // Use direct mapping + class DllAvFilter : public DllDynamic, DllAvFilterInterface + { +@@ -123,12 +103,7 @@ public: + virtual void avfilter_graph_free(AVFilterGraph **graph) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) + ::avfilter_graph_free(graph); +-#else +- ::avfilter_graph_free(*graph); +- *graph = NULL; +-#endif + } + void avfilter_register_all() + { +@@ -141,60 +116,32 @@ public: + virtual AVFilterInOut *avfilter_inout_alloc() + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + return ::avfilter_inout_alloc(); +-#else +- return (AVFilterInOut*)::av_mallocz(sizeof(AVFilterInOut)); +-#endif + } + virtual void avfilter_inout_free(AVFilterInOut **inout) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + ::avfilter_inout_free(inout); +-#else +- *inout = NULL; +-#endif + } + virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if ( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,79,0) \ +- && LIBAVFILTER_VERSION_INT < AV_VERSION_INT(2,0,0) ) \ +- ||( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0)) + return ::avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx); +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) +- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, log_ctx); +-#else +- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); +-#endif + } + virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) + { +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) ++ + return ::avfilter_graph_config(graphctx, log_ctx); +-#else +- return ::avfilter_graph_config(graphctx, (AVClass*)log_ctx); +-#endif + } + virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); } + virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); } +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } +-#else +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) + virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, flags); } +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame); } +-#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts); } +-#else +- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } +-#endif +-#endif + virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); } + virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); } + virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { return ::avfilter_link(src, srcpad, dst, dstpad); } ++ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags) { return ::av_buffersink_get_buffer_ref(buffer_sink, bufref, flags); } ++ virtual AVBufferSinkParams *av_buffersink_params_alloc() { return ::av_buffersink_params_alloc(); } ++ virtual int av_buffersink_poll_frame(AVFilterContext *ctx) { return av_buffersink_poll_frame(ctx); } + // DLL faking. + virtual bool ResolveExports() { return true; } + virtual bool Load() { +@@ -212,45 +159,24 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface + + DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3)) + DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1)) +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) + DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph **p1)) +-#else +- DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph *p1)) +-#endif + DEFINE_METHOD0(void, avfilter_register_all_dont_call) + DEFINE_METHOD6(int, avfilter_graph_create_filter, (AVFilterContext **p1, AVFilter *p2, const char *p3, const char *p4, void *p5, AVFilterGraph *p6)) + DEFINE_METHOD1(AVFilter*, avfilter_get_by_name, (const char *p1)) + DEFINE_METHOD0(AVFilterGraph*, avfilter_graph_alloc) +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + DEFINE_METHOD0(AVFilterInOut*, avfilter_inout_alloc_dont_call) + DEFINE_METHOD1(void, avfilter_inout_free_dont_call, (AVFilterInOut **p1)) +-#endif +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) +- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut **p3, AVFilterInOut **p4, void *p5)) +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) +- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, void *p5)) +-#else +- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, AVClass *p5)) +-#endif +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) +- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, void *p2)) +-#else +- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, AVClass *p2)) +-#endif ++ DEFINE_FUNC_ALIGNED5(int, __cdecl, avfilter_graph_parse_dont_call, AVFilterGraph *, const char *, AVFilterInOut **, AVFilterInOut **, void *) ++ DEFINE_FUNC_ALIGNED2(int, __cdecl, avfilter_graph_config_dont_call, AVFilterGraph *, void *) + DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_poll_frame, AVFilterLink *) + DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_request_frame, AVFilterLink*) +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) + DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int p3)) +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- DEFINE_METHOD2(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2)) +-#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3)) +-#else +- DEFINE_METHOD4(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3, AVRational p4)) +-#endif + DEFINE_METHOD4(AVFilterBufferRef*, avfilter_get_video_buffer, (AVFilterLink *p1, int p2, int p3, int p4)) + DEFINE_METHOD1(void, avfilter_unref_buffer, (AVFilterBufferRef *p1)) + DEFINE_METHOD4(int, avfilter_link, (AVFilterContext *p1, unsigned p2, AVFilterContext *p3, unsigned p4)) ++ DEFINE_FUNC_ALIGNED3(int , __cdecl, av_buffersink_get_buffer_ref, AVFilterContext *, AVFilterBufferRef **, int); ++ DEFINE_FUNC_ALIGNED0(AVBufferSinkParams*, __cdecl, av_buffersink_params_alloc); ++ DEFINE_FUNC_ALIGNED1(int , __cdecl, av_buffersink_poll_frame, AVFilterContext *); + + BEGIN_METHOD_RESOLVE() + RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call) +@@ -260,10 +186,8 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface + RESOLVE_METHOD(avfilter_graph_create_filter) + RESOLVE_METHOD(avfilter_get_by_name) + RESOLVE_METHOD(avfilter_graph_alloc) +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + RESOLVE_METHOD_RENAME(avfilter_inout_alloc, avfilter_inout_alloc_dont_call) + RESOLVE_METHOD_RENAME(avfilter_inout_free, avfilter_inout_free_dont_call) +-#endif + RESOLVE_METHOD_RENAME(avfilter_graph_parse, avfilter_graph_parse_dont_call) + RESOLVE_METHOD_RENAME(avfilter_graph_config, avfilter_graph_config_dont_call) + RESOLVE_METHOD(avfilter_poll_frame) +@@ -272,10 +196,14 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface + RESOLVE_METHOD(avfilter_get_video_buffer) + RESOLVE_METHOD(avfilter_unref_buffer) + RESOLVE_METHOD(avfilter_link) ++ RESOLVE_METHOD(av_buffersink_get_buffer_ref) ++ RESOLVE_METHOD(av_buffersink_params_alloc) ++ RESOLVE_METHOD(av_buffersink_poll_frame) + END_METHOD_RESOLVE() + + /* dependencies of libavfilter */ + DllAvUtil m_dllAvUtil; ++ DllSwResample m_dllSwResample; + + public: + int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) +@@ -291,12 +219,7 @@ public: + void avfilter_graph_free(AVFilterGraph **graph) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) + avfilter_graph_free_dont_call(graph); +-#else +- avfilter_graph_free_dont_call(*graph); +- m_dllAvUtil.av_freep(graph); +-#endif + } + void avfilter_register_all() + { +@@ -306,45 +229,29 @@ public: + AVFilterInOut* avfilter_inout_alloc() + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + return avfilter_inout_alloc_dont_call(); +-#else +- return (AVFilterInOut*)m_dllAvUtil.av_mallocz(sizeof(AVFilterInOut)); +-#endif + } + int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) + return avfilter_graph_parse_dont_call(graph, filters, inputs, outputs, log_ctx); +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) +- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, log_ctx); +-#else +- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); +-#endif + } + void avfilter_inout_free(AVFilterInOut **inout) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) + avfilter_inout_free_dont_call(inout); +-#else +- *inout = NULL; +-#endif + } + int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) + { + CSingleLock lock(DllAvCodec::m_critSection); +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) + return avfilter_graph_config_dont_call(graphctx, log_ctx); +-#else +- return avfilter_graph_config_dont_call(graphctx, (AVClass*)log_ctx); +-#endif + } + virtual bool Load() + { + if (!m_dllAvUtil.Load()) + return false; ++ if (!m_dllSwResample.Load()) ++ return false; + return DllDynamic::Load(); + } + }; +diff --git a/lib/DllAvFormat.h b/lib/DllAvFormat.h +index 46a7481..72b8866 100644 +--- a/lib/DllAvFormat.h ++++ b/lib/DllAvFormat.h +@@ -62,57 +62,45 @@ public: + virtual ~DllAvFormatInterface() {} + virtual void av_register_all_dont_call(void)=0; + virtual AVInputFormat *av_find_input_format(const char *short_name)=0; +- virtual int url_feof(ByteIOContext *s)=0; +- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)=0; +- virtual void av_close_input_file(AVFormatContext *s)=0; +- virtual void av_close_input_stream(AVFormatContext *s)=0; ++ virtual int url_feof(AVIOContext *s)=0; ++ virtual void avformat_close_input(AVFormatContext **s)=0; + virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt)=0; + virtual void av_read_frame_flush(AVFormatContext *s)=0; + virtual int av_read_play(AVFormatContext *s)=0; + virtual int av_read_pause(AVFormatContext *s)=0; + virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)=0; +-#if (!defined USE_EXTERNAL_FFMPEG) +- virtual int av_find_stream_info_dont_call(AVFormatContext *ic)=0; ++#if (!defined USE_EXTERNAL_FFMPEG) && (!defined TARGET_DARWIN) ++ virtual int avformat_find_stream_info_dont_call(AVFormatContext *ic, AVDictionary **options)=0; + #endif +- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap)=0; +- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)=0; +- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap)=0; +- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, ++ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)=0; ++ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), + offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; + virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)=0; + virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)=0; +- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; +- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; +- virtual int url_fdopen(ByteIOContext **s, URLContext *h)=0; +- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags)=0; +- virtual int url_fclose(ByteIOContext *s)=0; +- virtual int url_open_dyn_buf(ByteIOContext **s)=0; +- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer)=0; +- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence)=0; +- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; +- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; +- virtual void put_byte(ByteIOContext *s, int b)=0; +- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size)=0; +- virtual void put_be24(ByteIOContext *s, unsigned int val)=0; +- virtual void put_be32(ByteIOContext *s, unsigned int val)=0; +- virtual void put_be16(ByteIOContext *s, unsigned int val)=0; ++ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; ++ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; ++ virtual int avio_open(AVIOContext **s, const char *filename, int flags)=0; ++ virtual int avio_close(AVIOContext *s)=0; ++ virtual int avio_open_dyn_buf(AVIOContext **s)=0; ++ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)=0; ++ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence)=0; ++ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size)=0; ++ virtual void avio_w8(AVIOContext *s, int b)=0; ++ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size)=0; ++ virtual void avio_wb24(AVIOContext *s, unsigned int val)=0; ++ virtual void avio_wb32(AVIOContext *s, unsigned int val)=0; ++ virtual void avio_wb16(AVIOContext *s, unsigned int val)=0; + virtual AVFormatContext *avformat_alloc_context(void)=0; +- virtual AVStream *av_new_stream(AVFormatContext *s, int id)=0; ++ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)=0; + virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type)=0; +- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)=0; +- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, +- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +- offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; +- virtual int av_write_header (AVFormatContext *s)=0; ++ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options)=0; + virtual int av_write_trailer(AVFormatContext *s)=0; + virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt)=0; +- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags)=0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + + // Use direct mapping + class DllAvFormat : public DllDynamic, DllAvFormatInterface +@@ -126,78 +114,45 @@ public: + } + virtual void av_register_all_dont_call() { *(int* )0x0 = 0; } + virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); } +- virtual int url_feof(ByteIOContext *s) { return ::url_feof(s); } +-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) +- // API added on: 2009-03-01 +- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return ::av_metadata_get(m, key, prev, flags); } +-#else +- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return NULL; } +-#endif +- virtual void av_close_input_file(AVFormatContext *s) { ::av_close_input_file(s); } +- virtual void av_close_input_stream(AVFormatContext *s) { ::av_close_input_stream(s); } ++ virtual int url_feof(AVIOContext *s) { return ::url_feof(s); } ++ virtual void avformat_close_input(AVFormatContext **s) { ::avformat_close_input(s); } + virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt) { return ::av_read_frame(s, pkt); } + virtual void av_read_frame_flush(AVFormatContext *s) { ::av_read_frame_flush(s); } + virtual int av_read_play(AVFormatContext *s) { return ::av_read_play(s); } + virtual int av_read_pause(AVFormatContext *s) { return ::av_read_pause(s); } + virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { return ::av_seek_frame(s, stream_index, timestamp, flags); } +- virtual int av_find_stream_info(AVFormatContext *ic) ++ virtual int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) + { + CSingleLock lock(DllAvCodec::m_critSection); +- return ::av_find_stream_info(ic); ++ return ::avformat_find_stream_info(ic, options); + } +- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap) { return ::av_open_input_file(ic_ptr, filename, fmt, buf_size, ap); } +- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) { ::url_set_interrupt_cb(interrupt_cb); } +- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap) { return ::av_open_input_stream(ic_ptr, pb, filename, fmt, ap); } +- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, ++ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options) ++ { return ::avformat_open_input(ps, filename, fmt, options); } ++ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), + int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::init_put_byte(s, buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } ++ offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::avio_alloc_context(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } + virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {return ::av_probe_input_format(pd, is_opened); } + virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) {*score_max = 100; return ::av_probe_input_format(pd, is_opened); } // Use av_probe_input_format, this is not exported by ffmpeg's headers +-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,98,0) +- // API added on: 2010-02-08 +- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } +-#else +- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return -1; } +-#endif +- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::dump_format(ic, index, url, is_output); } +- virtual int url_fdopen(ByteIOContext **s, URLContext *h) { return ::url_fdopen(s, h); } +- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags) { return ::url_fopen(s, filename, flags); } +- virtual int url_fclose(ByteIOContext *s) { return ::url_fclose(s); } +- virtual int url_open_dyn_buf(ByteIOContext **s) { return ::url_open_dyn_buf(s); } +- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer) { return ::url_close_dyn_buf(s, pbuffer); } +- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence) { return ::url_fseek(s, offset, whence); } +- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_buffer(s, buf, size); } +- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_partial_buffer(s, buf, size); } +- virtual void put_byte(ByteIOContext *s, int b) { ::put_byte(s, b); } +- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size) { ::put_buffer(s, buf, size); } +- virtual void put_be24(ByteIOContext *s, unsigned int val) { ::put_be24(s, val); } +- virtual void put_be32(ByteIOContext *s, unsigned int val) { ::put_be32(s, val); } +- virtual void put_be16(ByteIOContext *s, unsigned int val) { ::put_be16(s, val); } ++ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } ++ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::av_dump_format(ic, index, url, is_output); } ++ virtual int avio_open(AVIOContext **s, const char *filename, int flags) { return ::avio_open(s, filename, flags); } ++ virtual int avio_close(AVIOContext *s) { return ::avio_close(s); } ++ virtual int avio_open_dyn_buf(AVIOContext **s) { return ::avio_open_dyn_buf(s); } ++ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { return ::avio_close_dyn_buf(s, pbuffer); } ++ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence) { return ::avio_seek(s, offset, whence); } ++ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size) { return ::avio_read(s, buf, size); } ++ virtual void avio_w8(AVIOContext *s, int b) { ::avio_w8(s, b); } ++ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size) { ::avio_write(s, buf, size); } ++ virtual void avio_wb24(AVIOContext *s, unsigned int val) { ::avio_wb24(s, val); } ++ virtual void avio_wb32(AVIOContext *s, unsigned int val) { ::avio_wb32(s, val); } ++ virtual void avio_wb16(AVIOContext *s, unsigned int val) { ::avio_wb16(s, val); } + virtual AVFormatContext *avformat_alloc_context() { return ::avformat_alloc_context(); } +- virtual AVStream *av_new_stream(AVFormatContext *s, int id) { return ::av_new_stream(s, id); } +-#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) +- virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::guess_format(short_name, filename, mime_type); } +-#else ++ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { return ::avformat_new_stream(s, c); } + virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::av_guess_format(short_name, filename, mime_type); } +-#endif +- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) { return ::av_set_parameters(s, ap); } +- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, +- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::av_alloc_put_byte(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } +- virtual int av_write_header (AVFormatContext *s) { return ::av_write_header (s); } ++ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options) { return ::avformat_write_header (s, options); } + virtual int av_write_trailer(AVFormatContext *s) { return ::av_write_trailer(s); } + virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt) { return ::av_write_frame(s, pkt); } +-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,43,0) +- // API added on: 2009-12-13 +- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set2(pm, key, value, flags); } +-#elif LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) +- // API added on: 2009-03-01 +- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set(pm, key, value); } +-#else +- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return -1; } +-#endif + + // DLL faking. + virtual bool ResolveExports() { return true; } +@@ -218,108 +173,78 @@ class DllAvFormat : public DllDynamic, DllAvFormatInterface + + DEFINE_METHOD0(void, av_register_all_dont_call) + DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1)) +- DEFINE_METHOD1(int, url_feof, (ByteIOContext *p1)) +- DEFINE_METHOD4(AVMetadataTag*, av_metadata_get, (AVMetadata *p1, const char *p2, const AVMetadataTag *p3, int p4)) +- DEFINE_METHOD1(void, av_close_input_file, (AVFormatContext *p1)) +- DEFINE_METHOD1(void, av_close_input_stream, (AVFormatContext *p1)) ++ DEFINE_METHOD1(int, url_feof, (AVIOContext *p1)) ++ DEFINE_METHOD1(void, avformat_close_input, (AVFormatContext **p1)) + DEFINE_METHOD1(int, av_read_play, (AVFormatContext *p1)) + DEFINE_METHOD1(int, av_read_pause, (AVFormatContext *p1)) + DEFINE_METHOD1(void, av_read_frame_flush, (AVFormatContext *p1)) + DEFINE_FUNC_ALIGNED2(int, __cdecl, av_read_frame, AVFormatContext *, AVPacket *) + DEFINE_FUNC_ALIGNED4(int, __cdecl, av_seek_frame, AVFormatContext*, int, int64_t, int) +- DEFINE_FUNC_ALIGNED1(int, __cdecl, av_find_stream_info_dont_call, AVFormatContext*) +- DEFINE_FUNC_ALIGNED5(int, __cdecl, av_open_input_file, AVFormatContext**, const char *, AVInputFormat *, int, AVFormatParameters *) +- DEFINE_FUNC_ALIGNED5(int,__cdecl, av_open_input_stream, AVFormatContext **, ByteIOContext *, const char *, AVInputFormat *, AVFormatParameters *) ++ DEFINE_FUNC_ALIGNED2(int, __cdecl, avformat_find_stream_info_dont_call, AVFormatContext*, AVDictionary **) ++ DEFINE_FUNC_ALIGNED4(int, __cdecl, avformat_open_input, AVFormatContext **, const char *, AVInputFormat *, AVDictionary **) + DEFINE_FUNC_ALIGNED2(AVInputFormat*, __cdecl, av_probe_input_format, AVProbeData*, int) + DEFINE_FUNC_ALIGNED3(AVInputFormat*, __cdecl, av_probe_input_format2, AVProbeData*, int, int*) +- DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, ByteIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) +- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_buffer, ByteIOContext*, unsigned char *, int) +- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_partial_buffer, ByteIOContext*, unsigned char *, int) +- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_byte, ByteIOContext*, int) +- DEFINE_FUNC_ALIGNED3(void, __cdecl, put_buffer, ByteIOContext*, const unsigned char *, int) +- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be24, ByteIOContext*, unsigned int) +- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be32, ByteIOContext*, unsigned int) +- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be16, ByteIOContext*, unsigned int) +- DEFINE_METHOD1(void, url_set_interrupt_cb, (URLInterruptCB *p1)) +- DEFINE_METHOD8(int, init_put_byte, (ByteIOContext *p1, unsigned char *p2, int p3, int p4, void *p5, ++ DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, AVIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) ++ DEFINE_FUNC_ALIGNED3(int, __cdecl, avio_read, AVIOContext*, unsigned char *, int) ++ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_w8, AVIOContext*, int) ++ DEFINE_FUNC_ALIGNED3(void, __cdecl, avio_write, AVIOContext*, const unsigned char *, int) ++ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb24, AVIOContext*, unsigned int) ++ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb32, AVIOContext*, unsigned int) ++ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb16, AVIOContext*, unsigned int) ++ DEFINE_METHOD7(AVIOContext *, avio_alloc_context, (unsigned char *p1, int p2, int p3, void *p4, ++ int (*p5)(void *opaque, uint8_t *buf, int buf_size), + int (*p6)(void *opaque, uint8_t *buf, int buf_size), +- int (*p7)(void *opaque, uint8_t *buf, int buf_size), +- offset_t (*p8)(void *opaque, offset_t offset, int whence))) +- DEFINE_METHOD4(void, dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) +- DEFINE_METHOD2(int, url_fdopen, (ByteIOContext **p1, URLContext *p2)) +- DEFINE_METHOD3(int, url_fopen, (ByteIOContext **p1, const char *p2, int p3)) +- DEFINE_METHOD1(int, url_fclose, (ByteIOContext *p1)) +- DEFINE_METHOD1(int, url_open_dyn_buf, (ByteIOContext **p1)) +- DEFINE_METHOD2(int, url_close_dyn_buf, (ByteIOContext *p1, uint8_t **p2)) +- DEFINE_METHOD3(offset_t, url_fseek, (ByteIOContext *p1, offset_t p2, int p3)) ++ offset_t (*p7)(void *opaque, offset_t offset, int whence))) ++ DEFINE_METHOD4(void, av_dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) ++ DEFINE_METHOD3(int, avio_open, (AVIOContext **p1, const char *p2, int p3)) ++ DEFINE_METHOD1(int, avio_close, (AVIOContext *p1)) ++ DEFINE_METHOD1(int, avio_open_dyn_buf, (AVIOContext **p1)) ++ DEFINE_METHOD2(int, avio_close_dyn_buf, (AVIOContext *p1, uint8_t **p2)) ++ DEFINE_METHOD3(offset_t, avio_seek, (AVIOContext *p1, offset_t p2, int p3)) + DEFINE_METHOD0(AVFormatContext *, avformat_alloc_context) +- DEFINE_METHOD2(AVStream *, av_new_stream, (AVFormatContext *p1, int p2)) +-#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) +- DEFINE_METHOD3(AVOutputFormat *, guess_format, (const char *p1, const char *p2, const char *p3)) +-#else ++ DEFINE_METHOD2(AVStream *, avformat_new_stream, (AVFormatContext *p1, AVCodec *p2)) + DEFINE_METHOD3(AVOutputFormat *, av_guess_format, (const char *p1, const char *p2, const char *p3)) +-#endif +- DEFINE_METHOD2(int, av_set_parameters, (AVFormatContext *p1, AVFormatParameters *p2)); +- DEFINE_METHOD7(ByteIOContext *, av_alloc_put_byte, (unsigned char *p1, int p2, int p3, void *p4, +- int(*p5)(void *opaque, uint8_t *buf, int buf_size), +- int(*p6)(void *opaque, uint8_t *buf, int buf_size), +- offset_t(*p7)(void *opaque, offset_t offset, int whence))) +- DEFINE_METHOD1(int, av_write_header , (AVFormatContext *p1)) ++ DEFINE_METHOD2(int, avformat_write_header , (AVFormatContext *p1, AVDictionary **p2)) + DEFINE_METHOD1(int, av_write_trailer, (AVFormatContext *p1)) + DEFINE_METHOD2(int, av_write_frame , (AVFormatContext *p1, AVPacket *p2)) +- DEFINE_METHOD4(int, av_metadata_set2, (AVMetadata **p1, const char *p2, const char *p3, int p4)); + BEGIN_METHOD_RESOLVE() + RESOLVE_METHOD_RENAME(av_register_all, av_register_all_dont_call) + RESOLVE_METHOD(av_find_input_format) + RESOLVE_METHOD(url_feof) +- RESOLVE_METHOD(av_metadata_get) +- RESOLVE_METHOD(av_close_input_file) +- RESOLVE_METHOD(av_close_input_stream) ++ RESOLVE_METHOD(avformat_close_input) + RESOLVE_METHOD(av_read_frame) + RESOLVE_METHOD(av_read_play) + RESOLVE_METHOD(av_read_pause) +- RESOLVE_METHOD_RENAME(ff_read_frame_flush, av_read_frame_flush) ++ RESOLVE_METHOD(av_read_frame_flush) + RESOLVE_METHOD(av_seek_frame) +- RESOLVE_METHOD_RENAME(av_find_stream_info, av_find_stream_info_dont_call) +- RESOLVE_METHOD(av_open_input_file) +- RESOLVE_METHOD(url_set_interrupt_cb) +- RESOLVE_METHOD(av_open_input_stream) +- RESOLVE_METHOD(init_put_byte) ++ RESOLVE_METHOD_RENAME(avformat_find_stream_info, avformat_find_stream_info_dont_call) ++ RESOLVE_METHOD(avformat_open_input) ++ RESOLVE_METHOD(avio_alloc_context) + RESOLVE_METHOD(av_probe_input_format) + RESOLVE_METHOD(av_probe_input_format2) + RESOLVE_METHOD(av_probe_input_buffer) +- RESOLVE_METHOD(dump_format) +- RESOLVE_METHOD(url_fdopen) +- RESOLVE_METHOD(url_fopen) +- RESOLVE_METHOD(url_fclose) +- RESOLVE_METHOD(url_open_dyn_buf) +- RESOLVE_METHOD(url_close_dyn_buf) +- RESOLVE_METHOD(url_fseek) +- RESOLVE_METHOD(get_buffer) +- RESOLVE_METHOD(get_partial_buffer) +- RESOLVE_METHOD(put_byte) +- RESOLVE_METHOD(put_buffer) +- RESOLVE_METHOD(put_be24) +- RESOLVE_METHOD(put_be32) +- RESOLVE_METHOD(put_be16) ++ RESOLVE_METHOD(av_dump_format) ++ RESOLVE_METHOD(avio_open) ++ RESOLVE_METHOD(avio_close) ++ RESOLVE_METHOD(avio_open_dyn_buf) ++ RESOLVE_METHOD(avio_close_dyn_buf) ++ RESOLVE_METHOD(avio_seek) ++ RESOLVE_METHOD(avio_read) ++ RESOLVE_METHOD(avio_w8) ++ RESOLVE_METHOD(avio_write) ++ RESOLVE_METHOD(avio_wb24) ++ RESOLVE_METHOD(avio_wb32) ++ RESOLVE_METHOD(avio_wb16) + RESOLVE_METHOD(avformat_alloc_context) +- RESOLVE_METHOD(av_new_stream) +-#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) +- RESOLVE_METHOD(guess_format) +-#else ++ RESOLVE_METHOD(avformat_new_stream) + RESOLVE_METHOD(av_guess_format) +-#endif +- RESOLVE_METHOD(av_set_parameters) +- RESOLVE_METHOD(av_alloc_put_byte) +- RESOLVE_METHOD(av_write_header) ++ RESOLVE_METHOD(avformat_write_header) + RESOLVE_METHOD(av_write_trailer) + RESOLVE_METHOD(av_write_frame) +- RESOLVE_METHOD(av_metadata_set2) + END_METHOD_RESOLVE() + + /* dependencies of libavformat */ + DllAvCodec m_dllAvCodec; +- // DllAvCore loaded implicitely by m_dllAvCodec + // DllAvUtil loaded implicitely by m_dllAvCodec + + public: +@@ -328,10 +253,10 @@ public: + CSingleLock lock(DllAvCodec::m_critSection); + av_register_all_dont_call(); + } +- int av_find_stream_info(AVFormatContext *ic) ++ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) + { + CSingleLock lock(DllAvCodec::m_critSection); +- return(av_find_stream_info_dont_call(ic)); ++ return avformat_find_stream_info_dont_call(ic, options); + } + + virtual bool Load() +diff --git a/lib/DllAvUtil.h b/lib/DllAvUtil.h +index b8bb2d6..2331777 100644 +--- a/lib/DllAvUtil.h ++++ b/lib/DllAvUtil.h +@@ -69,6 +69,7 @@ extern "C" { + #include "libavutil/opt.h" + #include "libavutil/mem.h" + #include "libavutil/fifo.h" ++ #include "libavutil/samplefmt.h" + #endif + } + +@@ -93,7 +94,7 @@ public: + virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0; + virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; + virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; +- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out)=0; ++ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; + virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; + virtual void av_fifo_free(AVFifoBuffer *f) = 0; + virtual void av_fifo_reset(AVFifoBuffer *f) = 0; +@@ -101,10 +102,13 @@ public: + virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0; + virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0; + virtual char *av_strdup(const char *s)=0; ++ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) = 0; ++ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags) = 0; ++ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)=0; ++ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) +- ++#if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + // Use direct layer + class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + { +@@ -121,12 +125,7 @@ public: + virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); } + virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } + virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } +-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,7,0) +- // API added on: 2008-12-16 +- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return ::av_set_string3(obj, name, val, alloc, o_out); } +-#else +- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return AVERROR(ENOENT); } +-#endif ++ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } + virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } + virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } + virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } +@@ -136,6 +135,12 @@ public: + virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) + { return ::av_fifo_generic_write(f, src, size, func); } + virtual char *av_strdup(const char *s) { return ::av_strdup(s); } ++ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) ++ { return ::av_get_bytes_per_sample(p1); } ++ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags){ return ::av_dict_get(m, key, prev, flags); } ++ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags) { return ::av_dict_set(pm, key, value, flags); } ++ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) ++ { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); } + + // DLL faking. + virtual bool ResolveExports() { return true; } +@@ -164,7 +169,7 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3)); + DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1)) + DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); +- DEFINE_METHOD5(int, av_set_string3, (void *p1, const char *p2, const char *p3, int p4, const AVOption **p5)); ++ DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); + DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) + DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) + DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) +@@ -172,6 +177,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int))) + DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int))) + DEFINE_METHOD1(char*, av_strdup, (const char *p1)) ++ DEFINE_METHOD1(int, av_get_bytes_per_sample, (enum AVSampleFormat p1)) ++ DEFINE_METHOD4(AVDictionaryEntry *, av_dict_get, (AVDictionary *p1, const char *p2, const AVDictionaryEntry *p3, int p4)) ++ DEFINE_METHOD4(int, av_dict_set, (AVDictionary **p1, const char *p2, const char *p3, int p4)); ++ DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5)) + + public: + BEGIN_METHOD_RESOLVE() +@@ -185,7 +194,7 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + RESOLVE_METHOD(av_rescale_q) + RESOLVE_METHOD(av_crc_get_table) + RESOLVE_METHOD(av_crc) +- RESOLVE_METHOD(av_set_string3) ++ RESOLVE_METHOD(av_opt_set) + RESOLVE_METHOD(av_fifo_alloc) + RESOLVE_METHOD(av_fifo_free) + RESOLVE_METHOD(av_fifo_reset) +@@ -193,6 +202,10 @@ class DllAvUtilBase : public DllDynamic, DllAvUtilInterface + RESOLVE_METHOD(av_fifo_generic_read) + RESOLVE_METHOD(av_fifo_generic_write) + RESOLVE_METHOD(av_strdup) ++ RESOLVE_METHOD(av_get_bytes_per_sample) ++ RESOLVE_METHOD(av_dict_get) ++ RESOLVE_METHOD(av_dict_set) ++ RESOLVE_METHOD(av_samples_get_buffer_size) + END_METHOD_RESOLVE() + }; + +diff --git a/lib/DllPostProc.h b/lib/DllPostProc.h +index b09a3f6..5465601 100644 +--- a/lib/DllPostProc.h ++++ b/lib/DllPostProc.h +@@ -87,7 +87,7 @@ public: + virtual void pp_free_context(pp_context *ppContext)=0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + + // We call directly. + class DllPostProc : public DllDynamic, DllPostProcInterface +diff --git a/lib/DllSwResample.h b/lib/DllSwResample.h +new file mode 100644 +index 0000000..8a99072 +--- /dev/null ++++ b/lib/DllSwResample.h +@@ -0,0 +1,87 @@ ++#pragma once ++/* ++ * Copyright (C) 2005-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 ++ * ++ */ ++ ++#if (defined HAVE_CONFIG_H) && (!defined WIN32) ++ #include "config.h" ++#endif ++#include "DynamicDll.h" ++ ++extern "C" { ++#ifndef HAVE_MMX ++#define HAVE_MMX ++#endif ++#ifndef __STDC_CONSTANT_MACROS ++#define __STDC_CONSTANT_MACROS ++#endif ++#ifndef __GNUC__ ++#pragma warning(disable:4244) ++#endif ++#if (defined USE_EXTERNAL_FFMPEG) ++ #include ++#else ++ #include "libswresample/swresample.h" ++#endif ++} ++ ++ ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) ++ ++// Use direct mapping ++class DllSwResample : public DllDynamic ++{ ++public: ++ virtual ~DllSwResample() {} ++ ++ // DLL faking. ++ virtual bool ResolveExports() { return true; } ++ virtual bool Load() { ++ CLog::Log(LOGDEBUG, "DllAvFormat: Using libswresample system library"); ++ return true; ++ } ++ virtual void Unload() {} ++}; ++ ++#else ++ ++class DllSwResample : public DllDynamic ++{ ++ DECLARE_DLL_WRAPPER(DllSwResample, DLL_PATH_LIBSWRESAMPLE) ++ ++ LOAD_SYMBOLS() ++ ++ BEGIN_METHOD_RESOLVE() ++ END_METHOD_RESOLVE() ++ ++ /* dependencies of libavformat */ ++ DllAvUtil m_dllAvUtil; ++ ++public: ++ ++ virtual bool Load() ++ { ++ if (!m_dllAvUtil.Load()) ++ return false; ++ return DllDynamic::Load(); ++ } ++}; ++ ++#endif +diff --git a/lib/DllSwScale.h b/lib/DllSwScale.h +index 0cfb654..0fe8184 100644 +--- a/lib/DllSwScale.h ++++ b/lib/DllSwScale.h +@@ -92,7 +92,7 @@ public: + virtual void sws_freeContext(struct SwsContext *context)=0; + }; + +-#if (defined USE_EXTERNAL_FFMPEG) ++#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) + + // We call into this library directly. + class DllSwScale : public DllDynamic, public DllSwScaleInterface +diff --git a/lib/Makefile.in b/lib/Makefile.in +index 3550582..2ea47fb 100644 +--- a/lib/Makefile.in ++++ b/lib/Makefile.in +@@ -1,21 +1,18 @@ + ARCH=@ARCH@ + ++AR=@AR@ + LD=@LD@ + CC=@CC@ + CXX=@CXX@ +-SHELL=@SHELL@ +-ifeq ($(findstring osx,$(ARCH)),osx) +-ifeq ($(findstring arm,$(ARCH)),arm) +-LDFLAGS=-arch armv7 -iphoneos_version_min 4.1 -bundle -undefined dynamic_lookup -read_only_relocs suppress +-else +-LDFLAGS=-bundle -undefined dynamic_lookup -read_only_relocs suppress +-endif +-else +-LDFLAGS=-shared -fPIC -rdynamic +-endif + SYSDIR=@abs_top_srcdir@/system/players/dvdplayer +-WRAPPER=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o +-WRAPPER_MACH_ALIAS=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias ++ ++AVFORMAT_SO=avformat-53-$(ARCH).so ++AVCODEC_SO=avcodec-53-$(ARCH).so ++AVUTIL_SO=avutil-51-$(ARCH).so ++AVFILTER_SO=avfilter-2-$(ARCH).so ++SWSCALE_SO=swscale-2-$(ARCH).so ++POSTPROC_SO=postproc-52-$(ARCH).so ++SWRESAMPLE_SO=swresample-0-$(ARCH).so + + DIRS= + ifneq (@USE_EXTERNAL_FFMPEG@,1) +@@ -24,123 +21,55 @@ endif + + LIBS= + ifneq (@USE_EXTERNAL_FFMPEG@,1) +- LIBS+=avutil-50-$(ARCH).so \ +- avcodec-52-$(ARCH).so \ +- avcore-0-$(ARCH).so \ +- avformat-52-$(ARCH).so \ +- postproc-51-$(ARCH).so \ +- avfilter-1-$(ARCH).so \ +- swscale-0-$(ARCH).so +-endif +- +-ifneq (,$(findstring powerpc,$(ARCH))) +- ARCH_DIR=ppc +-else +-ifeq ($(findstring arm,$(ARCH)),arm) +- ARCH_DIR=arm +-else +- ARCH_DIR=x86 +-endif ++ LIBS+=$(AVUTIL_SO) \ ++ $(AVCODEC_SO) \ ++ $(AVFORMAT_SO) \ ++ $(POSTPROC_SO) \ ++ $(AVFILTER_SO) \ ++ $(SWSCALE_SO) \ ++ $(SWRESAMPLE_SO) + endif + + .PHONY: $(DIRS) codecs + +-codecs: $(addprefix $(SYSDIR)/, $(LIBS)); +- +- +-ifeq ($(findstring osx,$(ARCH)), osx) +-# Add -lbundle1.o for powerpc-osx +-ifeq ($(ARCH), powerpc-osx) +-BUNDLE1_O = -lbundle1.o +-endif +- +-$(SYSDIR)/avutil-50-$(ARCH).so: $(WRAPPER) ffmpeg/libavutil/libavutil.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavutil/*.o \ +- ffmpeg/libavutil/$(ARCH_DIR)/*.o $(BUNDLE1_O) +- +-$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavcodec/*.o \ +- ffmpeg/libavcodec/$(ARCH_DIR)/*.o $(BUNDLE1_O) +- +-$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavcore/*.o $(BUNDLE1_O) +- +-$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavformat/*.o $(BUNDLE1_O) +- +-ifeq ($(findstring x86,$(ARCH_DIR)), x86) +-$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavfilter/$(ARCH_DIR)/*.o \ +- ffmpeg/libavfilter/*.o $(BUNDLE1_O) +-else # No libavfilter/ppc or libavfilter/arm +-$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libavfilter/*.o $(BUNDLE1_O) +-endif ++ifneq ($(findstring osx,$(ARCH)), osx) + +-ifneq ($(findstring arm,$(ARCH)), arm) +-$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libswscale/*.o \ +- ffmpeg/libswscale/$(ARCH_DIR)/*.o $(BUNDLE1_O) +-else # No ARM version of swscale available yet. +-$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libswscale/*.o +-endif +- +-$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.dylib +- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ +- $(WRAPPER) ffmpeg/libpostproc/*.o $(BUNDLE1_O) +- +-ffmpeg/libavutil/libavutil.dylib : ffmpeg; +-ffmpeg/libavcodec/libavcodec.dylib : ffmpeg; +-ffmpeg/libavcore/libavcore.dylib : ffmpeg; +-ffmpeg/libavformat/libavformat.dylib : ffmpeg; +-ffmpeg/libavformat/libavfilter.dylib : ffmpeg; +-ffmpeg/libswscale/libswscale.dylib : ffmpeg; +-ffmpeg/libpostproc/libpostproc.dylib : ffmpeg; +-ffmpeg: +- $(MAKE) -C $@ +- +-else ++codecs: $(addprefix $(SYSDIR)/, $(LIBS)); + +-$(SYSDIR)/avutil-50-$(ARCH).so: ffmpeg/libavutil/libavutil.so ++$(SYSDIR)/$(AVUTIL_SO): ffmpeg/libavutil/libavutil.so + cp ffmpeg/libavutil/libavutil.so $@ + +-$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.so ++$(SYSDIR)/$(AVCODEC_SO): ffmpeg/libavcodec/libavcodec.so + cp ffmpeg/libavcodec/libavcodec.so $@ + +-$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.so +- cp ffmpeg/libavcore/libavcore.so $@ +- +-$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.so ++$(SYSDIR)/$(AVFORMAT_SO): ffmpeg/libavformat/libavformat.so + cp ffmpeg/libavformat/libavformat.so $@ + +-$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.so ++$(SYSDIR)/$(AVFILTER_SO): ffmpeg/libavfilter/libavfilter.so + cp ffmpeg/libavfilter/libavfilter.so $@ + +-$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.so ++$(SYSDIR)/$(SWSCALE_SO): ffmpeg/libswscale/libswscale.so + cp ffmpeg/libswscale/libswscale.so $@ + +-$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.so ++$(SYSDIR)/$(POSTPROC_SO): ffmpeg/libpostproc/libpostproc.so + cp ffmpeg/libpostproc/libpostproc.so $@ + ++$(SYSDIR)/$(SWRESAMPLE_SO): ffmpeg/libswresample/libswresample.so ++ cp ffmpeg/libswresample/libswresample.so $@ ++ + ffmpeg/libavutil/libavutil.so : ffmpeg; + ffmpeg/libavcodec/libavcodec.so : ffmpeg; +-ffmpeg/libavcore/libavcore.so : ffmpeg; + ffmpeg/libavformat/libavformat.so : ffmpeg; + ffmpeg/libavfilter/libavfilter.so : ffmpeg; + ffmpeg/libswscale/libswscale.so : ffmpeg; + ffmpeg/libpostproc/libpostproc.so : ffmpeg; ++ffmpeg/libswresample/libswresample.so : ffmpeg; ++endif ++ + ffmpeg: + $(MAKE) -C $@ +- ++ifeq ($(findstring osx,$(ARCH)), osx) ++ $(AR) d ffmpeg/libavcodec/libavcodec.a inverse.o + endif + + clean: +diff --git a/xbmc/DllPaths_generated.h.in b/xbmc/DllPaths_generated.h.in +index a84dd52..10a7d87 100644 +--- a/xbmc/DllPaths_generated.h.in ++++ b/xbmc/DllPaths_generated.h.in +@@ -74,13 +74,13 @@ + #define DLL_PATH_LIBMAD "@MAD_SONAME@" + + /* ffmpeg */ +-#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" +-#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" +-#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" +-#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" +-#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" +-#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" +-#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" ++#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" ++#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" ++#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" ++#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" ++#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" ++#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" ++#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" + + /* cdrip */ + #if defined(_LINUX) && !defined(__APPLE__) +diff --git a/xbmc/DllPaths_win32.h b/xbmc/DllPaths_win32.h +index d39e2ea..fbd75a4 100644 +--- a/xbmc/DllPaths_win32.h ++++ b/xbmc/DllPaths_win32.h +@@ -58,13 +58,13 @@ + #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" + + /* ffmpeg */ +-#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" +-#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" +-#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" +-#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" +-#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" +-#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" +-#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" ++#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" ++#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" ++#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" ++#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" ++#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" ++#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" ++#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" + + /* cdrip */ + #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" +diff --git a/xbmc/cdrip/EncoderFFmpeg.cpp b/xbmc/cdrip/EncoderFFmpeg.cpp +index 1ec9805..bcedb0c 100644 +--- a/xbmc/cdrip/EncoderFFmpeg.cpp ++++ b/xbmc/cdrip/EncoderFFmpeg.cpp +@@ -59,11 +59,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + + CStdString filename = URIUtils::GetFileName(strFile); + AVOutputFormat *fmt = NULL; +-#if LIBAVFORMAT_VERSION_MAJOR < 52 +- fmt = m_dllAvFormat.guess_format(NULL, filename.c_str(), NULL); +-#else + fmt = m_dllAvFormat.av_guess_format(NULL, filename.c_str(), NULL); +-#endif + if (!fmt) + { + CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Unable to guess the output format for the file %s", filename.c_str()); +@@ -82,7 +78,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + } + + m_Format = m_dllAvFormat.avformat_alloc_context(); +- m_Format->pb = m_dllAvFormat.av_alloc_put_byte(m_BCBuffer, sizeof(m_BCBuffer), URL_RDONLY, this, NULL, MuxerReadPacket, NULL); ++ m_Format->pb = m_dllAvFormat.avio_alloc_context(m_BCBuffer, sizeof(m_BCBuffer), AVIO_FLAG_READ, this, NULL, MuxerReadPacket, NULL); + if (!m_Format->pb) + { + m_dllAvUtil.av_freep(&m_Format); +@@ -93,17 +89,8 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + m_Format->oformat = fmt; + m_Format->bit_rate = g_guiSettings.GetInt("audiocds.bitrate") * 1000; + +- /* setup the muxer */ +- if (m_dllAvFormat.av_set_parameters(m_Format, NULL) != 0) +- { +- m_dllAvUtil.av_freep(&m_Format->pb); +- m_dllAvUtil.av_freep(&m_Format); +- CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to set the muxer parameters"); +- return false; +- } +- + /* add a stream to it */ +- m_Stream = m_dllAvFormat.av_new_stream(m_Format, 1); ++ m_Stream = m_dllAvFormat.avformat_new_stream(m_Format, codec); + if (!m_Stream) + { + m_dllAvUtil.av_freep(&m_Format->pb); +@@ -144,7 +131,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + return false; + } + +- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) ++ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) + { + CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to open the codec"); + m_dllAvUtil.av_freep(&m_Stream); +@@ -179,7 +166,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + SetTag("encoder" , "XBMC FFmpeg Encoder"); + + /* write the header */ +- if (m_dllAvFormat.av_write_header(m_Format) != 0) ++ if (m_dllAvFormat.avformat_write_header(m_Format, NULL) != 0) + { + CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to write the header"); + delete[] m_Buffer; +@@ -194,7 +181,7 @@ bool CEncoderFFmpeg::Init(const char* strFile, int iInChannels, int iInRate, int + + void CEncoderFFmpeg::SetTag(const CStdString tag, const CStdString value) + { +- m_dllAvFormat.av_metadata_set2(&m_Format->metadata, tag.c_str(), value.c_str(), 0); ++ m_dllAvUtil.av_dict_set(&m_Format->metadata, tag.c_str(), value.c_str(), 0); + } + + int CEncoderFFmpeg::MuxerReadPacket(void *opaque, uint8_t *buf, int buf_size) +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp +index cebba1c..46fd47f 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp +@@ -29,10 +29,6 @@ + + CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() + { +- m_iBufferSize1 = 0; +- m_pBuffer1 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); +- memset(m_pBuffer1, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); +- + m_iBufferSize2 = 0; + m_pBuffer2 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); + memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); +@@ -45,11 +41,11 @@ CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() + m_channelMap[0] = PCM_INVALID; + m_channels = 0; + m_layout = 0; ++ m_pFrame1 = NULL; + } + + CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg() + { +- _aligned_free(m_pBuffer1); + _aligned_free(m_pBuffer2); + Dispose(); + } +@@ -59,12 +55,10 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + AVCodec* pCodec; + m_bOpenedCodec = false; + +- if (!m_dllAvCore.Load() || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) ++ if (!m_dllAvUtil.Load() || !m_dllAvCodec.Load()) + return false; + + m_dllAvCodec.avcodec_register_all(); +- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); +- m_dllAvCodec.avcodec_get_context_defaults(m_pCodecContext); + + pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); + if (!pCodec) +@@ -73,6 +67,7 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + return false; + } + ++ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); + m_pCodecContext->debug_mv = 0; + m_pCodecContext->debug = 0; + m_pCodecContext->workaround_bugs = 1; +@@ -97,13 +92,14 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + memcpy(m_pCodecContext->extradata, hints.extradata, hints.extrasize); + } + +- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) ++ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) + { + CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to open codec"); + Dispose(); + return false; + } + ++ m_pFrame1 = m_dllAvCodec.avcodec_alloc_frame(); + m_bOpenedCodec = true; + m_iSampleFormat = AV_SAMPLE_FMT_NONE; + return true; +@@ -111,6 +107,9 @@ bool CDVDAudioCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + + void CDVDAudioCodecFFmpeg::Dispose() + { ++ if (m_pFrame1) m_dllAvUtil.av_free(m_pFrame1); ++ m_pFrame1 = NULL; ++ + if (m_pConvert) + { + m_dllAvCodec.av_audio_convert_free(m_pConvert); +@@ -135,7 +134,7 @@ void CDVDAudioCodecFFmpeg::Dispose() + + int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) + { +- int iBytesUsed; ++ int iBytesUsed, got_frame; + if (!m_pCodecContext) return -1; + + m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ; +@@ -145,10 +144,17 @@ int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) + m_dllAvCodec.av_init_packet(&avpkt); + avpkt.data = pData; + avpkt.size = iSize; +- iBytesUsed = m_dllAvCodec.avcodec_decode_audio3( m_pCodecContext +- , (int16_t*)m_pBuffer1 +- , &m_iBufferSize1 ++ iBytesUsed = m_dllAvCodec.avcodec_decode_audio4( m_pCodecContext ++ , m_pFrame1 ++ , &got_frame + , &avpkt); ++ if (iBytesUsed < 0 || !got_frame) ++ { ++ m_iBufferSize1 = 0; ++ m_iBufferSize2 = 0; ++ return iBytesUsed; ++ } ++ m_iBufferSize1 = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, m_pCodecContext->sample_fmt, 1); + + /* some codecs will attempt to consume more data than what we gave */ + if (iBytesUsed > iSize) +@@ -184,9 +190,9 @@ int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) + return iBytesUsed; + } + +- const void *ibuf[6] = { m_pBuffer1 }; ++ const void *ibuf[6] = { m_pFrame1->data[0] }; + void *obuf[6] = { m_pBuffer2 }; +- int istr[6] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_pCodecContext->sample_fmt)/8 }; ++ int istr[6] = { m_dllAvUtil.av_get_bytes_per_sample(m_pCodecContext->sample_fmt) }; + int ostr[6] = { 2 }; + int len = m_iBufferSize1 / istr[0]; + if(m_dllAvCodec.av_audio_convert(m_pConvert, obuf, ostr, ibuf, istr, len) < 0) +@@ -208,7 +214,7 @@ int CDVDAudioCodecFFmpeg::GetData(BYTE** dst) + { + if(m_iBufferSize1) + { +- *dst = m_pBuffer1; ++ *dst = m_pFrame1->data[0]; + return m_iBufferSize1; + } + if(m_iBufferSize2) +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h +index dbd4948..4c01499 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h +@@ -23,7 +23,6 @@ + + #include "DVDAudioCodec.h" + #include "DllAvCodec.h" +-#include "DllAvCore.h" + #include "DllAvFormat.h" + #include "DllAvUtil.h" + +@@ -51,7 +50,7 @@ protected: + enum AVSampleFormat m_iSampleFormat; + enum PCMChannels m_channelMap[PCM_MAX_CH + 1]; + +- BYTE *m_pBuffer1; ++ AVFrame* m_pFrame1; + int m_iBufferSize1; + + BYTE *m_pBuffer2; +@@ -64,7 +63,6 @@ protected: + int64_t m_layout; + + DllAvCodec m_dllAvCodec; +- DllAvCore m_dllAvCore; + DllAvUtil m_dllAvUtil; + + void BuildChannelMap(); +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp +index 34e93a4..c0c3c06 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp +@@ -79,11 +79,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + /* get the muxer */ + AVOutputFormat *fOut = NULL; + +-#if LIBAVFORMAT_VERSION_MAJOR < 52 +- fOut = m_dllAvFormat.guess_format(muxerName.c_str(), NULL, NULL); +-#else + fOut = m_dllAvFormat.av_guess_format(muxerName.c_str(), NULL, NULL); +-#endif + if (!fOut) + { + CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to get the FFmpeg %s muxer", muxerName.c_str()); +@@ -103,7 +99,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + muxer.m_pFormat->oformat = fOut; + + /* allocate a put_byte struct so we can grab the output */ +- muxer.m_pFormat->pb = m_dllAvFormat.av_alloc_put_byte(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), URL_RDONLY, &muxer, NULL, MuxerReadPacket, NULL); ++ muxer.m_pFormat->pb = m_dllAvFormat.avio_alloc_context(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), AVIO_FLAG_READ, &muxer, NULL, MuxerReadPacket, NULL); + if (!muxer.m_pFormat->pb) + { + CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate ByteIOContext"); +@@ -112,21 +108,10 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + } + + /* this is streamed, no file, and ignore the index */ +- muxer.m_pFormat->pb->is_streamed = 1; ++ muxer.m_pFormat->pb->seekable = 0; + muxer.m_pFormat->flags |= AVFMT_NOFILE | AVFMT_FLAG_IGNIDX; + muxer.m_pFormat->bit_rate = hints.bitrate; + +- /* setup the muxer */ +- if (m_dllAvFormat.av_set_parameters(muxer.m_pFormat, NULL) != 0) +- { +- CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to set the %s muxer parameters", muxerName.c_str()); +- Dispose(); +- return false; +- } +- +-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,92,0) +- // API added on: 2011-01-02 +- + /* While this is strictly only needed on big-endian systems, we do it on + * both to avoid as much dead code as possible. + * CoreAudio (at least on the cases we've seen) wants IEC 61937 in +@@ -138,8 +123,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + #endif + + /* request output of wanted endianness */ +- if (!fOut->priv_class || m_dllAvUtil.av_set_string3(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0, NULL) != 0) +-#endif ++ if (!fOut->priv_class || m_dllAvUtil.av_opt_set(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0) != 0) + { + #if defined(WORDS_BIGENDIAN) && !defined(__APPLE__) + CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Unable to set big-endian stream mode (FFmpeg too old?), disabling passthrough"); +@@ -149,7 +133,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + } + + /* add a stream to it */ +- muxer.m_pStream = m_dllAvFormat.av_new_stream(muxer.m_pFormat, 1); ++ muxer.m_pStream = m_dllAvFormat.avformat_new_stream(muxer.m_pFormat, NULL); + if (!muxer.m_pStream) + { + CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate AVStream context"); +@@ -159,8 +143,6 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + + + /* set the stream's parameters */ +- muxer.m_pStream->stream_copy = 1; +- + m_SampleRate = hints.samplerate; + if(!m_SampleRate && hints.codec == CODEC_ID_AC3) + m_SampleRate = 48000; +@@ -176,7 +158,7 @@ bool CDVDAudioCodecPassthroughFFmpeg::SetupMuxer(CDVDStreamInfo &hints, CStdStri + codec->extradata_size = hints.extrasize; + memcpy(codec->extradata, hints.extradata, hints.extrasize); + +- muxer.m_WroteHeader = m_dllAvFormat.av_write_header(muxer.m_pFormat) == 0; ++ muxer.m_WroteHeader = m_dllAvFormat.avformat_write_header(muxer.m_pFormat, NULL) == 0; + if (!muxer.m_WroteHeader) + { + CLog::Log(LOGERROR, "CDVDAudioCodecPassthrough::SetupMuxer - Failed to write the frame header"); +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp +index 77d4b64..0189e65 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp +@@ -55,7 +55,7 @@ CDVDAudioEncoderFFmpeg::~CDVDAudioEncoderFFmpeg() + bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels *channelMap, unsigned int bitsPerSample, unsigned int sampleRate) + { + Reset(); +- if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCore.Load() || !m_dllAvCodec.Load()) ++ if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) + return false; + + m_dllAvCodec.avcodec_register_all(); +@@ -65,7 +65,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels + return false; + + /* always assume 6 channels, 5.1... m_remap will give us what we want */ +- m_CodecCtx = m_dllAvCodec.avcodec_alloc_context(); ++ m_CodecCtx = m_dllAvCodec.avcodec_alloc_context3(codec); + m_CodecCtx->bit_rate = AC3_ENCODE_BITRATE; + m_CodecCtx->sample_rate = sampleRate; + m_CodecCtx->channels = 6; +@@ -104,7 +104,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels + } + } + +- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) ++ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) + { + m_dllAvUtil.av_freep(&m_CodecCtx); + return false; +@@ -149,7 +149,7 @@ bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels + + if (m_AudioConvert) + m_TmpBuffer2 = new uint8_t[m_NeededFrames * m_CodecCtx->channels * +- m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8]; ++ m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt)]; + + return true; + } +@@ -186,7 +186,7 @@ int CDVDAudioEncoderFFmpeg::Encode(uint8_t *data, int size) + void *convInBuf[] = { m_TmpBuffer }; + int convInStr[] = { m_BitsPerSample / 8 }; + void *convOutBuf[] = { m_TmpBuffer2 }; +- int convOutStr[] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8 }; ++ int convOutStr[] = { m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt) }; + if (m_dllAvCodec.av_audio_convert(m_AudioConvert, convOutBuf, convOutStr, + convInBuf, convInStr, m_NeededFrames * m_CodecCtx->channels) < 0) { + CLog::Log(LOGERROR, "CDVDAudioEncoderFFmpeg: Audio conversion failed"); +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h +index 93bd2c7..40be42b 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h +@@ -43,7 +43,6 @@ public: + virtual int GetData(uint8_t **data); + private: + DllAvCodec m_dllAvCodec; +- DllAvCore m_dllAvCore; + DllAvUtil m_dllAvUtil; + + AVCodecContext *m_CodecCtx; +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp +index 563ce78..238c855 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp +@@ -49,7 +49,14 @@ bool CDVDOverlayCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &optio + + m_dllAvCodec.avcodec_register_all(); + +- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); ++ AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); ++ if (!pCodec) ++ { ++ CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); ++ return false; ++ } ++ ++ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); + m_pCodecContext->debug_mv = 0; + m_pCodecContext->debug = 0; + m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; +@@ -100,14 +107,7 @@ bool CDVDOverlayCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &optio + delete[] parse_extra; + } + +- AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); +- if (!pCodec) +- { +- CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); +- return false; +- } +- +- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) ++ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) + { + CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); + return false; +@@ -134,19 +134,12 @@ void CDVDOverlayCodecFFmpeg::FreeSubtitle(AVSubtitle& sub) + { + for(unsigned i=0;i= (52<<10) + if(sub.rects[i]) + { + m_dllAvUtil.av_free(sub.rects[i]->pict.data[0]); + m_dllAvUtil.av_free(sub.rects[i]->pict.data[1]); + m_dllAvUtil.av_freep(&sub.rects[i]); + } +-#else +- if(sub.rects[i].bitmap) +- m_dllAvUtil.av_freep(&sub.rects[i].bitmap); +- if(m_Subtitle.rects[i].rgba_palette) +- m_dllAvUtil.av_freep(&sub.rects[i].rgba_palette); +-#endif + } + if(sub.rects) + m_dllAvUtil.av_freep(&sub.rects); +@@ -294,7 +287,6 @@ CDVDOverlay* CDVDOverlayCodecFFmpeg::GetOverlay() + overlay->source_width = m_width; + overlay->source_height = m_height; + +-#if LIBAVCODEC_VERSION_INT >= (52<<10) + BYTE* s = rect.pict.data[0]; + BYTE* t = overlay->data; + for(int i=0;idata; +- for(int i=0;ilinesize; +- } +- +- memcpy(overlay->palette, rect.rgba_palette, rect.nb_colors*4); +- +- m_dllAvUtil.av_freep(&rect.bitmap); +- m_dllAvUtil.av_freep(&rect.rgba_palette); +-#endif + m_SubtitleIndex++; + + return overlay; +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index 637a371..7ac6b6b 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +@@ -123,12 +123,11 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx + CDVDVideoCodecFFmpeg::CDVDVideoCodecFFmpeg() : CDVDVideoCodec() + { + m_pCodecContext = NULL; +- m_pConvertFrame = NULL; + m_pFrame = NULL; + m_pFilterGraph = NULL; + m_pFilterIn = NULL; + m_pFilterOut = NULL; +- m_pFilterLink = NULL; ++ m_pBufferRef = NULL; + + m_iPictureWidth = 0; + m_iPictureHeight = 0; +@@ -163,9 +162,13 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + m_dllAvFilter.avfilter_register_all(); + + m_bSoftware = hints.software; +- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); ++ ++ m_formats.push_back(PIX_FMT_YUV420P); ++ m_formats.push_back(PIX_FMT_YUVJ420P); ++ m_formats.push_back(PIX_FMT_NONE); /* always add none to get a terminated list in ffmpeg world */ + + pCodec = NULL; ++ m_pCodecContext = NULL; + + if (hints.codec == CODEC_ID_H264) + { +@@ -196,6 +199,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + + CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); + CVDPAU* vdp = new CVDPAU(); ++ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); + m_pCodecContext->codec_id = hints.codec; + m_pCodecContext->width = hints.width; + m_pCodecContext->height = hints.height; +@@ -207,7 +211,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set + break; + } +- m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set ++ m_dllAvUtil.av_freep(&m_pCodecContext); + CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Failed to get VDPAU device"); + vdp->Release(); + } +@@ -226,21 +230,26 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + + CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Using codec: %s",pCodec->long_name ? pCodec->long_name : pCodec->name); + ++ if(m_pCodecContext == NULL) ++ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); ++ + m_pCodecContext->opaque = (void*)this; + m_pCodecContext->debug_mv = 0; + m_pCodecContext->debug = 0; + m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; + m_pCodecContext->get_format = GetFormat; + m_pCodecContext->codec_tag = hints.codec_tag; ++ /* Only allow slice threading, since frame threading is more ++ * sensitive to changes in frame sizes, and it causes crashes ++ * during HW accell */ ++ m_pCodecContext->thread_type = FF_THREAD_SLICE; + + #if defined(__APPLE__) && defined(__arm__) + // ffmpeg with enabled neon will crash and burn if this is enabled + m_pCodecContext->flags &= CODEC_FLAG_EMU_EDGE; + #else + if (pCodec->id != CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1 +-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,69,0) + && pCodec->id != CODEC_ID_VP8 +-#endif + ) + m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE; + #endif +@@ -272,16 +281,16 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + if (it->m_name == "surfaces") + m_uSurfacesCount = std::atoi(it->m_value.c_str()); + else +- m_dllAvUtil.av_set_string3(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0, NULL); ++ m_dllAvUtil.av_opt_set(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0); + } + + int num_threads = std::min(8 /*MAX_THREADS*/, g_cpuInfo.getCPUCount()); + if( num_threads > 1 && !hints.software && m_pHardware == NULL // thumbnail extraction fails when run threaded + && ( pCodec->id == CODEC_ID_H264 + || pCodec->id == CODEC_ID_MPEG4 )) +- m_dllAvCodec.avcodec_thread_init(m_pCodecContext, num_threads); ++ m_pCodecContext->thread_count = num_threads; + +- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) ++ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) + { + CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); + return false; +@@ -290,14 +299,7 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options + m_pFrame = m_dllAvCodec.avcodec_alloc_frame(); + if (!m_pFrame) return false; + +- if(pCodec->name) +- m_name = CStdString("ff-") + pCodec->name; +- else +- m_name = "ffmpeg"; +- +- if(m_pHardware) +- m_name += "-" + m_pHardware->Name(); +- ++ UpdateName(); + return true; + } + +@@ -306,13 +308,6 @@ void CDVDVideoCodecFFmpeg::Dispose() + if (m_pFrame) m_dllAvUtil.av_free(m_pFrame); + m_pFrame = NULL; + +- if (m_pConvertFrame) +- { +- m_dllAvCodec.avpicture_free(m_pConvertFrame); +- m_dllAvUtil.av_free(m_pConvertFrame); +- } +- m_pConvertFrame = NULL; +- + if (m_pCodecContext) + { + if (m_pCodecContext->codec) m_dllAvCodec.avcodec_close(m_pCodecContext); +@@ -458,9 +453,6 @@ int CDVDVideoCodecFFmpeg::Decode(BYTE* pData, int iSize, double dts, double pts) + return VC_ERROR; + } + +- if (len != iSize && m_pCodecContext->skip_frame != AVDISCARD_NONREF) +- CLog::Log(LOGWARNING, "%s - avcodec_decode_video didn't consume the full packet. size: %d, consumed: %d", __FUNCTION__, iSize, len); +- + if (!iGotPicture) + return VC_BUFFER; + +@@ -478,67 +470,32 @@ int CDVDVideoCodecFFmpeg::Decode(BYTE* pData, int iSize, double dts, double pts) + if(m_pCodecContext->codec_id == CODEC_ID_H264) + m_started = true; + +- if(m_pCodecContext->pix_fmt != PIX_FMT_YUV420P +- && m_pCodecContext->pix_fmt != PIX_FMT_YUVJ420P +- && m_pHardware == NULL) ++ if(m_pHardware == NULL) + { +- if (!m_dllSwScale.IsLoaded() && !m_dllSwScale.Load()) +- return VC_ERROR; ++ bool need_scale = std::find( m_formats.begin() ++ , m_formats.end() ++ , m_pCodecContext->pix_fmt) == m_formats.end(); + +- if (!m_pConvertFrame) +- { +- // Allocate an AVFrame structure +- m_pConvertFrame = (AVPicture*)m_dllAvUtil.av_mallocz(sizeof(AVPicture)); +- // Due to a bug in swsscale we need to allocate one extra line of data +- if(m_dllAvCodec.avpicture_alloc( m_pConvertFrame +- , PIX_FMT_YUV420P +- , m_pCodecContext->width +- , m_pCodecContext->height+1) < 0) +- { +- m_dllAvUtil.av_free(m_pConvertFrame); +- m_pConvertFrame = NULL; +- return VC_ERROR; +- } +- } ++ bool need_reopen = false; ++ if(!m_filters.Equals(m_filters_next)) ++ need_reopen = true; + +- // convert the picture +- struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, +- m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, +- PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); +- +- if(context == NULL) ++ if(m_pFilterIn) + { +- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::Decode - unable to obtain sws context for w:%i, h:%i, pixfmt: %i", m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt); +- return VC_ERROR; ++ if(m_pFilterIn->outputs[0]->format != m_pCodecContext->pix_fmt ++ || m_pFilterIn->outputs[0]->w != m_pCodecContext->width ++ || m_pFilterIn->outputs[0]->h != m_pCodecContext->height) ++ need_reopen = true; + } + +- m_dllSwScale.sws_scale(context +- , m_pFrame->data +- , m_pFrame->linesize +- , 0 +- , m_pCodecContext->height +- , m_pConvertFrame->data +- , m_pConvertFrame->linesize); +- +- m_dllSwScale.sws_freeContext(context); +- } +- else +- { +- // no need to convert, just free any existing convert buffers +- if (m_pConvertFrame) ++ // try to setup new filters ++ if (need_reopen || (need_scale && m_pFilterGraph == NULL)) + { +- m_dllAvCodec.avpicture_free(m_pConvertFrame); +- m_dllAvUtil.av_free(m_pConvertFrame); +- m_pConvertFrame = NULL; +- } +- } ++ m_filters = m_filters_next; + +- // try to setup new filters +- if (!m_filters.Equals(m_filters_next)) +- { +- m_filters = m_filters_next; +- if(FilterOpen(m_filters) < 0) +- FilterClose(); ++ if(FilterOpen(m_filters, need_scale) < 0) ++ FilterClose(); ++ } + } + + int result; +@@ -564,12 +521,6 @@ void CDVDVideoCodecFFmpeg::Reset() + if (m_pHardware) + m_pHardware->Reset(); + +- if (m_pConvertFrame) +- { +- m_dllAvCodec.avpicture_free(m_pConvertFrame); +- m_dllAvUtil.av_free(m_pConvertFrame); +- m_pConvertFrame = NULL; +- } + m_filters = ""; + FilterClose(); + } +@@ -579,10 +530,10 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) + pDvdVideoPicture->iWidth = m_pCodecContext->width; + pDvdVideoPicture->iHeight = m_pCodecContext->height; + +- if(m_pFilterLink) ++ if(m_pBufferRef) + { +- pDvdVideoPicture->iWidth = m_pFilterLink->cur_buf->video->w; +- pDvdVideoPicture->iHeight = m_pFilterLink->cur_buf->video->h; ++ pDvdVideoPicture->iWidth = m_pBufferRef->video->w; ++ pDvdVideoPicture->iHeight = m_pBufferRef->video->h; + } + + /* crop of 10 pixels if demuxer asked it */ +@@ -598,12 +549,8 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) + + /* use variable in the frame */ + AVRational pixel_aspect = m_pCodecContext->sample_aspect_ratio; +- if (m_pFilterLink) +-#ifdef HAVE_AVFILTERBUFFERREFVIDEOPROPS_SAMPLE_ASPECT_RATIO +- pixel_aspect = m_pFilterLink->cur_buf->video->sample_aspect_ratio; +-#else +- pixel_aspect = m_pFilterLink->cur_buf->video->pixel_aspect; +-#endif ++ if (m_pBufferRef) ++ pixel_aspect = m_pBufferRef->video->sample_aspect_ratio; + + if (pixel_aspect.num == 0) + aspect_ratio = 0; +@@ -632,8 +579,6 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) + pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; + pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; + pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; +- if(m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P) +- pDvdVideoPicture->color_range = 1; + + pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location; + pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries; +@@ -677,14 +622,6 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) + if(!GetPictureCommon(pDvdVideoPicture)) + return false; + +- if(m_pConvertFrame) +- { +- for (int i = 0; i < 4; i++) +- pDvdVideoPicture->data[i] = m_pConvertFrame->data[i]; +- for (int i = 0; i < 4; i++) +- pDvdVideoPicture->iLineSize[i] = m_pConvertFrame->linesize[i]; +- } +- else + { + for (int i = 0; i < 4; i++) + pDvdVideoPicture->data[i] = m_pFrame->data[i]; +@@ -693,20 +630,38 @@ bool CDVDVideoCodecFFmpeg::GetPicture(DVDVideoPicture* pDvdVideoPicture) + } + + pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; +- pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; + pDvdVideoPicture->extended_format = 0; ++ pDvdVideoPicture->color_range = 0; ++ ++ PixelFormat pix_fmt; ++ if(m_pBufferRef) ++ pix_fmt = (PixelFormat)m_pBufferRef->format; ++ else ++ pix_fmt = m_pCodecContext->pix_fmt; ++ ++ switch(pix_fmt) ++ { ++ case PIX_FMT_YUVJ420P: ++ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; ++ pDvdVideoPicture->color_range = 1; ++ break; ++ default: ++ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; ++ break; ++ } + + return true; + } + +-int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) ++int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters, bool scale) + { + int result; ++ AVBufferSinkParams *buffersink_params; + + if (m_pFilterGraph) + FilterClose(); + +- if (filters.IsEmpty()) ++ if (filters.IsEmpty() && !scale) + return 0; + + if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) +@@ -715,17 +670,8 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) + return -1; + } + +- // CrHasher HACK (if an alternative becomes available use it!): In order to display the output +- // produced by a combination of filters we insert "nullsink" as the last filter and we use +- // its input pin as our output pin. +- // +- // input --> .. --> last_filter --> [in] nullsink [null] [in] --> output +- // | | +- // | | +- // +------------------------+ +- // + AVFilter* srcFilter = m_dllAvFilter.avfilter_get_by_name("buffer"); +- AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("nullsink"); // should be last filter in the graph for now ++ AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("buffersink"); // should be last filter in the graph for now + + CStdString args; + +@@ -744,11 +690,19 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) + return result; + } + +- if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, NULL/*nullsink=>NULL*/, m_pFilterGraph)) < 0) ++ buffersink_params = m_dllAvFilter.av_buffersink_params_alloc(); ++ buffersink_params->pixel_fmts = &m_formats[0]; ++#ifdef FF_API_OLD_VSINK_API ++ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, (void*)buffersink_params->pixel_fmts, m_pFilterGraph)) < 0) ++#else ++ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, buffersink_params, m_pFilterGraph)) < 0) ++#endif + { ++ m_dllAvUtil.av_freep(&buffersink_params); + CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: out"); + return result; + } ++ m_dllAvUtil.av_freep(&buffersink_params); + + if (!filters.empty()) + { +@@ -794,6 +748,12 @@ int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) + + void CDVDVideoCodecFFmpeg::FilterClose() + { ++ if(m_pBufferRef) ++ { ++ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); ++ m_pBufferRef = NULL; ++ } ++ + if (m_pFilterGraph) + { + m_dllAvFilter.avfilter_graph_free(&m_pFilterGraph); +@@ -801,7 +761,6 @@ void CDVDVideoCodecFFmpeg::FilterClose() + // Disposed by above code + m_pFilterIn = NULL; + m_pFilterOut = NULL; +- m_pFilterLink = NULL; + } + } + +@@ -809,24 +768,9 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) + { + int result, frames; + +- m_pFilterLink = m_pFilterOut->inputs[0]; +- + if (frame) + { +-#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); +-#else +-#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) + result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); +-#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame); +-#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts); +-#else +- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); +-#endif +-#endif +- + if (result < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); +@@ -834,7 +778,13 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) + } + } + +- if ((frames = m_dllAvFilter.avfilter_poll_frame(m_pFilterLink)) < 0) ++ if(m_pBufferRef) ++ { ++ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); ++ m_pBufferRef = NULL; ++ } ++ ++ if ((frames = m_dllAvFilter.av_buffersink_poll_frame(m_pFilterOut)) < 0) + { + CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); + return VC_ERROR; +@@ -842,19 +792,9 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) + + if (frames > 0) + { +- if (m_pFilterLink->cur_buf) +- { +- m_dllAvFilter.avfilter_unref_buffer(m_pFilterLink->cur_buf); +- m_pFilterLink->cur_buf = NULL; +- } +- +- if ((result = m_dllAvFilter.avfilter_request_frame(m_pFilterLink)) < 0) +- { +- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_request_frame"); +- return VC_ERROR; +- } + +- if (!m_pFilterLink->cur_buf) ++ result = m_dllAvFilter.av_buffersink_get_buffer_ref(m_pFilterOut, &m_pBufferRef, 0); ++ if(!m_pBufferRef) + { + CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); + return VC_ERROR; +@@ -865,11 +805,11 @@ int CDVDVideoCodecFFmpeg::FilterProcess(AVFrame* frame) + else + m_pFrame->repeat_pict = -(frames - 1); + +- m_pFrame->interlaced_frame = m_pFilterLink->cur_buf->video->interlaced; +- m_pFrame->top_field_first = m_pFilterLink->cur_buf->video->top_field_first; ++ m_pFrame->interlaced_frame = m_pBufferRef->video->interlaced; ++ m_pFrame->top_field_first = m_pBufferRef->video->top_field_first; + +- memcpy(m_pFrame->linesize, m_pFilterLink->cur_buf->linesize, 4*sizeof(int)); +- memcpy(m_pFrame->data , m_pFilterLink->cur_buf->data , 4*sizeof(uint8_t*)); ++ memcpy(m_pFrame->linesize, m_pBufferRef->linesize, 4*sizeof(int)); ++ memcpy(m_pFrame->data , m_pBufferRef->data , 4*sizeof(uint8_t*)); + + if(frames > 1) + return VC_PICTURE; +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +index 53890cb..b958509 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +@@ -68,27 +68,36 @@ public: + { + SAFE_RELEASE(m_pHardware); + m_pHardware = hardware; +- m_name += "-"; +- m_name += m_pHardware->Name(); ++ UpdateName(); + } + + protected: + static enum PixelFormat GetFormat(struct AVCodecContext * avctx, const PixelFormat * fmt); + +- int FilterOpen(const CStdString& filters); ++ int FilterOpen(const CStdString& filters, bool scale); + void FilterClose(); + int FilterProcess(AVFrame* frame); + ++ void UpdateName() ++ { ++ if(m_pCodecContext->codec->name) ++ m_name = CStdString("ff-") + m_pCodecContext->codec->name; ++ else ++ m_name = "ffmpeg"; ++ ++ if(m_pHardware) ++ m_name += "-" + m_pHardware->Name(); ++ } ++ + AVFrame* m_pFrame; + AVCodecContext* m_pCodecContext; + +- AVPicture* m_pConvertFrame; + CStdString m_filters; + CStdString m_filters_next; + AVFilterGraph* m_pFilterGraph; + AVFilterContext* m_pFilterIn; + AVFilterContext* m_pFilterOut; +- AVFilterLink* m_pFilterLink; ++ AVFilterBufferRef* m_pBufferRef; + + int m_iPictureWidth; + int m_iPictureHeight; +@@ -109,4 +118,5 @@ protected: + int m_iLastKeyframe; + double m_dts; + bool m_started; ++ std::vector m_formats; + }; +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp +index 0238864..c9f0650 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp +@@ -525,8 +525,8 @@ const int avc_parse_nal_units(DllAvFormat *av_format_ctx, + { + while (!*(nal_start++)); + nal_end = avc_find_startcode(nal_start, end); +- av_format_ctx->put_be32(pb, nal_end - nal_start); +- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); ++ av_format_ctx->avio_wb32(pb, nal_end - nal_start); ++ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); + size += 4 + nal_end - nal_start; + nal_start = nal_end; + } +@@ -537,14 +537,14 @@ const int avc_parse_nal_units_buf(DllAvUtil *av_util_ctx, DllAvFormat *av_format + const uint8_t *buf_in, uint8_t **buf, int *size) + { + ByteIOContext *pb; +- int ret = av_format_ctx->url_open_dyn_buf(&pb); ++ int ret = av_format_ctx->avio_open_dyn_buf(&pb); + if (ret < 0) + return ret; + + avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); + + av_util_ctx->av_freep(buf); +- *size = av_format_ctx->url_close_dyn_buf(pb, buf); ++ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); + return 0; + } + +@@ -590,26 +590,26 @@ const int isom_write_avcc(DllAvUtil *av_util_ctx, DllAvFormat *av_format_ctx, + } + assert(sps); + +- av_format_ctx->put_byte(pb, 1); /* version */ +- av_format_ctx->put_byte(pb, sps[1]); /* profile */ +- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ +- av_format_ctx->put_byte(pb, sps[3]); /* level */ +- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ +- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ ++ av_format_ctx->avio_w8(pb, 1); /* version */ ++ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ ++ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ ++ av_format_ctx->avio_w8(pb, sps[3]); /* level */ ++ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ ++ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ + +- av_format_ctx->put_be16(pb, sps_size); +- av_format_ctx->put_buffer(pb, sps, sps_size); ++ av_format_ctx->avio_wb16(pb, sps_size); ++ av_format_ctx->avio_write(pb, sps, sps_size); + if (pps) + { +- av_format_ctx->put_byte(pb, 1); /* number of pps */ +- av_format_ctx->put_be16(pb, pps_size); +- av_format_ctx->put_buffer(pb, pps, pps_size); ++ av_format_ctx->avio_w8(pb, 1); /* number of pps */ ++ av_format_ctx->avio_wb16(pb, pps_size); ++ av_format_ctx->avio_write(pb, pps, pps_size); + } + av_util_ctx->av_free(start); + } + else + { +- av_format_ctx->put_buffer(pb, data, len); ++ av_format_ctx->avio_write(pb, data, len); + } + } + return 0; +@@ -706,7 +706,7 @@ bool CDVDVideoCodecVDA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) + } + + ByteIOContext *pb; +- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + { + return false; + } +@@ -717,7 +717,7 @@ bool CDVDVideoCodecVDA::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options) + // unhook from ffmpeg's extradata + extradata = NULL; + // extract the avcC atom data into extradata then write it into avcCData for VDADecoder +- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); ++ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); + // CFDataCreate makes a copy of extradata contents + avcCData = CFDataCreate(kCFAllocatorDefault, (const uint8_t*)extradata, extrasize); + // done with the converted extradata, we MUST free using av_free +@@ -948,12 +948,12 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) + int demuxer_bytes; + uint8_t *demuxer_content; + +- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + { + return VC_ERROR; + } + demuxer_bytes = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); +- demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); ++ demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); + avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); + m_dllAvUtil->av_free(demuxer_content); + } +@@ -961,7 +961,7 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) + { + // convert demuxer packet from 3 byte NAL sizes to 4 byte + ByteIOContext *pb; +- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + return VC_ERROR; + + uint32_t nal_size; +@@ -970,14 +970,14 @@ int CDVDVideoCodecVDA::Decode(BYTE* pData, int iSize, double dts, double pts) + while (nal_start < end) + { + nal_size = VDA_RB24(nal_start); +- m_dllAvFormat->put_be32(pb, nal_size); ++ m_dllAvFormat->avio_wb32(pb, nal_size); + nal_start += 3; +- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); ++ m_dllAvFormat->avio_write(pb, nal_start, nal_size); + nal_start += nal_size; + } + + uint8_t *demuxer_content; +- int demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); ++ int demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); + avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); + m_dllAvUtil->av_free(demuxer_content); + } +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp +index 5f512fb..cca5318 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp +@@ -474,7 +474,7 @@ int quicktime_write_mp4_descr_length(DllAvFormat *av_format_ctx, ByteIOContext * + { + b |= 0x80; + } +- av_format_ctx->put_byte(pb, b); ++ av_format_ctx->avio_w8(pb, b); + } + + return numBytes; +@@ -482,37 +482,37 @@ int quicktime_write_mp4_descr_length(DllAvFormat *av_format_ctx, ByteIOContext * + + void quicktime_write_esds(DllAvFormat *av_format_ctx, ByteIOContext *pb, quicktime_esds_t *esds) + { +- av_format_ctx->put_byte(pb, 0); // Version +- av_format_ctx->put_be24(pb, 0); // Flags ++ av_format_ctx->avio_w8(pb, 0); // Version ++ av_format_ctx->avio_wb24(pb, 0); // Flags + + // elementary stream descriptor tag +- av_format_ctx->put_byte(pb, 0x03); ++ av_format_ctx->avio_w8(pb, 0x03); + quicktime_write_mp4_descr_length(av_format_ctx, pb, + 3 + 5 + (13 + 5 + esds->decoderConfigLen) + 3, false); + // 3 bytes + 5 bytes for tag +- av_format_ctx->put_be16(pb, esds->esid); +- av_format_ctx->put_byte(pb, esds->stream_priority); ++ av_format_ctx->avio_wb16(pb, esds->esid); ++ av_format_ctx->avio_w8(pb, esds->stream_priority); + + // decoder configuration description tag +- av_format_ctx->put_byte(pb, 0x04); ++ av_format_ctx->avio_w8(pb, 0x04); + quicktime_write_mp4_descr_length(av_format_ctx, pb, + 13 + 5 + esds->decoderConfigLen, false); + // 13 bytes + 5 bytes for tag +- av_format_ctx->put_byte(pb, esds->objectTypeId); // objectTypeIndication +- av_format_ctx->put_byte(pb, esds->streamType); // streamType +- av_format_ctx->put_be24(pb, esds->bufferSizeDB); // buffer size +- av_format_ctx->put_be32(pb, esds->maxBitrate); // max bitrate +- av_format_ctx->put_be32(pb, esds->avgBitrate); // average bitrate ++ av_format_ctx->avio_w8(pb, esds->objectTypeId); // objectTypeIndication ++ av_format_ctx->avio_w8(pb, esds->streamType); // streamType ++ av_format_ctx->avio_wb24(pb, esds->bufferSizeDB); // buffer size ++ av_format_ctx->avio_wb32(pb, esds->maxBitrate); // max bitrate ++ av_format_ctx->avio_wb32(pb, esds->avgBitrate); // average bitrate + + // decoder specific description tag +- av_format_ctx->put_byte(pb, 0x05); ++ av_format_ctx->avio_w8(pb, 0x05); + quicktime_write_mp4_descr_length(av_format_ctx, pb, esds->decoderConfigLen, false); +- av_format_ctx->put_buffer(pb, esds->decoderConfig, esds->decoderConfigLen); ++ av_format_ctx->avio_write(pb, esds->decoderConfig, esds->decoderConfigLen); + + // sync layer configuration descriptor tag +- av_format_ctx->put_byte(pb, 0x06); // tag +- av_format_ctx->put_byte(pb, 0x01); // length +- av_format_ctx->put_byte(pb, 0x7F); // no SL ++ av_format_ctx->avio_w8(pb, 0x06); // tag ++ av_format_ctx->avio_w8(pb, 0x01); // length ++ av_format_ctx->avio_w8(pb, 0x7F); // no SL + + /* no IPI_DescrPointer */ + /* no IP_IdentificationDataSet */ +@@ -666,8 +666,8 @@ const int avc_parse_nal_units(DllAvFormat *av_format_ctx, + { + while (!*(nal_start++)); + nal_end = avc_find_startcode(nal_start, end); +- av_format_ctx->put_be32(pb, nal_end - nal_start); +- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); ++ av_format_ctx->avio_wb32(pb, nal_end - nal_start); ++ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); + size += 4 + nal_end - nal_start; + nal_start = nal_end; + } +@@ -678,14 +678,14 @@ const int avc_parse_nal_units_buf(DllAvUtil *av_util_ctx, DllAvFormat *av_format + const uint8_t *buf_in, uint8_t **buf, int *size) + { + ByteIOContext *pb; +- int ret = av_format_ctx->url_open_dyn_buf(&pb); ++ int ret = av_format_ctx->avio_open_dyn_buf(&pb); + if (ret < 0) + return ret; + + avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); + + av_util_ctx->av_freep(buf); +- *size = av_format_ctx->url_close_dyn_buf(pb, buf); ++ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); + return 0; + } + +@@ -770,26 +770,26 @@ const int isom_write_avcc(DllAvUtil *av_util_ctx, DllAvFormat *av_format_ctx, + } + assert(sps); + +- av_format_ctx->put_byte(pb, 1); /* version */ +- av_format_ctx->put_byte(pb, sps[1]); /* profile */ +- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ +- av_format_ctx->put_byte(pb, sps[3]); /* level */ +- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ +- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ ++ av_format_ctx->avio_w8(pb, 1); /* version */ ++ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ ++ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ ++ av_format_ctx->avio_w8(pb, sps[3]); /* level */ ++ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ ++ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ + +- av_format_ctx->put_be16(pb, sps_size); +- av_format_ctx->put_buffer(pb, sps, sps_size); ++ av_format_ctx->avio_wb16(pb, sps_size); ++ av_format_ctx->avio_write(pb, sps, sps_size); + if (pps) + { +- av_format_ctx->put_byte(pb, 1); /* number of pps */ +- av_format_ctx->put_be16(pb, pps_size); +- av_format_ctx->put_buffer(pb, pps, pps_size); ++ av_format_ctx->avio_w8(pb, 1); /* number of pps */ ++ av_format_ctx->avio_wb16(pb, pps_size); ++ av_format_ctx->avio_write(pb, pps, pps_size); + } + av_util_ctx->av_free(start); + } + else + { +- av_format_ctx->put_buffer(pb, data, len); ++ av_format_ctx->avio_write(pb, data, len); + } + } + return 0; +@@ -1086,7 +1086,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o + ByteIOContext *pb; + quicktime_esds_t *esds; + +- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + return false; + + esds = quicktime_set_esds(m_dllAvFormat, extradata, extrasize); +@@ -1095,7 +1095,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o + // unhook from ffmpeg's extradata + extradata = NULL; + // extract the esds atom decoderConfig from extradata +- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); ++ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); + free(esds->decoderConfig); + free(esds); + +@@ -1152,7 +1152,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o + // NAL reformating to bitstream format required + + ByteIOContext *pb; +- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + return false; + + m_convert_bytestream = true; +@@ -1161,7 +1161,7 @@ bool CDVDVideoCodecVideoToolBox::Open(CDVDStreamInfo &hints, CDVDCodecOptions &o + // unhook from ffmpeg's extradata + extradata = NULL; + // extract the avcC atom data into extradata getting size into extrasize +- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); ++ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); + + // check for interlaced and get number of ref frames + if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames)) +@@ -1301,17 +1301,17 @@ int CDVDVideoCodecVideoToolBox::Decode(BYTE* pData, int iSize, double dts, doubl + if (m_convert_bytestream) + { + // convert demuxer packet from bytestream (AnnexB) to bitstream +- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + return VC_ERROR; + + demux_size = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); +- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); ++ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); + sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); + } + else if (m_convert_3byteTo4byteNALSize) + { + // convert demuxer packet from 3 byte NAL sizes to 4 byte +- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) ++ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) + return VC_ERROR; + + uint32_t nal_size; +@@ -1320,13 +1320,13 @@ int CDVDVideoCodecVideoToolBox::Decode(BYTE* pData, int iSize, double dts, doubl + while (nal_start < end) + { + nal_size = VDA_RB24(nal_start); +- m_dllAvFormat->put_be32(pb, nal_size); ++ m_dllAvFormat->avio_wb32(pb, nal_size); + nal_start += 3; +- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); ++ m_dllAvFormat->avio_write(pb, nal_start, nal_size); + nal_start += nal_size; + } + +- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); ++ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); + sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); + } + else +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +index 18fe368..a4b8725 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +@@ -223,7 +223,6 @@ int CDecoder::GetBuffer(AVCodecContext *avctx, AVFrame *pic) + } + + pic->type = FF_BUFFER_TYPE_USER; +- pic->age = 1; + pic->data[0] = (uint8_t*)wrapper; + pic->data[1] = NULL; + pic->data[2] = NULL; +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index 0e67af3..7379d60 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -1211,14 +1211,12 @@ int CVDPAU::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + + if(pic->reference) + { +- pic->age = pA->ip_age[0]; + pA->ip_age[0]= pA->ip_age[1]+1; + pA->ip_age[1]= 1; + pA->b_age++; + } + else + { +- pic->age = pA->b_age; + pA->ip_age[0]++; + pA->ip_age[1]++; + pA->b_age = 1; +diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +index 55138fa..31b6634 100644 +--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +@@ -161,7 +161,7 @@ static TLS g_tls; + #define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) + #endif + +-static int interrupt_cb(void) ++static int interrupt_cb(void* unused) + { + if(g_demuxer && g_demuxer->Aborted()) + return 1; +@@ -179,7 +179,7 @@ static int dvd_file_open(URLContext *h, const char *filename, int flags) + + static int dvd_file_read(void *h, uint8_t* buf, int size) + { +- if(interrupt_cb()) ++ if(interrupt_cb(NULL)) + return -1; + + CDVDInputStream* pInputStream = (CDVDInputStream*)h; +@@ -193,7 +193,7 @@ static int dvd_file_write(URLContext *h, BYTE* buf, int size) + */ + static offset_t dvd_file_seek(void *h, offset_t pos, int whence) + { +- if(interrupt_cb()) ++ if(interrupt_cb(NULL)) + return -1; + + CDVDInputStream* pInputStream = (CDVDInputStream*)h; +@@ -237,6 +237,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + m_speed = DVD_PLAYSPEED_NORMAL; + g_demuxer = this; + m_program = UINT_MAX; ++ const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; + + if (!pInput) return false; + +@@ -247,10 +248,6 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + + // register codecs + m_dllAvFormat.av_register_all(); +- m_dllAvFormat.url_set_interrupt_cb(interrupt_cb); +- +- // could be used for interupting ffmpeg while opening a file (eg internet streams) +- // url_set_interrupt_cb(NULL); + + m_pInput = pInput; + strFile = m_pInput->GetFileName(); +@@ -285,14 +282,14 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + // try mmsh, then mmst + CStdString strFile2; + strFile2.Format("mmsh://%s",strFile.substr(6,strFile.size()-6).c_str()); +- result = m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile2.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL); ++ result = m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile2.c_str(), iformat, NULL); + if (result < 0) + { + strFile = "mmst://"; + strFile += strFile2.Mid(7).c_str(); + } + } +- if (result < 0 && m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL) < 0 ) ++ if (result < 0 && m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0 ) + { + CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str()); + Dispose(); +@@ -302,24 +299,16 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + else + { + unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(FFMPEG_FILE_BUFFER_SIZE); +- m_ioContext = m_dllAvFormat.av_alloc_put_byte(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); ++ m_ioContext = m_dllAvFormat.avio_alloc_context(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); + m_ioContext->max_packet_size = m_pInput->GetBlockSize(); + if(m_ioContext->max_packet_size) + m_ioContext->max_packet_size *= FFMPEG_FILE_BUFFER_SIZE / m_ioContext->max_packet_size; + + if(m_pInput->Seek(0, SEEK_POSSIBLE) == 0) +- m_ioContext->is_streamed = 1; ++ m_ioContext->seekable = 0; + + if( iformat == NULL ) + { +-#if defined(USE_EXTERNAL_FFMPEG) && LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(52,98,0) +- // API added on: 2011-02-09 +- // Old versions of ffmpeg do not have av_probe_input_format, so we need +- // to always probe using the lower-level functions as well. +- const bool legacyProbing = true; +-#else +- const bool legacyProbing = false; +-#endif + // let ffmpeg decide which demuxer we have to open + + bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); +@@ -332,7 +321,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + // want to probe for spdif (DTS or IEC 61937) compressed audio + // specifically, or in case the file is a wav which may contain DTS or + // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. +- if (legacyProbing || trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) ++ if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) + { + AVProbeData pd; + BYTE probe_buffer[FFMPEG_FILE_BUFFER_SIZE + AVPROBE_PADDING_SIZE]; +@@ -342,7 +331,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + pd.filename = strFile.c_str(); + + // read data using avformat's buffers +- pd.buf_size = m_dllAvFormat.get_buffer(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); ++ pd.buf_size = m_dllAvFormat.avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); + if (pd.buf_size <= 0) + { + CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str()); +@@ -351,10 +340,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE); + + // restore position again +- m_dllAvFormat.url_fseek(m_ioContext , 0, SEEK_SET); +- +- if (legacyProbing && !trySPDIFonly) +- iformat = m_dllAvFormat.av_probe_input_format(&pd, 1); ++ m_dllAvFormat.avio_seek(m_ioContext , 0, SEEK_SET); + + // the advancedsetting is for allowing the user to force outputting the + // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode +@@ -425,7 +411,10 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + + + // open the demuxer +- if (m_dllAvFormat.av_open_input_stream(&m_pFormatContext, m_ioContext, strFile.c_str(), iformat, NULL) < 0) ++ m_pFormatContext = m_dllAvFormat.avformat_alloc_context(); ++ m_pFormatContext->pb = m_ioContext; ++ ++ if (m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0) + { + CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str()); + Dispose(); +@@ -433,8 +422,11 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + } + } + ++ // set the interrupt callback, appeared in libavformat 53.15.0 ++ m_pFormatContext->interrupt_callback = int_cb; ++ + // analyse very short to speed up mjpeg playback start +- if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->is_streamed) ++ if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) + m_pFormatContext->max_analyze_duration = 500000; + + // we need to know if this is matroska or avi later +@@ -448,8 +440,8 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + m_pFormatContext->max_analyze_duration = 500000; + + +- CLog::Log(LOGDEBUG, "%s - av_find_stream_info starting", __FUNCTION__); +- int iErr = m_dllAvFormat.av_find_stream_info(m_pFormatContext); ++ CLog::Log(LOGDEBUG, "%s - avformat_find_stream_info starting", __FUNCTION__); ++ int iErr = m_dllAvFormat.avformat_find_stream_info(m_pFormatContext, NULL); + if (iErr < 0) + { + CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str()); +@@ -472,7 +464,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) + m_pFormatContext->flags |= AVFMT_FLAG_NONBLOCK; + + // print some extra information +- m_dllAvFormat.dump_format(m_pFormatContext, 0, strFile.c_str(), 0); ++ m_dllAvFormat.av_dump_format(m_pFormatContext, 0, strFile.c_str(), 0); + + UpdateCurrentPTS(); + +@@ -511,20 +503,12 @@ void CDVDDemuxFFmpeg::Dispose() + + if (m_pFormatContext) + { +- if (m_ioContext) ++ if (m_ioContext && m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) + { +- if(m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) +- { +- CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); +- m_ioContext = m_pFormatContext->pb; +- } +- m_dllAvFormat.av_close_input_stream(m_pFormatContext); +- if (m_ioContext->buffer) +- m_dllAvUtil.av_free(m_ioContext->buffer); +- m_dllAvUtil.av_free(m_ioContext); ++ CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); ++ m_ioContext = m_pFormatContext->pb; + } +- else +- m_dllAvFormat.av_close_input_file(m_pFormatContext); ++ m_dllAvFormat.avformat_close_input(&m_pFormatContext); + } + m_ioContext = NULL; + m_pFormatContext = NULL; +@@ -774,19 +758,12 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() + { + stream->duration = duration; + duration = m_dllAvUtil.av_rescale_rnd(stream->duration, (int64_t)stream->time_base.num * AV_TIME_BASE, stream->time_base.den, AV_ROUND_NEAR_INF); +- if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE && m_pFormatContext->file_size > 0) ++ if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE) + || (m_pFormatContext->duration != (int64_t)AV_NOPTS_VALUE && duration > m_pFormatContext->duration)) + m_pFormatContext->duration = duration; + } + } + +- // check if stream seem to have grown since start +- if(m_pFormatContext->file_size > 0 && m_pFormatContext->pb) +- { +- if(m_pFormatContext->pb->pos > m_pFormatContext->file_size) +- m_pFormatContext->file_size = m_pFormatContext->pb->pos; +- } +- + pPacket->iStreamId = pkt.stream_index; // XXX just for now + } + m_dllAvCodec.av_free_packet(&pkt); +@@ -924,19 +901,6 @@ int CDVDDemuxFFmpeg::GetStreamLength() + if (!m_pFormatContext) + return 0; + +- /* apperently ffmpeg messes up sometimes, so check for negative value too */ +- if (m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE || m_pFormatContext->duration < 0LL) +- { +- // no duration is available for us +- // try to calculate it +- int iLength = 0; +- if (m_iCurrentPts != DVD_NOPTS_VALUE && m_pFormatContext->file_size > 0 && m_pFormatContext->pb && m_pFormatContext->pb->pos > 0) +- { +- iLength = (int)(((m_iCurrentPts * m_pFormatContext->file_size) / m_pFormatContext->pb->pos) / 1000) & 0xFFFFFFFF; +- } +- return iLength; +- } +- + return (int)(m_pFormatContext->duration / (AV_TIME_BASE / 1000)); + } + +@@ -971,6 +935,12 @@ static double SelectAspect(AVStream* st, bool* forced) + + void CDVDDemuxFFmpeg::AddStream(int iId) + { ++ if(iId >= MAX_STREAMS) ++ { ++ CLog::Log(LOGWARNING, "%s - streams id %d exeeds maximum supported", __FUNCTION__, iId); ++ return; ++ } ++ + AVStream* pStream = m_pFormatContext->streams[iId]; + if (pStream) + { +@@ -988,8 +958,8 @@ void CDVDDemuxFFmpeg::AddStream(int iId) + st->iBitRate = pStream->codec->bit_rate; + st->iBitsPerSample = pStream->codec->bits_per_coded_sample; + +- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) +- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; ++ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) ++ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; + + break; + } +@@ -1078,8 +1048,8 @@ void CDVDDemuxFFmpeg::AddStream(int iId) + if(pStream->codec) + st->identifier = pStream->codec->sub_id; + +- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) +- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; ++ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) ++ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; + + break; + } +@@ -1090,7 +1060,7 @@ void CDVDDemuxFFmpeg::AddStream(int iId) + { + std::string fileName = "special://temp/fonts/"; + XFILE::CDirectory::Create(fileName); +- AVMetadataTag *nameTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "filename", NULL, 0); ++ AVDictionaryEntry *nameTag = m_dllAvUtil.av_dict_get(pStream->metadata, "filename", NULL, 0); + if (!nameTag) { + CLog::Log(LOGERROR, "%s: TTF attachment has no name", __FUNCTION__); + break; +@@ -1139,7 +1109,7 @@ void CDVDDemuxFFmpeg::AddStream(int iId) + // API added on: 2010-10-15 + // (Note that while the function was available earlier, the generic + // metadata tags were not populated by default) +- AVMetadataTag *langTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "language", NULL, 0); ++ AVDictionaryEntry *langTag = m_dllAvUtil.av_dict_get(pStream->metadata, "language", NULL, 0); + if (langTag) + strncpy(m_streams[iId]->language, langTag->value, 3); + #else +@@ -1249,7 +1219,7 @@ void CDVDDemuxFFmpeg::GetChapterName(std::string& strChapterName) + // API added on: 2010-10-15 + // (Note that while the function was available earlier, the generic + // metadata tags were not populated by default) +- AVMetadataTag *titleTag = m_dllAvFormat.av_metadata_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, ++ AVDictionaryEntry *titleTag = m_dllAvUtil.av_dict_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, + "title", NULL, 0); + if (titleTag) + strChapterName = titleTag->value; +diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +index 018d9b3..84ea4b7 100644 +--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +@@ -128,7 +128,7 @@ protected: + #define MAX_STREAMS 100 + CDemuxStream* m_streams[MAX_STREAMS]; // maximum number of streams that ffmpeg can handle + +- ByteIOContext* m_ioContext; ++ AVIOContext* m_ioContext; + + DllAvFormat m_dllAvFormat; + DllAvCodec m_dllAvCodec; +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index e28faaf..eb51038 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -413,6 +413,7 @@ void CDVDPlayerVideo::Process() + { + if(m_pVideoCodec) + m_pVideoCodec->Reset(); ++ picture.iFlags &= ~DVP_FLAG_ALLOCATED; + m_packets.clear(); + m_started = false; + } +@@ -420,6 +421,7 @@ void CDVDPlayerVideo::Process() + { + if(m_pVideoCodec) + m_pVideoCodec->Reset(); ++ picture.iFlags &= ~DVP_FLAG_ALLOCATED; + m_packets.clear(); + + m_pullupCorrection.Flush(); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.01-ffmpeg-10.2-28b186f.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-901.41-avfilter-depends-on-avformat.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.00-vdpau_reset_pvr_changes.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.00-vdpau_reset_pvr_changes.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.02-xvba_support-gcc-4.7.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch new file mode 100644 index 00000000000..f1c90b05449 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch @@ -0,0 +1,15 @@ +--- xbmc-pvr-11.0.2/configure.in.orig 2012-08-29 01:02:48.633007939 +0200 ++++ xbmc-pvr-11.0.2/configure.in 2012-08-29 01:03:40.593006545 +0200 +@@ -1287,11 +1287,7 @@ + AC_DEFINE([USE_EXTERNAL_FFMPEG], [1], [Whether to use external FFmpeg libraries.]) + + # Disable vdpau support if external libavcodec doesn't have it +- AC_RUN_IFELSE( +- AC_LANG_PROGRAM([[#include ]], +- [[avcodec_register_all(); +- AVCodec *codec = avcodec_find_decoder_by_name("vc1_vdpau"); +- return (codec) ? 0 : 1;]]),, ++ AC_CHECK_LIB([avcodec], [ff_vdpau_vc1_decode_picture],, + [if test "x$use_vdpau" = "xyes"; then + AC_MSG_ERROR($ffmpeg_vdpau_not_supported) + else diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.11-disable_interop.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.11-disable_interop.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-981-toggleButtonState.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-990-wiimote.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-990-wiimote.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999-crosscompile.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.003-rar-PR1147.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.003-rar-PR1147.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.011-airtunes_reapply_lost_fix.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.021-libnfs-1.3_support.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.055-search-dialogs-workaround.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.056-remove-broken-scrapers.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.1-999.056-remove-broken-scrapers.patch rename to packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch From 352d53effa47302a9a9284e985d29c4c242e8581 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 3 Sep 2012 16:47:37 +0200 Subject: [PATCH 16/32] xbmc-pvr: merge with package 'xbmc' Signed-off-by: Stephan Raue --- .../mediacenter/xbmc-theme-Confluence/meta | 6 +- ...2-001-add_oe_settings_to_homescreen.patch} | 0 ...-Confluence-11.0.2-801.04-cec-PR887.patch} | 0 ....1-001-add_oe_settings_to_homescreen.patch | 14 - ...nfluence-pvr-11.0.1-801.04-cec-PR887.patch | 62 - packages/mediacenter/xbmc/install | 4 +- packages/mediacenter/xbmc/meta | 15 +- .../xbmc-11.0.1-801.01-cec-PR570.patch | 1976 --- ...1-801.02-cec-fixed_possible_deadlock.patch | 29 - ...is_stopped_before_starting_a_new_one.patch | 41 - .../xbmc-11.0.1-801.04-cec-PR887.patch | 630 - ...mc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch | 3198 ---- ...-add_support_to_specify_GIT_REV-0.1.patch} | 0 ...mc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch} | 0 ... xbmc-11.0.2-311-fix_rsxs_build-0.1.patch} | 0 ...-texturepacker-hostflags-and-rework.patch} | 0 ...x_playpause_problem_ticket_7338-0.1.patch} | 0 ...1.0.2-402-enable_yasm_in_ffmpeg-0.1.patch} | 0 ... xbmc-11.0.2-404-add_lame_check-0.6.patch} | 0 ...ONOPTIMIZE_with_external_Python-0.1.patch} | 0 ...c-11.0.2-452-change_lcd_content-0.1.patch} | 0 ....2-453-add_openelec.tv_RSS_news-0.1.patch} | 0 ...mc-11.0.2-454-disable_backslash-0.1.patch} | 0 ...11.0.2-457-fix_connection_check-0.1.patch} | 0 ...-11.0.2-463-add_remote_devinput-0.1.patch} | 0 ...h => xbmc-11.0.2-806.01-cdrip-PR616.patch} | 0 ...h => xbmc-11.0.2-806.02-cdrip-PR718.patch} | 0 ...c-11.0.2-901.01-ffmpeg-10.2-28b186f.patch} | 0 ....03-ffmpeg_crystalhd_implementation.patch} | 0 ...901.41-avfilter-depends-on-avformat.patch} | 0 ....0.2-902.00-vdpau_reset_pvr_changes.patch} | 0 ...1-xvba_support_vdpau_rework-c633159.patch} | 0 ...-11.0.2-902.02-xvba_support-gcc-4.7.patch} | 0 ...02.03-fix_configure_in_VDPAU_detect.patch} | 0 ... xbmc-11.0.2-902.11-disable_interop.patch} | 0 ...lete_texture_targets_on_reconfigure.patch} | 0 ...VTS_in_dvd_could_end_up_not_showing.patch} | 0 ...> xbmc-11.0.2-981-toggleButtonState.patch} | 0 ...t-be-remount-in-DeviceChanged-event.patch} | 0 ...ed-failure-to-broswe-for-smb-shares.patch} | 0 ...ical-devices-in-DeviceChanged-event.patch} | 0 ...te.patch => xbmc-11.0.2-990-wiimote.patch} | 0 ...tch => xbmc-11.0.2-999-crosscompile.patch} | 0 ...1.0.2-999.002-268d6a0-fix_ASIC_hang.patch} | 0 ...h => xbmc-11.0.2-999.003-rar-PR1147.patch} | 0 ...2-999.011-airtunes_reapply_lost_fix.patch} | 0 ...tion_for_windows_using_libshairplay.patch} | 0 ...-airtunes-add_dmap_metadata_parsing.patch} | 0 ...c-11.0.2-999.021-libnfs-1.3_support.patch} | 0 ...2-999.055-search-dialogs-workaround.patch} | 0 ....0.2-999.056-remove-broken-scrapers.patch} | 0 ...1-add_support_to_specify_GIT_REV-0.1.patch | 39 - ...pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch | 119 - ...mc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch | 12 - ...1-texturepacker-hostflags-and-rework.patch | 199 - ...ix_playpause_problem_ticket_7338-0.1.patch | 13 - ...11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch | 21 - ...mc-pvr-11.0.2-404-add_lame_check-0.6.patch | 125 - ...HONOPTIMIZE_with_external_Python-0.1.patch | 18 - ...vr-11.0.2-452-change_lcd_content-0.1.patch | 12 - ...0.2-453-add_openelec.tv_RSS_news-0.1.patch | 11 - ...pvr-11.0.2-454-disable_backslash-0.1.patch | 12 - ...-11.0.2-457-fix_connection_check-0.1.patch | 15 - ...r-11.0.2-463-add_remote_devinput-0.1.patch | 71 - .../xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch | 144 - .../xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch | 37 - ...2-901.01-ffmpeg-10.2-28b186f.patch.disable | 3193 ---- ...1.03-ffmpeg_crystalhd_implementation.patch | 32 - ...-901.41-avfilter-depends-on-avformat.patch | 41 - ...01-xvba_support_vdpau_rework-c633159.patch | 14563 ---------------- ...r-11.0.2-902.02-xvba_support-gcc-4.7.patch | 11 - ...mc-pvr-11.0.2-902.11-disable_interop.patch | 12 - ...elete_texture_targets_on_reconfigure.patch | 29 - ..._VTS_in_dvd_could_end_up_not_showing.patch | 37 - ...bmc-pvr-11.0.2-981-toggleButtonState.patch | 304 - ...st-be-remount-in-DeviceChanged-event.patch | 27 - ...xed-failure-to-broswe-for-smb-shares.patch | 36 - ...tical-devices-in-DeviceChanged-event.patch | 13 - .../patches/xbmc-pvr-11.0.2-990-wiimote.patch | 13 - ...imer_at_suspend_or_hibernate.patch.disable | 101 - .../xbmc-pvr-11.0.2-999-crosscompile.patch | 23 - ...11.0.2-999.002-268d6a0-fix_ASIC_hang.patch | 99 - .../xbmc-pvr-11.0.2-999.003-rar-PR1147.patch | 148 - ....2-999.011-airtunes_reapply_lost_fix.patch | 31 - ...ation_for_windows_using_libshairplay.patch | 527 - ...3-airtunes-add_dmap_metadata_parsing.patch | 64 - ...vr-11.0.2-999.021-libnfs-1.3_support.patch | 177 - ....2-999.055-search-dialogs-workaround.patch | 27 - ...1.0.2-999.056-remove-broken-scrapers.patch | 7338 -------- 89 files changed, 7 insertions(+), 33662 deletions(-) rename packages/mediacenter/xbmc-theme-Confluence/patches/{xbmc-theme-Confluence-11.0.1-001-add_oe_settings_to_homescreen.patch => xbmc-theme-Confluence-11.0.2-001-add_oe_settings_to_homescreen.patch} (100%) rename packages/mediacenter/xbmc-theme-Confluence/patches/{xbmc-theme-Confluence-11.0.1-801.04-cec-PR887.patch => xbmc-theme-Confluence-11.0.2-801.04-cec-PR887.patch} (100%) delete mode 100644 packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch delete mode 100644 packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch => xbmc-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch => xbmc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-311-fix_rsxs_build-0.1.patch => xbmc-11.0.2-311-fix_rsxs_build-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-321-texturepacker-hostflags-and-rework.patch => xbmc-11.0.2-321-texturepacker-hostflags-and-rework.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch => xbmc-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch => xbmc-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-404-add_lame_check-0.6.patch => xbmc-11.0.2-404-add_lame_check-0.6.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch => xbmc-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-452-change_lcd_content-0.1.patch => xbmc-11.0.2-452-change_lcd_content-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch => xbmc-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-454-disable_backslash-0.1.patch => xbmc-11.0.2-454-disable_backslash-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-457-fix_connection_check-0.1.patch => xbmc-11.0.2-457-fix_connection_check-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-463-add_remote_devinput-0.1.patch => xbmc-11.0.2-463-add_remote_devinput-0.1.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-806.01-cdrip-PR616.patch => xbmc-11.0.2-806.01-cdrip-PR616.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-806.02-cdrip-PR718.patch => xbmc-11.0.2-806.02-cdrip-PR718.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch => xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch => xbmc-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-901.41-avfilter-depends-on-avformat.patch => xbmc-11.0.2-901.41-avfilter-depends-on-avformat.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch => xbmc-11.0.2-902.00-vdpau_reset_pvr_changes.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch => xbmc-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-902.02-xvba_support-gcc-4.7.patch => xbmc-11.0.2-902.02-xvba_support-gcc-4.7.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch => xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-902.11-disable_interop.patch => xbmc-11.0.2-902.11-disable_interop.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch => xbmc-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch => xbmc-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-981-toggleButtonState.patch => xbmc-11.0.2-981-toggleButtonState.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch => xbmc-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch => xbmc-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch => xbmc-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-990-wiimote.patch => xbmc-11.0.2-990-wiimote.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999-crosscompile.patch => xbmc-11.0.2-999-crosscompile.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch => xbmc-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.003-rar-PR1147.patch => xbmc-11.0.2-999.003-rar-PR1147.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.011-airtunes_reapply_lost_fix.patch => xbmc-11.0.2-999.011-airtunes_reapply_lost_fix.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch => xbmc-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch => xbmc-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.021-libnfs-1.3_support.patch => xbmc-11.0.2-999.021-libnfs-1.3_support.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.055-search-dialogs-workaround.patch => xbmc-11.0.2-999.055-search-dialogs-workaround.patch} (100%) rename packages/mediacenter/xbmc/patches/{xbmc-11.0.1-999.056-remove-broken-scrapers.patch => xbmc-11.0.2-999.056-remove-broken-scrapers.patch} (100%) delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch delete mode 100644 packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/meta b/packages/mediacenter/xbmc-theme-Confluence/meta index f7ebd60761d..10debe2adcb 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-theme-Confluence/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-theme-Confluence" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.2" -else - PKG_VERSION="11.0.1" -fi +PKG_VERSION="11.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-001-add_oe_settings_to_homescreen.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-001-add_oe_settings_to_homescreen.patch similarity index 100% rename from packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-001-add_oe_settings_to_homescreen.patch rename to packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-001-add_oe_settings_to_homescreen.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-801.04-cec-PR887.patch similarity index 100% rename from packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.1-801.04-cec-PR887.patch rename to packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-11.0.2-801.04-cec-PR887.patch diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch deleted file mode 100644 index d12175ed71f..00000000000 --- a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-001-add_oe_settings_to_homescreen.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- xbmc-theme-Confluence-11.0.1/720p/IncludesHomeMenuItems.xml 2012-03-31 08:37:23.304505434 +0400 -+++ xbmc-theme-Confluence-11.0.1/720p/IncludesHomeMenuItems.patch.xml 2012-03-31 08:39:57.894660377 +0400 -@@ -183,6 +183,11 @@ - - ActivateWindow(Settings) - -+ -+ ButtonHomeSubCommonValues -+ -+ RunAddon(os.openelec.settings) -+ - - ButtonHomeSubCommonValues - diff --git a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index ee93a646789..00000000000 --- a/packages/mediacenter/xbmc-theme-Confluence/patches/xbmc-theme-Confluence-pvr-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 3e1367b680b26123e9e1aa09f8caf2a932d47572 Mon Sep 17 00:00:00 2001 -From: Lars Op den Kamp -Date: Tue, 17 Apr 2012 01:57:43 +0200 -Subject: [PATCH 2/2] cec: libCEC 1.6 support and fixes. libCEC 1.6+ is needed - when using firmware v2 on the CEC adapter, which adds - wake over CEC * added a new setting to control - whether to put the TV in standby when the player is put - in standby. * added some button mappings: all menu - related buttons -> menu, previous channel -> teletext, - added support for the channels list on samsung, mapped - next fav -> menu (when available) * display the - firmware version in the peripheral manager (if - available) * handle the new CEC alert callback - (libCEC 1.6+) * replaced 'Put this PC in standby mode - when the TV is switched off' with an enum that allows - the user to chose between 'Ignore', 'Suspend' and - 'Shutdown' * fixed - crash when changing settings - without libCEC started. * fixed - range of wake and - power-off devices * fixed - update the correct - standby device setting ('standby_devices' not - 'wake_devices') * fixed - don't get the settings from - the eeprom, but always use the settings provided in - xbmc - ---- - .../720p/DialogPeripheralManager.xml | 4 +- - configure.in | 2 +- - language/English/strings.xml | 5 +- - project/BuildDependencies/scripts/libcec_d.txt | 2 +- - system/peripherals.xml | 15 +- - tools/darwin/depends/libcec/Makefile | 2 +- - xbmc/peripherals/bus/PeripheralBus.cpp | 1 + - xbmc/peripherals/devices/Peripheral.h | 2 + - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 160 ++++++++++++++++---- - xbmc/peripherals/devices/PeripheralCecAdapter.h | 4 + - 10 files changed, 152 insertions(+), 45 deletions(-) - -diff --git a/720p/DialogPeripheralManager.xml b/720p/DialogPeripheralManager.xml -index 07954d0..5717017 100644 ---- a/720p/DialogPeripheralManager.xml -+++ b/720p/DialogPeripheralManager.xml -@@ -117,7 +117,7 @@ - 50 - 520 - 20 -- -+ - left - center - font12 -@@ -173,7 +173,7 @@ - 50 - 520 - 20 -- -+ - left - center - font12 --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/install b/packages/mediacenter/xbmc/install index 0cc27e104e5..9f7e80a580b 100755 --- a/packages/mediacenter/xbmc/install +++ b/packages/mediacenter/xbmc/install @@ -29,9 +29,7 @@ mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin mkdir -p $INSTALL/usr/lib/xbmc cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc diff --git a/packages/mediacenter/xbmc/meta b/packages/mediacenter/xbmc/meta index 01138582048..9691da35bc7 100644 --- a/packages/mediacenter/xbmc/meta +++ b/packages/mediacenter/xbmc/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-11.0.2" -else - PKG_VERSION="11.0.1" -fi +PKG_VERSION="11.0.2" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" @@ -46,6 +42,10 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS Imaging" PKG_DEPENDS="$PKG_DEPENDS simplejson" +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" + if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" @@ -149,8 +149,3 @@ fi if [ "$XVBA" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch deleted file mode 100644 index ec91a7327d8..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.01-cec-PR570.patch +++ /dev/null @@ -1,1976 +0,0 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-04-17 14:47:57.830482197 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.1.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-11.0.1/language/English/strings.xml xbmc-11.0.1.patch/language/English/strings.xml ---- xbmc-11.0.1/language/English/strings.xml 2012-03-21 23:57:54.000000000 +0100 -+++ xbmc-11.0.1.patch/language/English/strings.xml 2012-04-17 14:47:57.881483158 +0200 -@@ -2378,6 +2378,7 @@ - Device removed - Keymap to use for this device - Keymap enabled -+ Do not use the custom keymap for this device - - Location - Class -@@ -2392,16 +2393,23 @@ - Press "user" button command - Enable switch side commands - Could not open the adapter -- Power on the TV when starting XBMC -- Power off devices when stopping XBMC -+ Devices to power on the TV when starting XBMC -+ Devices to power off devices when stopping XBMC - Put devices in standby mode when activating screensaver - - Could not detect the CEC port. Set it up manually. -- Could not detect the CEC adapter. -- Unsupported libcec interface version. %d is greater than the version XBMC supports (%d) -+ Could not initialise the CEC adapter. Check your settings. -+ Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) - Put this PC in standby mode when the TV is switched off - HDMI port number - Connected -- Adapter found, but libcec is not available -+ Adapter found, but libCEC is not available - Use the TV's language setting -+ Connected to HDMI device -+ Make XBMC the active source when starting -+ Physical address (overrules HDMI port) -+ COM port (leave empty unless needed) -+ Configuration updated -+ Failed to set the new configuration. Please check your settings. -+ Send 'inactive source' command when stopping XBMC - -diff -Naur xbmc-11.0.1/lib/libcec/Makefile xbmc-11.0.1.patch/lib/libcec/Makefile ---- xbmc-11.0.1/lib/libcec/Makefile 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/libcec/Makefile 2012-04-17 14:47:58.899502388 +0200 -@@ -7,17 +7,17 @@ - - # lib name, version - LIBNAME=libcec --VERSION=1.2.0 -+VERSION=latest - SOURCE=$(LIBNAME)-$(VERSION) - - # download location and format --BASE_URL=http://mirrors.xbmc.org/build-deps/darwin-libs --ARCHIVE=$(SOURCE).tar.gz -+BASE_URL=http://packages.pulse-eight.net/pulse/sources/libcec -+ARCHIVE=$(SOURCE).tar.bz2 - TARBALLS_LOCATION=. - RETRIEVE_TOOL=/usr/bin/curl - RETRIEVE_TOOL_FLAGS=-Ls --create-dirs --output $(TARBALLS_LOCATION)/$(ARCHIVE) - ARCHIVE_TOOL=tar --ARCHIVE_TOOL_FLAGS=xf -+ARCHIVE_TOOL_FLAGS=jxf - - PREFIX ?= /usr/local - LIBCEC_CONFIGOPTS ?= --prefix=$(PREFIX) -@@ -25,30 +25,30 @@ - # configuration settings - CONFIGURE=./configure CFLAGS=-D_FILE_OFFSET_BITS=64 $(LIBCEC_CONFIGOPTS) - --SO_NAME=$(SOURCE)/.libs/$(LIBNAME).so -+SO_NAME=$(LIBNAME)/.libs/$(LIBNAME).so - - all: $(SO_NAME) - - $(TARBALLS_LOCATION)/$(ARCHIVE): - $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - --$(SOURCE): $(TARBALLS_LOCATION)/$(ARCHIVE) -- rm -rf $(SOURCE) -+$(LIBNAME): $(TARBALLS_LOCATION)/$(ARCHIVE) -+ rm -rf $(LIBNAME) - $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) -- echo $(SOURCE) > .gitignore -- cd $(SOURCE); autoreconf -vif -- cd $(SOURCE); $(CONFIGURE) -+ echo $(LIBNAME) > .gitignore -+ cd $(LIBNAME); autoreconf -vif -+ cd $(LIBNAME); $(CONFIGURE) - --$(SO_NAME): $(SOURCE) -- make -j 1 -C $(SOURCE) -+$(SO_NAME): $(LIBNAME) -+ make -j 1 -C $(LIBNAME) - - install: -- make -C $(SOURCE) install -+ make -C $(LIBNAME) install - ldconfig - - clean: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - - distclean:: -- rm -rf $(SOURCE) -+ rm -rf $(LIBNAME) - -diff -Naur xbmc-11.0.1/system/peripherals.xml xbmc-11.0.1.patch/system/peripherals.xml ---- xbmc-11.0.1/system/peripherals.xml 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/system/peripherals.xml 2012-04-17 14:47:58.899502388 +0200 -@@ -1,22 +1,29 @@ - - -- -+ - -- -- -- -- -+ -+ -+ -+ - - -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -diff -Naur xbmc-11.0.1/xbmc/Application.cpp xbmc-11.0.1.patch/xbmc/Application.cpp ---- xbmc-11.0.1/xbmc/Application.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/Application.cpp 2012-04-17 14:48:56.437589161 +0200 -@@ -160,9 +160,6 @@ - #endif - #include "interfaces/AnnouncementManager.h" - #include "peripherals/Peripherals.h" --#ifdef HAVE_LIBCEC --#include "peripherals/devices/PeripheralCecAdapter.h" --#endif - #include "peripherals/dialogs/GUIDialogPeripheralManager.h" - #include "peripherals/dialogs/GUIDialogPeripheralSettings.h" - -@@ -2556,6 +2553,10 @@ - } - } - } -+ -+ if (g_peripherals.OnAction(action)) -+ return true; -+ - if (action.GetID() == ACTION_MUTE) - { - ToggleMute(); -@@ -2831,23 +2832,9 @@ - - bool CApplication::ProcessPeripherals(float frameTime) - { --#ifdef HAVE_LIBCEC -- vector peripherals; -- if (g_peripherals.GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -- { -- for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -- { -- CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -- if (cecDevice && cecDevice->GetButton()) -- { -- CKey key(cecDevice->GetButton(), cecDevice->GetHoldTime()); -- cecDevice->ResetButton(); -- return OnKey(key); -- } -- } -- } --#endif -- -+ CKey key; -+ if (g_peripherals.GetNextKeypress(frameTime, key)) -+ return OnKey(key); - return false; - } - -@@ -3288,7 +3275,8 @@ - { - try - { -- CAnnouncementManager::Announce(System, "xbmc", "OnQuit"); -+ CVariant vExitCode(exitCode); -+ CAnnouncementManager::Announce(System, "xbmc", "OnQuit", vExitCode); - - // cancel any jobs from the jobmanager - CJobManager::GetInstance().CancelJobs(); -@@ -5027,6 +5015,8 @@ - - bool CApplication::IsMuted() const - { -+ if (g_peripherals.IsMuted()) -+ return true; - return g_settings.m_bMute; - } - -@@ -5040,6 +5030,9 @@ - - void CApplication::Mute() - { -+ if (g_peripherals.Mute()) -+ return; -+ - g_settings.m_iPreMuteVolumeLevel = GetVolume(); - SetVolume(0); - g_settings.m_bMute = true; -@@ -5047,6 +5040,9 @@ - - void CApplication::UnMute() - { -+ if (g_peripherals.UnMute()) -+ return; -+ - SetVolume(g_settings.m_iPreMuteVolumeLevel); - g_settings.m_iPreMuteVolumeLevel = 0; - g_settings.m_bMute = false; -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:47:59.547514629 +0200 -@@ -18,8 +18,8 @@ - * http://www.gnu.org/copyleft/gpl.html - * - */ --#include "system.h" - -+#include "system.h" - #if defined(HAVE_LIBCEC) - #include "PeripheralCecAdapter.h" - #include "input/XBIRRemote.h" -@@ -31,36 +31,40 @@ - #include "peripherals/Peripherals.h" - #include "peripherals/bus/PeripheralBus.h" - #include "settings/GUISettings.h" -+#include "settings/Settings.h" - #include "utils/log.h" -+#include "utils/Variant.h" - --#include -+#include - - using namespace PERIPHERALS; - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 1 -+#define CEC_LIB_SUPPORTED_VERSION 0x1500 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -+#define VOLUME_CHANGE_TIMEOUT 250 -+#define VOLUME_REFRESH_TIMEOUT 100 - - class DllLibCECInterface - { - public: - virtual ~DllLibCECInterface() {} -- virtual ICECAdapter* CECInit(const char *interfaceName, cec_device_type_list types)=0; -- virtual void* CECDestroy(ICECAdapter *adapter)=0; -+ virtual ICECAdapter* CECInitialise(libcec_configuration *configuration)=0; -+ virtual void* CECDestroy(ICECAdapter *adapter)=0; - }; - - class DllLibCEC : public DllDynamic, DllLibCECInterface - { - DECLARE_DLL_WRAPPER(DllLibCEC, DLL_PATH_LIBCEC) - -- DEFINE_METHOD2(ICECAdapter*, CECInit, (const char *p1, cec_device_type_list p2)) -- DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) -+ DEFINE_METHOD1(ICECAdapter*, CECInitialise, (libcec_configuration *p1)) -+ DEFINE_METHOD1(void* , CECDestroy, (ICECAdapter *p1)) - - BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD_RENAME(CECInit, CECInit) -+ RESOLVE_METHOD_RENAME(CECInitialise, CECInitialise) - RESOLVE_METHOD_RENAME(CECDestroy, CECDestroy) - END_METHOD_RESOLVE() - }; -@@ -71,41 +75,19 @@ - m_bStarted(false), - m_bHasButton(false), - m_bIsReady(false), -+ m_bHasConnectedAudioSystem(false), - m_strMenuLanguage("???"), -- m_lastKeypress(0) -+ m_lastKeypress(0), -+ m_lastChange(VOLUME_CHANGE_NONE), -+ m_iExitCode(0), -+ m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC - { - m_button.iButton = 0; - m_button.iDuration = 0; - m_screensaverLastActivated.SetValid(false); -- m_dll = new DllLibCEC; -- if (m_dll->Load() && m_dll->IsLoaded()) -- { -- cec_device_type_list typeList; -- typeList.clear(); -- typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE); -- m_cecAdapter = m_dll->CECInit("XBMC", typeList); -- } -- else -- m_cecAdapter = NULL; -- -- if (!m_cecAdapter || m_cecAdapter->GetMinLibVersion() > CEC_LIB_SUPPORTED_VERSION) -- { -- /* unsupported libcec version */ -- CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); - -- CStdString strMessage; -- strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_cecAdapter->GetMinLibVersion() : -1); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -- m_bError = true; -- if (m_cecAdapter) -- m_dll->CECDestroy(m_cecAdapter); -- m_cecAdapter = NULL; -- } -- else -- { -- CLog::Log(LOGDEBUG, "%s - using libCEC v%d.%d", __FUNCTION__, m_cecAdapter->GetLibVersionMajor(), m_cecAdapter->GetLibVersionMinor()); -- m_features.push_back(FEATURE_CEC); -- } -+ m_configuration.Clear(); -+ m_features.push_back(FEATURE_CEC); - } - - CPeripheralCecAdapter::~CPeripheralCecAdapter(void) -@@ -117,7 +99,6 @@ - - if (m_dll && m_cecAdapter) - { -- FlushLog(); - m_dll->CECDestroy(m_cecAdapter); - m_cecAdapter = NULL; - delete m_dll; -@@ -129,60 +110,94 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_cecAdapter->SetInactiveView(); -- if (GetSettingBool("cec_power_off_shutdown")) -- m_cecAdapter->StandbyDevices(); -+ m_iExitCode = data.asInteger(0); -+ StopThread(false); - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && GetSettingBool("cec_standby_screensaver") && m_bIsReady) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) - { -- m_cecAdapter->PowerOnDevices(); -+ if (m_configuration.bPowerOffScreensaver == 1) -+ { -+ // power off/on on screensaver is set, and devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); -+ } - } -- else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && GetSettingBool("cec_standby_screensaver")) -+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && m_bIsReady) - { - // Don't put devices to standby if application is currently playing -- if (!g_application.IsPlaying() || g_application.IsPaused()) -+ if ((!g_application.IsPlaying() || g_application.IsPaused()) && m_configuration.bPowerOffScreensaver == 1) - { - m_screensaverLastActivated = CDateTime::GetCurrentDateTime(); -- m_cecAdapter->StandbyDevices(); -+ // only power off when we're the active source -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ m_cecAdapter->StandbyDevices(CECDEVICE_BROADCAST); - } - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { -- if (GetSettingBool("cec_power_off_shutdown") && m_bIsReady) -- m_cecAdapter->StandbyDevices(); -+ // this will also power off devices when we're the active source - CSingleLock lock(m_critSection); - m_bStop = true; - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -+ // reconnect to the device - CSingleLock lock(m_critSection); - CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ -+ // close the previous connection - m_cecAdapter->Close(); - -- CStdString strPort = GetComPort(); -- if (!strPort.empty()) -- { -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- CLog::Log(LOGERROR, "%s - failed to reconnect to the CEC adapter", __FUNCTION__); -- FlushLog(); -- m_bStop = true; -- } -- else -- { -- if (GetSettingBool("cec_power_on_startup")) -- PowerOnCecDevices(CECDEVICE_TV); -- m_cecAdapter->SetActiveView(); -- } -- } -+ // and open a new one -+ m_bStop = false; -+ Create(); - } - } - - bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature) - { -- if (feature == FEATURE_CEC && !m_bStarted) -+ if (feature == FEATURE_CEC && !m_bStarted && GetSettingBool("enabled")) - { -+ SetConfigurationFromSettings(); -+ m_callbacks.CBCecLogMessage = &CecLogMessage; -+ m_callbacks.CBCecKeyPress = &CecKeyPress; -+ m_callbacks.CBCecCommand = &CecCommand; -+ m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_configuration.callbackParam = this; -+ m_configuration.callbacks = &m_callbacks; -+ -+ m_dll = new DllLibCEC; -+ if (m_dll->Load() && m_dll->IsLoaded()) -+ m_cecAdapter = m_dll->CECInitialise(&m_configuration); -+ else -+ return false; -+ -+ if (m_configuration.serverVersion < CEC_LIB_SUPPORTED_VERSION) -+ { -+ /* unsupported libcec version */ -+ CLog::Log(LOGERROR, g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ -+ CStdString strMessage; -+ strMessage.Format(g_localizeStrings.Get(36013).c_str(), CEC_LIB_SUPPORTED_VERSION, m_cecAdapter ? m_configuration.serverVersion : -1); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), strMessage); -+ m_bError = true; -+ if (m_cecAdapter) -+ m_dll->CECDestroy(m_cecAdapter); -+ m_cecAdapter = NULL; -+ -+ m_features.clear(); -+ return false; -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ } -+ - m_bStarted = true; - Create(); - } -@@ -221,23 +236,20 @@ - return strPort; - } - --void CPeripheralCecAdapter::Process(void) -+bool CPeripheralCecAdapter::OpenConnection(void) - { -+ bool bIsOpen(false); -+ - if (!GetSettingBool("enabled")) - { - CLog::Log(LOGDEBUG, "%s - CEC adapter is disabled in peripheral settings", __FUNCTION__); - m_bStarted = false; -- return; -+ return bIsOpen; - } - - CStdString strPort = GetComPort(); - if (strPort.empty()) -- return; -- -- // set correct physical address from peripheral settings -- int iHdmiPort = GetSettingInt("cec_hdmi_port"); -- SetHdmiPort(iHdmiPort); -- FlushLog(); -+ return bIsOpen; - - // open the CEC adapter - CLog::Log(LOGDEBUG, "%s - opening a connection to the CEC adapter: %s", __FUNCTION__, strPort.c_str()); -@@ -247,100 +259,221 @@ - strMessage.Format(g_localizeStrings.Get(21336), g_localizeStrings.Get(36000)); - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strMessage); - -- if (!m_cecAdapter->Open(strPort.c_str(), 10000)) -- { -- FlushLog(); -- CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -- m_bStarted = false; -- return; -- } -+ bool bConnectionFailedDisplayed(false); - -- CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -- m_bIsReady = true; -- CAnnouncementManager::AddAnnouncer(this); -- -- if (GetSettingBool("cec_power_on_startup")) -+ while (!m_bStop && !bIsOpen) - { -- PowerOnCecDevices(CECDEVICE_TV); -- FlushLog(); -+ if ((bIsOpen = m_cecAdapter->Open(strPort.c_str(), 10000)) == false) -+ { -+ CLog::Log(LOGERROR, "%s - could not opening a connection to the CEC adapter", __FUNCTION__); -+ if (!bConnectionFailedDisplayed) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, g_localizeStrings.Get(36000), g_localizeStrings.Get(36012)); -+ bConnectionFailedDisplayed = true; -+ -+ Sleep(10000); -+ } - } - -- if (GetSettingBool("use_tv_menu_language")) -+ if (bIsOpen) - { -- cec_menu_language language; -- if (m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -- SetMenuLanguage(language.language); -+ CLog::Log(LOGDEBUG, "%s - connection to the CEC adapter opened", __FUNCTION__); -+ -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ if (m_configuration.bActivateSource == 1) -+ m_cecAdapter->SetActiveSource(); - } - -- m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(36016)); -+ return bIsOpen; -+} -+ -+void CPeripheralCecAdapter::Process(void) -+{ -+ if (!OpenConnection()) -+ return; -+ -+ CAnnouncementManager::AddAnnouncer(this); -+ -+ m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -+ m_queryThread->Create(false); - - while (!m_bStop) - { -- FlushLog(); - if (!m_bStop) -- ProcessNextCommand(); -+ ProcessVolumeChange(); -+ - if (!m_bStop) - Sleep(5); - } - -+ delete m_queryThread; -+ -+ if (m_iExitCode != EXITCODE_REBOOT) -+ { -+ if (m_cecAdapter->IsLibCECActiveSource()) -+ { -+ if (!m_configuration.powerOffDevices.IsEmpty()) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending standby commands", __FUNCTION__); -+ m_cecAdapter->StandbyDevices(); -+ } -+ else if (m_configuration.bSendInactiveSource == 1) -+ { -+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__); -+ m_cecAdapter->SetInactiveView(); -+ } -+ } -+ else -+ { -+ CLog::Log(LOGDEBUG, "%s - XBMC is not the active source, not sending any standby commands", __FUNCTION__); -+ } -+ } -+ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); - m_bStarted = false; - } - --bool CPeripheralCecAdapter::PowerOnCecDevices(cec_logical_address iLogicalAddress) -+bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) - { -- bool bReturn(false); -+ CSingleLock lock(m_critSection); -+ return m_bHasConnectedAudioSystem; -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::SetAudioSystemConnected(bool bSetTo) -+{ -+ CSingleLock lock(m_critSection); -+ m_bHasConnectedAudioSystem = bSetTo; -+} -+ -+void CPeripheralCecAdapter::ScheduleVolumeUp(void) -+{ - { -- CLog::Log(LOGDEBUG, "%s - powering on CEC capable device with address %1x", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->PowerOnDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+ Sleep(5); -+} - -- return bReturn; -+void CPeripheralCecAdapter::ScheduleVolumeDown(void) -+{ -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } -+ Sleep(5); - } - --bool CPeripheralCecAdapter::StandbyCecDevices(cec_logical_address iLogicalAddress) -+void CPeripheralCecAdapter::ScheduleMute(void) - { -- bool bReturn(false); -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); -+ } -+ Sleep(5); -+} - -- if (m_cecAdapter && m_bIsReady) -+void CPeripheralCecAdapter::ProcessVolumeChange(void) -+{ -+ bool bSendRelease(false); -+ CecVolumeChange pendingVolumeChange = VOLUME_CHANGE_NONE; - { -- CLog::Log(LOGDEBUG, "%s - putting CEC capable devices with address %1x in standby mode", __FUNCTION__, iLogicalAddress); -- bReturn = m_cecAdapter->StandbyDevices(iLogicalAddress); -+ CSingleLock lock(m_critSection); -+ if (m_volumeChangeQueue.size() > 0) -+ { -+ /* get the first change from the queue */ -+ pendingVolumeChange = m_volumeChangeQueue.front(); -+ m_volumeChangeQueue.pop(); -+ -+ /* remove all dupe entries */ -+ while (m_volumeChangeQueue.size() > 0 && m_volumeChangeQueue.front() == pendingVolumeChange) -+ m_volumeChangeQueue.pop(); -+ -+ /* send another keypress after VOLUME_REFRESH_TIMEOUT ms */ -+ bool bRefresh(m_lastKeypress + VOLUME_REFRESH_TIMEOUT < XbmcThreads::SystemClockMillis()); -+ -+ /* only send the keypress when it hasn't been sent yet */ -+ if (pendingVolumeChange != m_lastChange) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ m_lastChange = pendingVolumeChange; -+ } -+ else if (bRefresh) -+ { -+ m_lastKeypress = XbmcThreads::SystemClockMillis(); -+ pendingVolumeChange = m_lastChange; -+ } -+ else -+ pendingVolumeChange = VOLUME_CHANGE_NONE; -+ } -+ else if (m_lastKeypress > 0 && m_lastKeypress + VOLUME_CHANGE_TIMEOUT < XbmcThreads::SystemClockMillis()) -+ { -+ /* send a key release */ -+ m_lastKeypress = 0; -+ bSendRelease = true; -+ m_lastChange = VOLUME_CHANGE_NONE; -+ } - } - -- return bReturn; -+ switch (pendingVolumeChange) -+ { -+ case VOLUME_CHANGE_UP: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_UP, false); -+ break; -+ case VOLUME_CHANGE_DOWN: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_VOLUME_DOWN, false); -+ break; -+ case VOLUME_CHANGE_MUTE: -+ m_cecAdapter->SendKeypress(CECDEVICE_AUDIOSYSTEM, CEC_USER_CONTROL_CODE_MUTE, false); -+ { -+ CSingleLock lock(m_critSection); -+ m_bIsMuted = !m_bIsMuted; -+ } -+ break; -+ case VOLUME_CHANGE_NONE: -+ if (bSendRelease) -+ m_cecAdapter->SendKeyRelease(CECDEVICE_AUDIOSYSTEM, false); -+ break; -+ } - } - --bool CPeripheralCecAdapter::SendPing(void) -+void CPeripheralCecAdapter::VolumeUp(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- CLog::Log(LOGDEBUG, "%s - sending ping to the CEC adapter", __FUNCTION__); -- bReturn = m_cecAdapter->PingAdapter(); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_UP); - } -+} - -- return bReturn; -+void CPeripheralCecAdapter::VolumeDown(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_DOWN); -+ } - } - --bool CPeripheralCecAdapter::SetHdmiPort(int iHdmiPort) -+void CPeripheralCecAdapter::Mute(void) - { -- bool bReturn(false); -- if (m_cecAdapter && m_bIsReady) -+ if (HasConnectedAudioSystem()) - { -- if (iHdmiPort <= 0 || iHdmiPort > 16) -- iHdmiPort = 1; -- CLog::Log(LOGDEBUG, "%s - changing active HDMI port to %d", __FUNCTION__, iHdmiPort); -- bReturn = m_cecAdapter->SetPhysicalAddress(iHdmiPort << 12); -+ CSingleLock lock(m_critSection); -+ m_volumeChangeQueue.push(VOLUME_CHANGE_MUTE); - } -+} - -- return bReturn; -+bool CPeripheralCecAdapter::IsMuted(void) -+{ -+ if (HasConnectedAudioSystem()) -+ { -+ CSingleLock lock(m_critSection); -+ return m_bIsMuted; -+ } -+ return false; - } - - void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage) -@@ -404,10 +537,13 @@ - CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage); - } - --void CPeripheralCecAdapter::ProcessNextCommand(void) -+int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command &command) - { -- cec_command command; -- if (m_cecAdapter && m_bIsReady && m_cecAdapter->GetNextCommand(&command)) -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ if (adapter->m_bIsReady) - { - CLog::Log(LOGDEBUG, "%s - processing command: initiator=%1x destination=%1x opcode=%02x", __FUNCTION__, command.initiator, command.destination, command.opcode); - -@@ -416,21 +552,21 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && GetSettingBool("standby_pc_on_tv_standby") && -- (!m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) -+ if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { -- m_bStarted = false; -+ adapter->m_bStarted = false; - g_application.getApplicationMessenger().Suspend(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -- if (GetSettingBool("use_tv_menu_language") && command.initiator == CECDEVICE_TV && command.parameters.size == 3) -+ if (adapter->m_configuration.bUseTVMenuLanguage == 1 && command.initiator == CECDEVICE_TV && command.parameters.size == 3) - { - char strNewLanguage[4]; - for (int iPtr = 0; iPtr < 3; iPtr++) - strNewLanguage[iPtr] = command.parameters[iPtr]; - strNewLanguage[3] = 0; -- SetMenuLanguage(strNewLanguage); -+ adapter->SetMenuLanguage(strNewLanguage); - } - break; - case CEC_OPCODE_DECK_CONTROL: -@@ -438,11 +574,11 @@ - command.parameters.size == 1 && - command.parameters[0] == CEC_DECK_CONTROL_MODE_STOP) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_STOP; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - break; - case CEC_OPCODE_PLAY: -@@ -451,26 +587,58 @@ - { - if (command.parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PLAY; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - else if (command.parameters[0] == CEC_PLAY_MODE_PLAY_STILL) - { -- CSingleLock lock(m_critSection); -+ CSingleLock lock(adapter->m_critSection); - cec_keypress key; - key.duration = 500; - key.keycode = CEC_USER_CONTROL_CODE_PAUSE; -- m_buttonQueue.push(key); -+ adapter->m_buttonQueue.push(key); - } - } - break; -+ case CEC_OPCODE_REPORT_POWER_STATUS: -+ if (command.initiator == CECDEVICE_TV && -+ command.parameters.size == 1 && -+ command.parameters[0] == CEC_POWER_STATUS_ON && -+ adapter->m_queryThread) -+ { -+ adapter->m_queryThread->Signal(); -+ } -+ break; - default: - break; - } - } -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration &config) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->SetConfigurationFromLibCEC(config); -+ return 1; -+} -+ -+int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) -+{ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ CSingleLock lock(adapter->m_critSection); -+ adapter->m_buttonQueue.push(key); -+ return 1; - } - - bool CPeripheralCecAdapter::GetNextCecKey(cec_keypress &key) -@@ -483,10 +651,6 @@ - m_buttonQueue.pop(); - bReturn = true; - } -- else if (m_cecAdapter->GetNextKeypress(&key)) -- { -- bReturn = true; -- } - - return bReturn; - } -@@ -726,41 +890,43 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else if (strChangedSetting.Equals("cec_hdmi_port")) -+ else - { -- SetHdmiPort(GetSettingInt("cec_hdmi_port")); -+ SetConfigurationFromSettings(); -+ m_queryThread->UpdateConfiguration(&m_configuration); - } - } - --void CPeripheralCecAdapter::FlushLog(void) -+int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) - { -- cec_log_message message; -- while (m_cecAdapter && m_cecAdapter->GetNextLogMessage(&message)) -- { -- int iLevel = -1; -- switch (message.level) -- { -- case CEC_LOG_ERROR: -- iLevel = LOGERROR; -- break; -- case CEC_LOG_WARNING: -- iLevel = LOGWARNING; -- break; -- case CEC_LOG_NOTICE: -- iLevel = LOGDEBUG; -- break; -- case CEC_LOG_TRAFFIC: -- case CEC_LOG_DEBUG: -- if (GetSettingBool("cec_debug_logging")) -- iLevel = LOGDEBUG; -- break; -- default: -- break; -- } -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; - -- if (iLevel >= 0) -- CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ int iLevel = -1; -+ switch (message.level) -+ { -+ case CEC_LOG_ERROR: -+ iLevel = LOGERROR; -+ break; -+ case CEC_LOG_WARNING: -+ iLevel = LOGWARNING; -+ break; -+ case CEC_LOG_NOTICE: -+ iLevel = LOGDEBUG; -+ break; -+ case CEC_LOG_TRAFFIC: -+ case CEC_LOG_DEBUG: -+ iLevel = LOGDEBUG; -+ break; -+ default: -+ break; - } -+ -+ if (iLevel >= 0) -+ CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message); -+ -+ return 1; - } - - bool CPeripheralCecAdapter::TranslateComPort(CStdString &strLocation) -@@ -774,4 +940,301 @@ - - return false; - } -+ -+void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configuration &config) -+{ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ m_configuration.deviceTypes.Add(config.deviceTypes[0]); -+ SetSetting("device_type", (int)config.deviceTypes[0]); -+ -+ // set the connected device -+ m_configuration.baseDevice = config.baseDevice; -+ SetSetting("connected_device", (int)config.baseDevice); -+ -+ // set the HDMI port number -+ m_configuration.iHDMIPort = config.iHDMIPort; -+ SetSetting("cec_hdmi_port", config.iHDMIPort); -+ -+ // set the physical address, when baseDevice or iHDMIPort are not set -+ if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ { -+ m_configuration.iPhysicalAddress = config.iPhysicalAddress; -+ CStdString strPhysicalAddress; -+ strPhysicalAddress.Format("%x", config.iPhysicalAddress); -+ SetSetting("physical_address", strPhysicalAddress); -+ } -+ -+ // set the tv vendor override -+ m_configuration.tvVendor = config.tvVendor; -+ SetSetting("tv_vendor", (int)config.tvVendor); -+ -+ // set the devices to wake when starting -+ m_configuration.wakeDevices = config.wakeDevices; -+ CStdString strWakeDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.wakeDevices[iPtr]) -+ strWakeDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strWakeDevices.Trim()); -+ -+ // set the devices to power off when stopping -+ m_configuration.powerOffDevices = config.powerOffDevices; -+ CStdString strPowerOffDevices; -+ for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ if (config.powerOffDevices[iPtr]) -+ strPowerOffDevices.AppendFormat(" %X", iPtr); -+ SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ -+ // set the boolean settings -+ m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -+ SetSetting("use_tv_menu_language", m_configuration.bUseTVMenuLanguage == 1); -+ -+ m_configuration.bActivateSource = config.bActivateSource; -+ SetSetting("activate_source", m_configuration.bActivateSource == 1); -+ -+ m_configuration.bPowerOffScreensaver = config.bPowerOffScreensaver; -+ SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); -+ -+ m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -+ SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) -+ m_configuration.bSendInactiveSource = config.bSendInactiveSource; -+ SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+} -+ -+void CPeripheralCecAdapter::SetConfigurationFromSettings(void) -+{ -+ // client version 1.5.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ -+ // device name 'XBMC' -+ snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -+ -+ // set the primary device type -+ m_configuration.deviceTypes.Clear(); -+ int iDeviceType = GetSettingInt("device_type"); -+ if (iDeviceType != (int)CEC_DEVICE_TYPE_RECORDING_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_PLAYBACK_DEVICE && -+ iDeviceType != (int)CEC_DEVICE_TYPE_TUNER) -+ iDeviceType = (int)CEC_DEVICE_TYPE_RECORDING_DEVICE; -+ m_configuration.deviceTypes.Add((cec_device_type)iDeviceType); -+ -+ // always try to autodetect the address. -+ // when the firmware supports this, it will override the physical address, connected device and hdmi port settings -+ m_configuration.bAutodetectAddress = 1; -+ -+ // set the physical address -+ // when set, it will override the connected device and hdmi port settings -+ CStdString strPhysicalAddress = GetSettingString("physical_address"); -+ int iPhysicalAddress; -+ if (sscanf(strPhysicalAddress.c_str(), "%x", &iPhysicalAddress) == 1 && iPhysicalAddress > 0 && iPhysicalAddress < 0xFFFF) -+ m_configuration.iPhysicalAddress = iPhysicalAddress; -+ -+ // set the connected device -+ int iConnectedDevice = GetSettingInt("connected_device"); -+ if (iConnectedDevice == 0 || iConnectedDevice == 5) -+ m_configuration.baseDevice = (cec_logical_address)iConnectedDevice; -+ -+ // set the HDMI port number -+ int iHDMIPort = GetSettingInt("cec_hdmi_port"); -+ if (iHDMIPort >= 0 && iHDMIPort <= 4) -+ m_configuration.iHDMIPort = iHDMIPort; -+ -+ // set the tv vendor override -+ int iVendor = GetSettingInt("tv_vendor"); -+ if (iVendor > 0 && iVendor < 0xFFFFFF) -+ m_configuration.tvVendor = iVendor; -+ -+ // read the devices to wake when starting -+ CStdString strWakeDevices = CStdString(GetSettingString("wake_devices")).Trim(); -+ m_configuration.wakeDevices.Clear(); -+ ReadLogicalAddresses(strWakeDevices, m_configuration.wakeDevices); -+ -+ // read the devices to power off when stopping -+ CStdString strStandbyDevices = CStdString(GetSettingString("standby_devices")).Trim(); -+ m_configuration.powerOffDevices.Clear(); -+ ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); -+ -+ // always get the settings from the rom, when supported by the firmware -+ m_configuration.bGetSettingsFromROM = 1; -+ -+ // read the boolean settings -+ m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; -+ m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; -+ m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -+ m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; -+ m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+} -+ -+void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -+{ -+ for (size_t iPtr = 0; iPtr < strString.size(); iPtr++) -+ { -+ CStdString strDevice = CStdString(strString.substr(iPtr, 1)).Trim(); -+ if (!strDevice.IsEmpty()) -+ { -+ int iDevice(0); -+ if (sscanf(strDevice.c_str(), "%x", &iDevice) == 1 && iDevice >= 0 && iDevice <= 0xF) -+ addresses.Set((cec_logical_address)iDevice); -+ } -+ } -+} -+ -+CPeripheralCecAdapterUpdateThread::CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, libcec_configuration *configuration) : -+ CThread("CEC Adapter Update Thread"), -+ m_adapter(adapter), -+ m_configuration(*configuration), -+ m_bNextConfigurationScheduled(false), -+ m_bIsUpdating(true) -+{ -+ m_nextConfiguration.Clear(); -+ m_event.Reset(); -+} -+ -+CPeripheralCecAdapterUpdateThread::~CPeripheralCecAdapterUpdateThread(void) -+{ -+ StopThread(false); -+ m_event.Set(); -+ StopThread(true); -+} -+ -+void CPeripheralCecAdapterUpdateThread::Signal(void) -+{ -+ m_event.Set(); -+} -+ -+bool CPeripheralCecAdapterUpdateThread::UpdateConfiguration(libcec_configuration *configuration) -+{ -+ CSingleLock lock(m_critSection); -+ if (m_bIsUpdating) -+ { -+ m_bNextConfigurationScheduled = true; -+ m_nextConfiguration = *configuration; -+ } -+ else -+ { -+ m_configuration = *configuration; -+ m_event.Set(); -+ } -+ return true; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::WaitReady(void) -+{ -+ // don't wait if we're not powering up anything -+ if (m_configuration.wakeDevices.IsEmpty() && m_configuration.bActivateSource == 0) -+ return true; -+ -+ // wait for the TV if we're configured to become the active source. -+ // wait for the first device in the wake list otherwise. -+ cec_logical_address waitFor = (m_configuration.bActivateSource == 1) ? -+ CECDEVICE_TV : -+ m_configuration.wakeDevices.primary; -+ -+ cec_power_status powerStatus(CEC_POWER_STATUS_UNKNOWN); -+ bool bContinue(true); -+ while (bContinue && !m_adapter->m_bStop && !m_bStop && powerStatus != CEC_POWER_STATUS_ON) -+ { -+ powerStatus = m_adapter->m_cecAdapter->GetDevicePowerStatus(waitFor); -+ if (powerStatus != CEC_POWER_STATUS_ON) -+ bContinue = !m_event.WaitMSec(1000); -+ } -+ -+ return powerStatus == CEC_POWER_STATUS_ON; -+} -+ -+bool CPeripheralCecAdapterUpdateThread::SetInitialConfiguration(void) -+{ -+ // devices to wake are set -+ if (!m_configuration.wakeDevices.IsEmpty()) -+ m_adapter->m_cecAdapter->PowerOnDevices(CECDEVICE_BROADCAST); -+ -+ // the option to make XBMC the active source is set -+ if (m_configuration.bActivateSource == 1) -+ m_adapter->m_cecAdapter->SetActiveSource(); -+ -+ // wait until devices are powered up -+ if (!WaitReady()) -+ return false; -+ -+ // request the menu language of the TV -+ if (m_configuration.bUseTVMenuLanguage == 1) -+ { -+ cec_menu_language language; -+ if (m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language)) -+ m_adapter->SetMenuLanguage(language.language); -+ } -+ -+ // request the OSD name of the TV -+ CStdString strNotification; -+ cec_osd_name tvName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV); -+ strNotification.Format("%s: %s", g_localizeStrings.Get(36016), tvName.name); -+ -+ /* disable the mute setting when an amp is found, because the amp handles the mute setting and -+ set PCM output to 100% */ -+ if (m_adapter->m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM)) -+ { -+ // request the OSD name of the amp -+ cec_osd_name ampName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM); -+ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name); -+ strNotification.AppendFormat(" - %s", ampName.name); -+ -+ // set amp present -+ m_adapter->SetAudioSystemConnected(true); -+ g_settings.m_bMute = false; -+ g_settings.m_nVolumeLevel = VOLUME_MAXIMUM; -+ } -+ -+ m_adapter->m_bIsReady = true; -+ -+ // try to send an OSD string to the TV -+ m_adapter->m_cecAdapter->SetOSDString(CECDEVICE_TV, CEC_DISPLAY_CONTROL_DISPLAY_FOR_DEFAULT_TIME, g_localizeStrings.Get(36016).c_str()); -+ // and let the gui know that we're done -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), strNotification); -+ -+ CSingleLock lock(m_critSection); -+ m_bIsUpdating = false; -+ return true; -+} -+ -+void CPeripheralCecAdapterUpdateThread::Process(void) -+{ -+ // set the initial configuration -+ if (!SetInitialConfiguration()) -+ return; -+ -+ // and wait for updates -+ bool bUpdate(false); -+ while (!m_bStop) -+ { -+ // update received -+ if (m_event.WaitMSec(500) || bUpdate) -+ { -+ if (m_bStop) -+ return; -+ // set the new configuration -+ bool bConfigSet(m_adapter->m_cecAdapter->SetConfiguration(&m_configuration)); -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(bConfigSet ? 36023 : 36024)); -+ { -+ CSingleLock lock(m_critSection); -+ bUpdate = m_bNextConfigurationScheduled; -+ if (bUpdate) -+ { -+ // another update is scheduled -+ m_bNextConfigurationScheduled = false; -+ m_configuration = m_nextConfiguration; -+ } -+ else -+ { -+ // nothing left to do, wait for updates -+ m_bIsUpdating = false; -+ m_event.Reset(); -+ } -+ } -+ } -+ } -+} -+ - #endif -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:47:59.563514930 +0200 -@@ -20,7 +20,28 @@ - * - */ - --#if defined(HAVE_LIBCEC) -+#if !defined(HAVE_LIBCEC) -+#include "Peripheral.h" -+ -+// an empty implementation, so CPeripherals can be compiled without a bunch of #ifdef's when libCEC is not available -+namespace PERIPHERALS -+{ -+ class CPeripheralCecAdapter : public CPeripheral -+ { -+ public: -+ bool HasConnectedAudioSystem(void) { return false; } -+ void ScheduleVolumeUp(void) {} -+ void ScheduleVolumeDown(void) {} -+ bool IsMuted(void) { return false; } -+ void ScheduleMute(void) {} -+ -+ WORD GetButton(void) { return 0; } -+ unsigned int GetHoldTime(void) { return 0; } -+ void ResetButton(void) {} -+ }; -+} -+ -+#else - - #include "PeripheralHID.h" - #include "interfaces/AnnouncementManager.h" -@@ -32,7 +53,7 @@ - #ifdef isset - #undef isset - #endif --#include -+#include - - class DllLibCEC; - -@@ -43,25 +64,40 @@ - - namespace PERIPHERALS - { -+ class CPeripheralCecAdapterUpdateThread; -+ - typedef struct - { - WORD iButton; - unsigned int iDuration; - } CecButtonPress; - -+ typedef enum -+ { -+ VOLUME_CHANGE_NONE, -+ VOLUME_CHANGE_UP, -+ VOLUME_CHANGE_DOWN, -+ VOLUME_CHANGE_MUTE -+ } CecVolumeChange; - - class CPeripheralCecAdapter : public CPeripheralHID, public ANNOUNCEMENT::IAnnouncer, private CThread - { -+ friend class CPeripheralCecAdapterUpdateThread; -+ - public: - CPeripheralCecAdapter(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId); - virtual ~CPeripheralCecAdapter(void); - - virtual void Announce(ANNOUNCEMENT::EAnnouncementFlag flag, const char *sender, const char *message, const CVariant &data); -- virtual bool PowerOnCecDevices(CEC::cec_logical_address iLogicalAddress); -- virtual bool StandbyCecDevices(CEC::cec_logical_address iLogicalAddress); -- -- virtual bool SendPing(void); -- virtual bool SetHdmiPort(int iHdmiPort); -+ virtual bool HasConnectedAudioSystem(void); -+ virtual void SetAudioSystemConnected(bool bSetTo); -+ virtual void ScheduleVolumeUp(void); -+ virtual void VolumeUp(void); -+ virtual void ScheduleVolumeDown(void); -+ virtual void VolumeDown(void); -+ virtual void ScheduleMute(void); -+ virtual void Mute(void); -+ virtual bool IsMuted(void); - - virtual void OnSettingChanged(const CStdString &strChangedSetting); - -@@ -71,27 +107,66 @@ - virtual CStdString GetComPort(void); - - protected: -- virtual void FlushLog(void); -- virtual bool GetNextCecKey(CEC::cec_keypress &key); -+ virtual bool OpenConnection(void); -+ virtual void SetConfigurationFromSettings(void); -+ virtual void SetConfigurationFromLibCEC(const CEC::libcec_configuration &config); -+ static void ReadLogicalAddresses(const CStdString &strString, CEC::cec_logical_addresses &addresses); -+ static int CecKeyPress(void *cbParam, const CEC::cec_keypress &key); -+ static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); -+ static int CecCommand(void *cbParam, const CEC::cec_command &command); -+ static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ - virtual bool GetNextKey(void); -+ virtual bool GetNextCecKey(CEC::cec_keypress &key); - virtual bool InitialiseFeature(const PeripheralFeature feature); - virtual void Process(void); -- virtual void ProcessNextCommand(void); -+ virtual void ProcessVolumeChange(void); - virtual void SetMenuLanguage(const char *strLanguage); - static bool FindConfigLocation(CStdString &strString); - static bool TranslateComPort(CStdString &strPort); - -- DllLibCEC* m_dll; -- CEC::ICECAdapter* m_cecAdapter; -- bool m_bStarted; -- bool m_bHasButton; -- bool m_bIsReady; -- CStdString m_strMenuLanguage; -- CDateTime m_screensaverLastActivated; -- CecButtonPress m_button; -- std::queue m_buttonQueue; -- unsigned int m_lastKeypress; -- CCriticalSection m_critSection; -+ DllLibCEC* m_dll; -+ CEC::ICECAdapter* m_cecAdapter; -+ bool m_bStarted; -+ bool m_bHasButton; -+ bool m_bIsReady; -+ bool m_bHasConnectedAudioSystem; -+ CStdString m_strMenuLanguage; -+ CDateTime m_screensaverLastActivated; -+ CecButtonPress m_button; -+ std::queue m_buttonQueue; -+ std::queue m_volumeChangeQueue; -+ unsigned int m_lastKeypress; -+ CecVolumeChange m_lastChange; -+ int m_iExitCode; -+ bool m_bIsMuted; -+ CPeripheralCecAdapterUpdateThread*m_queryThread; -+ CEC::ICECCallbacks m_callbacks; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ }; -+ -+ class CPeripheralCecAdapterUpdateThread : public CThread -+ { -+ public: -+ CPeripheralCecAdapterUpdateThread(CPeripheralCecAdapter *adapter, CEC::libcec_configuration *configuration); -+ virtual ~CPeripheralCecAdapterUpdateThread(void); -+ -+ virtual void Signal(void); -+ virtual bool UpdateConfiguration(CEC::libcec_configuration *configuration); -+ -+ protected: -+ virtual bool WaitReady(void); -+ virtual bool SetInitialConfiguration(void); -+ virtual void Process(void); -+ -+ CPeripheralCecAdapter * m_adapter; -+ CEvent m_event; -+ CCriticalSection m_critSection; -+ CEC::libcec_configuration m_configuration; -+ CEC::libcec_configuration m_nextConfiguration; -+ bool m_bNextConfigurationScheduled; -+ bool m_bIsUpdating; - }; - } - -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:47:59.570515061 +0200 -@@ -30,6 +30,14 @@ - using namespace PERIPHERALS; - using namespace std; - -+struct SortBySettingsOrder -+{ -+ bool operator()(const CSetting *left, const CSetting *right) -+ { -+ return left->GetOrder() < right->GetOrder(); -+ } -+}; -+ - CPeripheral::CPeripheral(const PeripheralType type, const PeripheralBusType busType, const CStdString &strLocation, const CStdString &strDeviceName, int iVendorId, int iProductId) : - m_type(type), - m_busType(busType), -@@ -168,6 +176,15 @@ - return m_subDevices.size() > 0; - } - -+vector CPeripheral::GetSettings(void) const -+{ -+ vector settings; -+ for (map::const_iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ settings.push_back(it->second); -+ sort(settings.begin(), settings.end(), SortBySettingsOrder()); -+ return settings; -+} -+ - void CPeripheral::AddSetting(const CStdString &strKey, const CSetting *setting) - { - if (!setting) -@@ -183,7 +200,7 @@ - case SETTINGS_TYPE_BOOL: - { - const CSettingBool *mappedSetting = (const CSettingBool *) setting; -- CSettingBool *boolSetting = new CSettingBool(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); -+ CSettingBool *boolSetting = new CSettingBool(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->GetControlType()); - if (boolSetting) - { - boolSetting->SetVisible(mappedSetting->IsVisible()); -@@ -194,7 +211,7 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -@@ -205,7 +222,7 @@ - case SETTINGS_TYPE_FLOAT: - { - const CSettingFloat *mappedSetting = (const CSettingFloat *) setting; -- CSettingFloat *floatSetting = new CSettingFloat(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); -+ CSettingFloat *floatSetting = new CSettingFloat(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_fMin, mappedSetting->m_fStep, mappedSetting->m_fMax, mappedSetting->GetControlType()); - if (floatSetting) - { - floatSetting->SetVisible(mappedSetting->IsVisible()); -@@ -216,7 +233,7 @@ - case SETTINGS_TYPE_STRING: - { - const CSettingString *mappedSetting = (const CSettingString *) setting; -- CSettingString *stringSetting = new CSettingString(0, strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); -+ CSettingString *stringSetting = new CSettingString(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData().c_str(), mappedSetting->GetControlType(), mappedSetting->m_bAllowEmpty, mappedSetting->m_iHeadingString); - if (stringSetting) - { - stringSetting->SetVisible(mappedSetting->IsVisible()); -@@ -323,7 +340,7 @@ - bool bChanged(boolSetting->GetData() != bValue); - boolSetting->SetData(bValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -339,7 +356,7 @@ - bool bChanged(intSetting->GetData() != iValue); - intSetting->SetData(iValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } -@@ -355,11 +372,26 @@ - bool bChanged(floatSetting->GetData() != fValue); - floatSetting->SetData(fValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - } - -+void CPeripheral::SetSettingVisible(const CStdString &strKey, bool bSetTo) -+{ -+ map::iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ (*it).second->SetVisible(bSetTo); -+} -+ -+bool CPeripheral::IsSettingVisible(const CStdString &strKey) const -+{ -+ map::const_iterator it = m_settings.find(strKey); -+ if (it != m_settings.end()) -+ return (*it).second->IsVisible(); -+ return false; -+} -+ - void CPeripheral::SetSetting(const CStdString &strKey, const CStdString &strValue) - { - map::iterator it = m_settings.find(strKey); -@@ -373,7 +405,7 @@ - bool bChanged(!stringSetting->GetData().Equals(strValue)); - stringSetting->SetData(strValue); - if (bChanged && m_bInitialised) -- m_changedSettings.push_back(strKey); -+ m_changedSettings.insert(strKey); - } - } - else if ((*it).second->GetType() == SETTINGS_TYPE_INT) -@@ -436,7 +468,7 @@ - - if (!bExiting) - { -- for (vector::iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) -+ for (set::const_iterator it = m_changedSettings.begin(); it != m_changedSettings.end(); it++) - OnSettingChanged(*it); - } - m_changedSettings.clear(); -@@ -467,7 +499,7 @@ - map::iterator it = m_settings.begin(); - while (it != m_settings.end()) - { -- m_changedSettings.push_back((*it).first); -+ m_changedSettings.insert((*it).first); - ++it; - } - -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:47:59.589515425 +0200 -@@ -20,7 +20,7 @@ - * - */ - --#include -+#include - #include "utils/StdString.h" - #include "peripherals/PeripheralTypes.h" - -@@ -128,6 +128,8 @@ - */ - virtual const CStdString GetSettingString(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, const CStdString &strValue); -+ virtual void SetSettingVisible(const CStdString &strKey, bool bSetTo); -+ virtual bool IsSettingVisible(const CStdString &strKey) const; - - virtual int GetSettingInt(const CStdString &strKey) const; - virtual void SetSetting(const CStdString &strKey, int iValue); -@@ -142,6 +144,8 @@ - virtual void LoadPersistedSettings(void); - virtual void ResetDefaultSettings(void); - -+ virtual std::vector GetSettings(void) const; -+ - virtual bool ErrorOccured(void) const { return m_bError; } - - protected: -@@ -163,6 +167,6 @@ - std::vector m_features; - std::vector m_subDevices; - std::map m_settings; -- std::vector m_changedSettings; -+ std::set m_changedSettings; - }; - } -diff -Naur xbmc-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp ---- xbmc-11.0.1/xbmc/peripherals/devices/PeripheralHID.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/devices/PeripheralHID.cpp 2012-04-17 14:47:59.589515425 +0200 -@@ -37,7 +37,7 @@ - - CPeripheralHID::~CPeripheralHID(void) - { -- if (!m_strKeymap.IsEmpty() && GetSettingBool("keymap_enabled")) -+ if (!m_strKeymap.IsEmpty() && !GetSettingBool("do_not_use_custom_keymap")) - { - CLog::Log(LOGDEBUG, "%s - switching active keymapping to: default", __FUNCTION__); - CButtonTranslator::GetInstance().RemoveDevice(m_strKeymap); -@@ -59,9 +59,12 @@ - SetSetting("keymap", m_strKeymap); - } - -+ if (!IsSettingVisible("keymap")) -+ SetSettingVisible("do_not_use_custom_keymap", false); -+ - if (!m_strKeymap.IsEmpty()) - { -- bool bKeymapEnabled(GetSettingBool("keymap_enabled")); -+ bool bKeymapEnabled(!GetSettingBool("do_not_use_custom_keymap")); - if (bKeymapEnabled) - { - CLog::Log(LOGDEBUG, "%s - adding keymapping for: %s", __FUNCTION__, m_strKeymap.c_str()); -@@ -82,7 +85,7 @@ - - void CPeripheralHID::OnSettingChanged(const CStdString &strChangedSetting) - { -- if (m_bInitialised && ((strChangedSetting.Equals("keymap") && GetSettingBool("keymap_enabled")) || strChangedSetting.Equals("keymap_enabled"))) -+ if (m_bInitialised && ((strChangedSetting.Equals("keymap") && !GetSettingBool("do_not_use_custom_keymap")) || strChangedSetting.Equals("keymap_enabled"))) - { - m_bInitialised = false; - InitialiseFeature(FEATURE_HID); -diff -Naur xbmc-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:47:59.590515442 +0200 -@@ -66,17 +66,15 @@ - - if (m_item) - { -- int iIndex = 1; - CPeripheral *peripheral = g_peripherals.GetByPath(m_item->GetPath()); - if (peripheral) - { -- map::iterator it = peripheral->m_settings.begin(); -- while (it != peripheral->m_settings.end()) -+ vector settings = peripheral->GetSettings(); -+ for (size_t iPtr = 0; iPtr < settings.size(); iPtr++) - { -- CSetting *setting = (*it).second; -+ CSetting *setting = settings[iPtr]; - if (!setting->IsVisible()) - { -- ++it; - CLog::Log(LOGDEBUG, "%s - invisible", __FUNCTION__); - continue; - } -@@ -89,7 +87,7 @@ - if (boolSetting) - { - m_boolSettings.insert(make_pair(CStdString(boolSetting->GetSetting()), boolSetting->GetData())); -- AddBool(iIndex++, boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); -+ AddBool(boolSetting->GetOrder(), boolSetting->GetLabel(), &m_boolSettings[boolSetting->GetSetting()], true); - } - } - break; -@@ -99,7 +97,7 @@ - if (intSetting) - { - m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(iIndex++, intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); - } - } - break; -@@ -109,7 +107,7 @@ - if (floatSetting) - { - m_floatSettings.insert(make_pair(CStdString(floatSetting->GetSetting()), floatSetting->GetData())); -- AddSlider(iIndex++, floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); -+ AddSlider(floatSetting->GetOrder(), floatSetting->GetLabel(), &m_floatSettings[floatSetting->GetSetting()], floatSetting->m_fMin, floatSetting->m_fStep, floatSetting->m_fMax, CGUIDialogVideoSettings::FormatFloat, false); - } - } - break; -@@ -119,7 +117,7 @@ - if (stringSetting) - { - m_stringSettings.insert(make_pair(CStdString(stringSetting->GetSetting()), stringSetting->GetData())); -- AddString(iIndex, stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); -+ AddString(stringSetting->GetOrder(), stringSetting->GetLabel(), &m_stringSettings[stringSetting->GetSetting()]); - } - } - break; -@@ -128,7 +126,6 @@ - CLog::Log(LOGDEBUG, "%s - unknown type", __FUNCTION__); - break; - } -- ++it; - } - } - else -diff -Naur xbmc-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:47:59.647516518 +0200 -@@ -27,9 +27,7 @@ - #include "devices/PeripheralNIC.h" - #include "devices/PeripheralNyxboard.h" - #include "devices/PeripheralTuner.h" --#if defined(HAVE_LIBCEC) - #include "devices/PeripheralCecAdapter.h" --#endif - #include "bus/PeripheralBusUSB.h" - #include "dialogs/GUIDialogPeripheralManager.h" - -@@ -43,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "guilib/Key.h" - - using namespace PERIPHERALS; - using namespace XFILE; -@@ -447,6 +446,8 @@ - void CPeripherals::GetSettingsFromMappingsFile(TiXmlElement *xmlNode, map &m_settings) - { - TiXmlElement *currentNode = xmlNode->FirstChildElement("setting"); -+ int iMaxOrder(0); -+ - while (currentNode) - { - CSetting *setting = NULL; -@@ -492,10 +493,32 @@ - } - - //TODO add more types if needed -+ -+ /* set the visibility */ - setting->SetVisible(bConfigurable); -+ -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; -+ -+ /* and add this new setting */ - m_settings[strKey] = setting; -+ - currentNode = currentNode->NextSiblingElement("setting"); - } -+ -+ /* add the settings without an order attribute or an invalid order attribute set at the end */ -+ for (map::iterator it = m_settings.begin(); it != m_settings.end(); it++) -+ { -+ if (it->second->GetOrder() == 0) -+ it->second->SetOrder(++iMaxOrder); -+ } - } - - void CPeripherals::GetDirectory(const CStdString &strPath, CFileItemList &items) const -@@ -531,3 +554,89 @@ - - return NULL; - } -+ -+bool CPeripherals::OnAction(const CAction &action) -+{ -+ if (action.GetID() == ACTION_MUTE) -+ { -+ return ToggleMute(); -+ } -+ -+ if (SupportsCEC() && action.GetAmount() && (action.GetID() == ACTION_VOLUME_UP || action.GetID() == ACTION_VOLUME_DOWN)) -+ { -+ vector peripherals; -+ if (GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ if (action.GetID() == ACTION_VOLUME_UP) -+ cecDevice->ScheduleVolumeUp(); -+ else -+ cecDevice->ScheduleVolumeDown(); -+ return true; -+ } -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::IsMuted(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->IsMuted()) -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::ToggleMute(void) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->HasConnectedAudioSystem()) -+ { -+ cecDevice->ScheduleMute(); -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -+ -+bool CPeripherals::GetNextKeypress(float frameTime, CKey &key) -+{ -+ vector peripherals; -+ if (SupportsCEC() && GetPeripheralsWithFeature(peripherals, FEATURE_CEC)) -+ { -+ for (unsigned int iPeripheralPtr = 0; iPeripheralPtr < peripherals.size(); iPeripheralPtr++) -+ { -+ CPeripheralCecAdapter *cecDevice = (CPeripheralCecAdapter *) peripherals.at(iPeripheralPtr); -+ if (cecDevice && cecDevice->GetButton()) -+ { -+ CKey newKey(cecDevice->GetButton(), cecDevice->GetHoldTime()); -+ cecDevice->ResetButton(); -+ key = newKey; -+ return true; -+ } -+ } -+ } -+ -+ return false; -+} -diff -Naur xbmc-11.0.1/xbmc/peripherals/Peripherals.h xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.h ---- xbmc-11.0.1/xbmc/peripherals/Peripherals.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/peripherals/Peripherals.h 2012-04-17 14:47:59.648516536 +0200 -@@ -29,6 +29,8 @@ - class CSetting; - class CSettingsCategory; - class TiXmlElement; -+class CAction; -+class CKey; - - namespace PERIPHERALS - { -@@ -147,6 +149,54 @@ - */ - virtual CPeripheral *GetByPath(const CStdString &strPath) const; - -+ /*! -+ * @brief Try to let one of the peripherals handle an action. -+ * @param action The change to handle. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool OnAction(const CAction &action); -+ -+ /*! -+ * @brief Check whether there's a peripheral that reports to be muted. -+ * @return True when at least one peripheral reports to be muted, false otherwise. -+ */ -+ virtual bool IsMuted(void); -+ -+ /*! -+ * @brief Try to toggle the mute status via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool ToggleMute(void); -+ -+ /*! -+ * @brief Try to mute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool Mute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to unmute the audio via a peripheral. -+ * @return True when this change was handled by a peripheral (and should not be handled by anything else), false otherwise. -+ */ -+ virtual bool UnMute(void) { return ToggleMute(); } // TODO CEC only supports toggling the mute status at this time -+ -+ /*! -+ * @brief Try to get a keypress from a peripheral. -+ * @param frameTime The current frametime. -+ * @param key The fetched key. -+ * @return True when a keypress was fetched, false otherwise. -+ */ -+ virtual bool GetNextKeypress(float frameTime, CKey &key); -+ -+ bool SupportsCEC(void) const -+ { -+#if defined(HAVE_LIBCEC) -+ return true; -+#else -+ return false; -+#endif -+ } -+ - private: - CPeripherals(void); - bool LoadMappings(void); diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch deleted file mode 100644 index d08d45ece70..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.02-cec-fixed_possible_deadlock.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 35e4a2eb5515fe72d87b6d78b0567609df79df2b Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:30:25 +0200 -Subject: [PATCH] fixed: possible deadlock - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 6 ++++-- - 1 files changed, 4 insertions(+), 2 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 0cb6602..1c91341 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -140,8 +140,10 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnSleep")) - { - // this will also power off devices when we're the active source -- CSingleLock lock(m_critSection); -- m_bStop = true; -+ { -+ CSingleLock lock(m_critSection); -+ m_bStop = true; -+ } - WaitForThreadExit(0); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch deleted file mode 100644 index c186e4d62af..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.03-cec-fixed_make_sure_the_old_thread_is_stopped_before_starting_a_new_one.patch +++ /dev/null @@ -1,41 +0,0 @@ -From de4cd8d63257af1cb9060c4b2b304a82655adb99 Mon Sep 17 00:00:00 2001 -From: bobo1on1 -Date: Wed, 28 Mar 2012 21:31:46 +0200 -Subject: [PATCH] fixed: make sure the old thread is stopped before starting a - new one, fixes throwing an exception in the main thread - ---- - xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 14 ++++++++------ - 1 files changed, 8 insertions(+), 6 deletions(-) - -diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -index 1c91341..a898a16 100644 ---- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -+++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp -@@ -148,15 +148,17 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender, - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { -- // reconnect to the device -- CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ { -+ // reconnect to the device -+ CSingleLock lock(m_critSection); -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); - -- // close the previous connection -- m_cecAdapter->Close(); -+ // close the previous connection -+ m_cecAdapter->Close(); -+ } - - // and open a new one -- m_bStop = false; -+ StopThread(); - Create(); - } - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch deleted file mode 100644 index f870fbb3b6e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-801.04-cec-PR887.patch +++ /dev/null @@ -1,630 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-04-17 14:08:05.972587511 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-04-17 14:18:39.755586920 +0200 -@@ -1173,7 +1173,7 @@ - - # libcec is dyloaded, so we need to check for its headers and link any depends. - if test "x$use_libcec" != "xno"; then -- PKG_CHECK_MODULES([CEC],[libcec >= 1.5.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) -+ PKG_CHECK_MODULES([CEC],[libcec >= 1.6.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)]) - - if test "x$use_libcec" != "xno"; then - INCLUDES="$INCLUDES $CEC_CFLAGS" -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-04-17 14:08:05.974587546 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -2853,7 +2853,7 @@ - Could not detect the CEC port. Set it up manually. - Could not initialise the CEC adapter. Check your settings. - Unsupported libCEC interface version. %d is greater than the version XBMC supports (%d) -- Put this PC in standby mode when the TV is switched off -+ When the TV is switched off - HDMI port number - Connected - Adapter found, but libCEC is not available -@@ -2865,4 +2865,7 @@ - Configuration updated - Failed to set the new configuration. Please check your settings. - Send 'inactive source' command when stopping XBMC -+ Put devices in standby mode when putting the PC in standby -+ This device needs servicing -+ Ignore - -diff -Naur xbmc-pvr-11.0.1/system/peripherals.xml xbmc-pvr-11.0.1.patch/system/peripherals.xml ---- xbmc-pvr-11.0.1/system/peripherals.xml 2012-04-17 14:08:05.975587564 +0200 -+++ xbmc-pvr-11.0.1.patch/system/peripherals.xml 2012-04-17 14:18:39.757586958 +0200 -@@ -14,13 +14,14 @@ - - - -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ - - - -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/bus/PeripheralBus.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/bus/PeripheralBus.cpp 2012-04-17 14:18:39.758586977 +0200 -@@ -323,6 +323,7 @@ - peripheralFile->SetProperty("bus", PeripheralTypeTranslator::BusTypeToString(peripheral->GetBusType())); - peripheralFile->SetProperty("location", peripheral->Location()); - peripheralFile->SetProperty("class", PeripheralTypeTranslator::TypeToString(peripheral->Type())); -+ peripheralFile->SetProperty("version", peripheral->GetVersionInfo()); - items.Add(peripheralFile); - } - } -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:17:35.207364830 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.cpp 2012-04-17 14:18:39.760587015 +0200 -@@ -41,7 +41,7 @@ - using namespace ANNOUNCEMENT; - using namespace CEC; - --#define CEC_LIB_SUPPORTED_VERSION 0x1500 -+#define CEC_LIB_SUPPORTED_VERSION 0x1600 - - /* time in seconds to ignore standby commands from devices after the screensaver has been activated */ - #define SCREENSAVER_TIMEOUT 10 -@@ -80,7 +80,9 @@ - m_lastKeypress(0), - m_lastChange(VOLUME_CHANGE_NONE), - m_iExitCode(0), -- m_bIsMuted(false) // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bIsMuted(false), // TODO fetch the correct initial value when system audiostatus is implemented in libCEC -+ m_bGoingToStandby(false), -+ m_bIsRunning(false) - { - m_button.iButton = 0; - m_button.iDuration = 0; -@@ -96,6 +98,7 @@ - - m_bStop = true; - StopThread(true); -+ CAnnouncementManager::RemoveAnnouncer(this); - - if (m_dll && m_cecAdapter) - { -@@ -110,7 +113,11 @@ - { - if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnQuit") && m_bIsReady) - { -- m_iExitCode = data.asInteger(0); -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = data.asInteger(0); -+ } -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(false); - } - else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverDeactivated") && m_bIsReady) -@@ -142,23 +149,22 @@ - // this will also power off devices when we're the active source - { - CSingleLock lock(m_critSection); -- m_bStop = true; -+ m_bGoingToStandby = false; - } -- WaitForThreadExit(0); -+ StopThread(); - } - else if (flag == System && !strcmp(sender, "xbmc") && !strcmp(message, "OnWake")) - { - { -- // reconnect to the device - CSingleLock lock(m_critSection); -- CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -- -- // close the previous connection -- m_cecAdapter->Close(); -+ m_iExitCode = EXITCODE_RESTARTAPP; - } - -- // and open a new one -+ CLog::Log(LOGDEBUG, "%s - reconnecting to the CEC adapter after standby mode", __FUNCTION__); -+ CAnnouncementManager::RemoveAnnouncer(this); - StopThread(); -+ -+ // and open a new one - Create(); - } - } -@@ -172,6 +178,7 @@ - m_callbacks.CBCecKeyPress = &CecKeyPress; - m_callbacks.CBCecCommand = &CecCommand; - m_callbacks.CBCecConfigurationChanged = &CecConfiguration; -+ m_callbacks.CBCecAlert = &CecAlert; - m_configuration.callbackParam = this; - m_configuration.callbacks = &m_callbacks; - -@@ -200,6 +207,8 @@ - else - { - CLog::Log(LOGDEBUG, "%s - using libCEC v%s", __FUNCTION__, m_cecAdapter->ToString((cec_server_version)m_configuration.serverVersion)); -+ if (m_configuration.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); - } - - m_bStarted = true; -@@ -297,6 +306,13 @@ - if (!OpenConnection()) - return; - -+ { -+ CSingleLock lock(m_critSection); -+ m_iExitCode = EXITCODE_QUIT; -+ m_bGoingToStandby = false; -+ m_bIsRunning = true; -+ } -+ - CAnnouncementManager::AddAnnouncer(this); - - m_queryThread = new CPeripheralCecAdapterUpdateThread(this, &m_configuration); -@@ -312,8 +328,17 @@ - } - - delete m_queryThread; -+ m_queryThread = NULL; -+ -+ bool bSendStandbyCommands(false); -+ { -+ CSingleLock lock(m_critSection); -+ bSendStandbyCommands = m_iExitCode != EXITCODE_REBOOT && -+ m_iExitCode != EXITCODE_RESTARTAPP && -+ (!m_bGoingToStandby || GetSettingBool("standby_tv_on_pc_standby")); -+ } - -- if (m_iExitCode != EXITCODE_REBOOT) -+ if (bSendStandbyCommands) - { - if (m_cecAdapter->IsLibCECActiveSource()) - { -@@ -337,7 +362,12 @@ - m_cecAdapter->Close(); - - CLog::Log(LOGDEBUG, "%s - CEC adapter processor thread ended", __FUNCTION__); -- m_bStarted = false; -+ -+ { -+ CSingleLock lock(m_critSection); -+ m_bStarted = false; -+ m_bIsRunning = false; -+ } - } - - bool CPeripheralCecAdapter::HasConnectedAudioSystem(void) -@@ -556,11 +586,15 @@ - case CEC_OPCODE_STANDBY: - /* a device was put in standby mode */ - CLog::Log(LOGDEBUG, "%s - device %1x was put in standby mode", __FUNCTION__, command.initiator); -- if (command.initiator == CECDEVICE_TV && adapter->m_configuration.bPowerOffOnStandby == 1 && -+ if (command.initiator == CECDEVICE_TV && -+ (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_configuration.bShutdownOnStandby == 1) && - (!adapter->m_screensaverLastActivated.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_screensaverLastActivated > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT))) - { - adapter->m_bStarted = false; -- g_application.getApplicationMessenger().Suspend(); -+ if (adapter->m_configuration.bPowerOffOnStandby == 1) -+ g_application.getApplicationMessenger().Suspend(); -+ else if (adapter->m_configuration.bShutdownOnStandby == 1) -+ g_application.getApplicationMessenger().Shutdown(); - } - break; - case CEC_OPCODE_SET_MENU_LANGUAGE: -@@ -634,6 +668,30 @@ - return 1; - } - -+int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter &data) -+{ -+ (void)data; -+ -+ CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -+ if (!adapter) -+ return 0; -+ -+ int iAlertString(0); -+ switch (alert) -+ { -+ case CEC_ALERT_SERVICE_DEVICE: -+ iAlertString = 36027; -+ break; -+ default: -+ break; -+ } -+ -+ if (iAlertString) -+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(36000), g_localizeStrings.Get(iAlertString)); -+ -+ return 1; -+} -+ - int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress &key) - { - CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam; -@@ -695,6 +753,10 @@ - case CEC_USER_CONTROL_CODE_RIGHT_DOWN: - iButton = XINPUT_IR_REMOTE_RIGHT; - break; -+ case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: -+ case CEC_USER_CONTROL_CODE_SETUP_MENU: -+ case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -+ case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_ROOT_MENU: - iButton = XINPUT_IR_REMOTE_MENU; - break; -@@ -711,7 +773,11 @@ - iButton = XINPUT_IR_REMOTE_CHANNEL_PLUS; - break; - case CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL: -+#if defined(XINPUT_IR_REMOTE_TELETEXT) -+ iButton = XINPUT_IR_REMOTE_TELETEXT; // only supported by the pvr branch -+#else - iButton = XINPUT_IR_REMOTE_BACK; -+#endif - break; - case CEC_USER_CONTROL_CODE_SOUND_SELECT: - iButton = XINPUT_IR_REMOTE_LANGUAGE; -@@ -806,13 +872,23 @@ - case CEC_USER_CONTROL_CODE_F4_YELLOW: - iButton = XINPUT_IR_REMOTE_YELLOW; - break; -+ case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: -+#if defined(XINPUT_IR_REMOTE_GUIDE) -+ iButton = XINPUT_IR_REMOTE_GUIDE; -+#else -+ bHasButton = false; -+#endif -+ break; -+ case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST: -+#if defined(XINPUT_IR_REMOTE_LIVE_TV) -+ iButton = XINPUT_IR_REMOTE_LIVE_TV; -+#else -+ bHasButton = false; -+#endif -+ break; - case CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION: - case CEC_USER_CONTROL_CODE_EJECT: -- case CEC_USER_CONTROL_CODE_SETUP_MENU: -- case CEC_USER_CONTROL_CODE_CONTENTS_MENU: -- case CEC_USER_CONTROL_CODE_FAVORITE_MENU: - case CEC_USER_CONTROL_CODE_DOT: -- case CEC_USER_CONTROL_CODE_NEXT_FAVORITE: - case CEC_USER_CONTROL_CODE_INPUT_SELECT: - case CEC_USER_CONTROL_CODE_INITIAL_CONFIGURATION: - case CEC_USER_CONTROL_CODE_HELP: -@@ -821,7 +897,6 @@ - case CEC_USER_CONTROL_CODE_ANGLE: - case CEC_USER_CONTROL_CODE_SUB_PICTURE: - case CEC_USER_CONTROL_CODE_VIDEO_ON_DEMAND: -- case CEC_USER_CONTROL_CODE_ELECTRONIC_PROGRAM_GUIDE: - case CEC_USER_CONTROL_CODE_TIMER_PROGRAMMING: - case CEC_USER_CONTROL_CODE_PLAY_FUNCTION: - case CEC_USER_CONTROL_CODE_PAUSE_PLAY_FUNCTION: -@@ -894,11 +969,15 @@ - else if (bEnabled && !m_cecAdapter && m_bStarted) - InitialiseFeature(FEATURE_CEC); - } -- else -+ else if (IsRunning()) - { - SetConfigurationFromSettings(); - m_queryThread->UpdateConfiguration(&m_configuration); - } -+ else -+ { -+ InitialiseFeature(FEATURE_CEC); -+ } - } - - int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message &message) -@@ -962,7 +1041,7 @@ - - // set the physical address, when baseDevice or iHDMIPort are not set - if (m_configuration.baseDevice == CECDEVICE_UNKNOWN || -- m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 4) -+ m_configuration.iHDMIPort == 0 || m_configuration.iHDMIPort > 15) - { - m_configuration.iPhysicalAddress = config.iPhysicalAddress; - CStdString strPhysicalAddress; -@@ -977,7 +1056,7 @@ - // set the devices to wake when starting - m_configuration.wakeDevices = config.wakeDevices; - CStdString strWakeDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.wakeDevices[iPtr]) - strWakeDevices.AppendFormat(" %X", iPtr); - SetSetting("wake_devices", strWakeDevices.Trim()); -@@ -985,10 +1064,10 @@ - // set the devices to power off when stopping - m_configuration.powerOffDevices = config.powerOffDevices; - CStdString strPowerOffDevices; -- for (unsigned int iPtr = 0; iPtr <= 16; iPtr++) -+ for (unsigned int iPtr = CECDEVICE_TV; iPtr <= CECDEVICE_BROADCAST; iPtr++) - if (config.powerOffDevices[iPtr]) - strPowerOffDevices.AppendFormat(" %X", iPtr); -- SetSetting("wake_devices", strPowerOffDevices.Trim()); -+ SetSetting("standby_devices", strPowerOffDevices.Trim()); - - // set the boolean settings - m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage; -@@ -1001,17 +1080,27 @@ - SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1); - - m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby; -- SetSetting("standby_pc_on_tv_standby", m_configuration.bPowerOffOnStandby == 1); - - if (config.serverVersion >= CEC_SERVER_VERSION_1_5_1) - m_configuration.bSendInactiveSource = config.bSendInactiveSource; - SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1); -+ -+ if (config.serverVersion >= CEC_SERVER_VERSION_1_6_0) -+ { -+ m_configuration.iFirmwareVersion = config.iFirmwareVersion; -+ m_strVersionInfo.Format("%d", m_configuration.iFirmwareVersion); -+ m_configuration.bShutdownOnStandby = config.bShutdownOnStandby; -+ } -+ -+ SetSetting("standby_pc_on_tv_standby", -+ m_configuration.bPowerOffOnStandby == 1 ? 13011 : -+ m_configuration.bShutdownOnStandby == 1 ? 13005 : 36028); - } - - void CPeripheralCecAdapter::SetConfigurationFromSettings(void) - { -- // client version 1.5.0 -- m_configuration.clientVersion = CEC_CLIENT_VERSION_1_5_1; -+ // client version 1.6.0 -+ m_configuration.clientVersion = CEC_CLIENT_VERSION_1_6_0; - - // device name 'XBMC' - snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str()); -@@ -1061,15 +1150,16 @@ - m_configuration.powerOffDevices.Clear(); - ReadLogicalAddresses(strStandbyDevices, m_configuration.powerOffDevices); - -- // always get the settings from the rom, when supported by the firmware -- m_configuration.bGetSettingsFromROM = 1; -- - // read the boolean settings - m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0; - m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0; - m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0; -- m_configuration.bPowerOffOnStandby = GetSettingBool("standby_pc_on_tv_standby") ? 1 : 0; - m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0; -+ -+ // read the mutually exclusive boolean settings -+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby")); -+ m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0; -+ m_configuration.bShutdownOnStandby = iStandbyAction == 13005 ? 1 : 0; - } - - void CPeripheralCecAdapter::ReadLogicalAddresses(const CStdString &strString, cec_logical_addresses &addresses) -@@ -1203,6 +1293,12 @@ - return true; - } - -+bool CPeripheralCecAdapter::IsRunning(void) const -+{ -+ CSingleLock lock(m_critSection); -+ return m_bIsRunning; -+} -+ - void CPeripheralCecAdapterUpdateThread::Process(void) - { - // set the initial configuration -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:08:06.071589381 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/PeripheralCecAdapter.h 2012-04-17 14:18:39.761587034 +0200 -@@ -115,6 +115,8 @@ - static int CecLogMessage(void *cbParam, const CEC::cec_log_message &message); - static int CecCommand(void *cbParam, const CEC::cec_command &command); - static int CecConfiguration(void *cbParam, const CEC::libcec_configuration &config); -+ static int CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter &data); -+ bool IsRunning(void) const; - - virtual bool GetNextKey(void); - virtual bool GetNextCecKey(CEC::cec_keypress &key); -@@ -140,6 +142,8 @@ - CecVolumeChange m_lastChange; - int m_iExitCode; - bool m_bIsMuted; -+ bool m_bGoingToStandby; -+ bool m_bIsRunning; - CPeripheralCecAdapterUpdateThread*m_queryThread; - CEC::ICECCallbacks m_callbacks; - CCriticalSection m_critSection; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -211,7 +211,15 @@ - case SETTINGS_TYPE_INT: - { - const CSettingInt *mappedSetting = (const CSettingInt *) setting; -- CSettingInt *intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ CSettingInt *intSetting(NULL); -+ if (mappedSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_iMin, mappedSetting->m_iStep, mappedSetting->m_iMax, mappedSetting->GetControlType(), mappedSetting->m_strFormat); -+ } -+ else if (mappedSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ intSetting = new CSettingInt(mappedSetting->GetOrder(), strKey.c_str(), mappedSetting->GetLabel(), mappedSetting->GetData(), mappedSetting->m_entries, mappedSetting->GetControlType()); -+ } - if (intSetting) - { - intSetting->SetVisible(mappedSetting->IsVisible()); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:08:06.104590004 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/devices/Peripheral.h 2012-04-17 14:18:39.758586977 +0200 -@@ -53,6 +53,7 @@ - const CStdString &DeviceName(void) const { return m_strDeviceName; } - bool IsHidden(void) const { return m_bHidden; } - void SetHidden(bool bSetTo = true) { m_bHidden = bSetTo; } -+ const CStdString &GetVersionInfo(void) const { return m_strVersionInfo; } - - /*! - * @brief Check whether this device has the given feature. -@@ -161,6 +162,7 @@ - CStdString m_strVendorId; - int m_iProductId; - CStdString m_strProductId; -+ CStdString m_strVersionInfo; - bool m_bInitialised; - bool m_bHidden; - bool m_bError; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:08:06.105590023 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.cpp 2012-04-17 14:18:39.753586884 +0200 -@@ -51,6 +51,7 @@ - delete m_item; - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -@@ -96,8 +97,23 @@ - CSettingInt *intSetting = (CSettingInt *) setting; - if (intSetting) - { -- m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -- AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ if (intSetting->GetControlType() == SPIN_CONTROL_INT) -+ { -+ m_intSettings.insert(make_pair(CStdString(intSetting->GetSetting()), (float) intSetting->GetData())); -+ AddSlider(intSetting->GetOrder(), intSetting->GetLabel(), &m_intSettings[intSetting->GetSetting()], (float)intSetting->m_iMin, (float)intSetting->m_iStep, (float)intSetting->m_iMax, CGUIDialogVideoSettings::FormatInteger, false); -+ } -+ else if (intSetting->GetControlType() == SPIN_CONTROL_TEXT) -+ { -+ m_intTextSettings.insert(make_pair(CStdString(intSetting->GetSetting()), intSetting->GetData())); -+ vector > entries; -+ map::iterator entriesItr = intSetting->m_entries.begin(); -+ while (entriesItr != intSetting->m_entries.end()) -+ { -+ entries.push_back(make_pair(entriesItr->first, entriesItr->second)); -+ ++entriesItr; -+ } -+ AddSpin(intSetting->GetOrder(), intSetting->GetLabel(), &m_intTextSettings[intSetting->GetSetting()], entries); -+ } - } - } - break; -@@ -160,6 +176,13 @@ - ++intItr; - } - -+ map::iterator intTextItr = m_intTextSettings.begin(); -+ while (intTextItr != m_intTextSettings.end()) -+ { -+ peripheral->SetSetting((*intTextItr).first, (*intTextItr).second); -+ ++intTextItr; -+ } -+ - map::iterator floatItr = m_floatSettings.begin(); - while (floatItr != m_floatSettings.end()) - { -@@ -210,6 +233,7 @@ - /* clear the settings */ - m_boolSettings.clear(); - m_intSettings.clear(); -+ m_intTextSettings.clear(); - m_floatSettings.clear(); - m_stringSettings.clear(); - m_settings.clear(); -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h ---- xbmc-pvr-11.0.1/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/dialogs/GUIDialogPeripheralSettings.h 2012-04-17 14:18:39.753586884 +0200 -@@ -44,6 +44,7 @@ - bool m_bIsInitialising; - std::map m_boolSettings; - std::map m_intSettings; -+ std::map m_intTextSettings; - std::map m_floatSettings; - std::map m_stringSettings; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:08:06.106590043 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-04-17 14:18:39.752586865 +0200 -@@ -41,6 +41,7 @@ - #include "guilib/LocalizeStrings.h" - #include "dialogs/GUIDialogKaiToast.h" - #include "utils/StringUtils.h" -+#include "Util.h" - #include "guilib/Key.h" - - using namespace PERIPHERALS; -@@ -486,29 +487,46 @@ - float fMax = currentNode->Attribute("max") ? (float) atof(currentNode->Attribute("max")) : 0; - setting = new CSettingFloat(0, strKey, iLabelId, fValue, fMin, fStep, fMax, SPIN_CONTROL_FLOAT); - } -+ else if (strSettingsType.Equals("enum")) -+ { -+ CStdString strEnums(currentNode->Attribute("lvalues")); -+ if (!strEnums.IsEmpty()) -+ { -+ map enums; -+ vector valuesVec; -+ CUtil::Tokenize(strEnums, valuesVec, "|"); -+ for (unsigned int i = 0; i < valuesVec.size(); i++) -+ enums.insert(make_pair(atoi(valuesVec[i]), atoi(valuesVec[i]))); -+ int iValue = currentNode->Attribute("value") ? atoi(currentNode->Attribute("value")) : 0; -+ setting = new CSettingInt(0, strKey, iLabelId, iValue, enums, SPIN_CONTROL_TEXT); -+ } -+ } - else - { - CStdString strValue(currentNode->Attribute("value")); - setting = new CSettingString(0, strKey, iLabelId, strValue, EDIT_CONTROL_INPUT, !bConfigurable, -1); - } - -- //TODO add more types if needed -+ if (setting) -+ { -+ //TODO add more types if needed - -- /* set the visibility */ -- setting->SetVisible(bConfigurable); -+ /* set the visibility */ -+ setting->SetVisible(bConfigurable); - -- /* set the order */ -- int iOrder(0); -- currentNode->Attribute("order", &iOrder); -- /* if the order attribute is invalid or 0, then the setting will be added at the end */ -- if (iOrder < 0) -- iOrder = 0; -- setting->SetOrder(iOrder); -- if (iOrder > iMaxOrder) -- iMaxOrder = iOrder; -+ /* set the order */ -+ int iOrder(0); -+ currentNode->Attribute("order", &iOrder); -+ /* if the order attribute is invalid or 0, then the setting will be added at the end */ -+ if (iOrder < 0) -+ iOrder = 0; -+ setting->SetOrder(iOrder); -+ if (iOrder > iMaxOrder) -+ iMaxOrder = iOrder; - -- /* and add this new setting */ -- m_settings[strKey] = setting; -+ /* and add this new setting */ -+ m_settings[strKey] = setting; -+ } - - currentNode = currentNode->NextSiblingElement("setting"); - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch deleted file mode 100644 index 73e25bd3af7..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.01-ffmpeg-10.2-28b186f.patch +++ /dev/null @@ -1,3198 +0,0 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-06-05 15:19:23.820493772 +0200 -@@ -2024,7 +2024,7 @@ - --disable-amd3dnow \ - --disable-armv5te \ - --disable-armv6t2 \ -- --disable-static \ -+ --enable-static \ - `if test "$use_debug" = "no"; then echo --disable-debug; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ -@@ -2038,7 +2038,6 @@ - --disable-ffplay \ - --disable-ffserver \ - --disable-ffmpeg \ -- --enable-shared \ - --disable-doc \ - --disable-decoder=mpeg_xvmc \ - --enable-postproc \ -@@ -2046,6 +2045,7 @@ - --enable-protocol=http \ - --enable-pthreads \ - --enable-runtime-cpudetect \ -+ --disable-openmp \ - --cc="$CC" && - sed -ie "s#YASM=yasm#YASM=${prefix}/bin/yasm#" config.mak && - sed -ie "s#YASMDEP=yasm#YASMDEP=${prefix}/bin/yasm#" config.mak && -diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h ---- xbmc-11.0.1/lib/DllAvCodec.h 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCodec.h 2012-06-05 15:19:23.822493812 +0200 -@@ -24,7 +24,7 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" -+#include "DllAvUtil.h" - #include "utils/log.h" - - extern "C" { -@@ -76,28 +76,6 @@ - #endif - } - --/* Some convenience macros introduced at this particular revision of libavcodec. -- */ --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,25,0) --#define CH_LAYOUT_5POINT0_BACK (CH_LAYOUT_SURROUND|CH_BACK_LEFT|CH_BACK_RIGHT) --#define CH_LAYOUT_5POINT1_BACK (CH_LAYOUT_5POINT0_BACK|CH_LOW_FREQUENCY) --#undef CH_LAYOUT_7POINT1_WIDE --#define CH_LAYOUT_7POINT1_WIDE (CH_LAYOUT_5POINT1_BACK|\ -- CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER) --#endif -- --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,64,0) --// API added on: 2010-03-31 --#define AVMediaType CodecType --#define AVMEDIA_TYPE_UNKNOWN CODEC_TYPE_UNKNOWN --#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO --#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO --#define AVMEDIA_TYPE_DATA CODEC_TYPE_DATA --#define AVMEDIA_TYPE_SUBTITLE CODEC_TYPE_SUBTITLE --#define AVMEDIA_TYPE_ATTACHMENT CODEC_TYPE_ATTACHMENT --#define AVMEDIA_TYPE_NB CODEC_TYPE_NB --#endif -- - #include "threads/SingleLock.h" - - class DllAvCodecInterface -@@ -106,20 +84,20 @@ - virtual ~DllAvCodecInterface() {} - virtual void avcodec_register_all(void)=0; - virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0; -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec)=0; -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)=0; - virtual AVCodec *avcodec_find_decoder(enum CodecID id)=0; - virtual AVCodec *avcodec_find_encoder(enum CodecID id)=0; - virtual int avcodec_close_dont_call(AVCodecContext *avctx)=0; - virtual AVFrame *avcodec_alloc_frame(void)=0; - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height)=0; - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)=0; -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt)=0; -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)=0; - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)=0; - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples)=0; - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height)=0; -- virtual AVCodecContext *avcodec_alloc_context(void)=0; -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec)=0; - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)=0; -- virtual void avcodec_get_context_defaults(AVCodecContext *s)=0; -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec)=0; - virtual AVCodecParserContext *av_parser_init(int codec_id)=0; - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, -@@ -137,7 +115,6 @@ - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt)=0; - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)=0; - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)=0; -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count)=0; - virtual AVCodec *av_codec_next(AVCodec *c)=0; - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -151,7 +128,7 @@ - virtual int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct layer - class DllAvCodec : public DllDynamic, DllAvCodecInterface -@@ -166,12 +143,12 @@ - ::avcodec_register_all(); - } - virtual void avcodec_flush_buffers(AVCodecContext *avctx) { ::avcodec_flush_buffers(avctx); } -- virtual int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ virtual int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::avcodec_open(avctx, codec); -+ return ::avcodec_open2(avctx, codec, options); - } -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec) { *(int *)0x0 = 0; return 0; } -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { *(int *)0x0 = 0; return 0; } - virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(int *)0x0 = 0; return 0; } - virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); } - virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); } -@@ -182,33 +159,21 @@ - } - virtual AVFrame *avcodec_alloc_frame() { return ::avcodec_alloc_frame(); } - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height) { return ::avpicture_fill(picture, ptr, pix_fmt, width, height); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,23,0) -- // API added on: 2009-04-07 - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video2(avctx, picture, got_picture_ptr, avpkt); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio3(avctx, samples, frame_size_ptr, avpkt); } -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio4(avctx, frame, got_frame_ptr, avpkt); } - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, avpkt); } --#else -- virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video(avctx, picture, got_picture_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio2(avctx, samples, frame_size_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle(avctx, sub, got_sub_ptr, avpkt->data, avpkt->size); } --#endif - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples) { return ::avcodec_encode_audio(avctx, buf, buf_size, samples); } - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height) { return ::avpicture_get_size(pix_fmt, width, height); } -- virtual AVCodecContext *avcodec_alloc_context() { return ::avcodec_alloc_context(); } -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec) { return ::avcodec_alloc_context3(codec); } - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { ::avcodec_string(buf, buf_size, enc, encode); } -- virtual void avcodec_get_context_defaults(AVCodecContext *s) { ::avcodec_get_context_defaults(s); } -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec) { ::avcodec_get_context_defaults3(s, codec); } - - virtual AVCodecParserContext *av_parser_init(int codec_id) { return ::av_parser_init(codec_id); } - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, - int64_t pts, int64_t dts, int64_t pos) - { --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,21,0) -- // API added on : 2009-03-05 - return ::av_parser_parse2(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts, pos); --#else -- return ::av_parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts); --#endif - } - virtual void av_parser_close(AVCodecParserContext *s) { ::av_parser_close(s); } - -@@ -225,7 +190,6 @@ - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic) { return ::avcodec_default_get_buffer(s, pic); } - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic) { ::avcodec_default_release_buffer(s, pic); } - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) { return ::avcodec_default_get_format(s, fmt); } -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count) { return ::avcodec_thread_init(s, thread_count); } - virtual AVCodec *av_codec_next(AVCodec *c) { return ::av_codec_next(c); } - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -256,12 +220,12 @@ - { - DECLARE_DLL_WRAPPER(DllAvCodec, DLL_PATH_LIBAVCODEC) - DEFINE_FUNC_ALIGNED1(void, __cdecl, avcodec_flush_buffers, AVCodecContext*) -- DEFINE_FUNC_ALIGNED2(int, __cdecl, avcodec_open_dont_call, AVCodecContext*, AVCodec *) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avcodec_open2_dont_call, AVCodecContext*, AVCodec *, AVDictionary **) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_video2, AVCodecContext*, AVFrame*, int*, AVPacket*) -- DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio3, AVCodecContext*, int16_t*, int*, AVPacket*) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio4, AVCodecContext*, AVFrame*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_subtitle2, AVCodecContext*, AVSubtitle*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_encode_audio, AVCodecContext*, uint8_t*, int, const short*) -- DEFINE_FUNC_ALIGNED0(AVCodecContext*, __cdecl, avcodec_alloc_context) -+ DEFINE_FUNC_ALIGNED1(AVCodecContext*, __cdecl, avcodec_alloc_context3, AVCodec *) - DEFINE_FUNC_ALIGNED1(AVCodecParserContext*, __cdecl, av_parser_init, int) - DEFINE_FUNC_ALIGNED9(int, __cdecl, av_parser_parse2, AVCodecParserContext*,AVCodecContext*, uint8_t**, int*, const uint8_t*, int, int64_t, int64_t, int64_t) - DEFINE_METHOD1(int, av_dup_packet, (AVPacket *p1)) -@@ -278,7 +242,7 @@ - DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5)) - DEFINE_METHOD3(int, avpicture_get_size, (PixelFormat p1, int p2, int p3)) - DEFINE_METHOD4(void, avcodec_string, (char *p1, int p2, AVCodecContext *p3, int p4)) -- DEFINE_METHOD1(void, avcodec_get_context_defaults, (AVCodecContext *p1)) -+ DEFINE_METHOD2(void, avcodec_get_context_defaults3, (AVCodecContext *p1, AVCodec *p2)) - DEFINE_METHOD1(void, av_parser_close, (AVCodecParserContext *p1)) - DEFINE_METHOD1(void, avpicture_free, (AVPicture *p1)) - DEFINE_METHOD1(AVBitStreamFilterContext*, av_bitstream_filter_init, (const char *p1)) -@@ -290,7 +254,6 @@ - DEFINE_METHOD2(void, avcodec_default_release_buffer, (AVCodecContext *p1, AVFrame *p2)) - DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2)) - -- DEFINE_METHOD2(int, avcodec_thread_init, (AVCodecContext *p1, int p2)) - DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1)) - DEFINE_METHOD6(AVAudioConvert*, av_audio_convert_alloc, (enum AVSampleFormat p1, int p2, - enum AVSampleFormat p3, int p4, -@@ -301,7 +264,7 @@ - const void * const p4[6], const int p5[6], int p6)) - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(avcodec_flush_buffers) -- RESOLVE_METHOD_RENAME(avcodec_open,avcodec_open_dont_call) -+ RESOLVE_METHOD_RENAME(avcodec_open2,avcodec_open2_dont_call) - RESOLVE_METHOD_RENAME(avcodec_close,avcodec_close_dont_call) - RESOLVE_METHOD(avcodec_find_decoder) - RESOLVE_METHOD(avcodec_find_encoder) -@@ -309,13 +272,13 @@ - RESOLVE_METHOD_RENAME(avcodec_register_all, avcodec_register_all_dont_call) - RESOLVE_METHOD(avpicture_fill) - RESOLVE_METHOD(avcodec_decode_video2) -- RESOLVE_METHOD(avcodec_decode_audio3) -+ RESOLVE_METHOD(avcodec_decode_audio4) - RESOLVE_METHOD(avcodec_decode_subtitle2) - RESOLVE_METHOD(avcodec_encode_audio) - RESOLVE_METHOD(avpicture_get_size) -- RESOLVE_METHOD(avcodec_alloc_context) -+ RESOLVE_METHOD(avcodec_alloc_context3) - RESOLVE_METHOD(avcodec_string) -- RESOLVE_METHOD(avcodec_get_context_defaults) -+ RESOLVE_METHOD(avcodec_get_context_defaults3) - RESOLVE_METHOD(av_parser_init) - RESOLVE_METHOD(av_parser_parse2) - RESOLVE_METHOD(av_parser_close) -@@ -328,7 +291,6 @@ - RESOLVE_METHOD(avcodec_default_get_buffer) - RESOLVE_METHOD(avcodec_default_release_buffer) - RESOLVE_METHOD(avcodec_default_get_format) -- RESOLVE_METHOD(avcodec_thread_init) - RESOLVE_METHOD(av_codec_next) - RESOLVE_METHOD(av_audio_convert_alloc) - RESOLVE_METHOD(av_audio_convert_free) -@@ -339,15 +301,15 @@ - END_METHOD_RESOLVE() - - /* dependencies of libavcodec */ -- DllAvCore m_dllAvCore; -+ DllAvUtil m_dllAvUtil; - // DllAvUtil loaded implicitely by m_dllAvCore - - public: - static CCriticalSection m_critSection; -- int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return avcodec_open_dont_call(avctx,codec); -+ return avcodec_open2_dont_call(avctx,codec, options); - } - int avcodec_close(AVCodecContext *avctx) - { -@@ -361,7 +323,7 @@ - } - virtual bool Load() - { -- if (!m_dllAvCore.Load()) -+ if (!m_dllAvUtil.Load()) - return false; - return DllDynamic::Load(); - } -diff -Naur xbmc-11.0.1/lib/DllAvCore.h xbmc-11.0.1.patch/lib/DllAvCore.h ---- xbmc-11.0.1/lib/DllAvCore.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCore.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,182 +0,0 @@ --#pragma once --/* -- * Copyright (C) 2005-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, Inc., 51 Franklin Street, Fifth Floor, -- * Boston, MA 02110-1301, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#if (defined HAVE_CONFIG_H) && (!defined WIN32) -- #include "config.h" --#endif --#include "DynamicDll.h" --#include "DllAvUtil.h" --#include "utils/log.h" -- --extern "C" { --#ifdef USE_EXTERNAL_FFMPEG -- #ifdef HAVE_LIBAVUTIL_SAMPLEFMT_H -- // libavcore was merged to libavutil on 2010-02-15 -- #include -- #include -- #endif -- -- #ifdef HAVE_LIBAVCORE_AVCORE_H -- #include -- #endif -- #ifdef HAVE_LIBAVCORE_SAMPLEFMT_H -- #include -- #endif -- -- /* Needed for old FFmpeg versions as used below */ -- #ifdef HAVE_LIBAVCODEC_AVCODEC_H -- #include -- #else -- #include -- #endif --#else -- #include "libavcore/avcore.h" -- #include "libavcore/samplefmt.h" --#endif --} -- --/* Compatibility for old external FFmpeg versions. */ -- --#ifdef USE_EXTERNAL_FFMPEG -- --#ifndef LIBAVCORE_VERSION_INT --// API added on: 2010-07-21, removed on 2010-02-15 --#define LIBAVCORE_VERSION_INT 0 --#endif -- --#ifndef AV_SAMPLE_FMT_NONE --// API added on: 2010-11-02 --#define AVSampleFormat SampleFormat --#define AV_SAMPLE_FMT_NONE SAMPLE_FMT_NONE --#define AV_SAMPLE_FMT_U8 SAMPLE_FMT_U8 --#define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16 --#define AV_SAMPLE_FMT_S32 SAMPLE_FMT_S32 --#define AV_SAMPLE_FMT_FLT SAMPLE_FMT_FLT --#define AV_SAMPLE_FMT_DBL SAMPLE_FMT_DBL --#endif -- --#ifndef AV_CH_FRONT_LEFT --// API added on: 2010-11-21 --#define AV_CH_FRONT_LEFT CH_FRONT_LEFT --#define AV_CH_FRONT_RIGHT CH_FRONT_RIGHT --#define AV_CH_FRONT_CENTER CH_FRONT_CENTER --#define AV_CH_LOW_FREQUENCY CH_LOW_FREQUENCY --#define AV_CH_BACK_LEFT CH_BACK_LEFT --#define AV_CH_BACK_RIGHT CH_BACK_RIGHT --#define AV_CH_FRONT_LEFT_OF_CENTER CH_FRONT_LEFT_OF_CENTER --#define AV_CH_FRONT_RIGHT_OF_CENTER CH_FRONT_RIGHT_OF_CENTER --#define AV_CH_BACK_CENTER CH_BACK_CENTER --#define AV_CH_SIDE_LEFT CH_SIDE_LEFT --#define AV_CH_SIDE_RIGHT CH_SIDE_RIGHT --#define AV_CH_TOP_CENTER CH_TOP_CENTER --#define AV_CH_TOP_FRONT_LEFT CH_TOP_FRONT_LEFT --#define AV_CH_TOP_FRONT_CENTER CH_TOP_FRONT_CENTER --#define AV_CH_TOP_FRONT_RIGHT CH_TOP_FRONT_RIGHT --#define AV_CH_TOP_BACK_LEFT CH_TOP_BACK_LEFT --#define AV_CH_TOP_BACK_CENTER CH_TOP_BACK_CENTER --#define AV_CH_TOP_BACK_RIGHT CH_TOP_BACK_RIGHT --#define AV_CH_STEREO_LEFT CH_STEREO_LEFT --#define AV_CH_STEREO_RIGHT CH_STEREO_RIGHT -- --#define AV_CH_LAYOUT_NATIVE CH_LAYOUT_NATIVE -- --#define AV_CH_LAYOUT_MONO CH_LAYOUT_MONO --#define AV_CH_LAYOUT_STEREO CH_LAYOUT_STEREO --#define AV_CH_LAYOUT_2_1 CH_LAYOUT_2_1 --#define AV_CH_LAYOUT_SURROUND CH_LAYOUT_SURROUND --#define AV_CH_LAYOUT_4POINT0 CH_LAYOUT_4POINT0 --#define AV_CH_LAYOUT_2_2 CH_LAYOUT_2_2 --#define AV_CH_LAYOUT_QUAD CH_LAYOUT_QUAD --#define AV_CH_LAYOUT_5POINT0 CH_LAYOUT_5POINT0 --#define AV_CH_LAYOUT_5POINT1 CH_LAYOUT_5POINT1 --#define AV_CH_LAYOUT_5POINT0_BACK CH_LAYOUT_5POINT0_BACK --#define AV_CH_LAYOUT_5POINT1_BACK CH_LAYOUT_5POINT1_BACK --#define AV_CH_LAYOUT_7POINT0 CH_LAYOUT_7POINT0 --#define AV_CH_LAYOUT_7POINT1 CH_LAYOUT_7POINT1 --#define AV_CH_LAYOUT_7POINT1_WIDE CH_LAYOUT_7POINT1_WIDE --#define AV_CH_LAYOUT_STEREO_DOWNMIX CH_LAYOUT_STEREO_DOWNMIX --#endif -- --#endif // USE_EXTERNAL_FFMPEG -- --class DllAvCoreInterface --{ --public: -- virtual ~DllAvCoreInterface() {} -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) = 0; --}; -- --#if (defined USE_EXTERNAL_FFMPEG) -- --// Use direct layer --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ --public: -- virtual ~DllAvCore() {} --#if LIBAVCORE_VERSION_INT >= AV_VERSION_INT(0,12,0) || LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,38,0) -- // API added on: 2010-11-02, moved to libavutil on 2010-02-15 -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_fmt(sample_fmt); } --#else -- // from avcodec.h -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_format(sample_fmt); } --#endif -- -- // DLL faking. -- virtual bool ResolveExports() { return true; } -- virtual bool Load() { --#if LIBAVCORE_VERSION_INT > 0 -- CLog::Log(LOGDEBUG, "DllAvCore: Using libavcore system library"); --#endif -- return true; -- } -- virtual void Unload() {} --}; -- --#else -- --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ -- DECLARE_DLL_WRAPPER(DllAvCore, DLL_PATH_LIBAVCORE) -- -- LOAD_SYMBOLS() -- -- DEFINE_METHOD1(int, av_get_bits_per_sample_fmt, (enum AVSampleFormat p1)) -- -- BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD(av_get_bits_per_sample_fmt) -- END_METHOD_RESOLVE() -- -- /* dependency of libavcore */ -- DllAvUtil m_dllAvUtil; -- --public: -- virtual bool Load() -- { -- if (!m_dllAvUtil.Load()) -- return false; -- return DllDynamic::Load(); -- } --}; -- --#endif -- -diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h ---- xbmc-11.0.1/lib/DllAvFilter.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFilter.h 2012-06-05 15:19:23.835494072 +0200 -@@ -24,8 +24,8 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" - #include "DllAvCodec.h" -+#include "DllSwResample.h" - #include "utils/log.h" - - extern "C" { -@@ -43,24 +43,17 @@ - #if (defined USE_EXTERNAL_FFMPEG) - #if (defined HAVE_LIBAVFILTER_AVFILTER_H) - #include -+ #include -+ #include - #elif (defined HAVE_FFMPEG_AVFILTER_H) - #include -- #endif -- /* for av_vsrc_buffer_add_frame */ -- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) -- #include -- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame); -- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts); -- #else -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts, AVRational pixel_aspect); -+ #include -+ #include - #endif - #else - #include "libavfilter/avfiltergraph.h" -+ #include "libavfilter/buffersink.h" -+ #include "libavfilter/avcodec.h" - #endif - } - -@@ -82,21 +75,16 @@ - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)=0; - virtual int avfilter_poll_frame(AVFilterLink *link)=0; - virtual int avfilter_request_frame(AVFilterLink *link)=0; --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags)=0; --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame)=0; --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts)=0; --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0; - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0; - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)=0; -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags)=0; -+ virtual AVBufferSinkParams *av_buffersink_params_alloc()=0; -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct mapping - class DllAvFilter : public DllDynamic, DllAvFilterInterface - { -@@ -115,12 +103,7 @@ - virtual void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - ::avfilter_graph_free(graph); --#else -- ::avfilter_graph_free(*graph); -- *graph = NULL; --#endif - } - void avfilter_register_all() - { -@@ -133,56 +116,31 @@ - virtual AVFilterInOut *avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return ::avfilter_inout_alloc(); --#else -- return (AVFilterInOut*)::av_mallocz(sizeof(AVFilterInOut)); --#endif - } - virtual void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - ::avfilter_inout_free(inout); --#else -- *inout = NULL; --#endif - } - virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if ( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,79,0) \ -- && LIBAVFILTER_VERSION_INT < AV_VERSION_INT(2,0,0) ) \ -- ||( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0)) - return ::avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, log_ctx); --#else -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return ::avfilter_graph_config(graphctx, log_ctx); --#else -- return ::avfilter_graph_config(graphctx, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); } - virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); } --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, flags); } --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame); } --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts); } --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); } - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); } - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { return ::avfilter_link(src, srcpad, dst, dstpad); } -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags) { return ::av_buffersink_get_buffer_ref(buffer_sink, bufref, flags); } -+ virtual AVBufferSinkParams *av_buffersink_params_alloc() { return ::av_buffersink_params_alloc(); } -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx) { return av_buffersink_poll_frame(ctx); } - // DLL faking. - virtual bool ResolveExports() { return true; } - virtual bool Load() { -@@ -200,45 +158,24 @@ - - DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3)) - DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1)) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph **p1)) --#else -- DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph *p1)) --#endif - DEFINE_METHOD0(void, avfilter_register_all_dont_call) - DEFINE_METHOD6(int, avfilter_graph_create_filter, (AVFilterContext **p1, AVFilter *p2, const char *p3, const char *p4, void *p5, AVFilterGraph *p6)) - DEFINE_METHOD1(AVFilter*, avfilter_get_by_name, (const char *p1)) - DEFINE_METHOD0(AVFilterGraph*, avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - DEFINE_METHOD0(AVFilterInOut*, avfilter_inout_alloc_dont_call) - DEFINE_METHOD1(void, avfilter_inout_free_dont_call, (AVFilterInOut **p1)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut **p3, AVFilterInOut **p4, void *p5)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, void *p5)) --#else -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, AVClass *p5)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, void *p2)) --#else -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, AVClass *p2)) --#endif -+ DEFINE_FUNC_ALIGNED5(int, __cdecl, avfilter_graph_parse_dont_call, AVFilterGraph *, const char *, AVFilterInOut **, AVFilterInOut **, void *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avfilter_graph_config_dont_call, AVFilterGraph *, void *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_poll_frame, AVFilterLink *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_request_frame, AVFilterLink*) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int p3)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- DEFINE_METHOD2(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2)) --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3)) --#else -- DEFINE_METHOD4(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3, AVRational p4)) --#endif - DEFINE_METHOD4(AVFilterBufferRef*, avfilter_get_video_buffer, (AVFilterLink *p1, int p2, int p3, int p4)) - DEFINE_METHOD1(void, avfilter_unref_buffer, (AVFilterBufferRef *p1)) - DEFINE_METHOD4(int, avfilter_link, (AVFilterContext *p1, unsigned p2, AVFilterContext *p3, unsigned p4)) -+ DEFINE_FUNC_ALIGNED3(int , __cdecl, av_buffersink_get_buffer_ref, AVFilterContext *, AVFilterBufferRef **, int); -+ DEFINE_FUNC_ALIGNED0(AVBufferSinkParams*, __cdecl, av_buffersink_params_alloc); -+ DEFINE_FUNC_ALIGNED1(int , __cdecl, av_buffersink_poll_frame, AVFilterContext *); - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call) -@@ -248,10 +185,8 @@ - RESOLVE_METHOD(avfilter_graph_create_filter) - RESOLVE_METHOD(avfilter_get_by_name) - RESOLVE_METHOD(avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - RESOLVE_METHOD_RENAME(avfilter_inout_alloc, avfilter_inout_alloc_dont_call) - RESOLVE_METHOD_RENAME(avfilter_inout_free, avfilter_inout_free_dont_call) --#endif - RESOLVE_METHOD_RENAME(avfilter_graph_parse, avfilter_graph_parse_dont_call) - RESOLVE_METHOD_RENAME(avfilter_graph_config, avfilter_graph_config_dont_call) - RESOLVE_METHOD(avfilter_poll_frame) -@@ -260,10 +195,14 @@ - RESOLVE_METHOD(avfilter_get_video_buffer) - RESOLVE_METHOD(avfilter_unref_buffer) - RESOLVE_METHOD(avfilter_link) -+ RESOLVE_METHOD(av_buffersink_get_buffer_ref) -+ RESOLVE_METHOD(av_buffersink_params_alloc) -+ RESOLVE_METHOD(av_buffersink_poll_frame) - END_METHOD_RESOLVE() - - /* dependencies of libavfilter */ - DllAvUtil m_dllAvUtil; -+ DllSwResample m_dllSwResample; - - public: - int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -279,12 +218,7 @@ - void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - avfilter_graph_free_dont_call(graph); --#else -- avfilter_graph_free_dont_call(*graph); -- m_dllAvUtil.av_freep(graph); --#endif - } - void avfilter_register_all() - { -@@ -294,45 +228,29 @@ - AVFilterInOut* avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return avfilter_inout_alloc_dont_call(); --#else -- return (AVFilterInOut*)m_dllAvUtil.av_mallocz(sizeof(AVFilterInOut)); --#endif - } - int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) - return avfilter_graph_parse_dont_call(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, log_ctx); --#else -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - avfilter_inout_free_dont_call(inout); --#else -- *inout = NULL; --#endif - } - int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return avfilter_graph_config_dont_call(graphctx, log_ctx); --#else -- return avfilter_graph_config_dont_call(graphctx, (AVClass*)log_ctx); --#endif - } - virtual bool Load() - { - if (!m_dllAvUtil.Load()) - return false; -+ if (!m_dllSwResample.Load()) -+ return false; - return DllDynamic::Load(); - } - }; -diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h ---- xbmc-11.0.1/lib/DllAvFormat.h 2012-03-21 23:57:42.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFormat.h 2012-06-05 15:19:23.837494112 +0200 -@@ -62,57 +62,45 @@ - virtual ~DllAvFormatInterface() {} - virtual void av_register_all_dont_call(void)=0; - virtual AVInputFormat *av_find_input_format(const char *short_name)=0; -- virtual int url_feof(ByteIOContext *s)=0; -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)=0; -- virtual void av_close_input_file(AVFormatContext *s)=0; -- virtual void av_close_input_stream(AVFormatContext *s)=0; -+ virtual int url_feof(AVIOContext *s)=0; -+ virtual void avformat_close_input(AVFormatContext **s)=0; - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt)=0; - virtual void av_read_frame_flush(AVFormatContext *s)=0; - virtual int av_read_play(AVFormatContext *s)=0; - virtual int av_read_pause(AVFormatContext *s)=0; - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)=0; --#if (!defined USE_EXTERNAL_FFMPEG) -- virtual int av_find_stream_info_dont_call(AVFormatContext *ic)=0; -+#if (!defined USE_EXTERNAL_FFMPEG) && (!defined TARGET_DARWIN) -+ virtual int avformat_find_stream_info_dont_call(AVFormatContext *ic, AVDictionary **options)=0; - #endif -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap)=0; -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)=0; -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap)=0; -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)=0; -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), - offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)=0; - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)=0; -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -- virtual int url_fdopen(ByteIOContext **s, URLContext *h)=0; -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags)=0; -- virtual int url_fclose(ByteIOContext *s)=0; -- virtual int url_open_dyn_buf(ByteIOContext **s)=0; -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer)=0; -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence)=0; -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual void put_byte(ByteIOContext *s, int b)=0; -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size)=0; -- virtual void put_be24(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be32(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be16(ByteIOContext *s, unsigned int val)=0; -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags)=0; -+ virtual int avio_close(AVIOContext *s)=0; -+ virtual int avio_open_dyn_buf(AVIOContext **s)=0; -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)=0; -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence)=0; -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size)=0; -+ virtual void avio_w8(AVIOContext *s, int b)=0; -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size)=0; -+ virtual void avio_wb24(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb32(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb16(AVIOContext *s, unsigned int val)=0; - virtual AVFormatContext *avformat_alloc_context(void)=0; -- virtual AVStream *av_new_stream(AVFormatContext *s, int id)=0; -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)=0; - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type)=0; -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)=0; -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; -- virtual int av_write_header (AVFormatContext *s)=0; -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options)=0; - virtual int av_write_trailer(AVFormatContext *s)=0; - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt)=0; -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct mapping - class DllAvFormat : public DllDynamic, DllAvFormatInterface -@@ -126,78 +114,45 @@ - } - virtual void av_register_all_dont_call() { *(int* )0x0 = 0; } - virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); } -- virtual int url_feof(ByteIOContext *s) { return ::url_feof(s); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return ::av_metadata_get(m, key, prev, flags); } --#else -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return NULL; } --#endif -- virtual void av_close_input_file(AVFormatContext *s) { ::av_close_input_file(s); } -- virtual void av_close_input_stream(AVFormatContext *s) { ::av_close_input_stream(s); } -+ virtual int url_feof(AVIOContext *s) { return ::url_feof(s); } -+ virtual void avformat_close_input(AVFormatContext **s) { ::avformat_close_input(s); } - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt) { return ::av_read_frame(s, pkt); } - virtual void av_read_frame_flush(AVFormatContext *s) { ::av_read_frame_flush(s); } - virtual int av_read_play(AVFormatContext *s) { return ::av_read_play(s); } - virtual int av_read_pause(AVFormatContext *s) { return ::av_read_pause(s); } - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { return ::av_seek_frame(s, stream_index, timestamp, flags); } -- virtual int av_find_stream_info(AVFormatContext *ic) -+ virtual int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::av_find_stream_info(ic); -+ return ::avformat_find_stream_info(ic, options); - } -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap) { return ::av_open_input_file(ic_ptr, filename, fmt, buf_size, ap); } -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) { ::url_set_interrupt_cb(interrupt_cb); } -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap) { return ::av_open_input_stream(ic_ptr, pb, filename, fmt, ap); } -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options) -+ { return ::avformat_open_input(ps, filename, fmt, options); } -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::init_put_byte(s, buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -+ offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::avio_alloc_context(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {return ::av_probe_input_format(pd, is_opened); } - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) {*score_max = 100; return ::av_probe_input_format(pd, is_opened); } // Use av_probe_input_format, this is not exported by ffmpeg's headers --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,98,0) -- // API added on: 2010-02-08 -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } --#else -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return -1; } --#endif -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::dump_format(ic, index, url, is_output); } -- virtual int url_fdopen(ByteIOContext **s, URLContext *h) { return ::url_fdopen(s, h); } -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags) { return ::url_fopen(s, filename, flags); } -- virtual int url_fclose(ByteIOContext *s) { return ::url_fclose(s); } -- virtual int url_open_dyn_buf(ByteIOContext **s) { return ::url_open_dyn_buf(s); } -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer) { return ::url_close_dyn_buf(s, pbuffer); } -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence) { return ::url_fseek(s, offset, whence); } -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_buffer(s, buf, size); } -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_partial_buffer(s, buf, size); } -- virtual void put_byte(ByteIOContext *s, int b) { ::put_byte(s, b); } -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size) { ::put_buffer(s, buf, size); } -- virtual void put_be24(ByteIOContext *s, unsigned int val) { ::put_be24(s, val); } -- virtual void put_be32(ByteIOContext *s, unsigned int val) { ::put_be32(s, val); } -- virtual void put_be16(ByteIOContext *s, unsigned int val) { ::put_be16(s, val); } -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::av_dump_format(ic, index, url, is_output); } -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags) { return ::avio_open(s, filename, flags); } -+ virtual int avio_close(AVIOContext *s) { return ::avio_close(s); } -+ virtual int avio_open_dyn_buf(AVIOContext **s) { return ::avio_open_dyn_buf(s); } -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { return ::avio_close_dyn_buf(s, pbuffer); } -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence) { return ::avio_seek(s, offset, whence); } -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size) { return ::avio_read(s, buf, size); } -+ virtual void avio_w8(AVIOContext *s, int b) { ::avio_w8(s, b); } -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size) { ::avio_write(s, buf, size); } -+ virtual void avio_wb24(AVIOContext *s, unsigned int val) { ::avio_wb24(s, val); } -+ virtual void avio_wb32(AVIOContext *s, unsigned int val) { ::avio_wb32(s, val); } -+ virtual void avio_wb16(AVIOContext *s, unsigned int val) { ::avio_wb16(s, val); } - virtual AVFormatContext *avformat_alloc_context() { return ::avformat_alloc_context(); } -- virtual AVStream *av_new_stream(AVFormatContext *s, int id) { return ::av_new_stream(s, id); } --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::guess_format(short_name, filename, mime_type); } --#else -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { return ::avformat_new_stream(s, c); } - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::av_guess_format(short_name, filename, mime_type); } --#endif -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) { return ::av_set_parameters(s, ap); } -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::av_alloc_put_byte(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -- virtual int av_write_header (AVFormatContext *s) { return ::av_write_header (s); } -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options) { return ::avformat_write_header (s, options); } - virtual int av_write_trailer(AVFormatContext *s) { return ::av_write_trailer(s); } - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt) { return ::av_write_frame(s, pkt); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,43,0) -- // API added on: 2009-12-13 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set2(pm, key, value, flags); } --#elif LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set(pm, key, value); } --#else -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return -1; } --#endif - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -218,108 +173,78 @@ - - DEFINE_METHOD0(void, av_register_all_dont_call) - DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1)) -- DEFINE_METHOD1(int, url_feof, (ByteIOContext *p1)) -- DEFINE_METHOD4(AVMetadataTag*, av_metadata_get, (AVMetadata *p1, const char *p2, const AVMetadataTag *p3, int p4)) -- DEFINE_METHOD1(void, av_close_input_file, (AVFormatContext *p1)) -- DEFINE_METHOD1(void, av_close_input_stream, (AVFormatContext *p1)) -+ DEFINE_METHOD1(int, url_feof, (AVIOContext *p1)) -+ DEFINE_METHOD1(void, avformat_close_input, (AVFormatContext **p1)) - DEFINE_METHOD1(int, av_read_play, (AVFormatContext *p1)) - DEFINE_METHOD1(int, av_read_pause, (AVFormatContext *p1)) - DEFINE_METHOD1(void, av_read_frame_flush, (AVFormatContext *p1)) - DEFINE_FUNC_ALIGNED2(int, __cdecl, av_read_frame, AVFormatContext *, AVPacket *) - DEFINE_FUNC_ALIGNED4(int, __cdecl, av_seek_frame, AVFormatContext*, int, int64_t, int) -- DEFINE_FUNC_ALIGNED1(int, __cdecl, av_find_stream_info_dont_call, AVFormatContext*) -- DEFINE_FUNC_ALIGNED5(int, __cdecl, av_open_input_file, AVFormatContext**, const char *, AVInputFormat *, int, AVFormatParameters *) -- DEFINE_FUNC_ALIGNED5(int,__cdecl, av_open_input_stream, AVFormatContext **, ByteIOContext *, const char *, AVInputFormat *, AVFormatParameters *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avformat_find_stream_info_dont_call, AVFormatContext*, AVDictionary **) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avformat_open_input, AVFormatContext **, const char *, AVInputFormat *, AVDictionary **) - DEFINE_FUNC_ALIGNED2(AVInputFormat*, __cdecl, av_probe_input_format, AVProbeData*, int) - DEFINE_FUNC_ALIGNED3(AVInputFormat*, __cdecl, av_probe_input_format2, AVProbeData*, int, int*) -- DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, ByteIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_partial_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_byte, ByteIOContext*, int) -- DEFINE_FUNC_ALIGNED3(void, __cdecl, put_buffer, ByteIOContext*, const unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be24, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be32, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be16, ByteIOContext*, unsigned int) -- DEFINE_METHOD1(void, url_set_interrupt_cb, (URLInterruptCB *p1)) -- DEFINE_METHOD8(int, init_put_byte, (ByteIOContext *p1, unsigned char *p2, int p3, int p4, void *p5, -+ DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, AVIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avio_read, AVIOContext*, unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_w8, AVIOContext*, int) -+ DEFINE_FUNC_ALIGNED3(void, __cdecl, avio_write, AVIOContext*, const unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb24, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb32, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb16, AVIOContext*, unsigned int) -+ DEFINE_METHOD7(AVIOContext *, avio_alloc_context, (unsigned char *p1, int p2, int p3, void *p4, -+ int (*p5)(void *opaque, uint8_t *buf, int buf_size), - int (*p6)(void *opaque, uint8_t *buf, int buf_size), -- int (*p7)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*p8)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD4(void, dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -- DEFINE_METHOD2(int, url_fdopen, (ByteIOContext **p1, URLContext *p2)) -- DEFINE_METHOD3(int, url_fopen, (ByteIOContext **p1, const char *p2, int p3)) -- DEFINE_METHOD1(int, url_fclose, (ByteIOContext *p1)) -- DEFINE_METHOD1(int, url_open_dyn_buf, (ByteIOContext **p1)) -- DEFINE_METHOD2(int, url_close_dyn_buf, (ByteIOContext *p1, uint8_t **p2)) -- DEFINE_METHOD3(offset_t, url_fseek, (ByteIOContext *p1, offset_t p2, int p3)) -+ offset_t (*p7)(void *opaque, offset_t offset, int whence))) -+ DEFINE_METHOD4(void, av_dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -+ DEFINE_METHOD3(int, avio_open, (AVIOContext **p1, const char *p2, int p3)) -+ DEFINE_METHOD1(int, avio_close, (AVIOContext *p1)) -+ DEFINE_METHOD1(int, avio_open_dyn_buf, (AVIOContext **p1)) -+ DEFINE_METHOD2(int, avio_close_dyn_buf, (AVIOContext *p1, uint8_t **p2)) -+ DEFINE_METHOD3(offset_t, avio_seek, (AVIOContext *p1, offset_t p2, int p3)) - DEFINE_METHOD0(AVFormatContext *, avformat_alloc_context) -- DEFINE_METHOD2(AVStream *, av_new_stream, (AVFormatContext *p1, int p2)) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- DEFINE_METHOD3(AVOutputFormat *, guess_format, (const char *p1, const char *p2, const char *p3)) --#else -+ DEFINE_METHOD2(AVStream *, avformat_new_stream, (AVFormatContext *p1, AVCodec *p2)) - DEFINE_METHOD3(AVOutputFormat *, av_guess_format, (const char *p1, const char *p2, const char *p3)) --#endif -- DEFINE_METHOD2(int, av_set_parameters, (AVFormatContext *p1, AVFormatParameters *p2)); -- DEFINE_METHOD7(ByteIOContext *, av_alloc_put_byte, (unsigned char *p1, int p2, int p3, void *p4, -- int(*p5)(void *opaque, uint8_t *buf, int buf_size), -- int(*p6)(void *opaque, uint8_t *buf, int buf_size), -- offset_t(*p7)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD1(int, av_write_header , (AVFormatContext *p1)) -+ DEFINE_METHOD2(int, avformat_write_header , (AVFormatContext *p1, AVDictionary **p2)) - DEFINE_METHOD1(int, av_write_trailer, (AVFormatContext *p1)) - DEFINE_METHOD2(int, av_write_frame , (AVFormatContext *p1, AVPacket *p2)) -- DEFINE_METHOD4(int, av_metadata_set2, (AVMetadata **p1, const char *p2, const char *p3, int p4)); - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(av_register_all, av_register_all_dont_call) - RESOLVE_METHOD(av_find_input_format) - RESOLVE_METHOD(url_feof) -- RESOLVE_METHOD(av_metadata_get) -- RESOLVE_METHOD(av_close_input_file) -- RESOLVE_METHOD(av_close_input_stream) -+ RESOLVE_METHOD(avformat_close_input) - RESOLVE_METHOD(av_read_frame) - RESOLVE_METHOD(av_read_play) - RESOLVE_METHOD(av_read_pause) -- RESOLVE_METHOD_RENAME(ff_read_frame_flush, av_read_frame_flush) -+ RESOLVE_METHOD(av_read_frame_flush) - RESOLVE_METHOD(av_seek_frame) -- RESOLVE_METHOD_RENAME(av_find_stream_info, av_find_stream_info_dont_call) -- RESOLVE_METHOD(av_open_input_file) -- RESOLVE_METHOD(url_set_interrupt_cb) -- RESOLVE_METHOD(av_open_input_stream) -- RESOLVE_METHOD(init_put_byte) -+ RESOLVE_METHOD_RENAME(avformat_find_stream_info, avformat_find_stream_info_dont_call) -+ RESOLVE_METHOD(avformat_open_input) -+ RESOLVE_METHOD(avio_alloc_context) - RESOLVE_METHOD(av_probe_input_format) - RESOLVE_METHOD(av_probe_input_format2) - RESOLVE_METHOD(av_probe_input_buffer) -- RESOLVE_METHOD(dump_format) -- RESOLVE_METHOD(url_fdopen) -- RESOLVE_METHOD(url_fopen) -- RESOLVE_METHOD(url_fclose) -- RESOLVE_METHOD(url_open_dyn_buf) -- RESOLVE_METHOD(url_close_dyn_buf) -- RESOLVE_METHOD(url_fseek) -- RESOLVE_METHOD(get_buffer) -- RESOLVE_METHOD(get_partial_buffer) -- RESOLVE_METHOD(put_byte) -- RESOLVE_METHOD(put_buffer) -- RESOLVE_METHOD(put_be24) -- RESOLVE_METHOD(put_be32) -- RESOLVE_METHOD(put_be16) -+ RESOLVE_METHOD(av_dump_format) -+ RESOLVE_METHOD(avio_open) -+ RESOLVE_METHOD(avio_close) -+ RESOLVE_METHOD(avio_open_dyn_buf) -+ RESOLVE_METHOD(avio_close_dyn_buf) -+ RESOLVE_METHOD(avio_seek) -+ RESOLVE_METHOD(avio_read) -+ RESOLVE_METHOD(avio_w8) -+ RESOLVE_METHOD(avio_write) -+ RESOLVE_METHOD(avio_wb24) -+ RESOLVE_METHOD(avio_wb32) -+ RESOLVE_METHOD(avio_wb16) - RESOLVE_METHOD(avformat_alloc_context) -- RESOLVE_METHOD(av_new_stream) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- RESOLVE_METHOD(guess_format) --#else -+ RESOLVE_METHOD(avformat_new_stream) - RESOLVE_METHOD(av_guess_format) --#endif -- RESOLVE_METHOD(av_set_parameters) -- RESOLVE_METHOD(av_alloc_put_byte) -- RESOLVE_METHOD(av_write_header) -+ RESOLVE_METHOD(avformat_write_header) - RESOLVE_METHOD(av_write_trailer) - RESOLVE_METHOD(av_write_frame) -- RESOLVE_METHOD(av_metadata_set2) - END_METHOD_RESOLVE() - - /* dependencies of libavformat */ - DllAvCodec m_dllAvCodec; -- // DllAvCore loaded implicitely by m_dllAvCodec - // DllAvUtil loaded implicitely by m_dllAvCodec - - public: -@@ -328,10 +253,10 @@ - CSingleLock lock(DllAvCodec::m_critSection); - av_register_all_dont_call(); - } -- int av_find_stream_info(AVFormatContext *ic) -+ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return(av_find_stream_info_dont_call(ic)); -+ return avformat_find_stream_info_dont_call(ic, options); - } - - virtual bool Load() -diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h ---- xbmc-11.0.1/lib/DllAvUtil.h 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvUtil.h 2012-06-05 15:19:23.837494112 +0200 -@@ -65,6 +65,7 @@ - #include "libavutil/opt.h" - #include "libavutil/mem.h" - #include "libavutil/fifo.h" -+ #include "libavutil/samplefmt.h" - #endif - } - -@@ -89,7 +90,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0; - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out)=0; -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; - virtual void av_fifo_free(AVFifoBuffer *f) = 0; - virtual void av_fifo_reset(AVFifoBuffer *f) = 0; -@@ -97,10 +98,13 @@ - virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0; - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0; - virtual char *av_strdup(const char *s)=0; -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) = 0; -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags) = 0; -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)=0; -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -- -+#if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct layer - class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - { -@@ -117,12 +121,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); } - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,7,0) -- // API added on: 2008-12-16 -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return ::av_set_string3(obj, name, val, alloc, o_out); } --#else -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return AVERROR(ENOENT); } --#endif -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } - virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } - virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } -@@ -132,6 +131,12 @@ - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) - { return ::av_fifo_generic_write(f, src, size, func); } - virtual char *av_strdup(const char *s) { return ::av_strdup(s); } -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) -+ { return ::av_get_bytes_per_sample(p1); } -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags){ return ::av_dict_get(m, key, prev, flags); } -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags) { return ::av_dict_set(pm, key, value, flags); } -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) -+ { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); } - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -160,7 +165,7 @@ - DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3)); - DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1)) - DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); -- DEFINE_METHOD5(int, av_set_string3, (void *p1, const char *p2, const char *p3, int p4, const AVOption **p5)); -+ DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); - DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) - DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) - DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) -@@ -168,6 +173,10 @@ - DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int))) - DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int))) - DEFINE_METHOD1(char*, av_strdup, (const char *p1)) -+ DEFINE_METHOD1(int, av_get_bytes_per_sample, (enum AVSampleFormat p1)) -+ DEFINE_METHOD4(AVDictionaryEntry *, av_dict_get, (AVDictionary *p1, const char *p2, const AVDictionaryEntry *p3, int p4)) -+ DEFINE_METHOD4(int, av_dict_set, (AVDictionary **p1, const char *p2, const char *p3, int p4)); -+ DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5)) - - public: - BEGIN_METHOD_RESOLVE() -@@ -181,7 +190,7 @@ - RESOLVE_METHOD(av_rescale_q) - RESOLVE_METHOD(av_crc_get_table) - RESOLVE_METHOD(av_crc) -- RESOLVE_METHOD(av_set_string3) -+ RESOLVE_METHOD(av_opt_set) - RESOLVE_METHOD(av_fifo_alloc) - RESOLVE_METHOD(av_fifo_free) - RESOLVE_METHOD(av_fifo_reset) -@@ -189,6 +198,10 @@ - RESOLVE_METHOD(av_fifo_generic_read) - RESOLVE_METHOD(av_fifo_generic_write) - RESOLVE_METHOD(av_strdup) -+ RESOLVE_METHOD(av_get_bytes_per_sample) -+ RESOLVE_METHOD(av_dict_get) -+ RESOLVE_METHOD(av_dict_set) -+ RESOLVE_METHOD(av_samples_get_buffer_size) - END_METHOD_RESOLVE() - }; - -diff -Naur xbmc-11.0.1/lib/DllPostProc.h xbmc-11.0.1.patch/lib/DllPostProc.h ---- xbmc-11.0.1/lib/DllPostProc.h 2012-03-21 23:57:44.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllPostProc.h 2012-06-05 15:19:23.870494772 +0200 -@@ -87,7 +87,7 @@ - virtual void pp_free_context(pp_context *ppContext)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call directly. - class DllPostProc : public DllDynamic, DllPostProcInterface -diff -Naur xbmc-11.0.1/lib/DllSwResample.h xbmc-11.0.1.patch/lib/DllSwResample.h ---- xbmc-11.0.1/lib/DllSwResample.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwResample.h 2012-06-05 15:19:23.870494772 +0200 -@@ -0,0 +1,87 @@ -+#pragma once -+/* -+ * Copyright (C) 2005-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 -+ * -+ */ -+ -+#if (defined HAVE_CONFIG_H) && (!defined WIN32) -+ #include "config.h" -+#endif -+#include "DynamicDll.h" -+ -+extern "C" { -+#ifndef HAVE_MMX -+#define HAVE_MMX -+#endif -+#ifndef __STDC_CONSTANT_MACROS -+#define __STDC_CONSTANT_MACROS -+#endif -+#ifndef __GNUC__ -+#pragma warning(disable:4244) -+#endif -+#if (defined USE_EXTERNAL_FFMPEG) -+ #include -+#else -+ #include "libswresample/swresample.h" -+#endif -+} -+ -+ -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) -+ -+// Use direct mapping -+class DllSwResample : public DllDynamic -+{ -+public: -+ virtual ~DllSwResample() {} -+ -+ // DLL faking. -+ virtual bool ResolveExports() { return true; } -+ virtual bool Load() { -+ CLog::Log(LOGDEBUG, "DllAvFormat: Using libswresample system library"); -+ return true; -+ } -+ virtual void Unload() {} -+}; -+ -+#else -+ -+class DllSwResample : public DllDynamic -+{ -+ DECLARE_DLL_WRAPPER(DllSwResample, DLL_PATH_LIBSWRESAMPLE) -+ -+ LOAD_SYMBOLS() -+ -+ BEGIN_METHOD_RESOLVE() -+ END_METHOD_RESOLVE() -+ -+ /* dependencies of libavformat */ -+ DllAvUtil m_dllAvUtil; -+ -+public: -+ -+ virtual bool Load() -+ { -+ if (!m_dllAvUtil.Load()) -+ return false; -+ return DllDynamic::Load(); -+ } -+}; -+ -+#endif -diff -Naur xbmc-11.0.1/lib/DllSwScale.h xbmc-11.0.1.patch/lib/DllSwScale.h ---- xbmc-11.0.1/lib/DllSwScale.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwScale.h 2012-06-05 15:19:23.871494792 +0200 -@@ -92,7 +92,7 @@ - virtual void sws_freeContext(struct SwsContext *context)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call into this library directly. - class DllSwScale : public DllDynamic, public DllSwScaleInterface -diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in ---- xbmc-11.0.1/lib/Makefile.in 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/Makefile.in 2012-06-05 15:19:23.880494972 +0200 -@@ -1,21 +1,18 @@ - ARCH=@ARCH@ - -+AR=@AR@ - LD=@LD@ - CC=@CC@ - CXX=@CXX@ --SHELL=@SHELL@ --ifeq ($(findstring osx,$(ARCH)),osx) --ifeq ($(findstring arm,$(ARCH)),arm) --LDFLAGS=-arch armv7 -iphoneos_version_min 4.1 -bundle -undefined dynamic_lookup -read_only_relocs suppress --else --LDFLAGS=-bundle -undefined dynamic_lookup -read_only_relocs suppress --endif --else --LDFLAGS=-shared -fPIC -rdynamic --endif - SYSDIR=@abs_top_srcdir@/system/players/dvdplayer --WRAPPER=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o --WRAPPER_MACH_ALIAS=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias -+ -+AVFORMAT_SO=avformat-53-$(ARCH).so -+AVCODEC_SO=avcodec-53-$(ARCH).so -+AVUTIL_SO=avutil-51-$(ARCH).so -+AVFILTER_SO=avfilter-2-$(ARCH).so -+SWSCALE_SO=swscale-2-$(ARCH).so -+POSTPROC_SO=postproc-52-$(ARCH).so -+SWRESAMPLE_SO=swresample-0-$(ARCH).so - - DIRS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -@@ -24,123 +21,55 @@ - - LIBS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -- LIBS+=avutil-50-$(ARCH).so \ -- avcodec-52-$(ARCH).so \ -- avcore-0-$(ARCH).so \ -- avformat-52-$(ARCH).so \ -- postproc-51-$(ARCH).so \ -- avfilter-1-$(ARCH).so \ -- swscale-0-$(ARCH).so --endif -- --ifneq (,$(findstring powerpc,$(ARCH))) -- ARCH_DIR=ppc --else --ifeq ($(findstring arm,$(ARCH)),arm) -- ARCH_DIR=arm --else -- ARCH_DIR=x86 --endif -+ LIBS+=$(AVUTIL_SO) \ -+ $(AVCODEC_SO) \ -+ $(AVFORMAT_SO) \ -+ $(POSTPROC_SO) \ -+ $(AVFILTER_SO) \ -+ $(SWSCALE_SO) \ -+ $(SWRESAMPLE_SO) - endif - - .PHONY: $(DIRS) codecs - --codecs: $(addprefix $(SYSDIR)/, $(LIBS)); -- -- --ifeq ($(findstring osx,$(ARCH)), osx) --# Add -lbundle1.o for powerpc-osx --ifeq ($(ARCH), powerpc-osx) --BUNDLE1_O = -lbundle1.o --endif -- --$(SYSDIR)/avutil-50-$(ARCH).so: $(WRAPPER) ffmpeg/libavutil/libavutil.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavutil/*.o \ -- ffmpeg/libavutil/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcodec/*.o \ -- ffmpeg/libavcodec/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcore/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavformat/*.o $(BUNDLE1_O) -- --ifeq ($(findstring x86,$(ARCH_DIR)), x86) --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/$(ARCH_DIR)/*.o \ -- ffmpeg/libavfilter/*.o $(BUNDLE1_O) --else # No libavfilter/ppc or libavfilter/arm --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/*.o $(BUNDLE1_O) --endif -+ifneq ($(findstring osx,$(ARCH)), osx) - --ifneq ($(findstring arm,$(ARCH)), arm) --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o \ -- ffmpeg/libswscale/$(ARCH_DIR)/*.o $(BUNDLE1_O) --else # No ARM version of swscale available yet. --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o --endif -- --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libpostproc/*.o $(BUNDLE1_O) -- --ffmpeg/libavutil/libavutil.dylib : ffmpeg; --ffmpeg/libavcodec/libavcodec.dylib : ffmpeg; --ffmpeg/libavcore/libavcore.dylib : ffmpeg; --ffmpeg/libavformat/libavformat.dylib : ffmpeg; --ffmpeg/libavformat/libavfilter.dylib : ffmpeg; --ffmpeg/libswscale/libswscale.dylib : ffmpeg; --ffmpeg/libpostproc/libpostproc.dylib : ffmpeg; --ffmpeg: -- $(MAKE) -C $@ -- --else -+codecs: $(addprefix $(SYSDIR)/, $(LIBS)); - --$(SYSDIR)/avutil-50-$(ARCH).so: ffmpeg/libavutil/libavutil.so -+$(SYSDIR)/$(AVUTIL_SO): ffmpeg/libavutil/libavutil.so - cp ffmpeg/libavutil/libavutil.so $@ - --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.so -+$(SYSDIR)/$(AVCODEC_SO): ffmpeg/libavcodec/libavcodec.so - cp ffmpeg/libavcodec/libavcodec.so $@ - --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.so -- cp ffmpeg/libavcore/libavcore.so $@ -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.so -+$(SYSDIR)/$(AVFORMAT_SO): ffmpeg/libavformat/libavformat.so - cp ffmpeg/libavformat/libavformat.so $@ - --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.so -+$(SYSDIR)/$(AVFILTER_SO): ffmpeg/libavfilter/libavfilter.so - cp ffmpeg/libavfilter/libavfilter.so $@ - --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.so -+$(SYSDIR)/$(SWSCALE_SO): ffmpeg/libswscale/libswscale.so - cp ffmpeg/libswscale/libswscale.so $@ - --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.so -+$(SYSDIR)/$(POSTPROC_SO): ffmpeg/libpostproc/libpostproc.so - cp ffmpeg/libpostproc/libpostproc.so $@ - -+$(SYSDIR)/$(SWRESAMPLE_SO): ffmpeg/libswresample/libswresample.so -+ cp ffmpeg/libswresample/libswresample.so $@ -+ - ffmpeg/libavutil/libavutil.so : ffmpeg; - ffmpeg/libavcodec/libavcodec.so : ffmpeg; --ffmpeg/libavcore/libavcore.so : ffmpeg; - ffmpeg/libavformat/libavformat.so : ffmpeg; - ffmpeg/libavfilter/libavfilter.so : ffmpeg; - ffmpeg/libswscale/libswscale.so : ffmpeg; - ffmpeg/libpostproc/libpostproc.so : ffmpeg; -+ffmpeg/libswresample/libswresample.so : ffmpeg; -+endif -+ - ffmpeg: - $(MAKE) -C $@ -- -+ifeq ($(findstring osx,$(ARCH)), osx) -+ $(AR) d ffmpeg/libavcodec/libavcodec.a inverse.o - endif - - clean: -diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp 2012-06-05 15:19:23.881494992 +0200 -@@ -59,11 +59,7 @@ - - CStdString filename = URIUtils::GetFileName(strFile); - AVOutputFormat *fmt = NULL; --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fmt = m_dllAvFormat.guess_format(NULL, filename.c_str(), NULL); --#else - fmt = m_dllAvFormat.av_guess_format(NULL, filename.c_str(), NULL); --#endif - if (!fmt) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Unable to guess the output format for the file %s", filename.c_str()); -@@ -82,7 +78,7 @@ - } - - m_Format = m_dllAvFormat.avformat_alloc_context(); -- m_Format->pb = m_dllAvFormat.av_alloc_put_byte(m_BCBuffer, sizeof(m_BCBuffer), URL_RDONLY, this, NULL, MuxerReadPacket, NULL); -+ m_Format->pb = m_dllAvFormat.avio_alloc_context(m_BCBuffer, sizeof(m_BCBuffer), AVIO_FLAG_READ, this, NULL, MuxerReadPacket, NULL); - if (!m_Format->pb) - { - m_dllAvUtil.av_freep(&m_Format); -@@ -93,17 +89,8 @@ - m_Format->oformat = fmt; - m_Format->bit_rate = g_guiSettings.GetInt("audiocds.bitrate") * 1000; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(m_Format, NULL) != 0) -- { -- m_dllAvUtil.av_freep(&m_Format->pb); -- m_dllAvUtil.av_freep(&m_Format); -- CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to set the muxer parameters"); -- return false; -- } -- - /* add a stream to it */ -- m_Stream = m_dllAvFormat.av_new_stream(m_Format, 1); -+ m_Stream = m_dllAvFormat.avformat_new_stream(m_Format, codec); - if (!m_Stream) - { - m_dllAvUtil.av_freep(&m_Format->pb); -@@ -144,7 +131,7 @@ - return false; - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to open the codec"); - m_dllAvUtil.av_freep(&m_Stream); -@@ -179,7 +166,7 @@ - SetTag("encoder" , "XBMC FFmpeg Encoder"); - - /* write the header */ -- if (m_dllAvFormat.av_write_header(m_Format) != 0) -+ if (m_dllAvFormat.avformat_write_header(m_Format, NULL) != 0) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to write the header"); - delete[] m_Buffer; -@@ -194,7 +181,7 @@ - - void CEncoderFFmpeg::SetTag(const CStdString tag, const CStdString value) - { -- m_dllAvFormat.av_metadata_set2(&m_Format->metadata, tag.c_str(), value.c_str(), 0); -+ m_dllAvUtil.av_dict_set(&m_Format->metadata, tag.c_str(), value.c_str(), 0); - } - - int CEncoderFFmpeg::MuxerReadPacket(void *opaque, uint8_t *buf, int buf_size) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-06-05 15:19:23.882495012 +0200 -@@ -29,10 +29,6 @@ - - CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() - { -- m_iBufferSize1 = 0; -- m_pBuffer1 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); -- memset(m_pBuffer1, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -- - m_iBufferSize2 = 0; - m_pBuffer2 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); - memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -@@ -45,11 +41,11 @@ - m_channelMap[0] = PCM_INVALID; - m_channels = 0; - m_layout = 0; -+ m_pFrame1 = NULL; - } - - CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg() - { -- _aligned_free(m_pBuffer1); - _aligned_free(m_pBuffer2); - Dispose(); - } -@@ -59,12 +55,10 @@ - AVCodec* pCodec; - m_bOpenedCodec = false; - -- if (!m_dllAvCore.Load() || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) -+ if (!m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -- m_dllAvCodec.avcodec_get_context_defaults(m_pCodecContext); - - pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); - if (!pCodec) -@@ -73,6 +67,7 @@ - return false; - } - -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = 1; -@@ -97,13 +92,14 @@ - memcpy(m_pCodecContext->extradata, hints.extradata, hints.extrasize); - } - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to open codec"); - Dispose(); - return false; - } - -+ m_pFrame1 = m_dllAvCodec.avcodec_alloc_frame(); - m_bOpenedCodec = true; - m_iSampleFormat = AV_SAMPLE_FMT_NONE; - return true; -@@ -111,6 +107,9 @@ - - void CDVDAudioCodecFFmpeg::Dispose() - { -+ if (m_pFrame1) m_dllAvUtil.av_free(m_pFrame1); -+ m_pFrame1 = NULL; -+ - if (m_pConvert) - { - m_dllAvCodec.av_audio_convert_free(m_pConvert); -@@ -135,7 +134,7 @@ - - int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) - { -- int iBytesUsed; -+ int iBytesUsed, got_frame; - if (!m_pCodecContext) return -1; - - m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ; -@@ -145,10 +144,17 @@ - m_dllAvCodec.av_init_packet(&avpkt); - avpkt.data = pData; - avpkt.size = iSize; -- iBytesUsed = m_dllAvCodec.avcodec_decode_audio3( m_pCodecContext -- , (int16_t*)m_pBuffer1 -- , &m_iBufferSize1 -+ iBytesUsed = m_dllAvCodec.avcodec_decode_audio4( m_pCodecContext -+ , m_pFrame1 -+ , &got_frame - , &avpkt); -+ if (iBytesUsed < 0 || !got_frame) -+ { -+ m_iBufferSize1 = 0; -+ m_iBufferSize2 = 0; -+ return iBytesUsed; -+ } -+ m_iBufferSize1 = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, m_pCodecContext->sample_fmt, 1); - - /* some codecs will attempt to consume more data than what we gave */ - if (iBytesUsed > iSize) -@@ -184,9 +190,9 @@ - return iBytesUsed; - } - -- const void *ibuf[6] = { m_pBuffer1 }; -+ const void *ibuf[6] = { m_pFrame1->data[0] }; - void *obuf[6] = { m_pBuffer2 }; -- int istr[6] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_pCodecContext->sample_fmt)/8 }; -+ int istr[6] = { m_dllAvUtil.av_get_bytes_per_sample(m_pCodecContext->sample_fmt) }; - int ostr[6] = { 2 }; - int len = m_iBufferSize1 / istr[0]; - if(m_dllAvCodec.av_audio_convert(m_pConvert, obuf, ostr, ibuf, istr, len) < 0) -@@ -208,7 +214,7 @@ - { - if(m_iBufferSize1) - { -- *dst = m_pBuffer1; -+ *dst = m_pFrame1->data[0]; - return m_iBufferSize1; - } - if(m_iBufferSize2) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-06-05 15:19:23.882495012 +0200 -@@ -23,7 +23,6 @@ - - #include "DVDAudioCodec.h" - #include "DllAvCodec.h" --#include "DllAvCore.h" - #include "DllAvFormat.h" - #include "DllAvUtil.h" - -@@ -51,7 +50,7 @@ - enum AVSampleFormat m_iSampleFormat; - enum PCMChannels m_channelMap[PCM_MAX_CH + 1]; - -- BYTE *m_pBuffer1; -+ AVFrame* m_pFrame1; - int m_iBufferSize1; - - BYTE *m_pBuffer2; -@@ -64,7 +63,6 @@ - int64_t m_layout; - - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - void BuildChannelMap(); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-06-05 15:19:23.883495032 +0200 -@@ -79,11 +79,7 @@ - /* get the muxer */ - AVOutputFormat *fOut = NULL; - --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fOut = m_dllAvFormat.guess_format(muxerName.c_str(), NULL, NULL); --#else - fOut = m_dllAvFormat.av_guess_format(muxerName.c_str(), NULL, NULL); --#endif - if (!fOut) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to get the FFmpeg %s muxer", muxerName.c_str()); -@@ -103,7 +99,7 @@ - muxer.m_pFormat->oformat = fOut; - - /* allocate a put_byte struct so we can grab the output */ -- muxer.m_pFormat->pb = m_dllAvFormat.av_alloc_put_byte(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), URL_RDONLY, &muxer, NULL, MuxerReadPacket, NULL); -+ muxer.m_pFormat->pb = m_dllAvFormat.avio_alloc_context(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), AVIO_FLAG_READ, &muxer, NULL, MuxerReadPacket, NULL); - if (!muxer.m_pFormat->pb) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate ByteIOContext"); -@@ -112,21 +108,10 @@ - } - - /* this is streamed, no file, and ignore the index */ -- muxer.m_pFormat->pb->is_streamed = 1; -+ muxer.m_pFormat->pb->seekable = 0; - muxer.m_pFormat->flags |= AVFMT_NOFILE | AVFMT_FLAG_IGNIDX; - muxer.m_pFormat->bit_rate = hints.bitrate; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(muxer.m_pFormat, NULL) != 0) -- { -- CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to set the %s muxer parameters", muxerName.c_str()); -- Dispose(); -- return false; -- } -- --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,92,0) -- // API added on: 2011-01-02 -- - /* While this is strictly only needed on big-endian systems, we do it on - * both to avoid as much dead code as possible. - * CoreAudio (at least on the cases we've seen) wants IEC 61937 in -@@ -138,8 +123,7 @@ - #endif - - /* request output of wanted endianness */ -- if (!fOut->priv_class || m_dllAvUtil.av_set_string3(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0, NULL) != 0) --#endif -+ if (!fOut->priv_class || m_dllAvUtil.av_opt_set(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0) != 0) - { - #if defined(WORDS_BIGENDIAN) && !defined(__APPLE__) - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Unable to set big-endian stream mode (FFmpeg too old?), disabling passthrough"); -@@ -149,7 +133,7 @@ - } - - /* add a stream to it */ -- muxer.m_pStream = m_dllAvFormat.av_new_stream(muxer.m_pFormat, 1); -+ muxer.m_pStream = m_dllAvFormat.avformat_new_stream(muxer.m_pFormat, NULL); - if (!muxer.m_pStream) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate AVStream context"); -@@ -159,8 +143,6 @@ - - - /* set the stream's parameters */ -- muxer.m_pStream->stream_copy = 1; -- - m_SampleRate = hints.samplerate; - if(!m_SampleRate && hints.codec == CODEC_ID_AC3) - m_SampleRate = 48000; -@@ -176,7 +158,7 @@ - codec->extradata_size = hints.extrasize; - memcpy(codec->extradata, hints.extradata, hints.extrasize); - -- muxer.m_WroteHeader = m_dllAvFormat.av_write_header(muxer.m_pFormat) == 0; -+ muxer.m_WroteHeader = m_dllAvFormat.avformat_write_header(muxer.m_pFormat, NULL) == 0; - if (!muxer.m_WroteHeader) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthrough::SetupMuxer - Failed to write the frame header"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-06-05 15:19:23.943496230 +0200 -@@ -55,7 +55,7 @@ - bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels *channelMap, unsigned int bitsPerSample, unsigned int sampleRate) - { - Reset(); -- if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCore.Load() || !m_dllAvCodec.Load()) -+ if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -@@ -65,7 +65,7 @@ - return false; - - /* always assume 6 channels, 5.1... m_remap will give us what we want */ -- m_CodecCtx = m_dllAvCodec.avcodec_alloc_context(); -+ m_CodecCtx = m_dllAvCodec.avcodec_alloc_context3(codec); - m_CodecCtx->bit_rate = AC3_ENCODE_BITRATE; - m_CodecCtx->sample_rate = sampleRate; - m_CodecCtx->channels = 6; -@@ -104,7 +104,7 @@ - } - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - m_dllAvUtil.av_freep(&m_CodecCtx); - return false; -@@ -149,7 +149,7 @@ - - if (m_AudioConvert) - m_TmpBuffer2 = new uint8_t[m_NeededFrames * m_CodecCtx->channels * -- m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8]; -+ m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt)]; - - return true; - } -@@ -186,7 +186,7 @@ - void *convInBuf[] = { m_TmpBuffer }; - int convInStr[] = { m_BitsPerSample / 8 }; - void *convOutBuf[] = { m_TmpBuffer2 }; -- int convOutStr[] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8 }; -+ int convOutStr[] = { m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt) }; - if (m_dllAvCodec.av_audio_convert(m_AudioConvert, convOutBuf, convOutStr, - convInBuf, convInStr, m_NeededFrames * m_CodecCtx->channels) < 0) { - CLog::Log(LOGERROR, "CDVDAudioEncoderFFmpeg: Audio conversion failed"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-06-05 15:19:23.944496250 +0200 -@@ -43,7 +43,6 @@ - virtual int GetData(uint8_t **data); - private: - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - AVCodecContext *m_CodecCtx; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-06-05 15:19:23.944496250 +0200 -@@ -49,7 +49,14 @@ - - m_dllAvCodec.avcodec_register_all(); - -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -+ if (!pCodec) -+ { -+ CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -+ return false; -+ } -+ -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; -@@ -100,14 +107,7 @@ - delete[] parse_extra; - } - -- AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -- if (!pCodec) -- { -- CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -- return false; -- } -- -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -134,19 +134,12 @@ - { - for(unsigned i=0;i= (52<<10) - if(sub.rects[i]) - { - m_dllAvUtil.av_free(sub.rects[i]->pict.data[0]); - m_dllAvUtil.av_free(sub.rects[i]->pict.data[1]); - m_dllAvUtil.av_freep(&sub.rects[i]); - } --#else -- if(sub.rects[i].bitmap) -- m_dllAvUtil.av_freep(&sub.rects[i].bitmap); -- if(m_Subtitle.rects[i].rgba_palette) -- m_dllAvUtil.av_freep(&sub.rects[i].rgba_palette); --#endif - } - if(sub.rects) - m_dllAvUtil.av_freep(&sub.rects); -@@ -294,7 +287,6 @@ - overlay->source_width = m_width; - overlay->source_height = m_height; - --#if LIBAVCODEC_VERSION_INT >= (52<<10) - BYTE* s = rect.pict.data[0]; - BYTE* t = overlay->data; - for(int i=0;idata; -- for(int i=0;ilinesize; -- } -- -- memcpy(overlay->palette, rect.rgba_palette, rect.nb_colors*4); -- -- m_dllAvUtil.av_freep(&rect.bitmap); -- m_dllAvUtil.av_freep(&rect.rgba_palette); --#endif - m_SubtitleIndex++; - - return overlay; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-06-05 15:19:23.946496292 +0200 -@@ -123,12 +123,11 @@ - CDVDVideoCodecFFmpeg::CDVDVideoCodecFFmpeg() : CDVDVideoCodec() - { - m_pCodecContext = NULL; -- m_pConvertFrame = NULL; - m_pFrame = NULL; - m_pFilterGraph = NULL; - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; -+ m_pBufferRef = NULL; - - m_iPictureWidth = 0; - m_iPictureHeight = 0; -@@ -163,9 +162,13 @@ - m_dllAvFilter.avfilter_register_all(); - - m_bSoftware = hints.software; -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ -+ m_formats.push_back(PIX_FMT_YUV420P); -+ m_formats.push_back(PIX_FMT_YUVJ420P); -+ m_formats.push_back(PIX_FMT_NONE); /* always add none to get a terminated list in ffmpeg world */ - - pCodec = NULL; -+ m_pCodecContext = NULL; - - if (hints.codec == CODEC_ID_H264) - { -@@ -196,6 +199,7 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); - CVDPAU* vdp = new CVDPAU(); -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->codec_id = hints.codec; - m_pCodecContext->width = hints.width; - m_pCodecContext->height = hints.height; -@@ -207,7 +211,7 @@ - m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set - break; - } -- m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set -+ m_dllAvUtil.av_freep(&m_pCodecContext); - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Failed to get VDPAU device"); - vdp->Release(); - } -@@ -226,21 +230,26 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Using codec: %s",pCodec->long_name ? pCodec->long_name : pCodec->name); - -+ if(m_pCodecContext == NULL) -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); -+ - m_pCodecContext->opaque = (void*)this; - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; - m_pCodecContext->get_format = GetFormat; - m_pCodecContext->codec_tag = hints.codec_tag; -+ /* Only allow slice threading, since frame threading is more -+ * sensitive to changes in frame sizes, and it causes crashes -+ * during HW accell */ -+ m_pCodecContext->thread_type = FF_THREAD_SLICE; - - #if defined(__APPLE__) && defined(__arm__) - // ffmpeg with enabled neon will crash and burn if this is enabled - m_pCodecContext->flags &= CODEC_FLAG_EMU_EDGE; - #else - if (pCodec->id != CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1 --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,69,0) - && pCodec->id != CODEC_ID_VP8 --#endif - ) - m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE; - #endif -@@ -272,16 +281,16 @@ - if (it->m_name == "surfaces") - m_uSurfacesCount = std::atoi(it->m_value.c_str()); - else -- m_dllAvUtil.av_set_string3(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0, NULL); -+ m_dllAvUtil.av_opt_set(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0); - } - - int num_threads = std::min(8 /*MAX_THREADS*/, g_cpuInfo.getCPUCount()); - if( num_threads > 1 && !hints.software && m_pHardware == NULL // thumbnail extraction fails when run threaded - && ( pCodec->id == CODEC_ID_H264 - || pCodec->id == CODEC_ID_MPEG4 )) -- m_dllAvCodec.avcodec_thread_init(m_pCodecContext, num_threads); -+ m_pCodecContext->thread_count = num_threads; - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -290,14 +299,7 @@ - m_pFrame = m_dllAvCodec.avcodec_alloc_frame(); - if (!m_pFrame) return false; - -- if(pCodec->name) -- m_name = CStdString("ff-") + pCodec->name; -- else -- m_name = "ffmpeg"; -- -- if(m_pHardware) -- m_name += "-" + m_pHardware->Name(); -- -+ UpdateName(); - return true; - } - -@@ -306,13 +308,6 @@ - if (m_pFrame) m_dllAvUtil.av_free(m_pFrame); - m_pFrame = NULL; - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- } -- m_pConvertFrame = NULL; -- - if (m_pCodecContext) - { - if (m_pCodecContext->codec) m_dllAvCodec.avcodec_close(m_pCodecContext); -@@ -458,9 +453,6 @@ - return VC_ERROR; - } - -- if (len != iSize && m_pCodecContext->skip_frame != AVDISCARD_NONREF) -- CLog::Log(LOGWARNING, "%s - avcodec_decode_video didn't consume the full packet. size: %d, consumed: %d", __FUNCTION__, iSize, len); -- - if (!iGotPicture) - return VC_BUFFER; - -@@ -478,67 +470,32 @@ - if(m_pCodecContext->codec_id == CODEC_ID_H264) - m_started = true; - -- if(m_pCodecContext->pix_fmt != PIX_FMT_YUV420P -- && m_pCodecContext->pix_fmt != PIX_FMT_YUVJ420P -- && m_pHardware == NULL) -- { -- if (!m_dllSwScale.IsLoaded() && !m_dllSwScale.Load()) -- return VC_ERROR; -- -- if (!m_pConvertFrame) -- { -- // Allocate an AVFrame structure -- m_pConvertFrame = (AVPicture*)m_dllAvUtil.av_mallocz(sizeof(AVPicture)); -- // Due to a bug in swsscale we need to allocate one extra line of data -- if(m_dllAvCodec.avpicture_alloc( m_pConvertFrame -- , PIX_FMT_YUV420P -- , m_pCodecContext->width -- , m_pCodecContext->height+1) < 0) -- { -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- return VC_ERROR; -- } -- } -+ if(m_pHardware == NULL) -+ { -+ bool need_scale = std::find( m_formats.begin() -+ , m_formats.end() -+ , m_pCodecContext->pix_fmt) == m_formats.end(); - -- // convert the picture -- struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, -- m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, -- PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); -+ bool need_reopen = false; -+ if(!m_filters.Equals(m_filters_next)) -+ need_reopen = true; - -- if(context == NULL) -+ if(m_pFilterIn) - { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::Decode - unable to obtain sws context for w:%i, h:%i, pixfmt: %i", m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt); -- return VC_ERROR; -+ if(m_pFilterIn->outputs[0]->format != m_pCodecContext->pix_fmt -+ || m_pFilterIn->outputs[0]->w != m_pCodecContext->width -+ || m_pFilterIn->outputs[0]->h != m_pCodecContext->height) -+ need_reopen = true; - } - -- m_dllSwScale.sws_scale(context -- , m_pFrame->data -- , m_pFrame->linesize -- , 0 -- , m_pCodecContext->height -- , m_pConvertFrame->data -- , m_pConvertFrame->linesize); -- -- m_dllSwScale.sws_freeContext(context); -- } -- else -- { -- // no need to convert, just free any existing convert buffers -- if (m_pConvertFrame) -+ // try to setup new filters -+ if (need_reopen || (need_scale && m_pFilterGraph == NULL)) - { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } -- } -+ m_filters = m_filters_next; - -- // try to setup new filters -- if (!m_filters.Equals(m_filters_next)) -- { -- m_filters = m_filters_next; -- if(FilterOpen(m_filters) < 0) -- FilterClose(); -+ if(FilterOpen(m_filters, need_scale) < 0) -+ FilterClose(); -+ } - } - - int result; -@@ -564,12 +521,6 @@ - if (m_pHardware) - m_pHardware->Reset(); - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } - m_filters = ""; - FilterClose(); - } -@@ -579,10 +530,10 @@ - pDvdVideoPicture->iWidth = m_pCodecContext->width; - pDvdVideoPicture->iHeight = m_pCodecContext->height; - -- if(m_pFilterLink) -+ if(m_pBufferRef) - { -- pDvdVideoPicture->iWidth = m_pFilterLink->cur_buf->video->w; -- pDvdVideoPicture->iHeight = m_pFilterLink->cur_buf->video->h; -+ pDvdVideoPicture->iWidth = m_pBufferRef->video->w; -+ pDvdVideoPicture->iHeight = m_pBufferRef->video->h; - } - - /* crop of 10 pixels if demuxer asked it */ -@@ -598,12 +549,8 @@ - - /* use variable in the frame */ - AVRational pixel_aspect = m_pCodecContext->sample_aspect_ratio; -- if (m_pFilterLink) --#ifdef HAVE_AVFILTERBUFFERREFVIDEOPROPS_SAMPLE_ASPECT_RATIO -- pixel_aspect = m_pFilterLink->cur_buf->video->sample_aspect_ratio; --#else -- pixel_aspect = m_pFilterLink->cur_buf->video->pixel_aspect; --#endif -+ if (m_pBufferRef) -+ pixel_aspect = m_pBufferRef->video->sample_aspect_ratio; - - if (pixel_aspect.num == 0) - aspect_ratio = 0; -@@ -632,8 +579,6 @@ - pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; - pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; - pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; -- if(m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P) -- pDvdVideoPicture->color_range = 1; - - pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location; - pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries; -@@ -677,14 +622,6 @@ - if(!GetPictureCommon(pDvdVideoPicture)) - return false; - -- if(m_pConvertFrame) -- { -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->data[i] = m_pConvertFrame->data[i]; -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->iLineSize[i] = m_pConvertFrame->linesize[i]; -- } -- else - { - for (int i = 0; i < 4; i++) - pDvdVideoPicture->data[i] = m_pFrame->data[i]; -@@ -693,20 +630,38 @@ - } - - pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; -- pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; - pDvdVideoPicture->extended_format = 0; -+ pDvdVideoPicture->color_range = 0; -+ -+ PixelFormat pix_fmt; -+ if(m_pBufferRef) -+ pix_fmt = (PixelFormat)m_pBufferRef->format; -+ else -+ pix_fmt = m_pCodecContext->pix_fmt; -+ -+ switch(pix_fmt) -+ { -+ case PIX_FMT_YUVJ420P: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ pDvdVideoPicture->color_range = 1; -+ break; -+ default: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ break; -+ } - - return true; - } - --int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) -+int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters, bool scale) - { - int result; -+ AVBufferSinkParams *buffersink_params; - - if (m_pFilterGraph) - FilterClose(); - -- if (filters.IsEmpty()) -+ if (filters.IsEmpty() && !scale) - return 0; - - if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) -@@ -715,17 +670,8 @@ - return -1; - } - -- // CrHasher HACK (if an alternative becomes available use it!): In order to display the output -- // produced by a combination of filters we insert "nullsink" as the last filter and we use -- // its input pin as our output pin. -- // -- // input --> .. --> last_filter --> [in] nullsink [null] [in] --> output -- // | | -- // | | -- // +------------------------+ -- // - AVFilter* srcFilter = m_dllAvFilter.avfilter_get_by_name("buffer"); -- AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("nullsink"); // should be last filter in the graph for now -+ AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("buffersink"); // should be last filter in the graph for now - - CStdString args; - -@@ -744,11 +690,19 @@ - return result; - } - -- if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, NULL/*nullsink=>NULL*/, m_pFilterGraph)) < 0) -+ buffersink_params = m_dllAvFilter.av_buffersink_params_alloc(); -+ buffersink_params->pixel_fmts = &m_formats[0]; -+#ifdef FF_API_OLD_VSINK_API -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, (void*)buffersink_params->pixel_fmts, m_pFilterGraph)) < 0) -+#else -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, buffersink_params, m_pFilterGraph)) < 0) -+#endif - { -+ m_dllAvUtil.av_freep(&buffersink_params); - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: out"); - return result; - } -+ m_dllAvUtil.av_freep(&buffersink_params); - - if (!filters.empty()) - { -@@ -794,6 +748,12 @@ - - void CDVDVideoCodecFFmpeg::FilterClose() - { -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ - if (m_pFilterGraph) - { - m_dllAvFilter.avfilter_graph_free(&m_pFilterGraph); -@@ -801,7 +761,6 @@ - // Disposed by above code - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; - } - } - -@@ -809,24 +768,9 @@ - { - int result, frames; - -- m_pFilterLink = m_pFilterOut->inputs[0]; -- - if (frame) - { --#if (defined USE_OLD_AV_VSRC_BUFFER_ADD_FRAME) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); --#else --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame); --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts); --#else -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); --#endif --#endif -- - if (result < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); -@@ -834,7 +778,13 @@ - } - } - -- if ((frames = m_dllAvFilter.avfilter_poll_frame(m_pFilterLink)) < 0) -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ -+ if ((frames = m_dllAvFilter.av_buffersink_poll_frame(m_pFilterOut)) < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); - return VC_ERROR; -@@ -842,19 +792,9 @@ - - if (frames > 0) - { -- if (m_pFilterLink->cur_buf) -- { -- m_dllAvFilter.avfilter_unref_buffer(m_pFilterLink->cur_buf); -- m_pFilterLink->cur_buf = NULL; -- } -- -- if ((result = m_dllAvFilter.avfilter_request_frame(m_pFilterLink)) < 0) -- { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_request_frame"); -- return VC_ERROR; -- } - -- if (!m_pFilterLink->cur_buf) -+ result = m_dllAvFilter.av_buffersink_get_buffer_ref(m_pFilterOut, &m_pBufferRef, 0); -+ if(!m_pBufferRef) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); - return VC_ERROR; -@@ -865,11 +805,11 @@ - else - m_pFrame->repeat_pict = -(frames - 1); - -- m_pFrame->interlaced_frame = m_pFilterLink->cur_buf->video->interlaced; -- m_pFrame->top_field_first = m_pFilterLink->cur_buf->video->top_field_first; -+ m_pFrame->interlaced_frame = m_pBufferRef->video->interlaced; -+ m_pFrame->top_field_first = m_pBufferRef->video->top_field_first; - -- memcpy(m_pFrame->linesize, m_pFilterLink->cur_buf->linesize, 4*sizeof(int)); -- memcpy(m_pFrame->data , m_pFilterLink->cur_buf->data , 4*sizeof(uint8_t*)); -+ memcpy(m_pFrame->linesize, m_pBufferRef->linesize, 4*sizeof(int)); -+ memcpy(m_pFrame->data , m_pBufferRef->data , 4*sizeof(uint8_t*)); - - if(frames > 1) - return VC_PICTURE; - -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-06-05 15:19:23.946496292 +0200 -@@ -68,27 +68,36 @@ - { - SAFE_RELEASE(m_pHardware); - m_pHardware = hardware; -- m_name += "-"; -- m_name += m_pHardware->Name(); -+ UpdateName(); - } - - protected: - static enum PixelFormat GetFormat(struct AVCodecContext * avctx, const PixelFormat * fmt); - -- int FilterOpen(const CStdString& filters); -+ int FilterOpen(const CStdString& filters, bool scale); - void FilterClose(); - int FilterProcess(AVFrame* frame); - -+ void UpdateName() -+ { -+ if(m_pCodecContext->codec->name) -+ m_name = CStdString("ff-") + m_pCodecContext->codec->name; -+ else -+ m_name = "ffmpeg"; -+ -+ if(m_pHardware) -+ m_name += "-" + m_pHardware->Name(); -+ } -+ - AVFrame* m_pFrame; - AVCodecContext* m_pCodecContext; - -- AVPicture* m_pConvertFrame; - CStdString m_filters; - CStdString m_filters_next; - AVFilterGraph* m_pFilterGraph; - AVFilterContext* m_pFilterIn; - AVFilterContext* m_pFilterOut; -- AVFilterLink* m_pFilterLink; -+ AVFilterBufferRef* m_pBufferRef; - - int m_iPictureWidth; - int m_iPictureHeight; -@@ -109,4 +118,5 @@ - int m_iLastKeyframe; - double m_dts; - bool m_started; -+ std::vector m_formats; - }; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-06-05 15:19:23.947496313 +0200 -@@ -525,8 +525,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -537,14 +537,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -590,26 +590,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -706,7 +706,7 @@ - } - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return false; - } -@@ -717,7 +717,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata then write it into avcCData for VDADecoder -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - // CFDataCreate makes a copy of extradata contents - avcCData = CFDataCreate(kCFAllocatorDefault, (const uint8_t*)extradata, extrasize); - // done with the converted extradata, we MUST free using av_free -@@ -948,12 +948,12 @@ - int demuxer_bytes; - uint8_t *demuxer_content; - -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return VC_ERROR; - } - demuxer_bytes = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -@@ -961,7 +961,7 @@ - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -970,14 +970,14 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - - uint8_t *demuxer_content; -- int demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ int demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-06-05 15:19:23.949496352 +0200 -@@ -474,7 +474,7 @@ - { - b |= 0x80; - } -- av_format_ctx->put_byte(pb, b); -+ av_format_ctx->avio_w8(pb, b); - } - - return numBytes; -@@ -482,37 +482,37 @@ - - void quicktime_write_esds(DllAvFormat *av_format_ctx, ByteIOContext *pb, quicktime_esds_t *esds) - { -- av_format_ctx->put_byte(pb, 0); // Version -- av_format_ctx->put_be24(pb, 0); // Flags -+ av_format_ctx->avio_w8(pb, 0); // Version -+ av_format_ctx->avio_wb24(pb, 0); // Flags - - // elementary stream descriptor tag -- av_format_ctx->put_byte(pb, 0x03); -+ av_format_ctx->avio_w8(pb, 0x03); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 3 + 5 + (13 + 5 + esds->decoderConfigLen) + 3, false); - // 3 bytes + 5 bytes for tag -- av_format_ctx->put_be16(pb, esds->esid); -- av_format_ctx->put_byte(pb, esds->stream_priority); -+ av_format_ctx->avio_wb16(pb, esds->esid); -+ av_format_ctx->avio_w8(pb, esds->stream_priority); - - // decoder configuration description tag -- av_format_ctx->put_byte(pb, 0x04); -+ av_format_ctx->avio_w8(pb, 0x04); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 13 + 5 + esds->decoderConfigLen, false); - // 13 bytes + 5 bytes for tag -- av_format_ctx->put_byte(pb, esds->objectTypeId); // objectTypeIndication -- av_format_ctx->put_byte(pb, esds->streamType); // streamType -- av_format_ctx->put_be24(pb, esds->bufferSizeDB); // buffer size -- av_format_ctx->put_be32(pb, esds->maxBitrate); // max bitrate -- av_format_ctx->put_be32(pb, esds->avgBitrate); // average bitrate -+ av_format_ctx->avio_w8(pb, esds->objectTypeId); // objectTypeIndication -+ av_format_ctx->avio_w8(pb, esds->streamType); // streamType -+ av_format_ctx->avio_wb24(pb, esds->bufferSizeDB); // buffer size -+ av_format_ctx->avio_wb32(pb, esds->maxBitrate); // max bitrate -+ av_format_ctx->avio_wb32(pb, esds->avgBitrate); // average bitrate - - // decoder specific description tag -- av_format_ctx->put_byte(pb, 0x05); -+ av_format_ctx->avio_w8(pb, 0x05); - quicktime_write_mp4_descr_length(av_format_ctx, pb, esds->decoderConfigLen, false); -- av_format_ctx->put_buffer(pb, esds->decoderConfig, esds->decoderConfigLen); -+ av_format_ctx->avio_write(pb, esds->decoderConfig, esds->decoderConfigLen); - - // sync layer configuration descriptor tag -- av_format_ctx->put_byte(pb, 0x06); // tag -- av_format_ctx->put_byte(pb, 0x01); // length -- av_format_ctx->put_byte(pb, 0x7F); // no SL -+ av_format_ctx->avio_w8(pb, 0x06); // tag -+ av_format_ctx->avio_w8(pb, 0x01); // length -+ av_format_ctx->avio_w8(pb, 0x7F); // no SL - - /* no IPI_DescrPointer */ - /* no IP_IdentificationDataSet */ -@@ -666,8 +666,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -678,14 +678,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -770,26 +770,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -1086,7 +1086,7 @@ - ByteIOContext *pb; - quicktime_esds_t *esds; - -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - esds = quicktime_set_esds(m_dllAvFormat, extradata, extrasize); -@@ -1095,7 +1095,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the esds atom decoderConfig from extradata -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - free(esds->decoderConfig); - free(esds); - -@@ -1152,7 +1152,7 @@ - // NAL reformating to bitstream format required - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - m_convert_bytestream = true; -@@ -1161,7 +1161,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata getting size into extrasize -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - - // check for interlaced and get number of ref frames - if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames)) -@@ -1301,17 +1301,17 @@ - if (m_convert_bytestream) - { - // convert demuxer packet from bytestream (AnnexB) to bitstream -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - demux_size = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else if (m_convert_3byteTo4byteNALSize) - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -1320,13 +1320,13 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-06-05 15:19:23.950496372 +0200 -@@ -223,7 +223,6 @@ - } - - pic->type = FF_BUFFER_TYPE_USER; -- pic->age = 1; - pic->data[0] = (uint8_t*)wrapper; - pic->data[1] = NULL; - pic->data[2] = NULL; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-06-05 15:19:23.951496392 +0200 -@@ -1197,14 +1197,12 @@ - - if(pic->reference) - { -- pic->age = pA->ip_age[0]; - pA->ip_age[0]= pA->ip_age[1]+1; - pA->ip_age[1]= 1; - pA->b_age++; - } - else - { -- pic->age = pA->b_age; - pA->ip_age[0]++; - pA->ip_age[1]++; - pA->b_age = 1; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-06-05 15:19:23.955496472 +0200 -@@ -160,7 +160,7 @@ - #define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) - #endif - --static int interrupt_cb(void) -+static int interrupt_cb(void* unused) - { - if(g_demuxer && g_demuxer->Aborted()) - return 1; -@@ -178,7 +178,7 @@ - - static int dvd_file_read(void *h, uint8_t* buf, int size) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -192,7 +192,7 @@ - */ - static offset_t dvd_file_seek(void *h, offset_t pos, int whence) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -236,6 +236,7 @@ - m_speed = DVD_PLAYSPEED_NORMAL; - g_demuxer = this; - m_program = UINT_MAX; -+ const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; - - if (!pInput) return false; - -@@ -246,10 +247,6 @@ - - // register codecs - m_dllAvFormat.av_register_all(); -- m_dllAvFormat.url_set_interrupt_cb(interrupt_cb); -- -- // could be used for interupting ffmpeg while opening a file (eg internet streams) -- // url_set_interrupt_cb(NULL); - - m_pInput = pInput; - strFile = m_pInput->GetFileName(); -@@ -284,14 +281,14 @@ - // try mmsh, then mmst - CStdString strFile2; - strFile2.Format("mmsh://%s",strFile.substr(6,strFile.size()-6).c_str()); -- result = m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile2.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL); -+ result = m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile2.c_str(), iformat, NULL); - if (result < 0) - { - strFile = "mmst://"; - strFile += strFile2.Mid(7).c_str(); - } - } -- if (result < 0 && m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL) < 0 ) -+ if (result < 0 && m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0 ) - { - CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str()); - Dispose(); -@@ -301,24 +298,16 @@ - else - { - unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(FFMPEG_FILE_BUFFER_SIZE); -- m_ioContext = m_dllAvFormat.av_alloc_put_byte(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); -+ m_ioContext = m_dllAvFormat.avio_alloc_context(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); - m_ioContext->max_packet_size = m_pInput->GetBlockSize(); - if(m_ioContext->max_packet_size) - m_ioContext->max_packet_size *= FFMPEG_FILE_BUFFER_SIZE / m_ioContext->max_packet_size; - - if(m_pInput->Seek(0, SEEK_POSSIBLE) == 0) -- m_ioContext->is_streamed = 1; -+ m_ioContext->seekable = 0; - - if( iformat == NULL ) - { --#if defined(USE_EXTERNAL_FFMPEG) && LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(52,98,0) -- // API added on: 2011-02-09 -- // Old versions of ffmpeg do not have av_probe_input_format, so we need -- // to always probe using the lower-level functions as well. -- const bool legacyProbing = true; --#else -- const bool legacyProbing = false; --#endif - // let ffmpeg decide which demuxer we have to open - - bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); -@@ -331,7 +320,7 @@ - // want to probe for spdif (DTS or IEC 61937) compressed audio - // specifically, or in case the file is a wav which may contain DTS or - // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. -- if (legacyProbing || trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) -+ if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) - { - AVProbeData pd; - BYTE probe_buffer[FFMPEG_FILE_BUFFER_SIZE + AVPROBE_PADDING_SIZE]; -@@ -341,7 +330,7 @@ - pd.filename = strFile.c_str(); - - // read data using avformat's buffers -- pd.buf_size = m_dllAvFormat.get_buffer(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); -+ pd.buf_size = m_dllAvFormat.avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); - if (pd.buf_size <= 0) - { - CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str()); -@@ -350,10 +339,7 @@ - memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE); - - // restore position again -- m_dllAvFormat.url_fseek(m_ioContext , 0, SEEK_SET); -- -- if (legacyProbing && !trySPDIFonly) -- iformat = m_dllAvFormat.av_probe_input_format(&pd, 1); -+ m_dllAvFormat.avio_seek(m_ioContext , 0, SEEK_SET); - - // the advancedsetting is for allowing the user to force outputting the - // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode -@@ -424,7 +410,10 @@ - - - // open the demuxer -- if (m_dllAvFormat.av_open_input_stream(&m_pFormatContext, m_ioContext, strFile.c_str(), iformat, NULL) < 0) -+ m_pFormatContext = m_dllAvFormat.avformat_alloc_context(); -+ m_pFormatContext->pb = m_ioContext; -+ -+ if (m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0) - { - CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str()); - Dispose(); -@@ -432,8 +421,11 @@ - } - } - -+ // set the interrupt callback, appeared in libavformat 53.15.0 -+ m_pFormatContext->interrupt_callback = int_cb; -+ - // analyse very short to speed up mjpeg playback start -- if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->is_streamed) -+ if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) - m_pFormatContext->max_analyze_duration = 500000; - - // we need to know if this is matroska or avi later -@@ -447,8 +439,8 @@ - m_pFormatContext->max_analyze_duration = 500000; - - -- CLog::Log(LOGDEBUG, "%s - av_find_stream_info starting", __FUNCTION__); -- int iErr = m_dllAvFormat.av_find_stream_info(m_pFormatContext); -+ CLog::Log(LOGDEBUG, "%s - avformat_find_stream_info starting", __FUNCTION__); -+ int iErr = m_dllAvFormat.avformat_find_stream_info(m_pFormatContext, NULL); - if (iErr < 0) - { - CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str()); -@@ -471,7 +463,7 @@ - m_pFormatContext->flags |= AVFMT_FLAG_NONBLOCK; - - // print some extra information -- m_dllAvFormat.dump_format(m_pFormatContext, 0, strFile.c_str(), 0); -+ m_dllAvFormat.av_dump_format(m_pFormatContext, 0, strFile.c_str(), 0); - - UpdateCurrentPTS(); - -@@ -510,20 +502,12 @@ - - if (m_pFormatContext) - { -- if (m_ioContext) -+ if (m_ioContext && m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) - { -- if(m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) -- { -- CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -- m_ioContext = m_pFormatContext->pb; -- } -- m_dllAvFormat.av_close_input_stream(m_pFormatContext); -- if (m_ioContext->buffer) -- m_dllAvUtil.av_free(m_ioContext->buffer); -- m_dllAvUtil.av_free(m_ioContext); -+ CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -+ m_ioContext = m_pFormatContext->pb; - } -- else -- m_dllAvFormat.av_close_input_file(m_pFormatContext); -+ m_dllAvFormat.avformat_close_input(&m_pFormatContext); - } - m_ioContext = NULL; - m_pFormatContext = NULL; -@@ -773,19 +757,12 @@ - { - stream->duration = duration; - duration = m_dllAvUtil.av_rescale_rnd(stream->duration, (int64_t)stream->time_base.num * AV_TIME_BASE, stream->time_base.den, AV_ROUND_NEAR_INF); -- if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE && m_pFormatContext->file_size > 0) -+ if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE) - || (m_pFormatContext->duration != (int64_t)AV_NOPTS_VALUE && duration > m_pFormatContext->duration)) - m_pFormatContext->duration = duration; - } - } - -- // check if stream seem to have grown since start -- if(m_pFormatContext->file_size > 0 && m_pFormatContext->pb) -- { -- if(m_pFormatContext->pb->pos > m_pFormatContext->file_size) -- m_pFormatContext->file_size = m_pFormatContext->pb->pos; -- } -- - pPacket->iStreamId = pkt.stream_index; // XXX just for now - } - m_dllAvCodec.av_free_packet(&pkt); -@@ -923,19 +900,6 @@ - if (!m_pFormatContext) - return 0; - -- /* apperently ffmpeg messes up sometimes, so check for negative value too */ -- if (m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE || m_pFormatContext->duration < 0LL) -- { -- // no duration is available for us -- // try to calculate it -- int iLength = 0; -- if (m_iCurrentPts != DVD_NOPTS_VALUE && m_pFormatContext->file_size > 0 && m_pFormatContext->pb && m_pFormatContext->pb->pos > 0) -- { -- iLength = (int)(((m_iCurrentPts * m_pFormatContext->file_size) / m_pFormatContext->pb->pos) / 1000) & 0xFFFFFFFF; -- } -- return iLength; -- } -- - return (int)(m_pFormatContext->duration / (AV_TIME_BASE / 1000)); - } - -@@ -970,6 +934,12 @@ - - void CDVDDemuxFFmpeg::AddStream(int iId) - { -+ if(iId >= MAX_STREAMS) -+ { -+ CLog::Log(LOGWARNING, "%s - streams id %d exeeds maximum supported", __FUNCTION__, iId); -+ return; -+ } -+ - AVStream* pStream = m_pFormatContext->streams[iId]; - if (pStream) - { -@@ -987,8 +957,8 @@ - st->iBitRate = pStream->codec->bit_rate; - st->iBitsPerSample = pStream->codec->bits_per_coded_sample; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1077,8 +1047,8 @@ - if(pStream->codec) - st->identifier = pStream->codec->sub_id; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1089,7 +1059,7 @@ - { - std::string fileName = "special://temp/fonts/"; - XFILE::CDirectory::Create(fileName); -- AVMetadataTag *nameTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "filename", NULL, 0); -+ AVDictionaryEntry *nameTag = m_dllAvUtil.av_dict_get(pStream->metadata, "filename", NULL, 0); - if (!nameTag) { - CLog::Log(LOGERROR, "%s: TTF attachment has no name", __FUNCTION__); - break; -@@ -1138,7 +1108,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *langTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "language", NULL, 0); -+ AVDictionaryEntry *langTag = m_dllAvUtil.av_dict_get(pStream->metadata, "language", NULL, 0); - if (langTag) - strncpy(m_streams[iId]->language, langTag->value, 3); - #else -@@ -1248,7 +1218,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *titleTag = m_dllAvFormat.av_metadata_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, -+ AVDictionaryEntry *titleTag = m_dllAvUtil.av_dict_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, - "title", NULL, 0); - if (titleTag) - strChapterName = titleTag->value; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-06-05 15:19:23.956496492 +0200 -@@ -128,7 +128,7 @@ - #define MAX_STREAMS 100 - CDemuxStream* m_streams[MAX_STREAMS]; // maximum number of streams that ffmpeg can handle - -- ByteIOContext* m_ioContext; -+ AVIOContext* m_ioContext; - - DllAvFormat m_dllAvFormat; - DllAvCodec m_dllAvCodec; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-06-05 15:19:23.957496512 +0200 -@@ -413,6 +413,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - m_started = false; - } -@@ -420,6 +421,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - - m_pullupCorrection.Flush(); -diff -Naur xbmc-11.0.1/xbmc/DllPaths_generated.h.in xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in ---- xbmc-11.0.1/xbmc/DllPaths_generated.h.in 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in 2012-06-05 15:19:23.957496512 +0200 -@@ -74,13 +74,13 @@ - #define DLL_PATH_LIBMAD "@MAD_SONAME@" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" - - /* cdrip */ - #if defined(_LINUX) && !defined(__APPLE__) -diff -Naur xbmc-11.0.1/xbmc/DllPaths_win32.h xbmc-11.0.1.patch/xbmc/DllPaths_win32.h ---- xbmc-11.0.1/xbmc/DllPaths_win32.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_win32.h 2012-06-05 15:19:23.958496532 +0200 -@@ -58,13 +58,13 @@ - #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" - - /* cdrip */ - #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-331-fix_playpause_problem_ticket_7338-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-402-enable_yasm_in_ffmpeg-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-404-add_lame_check-0.6.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-404-add_lame_check-0.6.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-404-add_lame_check-0.6.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-404-add_lame_check-0.6.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.01-cdrip-PR616.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.01-cdrip-PR616.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.01-cdrip-PR616.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.01-cdrip-PR616.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.02-cdrip-PR718.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.02-cdrip-PR718.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-806.02-cdrip-PR718.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-806.02-cdrip-PR718.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.01-ffmpeg-10.2-28b186f.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.03-ffmpeg_crystalhd_implementation.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.41-avfilter-depends-on-avformat.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.41-avfilter-depends-on-avformat.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-901.41-avfilter-depends-on-avformat.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-901.41-avfilter-depends-on-avformat.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.00-vdpau_reset_pvr_changes.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.00-vdpau_reset_pvr_changes.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.00-vdpau_reset_pvr_changes.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.01-xvba_support_vdpau_rework-c633159.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.02-xvba_support-gcc-4.7.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.02-xvba_support-gcc-4.7.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.02-xvba_support-gcc-4.7.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.02-xvba_support-gcc-4.7.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.03-fix_configure_in_VDPAU_detect.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.11-disable_interop.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.11-disable_interop.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.11-disable_interop.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.11-disable_interop.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-981-toggleButtonState.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-981-toggleButtonState.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-983-fixed-failure-to-broswe-for-smb-shares.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-990-wiimote.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-990-wiimote.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-990-wiimote.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-990-wiimote.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999-crosscompile.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999-crosscompile.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.002-268d6a0-fix_ASIC_hang.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.003-rar-PR1147.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.003-rar-PR1147.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.003-rar-PR1147.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.003-rar-PR1147.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.011-airtunes_reapply_lost_fix.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.011-airtunes_reapply_lost_fix.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.011-airtunes_reapply_lost_fix.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.011-airtunes_reapply_lost_fix.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.012-airtunes_implementation_for_windows_using_libshairplay.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.013-airtunes-add_dmap_metadata_parsing.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.021-libnfs-1.3_support.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.021-libnfs-1.3_support.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.021-libnfs-1.3_support.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.021-libnfs-1.3_support.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.055-search-dialogs-workaround.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.055-search-dialogs-workaround.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.055-search-dialogs-workaround.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.055-search-dialogs-workaround.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.056-remove-broken-scrapers.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.056-remove-broken-scrapers.patch similarity index 100% rename from packages/mediacenter/xbmc/patches/xbmc-11.0.1-999.056-remove-broken-scrapers.patch rename to packages/mediacenter/xbmc/patches/xbmc-11.0.2-999.056-remove-broken-scrapers.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch deleted file mode 100644 index c013e0ae3aa..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-001-add_support_to_specify_GIT_REV-0.1.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur xbmc-9389dc8/configure.in xbmc-9389dc8.patch/configure.in ---- xbmc-9389dc8/configure.in 2011-09-01 17:21:47.000000000 +0200 -+++ xbmc-9389dc8.patch/configure.in 2011-09-01 23:30:40.419399392 +0200 -@@ -428,6 +428,14 @@ - esac - AC_SUBST([ARCH]) - -+AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) -+if test "$HAVE_GIT" = "yes" -a "$GIT_REV" = ""; then -+ GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') -+elif test "$GIT_REV" = ""; then -+ GIT_REV="Unknown" -+fi -+final_message="$final_message\n git Rev.:\t${GIT_REV}" -+ - # platform debug flags - if test "$use_debug" = "yes"; then - final_message="$final_message\n Debugging:\tYes" -@@ -1177,7 +1185,6 @@ - fi - fi - --AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) - - # Checks for header files. - AC_HEADER_DIRENT -@@ -1408,12 +1415,6 @@ - final_message="$final_message\n Avahi:\tNo" - fi - --if test "$HAVE_GIT" = "yes"; then -- GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') --fi --if test "$GIT_REV" = ""; then -- GIT_REV="Unknown" --fi - if test "$host_vendor" = "apple"; then - echo "#define GIT_REV \"$GIT_REV\"" > git_revision.h - else diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch deleted file mode 100644 index 5e76acefe40..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-303-fix_libdvd_xFLAGS-0.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 05:01:20.091837122 +0200 -@@ -6,5 +6,5 @@ - Name: libdvdcss - Description: DVD access and decryption library. - Version: @VERSION@ --Libs: -L${libdir} -ldvdcss --Cflags: -I{includedir} -I${includedir}/@PACKAGE@ -+Libs: -ldvdcss -+Cflags: -I. -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 05:01:20.549828701 +0200 -@@ -56,17 +56,17 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $dvdread_cflags $extracflags $threadcflags -+ echo $dvdread_cflags $extracflags $threadcflags - fi - - if test "$echo_minicflags" = "yes"; then -- echo -I$prefix/include -I$prefix/include/dvdnav $extracflags $threadcflags -+ echo $extracflags $threadcflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir -ldvdnav $dvdread_libs $threadlib -+ echo -ldvdnav $dvdread_libs $threadlib - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L$libdir -ldvdnavmini $threadlib -+ echo -ldvdnavmini $threadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 05:01:20.624827321 +0200 -@@ -76,13 +76,13 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -I@includedir@/libdvdread @THREAD_CFLAGS@ -+ echo @THREAD_CFLAGS@ - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdnav -ldvdread @THREAD_LIBS@ -+ echo -ldvdnav -ldvdread @THREAD_LIBS@ - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L@libdir@ -ldvdnavmini @THREAD_LIBS@ -+ echo -ldvdnavmini @THREAD_LIBS@ - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 05:01:21.042819641 +0200 -@@ -7,5 +7,5 @@ - Description: DVD Navigation mini library - Version: @VERSION@ - --Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 05:01:21.262815601 +0200 -@@ -8,5 +8,5 @@ - Version: @VERSION@ - - Requires.private: dvdread >= 4.1.2 --Cflags: -I${includedir} @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 05:01:21.278815307 +0200 -@@ -72,9 +72,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -+ echo "" - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdread -+ echo -ldvdread - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 05:01:21.278815307 +0200 -@@ -48,9 +48,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $extracflags -+ echo $extracflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir $dvdreadlib -+ echo $dvdreadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 05:01:21.279815289 +0200 -@@ -7,5 +7,5 @@ - Description: Low level DVD access library - Version: @VERSION@ - --Cflags: -I${includedir} --Libs: -L${libdir} -ldvdread -+Cflags: -I. -+Libs: -ldvdread diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch deleted file mode 100644 index fe0ee49cab6..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-311-fix_rsxs_build-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h ---- xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-09-27 15:56:19.000000000 +0200 -+++ xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-10-16 02:13:13.805433847 +0200 -@@ -17,7 +17,7 @@ - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - --#if !_LIBC -+#if 0 - /* This code is written for inclusion in gnu-libc, and uses names in the - namespace reserved for libc. If we're not compiling in libc, define those - names to be the normal ones instead. */ diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch deleted file mode 100644 index 507334d2e2d..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-321-texturepacker-hostflags-and-rework.patch +++ /dev/null @@ -1,199 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-06-19 04:44:55.985036378 +0200 -@@ -385,6 +385,12 @@ - [use_texturepacker=$enableval], - [use_texturepacker=auto]) - -+AC_ARG_WITH([texturepacker-root], -+ [AS_HELP_STRING([--with-texturepacker-root], -+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], -+ [use_texturepacker_root=$withval], -+ [use_texturepacker_root=$prefix]) -+ - AC_ARG_WITH([lirc-device], - [AS_HELP_STRING([--with-lirc-device=file], - [specify the default LIRC device (default is /dev/lircd)])], -@@ -466,8 +472,7 @@ - use_cpu=cortex-a8 - check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] - if test "x$check_sdl_arch" = "xi386"; then -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" -+ use_texturepacker_root="/opt/local" - else - use_texturepacker=no - fi -@@ -484,8 +489,6 @@ - *86-apple-darwin*) - use_joystick=no - use_vtbdecoder=no -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" - ARCH="x86-osx" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") - ;; -@@ -1649,17 +1652,17 @@ - - USE_TEXTUREPACKER_NATIVE=0 - if test "x$use_texturepacker" != "xno"; then -- final_message="$final_message\n TexturePacker:Yes" -- USE_TEXTUREPACKER=1 -- if test "x$use_texturepacker_native" = "xyes"; then -+ if test "x$cross_compiling" = "xyes"; then - USE_TEXTUREPACKER_NATIVE=1 -- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then -- USE_TEXTUREPACKER_NATIVE_ROOT= -- fi -+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" -+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" -+ else -+ USE_TEXTUREPACKER=1 -+ final_message="$final_message\n TexturePacker:Yes" - fi - else -- final_message="$final_message\n TexturePacker:No" - USE_TEXTUREPACKER=0 -+ final_message="$final_message\n TexturePacker:No" - fi - - if test "$use_mid" = "yes"; then -diff -Naur xbmc-pvr-11.0.1/lib/libsquish/Makefile.in xbmc-pvr-11.0.1.patch/lib/libsquish/Makefile.in ---- xbmc-pvr-11.0.1/lib/libsquish/Makefile.in 2012-03-27 17:55:41.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/libsquish/Makefile.in 2012-06-19 02:45:32.926185206 +0200 -@@ -1,6 +1,6 @@ - ARCH=@ARCH@ - --SRCS= \ -+SRCS = \ - alpha.cpp \ - clusterfit.cpp \ - colourblock.cpp \ -@@ -11,27 +11,30 @@ - singlecolourfit.cpp \ - squish.cpp - --CXXFLAGS+=-I. -+LIB = libsquish.a -+NATIVE_LIB = libsquish-native.so -+CLEAN_FILES += $(NATIVE_LIB) -+ -+HOST_CXX ?= g++ -+CXXFLAGS += -I. -+HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif - --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -+$(LIB): $(SRCS) - --all: $(LIB) $(NATIVE_LIB) - # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. - $(NATIVE_LIB): $(SRCS) - ifeq ($(findstring osx,$(ARCH)),osx) -- g++ -m32 -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ -+ $(HOST_CXX) -m32 $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ - else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ --endif -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ - endif - - include ../../Makefile.include -diff -Naur xbmc-pvr-11.0.1/tools/TexturePacker/Makefile.in xbmc-pvr-11.0.1.patch/tools/TexturePacker/Makefile.in ---- xbmc-pvr-11.0.1/tools/TexturePacker/Makefile.in 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/tools/TexturePacker/Makefile.in 2012-06-19 04:47:54.700638167 +0200 -@@ -1,47 +1,52 @@ --DEFINES += -D_LINUX -DUSE_LZO_PACKING -+DEFINES += -D_LINUX -DUSE_LZO_PACKING - ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) --DEFINES += -DHOST_BIGENDIAN -+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 --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 -- --LIBS += -lSDL_image -lSDL -llzo2 -- --SRCS = \ -+SRCS = \ - md5.cpp \ - SDL_anigif.cpp \ - XBTFWriter.cpp \ - XBMCTex.cpp \ - @abs_top_srcdir@/xbmc/guilib/XBTF.cpp - -- --TARGET = TexturePacker --CLEAN_FILES=$(TARGET) -+TARGET = TexturePacker -+CLEAN_FILES = $(TARGET) - - all: $(TARGET) - -+HOST_CXX ?= g++ -+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ -+ -+LIBS += -lSDL_image -lSDL -llzo2 -+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish -+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 -+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native -+ -+CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux -+ -+HOST_CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux \ -+ -I$(HOST_ROOT_PATH)/include -+ -+ifeq ($(findstring osx,@ARCH@),osx) -+CXXFLAGS += -m32 -+HOST_CXXFLAGS += -m32 -+endif -+ - ifeq (@USE_TEXTUREPACKER_NATIVE@,1) - # TexturePacker run native on build system, build it with native tools - $(TARGET): $(SRCS) -- g++ $(DEFINES) $(CXXFLAGS) $(SRCS) $(LIBS) -o $(TARGET) -+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) -+ - clean: - rm -f $(TARGET) - else diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch deleted file mode 100644 index 63b04cb3e03..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-331-fix_playpause_problem_ticket_7338-0.1.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/xbmc/Application.cpp xbmc-10.1-Dharma.patch/xbmc/Application.cpp ---- xbmc-10.1-Dharma/xbmc/Application.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/xbmc/Application.cpp 2011-05-06 01:41:52.853741840 +0200 -@@ -2515,8 +2515,8 @@ - if (!m_pPlayer->IsPaused()) - { // unpaused - set the playspeed back to normal - SetPlaySpeed(1); -+ g_audioManager.Enable(m_pPlayer->IsPaused() && !g_audioContext.IsPassthroughActive()); - } -- g_audioManager.Enable(m_pPlayer->IsPaused() && !g_audioContext.IsPassthroughActive()); - return true; - } - if (!m_pPlayer->IsPaused()) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index b8f5b8afcf8..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -885,6 +885,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # Python -@@ -1547,6 +1550,7 @@ - `if test "$use_arch" != "no"; then echo --arch=$use_arch; fi`\ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - --target-os=$(tolower $(uname -s)) \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch deleted file mode 100644 index a4592191088..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-404-add_lame_check-0.6.patch +++ /dev/null @@ -1,125 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 05:46:35.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:50:02.982401390 +0200 -@@ -72,6 +72,8 @@ - rsxs_disabled="== RSXS disabled. ==" - pulse_not_found="== Could not find libpulse. PulseAudio support disabled. ==" - pulse_disabled="== PulseAudio support manually disabled. ==" -+lame_not_found="== Could not find libmp3lame. LAME support disabled. ==" -+lame_disabled="== LAME support manually disabled. ==" - dvdcss_enabled="== DVDCSS support enabled. ==" - dvdcss_disabled="== DVDCSS support disabled. ==" - hal_not_found="== Could not find hal. HAL support disabled. ==" -@@ -244,6 +246,12 @@ - [use_ffmpeg_libvorbis=$enableval], - [use_ffmpeg_libvorbis=no]) - -+AC_ARG_ENABLE([lame], -+ [AS_HELP_STRING([--enable-lame], -+ [enable lame support (default is yes)])], -+ [use_lame=$enableval], -+ [use_lame=yes]) -+ - AC_ARG_ENABLE([dvdcss], - [AS_HELP_STRING([--enable-dvdcss], - [enable DVDCSS support (default is yes)])], -@@ -758,6 +766,20 @@ - USE_PULSE=0 - fi - -+# LAME -+if test "$use_lame" = "yes"; then -+ AC_CHECK_LIB([mp3lame], [main], -+ AC_DEFINE([HAVE_LIBMP3LAME], [1], [Define to 1 if you have the 'libmp3lame' library (-lmp3lame).]), -+ use_lame=no;AC_MSG_RESULT($lame_not_found)) -+else -+ AC_MSG_RESULT($lame_disabled) -+fi -+if test "$use_lame" = "yes"; then -+ AC_SUBST([HAVE_LIBMP3LAME], 1) -+else -+ AC_SUBST([HAVE_LIBMP3LAME], 0) -+fi -+ - # HAL - if test "$host_vendor" = "apple" ; then - use_hal="no" -@@ -1311,6 +1333,12 @@ - final_message="$final_message\n HAL Support:\tNo" - fi - -+if test "$use_lame" = "yes"; then -+ final_message="$final_message\n LAME:\t\tYes" -+else -+ final_message="$final_message\n LAME:\t\tNo" -+fi -+ - # DVDCSS - if test "$use_dvdcss" = "yes"; then - AC_MSG_NOTICE($dvdcss_enabled) -diff -Naur xbmc-pvr-3513480/configure.in.orig xbmc-pvr-3513480.patch/configure.in.orig -diff -Naur xbmc-pvr-3513480/Makefile.in.orig xbmc-pvr-3513480.patch/Makefile.in.orig -diff -Naur xbmc-pvr-3513480/xbmc/cdrip/CDDARipper.cpp xbmc-pvr-3513480.patch/xbmc/cdrip/CDDARipper.cpp ---- xbmc-pvr-3513480/xbmc/cdrip/CDDARipper.cpp 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/cdrip/CDDARipper.cpp 2011-04-25 05:48:10.487548571 +0200 -@@ -27,7 +27,11 @@ - #include "CDDAReader.h" - #include "utils/StringUtils.h" - #include "Util.h" -+ -+#ifdef HAVE_LIBMP3LAME - #include "EncoderLame.h" -+#endif -+ - #include "EncoderWav.h" - #include "EncoderVorbis.h" - #include "EncoderFFmpeg.h" -@@ -78,9 +82,16 @@ - case CDDARIP_ENCODER_FLAC: - m_pEncoder = new CEncoderFlac(); - break; -- default: -+#ifdef HAVE_LIBMP3LAME -+ case CDDARIP_ENCODER_LAME: - m_pEncoder = new CEncoderLame(); - break; -+#else -+ default: -+ CLog::Log(LOGERROR,"invalid encoder selected"); -+ return false; -+ break; -+#endif - } - - // we have to set the tags before we init the Encoder -diff -Naur xbmc-pvr-3513480/xbmc/cdrip/Makefile.in xbmc-pvr-3513480.patch/xbmc/cdrip/Makefile.in ---- xbmc-pvr-3513480/xbmc/cdrip/Makefile.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/cdrip/Makefile.in 2011-04-25 05:51:13.013064387 +0200 -@@ -3,10 +3,13 @@ - Encoder.cpp \ - EncoderFFmpeg.cpp \ - EncoderFlac.cpp \ -- EncoderLame.cpp \ - EncoderVorbis.cpp \ - EncoderWav.cpp \ - -+ifeq (@HAVE_LIBMP3LAME@,1) -+ SRCS+=EncoderLame.cpp -+endif -+ - LIB=cdrip.a - - include @abs_top_srcdir@/Makefile.include -diff -Naur xbmc-pvr-3513480/xbmc/settings/GUISettings.cpp xbmc-pvr-3513480.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-3513480/xbmc/settings/GUISettings.cpp 2011-04-25 05:47:12.000000000 +0200 -+++ xbmc-pvr-3513480.patch/xbmc/settings/GUISettings.cpp 2011-04-25 05:48:47.956833472 +0200 -@@ -324,7 +324,9 @@ - AddPath(acd,"audiocds.recordingpath",20000,"select writable folder",BUTTON_CONTROL_PATH_INPUT,false,657); - AddString(acd, "audiocds.trackpathformat", 13307, "%A - %B/[%N. ][%A - ]%T", EDIT_CONTROL_INPUT, false, 16016); - map encoders; -+#ifdef HAVE_LIBMP3LAME - encoders.insert(make_pair(34000,CDDARIP_ENCODER_LAME)); -+#endif - encoders.insert(make_pair(34001,CDDARIP_ENCODER_VORBIS)); - encoders.insert(make_pair(34002,CDDARIP_ENCODER_WAV)); - encoders.insert(make_pair(34005,CDDARIP_ENCODER_FLAC)); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch deleted file mode 100644 index 821c1cc7bd5..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -Naur xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -335,11 +335,9 @@ - // at http://docs.python.org/using/cmdline.html#environment-variables - - #if !defined(_WIN32) -- /* PYTHONOPTIMIZE is set off intentionally when using external Python. -- Reason for this is because we cannot be sure what version of Python -- was used to compile the various Python object files (i.e. .pyo, -- .pyc, etc.). */ -- // check if we are running as real xbmc.app or just binary -+ // Required for python to find optimized code (pyo) files -+ setenv("PYTHONOPTIMIZE", "1", 1); -+ // check if we are running as real xbmc.app or just binary - if (!CUtil::GetFrameworksPath(true).IsEmpty()) - { - // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch deleted file mode 100644 index 0427b534f9f..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-452-change_lcd_content-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-pvr-3513480/userdata/LCD.xml xbmc-pvr-3513480.patch/userdata/LCD.xml ---- xbmc-pvr-3513480/userdata/LCD.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/userdata/LCD.xml 2011-04-25 05:27:34.956125133 +0200 -@@ -21,7 +21,7 @@ - Freemem: $INFO[System.FreeMemory] - - -- XBMC running... -+ *** OpenELEC *** - $INFO[System.Time] $INFO[System.Date] - Freemem: $INFO[System.FreeMemory] - $INFO[System.ScreenWidth]x$INFO[System.ScreenHeight] $INFO[System.ScreenMode] diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch deleted file mode 100644 index 5b32c0cce76..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-453-add_openelec.tv_RSS_news-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/userdata/RssFeeds.xml xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml ---- xbmc-10.1-Dharma/userdata/RssFeeds.xml 2011-03-08 02:49:24.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml 2011-06-14 17:07:08.450880123 +0200 -@@ -3,6 +3,7 @@ - - - -+ http://openelec.tv/news?format=feed&type=rss - http://feeds.feedburner.com/xbmc - - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch deleted file mode 100644 index 08889202586..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-454-disable_backslash-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-30a9070/system/keymaps/keyboard.xml xbmc-30a9070.patch/system/keymaps/keyboard.xml ---- xbmc-30a9070/system/keymaps/keyboard.xml 2011-07-28 06:20:13.000000000 +0200 -+++ xbmc-30a9070.patch/system/keymaps/keyboard.xml 2011-07-28 09:39:57.210973380 +0200 -@@ -90,7 +90,7 @@ - Number7 - Number8 - Number9 -- ToggleFullScreen -+ - FirstPage - LastPage - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch deleted file mode 100644 index f4982ec6356..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-457-fix_connection_check-0.1.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/xbmc/FileSystem/FileCurl.cpp xbmc-10.1-Dharma.patch/xbmc/FileSystem/FileCurl.cpp ---- xbmc-10.1-Dharma/xbmc/filesystem/FileCurl.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/xbmc/filesystem/FileCurl.cpp 2011-10-17 19:21:04.180783870 +0200 -@@ -803,9 +803,9 @@ - // Detect whether we are "online" or not! Very simple and dirty! - bool CFileCurl::IsInternet(bool checkDNS /* = true */) - { -- CStdString strURL = "http://www.google.com"; -+ CStdString strURL = "http://www.openelec.tv"; - if (!checkDNS) -- strURL = "http://74.125.19.103"; // www.google.com ip -+ strURL = "http://212.101.13.10"; // www.openelec.tv ip - - bool found = Exists(strURL); - Close(); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch deleted file mode 100644 index 85d635b61b5..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-463-add_remote_devinput-0.1.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/Lircmap.xml xbmc-10.1-Dharma.patch/system/Lircmap.xml ---- xbmc-10.1-Dharma/system/Lircmap.xml 2011-06-18 01:43:43.132101246 +0200 -+++ xbmc-10.1-Dharma.patch/system/Lircmap.xml 2011-06-18 01:44:53.777025290 +0200 -@@ -365,7 +365,6 @@ - - - cx23885_remote -- devinput - KEY_LEFT - KEY_RIGHT - KEY_UP -@@ -452,4 +451,59 @@ - yellow - blue - -+ -+ -+ KEY_LEFT -+ KEY_RIGHT -+ KEY_UP -+ KEY_DOWN -+ -+ KEY_ENTER -+ KEY_DELETE -+ KEY_PROG1 -+ KEY_EXIT -+ KEY_RECORD -+ KEY_PLAY -+ KEY_PAUSE -+ KEY_STOP -+ KEY_FASTFORWARD -+ KEY_REWIND -+ KEY_VOLUMEUP -+ KEY_VOLUMEDOWN -+ KEY_CHANNELUP -+ KEY_CHANNELDOWN -+ KEY_NEXT -+ KEY_PREVIOUS -+ KEY_EPG -+ KEY_SUBTITLE -+ KEY_LANGUAGE -+ KEY_INFO -+ KEY_ZOOM -+ KEY_MUTE -+ KEY_POWER -+ KEY_EJECT -+ KEY_DVD -+ KEY_MENU -+ KEY_VIDEO -+ KEY_AUDIO -+ KEY_CAMERA -+ KEY_TUNER -+ KEY_TEXT -+ KEY_NUMERIC_1 -+ KEY_NUMERIC_2 -+ KEY_NUMERIC_3 -+ KEY_NUMERIC_4 -+ KEY_NUMERIC_5 -+ KEY_NUMERIC_6 -+ KEY_NUMERIC_7 -+ KEY_NUMERIC_8 -+ KEY_NUMERIC_9 -+ KEY_NUMERIC_0 -+ KEY_NUMERIC_STAR -+ KEY_NUMERIC_POUND -+ KEY_RED -+ KEY_GREEN -+ KEY_YELLOW -+ KEY_BLUE -+ - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch deleted file mode 100644 index 830722aabf8..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.01-cdrip-PR616.patch +++ /dev/null @@ -1,144 +0,0 @@ -From ab72a555c5dd8585ac6e101d9f5966e25500867d Mon Sep 17 00:00:00 2001 -From: Giftie -Date: Thu, 5 Jan 2012 19:32:14 -0700 -Subject: [PATCH] Updated auto cd rip modified: - language/English/strings.xml modified: - xbmc/cdrip/CDDARipper.cpp modified: - xbmc/settings/GUISettings.cpp modified: - xbmc/settings/GUISettings.h modified: - xbmc/storage/MediaManager.cpp modified: xbmc/Autorun.cpp - - Author: Giftie - Committer: Giftie ---- - language/English/strings.xml | 5 ++++- - xbmc/Autorun.cpp | 15 ++++++++++++--- - xbmc/settings/GUISettings.cpp | 8 +++++++- - xbmc/settings/GUISettings.h | 5 +++++ - xbmc/storage/MediaManager.cpp | 7 +++++-- - 5 files changed, 33 insertions(+), 7 deletions(-) - -diff --git a/language/English/strings.xml b/language/English/strings.xml -index ca2ac4d..ae22214 100644 ---- a/language/English/strings.xml -+++ b/language/English/strings.xml -@@ -1344,7 +1344,7 @@ - Show EXIF picture information - Use a fullscreen window rather than true fullscreen - Queue songs on selection -- Play audio CDs automatically -+ - Playback - DVDs - Play DVDs automatically -@@ -1355,6 +1355,9 @@ - Security - Input devices - Power saving -+ Rip -+ Audio CD Insert Action -+ Play - - Remove - Games -diff --git a/xbmc/Autorun.cpp b/xbmc/Autorun.cpp -index 846b28d..3cd6f75 100644 ---- a/xbmc/Autorun.cpp -+++ b/xbmc/Autorun.cpp -@@ -43,6 +43,9 @@ - #include "dialogs/GUIDialogYesNo.h" - #include "utils/URIUtils.h" - #include "utils/log.h" -+#ifdef HAS_CDDA_RIPPER -+#include "cdrip/CDDARipper.h" -+#endif - - using namespace std; - using namespace XFILE; -@@ -69,13 +72,19 @@ void CAutorun::ExecuteAutorun(const CStdString& path, bool bypassSettings, bool - - g_application.ResetScreenSaver(); - g_application.WakeUpScreenSaverAndDPMS(); // turn off the screensaver if it's active -- -+#ifdef HAS_CDDA_RIPPER -+ if ( g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_RIP && pInfo->IsAudio(1) && !g_settings.GetCurrentProfile().musicLocked()) -+ { -+ CCDDARipper ripper; -+ ripper.RipCD(); -+ } -+#endif - PlayDisc(path, bypassSettings, startFromBeginning); - } - - bool CAutorun::PlayDisc(const CStdString& path, bool bypassSettings, bool startFromBeginning) - { -- if ( !bypassSettings && !g_guiSettings.GetBool("audiocds.autorun") && !g_guiSettings.GetBool("dvds.autorun")) -+ if ( !bypassSettings && !g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_PLAY && !g_guiSettings.GetBool("dvds.autorun")) - return false; - - int nSize = g_playlistPlayer.GetPlaylist( PLAYLIST_MUSIC ).size(); -@@ -276,7 +285,7 @@ bool CAutorun::RunDisc(IDirectory* pDir, const CStdString& strDrive, int& nAdded - } - } - // then music -- if (!bPlaying && (bypassSettings || g_guiSettings.GetBool("audiocds.autorun")) && bAllowMusic) -+ if (!bPlaying && (bypassSettings || g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_PLAY) && bAllowMusic) - { - for (int i = 0; i < vecItems.Size(); i++) - { -diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp -index 6cce6ac..a0c7bf5 100644 ---- a/xbmc/settings/GUISettings.cpp -+++ b/xbmc/settings/GUISettings.cpp -@@ -318,7 +318,13 @@ void CGUISettings::Initialize() - AddString(scr, "scrobbler.librefmpass", 15219, "", EDIT_CONTROL_MD5_INPUT, false, 15219); - - CSettingsCategory* acd = AddCategory(3, "audiocds", 620); -- AddBool(acd, "audiocds.autorun", 14085, false); -+ map autocd; -+ autocd.insert(make_pair(16018, AUTOCD_NONE)); -+ autocd.insert(make_pair(14098, AUTOCD_PLAY)); -+#ifdef HAS_CDDA_RIPPER -+ autocd.insert(make_pair(14096, AUTOCD_RIP)); -+#endif -+ AddInt(acd,"audiocds.autoaction",14097,AUTOCD_NONE, autocd, SPIN_CONTROL_TEXT); - AddBool(acd, "audiocds.usecddb", 227, true); - AddSeparator(acd, "audiocds.sep1"); - AddPath(acd,"audiocds.recordingpath",20000,"select writable folder",BUTTON_CONTROL_PATH_INPUT,false,657); -diff --git a/xbmc/settings/GUISettings.h b/xbmc/settings/GUISettings.h -index 5501064..8751624 100644 ---- a/xbmc/settings/GUISettings.h -+++ b/xbmc/settings/GUISettings.h -@@ -64,6 +64,11 @@ - #define KARAOKE_COLOR_START 0 - #define KARAOKE_COLOR_END 4 - -+// CDDA Autoaction defines -+#define AUTOCD_NONE 0 -+#define AUTOCD_PLAY 1 -+#define AUTOCD_RIP 2 -+ - // CDDA ripper defines - #define CDDARIP_ENCODER_LAME 0 - #define CDDARIP_ENCODER_VORBIS 1 -diff --git a/xbmc/storage/MediaManager.cpp b/xbmc/storage/MediaManager.cpp -index ced4ad0..316e8c9 100644 ---- a/xbmc/storage/MediaManager.cpp -+++ b/xbmc/storage/MediaManager.cpp -@@ -624,8 +624,11 @@ void CMediaManager::ProcessEvents() - - void CMediaManager::OnStorageAdded(const CStdString &label, const CStdString &path) - { -- if (g_guiSettings.GetBool("audiocds.autorun") || g_guiSettings.GetBool("dvds.autorun")) -- CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_HIGH); -+ if (g_guiSettings.GetInt("audiocds.autoaction") != AUTOCD_NONE || g_guiSettings.GetBool("dvds.autorun")) -+ if ( g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_RIP) -+ CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_LOW); -+ else -+ CJobManager::GetInstance().AddJob(new CAutorunMediaJob(label, path), this, CJob::PRIORITY_HIGH); - else - CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(13021), label, TOAST_DISPLAY_TIME, false); - } --- -1.7.5.4 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch deleted file mode 100644 index f8fd6b6c73c..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-806.02-cdrip-PR718.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -Naur xbmc-pvr-fc63e66/language/English/strings.xml xbmc-pvr-fc63e66.patch/language/English/strings.xml ---- xbmc-pvr-fc63e66/language/English/strings.xml 2012-03-19 21:20:31.531809910 +0100 -+++ xbmc-pvr-fc63e66.patch/language/English/strings.xml 2012-03-19 21:21:56.576430020 +0100 -@@ -1360,6 +1360,7 @@ - Rip - Audio CD Insert Action - Play -+ Eject disc when Audio CD ripping is complete - - Remove - Games -diff -Naur xbmc-pvr-fc63e66/xbmc/cdrip/CDDARipper.cpp xbmc-pvr-fc63e66.patch/xbmc/cdrip/CDDARipper.cpp ---- xbmc-pvr-fc63e66/xbmc/cdrip/CDDARipper.cpp 2012-03-16 22:27:56.000000000 +0100 -+++ xbmc-pvr-fc63e66.patch/xbmc/cdrip/CDDARipper.cpp 2012-03-19 21:21:07.725417655 +0100 -@@ -332,6 +332,11 @@ - } - - CLog::Log(LOGINFO, "Ripped CD succesfull"); -+ if (g_guiSettings.GetBool("audiocds.ejectonrip")) -+ { -+ CLog::Log(LOGINFO, "Ejecting CD"); -+ CIoSupport::EjectTray(); -+ } - return true; - } - -diff -Naur xbmc-pvr-fc63e66/xbmc/settings/GUISettings.cpp xbmc-pvr-fc63e66.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-fc63e66/xbmc/settings/GUISettings.cpp 2012-03-19 21:20:31.533809950 +0100 -+++ xbmc-pvr-fc63e66.patch/xbmc/settings/GUISettings.cpp 2012-03-19 21:21:07.734417841 +0100 -@@ -349,6 +349,7 @@ - AddInt(acd, "audiocds.quality", 622, CDDARIP_QUALITY_CBR, qualities, SPIN_CONTROL_TEXT); - AddInt(acd, "audiocds.bitrate", 623, 192, 128, 32, 320, SPIN_CONTROL_INT_PLUS, MASK_KBPS); - AddInt(acd, "audiocds.compressionlevel", 665, 5, 0, 1, 8, SPIN_CONTROL_INT_PLUS); -+ AddBool(acd, "audiocds.ejectonrip", 14099, false); - - #ifdef HAS_KARAOKE - CSettingsCategory* kar = AddCategory(3, "karaoke", 13327); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable deleted file mode 100644 index d505fdb2d61..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.01-ffmpeg-10.2-28b186f.patch.disable +++ /dev/null @@ -1,3193 +0,0 @@ -diff -Naur xbmc-11.0.1/configure.in xbmc-11.0.1.patch/configure.in ---- xbmc-11.0.1/configure.in 2012-03-21 23:57:58.000000000 +0100 -+++ xbmc-11.0.1.patch/configure.in 2012-06-05 15:19:23.820493772 +0200 -@@ -2024,7 +2024,7 @@ - --disable-amd3dnow \ - --disable-armv5te \ - --disable-armv6t2 \ -- --disable-static \ -+ --enable-static \ - `if test "$use_debug" = "no"; then echo --disable-debug; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ -@@ -2038,7 +2038,6 @@ - --disable-ffplay \ - --disable-ffserver \ - --disable-ffmpeg \ -- --enable-shared \ - --disable-doc \ - --disable-decoder=mpeg_xvmc \ - --enable-postproc \ -@@ -2046,6 +2045,7 @@ - --enable-protocol=http \ - --enable-pthreads \ - --enable-runtime-cpudetect \ -+ --disable-openmp \ - --cc="$CC" && - sed -ie "s#YASM=yasm#YASM=${prefix}/bin/yasm#" config.mak && - sed -ie "s#YASMDEP=yasm#YASMDEP=${prefix}/bin/yasm#" config.mak && -diff -Naur xbmc-11.0.1/lib/DllAvCodec.h xbmc-11.0.1.patch/lib/DllAvCodec.h ---- xbmc-11.0.1/lib/DllAvCodec.h 2012-03-21 23:57:36.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCodec.h 2012-06-05 15:19:23.822493812 +0200 -@@ -24,7 +24,7 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" -+#include "DllAvUtil.h" - #include "utils/log.h" - - extern "C" { -@@ -76,28 +76,6 @@ - #endif - } - --/* Some convenience macros introduced at this particular revision of libavcodec. -- */ --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,25,0) --#define CH_LAYOUT_5POINT0_BACK (CH_LAYOUT_SURROUND|CH_BACK_LEFT|CH_BACK_RIGHT) --#define CH_LAYOUT_5POINT1_BACK (CH_LAYOUT_5POINT0_BACK|CH_LOW_FREQUENCY) --#undef CH_LAYOUT_7POINT1_WIDE --#define CH_LAYOUT_7POINT1_WIDE (CH_LAYOUT_5POINT1_BACK|\ -- CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER) --#endif -- --#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52,64,0) --// API added on: 2010-03-31 --#define AVMediaType CodecType --#define AVMEDIA_TYPE_UNKNOWN CODEC_TYPE_UNKNOWN --#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO --#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO --#define AVMEDIA_TYPE_DATA CODEC_TYPE_DATA --#define AVMEDIA_TYPE_SUBTITLE CODEC_TYPE_SUBTITLE --#define AVMEDIA_TYPE_ATTACHMENT CODEC_TYPE_ATTACHMENT --#define AVMEDIA_TYPE_NB CODEC_TYPE_NB --#endif -- - #include "threads/SingleLock.h" - - class DllAvCodecInterface -@@ -106,20 +84,20 @@ - virtual ~DllAvCodecInterface() {} - virtual void avcodec_register_all(void)=0; - virtual void avcodec_flush_buffers(AVCodecContext *avctx)=0; -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec)=0; -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)=0; - virtual AVCodec *avcodec_find_decoder(enum CodecID id)=0; - virtual AVCodec *avcodec_find_encoder(enum CodecID id)=0; - virtual int avcodec_close_dont_call(AVCodecContext *avctx)=0; - virtual AVFrame *avcodec_alloc_frame(void)=0; - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height)=0; - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt)=0; -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt)=0; -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)=0; - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)=0; - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples)=0; - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height)=0; -- virtual AVCodecContext *avcodec_alloc_context(void)=0; -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec)=0; - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)=0; -- virtual void avcodec_get_context_defaults(AVCodecContext *s)=0; -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec)=0; - virtual AVCodecParserContext *av_parser_init(int codec_id)=0; - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, -@@ -137,7 +115,6 @@ - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt)=0; - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic)=0; - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)=0; -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count)=0; - virtual AVCodec *av_codec_next(AVCodec *c)=0; - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -151,7 +128,7 @@ - virtual int64_t avcodec_guess_channel_layout(int nb_channels, enum CodecID codec_id, const char *fmt_name)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct layer - class DllAvCodec : public DllDynamic, DllAvCodecInterface -@@ -166,12 +143,12 @@ - ::avcodec_register_all(); - } - virtual void avcodec_flush_buffers(AVCodecContext *avctx) { ::avcodec_flush_buffers(avctx); } -- virtual int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ virtual int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::avcodec_open(avctx, codec); -+ return ::avcodec_open2(avctx, codec, options); - } -- virtual int avcodec_open_dont_call(AVCodecContext *avctx, AVCodec *codec) { *(int *)0x0 = 0; return 0; } -+ virtual int avcodec_open2_dont_call(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { *(int *)0x0 = 0; return 0; } - virtual int avcodec_close_dont_call(AVCodecContext *avctx) { *(int *)0x0 = 0; return 0; } - virtual AVCodec *avcodec_find_decoder(enum CodecID id) { return ::avcodec_find_decoder(id); } - virtual AVCodec *avcodec_find_encoder(enum CodecID id) { return ::avcodec_find_encoder(id); } -@@ -182,33 +159,21 @@ - } - virtual AVFrame *avcodec_alloc_frame() { return ::avcodec_alloc_frame(); } - virtual int avpicture_fill(AVPicture *picture, uint8_t *ptr, PixelFormat pix_fmt, int width, int height) { return ::avpicture_fill(picture, ptr, pix_fmt, width, height); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,23,0) -- // API added on: 2009-04-07 - virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video2(avctx, picture, got_picture_ptr, avpkt); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio3(avctx, samples, frame_size_ptr, avpkt); } -+ virtual int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio4(avctx, frame, got_frame_ptr, avpkt); } - virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, avpkt); } --#else -- virtual int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return ::avcodec_decode_video(avctx, picture, got_picture_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return ::avcodec_decode_audio2(avctx, samples, frame_size_ptr, avpkt->data, avpkt->size); } -- virtual int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt) { return ::avcodec_decode_subtitle(avctx, sub, got_sub_ptr, avpkt->data, avpkt->size); } --#endif - virtual int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, const short *samples) { return ::avcodec_encode_audio(avctx, buf, buf_size, samples); } - virtual int avpicture_get_size(PixelFormat pix_fmt, int width, int height) { return ::avpicture_get_size(pix_fmt, width, height); } -- virtual AVCodecContext *avcodec_alloc_context() { return ::avcodec_alloc_context(); } -+ virtual AVCodecContext *avcodec_alloc_context3(AVCodec *codec) { return ::avcodec_alloc_context3(codec); } - virtual void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { ::avcodec_string(buf, buf_size, enc, encode); } -- virtual void avcodec_get_context_defaults(AVCodecContext *s) { ::avcodec_get_context_defaults(s); } -+ virtual void avcodec_get_context_defaults3(AVCodecContext *s, AVCodec *codec) { ::avcodec_get_context_defaults3(s, codec); } - - virtual AVCodecParserContext *av_parser_init(int codec_id) { return ::av_parser_init(codec_id); } - virtual int av_parser_parse2(AVCodecParserContext *s,AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, - const uint8_t *buf, int buf_size, - int64_t pts, int64_t dts, int64_t pos) - { --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,21,0) -- // API added on : 2009-03-05 - return ::av_parser_parse2(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts, pos); --#else -- return ::av_parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts); --#endif - } - virtual void av_parser_close(AVCodecParserContext *s) { ::av_parser_close(s); } - -@@ -225,7 +190,6 @@ - virtual int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic) { return ::avcodec_default_get_buffer(s, pic); } - virtual void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic) { ::avcodec_default_release_buffer(s, pic); } - virtual enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt) { return ::avcodec_default_get_format(s, fmt); } -- virtual int avcodec_thread_init(AVCodecContext *s, int thread_count) { return ::avcodec_thread_init(s, thread_count); } - virtual AVCodec *av_codec_next(AVCodec *c) { return ::av_codec_next(c); } - virtual AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, - enum AVSampleFormat in_fmt , int in_channels, -@@ -256,12 +220,12 @@ - { - DECLARE_DLL_WRAPPER(DllAvCodec, DLL_PATH_LIBAVCODEC) - DEFINE_FUNC_ALIGNED1(void, __cdecl, avcodec_flush_buffers, AVCodecContext*) -- DEFINE_FUNC_ALIGNED2(int, __cdecl, avcodec_open_dont_call, AVCodecContext*, AVCodec *) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avcodec_open2_dont_call, AVCodecContext*, AVCodec *, AVDictionary **) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_video2, AVCodecContext*, AVFrame*, int*, AVPacket*) -- DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio3, AVCodecContext*, int16_t*, int*, AVPacket*) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_audio4, AVCodecContext*, AVFrame*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_decode_subtitle2, AVCodecContext*, AVSubtitle*, int*, AVPacket*) - DEFINE_FUNC_ALIGNED4(int, __cdecl, avcodec_encode_audio, AVCodecContext*, uint8_t*, int, const short*) -- DEFINE_FUNC_ALIGNED0(AVCodecContext*, __cdecl, avcodec_alloc_context) -+ DEFINE_FUNC_ALIGNED1(AVCodecContext*, __cdecl, avcodec_alloc_context3, AVCodec *) - DEFINE_FUNC_ALIGNED1(AVCodecParserContext*, __cdecl, av_parser_init, int) - DEFINE_FUNC_ALIGNED9(int, __cdecl, av_parser_parse2, AVCodecParserContext*,AVCodecContext*, uint8_t**, int*, const uint8_t*, int, int64_t, int64_t, int64_t) - DEFINE_METHOD1(int, av_dup_packet, (AVPacket *p1)) -@@ -278,7 +242,7 @@ - DEFINE_METHOD5(int, avpicture_fill, (AVPicture *p1, uint8_t *p2, PixelFormat p3, int p4, int p5)) - DEFINE_METHOD3(int, avpicture_get_size, (PixelFormat p1, int p2, int p3)) - DEFINE_METHOD4(void, avcodec_string, (char *p1, int p2, AVCodecContext *p3, int p4)) -- DEFINE_METHOD1(void, avcodec_get_context_defaults, (AVCodecContext *p1)) -+ DEFINE_METHOD2(void, avcodec_get_context_defaults3, (AVCodecContext *p1, AVCodec *p2)) - DEFINE_METHOD1(void, av_parser_close, (AVCodecParserContext *p1)) - DEFINE_METHOD1(void, avpicture_free, (AVPicture *p1)) - DEFINE_METHOD1(AVBitStreamFilterContext*, av_bitstream_filter_init, (const char *p1)) -@@ -290,7 +254,6 @@ - DEFINE_METHOD2(void, avcodec_default_release_buffer, (AVCodecContext *p1, AVFrame *p2)) - DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2)) - -- DEFINE_METHOD2(int, avcodec_thread_init, (AVCodecContext *p1, int p2)) - DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1)) - DEFINE_METHOD6(AVAudioConvert*, av_audio_convert_alloc, (enum AVSampleFormat p1, int p2, - enum AVSampleFormat p3, int p4, -@@ -301,7 +264,7 @@ - const void * const p4[6], const int p5[6], int p6)) - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD(avcodec_flush_buffers) -- RESOLVE_METHOD_RENAME(avcodec_open,avcodec_open_dont_call) -+ RESOLVE_METHOD_RENAME(avcodec_open2,avcodec_open2_dont_call) - RESOLVE_METHOD_RENAME(avcodec_close,avcodec_close_dont_call) - RESOLVE_METHOD(avcodec_find_decoder) - RESOLVE_METHOD(avcodec_find_encoder) -@@ -309,13 +272,13 @@ - RESOLVE_METHOD_RENAME(avcodec_register_all, avcodec_register_all_dont_call) - RESOLVE_METHOD(avpicture_fill) - RESOLVE_METHOD(avcodec_decode_video2) -- RESOLVE_METHOD(avcodec_decode_audio3) -+ RESOLVE_METHOD(avcodec_decode_audio4) - RESOLVE_METHOD(avcodec_decode_subtitle2) - RESOLVE_METHOD(avcodec_encode_audio) - RESOLVE_METHOD(avpicture_get_size) -- RESOLVE_METHOD(avcodec_alloc_context) -+ RESOLVE_METHOD(avcodec_alloc_context3) - RESOLVE_METHOD(avcodec_string) -- RESOLVE_METHOD(avcodec_get_context_defaults) -+ RESOLVE_METHOD(avcodec_get_context_defaults3) - RESOLVE_METHOD(av_parser_init) - RESOLVE_METHOD(av_parser_parse2) - RESOLVE_METHOD(av_parser_close) -@@ -328,7 +291,6 @@ - RESOLVE_METHOD(avcodec_default_get_buffer) - RESOLVE_METHOD(avcodec_default_release_buffer) - RESOLVE_METHOD(avcodec_default_get_format) -- RESOLVE_METHOD(avcodec_thread_init) - RESOLVE_METHOD(av_codec_next) - RESOLVE_METHOD(av_audio_convert_alloc) - RESOLVE_METHOD(av_audio_convert_free) -@@ -339,15 +301,15 @@ - END_METHOD_RESOLVE() - - /* dependencies of libavcodec */ -- DllAvCore m_dllAvCore; -+ DllAvUtil m_dllAvUtil; - // DllAvUtil loaded implicitely by m_dllAvCore - - public: - static CCriticalSection m_critSection; -- int avcodec_open(AVCodecContext *avctx, AVCodec *codec) -+ int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return avcodec_open_dont_call(avctx,codec); -+ return avcodec_open2_dont_call(avctx,codec, options); - } - int avcodec_close(AVCodecContext *avctx) - { -@@ -361,7 +323,7 @@ - } - virtual bool Load() - { -- if (!m_dllAvCore.Load()) -+ if (!m_dllAvUtil.Load()) - return false; - return DllDynamic::Load(); - } -diff -Naur xbmc-11.0.1/lib/DllAvCore.h xbmc-11.0.1.patch/lib/DllAvCore.h ---- xbmc-11.0.1/lib/DllAvCore.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvCore.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,182 +0,0 @@ --#pragma once --/* -- * Copyright (C) 2005-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, Inc., 51 Franklin Street, Fifth Floor, -- * Boston, MA 02110-1301, USA. -- * http://www.gnu.org/copyleft/gpl.html -- * -- */ -- --#if (defined HAVE_CONFIG_H) && (!defined WIN32) -- #include "config.h" --#endif --#include "DynamicDll.h" --#include "DllAvUtil.h" --#include "utils/log.h" -- --extern "C" { --#ifdef USE_EXTERNAL_FFMPEG -- #ifdef HAVE_LIBAVUTIL_SAMPLEFMT_H -- // libavcore was merged to libavutil on 2010-02-15 -- #include -- #include -- #endif -- -- #ifdef HAVE_LIBAVCORE_AVCORE_H -- #include -- #endif -- #ifdef HAVE_LIBAVCORE_SAMPLEFMT_H -- #include -- #endif -- -- /* Needed for old FFmpeg versions as used below */ -- #ifdef HAVE_LIBAVCODEC_AVCODEC_H -- #include -- #else -- #include -- #endif --#else -- #include "libavcore/avcore.h" -- #include "libavcore/samplefmt.h" --#endif --} -- --/* Compatibility for old external FFmpeg versions. */ -- --#ifdef USE_EXTERNAL_FFMPEG -- --#ifndef LIBAVCORE_VERSION_INT --// API added on: 2010-07-21, removed on 2010-02-15 --#define LIBAVCORE_VERSION_INT 0 --#endif -- --#ifndef AV_SAMPLE_FMT_NONE --// API added on: 2010-11-02 --#define AVSampleFormat SampleFormat --#define AV_SAMPLE_FMT_NONE SAMPLE_FMT_NONE --#define AV_SAMPLE_FMT_U8 SAMPLE_FMT_U8 --#define AV_SAMPLE_FMT_S16 SAMPLE_FMT_S16 --#define AV_SAMPLE_FMT_S32 SAMPLE_FMT_S32 --#define AV_SAMPLE_FMT_FLT SAMPLE_FMT_FLT --#define AV_SAMPLE_FMT_DBL SAMPLE_FMT_DBL --#endif -- --#ifndef AV_CH_FRONT_LEFT --// API added on: 2010-11-21 --#define AV_CH_FRONT_LEFT CH_FRONT_LEFT --#define AV_CH_FRONT_RIGHT CH_FRONT_RIGHT --#define AV_CH_FRONT_CENTER CH_FRONT_CENTER --#define AV_CH_LOW_FREQUENCY CH_LOW_FREQUENCY --#define AV_CH_BACK_LEFT CH_BACK_LEFT --#define AV_CH_BACK_RIGHT CH_BACK_RIGHT --#define AV_CH_FRONT_LEFT_OF_CENTER CH_FRONT_LEFT_OF_CENTER --#define AV_CH_FRONT_RIGHT_OF_CENTER CH_FRONT_RIGHT_OF_CENTER --#define AV_CH_BACK_CENTER CH_BACK_CENTER --#define AV_CH_SIDE_LEFT CH_SIDE_LEFT --#define AV_CH_SIDE_RIGHT CH_SIDE_RIGHT --#define AV_CH_TOP_CENTER CH_TOP_CENTER --#define AV_CH_TOP_FRONT_LEFT CH_TOP_FRONT_LEFT --#define AV_CH_TOP_FRONT_CENTER CH_TOP_FRONT_CENTER --#define AV_CH_TOP_FRONT_RIGHT CH_TOP_FRONT_RIGHT --#define AV_CH_TOP_BACK_LEFT CH_TOP_BACK_LEFT --#define AV_CH_TOP_BACK_CENTER CH_TOP_BACK_CENTER --#define AV_CH_TOP_BACK_RIGHT CH_TOP_BACK_RIGHT --#define AV_CH_STEREO_LEFT CH_STEREO_LEFT --#define AV_CH_STEREO_RIGHT CH_STEREO_RIGHT -- --#define AV_CH_LAYOUT_NATIVE CH_LAYOUT_NATIVE -- --#define AV_CH_LAYOUT_MONO CH_LAYOUT_MONO --#define AV_CH_LAYOUT_STEREO CH_LAYOUT_STEREO --#define AV_CH_LAYOUT_2_1 CH_LAYOUT_2_1 --#define AV_CH_LAYOUT_SURROUND CH_LAYOUT_SURROUND --#define AV_CH_LAYOUT_4POINT0 CH_LAYOUT_4POINT0 --#define AV_CH_LAYOUT_2_2 CH_LAYOUT_2_2 --#define AV_CH_LAYOUT_QUAD CH_LAYOUT_QUAD --#define AV_CH_LAYOUT_5POINT0 CH_LAYOUT_5POINT0 --#define AV_CH_LAYOUT_5POINT1 CH_LAYOUT_5POINT1 --#define AV_CH_LAYOUT_5POINT0_BACK CH_LAYOUT_5POINT0_BACK --#define AV_CH_LAYOUT_5POINT1_BACK CH_LAYOUT_5POINT1_BACK --#define AV_CH_LAYOUT_7POINT0 CH_LAYOUT_7POINT0 --#define AV_CH_LAYOUT_7POINT1 CH_LAYOUT_7POINT1 --#define AV_CH_LAYOUT_7POINT1_WIDE CH_LAYOUT_7POINT1_WIDE --#define AV_CH_LAYOUT_STEREO_DOWNMIX CH_LAYOUT_STEREO_DOWNMIX --#endif -- --#endif // USE_EXTERNAL_FFMPEG -- --class DllAvCoreInterface --{ --public: -- virtual ~DllAvCoreInterface() {} -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) = 0; --}; -- --#if (defined USE_EXTERNAL_FFMPEG) -- --// Use direct layer --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ --public: -- virtual ~DllAvCore() {} --#if LIBAVCORE_VERSION_INT >= AV_VERSION_INT(0,12,0) || LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(50,38,0) -- // API added on: 2010-11-02, moved to libavutil on 2010-02-15 -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_fmt(sample_fmt); } --#else -- // from avcodec.h -- virtual int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt) { return ::av_get_bits_per_sample_format(sample_fmt); } --#endif -- -- // DLL faking. -- virtual bool ResolveExports() { return true; } -- virtual bool Load() { --#if LIBAVCORE_VERSION_INT > 0 -- CLog::Log(LOGDEBUG, "DllAvCore: Using libavcore system library"); --#endif -- return true; -- } -- virtual void Unload() {} --}; -- --#else -- --class DllAvCore : public DllDynamic, DllAvCoreInterface --{ -- DECLARE_DLL_WRAPPER(DllAvCore, DLL_PATH_LIBAVCORE) -- -- LOAD_SYMBOLS() -- -- DEFINE_METHOD1(int, av_get_bits_per_sample_fmt, (enum AVSampleFormat p1)) -- -- BEGIN_METHOD_RESOLVE() -- RESOLVE_METHOD(av_get_bits_per_sample_fmt) -- END_METHOD_RESOLVE() -- -- /* dependency of libavcore */ -- DllAvUtil m_dllAvUtil; -- --public: -- virtual bool Load() -- { -- if (!m_dllAvUtil.Load()) -- return false; -- return DllDynamic::Load(); -- } --}; -- --#endif -- -diff -Naur xbmc-11.0.1/lib/DllAvFilter.h xbmc-11.0.1.patch/lib/DllAvFilter.h ---- xbmc-11.0.1/lib/DllAvFilter.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFilter.h 2012-06-05 15:19:23.835494072 +0200 -@@ -24,8 +24,8 @@ - #include "config.h" - #endif - #include "DynamicDll.h" --#include "DllAvCore.h" - #include "DllAvCodec.h" -+#include "DllSwResample.h" - #include "utils/log.h" - - extern "C" { -@@ -43,24 +43,17 @@ - #if (defined USE_EXTERNAL_FFMPEG) - #if (defined HAVE_LIBAVFILTER_AVFILTER_H) - #include -+ #include -+ #include - #elif (defined HAVE_FFMPEG_AVFILTER_H) - #include -- #endif -- /* for av_vsrc_buffer_add_frame */ -- #if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,8,0) -- #include -- #elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame); -- #elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts); -- #else -- int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, -- AVFrame *frame, int64_t pts, AVRational pixel_aspect); -+ #include -+ #include - #endif - #else - #include "libavfilter/avfiltergraph.h" -+ #include "libavfilter/buffersink.h" -+ #include "libavfilter/avcodec.h" - #endif - } - -@@ -82,21 +75,16 @@ - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)=0; - virtual int avfilter_poll_frame(AVFilterLink *link)=0; - virtual int avfilter_request_frame(AVFilterLink *link)=0; --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags)=0; --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame)=0; --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts)=0; --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0; --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0; - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0; - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)=0; -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags)=0; -+ virtual AVBufferSinkParams *av_buffersink_params_alloc()=0; -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct mapping - class DllAvFilter : public DllDynamic, DllAvFilterInterface - { -@@ -115,12 +103,7 @@ - virtual void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - ::avfilter_graph_free(graph); --#else -- ::avfilter_graph_free(*graph); -- *graph = NULL; --#endif - } - void avfilter_register_all() - { -@@ -133,56 +116,31 @@ - virtual AVFilterInOut *avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return ::avfilter_inout_alloc(); --#else -- return (AVFilterInOut*)::av_mallocz(sizeof(AVFilterInOut)); --#endif - } - virtual void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - ::avfilter_inout_free(inout); --#else -- *inout = NULL; --#endif - } - virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if ( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,79,0) \ -- && LIBAVFILTER_VERSION_INT < AV_VERSION_INT(2,0,0) ) \ -- ||( LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0)) - return ::avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, log_ctx); --#else -- return ::avfilter_graph_parse(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return ::avfilter_graph_config(graphctx, log_ctx); --#else -- return ::avfilter_graph_config(graphctx, (AVClass*)log_ctx); --#endif - } - virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); } - virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); } --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int flags) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, flags); } --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame); } --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts); } --#else -- virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); } --#endif - virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); } - virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); } - virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { return ::avfilter_link(src, srcpad, dst, dstpad); } -+ virtual int av_buffersink_get_buffer_ref(AVFilterContext *buffer_sink, AVFilterBufferRef **bufref, int flags) { return ::av_buffersink_get_buffer_ref(buffer_sink, bufref, flags); } -+ virtual AVBufferSinkParams *av_buffersink_params_alloc() { return ::av_buffersink_params_alloc(); } -+ virtual int av_buffersink_poll_frame(AVFilterContext *ctx) { return av_buffersink_poll_frame(ctx); } - // DLL faking. - virtual bool ResolveExports() { return true; } - virtual bool Load() { -@@ -200,45 +158,24 @@ - - DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3)) - DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1)) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph **p1)) --#else -- DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph *p1)) --#endif - DEFINE_METHOD0(void, avfilter_register_all_dont_call) - DEFINE_METHOD6(int, avfilter_graph_create_filter, (AVFilterContext **p1, AVFilter *p2, const char *p3, const char *p4, void *p5, AVFilterGraph *p6)) - DEFINE_METHOD1(AVFilter*, avfilter_get_by_name, (const char *p1)) - DEFINE_METHOD0(AVFilterGraph*, avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - DEFINE_METHOD0(AVFilterInOut*, avfilter_inout_alloc_dont_call) - DEFINE_METHOD1(void, avfilter_inout_free_dont_call, (AVFilterInOut **p1)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut **p3, AVFilterInOut **p4, void *p5)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, void *p5)) --#else -- DEFINE_METHOD5(int, avfilter_graph_parse_dont_call, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, AVClass *p5)) --#endif --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, void *p2)) --#else -- DEFINE_METHOD2(int, avfilter_graph_config_dont_call, (AVFilterGraph *p1, AVClass *p2)) --#endif -+ DEFINE_FUNC_ALIGNED5(int, __cdecl, avfilter_graph_parse_dont_call, AVFilterGraph *, const char *, AVFilterInOut **, AVFilterInOut **, void *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avfilter_graph_config_dont_call, AVFilterGraph *, void *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_poll_frame, AVFilterLink *) - DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_request_frame, AVFilterLink*) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int p3)) --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- DEFINE_METHOD2(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2)) --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- DEFINE_METHOD3(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3)) --#else -- DEFINE_METHOD4(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3, AVRational p4)) --#endif - DEFINE_METHOD4(AVFilterBufferRef*, avfilter_get_video_buffer, (AVFilterLink *p1, int p2, int p3, int p4)) - DEFINE_METHOD1(void, avfilter_unref_buffer, (AVFilterBufferRef *p1)) - DEFINE_METHOD4(int, avfilter_link, (AVFilterContext *p1, unsigned p2, AVFilterContext *p3, unsigned p4)) -+ DEFINE_FUNC_ALIGNED3(int , __cdecl, av_buffersink_get_buffer_ref, AVFilterContext *, AVFilterBufferRef **, int); -+ DEFINE_FUNC_ALIGNED0(AVBufferSinkParams*, __cdecl, av_buffersink_params_alloc); -+ DEFINE_FUNC_ALIGNED1(int , __cdecl, av_buffersink_poll_frame, AVFilterContext *); - - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call) -@@ -248,10 +185,8 @@ - RESOLVE_METHOD(avfilter_graph_create_filter) - RESOLVE_METHOD(avfilter_get_by_name) - RESOLVE_METHOD(avfilter_graph_alloc) --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - RESOLVE_METHOD_RENAME(avfilter_inout_alloc, avfilter_inout_alloc_dont_call) - RESOLVE_METHOD_RENAME(avfilter_inout_free, avfilter_inout_free_dont_call) --#endif - RESOLVE_METHOD_RENAME(avfilter_graph_parse, avfilter_graph_parse_dont_call) - RESOLVE_METHOD_RENAME(avfilter_graph_config, avfilter_graph_config_dont_call) - RESOLVE_METHOD(avfilter_poll_frame) -@@ -260,10 +195,14 @@ - RESOLVE_METHOD(avfilter_get_video_buffer) - RESOLVE_METHOD(avfilter_unref_buffer) - RESOLVE_METHOD(avfilter_link) -+ RESOLVE_METHOD(av_buffersink_get_buffer_ref) -+ RESOLVE_METHOD(av_buffersink_params_alloc) -+ RESOLVE_METHOD(av_buffersink_poll_frame) - END_METHOD_RESOLVE() - - /* dependencies of libavfilter */ - DllAvUtil m_dllAvUtil; -+ DllSwResample m_dllSwResample; - - public: - int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -279,12 +218,7 @@ - void avfilter_graph_free(AVFilterGraph **graph) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(1,76,0) - avfilter_graph_free_dont_call(graph); --#else -- avfilter_graph_free_dont_call(*graph); -- m_dllAvUtil.av_freep(graph); --#endif - } - void avfilter_register_all() - { -@@ -294,45 +228,29 @@ - AVFilterInOut* avfilter_inout_alloc() - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - return avfilter_inout_alloc_dont_call(); --#else -- return (AVFilterInOut*)m_dllAvUtil.av_mallocz(sizeof(AVFilterInOut)); --#endif - } - int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut **inputs, AVFilterInOut **outputs, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,16,0) - return avfilter_graph_parse_dont_call(graph, filters, inputs, outputs, log_ctx); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, log_ctx); --#else -- return avfilter_graph_parse_dont_call(graph, filters, *inputs, *outputs, (AVClass*)log_ctx); --#endif - } - void avfilter_inout_free(AVFilterInOut **inout) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,17,0) - avfilter_inout_free_dont_call(inout); --#else -- *inout = NULL; --#endif - } - int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx) - { - CSingleLock lock(DllAvCodec::m_critSection); --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,15,1) - return avfilter_graph_config_dont_call(graphctx, log_ctx); --#else -- return avfilter_graph_config_dont_call(graphctx, (AVClass*)log_ctx); --#endif - } - virtual bool Load() - { - if (!m_dllAvUtil.Load()) - return false; -+ if (!m_dllSwResample.Load()) -+ return false; - return DllDynamic::Load(); - } - }; -diff -Naur xbmc-11.0.1/lib/DllAvFormat.h xbmc-11.0.1.patch/lib/DllAvFormat.h ---- xbmc-11.0.1/lib/DllAvFormat.h 2012-03-21 23:57:42.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvFormat.h 2012-06-05 15:19:23.837494112 +0200 -@@ -62,57 +62,45 @@ - virtual ~DllAvFormatInterface() {} - virtual void av_register_all_dont_call(void)=0; - virtual AVInputFormat *av_find_input_format(const char *short_name)=0; -- virtual int url_feof(ByteIOContext *s)=0; -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)=0; -- virtual void av_close_input_file(AVFormatContext *s)=0; -- virtual void av_close_input_stream(AVFormatContext *s)=0; -+ virtual int url_feof(AVIOContext *s)=0; -+ virtual void avformat_close_input(AVFormatContext **s)=0; - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt)=0; - virtual void av_read_frame_flush(AVFormatContext *s)=0; - virtual int av_read_play(AVFormatContext *s)=0; - virtual int av_read_pause(AVFormatContext *s)=0; - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)=0; --#if (!defined USE_EXTERNAL_FFMPEG) -- virtual int av_find_stream_info_dont_call(AVFormatContext *ic)=0; -+#if (!defined USE_EXTERNAL_FFMPEG) && (!defined TARGET_DARWIN) -+ virtual int avformat_find_stream_info_dont_call(AVFormatContext *ic, AVDictionary **options)=0; - #endif -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap)=0; -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)=0; -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap)=0; -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)=0; -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), - offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)=0; - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)=0; -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -- virtual int url_fdopen(ByteIOContext **s, URLContext *h)=0; -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags)=0; -- virtual int url_fclose(ByteIOContext *s)=0; -- virtual int url_open_dyn_buf(ByteIOContext **s)=0; -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer)=0; -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence)=0; -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size)=0; -- virtual void put_byte(ByteIOContext *s, int b)=0; -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size)=0; -- virtual void put_be24(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be32(ByteIOContext *s, unsigned int val)=0; -- virtual void put_be16(ByteIOContext *s, unsigned int val)=0; -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)=0; -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)=0; -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags)=0; -+ virtual int avio_close(AVIOContext *s)=0; -+ virtual int avio_open_dyn_buf(AVIOContext **s)=0; -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)=0; -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence)=0; -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size)=0; -+ virtual void avio_w8(AVIOContext *s, int b)=0; -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size)=0; -+ virtual void avio_wb24(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb32(AVIOContext *s, unsigned int val)=0; -+ virtual void avio_wb16(AVIOContext *s, unsigned int val)=0; - virtual AVFormatContext *avformat_alloc_context(void)=0; -- virtual AVStream *av_new_stream(AVFormatContext *s, int id)=0; -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)=0; - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type)=0; -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)=0; -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence))=0; -- virtual int av_write_header (AVFormatContext *s)=0; -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options)=0; - virtual int av_write_trailer(AVFormatContext *s)=0; - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt)=0; -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // Use direct mapping - class DllAvFormat : public DllDynamic, DllAvFormatInterface -@@ -126,78 +114,45 @@ - } - virtual void av_register_all_dont_call() { *(int* )0x0 = 0; } - virtual AVInputFormat *av_find_input_format(const char *short_name) { return ::av_find_input_format(short_name); } -- virtual int url_feof(ByteIOContext *s) { return ::url_feof(s); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return ::av_metadata_get(m, key, prev, flags); } --#else -- virtual AVMetadataTag *av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags){ return NULL; } --#endif -- virtual void av_close_input_file(AVFormatContext *s) { ::av_close_input_file(s); } -- virtual void av_close_input_stream(AVFormatContext *s) { ::av_close_input_stream(s); } -+ virtual int url_feof(AVIOContext *s) { return ::url_feof(s); } -+ virtual void avformat_close_input(AVFormatContext **s) { ::avformat_close_input(s); } - virtual int av_read_frame(AVFormatContext *s, AVPacket *pkt) { return ::av_read_frame(s, pkt); } - virtual void av_read_frame_flush(AVFormatContext *s) { ::av_read_frame_flush(s); } - virtual int av_read_play(AVFormatContext *s) { return ::av_read_play(s); } - virtual int av_read_pause(AVFormatContext *s) { return ::av_read_pause(s); } - virtual int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { return ::av_seek_frame(s, stream_index, timestamp, flags); } -- virtual int av_find_stream_info(AVFormatContext *ic) -+ virtual int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return ::av_find_stream_info(ic); -+ return ::avformat_find_stream_info(ic, options); - } -- virtual int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, AVInputFormat *fmt, int buf_size, AVFormatParameters *ap) { return ::av_open_input_file(ic_ptr, filename, fmt, buf_size, ap); } -- virtual void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) { ::url_set_interrupt_cb(interrupt_cb); } -- virtual int av_open_input_stream(AVFormatContext **ic_ptr, ByteIOContext *pb, const char *filename, AVInputFormat *fmt, AVFormatParameters *ap) { return ::av_open_input_stream(ic_ptr, pb, filename, fmt, ap); } -- virtual int init_put_byte(ByteIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -+ virtual int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options) -+ { return ::avformat_open_input(ps, filename, fmt, options); } -+ virtual AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, - int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), - int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::init_put_byte(s, buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -+ offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::avio_alloc_context(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } - virtual AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {return ::av_probe_input_format(pd, is_opened); } - virtual AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max) {*score_max = 100; return ::av_probe_input_format(pd, is_opened); } // Use av_probe_input_format, this is not exported by ffmpeg's headers --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,98,0) -- // API added on: 2010-02-08 -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } --#else -- virtual int av_probe_input_buffer(ByteIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return -1; } --#endif -- virtual void dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::dump_format(ic, index, url, is_output); } -- virtual int url_fdopen(ByteIOContext **s, URLContext *h) { return ::url_fdopen(s, h); } -- virtual int url_fopen(ByteIOContext **s, const char *filename, int flags) { return ::url_fopen(s, filename, flags); } -- virtual int url_fclose(ByteIOContext *s) { return ::url_fclose(s); } -- virtual int url_open_dyn_buf(ByteIOContext **s) { return ::url_open_dyn_buf(s); } -- virtual int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer) { return ::url_close_dyn_buf(s, pbuffer); } -- virtual offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence) { return ::url_fseek(s, offset, whence); } -- virtual int get_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_buffer(s, buf, size); } -- virtual int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size) { return ::get_partial_buffer(s, buf, size); } -- virtual void put_byte(ByteIOContext *s, int b) { ::put_byte(s, b); } -- virtual void put_buffer(ByteIOContext *s, const unsigned char *buf, int size) { ::put_buffer(s, buf, size); } -- virtual void put_be24(ByteIOContext *s, unsigned int val) { ::put_be24(s, val); } -- virtual void put_be32(ByteIOContext *s, unsigned int val) { ::put_be32(s, val); } -- virtual void put_be16(ByteIOContext *s, unsigned int val) { ::put_be16(s, val); } -+ virtual int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size) { return ::av_probe_input_buffer(pb, fmt, filename, logctx, offset, max_probe_size); } -+ virtual void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output) { ::av_dump_format(ic, index, url, is_output); } -+ virtual int avio_open(AVIOContext **s, const char *filename, int flags) { return ::avio_open(s, filename, flags); } -+ virtual int avio_close(AVIOContext *s) { return ::avio_close(s); } -+ virtual int avio_open_dyn_buf(AVIOContext **s) { return ::avio_open_dyn_buf(s); } -+ virtual int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) { return ::avio_close_dyn_buf(s, pbuffer); } -+ virtual offset_t avio_seek(AVIOContext *s, offset_t offset, int whence) { return ::avio_seek(s, offset, whence); } -+ virtual int avio_read(AVIOContext *s, unsigned char *buf, int size) { return ::avio_read(s, buf, size); } -+ virtual void avio_w8(AVIOContext *s, int b) { ::avio_w8(s, b); } -+ virtual void avio_write(AVIOContext *s, const unsigned char *buf, int size) { ::avio_write(s, buf, size); } -+ virtual void avio_wb24(AVIOContext *s, unsigned int val) { ::avio_wb24(s, val); } -+ virtual void avio_wb32(AVIOContext *s, unsigned int val) { ::avio_wb32(s, val); } -+ virtual void avio_wb16(AVIOContext *s, unsigned int val) { ::avio_wb16(s, val); } - virtual AVFormatContext *avformat_alloc_context() { return ::avformat_alloc_context(); } -- virtual AVStream *av_new_stream(AVFormatContext *s, int id) { return ::av_new_stream(s, id); } --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::guess_format(short_name, filename, mime_type); } --#else -+ virtual AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { return ::avformat_new_stream(s, c); } - virtual AVOutputFormat *av_guess_format(const char *short_name, const char *filename, const char *mime_type) { return ::av_guess_format(short_name, filename, mime_type); } --#endif -- virtual int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap) { return ::av_set_parameters(s, ap); } -- virtual ByteIOContext *av_alloc_put_byte(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, -- int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), -- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*seek)(void *opaque, offset_t offset, int whence)) { return ::av_alloc_put_byte(buffer, buffer_size, write_flag, opaque, read_packet, write_packet, seek); } -- virtual int av_write_header (AVFormatContext *s) { return ::av_write_header (s); } -+ virtual int avformat_write_header (AVFormatContext *s, AVDictionary **options) { return ::avformat_write_header (s, options); } - virtual int av_write_trailer(AVFormatContext *s) { return ::av_write_trailer(s); } - virtual int av_write_frame (AVFormatContext *s, AVPacket *pkt) { return ::av_write_frame(s, pkt); } --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,43,0) -- // API added on: 2009-12-13 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set2(pm, key, value, flags); } --#elif LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,31,0) -- // API added on: 2009-03-01 -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return ::av_metadata_set(pm, key, value); } --#else -- virtual int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags) { return -1; } --#endif - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -218,108 +173,78 @@ - - DEFINE_METHOD0(void, av_register_all_dont_call) - DEFINE_METHOD1(AVInputFormat*, av_find_input_format, (const char *p1)) -- DEFINE_METHOD1(int, url_feof, (ByteIOContext *p1)) -- DEFINE_METHOD4(AVMetadataTag*, av_metadata_get, (AVMetadata *p1, const char *p2, const AVMetadataTag *p3, int p4)) -- DEFINE_METHOD1(void, av_close_input_file, (AVFormatContext *p1)) -- DEFINE_METHOD1(void, av_close_input_stream, (AVFormatContext *p1)) -+ DEFINE_METHOD1(int, url_feof, (AVIOContext *p1)) -+ DEFINE_METHOD1(void, avformat_close_input, (AVFormatContext **p1)) - DEFINE_METHOD1(int, av_read_play, (AVFormatContext *p1)) - DEFINE_METHOD1(int, av_read_pause, (AVFormatContext *p1)) - DEFINE_METHOD1(void, av_read_frame_flush, (AVFormatContext *p1)) - DEFINE_FUNC_ALIGNED2(int, __cdecl, av_read_frame, AVFormatContext *, AVPacket *) - DEFINE_FUNC_ALIGNED4(int, __cdecl, av_seek_frame, AVFormatContext*, int, int64_t, int) -- DEFINE_FUNC_ALIGNED1(int, __cdecl, av_find_stream_info_dont_call, AVFormatContext*) -- DEFINE_FUNC_ALIGNED5(int, __cdecl, av_open_input_file, AVFormatContext**, const char *, AVInputFormat *, int, AVFormatParameters *) -- DEFINE_FUNC_ALIGNED5(int,__cdecl, av_open_input_stream, AVFormatContext **, ByteIOContext *, const char *, AVInputFormat *, AVFormatParameters *) -+ DEFINE_FUNC_ALIGNED2(int, __cdecl, avformat_find_stream_info_dont_call, AVFormatContext*, AVDictionary **) -+ DEFINE_FUNC_ALIGNED4(int, __cdecl, avformat_open_input, AVFormatContext **, const char *, AVInputFormat *, AVDictionary **) - DEFINE_FUNC_ALIGNED2(AVInputFormat*, __cdecl, av_probe_input_format, AVProbeData*, int) - DEFINE_FUNC_ALIGNED3(AVInputFormat*, __cdecl, av_probe_input_format2, AVProbeData*, int, int*) -- DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, ByteIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED3(int, __cdecl, get_partial_buffer, ByteIOContext*, unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_byte, ByteIOContext*, int) -- DEFINE_FUNC_ALIGNED3(void, __cdecl, put_buffer, ByteIOContext*, const unsigned char *, int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be24, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be32, ByteIOContext*, unsigned int) -- DEFINE_FUNC_ALIGNED2(void, __cdecl, put_be16, ByteIOContext*, unsigned int) -- DEFINE_METHOD1(void, url_set_interrupt_cb, (URLInterruptCB *p1)) -- DEFINE_METHOD8(int, init_put_byte, (ByteIOContext *p1, unsigned char *p2, int p3, int p4, void *p5, -+ DEFINE_FUNC_ALIGNED6(int, __cdecl, av_probe_input_buffer, AVIOContext *, AVInputFormat **, const char *, void *, unsigned int, unsigned int) -+ DEFINE_FUNC_ALIGNED3(int, __cdecl, avio_read, AVIOContext*, unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_w8, AVIOContext*, int) -+ DEFINE_FUNC_ALIGNED3(void, __cdecl, avio_write, AVIOContext*, const unsigned char *, int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb24, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb32, AVIOContext*, unsigned int) -+ DEFINE_FUNC_ALIGNED2(void, __cdecl, avio_wb16, AVIOContext*, unsigned int) -+ DEFINE_METHOD7(AVIOContext *, avio_alloc_context, (unsigned char *p1, int p2, int p3, void *p4, -+ int (*p5)(void *opaque, uint8_t *buf, int buf_size), - int (*p6)(void *opaque, uint8_t *buf, int buf_size), -- int (*p7)(void *opaque, uint8_t *buf, int buf_size), -- offset_t (*p8)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD4(void, dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -- DEFINE_METHOD2(int, url_fdopen, (ByteIOContext **p1, URLContext *p2)) -- DEFINE_METHOD3(int, url_fopen, (ByteIOContext **p1, const char *p2, int p3)) -- DEFINE_METHOD1(int, url_fclose, (ByteIOContext *p1)) -- DEFINE_METHOD1(int, url_open_dyn_buf, (ByteIOContext **p1)) -- DEFINE_METHOD2(int, url_close_dyn_buf, (ByteIOContext *p1, uint8_t **p2)) -- DEFINE_METHOD3(offset_t, url_fseek, (ByteIOContext *p1, offset_t p2, int p3)) -+ offset_t (*p7)(void *opaque, offset_t offset, int whence))) -+ DEFINE_METHOD4(void, av_dump_format, (AVFormatContext *p1, int p2, const char *p3, int p4)) -+ DEFINE_METHOD3(int, avio_open, (AVIOContext **p1, const char *p2, int p3)) -+ DEFINE_METHOD1(int, avio_close, (AVIOContext *p1)) -+ DEFINE_METHOD1(int, avio_open_dyn_buf, (AVIOContext **p1)) -+ DEFINE_METHOD2(int, avio_close_dyn_buf, (AVIOContext *p1, uint8_t **p2)) -+ DEFINE_METHOD3(offset_t, avio_seek, (AVIOContext *p1, offset_t p2, int p3)) - DEFINE_METHOD0(AVFormatContext *, avformat_alloc_context) -- DEFINE_METHOD2(AVStream *, av_new_stream, (AVFormatContext *p1, int p2)) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- DEFINE_METHOD3(AVOutputFormat *, guess_format, (const char *p1, const char *p2, const char *p3)) --#else -+ DEFINE_METHOD2(AVStream *, avformat_new_stream, (AVFormatContext *p1, AVCodec *p2)) - DEFINE_METHOD3(AVOutputFormat *, av_guess_format, (const char *p1, const char *p2, const char *p3)) --#endif -- DEFINE_METHOD2(int, av_set_parameters, (AVFormatContext *p1, AVFormatParameters *p2)); -- DEFINE_METHOD7(ByteIOContext *, av_alloc_put_byte, (unsigned char *p1, int p2, int p3, void *p4, -- int(*p5)(void *opaque, uint8_t *buf, int buf_size), -- int(*p6)(void *opaque, uint8_t *buf, int buf_size), -- offset_t(*p7)(void *opaque, offset_t offset, int whence))) -- DEFINE_METHOD1(int, av_write_header , (AVFormatContext *p1)) -+ DEFINE_METHOD2(int, avformat_write_header , (AVFormatContext *p1, AVDictionary **p2)) - DEFINE_METHOD1(int, av_write_trailer, (AVFormatContext *p1)) - DEFINE_METHOD2(int, av_write_frame , (AVFormatContext *p1, AVPacket *p2)) -- DEFINE_METHOD4(int, av_metadata_set2, (AVMetadata **p1, const char *p2, const char *p3, int p4)); - BEGIN_METHOD_RESOLVE() - RESOLVE_METHOD_RENAME(av_register_all, av_register_all_dont_call) - RESOLVE_METHOD(av_find_input_format) - RESOLVE_METHOD(url_feof) -- RESOLVE_METHOD(av_metadata_get) -- RESOLVE_METHOD(av_close_input_file) -- RESOLVE_METHOD(av_close_input_stream) -+ RESOLVE_METHOD(avformat_close_input) - RESOLVE_METHOD(av_read_frame) - RESOLVE_METHOD(av_read_play) - RESOLVE_METHOD(av_read_pause) -- RESOLVE_METHOD_RENAME(ff_read_frame_flush, av_read_frame_flush) -+ RESOLVE_METHOD(av_read_frame_flush) - RESOLVE_METHOD(av_seek_frame) -- RESOLVE_METHOD_RENAME(av_find_stream_info, av_find_stream_info_dont_call) -- RESOLVE_METHOD(av_open_input_file) -- RESOLVE_METHOD(url_set_interrupt_cb) -- RESOLVE_METHOD(av_open_input_stream) -- RESOLVE_METHOD(init_put_byte) -+ RESOLVE_METHOD_RENAME(avformat_find_stream_info, avformat_find_stream_info_dont_call) -+ RESOLVE_METHOD(avformat_open_input) -+ RESOLVE_METHOD(avio_alloc_context) - RESOLVE_METHOD(av_probe_input_format) - RESOLVE_METHOD(av_probe_input_format2) - RESOLVE_METHOD(av_probe_input_buffer) -- RESOLVE_METHOD(dump_format) -- RESOLVE_METHOD(url_fdopen) -- RESOLVE_METHOD(url_fopen) -- RESOLVE_METHOD(url_fclose) -- RESOLVE_METHOD(url_open_dyn_buf) -- RESOLVE_METHOD(url_close_dyn_buf) -- RESOLVE_METHOD(url_fseek) -- RESOLVE_METHOD(get_buffer) -- RESOLVE_METHOD(get_partial_buffer) -- RESOLVE_METHOD(put_byte) -- RESOLVE_METHOD(put_buffer) -- RESOLVE_METHOD(put_be24) -- RESOLVE_METHOD(put_be32) -- RESOLVE_METHOD(put_be16) -+ RESOLVE_METHOD(av_dump_format) -+ RESOLVE_METHOD(avio_open) -+ RESOLVE_METHOD(avio_close) -+ RESOLVE_METHOD(avio_open_dyn_buf) -+ RESOLVE_METHOD(avio_close_dyn_buf) -+ RESOLVE_METHOD(avio_seek) -+ RESOLVE_METHOD(avio_read) -+ RESOLVE_METHOD(avio_w8) -+ RESOLVE_METHOD(avio_write) -+ RESOLVE_METHOD(avio_wb24) -+ RESOLVE_METHOD(avio_wb32) -+ RESOLVE_METHOD(avio_wb16) - RESOLVE_METHOD(avformat_alloc_context) -- RESOLVE_METHOD(av_new_stream) --#if LIBAVFORMAT_VERSION_INT < (52<<16 | 45<<8) -- RESOLVE_METHOD(guess_format) --#else -+ RESOLVE_METHOD(avformat_new_stream) - RESOLVE_METHOD(av_guess_format) --#endif -- RESOLVE_METHOD(av_set_parameters) -- RESOLVE_METHOD(av_alloc_put_byte) -- RESOLVE_METHOD(av_write_header) -+ RESOLVE_METHOD(avformat_write_header) - RESOLVE_METHOD(av_write_trailer) - RESOLVE_METHOD(av_write_frame) -- RESOLVE_METHOD(av_metadata_set2) - END_METHOD_RESOLVE() - - /* dependencies of libavformat */ - DllAvCodec m_dllAvCodec; -- // DllAvCore loaded implicitely by m_dllAvCodec - // DllAvUtil loaded implicitely by m_dllAvCodec - - public: -@@ -328,10 +253,10 @@ - CSingleLock lock(DllAvCodec::m_critSection); - av_register_all_dont_call(); - } -- int av_find_stream_info(AVFormatContext *ic) -+ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) - { - CSingleLock lock(DllAvCodec::m_critSection); -- return(av_find_stream_info_dont_call(ic)); -+ return avformat_find_stream_info_dont_call(ic, options); - } - - virtual bool Load() -diff -Naur xbmc-11.0.1/lib/DllAvUtil.h xbmc-11.0.1.patch/lib/DllAvUtil.h ---- xbmc-11.0.1/lib/DllAvUtil.h 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllAvUtil.h 2012-06-05 15:19:23.837494112 +0200 -@@ -65,6 +65,7 @@ - #include "libavutil/opt.h" - #include "libavutil/mem.h" - #include "libavutil/fifo.h" -+ #include "libavutil/samplefmt.h" - #endif - } - -@@ -89,7 +90,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)=0; - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id)=0; - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)=0; -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out)=0; -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags)=0; - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) = 0; - virtual void av_fifo_free(AVFifoBuffer *f) = 0; - virtual void av_fifo_reset(AVFifoBuffer *f) = 0; -@@ -97,10 +98,13 @@ - virtual int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int)) = 0; - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) = 0; - virtual char *av_strdup(const char *s)=0; -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) = 0; -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags) = 0; -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)=0; -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) = 0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -- -+#if defined (USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - // Use direct layer - class DllAvUtilBase : public DllDynamic, DllAvUtilInterface - { -@@ -117,12 +121,7 @@ - virtual int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) { return ::av_rescale_q(a, bq, cq); } - virtual const AVCRC* av_crc_get_table(AVCRCId crc_id) { return ::av_crc_get_table(crc_id); } - virtual uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { return ::av_crc(ctx, crc, buffer, length); } --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,7,0) -- // API added on: 2008-12-16 -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return ::av_set_string3(obj, name, val, alloc, o_out); } --#else -- virtual int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out) { return AVERROR(ENOENT); } --#endif -+ virtual int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { return ::av_opt_set(obj, name, val, search_flags); } - virtual AVFifoBuffer *av_fifo_alloc(unsigned int size) {return ::av_fifo_alloc(size); } - virtual void av_fifo_free(AVFifoBuffer *f) { ::av_fifo_free(f); } - virtual void av_fifo_reset(AVFifoBuffer *f) { ::av_fifo_reset(f); } -@@ -132,6 +131,12 @@ - virtual int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int)) - { return ::av_fifo_generic_write(f, src, size, func); } - virtual char *av_strdup(const char *s) { return ::av_strdup(s); } -+ virtual int av_get_bytes_per_sample(enum AVSampleFormat p1) -+ { return ::av_get_bytes_per_sample(p1); } -+ virtual AVDictionaryEntry *av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags){ return ::av_dict_get(m, key, prev, flags); } -+ virtual int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags) { return ::av_dict_set(pm, key, value, flags); } -+ virtual int av_samples_get_buffer_size (int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align) -+ { return ::av_samples_get_buffer_size(linesize, nb_channels, nb_samples, sample_fmt, align); } - - // DLL faking. - virtual bool ResolveExports() { return true; } -@@ -160,7 +165,7 @@ - DEFINE_METHOD3(int64_t, av_rescale_q, (int64_t p1, AVRational p2, AVRational p3)); - DEFINE_METHOD1(const AVCRC*, av_crc_get_table, (AVCRCId p1)) - DEFINE_METHOD4(uint32_t, av_crc, (const AVCRC *p1, uint32_t p2, const uint8_t *p3, size_t p4)); -- DEFINE_METHOD5(int, av_set_string3, (void *p1, const char *p2, const char *p3, int p4, const AVOption **p5)); -+ DEFINE_METHOD4(int, av_opt_set, (void *p1, const char *p2, const char *p3, int p4)); - DEFINE_METHOD1(AVFifoBuffer*, av_fifo_alloc, (unsigned int p1)) - DEFINE_METHOD1(void, av_fifo_free, (AVFifoBuffer *p1)) - DEFINE_METHOD1(void, av_fifo_reset, (AVFifoBuffer *p1)) -@@ -168,6 +173,10 @@ - DEFINE_METHOD4(int, av_fifo_generic_read, (AVFifoBuffer *p1, void *p2, int p3, void (*p4)(void*, void*, int))) - DEFINE_METHOD4(int, av_fifo_generic_write, (AVFifoBuffer *p1, void *p2, int p3, int (*p4)(void*, void*, int))) - DEFINE_METHOD1(char*, av_strdup, (const char *p1)) -+ DEFINE_METHOD1(int, av_get_bytes_per_sample, (enum AVSampleFormat p1)) -+ DEFINE_METHOD4(AVDictionaryEntry *, av_dict_get, (AVDictionary *p1, const char *p2, const AVDictionaryEntry *p3, int p4)) -+ DEFINE_METHOD4(int, av_dict_set, (AVDictionary **p1, const char *p2, const char *p3, int p4)); -+ DEFINE_METHOD5(int, av_samples_get_buffer_size, (int *p1, int p2, int p3, enum AVSampleFormat p4, int p5)) - - public: - BEGIN_METHOD_RESOLVE() -@@ -181,7 +190,7 @@ - RESOLVE_METHOD(av_rescale_q) - RESOLVE_METHOD(av_crc_get_table) - RESOLVE_METHOD(av_crc) -- RESOLVE_METHOD(av_set_string3) -+ RESOLVE_METHOD(av_opt_set) - RESOLVE_METHOD(av_fifo_alloc) - RESOLVE_METHOD(av_fifo_free) - RESOLVE_METHOD(av_fifo_reset) -@@ -189,6 +198,10 @@ - RESOLVE_METHOD(av_fifo_generic_read) - RESOLVE_METHOD(av_fifo_generic_write) - RESOLVE_METHOD(av_strdup) -+ RESOLVE_METHOD(av_get_bytes_per_sample) -+ RESOLVE_METHOD(av_dict_get) -+ RESOLVE_METHOD(av_dict_set) -+ RESOLVE_METHOD(av_samples_get_buffer_size) - END_METHOD_RESOLVE() - }; - -diff -Naur xbmc-11.0.1/lib/DllPostProc.h xbmc-11.0.1.patch/lib/DllPostProc.h ---- xbmc-11.0.1/lib/DllPostProc.h 2012-03-21 23:57:44.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllPostProc.h 2012-06-05 15:19:23.870494772 +0200 -@@ -87,7 +87,7 @@ - virtual void pp_free_context(pp_context *ppContext)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call directly. - class DllPostProc : public DllDynamic, DllPostProcInterface -diff -Naur xbmc-11.0.1/lib/DllSwResample.h xbmc-11.0.1.patch/lib/DllSwResample.h ---- xbmc-11.0.1/lib/DllSwResample.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwResample.h 2012-06-05 15:19:23.870494772 +0200 -@@ -0,0 +1,87 @@ -+#pragma once -+/* -+ * Copyright (C) 2005-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 -+ * -+ */ -+ -+#if (defined HAVE_CONFIG_H) && (!defined WIN32) -+ #include "config.h" -+#endif -+#include "DynamicDll.h" -+ -+extern "C" { -+#ifndef HAVE_MMX -+#define HAVE_MMX -+#endif -+#ifndef __STDC_CONSTANT_MACROS -+#define __STDC_CONSTANT_MACROS -+#endif -+#ifndef __GNUC__ -+#pragma warning(disable:4244) -+#endif -+#if (defined USE_EXTERNAL_FFMPEG) -+ #include -+#else -+ #include "libswresample/swresample.h" -+#endif -+} -+ -+ -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) -+ -+// Use direct mapping -+class DllSwResample : public DllDynamic -+{ -+public: -+ virtual ~DllSwResample() {} -+ -+ // DLL faking. -+ virtual bool ResolveExports() { return true; } -+ virtual bool Load() { -+ CLog::Log(LOGDEBUG, "DllAvFormat: Using libswresample system library"); -+ return true; -+ } -+ virtual void Unload() {} -+}; -+ -+#else -+ -+class DllSwResample : public DllDynamic -+{ -+ DECLARE_DLL_WRAPPER(DllSwResample, DLL_PATH_LIBSWRESAMPLE) -+ -+ LOAD_SYMBOLS() -+ -+ BEGIN_METHOD_RESOLVE() -+ END_METHOD_RESOLVE() -+ -+ /* dependencies of libavformat */ -+ DllAvUtil m_dllAvUtil; -+ -+public: -+ -+ virtual bool Load() -+ { -+ if (!m_dllAvUtil.Load()) -+ return false; -+ return DllDynamic::Load(); -+ } -+}; -+ -+#endif -diff -Naur xbmc-11.0.1/lib/DllSwScale.h xbmc-11.0.1.patch/lib/DllSwScale.h ---- xbmc-11.0.1/lib/DllSwScale.h 2012-03-21 23:57:39.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/DllSwScale.h 2012-06-05 15:19:23.871494792 +0200 -@@ -92,7 +92,7 @@ - virtual void sws_freeContext(struct SwsContext *context)=0; - }; - --#if (defined USE_EXTERNAL_FFMPEG) -+#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN) - - // We call into this library directly. - class DllSwScale : public DllDynamic, public DllSwScaleInterface -diff -Naur xbmc-11.0.1/lib/Makefile.in xbmc-11.0.1.patch/lib/Makefile.in ---- xbmc-11.0.1/lib/Makefile.in 2012-03-21 23:57:41.000000000 +0100 -+++ xbmc-11.0.1.patch/lib/Makefile.in 2012-06-05 15:19:23.880494972 +0200 -@@ -1,21 +1,18 @@ - ARCH=@ARCH@ - -+AR=@AR@ - LD=@LD@ - CC=@CC@ - CXX=@CXX@ --SHELL=@SHELL@ --ifeq ($(findstring osx,$(ARCH)),osx) --ifeq ($(findstring arm,$(ARCH)),arm) --LDFLAGS=-arch armv7 -iphoneos_version_min 4.1 -bundle -undefined dynamic_lookup -read_only_relocs suppress --else --LDFLAGS=-bundle -undefined dynamic_lookup -read_only_relocs suppress --endif --else --LDFLAGS=-shared -fPIC -rdynamic --endif - SYSDIR=@abs_top_srcdir@/system/players/dvdplayer --WRAPPER=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o --WRAPPER_MACH_ALIAS=@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias -+ -+AVFORMAT_SO=avformat-53-$(ARCH).so -+AVCODEC_SO=avcodec-53-$(ARCH).so -+AVUTIL_SO=avutil-51-$(ARCH).so -+AVFILTER_SO=avfilter-2-$(ARCH).so -+SWSCALE_SO=swscale-2-$(ARCH).so -+POSTPROC_SO=postproc-52-$(ARCH).so -+SWRESAMPLE_SO=swresample-0-$(ARCH).so - - DIRS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -@@ -24,123 +21,55 @@ - - LIBS= - ifneq (@USE_EXTERNAL_FFMPEG@,1) -- LIBS+=avutil-50-$(ARCH).so \ -- avcodec-52-$(ARCH).so \ -- avcore-0-$(ARCH).so \ -- avformat-52-$(ARCH).so \ -- postproc-51-$(ARCH).so \ -- avfilter-1-$(ARCH).so \ -- swscale-0-$(ARCH).so --endif -- --ifneq (,$(findstring powerpc,$(ARCH))) -- ARCH_DIR=ppc --else --ifeq ($(findstring arm,$(ARCH)),arm) -- ARCH_DIR=arm --else -- ARCH_DIR=x86 --endif -+ LIBS+=$(AVUTIL_SO) \ -+ $(AVCODEC_SO) \ -+ $(AVFORMAT_SO) \ -+ $(POSTPROC_SO) \ -+ $(AVFILTER_SO) \ -+ $(SWSCALE_SO) \ -+ $(SWRESAMPLE_SO) - endif - - .PHONY: $(DIRS) codecs - --codecs: $(addprefix $(SYSDIR)/, $(LIBS)); -- -- --ifeq ($(findstring osx,$(ARCH)), osx) --# Add -lbundle1.o for powerpc-osx --ifeq ($(ARCH), powerpc-osx) --BUNDLE1_O = -lbundle1.o --endif -- --$(SYSDIR)/avutil-50-$(ARCH).so: $(WRAPPER) ffmpeg/libavutil/libavutil.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavutil/*.o \ -- ffmpeg/libavutil/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcodec/*.o \ -- ffmpeg/libavcodec/$(ARCH_DIR)/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavcore/*.o $(BUNDLE1_O) -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavformat/*.o $(BUNDLE1_O) -- --ifeq ($(findstring x86,$(ARCH_DIR)), x86) --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/$(ARCH_DIR)/*.o \ -- ffmpeg/libavfilter/*.o $(BUNDLE1_O) --else # No libavfilter/ppc or libavfilter/arm --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libavfilter/*.o $(BUNDLE1_O) --endif -+ifneq ($(findstring osx,$(ARCH)), osx) - --ifneq ($(findstring arm,$(ARCH)), arm) --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o \ -- ffmpeg/libswscale/$(ARCH_DIR)/*.o $(BUNDLE1_O) --else # No ARM version of swscale available yet. --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libswscale/*.o --endif -- --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.dylib -- $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \ -- $(WRAPPER) ffmpeg/libpostproc/*.o $(BUNDLE1_O) -- --ffmpeg/libavutil/libavutil.dylib : ffmpeg; --ffmpeg/libavcodec/libavcodec.dylib : ffmpeg; --ffmpeg/libavcore/libavcore.dylib : ffmpeg; --ffmpeg/libavformat/libavformat.dylib : ffmpeg; --ffmpeg/libavformat/libavfilter.dylib : ffmpeg; --ffmpeg/libswscale/libswscale.dylib : ffmpeg; --ffmpeg/libpostproc/libpostproc.dylib : ffmpeg; --ffmpeg: -- $(MAKE) -C $@ -- --else -+codecs: $(addprefix $(SYSDIR)/, $(LIBS)); - --$(SYSDIR)/avutil-50-$(ARCH).so: ffmpeg/libavutil/libavutil.so -+$(SYSDIR)/$(AVUTIL_SO): ffmpeg/libavutil/libavutil.so - cp ffmpeg/libavutil/libavutil.so $@ - --$(SYSDIR)/avcodec-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavcodec/libavcodec.so -+$(SYSDIR)/$(AVCODEC_SO): ffmpeg/libavcodec/libavcodec.so - cp ffmpeg/libavcodec/libavcodec.so $@ - --$(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.so -- cp ffmpeg/libavcore/libavcore.so $@ -- --$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.so -+$(SYSDIR)/$(AVFORMAT_SO): ffmpeg/libavformat/libavformat.so - cp ffmpeg/libavformat/libavformat.so $@ - --$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.so -+$(SYSDIR)/$(AVFILTER_SO): ffmpeg/libavfilter/libavfilter.so - cp ffmpeg/libavfilter/libavfilter.so $@ - --$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.so -+$(SYSDIR)/$(SWSCALE_SO): ffmpeg/libswscale/libswscale.so - cp ffmpeg/libswscale/libswscale.so $@ - --$(SYSDIR)/postproc-51-$(ARCH).so: $(WRAPPER) ffmpeg/libpostproc/libpostproc.so -+$(SYSDIR)/$(POSTPROC_SO): ffmpeg/libpostproc/libpostproc.so - cp ffmpeg/libpostproc/libpostproc.so $@ - -+$(SYSDIR)/$(SWRESAMPLE_SO): ffmpeg/libswresample/libswresample.so -+ cp ffmpeg/libswresample/libswresample.so $@ -+ - ffmpeg/libavutil/libavutil.so : ffmpeg; - ffmpeg/libavcodec/libavcodec.so : ffmpeg; --ffmpeg/libavcore/libavcore.so : ffmpeg; - ffmpeg/libavformat/libavformat.so : ffmpeg; - ffmpeg/libavfilter/libavfilter.so : ffmpeg; - ffmpeg/libswscale/libswscale.so : ffmpeg; - ffmpeg/libpostproc/libpostproc.so : ffmpeg; -+ffmpeg/libswresample/libswresample.so : ffmpeg; -+endif -+ - ffmpeg: - $(MAKE) -C $@ -- -+ifeq ($(findstring osx,$(ARCH)), osx) -+ $(AR) d ffmpeg/libavcodec/libavcodec.a inverse.o - endif - - clean: -diff -Naur xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cdrip/EncoderFFmpeg.cpp 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cdrip/EncoderFFmpeg.cpp 2012-06-05 15:19:23.881494992 +0200 -@@ -59,11 +59,7 @@ - - CStdString filename = URIUtils::GetFileName(strFile); - AVOutputFormat *fmt = NULL; --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fmt = m_dllAvFormat.guess_format(NULL, filename.c_str(), NULL); --#else - fmt = m_dllAvFormat.av_guess_format(NULL, filename.c_str(), NULL); --#endif - if (!fmt) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Unable to guess the output format for the file %s", filename.c_str()); -@@ -82,7 +78,7 @@ - } - - m_Format = m_dllAvFormat.avformat_alloc_context(); -- m_Format->pb = m_dllAvFormat.av_alloc_put_byte(m_BCBuffer, sizeof(m_BCBuffer), URL_RDONLY, this, NULL, MuxerReadPacket, NULL); -+ m_Format->pb = m_dllAvFormat.avio_alloc_context(m_BCBuffer, sizeof(m_BCBuffer), AVIO_FLAG_READ, this, NULL, MuxerReadPacket, NULL); - if (!m_Format->pb) - { - m_dllAvUtil.av_freep(&m_Format); -@@ -93,17 +89,8 @@ - m_Format->oformat = fmt; - m_Format->bit_rate = g_guiSettings.GetInt("audiocds.bitrate") * 1000; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(m_Format, NULL) != 0) -- { -- m_dllAvUtil.av_freep(&m_Format->pb); -- m_dllAvUtil.av_freep(&m_Format); -- CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to set the muxer parameters"); -- return false; -- } -- - /* add a stream to it */ -- m_Stream = m_dllAvFormat.av_new_stream(m_Format, 1); -+ m_Stream = m_dllAvFormat.avformat_new_stream(m_Format, codec); - if (!m_Stream) - { - m_dllAvUtil.av_freep(&m_Format->pb); -@@ -144,7 +131,7 @@ - return false; - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to open the codec"); - m_dllAvUtil.av_freep(&m_Stream); -@@ -179,7 +166,7 @@ - SetTag("encoder" , "XBMC FFmpeg Encoder"); - - /* write the header */ -- if (m_dllAvFormat.av_write_header(m_Format) != 0) -+ if (m_dllAvFormat.avformat_write_header(m_Format, NULL) != 0) - { - CLog::Log(LOGERROR, "CEncoderFFmpeg::Init - Failed to write the header"); - delete[] m_Buffer; -@@ -194,7 +181,7 @@ - - void CEncoderFFmpeg::SetTag(const CStdString tag, const CStdString value) - { -- m_dllAvFormat.av_metadata_set2(&m_Format->metadata, tag.c_str(), value.c_str(), 0); -+ m_dllAvUtil.av_dict_set(&m_Format->metadata, tag.c_str(), value.c_str(), 0); - } - - int CEncoderFFmpeg::MuxerReadPacket(void *opaque, uint8_t *buf, int buf_size) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.cpp 2012-06-05 15:19:23.882495012 +0200 -@@ -29,10 +29,6 @@ - - CDVDAudioCodecFFmpeg::CDVDAudioCodecFFmpeg() : CDVDAudioCodec() - { -- m_iBufferSize1 = 0; -- m_pBuffer1 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); -- memset(m_pBuffer1, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -- - m_iBufferSize2 = 0; - m_pBuffer2 = (BYTE*)_aligned_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE, 16); - memset(m_pBuffer2, 0, AVCODEC_MAX_AUDIO_FRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); -@@ -45,11 +41,11 @@ - m_channelMap[0] = PCM_INVALID; - m_channels = 0; - m_layout = 0; -+ m_pFrame1 = NULL; - } - - CDVDAudioCodecFFmpeg::~CDVDAudioCodecFFmpeg() - { -- _aligned_free(m_pBuffer1); - _aligned_free(m_pBuffer2); - Dispose(); - } -@@ -59,12 +55,10 @@ - AVCodec* pCodec; - m_bOpenedCodec = false; - -- if (!m_dllAvCore.Load() || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) -+ if (!m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -- m_dllAvCodec.avcodec_get_context_defaults(m_pCodecContext); - - pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); - if (!pCodec) -@@ -73,6 +67,7 @@ - return false; - } - -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = 1; -@@ -97,13 +92,14 @@ - memcpy(m_pCodecContext->extradata, hints.extradata, hints.extrasize); - } - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDAudioCodecFFmpeg::Open() Unable to open codec"); - Dispose(); - return false; - } - -+ m_pFrame1 = m_dllAvCodec.avcodec_alloc_frame(); - m_bOpenedCodec = true; - m_iSampleFormat = AV_SAMPLE_FMT_NONE; - return true; -@@ -111,6 +107,9 @@ - - void CDVDAudioCodecFFmpeg::Dispose() - { -+ if (m_pFrame1) m_dllAvUtil.av_free(m_pFrame1); -+ m_pFrame1 = NULL; -+ - if (m_pConvert) - { - m_dllAvCodec.av_audio_convert_free(m_pConvert); -@@ -135,7 +134,7 @@ - - int CDVDAudioCodecFFmpeg::Decode(BYTE* pData, int iSize) - { -- int iBytesUsed; -+ int iBytesUsed, got_frame; - if (!m_pCodecContext) return -1; - - m_iBufferSize1 = AVCODEC_MAX_AUDIO_FRAME_SIZE ; -@@ -145,10 +144,17 @@ - m_dllAvCodec.av_init_packet(&avpkt); - avpkt.data = pData; - avpkt.size = iSize; -- iBytesUsed = m_dllAvCodec.avcodec_decode_audio3( m_pCodecContext -- , (int16_t*)m_pBuffer1 -- , &m_iBufferSize1 -+ iBytesUsed = m_dllAvCodec.avcodec_decode_audio4( m_pCodecContext -+ , m_pFrame1 -+ , &got_frame - , &avpkt); -+ if (iBytesUsed < 0 || !got_frame) -+ { -+ m_iBufferSize1 = 0; -+ m_iBufferSize2 = 0; -+ return iBytesUsed; -+ } -+ m_iBufferSize1 = m_dllAvUtil.av_samples_get_buffer_size(NULL, m_pCodecContext->channels, m_pFrame1->nb_samples, m_pCodecContext->sample_fmt, 1); - - /* some codecs will attempt to consume more data than what we gave */ - if (iBytesUsed > iSize) -@@ -184,9 +190,9 @@ - return iBytesUsed; - } - -- const void *ibuf[6] = { m_pBuffer1 }; -+ const void *ibuf[6] = { m_pFrame1->data[0] }; - void *obuf[6] = { m_pBuffer2 }; -- int istr[6] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_pCodecContext->sample_fmt)/8 }; -+ int istr[6] = { m_dllAvUtil.av_get_bytes_per_sample(m_pCodecContext->sample_fmt) }; - int ostr[6] = { 2 }; - int len = m_iBufferSize1 / istr[0]; - if(m_dllAvCodec.av_audio_convert(m_pConvert, obuf, ostr, ibuf, istr, len) < 0) -@@ -208,7 +214,7 @@ - { - if(m_iBufferSize1) - { -- *dst = m_pBuffer1; -+ *dst = m_pFrame1->data[0]; - return m_iBufferSize1; - } - if(m_iBufferSize2) -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecFFmpeg.h 2012-06-05 15:19:23.882495012 +0200 -@@ -23,7 +23,6 @@ - - #include "DVDAudioCodec.h" - #include "DllAvCodec.h" --#include "DllAvCore.h" - #include "DllAvFormat.h" - #include "DllAvUtil.h" - -@@ -51,7 +50,7 @@ - enum AVSampleFormat m_iSampleFormat; - enum PCMChannels m_channelMap[PCM_MAX_CH + 1]; - -- BYTE *m_pBuffer1; -+ AVFrame* m_pFrame1; - int m_iBufferSize1; - - BYTE *m_pBuffer2; -@@ -64,7 +63,6 @@ - int64_t m_layout; - - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - void BuildChannelMap(); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/DVDAudioCodecPassthroughFFmpeg.cpp 2012-06-05 15:19:23.883495032 +0200 -@@ -79,11 +79,7 @@ - /* get the muxer */ - AVOutputFormat *fOut = NULL; - --#if LIBAVFORMAT_VERSION_MAJOR < 52 -- fOut = m_dllAvFormat.guess_format(muxerName.c_str(), NULL, NULL); --#else - fOut = m_dllAvFormat.av_guess_format(muxerName.c_str(), NULL, NULL); --#endif - if (!fOut) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to get the FFmpeg %s muxer", muxerName.c_str()); -@@ -103,7 +99,7 @@ - muxer.m_pFormat->oformat = fOut; - - /* allocate a put_byte struct so we can grab the output */ -- muxer.m_pFormat->pb = m_dllAvFormat.av_alloc_put_byte(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), URL_RDONLY, &muxer, NULL, MuxerReadPacket, NULL); -+ muxer.m_pFormat->pb = m_dllAvFormat.avio_alloc_context(muxer.m_BCBuffer, sizeof(muxer.m_BCBuffer), AVIO_FLAG_READ, &muxer, NULL, MuxerReadPacket, NULL); - if (!muxer.m_pFormat->pb) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate ByteIOContext"); -@@ -112,21 +108,10 @@ - } - - /* this is streamed, no file, and ignore the index */ -- muxer.m_pFormat->pb->is_streamed = 1; -+ muxer.m_pFormat->pb->seekable = 0; - muxer.m_pFormat->flags |= AVFMT_NOFILE | AVFMT_FLAG_IGNIDX; - muxer.m_pFormat->bit_rate = hints.bitrate; - -- /* setup the muxer */ -- if (m_dllAvFormat.av_set_parameters(muxer.m_pFormat, NULL) != 0) -- { -- CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to set the %s muxer parameters", muxerName.c_str()); -- Dispose(); -- return false; -- } -- --#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52,92,0) -- // API added on: 2011-01-02 -- - /* While this is strictly only needed on big-endian systems, we do it on - * both to avoid as much dead code as possible. - * CoreAudio (at least on the cases we've seen) wants IEC 61937 in -@@ -138,8 +123,7 @@ - #endif - - /* request output of wanted endianness */ -- if (!fOut->priv_class || m_dllAvUtil.av_set_string3(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0, NULL) != 0) --#endif -+ if (!fOut->priv_class || m_dllAvUtil.av_opt_set(muxer.m_pFormat->priv_data, "spdif_flags", spdifFlags, 0) != 0) - { - #if defined(WORDS_BIGENDIAN) && !defined(__APPLE__) - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Unable to set big-endian stream mode (FFmpeg too old?), disabling passthrough"); -@@ -149,7 +133,7 @@ - } - - /* add a stream to it */ -- muxer.m_pStream = m_dllAvFormat.av_new_stream(muxer.m_pFormat, 1); -+ muxer.m_pStream = m_dllAvFormat.avformat_new_stream(muxer.m_pFormat, NULL); - if (!muxer.m_pStream) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthroughFFmpeg::SetupMuxer - Failed to allocate AVStream context"); -@@ -159,8 +143,6 @@ - - - /* set the stream's parameters */ -- muxer.m_pStream->stream_copy = 1; -- - m_SampleRate = hints.samplerate; - if(!m_SampleRate && hints.codec == CODEC_ID_AC3) - m_SampleRate = 48000; -@@ -176,7 +158,7 @@ - codec->extradata_size = hints.extrasize; - memcpy(codec->extradata, hints.extradata, hints.extrasize); - -- muxer.m_WroteHeader = m_dllAvFormat.av_write_header(muxer.m_pFormat) == 0; -+ muxer.m_WroteHeader = m_dllAvFormat.avformat_write_header(muxer.m_pFormat, NULL) == 0; - if (!muxer.m_WroteHeader) - { - CLog::Log(LOGERROR, "CDVDAudioCodecPassthrough::SetupMuxer - Failed to write the frame header"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.cpp 2012-06-05 15:19:23.943496230 +0200 -@@ -55,7 +55,7 @@ - bool CDVDAudioEncoderFFmpeg::Initialize(unsigned int channels, enum PCMChannels *channelMap, unsigned int bitsPerSample, unsigned int sampleRate) - { - Reset(); -- if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCore.Load() || !m_dllAvCodec.Load()) -+ if (!channelMap || !m_dllAvUtil.Load() || !m_dllAvCodec.Load()) - return false; - - m_dllAvCodec.avcodec_register_all(); -@@ -65,7 +65,7 @@ - return false; - - /* always assume 6 channels, 5.1... m_remap will give us what we want */ -- m_CodecCtx = m_dllAvCodec.avcodec_alloc_context(); -+ m_CodecCtx = m_dllAvCodec.avcodec_alloc_context3(codec); - m_CodecCtx->bit_rate = AC3_ENCODE_BITRATE; - m_CodecCtx->sample_rate = sampleRate; - m_CodecCtx->channels = 6; -@@ -104,7 +104,7 @@ - } - } - -- if (m_dllAvCodec.avcodec_open(m_CodecCtx, codec)) -+ if (m_dllAvCodec.avcodec_open2(m_CodecCtx, codec, NULL)) - { - m_dllAvUtil.av_freep(&m_CodecCtx); - return false; -@@ -149,7 +149,7 @@ - - if (m_AudioConvert) - m_TmpBuffer2 = new uint8_t[m_NeededFrames * m_CodecCtx->channels * -- m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8]; -+ m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt)]; - - return true; - } -@@ -186,7 +186,7 @@ - void *convInBuf[] = { m_TmpBuffer }; - int convInStr[] = { m_BitsPerSample / 8 }; - void *convOutBuf[] = { m_TmpBuffer2 }; -- int convOutStr[] = { m_dllAvCore.av_get_bits_per_sample_fmt(m_CodecCtx->sample_fmt) / 8 }; -+ int convOutStr[] = { m_dllAvUtil.av_get_bytes_per_sample(m_CodecCtx->sample_fmt) }; - if (m_dllAvCodec.av_audio_convert(m_AudioConvert, convOutBuf, convOutStr, - convInBuf, convInStr, m_NeededFrames * m_CodecCtx->channels) < 0) { - CLog::Log(LOGERROR, "CDVDAudioEncoderFFmpeg: Audio conversion failed"); -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Audio/Encoders/DVDAudioEncoderFFmpeg.h 2012-06-05 15:19:23.944496250 +0200 -@@ -43,7 +43,6 @@ - virtual int GetData(uint8_t **data); - private: - DllAvCodec m_dllAvCodec; -- DllAvCore m_dllAvCore; - DllAvUtil m_dllAvUtil; - - AVCodecContext *m_CodecCtx; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp 2012-06-05 15:19:23.944496250 +0200 -@@ -49,7 +49,14 @@ - - m_dllAvCodec.avcodec_register_all(); - -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -+ if (!pCodec) -+ { -+ CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -+ return false; -+ } -+ -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; -@@ -100,14 +107,7 @@ - delete[] parse_extra; - } - -- AVCodec* pCodec = m_dllAvCodec.avcodec_find_decoder(hints.codec); -- if (!pCodec) -- { -- CLog::Log(LOGDEBUG,"%s - Unable to find codec %d", __FUNCTION__, hints.codec); -- return false; -- } -- -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -134,19 +134,12 @@ - { - for(unsigned i=0;i= (52<<10) - if(sub.rects[i]) - { - m_dllAvUtil.av_free(sub.rects[i]->pict.data[0]); - m_dllAvUtil.av_free(sub.rects[i]->pict.data[1]); - m_dllAvUtil.av_freep(&sub.rects[i]); - } --#else -- if(sub.rects[i].bitmap) -- m_dllAvUtil.av_freep(&sub.rects[i].bitmap); -- if(m_Subtitle.rects[i].rgba_palette) -- m_dllAvUtil.av_freep(&sub.rects[i].rgba_palette); --#endif - } - if(sub.rects) - m_dllAvUtil.av_freep(&sub.rects); -@@ -294,7 +287,6 @@ - overlay->source_width = m_width; - overlay->source_height = m_height; - --#if LIBAVCODEC_VERSION_INT >= (52<<10) - BYTE* s = rect.pict.data[0]; - BYTE* t = overlay->data; - for(int i=0;idata; -- for(int i=0;ilinesize; -- } -- -- memcpy(overlay->palette, rect.rgba_palette, rect.nb_colors*4); -- -- m_dllAvUtil.av_freep(&rect.bitmap); -- m_dllAvUtil.av_freep(&rect.rgba_palette); --#endif - m_SubtitleIndex++; - - return overlay; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-06-05 15:19:23.946496292 +0200 -@@ -123,12 +123,11 @@ - CDVDVideoCodecFFmpeg::CDVDVideoCodecFFmpeg() : CDVDVideoCodec() - { - m_pCodecContext = NULL; -- m_pConvertFrame = NULL; - m_pFrame = NULL; - m_pFilterGraph = NULL; - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; -+ m_pBufferRef = NULL; - - m_iPictureWidth = 0; - m_iPictureHeight = 0; -@@ -163,9 +162,13 @@ - m_dllAvFilter.avfilter_register_all(); - - m_bSoftware = hints.software; -- m_pCodecContext = m_dllAvCodec.avcodec_alloc_context(); -+ -+ m_formats.push_back(PIX_FMT_YUV420P); -+ m_formats.push_back(PIX_FMT_YUVJ420P); -+ m_formats.push_back(PIX_FMT_NONE); /* always add none to get a terminated list in ffmpeg world */ - - pCodec = NULL; -+ m_pCodecContext = NULL; - - if (hints.codec == CODEC_ID_H264) - { -@@ -196,6 +199,7 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); - CVDPAU* vdp = new CVDPAU(); -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->codec_id = hints.codec; - m_pCodecContext->width = hints.width; - m_pCodecContext->height = hints.height; -@@ -207,7 +211,7 @@ - m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set - break; - } -- m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set -+ m_dllAvUtil.av_freep(&m_pCodecContext); - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Failed to get VDPAU device"); - vdp->Release(); - } -@@ -226,21 +230,26 @@ - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Using codec: %s",pCodec->long_name ? pCodec->long_name : pCodec->name); - -+ if(m_pCodecContext == NULL) -+ m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); -+ - m_pCodecContext->opaque = (void*)this; - m_pCodecContext->debug_mv = 0; - m_pCodecContext->debug = 0; - m_pCodecContext->workaround_bugs = FF_BUG_AUTODETECT; - m_pCodecContext->get_format = GetFormat; - m_pCodecContext->codec_tag = hints.codec_tag; -+ /* Only allow slice threading, since frame threading is more -+ * sensitive to changes in frame sizes, and it causes crashes -+ * during HW accell */ -+ m_pCodecContext->thread_type = FF_THREAD_SLICE; - - #if defined(__APPLE__) && defined(__arm__) - // ffmpeg with enabled neon will crash and burn if this is enabled - m_pCodecContext->flags &= CODEC_FLAG_EMU_EDGE; - #else - if (pCodec->id != CODEC_ID_H264 && pCodec->capabilities & CODEC_CAP_DR1 --#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52,69,0) - && pCodec->id != CODEC_ID_VP8 --#endif - ) - m_pCodecContext->flags |= CODEC_FLAG_EMU_EDGE; - #endif -@@ -272,16 +281,16 @@ - if (it->m_name == "surfaces") - m_uSurfacesCount = std::atoi(it->m_value.c_str()); - else -- m_dllAvUtil.av_set_string3(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0, NULL); -+ m_dllAvUtil.av_opt_set(m_pCodecContext, it->m_name.c_str(), it->m_value.c_str(), 0); - } - - int num_threads = std::min(8 /*MAX_THREADS*/, g_cpuInfo.getCPUCount()); - if( num_threads > 1 && !hints.software && m_pHardware == NULL // thumbnail extraction fails when run threaded - && ( pCodec->id == CODEC_ID_H264 - || pCodec->id == CODEC_ID_MPEG4 )) -- m_dllAvCodec.avcodec_thread_init(m_pCodecContext, num_threads); -+ m_pCodecContext->thread_count = num_threads; - -- if (m_dllAvCodec.avcodec_open(m_pCodecContext, pCodec) < 0) -+ if (m_dllAvCodec.avcodec_open2(m_pCodecContext, pCodec, NULL) < 0) - { - CLog::Log(LOGDEBUG,"CDVDVideoCodecFFmpeg::Open() Unable to open codec"); - return false; -@@ -290,14 +299,7 @@ - m_pFrame = m_dllAvCodec.avcodec_alloc_frame(); - if (!m_pFrame) return false; - -- if(pCodec->name) -- m_name = CStdString("ff-") + pCodec->name; -- else -- m_name = "ffmpeg"; -- -- if(m_pHardware) -- m_name += "-" + m_pHardware->Name(); -- -+ UpdateName(); - return true; - } - -@@ -306,13 +308,6 @@ - if (m_pFrame) m_dllAvUtil.av_free(m_pFrame); - m_pFrame = NULL; - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- } -- m_pConvertFrame = NULL; -- - if (m_pCodecContext) - { - if (m_pCodecContext->codec) m_dllAvCodec.avcodec_close(m_pCodecContext); -@@ -458,9 +453,6 @@ - return VC_ERROR; - } - -- if (len != iSize && m_pCodecContext->skip_frame != AVDISCARD_NONREF) -- CLog::Log(LOGWARNING, "%s - avcodec_decode_video didn't consume the full packet. size: %d, consumed: %d", __FUNCTION__, iSize, len); -- - if (!iGotPicture) - return VC_BUFFER; - -@@ -478,67 +470,32 @@ - if(m_pCodecContext->codec_id == CODEC_ID_H264) - m_started = true; - -- if(m_pCodecContext->pix_fmt != PIX_FMT_YUV420P -- && m_pCodecContext->pix_fmt != PIX_FMT_YUVJ420P -- && m_pHardware == NULL) -- { -- if (!m_dllSwScale.IsLoaded() && !m_dllSwScale.Load()) -- return VC_ERROR; -- -- if (!m_pConvertFrame) -- { -- // Allocate an AVFrame structure -- m_pConvertFrame = (AVPicture*)m_dllAvUtil.av_mallocz(sizeof(AVPicture)); -- // Due to a bug in swsscale we need to allocate one extra line of data -- if(m_dllAvCodec.avpicture_alloc( m_pConvertFrame -- , PIX_FMT_YUV420P -- , m_pCodecContext->width -- , m_pCodecContext->height+1) < 0) -- { -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- return VC_ERROR; -- } -- } -+ if(m_pHardware == NULL) -+ { -+ bool need_scale = std::find( m_formats.begin() -+ , m_formats.end() -+ , m_pCodecContext->pix_fmt) == m_formats.end(); - -- // convert the picture -- struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, -- m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, -- PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); -+ bool need_reopen = false; -+ if(!m_filters.Equals(m_filters_next)) -+ need_reopen = true; - -- if(context == NULL) -+ if(m_pFilterIn) - { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::Decode - unable to obtain sws context for w:%i, h:%i, pixfmt: %i", m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt); -- return VC_ERROR; -+ if(m_pFilterIn->outputs[0]->format != m_pCodecContext->pix_fmt -+ || m_pFilterIn->outputs[0]->w != m_pCodecContext->width -+ || m_pFilterIn->outputs[0]->h != m_pCodecContext->height) -+ need_reopen = true; - } - -- m_dllSwScale.sws_scale(context -- , m_pFrame->data -- , m_pFrame->linesize -- , 0 -- , m_pCodecContext->height -- , m_pConvertFrame->data -- , m_pConvertFrame->linesize); -- -- m_dllSwScale.sws_freeContext(context); -- } -- else -- { -- // no need to convert, just free any existing convert buffers -- if (m_pConvertFrame) -+ // try to setup new filters -+ if (need_reopen || (need_scale && m_pFilterGraph == NULL)) - { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } -- } -+ m_filters = m_filters_next; - -- // try to setup new filters -- if (!m_filters.Equals(m_filters_next)) -- { -- m_filters = m_filters_next; -- if(FilterOpen(m_filters) < 0) -- FilterClose(); -+ if(FilterOpen(m_filters, need_scale) < 0) -+ FilterClose(); -+ } - } - - int result; -@@ -564,12 +521,6 @@ - if (m_pHardware) - m_pHardware->Reset(); - -- if (m_pConvertFrame) -- { -- m_dllAvCodec.avpicture_free(m_pConvertFrame); -- m_dllAvUtil.av_free(m_pConvertFrame); -- m_pConvertFrame = NULL; -- } - m_filters = ""; - FilterClose(); - } -@@ -579,10 +530,10 @@ - pDvdVideoPicture->iWidth = m_pCodecContext->width; - pDvdVideoPicture->iHeight = m_pCodecContext->height; - -- if(m_pFilterLink) -+ if(m_pBufferRef) - { -- pDvdVideoPicture->iWidth = m_pFilterLink->cur_buf->video->w; -- pDvdVideoPicture->iHeight = m_pFilterLink->cur_buf->video->h; -+ pDvdVideoPicture->iWidth = m_pBufferRef->video->w; -+ pDvdVideoPicture->iHeight = m_pBufferRef->video->h; - } - - /* crop of 10 pixels if demuxer asked it */ -@@ -598,12 +549,8 @@ - - /* use variable in the frame */ - AVRational pixel_aspect = m_pCodecContext->sample_aspect_ratio; -- if (m_pFilterLink) --#ifdef HAVE_AVFILTERBUFFERREFVIDEOPROPS_SAMPLE_ASPECT_RATIO -- pixel_aspect = m_pFilterLink->cur_buf->video->sample_aspect_ratio; --#else -- pixel_aspect = m_pFilterLink->cur_buf->video->pixel_aspect; --#endif -+ if (m_pBufferRef) -+ pixel_aspect = m_pBufferRef->video->sample_aspect_ratio; - - if (pixel_aspect.num == 0) - aspect_ratio = 0; -@@ -632,8 +579,6 @@ - pDvdVideoPicture->iFlags = DVP_FLAG_ALLOCATED; - pDvdVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; - pDvdVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; -- if(m_pCodecContext->pix_fmt == PIX_FMT_YUVJ420P) -- pDvdVideoPicture->color_range = 1; - - pDvdVideoPicture->chroma_position = m_pCodecContext->chroma_sample_location; - pDvdVideoPicture->color_primaries = m_pCodecContext->color_primaries; -@@ -677,14 +622,6 @@ - if(!GetPictureCommon(pDvdVideoPicture)) - return false; - -- if(m_pConvertFrame) -- { -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->data[i] = m_pConvertFrame->data[i]; -- for (int i = 0; i < 4; i++) -- pDvdVideoPicture->iLineSize[i] = m_pConvertFrame->linesize[i]; -- } -- else - { - for (int i = 0; i < 4; i++) - pDvdVideoPicture->data[i] = m_pFrame->data[i]; -@@ -693,20 +630,38 @@ - } - - pDvdVideoPicture->iFlags |= pDvdVideoPicture->data[0] ? 0 : DVP_FLAG_DROPPED; -- pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; - pDvdVideoPicture->extended_format = 0; -+ pDvdVideoPicture->color_range = 0; -+ -+ PixelFormat pix_fmt; -+ if(m_pBufferRef) -+ pix_fmt = (PixelFormat)m_pBufferRef->format; -+ else -+ pix_fmt = m_pCodecContext->pix_fmt; -+ -+ switch(pix_fmt) -+ { -+ case PIX_FMT_YUVJ420P: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ pDvdVideoPicture->color_range = 1; -+ break; -+ default: -+ pDvdVideoPicture->format = DVDVideoPicture::FMT_YUV420P; -+ break; -+ } - - return true; - } - --int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters) -+int CDVDVideoCodecFFmpeg::FilterOpen(const CStdString& filters, bool scale) - { - int result; -+ AVBufferSinkParams *buffersink_params; - - if (m_pFilterGraph) - FilterClose(); - -- if (filters.IsEmpty()) -+ if (filters.IsEmpty() && !scale) - return 0; - - if (!(m_pFilterGraph = m_dllAvFilter.avfilter_graph_alloc())) -@@ -715,17 +670,8 @@ - return -1; - } - -- // CrHasher HACK (if an alternative becomes available use it!): In order to display the output -- // produced by a combination of filters we insert "nullsink" as the last filter and we use -- // its input pin as our output pin. -- // -- // input --> .. --> last_filter --> [in] nullsink [null] [in] --> output -- // | | -- // | | -- // +------------------------+ -- // - AVFilter* srcFilter = m_dllAvFilter.avfilter_get_by_name("buffer"); -- AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("nullsink"); // should be last filter in the graph for now -+ AVFilter* outFilter = m_dllAvFilter.avfilter_get_by_name("buffersink"); // should be last filter in the graph for now - - CStdString args; - -@@ -744,11 +690,19 @@ - return result; - } - -- if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, NULL/*nullsink=>NULL*/, m_pFilterGraph)) < 0) -+ buffersink_params = m_dllAvFilter.av_buffersink_params_alloc(); -+ buffersink_params->pixel_fmts = &m_formats[0]; -+#ifdef FF_API_OLD_VSINK_API -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, (void*)buffersink_params->pixel_fmts, m_pFilterGraph)) < 0) -+#else -+ if ((result = m_dllAvFilter.avfilter_graph_create_filter(&m_pFilterOut, outFilter, "out", NULL, buffersink_params, m_pFilterGraph)) < 0) -+#endif - { -+ m_dllAvUtil.av_freep(&buffersink_params); - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterOpen - avfilter_graph_create_filter: out"); - return result; - } -+ m_dllAvUtil.av_freep(&buffersink_params); - - if (!filters.empty()) - { -@@ -794,6 +748,12 @@ - - void CDVDVideoCodecFFmpeg::FilterClose() - { -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ - if (m_pFilterGraph) - { - m_dllAvFilter.avfilter_graph_free(&m_pFilterGraph); -@@ -801,7 +761,6 @@ - // Disposed by above code - m_pFilterIn = NULL; - m_pFilterOut = NULL; -- m_pFilterLink = NULL; - } - } - -@@ -809,20 +768,9 @@ - { - int result, frames; - -- m_pFilterLink = m_pFilterOut->inputs[0]; -- - if (frame) - { --#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,13,0) - result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, 0); --#elif LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(2,7,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame); --#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(53,3,0) -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts); --#else -- result = m_dllAvFilter.av_vsrc_buffer_add_frame(m_pFilterIn, frame, frame->pts, m_pCodecContext->sample_aspect_ratio); --#endif -- - if (result < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - av_vsrc_buffer_add_frame"); -@@ -830,7 +778,13 @@ - } - } - -- if ((frames = m_dllAvFilter.avfilter_poll_frame(m_pFilterLink)) < 0) -+ if(m_pBufferRef) -+ { -+ m_dllAvFilter.avfilter_unref_buffer(m_pBufferRef); -+ m_pBufferRef = NULL; -+ } -+ -+ if ((frames = m_dllAvFilter.av_buffersink_poll_frame(m_pFilterOut)) < 0) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_poll_frame"); - return VC_ERROR; -@@ -838,19 +792,9 @@ - - if (frames > 0) - { -- if (m_pFilterLink->cur_buf) -- { -- m_dllAvFilter.avfilter_unref_buffer(m_pFilterLink->cur_buf); -- m_pFilterLink->cur_buf = NULL; -- } -- -- if ((result = m_dllAvFilter.avfilter_request_frame(m_pFilterLink)) < 0) -- { -- CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - avfilter_request_frame"); -- return VC_ERROR; -- } - -- if (!m_pFilterLink->cur_buf) -+ result = m_dllAvFilter.av_buffersink_get_buffer_ref(m_pFilterOut, &m_pBufferRef, 0); -+ if(!m_pBufferRef) - { - CLog::Log(LOGERROR, "CDVDVideoCodecFFmpeg::FilterProcess - cur_buf"); - return VC_ERROR; -@@ -861,11 +805,11 @@ - else - m_pFrame->repeat_pict = -(frames - 1); - -- m_pFrame->interlaced_frame = m_pFilterLink->cur_buf->video->interlaced; -- m_pFrame->top_field_first = m_pFilterLink->cur_buf->video->top_field_first; -+ m_pFrame->interlaced_frame = m_pBufferRef->video->interlaced; -+ m_pFrame->top_field_first = m_pBufferRef->video->top_field_first; - -- memcpy(m_pFrame->linesize, m_pFilterLink->cur_buf->linesize, 4*sizeof(int)); -- memcpy(m_pFrame->data , m_pFilterLink->cur_buf->data , 4*sizeof(uint8_t*)); -+ memcpy(m_pFrame->linesize, m_pBufferRef->linesize, 4*sizeof(int)); -+ memcpy(m_pFrame->data , m_pBufferRef->data , 4*sizeof(uint8_t*)); - - if(frames > 1) - return VC_PICTURE; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-06-05 15:19:23.946496292 +0200 -@@ -68,27 +68,36 @@ - { - SAFE_RELEASE(m_pHardware); - m_pHardware = hardware; -- m_name += "-"; -- m_name += m_pHardware->Name(); -+ UpdateName(); - } - - protected: - static enum PixelFormat GetFormat(struct AVCodecContext * avctx, const PixelFormat * fmt); - -- int FilterOpen(const CStdString& filters); -+ int FilterOpen(const CStdString& filters, bool scale); - void FilterClose(); - int FilterProcess(AVFrame* frame); - -+ void UpdateName() -+ { -+ if(m_pCodecContext->codec->name) -+ m_name = CStdString("ff-") + m_pCodecContext->codec->name; -+ else -+ m_name = "ffmpeg"; -+ -+ if(m_pHardware) -+ m_name += "-" + m_pHardware->Name(); -+ } -+ - AVFrame* m_pFrame; - AVCodecContext* m_pCodecContext; - -- AVPicture* m_pConvertFrame; - CStdString m_filters; - CStdString m_filters_next; - AVFilterGraph* m_pFilterGraph; - AVFilterContext* m_pFilterIn; - AVFilterContext* m_pFilterOut; -- AVFilterLink* m_pFilterLink; -+ AVFilterBufferRef* m_pBufferRef; - - int m_iPictureWidth; - int m_iPictureHeight; -@@ -109,4 +118,5 @@ - int m_iLastKeyframe; - double m_dts; - bool m_started; -+ std::vector m_formats; - }; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp 2012-06-05 15:19:23.947496313 +0200 -@@ -525,8 +525,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -537,14 +537,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -590,26 +590,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -706,7 +706,7 @@ - } - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return false; - } -@@ -717,7 +717,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata then write it into avcCData for VDADecoder -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - // CFDataCreate makes a copy of extradata contents - avcCData = CFDataCreate(kCFAllocatorDefault, (const uint8_t*)extradata, extrasize); - // done with the converted extradata, we MUST free using av_free -@@ -948,12 +948,12 @@ - int demuxer_bytes; - uint8_t *demuxer_content; - -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - { - return VC_ERROR; - } - demuxer_bytes = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -@@ -961,7 +961,7 @@ - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -970,14 +970,14 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - - uint8_t *demuxer_content; -- int demuxer_bytes = m_dllAvFormat->url_close_dyn_buf(pb, &demuxer_content); -+ int demuxer_bytes = m_dllAvFormat->avio_close_dyn_buf(pb, &demuxer_content); - avc_demux = CFDataCreate(kCFAllocatorDefault, demuxer_content, demuxer_bytes); - m_dllAvUtil->av_free(demuxer_content); - } -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVideoToolBox.cpp 2012-06-05 15:19:23.949496352 +0200 -@@ -474,7 +474,7 @@ - { - b |= 0x80; - } -- av_format_ctx->put_byte(pb, b); -+ av_format_ctx->avio_w8(pb, b); - } - - return numBytes; -@@ -482,37 +482,37 @@ - - void quicktime_write_esds(DllAvFormat *av_format_ctx, ByteIOContext *pb, quicktime_esds_t *esds) - { -- av_format_ctx->put_byte(pb, 0); // Version -- av_format_ctx->put_be24(pb, 0); // Flags -+ av_format_ctx->avio_w8(pb, 0); // Version -+ av_format_ctx->avio_wb24(pb, 0); // Flags - - // elementary stream descriptor tag -- av_format_ctx->put_byte(pb, 0x03); -+ av_format_ctx->avio_w8(pb, 0x03); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 3 + 5 + (13 + 5 + esds->decoderConfigLen) + 3, false); - // 3 bytes + 5 bytes for tag -- av_format_ctx->put_be16(pb, esds->esid); -- av_format_ctx->put_byte(pb, esds->stream_priority); -+ av_format_ctx->avio_wb16(pb, esds->esid); -+ av_format_ctx->avio_w8(pb, esds->stream_priority); - - // decoder configuration description tag -- av_format_ctx->put_byte(pb, 0x04); -+ av_format_ctx->avio_w8(pb, 0x04); - quicktime_write_mp4_descr_length(av_format_ctx, pb, - 13 + 5 + esds->decoderConfigLen, false); - // 13 bytes + 5 bytes for tag -- av_format_ctx->put_byte(pb, esds->objectTypeId); // objectTypeIndication -- av_format_ctx->put_byte(pb, esds->streamType); // streamType -- av_format_ctx->put_be24(pb, esds->bufferSizeDB); // buffer size -- av_format_ctx->put_be32(pb, esds->maxBitrate); // max bitrate -- av_format_ctx->put_be32(pb, esds->avgBitrate); // average bitrate -+ av_format_ctx->avio_w8(pb, esds->objectTypeId); // objectTypeIndication -+ av_format_ctx->avio_w8(pb, esds->streamType); // streamType -+ av_format_ctx->avio_wb24(pb, esds->bufferSizeDB); // buffer size -+ av_format_ctx->avio_wb32(pb, esds->maxBitrate); // max bitrate -+ av_format_ctx->avio_wb32(pb, esds->avgBitrate); // average bitrate - - // decoder specific description tag -- av_format_ctx->put_byte(pb, 0x05); -+ av_format_ctx->avio_w8(pb, 0x05); - quicktime_write_mp4_descr_length(av_format_ctx, pb, esds->decoderConfigLen, false); -- av_format_ctx->put_buffer(pb, esds->decoderConfig, esds->decoderConfigLen); -+ av_format_ctx->avio_write(pb, esds->decoderConfig, esds->decoderConfigLen); - - // sync layer configuration descriptor tag -- av_format_ctx->put_byte(pb, 0x06); // tag -- av_format_ctx->put_byte(pb, 0x01); // length -- av_format_ctx->put_byte(pb, 0x7F); // no SL -+ av_format_ctx->avio_w8(pb, 0x06); // tag -+ av_format_ctx->avio_w8(pb, 0x01); // length -+ av_format_ctx->avio_w8(pb, 0x7F); // no SL - - /* no IPI_DescrPointer */ - /* no IP_IdentificationDataSet */ -@@ -666,8 +666,8 @@ - { - while (!*(nal_start++)); - nal_end = avc_find_startcode(nal_start, end); -- av_format_ctx->put_be32(pb, nal_end - nal_start); -- av_format_ctx->put_buffer(pb, nal_start, nal_end - nal_start); -+ av_format_ctx->avio_wb32(pb, nal_end - nal_start); -+ av_format_ctx->avio_write(pb, nal_start, nal_end - nal_start); - size += 4 + nal_end - nal_start; - nal_start = nal_end; - } -@@ -678,14 +678,14 @@ - const uint8_t *buf_in, uint8_t **buf, int *size) - { - ByteIOContext *pb; -- int ret = av_format_ctx->url_open_dyn_buf(&pb); -+ int ret = av_format_ctx->avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - avc_parse_nal_units(av_format_ctx, pb, buf_in, *size); - - av_util_ctx->av_freep(buf); -- *size = av_format_ctx->url_close_dyn_buf(pb, buf); -+ *size = av_format_ctx->avio_close_dyn_buf(pb, buf); - return 0; - } - -@@ -770,26 +770,26 @@ - } - assert(sps); - -- av_format_ctx->put_byte(pb, 1); /* version */ -- av_format_ctx->put_byte(pb, sps[1]); /* profile */ -- av_format_ctx->put_byte(pb, sps[2]); /* profile compat */ -- av_format_ctx->put_byte(pb, sps[3]); /* level */ -- av_format_ctx->put_byte(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -- av_format_ctx->put_byte(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ -+ av_format_ctx->avio_w8(pb, 1); /* version */ -+ av_format_ctx->avio_w8(pb, sps[1]); /* profile */ -+ av_format_ctx->avio_w8(pb, sps[2]); /* profile compat */ -+ av_format_ctx->avio_w8(pb, sps[3]); /* level */ -+ av_format_ctx->avio_w8(pb, 0xff); /* 6 bits reserved (111111) + 2 bits nal size length - 1 (11) */ -+ av_format_ctx->avio_w8(pb, 0xe1); /* 3 bits reserved (111) + 5 bits number of sps (00001) */ - -- av_format_ctx->put_be16(pb, sps_size); -- av_format_ctx->put_buffer(pb, sps, sps_size); -+ av_format_ctx->avio_wb16(pb, sps_size); -+ av_format_ctx->avio_write(pb, sps, sps_size); - if (pps) - { -- av_format_ctx->put_byte(pb, 1); /* number of pps */ -- av_format_ctx->put_be16(pb, pps_size); -- av_format_ctx->put_buffer(pb, pps, pps_size); -+ av_format_ctx->avio_w8(pb, 1); /* number of pps */ -+ av_format_ctx->avio_wb16(pb, pps_size); -+ av_format_ctx->avio_write(pb, pps, pps_size); - } - av_util_ctx->av_free(start); - } - else - { -- av_format_ctx->put_buffer(pb, data, len); -+ av_format_ctx->avio_write(pb, data, len); - } - } - return 0; -@@ -1086,7 +1086,7 @@ - ByteIOContext *pb; - quicktime_esds_t *esds; - -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - esds = quicktime_set_esds(m_dllAvFormat, extradata, extrasize); -@@ -1095,7 +1095,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the esds atom decoderConfig from extradata -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - free(esds->decoderConfig); - free(esds); - -@@ -1152,7 +1152,7 @@ - // NAL reformating to bitstream format required - - ByteIOContext *pb; -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return false; - - m_convert_bytestream = true; -@@ -1161,7 +1161,7 @@ - // unhook from ffmpeg's extradata - extradata = NULL; - // extract the avcC atom data into extradata getting size into extrasize -- extrasize = m_dllAvFormat->url_close_dyn_buf(pb, &extradata); -+ extrasize = m_dllAvFormat->avio_close_dyn_buf(pb, &extradata); - - // check for interlaced and get number of ref frames - if (!validate_avcC_spc(extradata, extrasize, &m_max_ref_frames)) -@@ -1301,17 +1301,17 @@ - if (m_convert_bytestream) - { - // convert demuxer packet from bytestream (AnnexB) to bitstream -- if(m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if(m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - demux_size = avc_parse_nal_units(m_dllAvFormat, pb, pData, iSize); -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else if (m_convert_3byteTo4byteNALSize) - { - // convert demuxer packet from 3 byte NAL sizes to 4 byte -- if (m_dllAvFormat->url_open_dyn_buf(&pb) < 0) -+ if (m_dllAvFormat->avio_open_dyn_buf(&pb) < 0) - return VC_ERROR; - - uint32_t nal_size; -@@ -1320,13 +1320,13 @@ - while (nal_start < end) - { - nal_size = VDA_RB24(nal_start); -- m_dllAvFormat->put_be32(pb, nal_size); -+ m_dllAvFormat->avio_wb32(pb, nal_size); - nal_start += 3; -- m_dllAvFormat->put_buffer(pb, nal_start, nal_size); -+ m_dllAvFormat->avio_write(pb, nal_start, nal_size); - nal_start += nal_size; - } - -- demux_size = m_dllAvFormat->url_close_dyn_buf(pb, &demux_buff); -+ demux_size = m_dllAvFormat->avio_close_dyn_buf(pb, &demux_buff); - sampleBuff = CreateSampleBufferFrom(m_fmt_desc, demux_buff, demux_size); - } - else -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp 2012-06-05 15:19:23.950496372 +0200 -@@ -223,7 +223,6 @@ - } - - pic->type = FF_BUFFER_TYPE_USER; -- pic->age = 1; - pic->data[0] = (uint8_t*)wrapper; - pic->data[1] = NULL; - pic->data[2] = NULL; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-06-05 15:19:23.951496392 +0200 -@@ -1197,14 +1197,12 @@ - - if(pic->reference) - { -- pic->age = pA->ip_age[0]; - pA->ip_age[0]= pA->ip_age[1]+1; - pA->ip_age[1]= 1; - pA->b_age++; - } - else - { -- pic->age = pA->b_age; - pA->ip_age[0]++; - pA->ip_age[1]++; - pA->b_age = 1; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-06-05 15:19:23.955496472 +0200 -@@ -160,7 +160,7 @@ - #define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) - #endif - --static int interrupt_cb(void) -+static int interrupt_cb(void* unused) - { - if(g_demuxer && g_demuxer->Aborted()) - return 1; -@@ -178,7 +178,7 @@ - - static int dvd_file_read(void *h, uint8_t* buf, int size) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -192,7 +192,7 @@ - */ - static offset_t dvd_file_seek(void *h, offset_t pos, int whence) - { -- if(interrupt_cb()) -+ if(interrupt_cb(NULL)) - return -1; - - CDVDInputStream* pInputStream = (CDVDInputStream*)h; -@@ -236,6 +236,7 @@ - m_speed = DVD_PLAYSPEED_NORMAL; - g_demuxer = this; - m_program = UINT_MAX; -+ const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; - - if (!pInput) return false; - -@@ -246,10 +247,6 @@ - - // register codecs - m_dllAvFormat.av_register_all(); -- m_dllAvFormat.url_set_interrupt_cb(interrupt_cb); -- -- // could be used for interupting ffmpeg while opening a file (eg internet streams) -- // url_set_interrupt_cb(NULL); - - m_pInput = pInput; - strFile = m_pInput->GetFileName(); -@@ -284,14 +281,14 @@ - // try mmsh, then mmst - CStdString strFile2; - strFile2.Format("mmsh://%s",strFile.substr(6,strFile.size()-6).c_str()); -- result = m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile2.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL); -+ result = m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile2.c_str(), iformat, NULL); - if (result < 0) - { - strFile = "mmst://"; - strFile += strFile2.Mid(7).c_str(); - } - } -- if (result < 0 && m_dllAvFormat.av_open_input_file(&m_pFormatContext, strFile.c_str(), iformat, FFMPEG_FILE_BUFFER_SIZE, NULL) < 0 ) -+ if (result < 0 && m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0 ) - { - CLog::Log(LOGDEBUG, "Error, could not open file %s", strFile.c_str()); - Dispose(); -@@ -301,24 +298,16 @@ - else - { - unsigned char* buffer = (unsigned char*)m_dllAvUtil.av_malloc(FFMPEG_FILE_BUFFER_SIZE); -- m_ioContext = m_dllAvFormat.av_alloc_put_byte(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); -+ m_ioContext = m_dllAvFormat.avio_alloc_context(buffer, FFMPEG_FILE_BUFFER_SIZE, 0, m_pInput, dvd_file_read, NULL, dvd_file_seek); - m_ioContext->max_packet_size = m_pInput->GetBlockSize(); - if(m_ioContext->max_packet_size) - m_ioContext->max_packet_size *= FFMPEG_FILE_BUFFER_SIZE / m_ioContext->max_packet_size; - - if(m_pInput->Seek(0, SEEK_POSSIBLE) == 0) -- m_ioContext->is_streamed = 1; -+ m_ioContext->seekable = 0; - - if( iformat == NULL ) - { --#if defined(USE_EXTERNAL_FFMPEG) && LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(52,98,0) -- // API added on: 2011-02-09 -- // Old versions of ffmpeg do not have av_probe_input_format, so we need -- // to always probe using the lower-level functions as well. -- const bool legacyProbing = true; --#else -- const bool legacyProbing = false; --#endif - // let ffmpeg decide which demuxer we have to open - - bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); -@@ -331,7 +320,7 @@ - // want to probe for spdif (DTS or IEC 61937) compressed audio - // specifically, or in case the file is a wav which may contain DTS or - // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. -- if (legacyProbing || trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) -+ if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) - { - AVProbeData pd; - BYTE probe_buffer[FFMPEG_FILE_BUFFER_SIZE + AVPROBE_PADDING_SIZE]; -@@ -341,7 +330,7 @@ - pd.filename = strFile.c_str(); - - // read data using avformat's buffers -- pd.buf_size = m_dllAvFormat.get_buffer(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); -+ pd.buf_size = m_dllAvFormat.avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : m_ioContext->buffer_size); - if (pd.buf_size <= 0) - { - CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, strFile.c_str()); -@@ -350,10 +339,7 @@ - memset(pd.buf+pd.buf_size, 0, AVPROBE_PADDING_SIZE); - - // restore position again -- m_dllAvFormat.url_fseek(m_ioContext , 0, SEEK_SET); -- -- if (legacyProbing && !trySPDIFonly) -- iformat = m_dllAvFormat.av_probe_input_format(&pd, 1); -+ m_dllAvFormat.avio_seek(m_ioContext , 0, SEEK_SET); - - // the advancedsetting is for allowing the user to force outputting the - // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode -@@ -424,7 +410,10 @@ - - - // open the demuxer -- if (m_dllAvFormat.av_open_input_stream(&m_pFormatContext, m_ioContext, strFile.c_str(), iformat, NULL) < 0) -+ m_pFormatContext = m_dllAvFormat.avformat_alloc_context(); -+ m_pFormatContext->pb = m_ioContext; -+ -+ if (m_dllAvFormat.avformat_open_input(&m_pFormatContext, strFile.c_str(), iformat, NULL) < 0) - { - CLog::Log(LOGERROR, "%s - Error, could not open file %s", __FUNCTION__, strFile.c_str()); - Dispose(); -@@ -432,8 +421,11 @@ - } - } - -+ // set the interrupt callback, appeared in libavformat 53.15.0 -+ m_pFormatContext->interrupt_callback = int_cb; -+ - // analyse very short to speed up mjpeg playback start -- if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->is_streamed) -+ if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) - m_pFormatContext->max_analyze_duration = 500000; - - // we need to know if this is matroska or avi later -@@ -447,8 +439,8 @@ - m_pFormatContext->max_analyze_duration = 500000; - - -- CLog::Log(LOGDEBUG, "%s - av_find_stream_info starting", __FUNCTION__); -- int iErr = m_dllAvFormat.av_find_stream_info(m_pFormatContext); -+ CLog::Log(LOGDEBUG, "%s - avformat_find_stream_info starting", __FUNCTION__); -+ int iErr = m_dllAvFormat.avformat_find_stream_info(m_pFormatContext, NULL); - if (iErr < 0) - { - CLog::Log(LOGWARNING,"could not find codec parameters for %s", strFile.c_str()); -@@ -471,7 +463,7 @@ - m_pFormatContext->flags |= AVFMT_FLAG_NONBLOCK; - - // print some extra information -- m_dllAvFormat.dump_format(m_pFormatContext, 0, strFile.c_str(), 0); -+ m_dllAvFormat.av_dump_format(m_pFormatContext, 0, strFile.c_str(), 0); - - UpdateCurrentPTS(); - -@@ -510,20 +502,12 @@ - - if (m_pFormatContext) - { -- if (m_ioContext) -+ if (m_ioContext && m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) - { -- if(m_pFormatContext->pb && m_pFormatContext->pb != m_ioContext) -- { -- CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -- m_ioContext = m_pFormatContext->pb; -- } -- m_dllAvFormat.av_close_input_stream(m_pFormatContext); -- if (m_ioContext->buffer) -- m_dllAvUtil.av_free(m_ioContext->buffer); -- m_dllAvUtil.av_free(m_ioContext); -+ CLog::Log(LOGWARNING, "CDVDDemuxFFmpeg::Dispose - demuxer changed our byte context behind our back, possible memleak"); -+ m_ioContext = m_pFormatContext->pb; - } -- else -- m_dllAvFormat.av_close_input_file(m_pFormatContext); -+ m_dllAvFormat.avformat_close_input(&m_pFormatContext); - } - m_ioContext = NULL; - m_pFormatContext = NULL; -@@ -773,19 +757,12 @@ - { - stream->duration = duration; - duration = m_dllAvUtil.av_rescale_rnd(stream->duration, (int64_t)stream->time_base.num * AV_TIME_BASE, stream->time_base.den, AV_ROUND_NEAR_INF); -- if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE && m_pFormatContext->file_size > 0) -+ if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE) - || (m_pFormatContext->duration != (int64_t)AV_NOPTS_VALUE && duration > m_pFormatContext->duration)) - m_pFormatContext->duration = duration; - } - } - -- // check if stream seem to have grown since start -- if(m_pFormatContext->file_size > 0 && m_pFormatContext->pb) -- { -- if(m_pFormatContext->pb->pos > m_pFormatContext->file_size) -- m_pFormatContext->file_size = m_pFormatContext->pb->pos; -- } -- - pPacket->iStreamId = pkt.stream_index; // XXX just for now - } - m_dllAvCodec.av_free_packet(&pkt); -@@ -923,19 +900,6 @@ - if (!m_pFormatContext) - return 0; - -- /* apperently ffmpeg messes up sometimes, so check for negative value too */ -- if (m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE || m_pFormatContext->duration < 0LL) -- { -- // no duration is available for us -- // try to calculate it -- int iLength = 0; -- if (m_iCurrentPts != DVD_NOPTS_VALUE && m_pFormatContext->file_size > 0 && m_pFormatContext->pb && m_pFormatContext->pb->pos > 0) -- { -- iLength = (int)(((m_iCurrentPts * m_pFormatContext->file_size) / m_pFormatContext->pb->pos) / 1000) & 0xFFFFFFFF; -- } -- return iLength; -- } -- - return (int)(m_pFormatContext->duration / (AV_TIME_BASE / 1000)); - } - -@@ -970,6 +934,12 @@ - - void CDVDDemuxFFmpeg::AddStream(int iId) - { -+ if(iId >= MAX_STREAMS) -+ { -+ CLog::Log(LOGWARNING, "%s - streams id %d exeeds maximum supported", __FUNCTION__, iId); -+ return; -+ } -+ - AVStream* pStream = m_pFormatContext->streams[iId]; - if (pStream) - { -@@ -987,8 +957,8 @@ - st->iBitRate = pStream->codec->bit_rate; - st->iBitsPerSample = pStream->codec->bits_per_coded_sample; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1077,8 +1047,8 @@ - if(pStream->codec) - st->identifier = pStream->codec->sub_id; - -- if(m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)) -- st->m_description = m_dllAvFormat.av_metadata_get(pStream->metadata, "title", NULL, 0)->value; -+ if(m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)) -+ st->m_description = m_dllAvUtil.av_dict_get(pStream->metadata, "title", NULL, 0)->value; - - break; - } -@@ -1089,7 +1059,7 @@ - { - std::string fileName = "special://temp/fonts/"; - XFILE::CDirectory::Create(fileName); -- AVMetadataTag *nameTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "filename", NULL, 0); -+ AVDictionaryEntry *nameTag = m_dllAvUtil.av_dict_get(pStream->metadata, "filename", NULL, 0); - if (!nameTag) { - CLog::Log(LOGERROR, "%s: TTF attachment has no name", __FUNCTION__); - break; -@@ -1138,7 +1108,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *langTag = m_dllAvFormat.av_metadata_get(pStream->metadata, "language", NULL, 0); -+ AVDictionaryEntry *langTag = m_dllAvUtil.av_dict_get(pStream->metadata, "language", NULL, 0); - if (langTag) - strncpy(m_streams[iId]->language, langTag->value, 3); - #else -@@ -1248,7 +1218,7 @@ - // API added on: 2010-10-15 - // (Note that while the function was available earlier, the generic - // metadata tags were not populated by default) -- AVMetadataTag *titleTag = m_dllAvFormat.av_metadata_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, -+ AVDictionaryEntry *titleTag = m_dllAvUtil.av_dict_get(m_pFormatContext->chapters[chapterIdx-1]->metadata, - "title", NULL, 0); - if (titleTag) - strChapterName = titleTag->value; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h 2012-06-05 15:19:23.956496492 +0200 -@@ -128,7 +128,7 @@ - #define MAX_STREAMS 100 - CDemuxStream* m_streams[MAX_STREAMS]; // maximum number of streams that ffmpeg can handle - -- ByteIOContext* m_ioContext; -+ AVIOContext* m_ioContext; - - DllAvFormat m_dllAvFormat; - DllAvCodec m_dllAvCodec; -diff -Naur xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-03-21 23:57:34.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-06-05 15:19:23.957496512 +0200 -@@ -413,6 +413,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - m_started = false; - } -@@ -420,6 +421,7 @@ - { - if(m_pVideoCodec) - m_pVideoCodec->Reset(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - - m_pullupCorrection.Flush(); -diff -Naur xbmc-11.0.1/xbmc/DllPaths_generated.h.in xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in ---- xbmc-11.0.1/xbmc/DllPaths_generated.h.in 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_generated.h.in 2012-06-05 15:19:23.957496512 +0200 -@@ -74,13 +74,13 @@ - #define DLL_PATH_LIBMAD "@MAD_SONAME@" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52-@ARCH@.so" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0-@ARCH@.so" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52-@ARCH@.so" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53-@ARCH@.so" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53-@ARCH@.so" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51-@ARCH@.so" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52-@ARCH@.so" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2-@ARCH@.so" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2-@ARCH@.so" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0-@ARCH@.so" - - /* cdrip */ - #if defined(_LINUX) && !defined(__APPLE__) -diff -Naur xbmc-11.0.1/xbmc/DllPaths_win32.h xbmc-11.0.1.patch/xbmc/DllPaths_win32.h ---- xbmc-11.0.1/xbmc/DllPaths_win32.h 2012-03-21 23:57:32.000000000 +0100 -+++ xbmc-11.0.1.patch/xbmc/DllPaths_win32.h 2012-06-05 15:19:23.958496532 +0200 -@@ -58,13 +58,13 @@ - #define DLL_PATH_LIBRTMP "special://xbmcbin/system/players/dvdplayer/librtmp.dll" - - /* ffmpeg */ --#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-52.dll" --#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll" --#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll" --#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll" --#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll" --#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll" --#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll" -+#define DLL_PATH_LIBAVCODEC "special://xbmcbin/system/players/dvdplayer/avcodec-53.dll" -+#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-53.dll" -+#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-51.dll" -+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-2.dll" -+#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-52.dll" -+#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-2.dll" -+#define DLL_PATH_LIBSWRESAMPLE "special://xbmcbin/system/players/dvdplayer/swresample-0.dll" - - /* cdrip */ - #define DLL_PATH_LAME_ENC "special://xbmcbin/system/cdrip/lame_enc.dll" diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch deleted file mode 100644 index 68c31b264ac..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.03-ffmpeg_crystalhd_implementation.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 5c62df65cb2ef1c7dcebbf07bd6d180960ab6715 Mon Sep 17 00:00:00 2001 -From: theuni -Date: Wed, 4 Apr 2012 14:53:51 -0400 -Subject: [PATCH] ffmpeg: disable ffmpeg's crystalhd implementation for now - ---- - configure.in | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/configure.in b/configure.in -index 0d80719..40e9fb5 100755 ---- a/configure.in -+++ b/configure.in -@@ -2041,6 +2041,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ - --disable-ffmpeg \ - --disable-doc \ - --disable-decoder=mpeg_xvmc \ -+ --disable-crystalhd \ - --enable-postproc \ - --enable-gpl \ - --enable-protocol=http \ -@@ -2080,6 +2081,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ - --disable-ffplay \ - --disable-ffserver \ - --disable-ffmpeg \ -+ --disable-crystalhd \ - --enable-shared \ - --disable-doc \ - --enable-postproc \ --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch deleted file mode 100644 index 04708b72199..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-901.41-avfilter-depends-on-avformat.patch +++ /dev/null @@ -1,41 +0,0 @@ -From d1e06c28d3eb6cd689b8cbc5b96babe81707baa7 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sun, 15 Apr 2012 14:00:22 +0200 -Subject: [PATCH] ffmpeg: avfilter depends on avformat - ---- - lib/DllAvFilter.h | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/lib/DllAvFilter.h b/lib/DllAvFilter.h -index 5c83654..6ae5d15 100644 ---- a/lib/DllAvFilter.h -+++ b/lib/DllAvFilter.h -@@ -25,6 +25,7 @@ - #endif - #include "DynamicDll.h" - #include "DllAvCodec.h" -+#include "DllAvFormat.h" - #include "DllSwResample.h" - #include "utils/log.h" - -@@ -203,6 +204,7 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface - /* dependencies of libavfilter */ - DllAvUtil m_dllAvUtil; - DllSwResample m_dllSwResample; -+ DllAvFormat m_dllAvFormat; - - public: - int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) -@@ -251,6 +253,8 @@ class DllAvFilter : public DllDynamic, DllAvFilterInterface - return false; - if (!m_dllSwResample.Load()) - return false; -+ if (!m_dllAvFormat.Load()) -+ return false; - return DllDynamic::Load(); - } - }; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch deleted file mode 100644 index 98a4fa1a775..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.01-xvba_support_vdpau_rework-c633159.patch +++ /dev/null @@ -1,14563 +0,0 @@ -diff -Naur xbmc-pvr-11.0.1/configure.in xbmc-pvr-11.0.1.patch/configure.in ---- xbmc-pvr-11.0.1/configure.in 2012-05-14 14:11:49.081856910 +0200 -+++ xbmc-pvr-11.0.1.patch/configure.in 2012-05-14 14:15:12.045218673 +0200 -@@ -98,6 +98,8 @@ - vaapi_disabled="== VAAPI support manually disabled. ==" - crystalhd_not_found="== Could not find libcrystalhd. CrystalHD support disabled. ==" - crystalhd_disabled="== CrystalHD support manually disabled. ==" -+xvba_not_found="== Could not find amdxvba.h. XVBA support disabled. ==" -+xvba_disabled="== XVBA support manually disabled. ==" - vdadecoder_enabled="== VDADecoder support enabled. ==" - vdadecoder_disabled="== VDADecoder support manually disabled. ==" - vtbdecoder_enabled="== VTBDecoder support enabled. ==" -@@ -204,6 +206,12 @@ - [enable CrystalHD decoding (default is auto)])], - [use_crystalhd=$enableval], - [use_crystalhd=auto]) -+ -+AC_ARG_ENABLE([xvba], -+ [AS_HELP_STRING([--enable-xvba], -+ [enable XVBA decoding (default is auto)])], -+ [use_xvba=$enableval], -+ [use_xvba=auto]) - - AC_ARG_ENABLE([vdadecoder], - [AS_HELP_STRING([--enable-vdadecoder], -@@ -1382,6 +1390,38 @@ - USE_CRYSTALHD=0 - fi - -+# XVBA -+if test "x$use_xvba" != "xno"; then -+ if test "$host_vendor" = "apple" ; then -+ if test "x$use_xvba" = "xyes"; then -+ AC_MSG_ERROR([XVBA not supported on this platform]) -+ else -+ use_xvba="no" -+ AC_MSG_NOTICE($xvba_disabled) -+ fi -+ USE_XVBA=0 -+ else -+ initial_val=$use_xvba -+ AC_CHECK_HEADER([amd/amdxvba.h],, use_xvba=no, [#include ]) -+ -+ if test "x$use_xvba" = "xno"; then -+ if test "x$initial_val" = "xyes"; then -+ AC_MSG_ERROR($xvba_not_found) -+ else -+ AC_MSG_RESULT($xvba_not_found) -+ fi -+ USE_XVBA=0 -+ else -+ AC_DEFINE([HAVE_LIBXVBA], [1], [Define to 1 if you have the 'xvba' header (amdxvba.h)]) -+ USE_XVBA=1 -+ fi -+ fi -+else -+ AC_MSG_NOTICE($xvba_disabled) -+ USE_XVBA=0 -+fi -+ -+ - # VDADecoder - if test "x$use_vdadecoder" != "xno"; then - if test "$host_vendor" = "apple" ; then -@@ -1578,6 +1618,12 @@ - final_message="$final_message\n CrystalHD:\tNo" - fi - -+if test "x$use_xvba" != "xno"; then -+ final_message="$final_message\n XVBA:\t\tYes" -+else -+ final_message="$final_message\n XVBA:\t\tNo" -+fi -+ - if test "x$use_vdadecoder" != "xno"; then - final_message="$final_message\n VDADecoder:\tYes" - else -@@ -1952,6 +1998,7 @@ - AC_SUBST(USE_VDPAU) - AC_SUBST(USE_VAAPI) - AC_SUBST(USE_CRYSTALHD) -+AC_SUBST(USE_XVBA) - AC_SUBST(USE_LIBSMBCLIENT) - AC_SUBST(USE_LIBNFS) - AC_SUBST(USE_LIBAFPCLIENT) -@@ -2094,6 +2141,7 @@ - --enable-gpl \ - `if test "x$use_vdpau" != "xno"; then echo --enable-vdpau; else echo --disable-vdpau; fi` \ - `if test "x$use_vaapi" != "xno"; then echo --enable-vaapi; else echo --disable-vaapi; fi` \ -+ `if test "x$use_xvba" != "xno"; then echo --enable-xvba; else echo --disable-xvba; fi` \ - --enable-protocol=http \ - --enable-pthreads \ - --enable-runtime-cpudetect \ -diff -Naur xbmc-pvr-11.0.1/language/Dutch/strings.xml xbmc-pvr-11.0.1.patch/language/Dutch/strings.xml ---- xbmc-pvr-11.0.1/language/Dutch/strings.xml 2012-05-14 14:14:51.670808009 +0200 -+++ xbmc-pvr-11.0.1.patch/language/Dutch/strings.xml 2012-05-14 14:15:12.051218793 +0200 -@@ -1236,7 +1236,8 @@ - Hardwareversnelling inschakelen (OpenMax) - Pixelshaders - Hardware acceleratie toestaan (VideoToolbox) -- -+ Vdpau OpenGL interop RGB inschakelen -+ Vdpau OpenGL interop YUV inschakelen - A/V-synchronisatiemethode - Audiosignaal - Videosignaal (Drop/Dupe audio) -@@ -1542,6 +1543,7 @@ - Spline36 - Spline36 geoptimaliseerd - Software menging -+ VDPAU Bob - - Kwaliteitsverbetering video - -diff -Naur xbmc-pvr-11.0.1/language/English/strings.xml xbmc-pvr-11.0.1.patch/language/English/strings.xml ---- xbmc-pvr-11.0.1/language/English/strings.xml 2012-05-14 14:14:51.673808069 +0200 -+++ xbmc-pvr-11.0.1.patch/language/English/strings.xml 2012-05-14 14:15:12.053218833 +0200 -@@ -1234,6 +1234,9 @@ - Allow hardware acceleration (OpenMax) - Pixel Shaders - Allow hardware acceleration (VideoToolbox) -+ Allow Vdpau OpenGL interop RGB -+ Allow Vdpau OpenGL interop YUV -+ Allow hardware acceleration (XVBA) - - A/V sync method - Audio clock -@@ -1540,6 +1543,8 @@ - Spline36 - Spline36 optimized - Software Blend -+ VDPAU Bob -+ XVBA - - Post-processing - -diff -Naur xbmc-pvr-11.0.1/language/German/strings.xml xbmc-pvr-11.0.1.patch/language/German/strings.xml ---- xbmc-pvr-11.0.1/language/German/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/German/strings.xml 2012-05-14 14:15:12.059218956 +0200 -@@ -1268,6 +1268,8 @@ - Hardwarebeschleunigung erlauben (OpenMax) - Pixel Shaders - Hardwarebeschleunigung erlauben (VideoToolbox) -+ Vdpau OpenGL interop RGB erlauben -+ Vdpau OpenGL interop YUV erlauben - - A/V Sync Methode - Audio Takt -@@ -1567,6 +1569,7 @@ - Zeitlich (Hälfte) - Zeitlich/Räumlich (Hälfte) - DXVA -+ VDPAU Bob - - Video Nachbearbeitung - Deaktiviert -diff -Naur xbmc-pvr-11.0.1/language/Swedish/strings.xml xbmc-pvr-11.0.1.patch/language/Swedish/strings.xml ---- xbmc-pvr-11.0.1/language/Swedish/strings.xml 2012-03-27 17:55:51.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/language/Swedish/strings.xml 2012-05-14 14:15:12.062219016 +0200 -@@ -1412,6 +1412,7 @@ - Spline36 - Spline36-optimerad - Mjukvarublandning -+ VDPAU Bob - Efterbearbetning - Visa insommningstimeout - Byt till kanal -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/extract.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/extract.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/extract.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/extract.cpp 2012-05-14 14:15:12.095219681 +0200 -@@ -1,9 +1,5 @@ - #include "rar.hpp" - #include "Util.h" --#ifdef _LINUX --#include "XSyncUtils.h" --#include "XEventUtils.h" --#endif - - // a cautious wrapper around strncpy - char *strncpy_null_terminated(char *dest, const char *src, size_t n) -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/unpack15.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack15.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/unpack15.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack15.cpp 2012-05-14 14:15:12.095219681 +0200 -@@ -1,7 +1,3 @@ --#ifdef _LINUX --#include "XSyncUtils.h" --#endif -- - #define STARTL1 2 - static unsigned int DecL1[]={0x8000,0xa000,0xc000,0xd000,0xe000,0xea00, - 0xee00,0xf000,0xf200,0xf200,0xffff}; -diff -Naur xbmc-pvr-11.0.1/lib/UnrarXLib/unpack.cpp xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack.cpp ---- xbmc-pvr-11.0.1/lib/UnrarXLib/unpack.cpp 2012-03-27 17:55:39.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/lib/UnrarXLib/unpack.cpp 2012-05-14 14:15:12.096219701 +0200 -@@ -8,11 +8,6 @@ - #include "unpack20.cpp" - #endif - --#ifdef _LINUX --#include "XSyncUtils.h" --#include "XEventUtils.h" --#endif -- - Unpack::Unpack(ComprDataIO *DataIO) - { - UnpIO=DataIO; -diff -Naur xbmc-pvr-11.0.1/system/shaders/yuv2rgb_basic.glsl xbmc-pvr-11.0.1.patch/system/shaders/yuv2rgb_basic.glsl ---- xbmc-pvr-11.0.1/system/shaders/yuv2rgb_basic.glsl 2012-03-27 17:55:54.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/system/shaders/yuv2rgb_basic.glsl 2012-05-14 14:15:12.097219721 +0200 -@@ -70,6 +70,18 @@ - rgb.a = gl_Color.a; - gl_FragColor = rgb; - -+#elif defined(XBMC_VDPAU_NV12) -+ -+ vec4 yuv, rgb; -+ yuv.rgba = vec4( texture2D(m_sampY, stretch(m_cordY)).r -+ , texture2D(m_sampU, stretch(m_cordU)).r -+ , texture2D(m_sampV, stretch(m_cordV)).g -+ , 1.0 ); -+ -+ rgb = m_yuvmat * yuv; -+ rgb.a = gl_Color.a; -+ gl_FragColor = rgb; -+ - #elif defined(XBMC_YUY2) || defined(XBMC_UYVY) - - #if(XBMC_texture_rectangle) -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.cpp xbmc-pvr-11.0.1.patch/xbmc/Application.cpp ---- xbmc-pvr-11.0.1/xbmc/Application.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.cpp 2012-05-14 14:15:12.101219801 +0200 -@@ -391,8 +391,6 @@ - #endif - m_currentStack = new CFileItemList; - -- m_frameCount = 0; -- - m_bPresentFrame = false; - m_bPlatformDirectories = true; - -@@ -2026,28 +2024,18 @@ - - bool CApplication::WaitFrame(unsigned int timeout) - { -- bool done = false; -- - // Wait for all other frames to be presented -- CSingleLock lock(m_frameMutex); -- //wait until event is set, but modify remaining time -+ m_frameEvent.Reset(); - -- TightConditionVariable > cv(m_frameCond, InversePredicate(m_frameCount)); -- cv.wait(lock,timeout); -- done = m_frameCount == 0; -+ if (!g_renderManager.HasFrame() && !m_frameEvent.WaitMSec(timeout)) -+ return false; - -- return done; -+ return g_renderManager.HasFrame(); - } - - void CApplication::NewFrame() - { -- // We just posted another frame. Keep track and notify. -- { -- CSingleLock lock(m_frameMutex); -- m_frameCount++; -- } -- -- m_frameCond.notifyAll(); -+ m_frameEvent.Set(); - } - - void CApplication::Render() -@@ -2081,12 +2069,13 @@ - m_bPresentFrame = false; - if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !IsPaused()) - { -- CSingleLock lock(m_frameMutex); -- -- TightConditionVariable cv(m_frameCond,m_frameCount); -- cv.wait(lock,100); -+ uint64_t timeout = CurrentHostCounter() + CurrentHostFrequency()/10; -+ while (!g_renderManager.HasFrame() && CurrentHostCounter() < timeout) -+ { -+ m_frameEvent.WaitMSec(100); -+ } -+ m_bPresentFrame = g_renderManager.HasFrame(); - -- m_bPresentFrame = m_frameCount > 0; - decrement = m_bPresentFrame; - hasRendered = true; - } -@@ -2169,18 +2158,14 @@ - m_lastFrameTime = XbmcThreads::SystemClockMillis(); - - if (flip) -+ { - g_graphicsContext.Flip(dirtyRegions); -+ g_renderManager.NotifyDisplayFlip(); -+ } - CTimeUtils::UpdateFrameTime(flip); - - g_renderManager.UpdateResolution(); - g_renderManager.ManageCaptures(); -- -- { -- CSingleLock lock(m_frameMutex); -- if(m_frameCount > 0 && decrement) -- m_frameCount--; -- } -- m_frameCond.notifyAll(); - } - - void CApplication::SetStandAlone(bool value) -@@ -5399,12 +5384,6 @@ - // See if we're playing a video, and are in GUI mode - if ( IsPlayingVideo() && g_windowManager.GetActiveWindow() != WINDOW_FULLSCREEN_VIDEO) - { -- // Reset frame count so that timing is FPS will be correct. -- { -- CSingleLock lock(m_frameMutex); -- m_frameCount = 0; -- } -- - // then switch to fullscreen mode - g_windowManager.ActivateWindow(WINDOW_FULLSCREEN_VIDEO); - return true; -@@ -5580,7 +5559,6 @@ - - bool CApplication::IsPresentFrame() - { -- CSingleLock lock(m_frameMutex); - bool ret = m_bPresentFrame; - - return ret; -diff -Naur xbmc-pvr-11.0.1/xbmc/Application.h xbmc-pvr-11.0.1.patch/xbmc/Application.h ---- xbmc-pvr-11.0.1/xbmc/Application.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/Application.h 2012-05-14 14:15:12.102219821 +0200 -@@ -351,9 +351,7 @@ - bool m_bTestMode; - bool m_bSystemScreenSaverEnable; - -- int m_frameCount; -- CCriticalSection m_frameMutex; -- XbmcThreads::ConditionVariable m_frameCond; -+ CEvent m_frameEvent; - - void Mute(); - void UnMute(); -diff -Naur xbmc-pvr-11.0.1/xbmc/ApplicationMessenger.cpp xbmc-pvr-11.0.1.patch/xbmc/ApplicationMessenger.cpp ---- xbmc-pvr-11.0.1/xbmc/ApplicationMessenger.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/ApplicationMessenger.cpp 2012-05-14 14:15:12.106219903 +0200 -@@ -75,7 +75,7 @@ - - using namespace std; - --CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) -+CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) : CThread("CDelayedMessage") - { - m_msg.dwMessage = msg.dwMessage; - m_msg.dwParam1 = msg.dwParam1; -diff -Naur xbmc-pvr-11.0.1/xbmc/cdrip/CDDAReader.cpp xbmc-pvr-11.0.1.patch/xbmc/cdrip/CDDAReader.cpp ---- xbmc-pvr-11.0.1/xbmc/cdrip/CDDAReader.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cdrip/CDDAReader.cpp 2012-05-14 14:15:12.106219903 +0200 -@@ -29,7 +29,7 @@ - - #define SECTOR_COUNT 52 - --CCDDAReader::CCDDAReader() -+CCDDAReader::CCDDAReader() : CThread("CCDDAReader") - { - m_sRipBuffer[0].pbtStream = NULL; - m_sRipBuffer[1].pbtStream = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-05-14 14:15:12.107219923 +0200 -@@ -240,15 +240,6 @@ - #endif - } - --extern "C" BOOL WINAPI dllGetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime) --{ -- // since the xbox has only one process, we just take the current thread -- HANDLE h = GetCurrentThread(); -- BOOL res = GetThreadTimes(h, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); -- -- return res; --} -- - extern "C" int WINAPI dllDuplicateHandle(HANDLE hSourceProcessHandle, // handle to source process - HANDLE hSourceHandle, // handle to duplicate - HANDLE hTargetProcessHandle, // handle to target process -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.h xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h ---- xbmc-pvr-11.0.1/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-05-14 14:15:12.108219943 +0200 -@@ -686,7 +686,6 @@ - - extern "C" HGLOBAL WINAPI dllLoadResource(HMODULE module, HRSRC res); - extern "C" HRSRC WINAPI dllFindResourceA(HMODULE module, LPCTSTR name, LPCTSTR type); --extern "C" BOOL WINAPI dllGetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime); - extern "C" int WINAPI dllGetLocaleInfoA(LCID Locale, LCTYPE LCType, LPTSTR lpLCData, int cchData); - extern "C" UINT WINAPI dllGetConsoleCP(); - extern "C" UINT WINAPI dllGetConsoleOutputCP(); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/DummyVideoPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/DummyVideoPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/DummyVideoPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/DummyVideoPlayer.cpp 2012-05-14 14:15:12.109219963 +0200 -@@ -33,7 +33,7 @@ - - CDummyVideoPlayer::CDummyVideoPlayer(IPlayerCallback& callback) - : IPlayer(callback), -- CThread() -+ CThread("CDummyVideoPlayer") - { - m_paused = false; - m_clock = 0; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-05-14 14:15:12.111220003 +0200 -@@ -325,7 +325,7 @@ - #pragma mark - - #endif - CMPCOutputThread::CMPCOutputThread(void *device, DllLibCrystalHD *dll, bool has_bcm70015) : -- CThread(), -+ CThread("CMPCOutputThread"), - m_dll(dll), - m_device(device), - m_has_bcm70015(has_bcm70015), -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-05-14 14:11:52.781931376 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-05-14 14:32:47.792343580 +0200 -@@ -56,6 +56,9 @@ - #ifdef HAVE_LIBVA - #include "VAAPI.h" - #endif -+#ifdef HAVE_LIBXVBA -+#include "XVBA.h" -+#endif - - using namespace boost; - -@@ -71,14 +74,14 @@ - while(*cur != PIX_FMT_NONE) - { - #ifdef HAVE_LIBVDPAU -- if(CVDPAU::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.usevdpau")) -+ if(VDPAU::CDecoder::IsVDPAUFormat(*cur) && g_guiSettings.GetBool("videoplayer.usevdpau")) - { - if(ctx->GetHardware()) - return *cur; - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::GetFormat - Creating VDPAU(%ix%i)", avctx->width, avctx->height); -- CVDPAU* vdp = new CVDPAU(); -- if(vdp->Open(avctx, *cur)) -+ VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); -+ if(vdp->Open(avctx, *cur, ctx->m_uSurfacesCount)) - { - ctx->SetHardware(vdp); - return *cur; -@@ -100,6 +103,19 @@ - dec->Release(); - } - #endif -+#ifdef HAVE_LIBXVBA -+ if(*cur == PIX_FMT_XVBA_VLD && g_guiSettings.GetBool("videoplayer.usexvba")) -+ { -+ XVBA::CDecoder* dec = new XVBA::CDecoder(); -+ if(dec->Open(avctx, *cur)) -+ { -+ ctx->SetHardware(dec); -+ return *cur; -+ } -+ else -+ dec->Release(); -+ } -+#endif - #ifdef HAVE_LIBVA - // mpeg4 vaapi decoding is disabled - if(*cur == PIX_FMT_VAAPI_VLD && g_guiSettings.GetBool("videoplayer.usevaapi") -@@ -141,6 +157,7 @@ - m_iLastKeyframe = 0; - m_dts = DVD_NOPTS_VALUE; - m_started = false; -+ m_decoderPts = DVD_NOPTS_VALUE; - } - - CDVDVideoCodecFFmpeg::~CDVDVideoCodecFFmpeg() -@@ -198,14 +215,26 @@ - continue; - - CLog::Log(LOGNOTICE,"CDVDVideoCodecFFmpeg::Open() Creating VDPAU(%ix%i, %d)",hints.width, hints.height, hints.codec); -- CVDPAU* vdp = new CVDPAU(); -+ VDPAU::CDecoder* vdp = new VDPAU::CDecoder(); - m_pCodecContext = m_dllAvCodec.avcodec_alloc_context3(pCodec); - m_pCodecContext->codec_id = hints.codec; - m_pCodecContext->width = hints.width; - m_pCodecContext->height = hints.height; - m_pCodecContext->coded_width = hints.width; - m_pCodecContext->coded_height = hints.height; -- if(vdp->Open(m_pCodecContext, pCodec->pix_fmts ? pCodec->pix_fmts[0] : PIX_FMT_NONE)) -+ -+ // check number of surfaces used in renderer -+ unsigned int surfaces = 0; -+ for(CDVDCodecOptions::iterator it = options.begin(); it != options.end(); it++) -+ { -+ if (it->m_name == "surfaces") -+ { -+ surfaces = std::atoi(it->m_value.c_str()); -+ break; -+ } -+ } -+ -+ if(vdp->Open(m_pCodecContext, pCodec->pix_fmts ? pCodec->pix_fmts[0] : PIX_FMT_NONE, surfaces)) - { - m_pHardware = vdp; - m_pCodecContext->codec_id = CODEC_ID_NONE; // ffmpeg will complain if this has been set -@@ -333,6 +362,14 @@ - { - if( m_pCodecContext ) - { -+ if (bDrop && m_pHardware && m_pHardware->CanSkipDeint()) -+ { -+ m_requestSkipDeint = true; -+ bDrop = false; -+ } -+ else -+ m_requestSkipDeint = false; -+ - // i don't know exactly how high this should be set - // couldn't find any good docs on it. think it varies - // from codec to codec on what it does -@@ -515,6 +552,7 @@ - void CDVDVideoCodecFFmpeg::Reset() - { - m_started = false; -+ m_decoderPts = DVD_NOPTS_VALUE; - m_iLastKeyframe = m_pCodecContext->has_b_frames; - m_dllAvCodec.avcodec_flush_buffers(m_pCodecContext); - -@@ -608,6 +646,22 @@ - else - pDvdVideoPicture->pts = DVD_NOPTS_VALUE; - -+ if (pDvdVideoPicture->pts != DVD_NOPTS_VALUE) -+ m_decoderPts = pDvdVideoPicture->pts; -+ else -+ m_decoderPts = m_dts; -+ -+ if (m_requestSkipDeint) -+ { -+ pDvdVideoPicture->iFlags |= DVP_FLAG_DROPDEINT; -+ m_skippedDeint = 1; -+ } -+ else -+ m_skippedDeint = 0; -+ -+ m_requestSkipDeint = false; -+ pDvdVideoPicture->iFlags |= m_codecControlState; -+ - if(!m_started) - pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; - -@@ -827,3 +881,14 @@ - else - return 0; - } -+ -+void CDVDVideoCodecFFmpeg::SetSpeed(int speed) -+{ -+ if (m_pHardware) -+ m_pHardware->SetSpeed(speed); -+} -+ -+void CDVDVideoCodecFFmpeg::SetCodecControl(int state) -+{ -+ m_codecControlState = state; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-05-14 14:11:52.782931396 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h 2012-05-14 14:30:28.105682654 +0200 -@@ -29,7 +29,6 @@ - #include "DllSwScale.h" - #include "DllAvFilter.h" - --class CVDPAU; - class CCriticalSection; - - class CDVDVideoCodecFFmpeg : public CDVDVideoCodec -@@ -45,6 +44,8 @@ - virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) = 0; - virtual int Check (AVCodecContext* avctx) = 0; - virtual void Reset () {} -+ virtual bool CanSkipDeint() {return false; } -+ virtual void SetSpeed(int speed) {} - virtual const std::string Name() = 0; - virtual CCriticalSection* Section() { return NULL; } - }; -@@ -61,6 +62,9 @@ - virtual unsigned int SetFilters(unsigned int filters); - virtual const char* GetName() { return m_name.c_str(); }; // m_name is never changed after open - virtual unsigned GetConvergeCount(); -+ virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) {pts=m_decoderPts; skippedDeint=m_skippedDeint; if (m_pFrame) interlaced = m_pFrame->interlaced_frame; return true;} -+ virtual void SetSpeed(int speed); -+ virtual void SetCodecControl(int state); - - bool IsHardwareAllowed() { return !m_bSoftware; } - IHardwareDecoder * GetHardware() { return m_pHardware; }; -@@ -118,5 +122,9 @@ - int m_iLastKeyframe; - double m_dts; - bool m_started; -+ double m_decoderPts, m_decoderInterval; -+ int m_skippedDeint; -+ bool m_requestSkipDeint; -+ int m_codecControlState; - std::vector m_formats; - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-05-14 14:15:12.117220123 +0200 -@@ -34,7 +34,8 @@ - - namespace DXVA { class CSurfaceContext; } - namespace VAAPI { struct CHolder; } --class CVDPAU; -+namespace VDPAU { class CVdpauRenderPicture; } -+namespace XVBA { class CXvbaRenderPicture; } - class COpenMax; - class COpenMaxVideo; - struct OpenMaxVideoBuffer; -@@ -59,11 +60,14 @@ - DXVA::CSurfaceContext* context; - }; - struct { -- CVDPAU* vdpau; -+ VDPAU::CVdpauRenderPicture* vdpau; - }; - struct { - VAAPI::CHolder* vaapi; - }; -+ struct { -+ XVBA::CXvbaRenderPicture* xvba; -+ }; - - struct { - COpenMax *openMax; -@@ -102,6 +106,7 @@ - enum EFormat { - FMT_YUV420P = 0, - FMT_VDPAU, -+ FMT_VDPAU_420, - FMT_NV12, - FMT_UYVY, - FMT_YUY2, -@@ -109,6 +114,7 @@ - FMT_VAAPI, - FMT_OMXEGL, - FMT_CVBREF, -+ FMT_XVBA, - } format; - }; - -@@ -125,6 +131,10 @@ - - #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped - #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data -+#define DVP_FLAG_DROPDEINT 0x00000040 // indicate that this picture was requested to have been dropped in deint stage -+ -+#define DVP_FLAG_SKIP_PROC 0x00000100 -+#define DVP_FLAG_DRAIN 0x00000200 - - // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2! - -@@ -143,6 +153,10 @@ - #define VC_PICTURE 0x00000004 // the decoder got a picture, call Decode(NULL, 0) again to parse the rest of the data - #define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data - #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again -+#define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped -+#define VC_HURRY 0x00000040 -+#define VC_SKIPPROC 0x00000080 -+ - class CDVDVideoCodec - { - public: -@@ -207,7 +221,6 @@ - */ - virtual void SetDropState(bool bDrop) = 0; - -- - enum EFilterFlags { - FILTER_NONE = 0x0, - FILTER_DEINTERLACE_YADIF = 0x1, /* use first deinterlace mode */ -@@ -237,4 +250,16 @@ - { - return 0; - } -+ -+ virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) -+ { -+ return false; -+ } -+ -+ virtual void SetSpeed(int speed) -+ { -+ return; -+ } -+ -+ virtual void SetCodecControl(int state) {} - }; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-05-14 14:15:12.118220144 +0200 -@@ -17,6 +17,10 @@ - DVDVideoCodecCrystalHD.cpp \ - - endif -+ifeq (@USE_XVBA@,1) -+SRCS+= XVBA.cpp \ -+ -+endif - ifeq (@USE_VDA@,1) - SRCS+= DVDVideoCodecVDA.cpp \ - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-05-14 14:14:51.682808251 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp 2012-05-14 14:15:12.128220346 +0200 -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2005-2009 Team XBMC -+ * Copyright (C) 2005-2011 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify -@@ -33,11 +33,16 @@ - #include "settings/AdvancedSettings.h" - #include "Application.h" - #include "utils/MathUtils.h" -+#include "utils/TimeUtils.h" - #include "DVDCodecs/DVDCodecUtils.h" -+#include "cores/VideoRenderers/RenderFlags.h" -+ -+using namespace VDPAU; -+#define NUM_RENDER_PICS 9 - - #define ARSIZE(x) (sizeof(x) / sizeof((x)[0])) - --CVDPAU::Desc decoder_profiles[] = { -+CDecoder::Desc decoder_profiles[] = { - {"MPEG1", VDP_DECODER_PROFILE_MPEG1}, - {"MPEG2_SIMPLE", VDP_DECODER_PROFILE_MPEG2_SIMPLE}, - {"MPEG2_MAIN", VDP_DECODER_PROFILE_MPEG2_MAIN}, -@@ -51,14 +56,16 @@ - {"MPEG4_PART2_ASP", VDP_DECODER_PROFILE_MPEG4_PART2_ASP}, - #endif - }; --const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CVDPAU::Desc); -+const size_t decoder_profile_count = sizeof(decoder_profiles)/sizeof(CDecoder::Desc); - --static float studioCSC[3][4] = --{ -- { 1.0f, 0.0f, 1.57480000f,-0.78740000f}, -- { 1.0f,-0.18737736f,-0.46813736f, 0.32775736f}, -- { 1.0f, 1.85556000f, 0.0f,-0.92780000f} --}; -+//static float studioCSC[3][4] = -+//{ -+// { 1.0f, 0.0f, 1.57480000f,-0.78740000f}, -+// { 1.0f,-0.18737736f,-0.46813736f, 0.32775736f}, -+// { 1.0f, 1.85556000f, 0.0f,-0.92780000f} -+//}; -+static float studioCSCKCoeffs601[3] = {0.299, 0.587, 0.114}; //BT601 {Kr, Kg, Kb} -+static float studioCSCKCoeffs709[3] = {0.2126, 0.7152, 0.0722}; //BT709 {Kr, Kg, Kb} - - static struct SInterlaceMapping - { -@@ -69,59 +76,32 @@ - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL} - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL} - , {VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL} --, {VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE} -+, {VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE} - , {VS_INTERLACEMETHOD_NONE , (VdpVideoMixerFeature)-1} - }; - - //since libvdpau 0.4, vdp_device_create_x11() installs a callback on the Display*, - //if we unload libvdpau with dlclose(), we segfault on XCloseDisplay, - //so we just keep a static handle to libvdpau around --void* CVDPAU::dl_handle; -- --CVDPAU::CVDPAU() --{ -- glXBindTexImageEXT = NULL; -- glXReleaseTexImageEXT = NULL; -- vdp_device = VDP_INVALID_HANDLE; -- surfaceNum = presentSurfaceNum = 0; -- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -- vdpauConfigured = false; -- m_DisplayState = VDPAU_OPEN; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -- m_mixerstep = 0; -+void* CDecoder::dl_handle; - -- m_glPixmap = 0; -- m_Pixmap = 0; -- if (!glXBindTexImageEXT) -- glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); -- if (!glXReleaseTexImageEXT) -- glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT"); -- -- totalAvailableOutputSurfaces = 0; -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- vdp_flip_target = VDP_INVALID_HANDLE; -- vdp_flip_queue = VDP_INVALID_HANDLE; -- vid_width = vid_height = OutWidth = OutHeight = 0; -- memset(&outRect, 0, sizeof(VdpRect)); -- memset(&outRectVid, 0, sizeof(VdpRect)); -- -- tmpBrightness = 0; -- tmpContrast = 0; -- tmpDeintMode = 0; -- tmpDeintGUI = 0; -- tmpDeint = 0; -- max_references = 0; -- -- for (int i = 0; i < NUM_OUTPUT_SURFACES; i++) -- outputSurfaces[i] = VDP_INVALID_HANDLE; -+//----------------------------------------------------------------------------- -+// CVDPAU -+//----------------------------------------------------------------------------- - -- videoMixer = VDP_INVALID_HANDLE; -- m_BlackBar = NULL; -+CDecoder::CDecoder() : m_vdpauOutput(&m_inMsgEvent) -+{ -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; -+ m_vdpauConfig.videoSurfaces = &m_videoSurfaces; -+ m_vdpauConfig.videoSurfaceSec = &m_videoSurfaceSec; - -- upScale = g_advancedSettings.m_videoVDPAUScaling; -+ m_picAge.b_age = m_picAge.ip_age[0] = m_picAge.ip_age[1] = 256*256*256*64; -+ m_vdpauConfigured = false; -+ m_DisplayState = VDPAU_OPEN; -+ m_speed = DVD_PLAYSPEED_NORMAL; - } - --bool CVDPAU::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) -+bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) - { - if(avctx->coded_width == 0 - || avctx->coded_height == 0) -@@ -129,6 +109,8 @@ - CLog::Log(LOGWARNING,"(VDPAU) no width/height available, can't init"); - return false; - } -+ m_vdpauConfig.numRenderBuffers = surfaces; -+ m_decoderThread = CThread::GetCurrentThreadId(); - - if (!dl_handle) - { -@@ -140,8 +122,6 @@ - error = "dlerror() returned NULL"; - - CLog::Log(LOGNOTICE,"(VDPAU) Unable to get handle to libvdpau: %s", error); -- //g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Error, "VDPAU", error, 10000); -- - return false; - } - } -@@ -150,8 +130,9 @@ - return false; - - InitVDPAUProcs(); -+ m_presentPicture = 0; - -- if (vdp_device != VDP_INVALID_HANDLE) -+ if (m_vdpauConfig.vdpDevice != VDP_INVALID_HANDLE) - { - SpewHardwareAvailable(); - -@@ -169,25 +150,23 @@ - - /* attempt to create a decoder with this width/height, some sizes are not supported by hw */ - VdpStatus vdp_st; -- vdp_st = vdp_decoder_create(vdp_device, profile, avctx->coded_width, avctx->coded_height, 5, &decoder); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_create(m_vdpauConfig.vdpDevice, profile, avctx->coded_width, avctx->coded_height, 5, &m_vdpauConfig.vdpDecoder); - - if(vdp_st != VDP_STATUS_OK) - { -- CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) checking for decoder support\n", vdp_get_error_string(vdp_st), vdp_st); -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) checking for decoder support\n", m_vdpauConfig.vdpProcs.vdp_get_error_string(vdp_st), vdp_st); - FiniVDPAUProcs(); - return false; - } - -- vdp_decoder_destroy(decoder); -+ m_vdpauConfig.vdpProcs.vdp_decoder_destroy(m_vdpauConfig.vdpDecoder); - CheckStatus(vdp_st, __LINE__); - } - -- InitCSCMatrix(avctx->coded_height); -- - /* finally setup ffmpeg */ -- avctx->get_buffer = CVDPAU::FFGetBuffer; -- avctx->release_buffer = CVDPAU::FFReleaseBuffer; -- avctx->draw_horiz_band = CVDPAU::FFDrawSlice; -+ avctx->get_buffer = CDecoder::FFGetBuffer; -+ avctx->release_buffer = CDecoder::FFReleaseBuffer; -+ avctx->draw_horiz_band = CDecoder::FFDrawSlice; - avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; - - g_Windowing.Register(this); -@@ -196,17 +175,20 @@ - return false; - } - --CVDPAU::~CVDPAU() -+CDecoder::~CDecoder() - { - Close(); - } - --void CVDPAU::Close() -+void CDecoder::Close() - { - CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); - -+ CSingleLock lock(m_DecoderSection); -+ - FiniVDPAUOutput(); - FiniVDPAUProcs(); -+ m_vdpauOutput.Dispose(); - - while (!m_videoSurfaces.empty()) - { -@@ -222,188 +204,118 @@ - m_dllAvUtil.Unload(); - } - --bool CVDPAU::MakePixmapGL() -+long CDecoder::Release() - { -- int num=0; -- int fbConfigIndex = 0; -- -- int doubleVisAttributes[] = { -- GLX_RENDER_TYPE, GLX_RGBA_BIT, -- GLX_RED_SIZE, 8, -- GLX_GREEN_SIZE, 8, -- GLX_BLUE_SIZE, 8, -- GLX_ALPHA_SIZE, 8, -- GLX_DEPTH_SIZE, 8, -- GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, -- GLX_BIND_TO_TEXTURE_RGBA_EXT, True, -- GLX_DOUBLEBUFFER, True, -- GLX_Y_INVERTED_EXT, True, -- GLX_X_RENDERABLE, True, -- None -- }; -- -- int pixmapAttribs[] = { -- GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, -- GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT, -- None -- }; -+ // check if we should do some pre-cleanup here -+ // a second decoder might need resources -+ if (m_vdpauConfigured == true) -+ { -+ CSingleLock lock(m_DecoderSection); -+ CLog::Log(LOGNOTICE,"CVDPAU::Release pre-cleanup"); -+ -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - pre-cleanup returned error", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - pre-cleanup timed out", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ } - -- GLXFBConfig *fbConfigs; -- fbConfigs = glXChooseFBConfig(m_Display, DefaultScreen(m_Display), doubleVisAttributes, &num); -- if (fbConfigs==NULL) -- { -- CLog::Log(LOGERROR, "GLX Error: MakePixmap: No compatible framebuffers found"); -- return false; -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ vdpau_render_state *render = m_videoSurfaces[i]; -+ if (render->surface != VDP_INVALID_HANDLE && !(render->state & FF_VDPAU_STATE_USED_FOR_RENDER)) -+ { -+ m_vdpauConfig.vdpProcs.vdp_video_surface_destroy(render->surface); -+ render->surface = VDP_INVALID_HANDLE; -+ } -+ } - } -- CLog::Log(LOGDEBUG, "Found %d fbconfigs.", num); -- fbConfigIndex = 0; -- CLog::Log(LOGDEBUG, "Using fbconfig index %d.", fbConfigIndex); -+ IHardwareDecoder::Release(); -+} - -- m_glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], m_Pixmap, pixmapAttribs); -+long CDecoder::ReleasePicReference() -+{ -+ return IHardwareDecoder::Release(); -+} - -- if (!m_glPixmap) -+void CDecoder::SetWidthHeight(int width, int height) -+{ -+ int vdpauMaxHeight = g_advancedSettings.m_videoVDPAUmaxHeight; -+ if (vdpauMaxHeight > 0 && height > vdpauMaxHeight) - { -- CLog::Log(LOGINFO, "GLX Error: Could not create Pixmap"); -- XFree(fbConfigs); -- return false; -+ width = MathUtils::round_int((double)width * vdpauMaxHeight / height); -+ height = vdpauMaxHeight; - } -- XFree(fbConfigs); - -- return true; --} -+ m_vdpauConfig.upscale = g_advancedSettings.m_videoVDPAUScaling; - --bool CVDPAU::MakePixmap(int width, int height) --{ - //pick the smallest dimensions, so we downscale with vdpau and upscale with opengl when appropriate - //this requires the least amount of gpu memory bandwidth -- if (g_graphicsContext.GetWidth() < width || g_graphicsContext.GetHeight() < height || upScale) -+ if (g_graphicsContext.GetWidth() < width || g_graphicsContext.GetHeight() < height || m_vdpauConfig.upscale >= 0) - { - //scale width to desktop size if the aspect ratio is the same or bigger than the desktop - if ((double)height * g_graphicsContext.GetWidth() / width <= (double)g_graphicsContext.GetHeight()) - { -- OutWidth = g_graphicsContext.GetWidth(); -- OutHeight = MathUtils::round_int((double)height * g_graphicsContext.GetWidth() / width); -+ m_vdpauConfig.outWidth = g_graphicsContext.GetWidth(); -+ m_vdpauConfig.outHeight = MathUtils::round_int((double)height * g_graphicsContext.GetWidth() / width); - } - else //scale height to the desktop size if the aspect ratio is smaller than the desktop - { -- OutHeight = g_graphicsContext.GetHeight(); -- OutWidth = MathUtils::round_int((double)width * g_graphicsContext.GetHeight() / height); -+ m_vdpauConfig.outHeight = g_graphicsContext.GetHeight(); -+ m_vdpauConfig.outWidth = MathUtils::round_int((double)width * g_graphicsContext.GetHeight() / height); - } - } - else - { //let opengl scale -- OutWidth = width; -- OutHeight = height; -- } -- -- CLog::Log(LOGNOTICE,"Creating %ix%i pixmap", OutWidth, OutHeight); -- -- // Get our window attribs. -- XWindowAttributes wndattribs; -- XGetWindowAttributes(m_Display, DefaultRootWindow(m_Display), &wndattribs); // returns a status but I don't know what success is -- -- m_Pixmap = XCreatePixmap(m_Display, -- DefaultRootWindow(m_Display), -- OutWidth, -- OutHeight, -- wndattribs.depth); -- if (!m_Pixmap) -- { -- CLog::Log(LOGERROR, "GLX Error: MakePixmap: Unable to create XPixmap"); -- return false; -- } -- -- XGCValues values = {}; -- GC xgc; -- values.foreground = BlackPixel (m_Display, DefaultScreen (m_Display)); -- xgc = XCreateGC(m_Display, m_Pixmap, GCForeground, &values); -- XFillRectangle(m_Display, m_Pixmap, xgc, 0, 0, OutWidth, OutHeight); -- XFreeGC(m_Display, xgc); -- -- if(!MakePixmapGL()) -- return false; -- -- return true; --} -- --void CVDPAU::BindPixmap() --{ -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- if (m_glPixmap) -- { -- if(presentSurface != VDP_INVALID_HANDLE) -- { -- VdpPresentationQueueStatus status; -- VdpTime time; -- VdpStatus vdp_st; -- vdp_st = vdp_presentation_queue_query_surface_status( -- vdp_flip_queue, presentSurface, &status, &time); -- CheckStatus(vdp_st, __LINE__); -- while(status != VDP_PRESENTATION_QUEUE_STATUS_VISIBLE && vdp_st == VDP_STATUS_OK) -- { -- Sleep(1); -- vdp_st = vdp_presentation_queue_query_surface_status( -- vdp_flip_queue, presentSurface, &status, &time); -- CheckStatus(vdp_st, __LINE__); -- } -- } -- -- glXBindTexImageEXT(m_Display, m_glPixmap, GLX_FRONT_LEFT_EXT, NULL); -- } -- else CLog::Log(LOGERROR,"(VDPAU) BindPixmap called without valid pixmap"); --} -- --void CVDPAU::ReleasePixmap() --{ -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- if (m_glPixmap) -- { -- glXReleaseTexImageEXT(m_Display, m_glPixmap, GLX_FRONT_LEFT_EXT); -+ m_vdpauConfig.outWidth = width; -+ m_vdpauConfig.outHeight = height; - } -- else CLog::Log(LOGERROR,"(VDPAU) ReleasePixmap called without valid pixmap"); -+ CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i vdpauMaxHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight, vdpauMaxHeight); - } - --void CVDPAU::OnLostDevice() -+void CDecoder::OnLostDevice() - { - CLog::Log(LOGNOTICE,"CVDPAU::OnLostDevice event"); - -- CExclusiveLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - FiniVDPAUOutput(); - FiniVDPAUProcs(); - - m_DisplayState = VDPAU_LOST; -+ lock.Leave(); - m_DisplayEvent.Reset(); - } - --void CVDPAU::OnResetDevice() -+void CDecoder::OnResetDevice() - { - CLog::Log(LOGNOTICE,"CVDPAU::OnResetDevice event"); - -- CExclusiveLock lock(m_DisplaySection); -+ CSingleLock lock(m_DecoderSection); - if (m_DisplayState == VDPAU_LOST) - { - m_DisplayState = VDPAU_RESET; -+ lock.Leave(); - m_DisplayEvent.Set(); - } - } - --int CVDPAU::Check(AVCodecContext* avctx) -+int CDecoder::Check(AVCodecContext* avctx) - { - EDisplayState state; - -- { CSharedLock lock(m_DisplaySection); -+ { CSingleLock lock(m_DecoderSection); - state = m_DisplayState; - } - -@@ -417,16 +329,13 @@ - } - else - { -- CSharedLock lock(m_DisplaySection); -+ CSingleLock lock(m_DecoderSection); - state = m_DisplayState; - } - } - if (state == VDPAU_RESET || state == VDPAU_ERROR) - { -- CLog::Log(LOGNOTICE,"Attempting recovery"); -- -- CSingleLock gLock(g_graphicsContext); -- CExclusiveLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - - FiniVDPAUOutput(); - FiniVDPAUProcs(); -@@ -441,7 +350,7 @@ - return 0; - } - --bool CVDPAU::IsVDPAUFormat(PixelFormat format) -+bool CDecoder::IsVDPAUFormat(PixelFormat format) - { - if ((format >= PIX_FMT_VDPAU_H264) && (format <= PIX_FMT_VDPAU_VC1)) return true; - #if (defined PIX_FMT_VDPAU_MPEG4_IN_AVUTIL) -@@ -450,90 +359,28 @@ - else return false; - } - --void CVDPAU::CheckFeatures() --{ -- if (videoMixer == VDP_INVALID_HANDLE) -- { -- CLog::Log(LOGNOTICE, " (VDPAU) Creating the video mixer"); -- // Creation of VideoMixer. -- VdpVideoMixerParameter parameters[] = { -- VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, -- VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, -- VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE -- }; -- -- void const * parameter_values[] = { -- &surface_width, -- &surface_height, -- &vdp_chroma_type -- }; -- -- tmpBrightness = 0; -- tmpContrast = 0; -- tmpNoiseReduction = 0; -- tmpSharpness = 0; -- -- VdpStatus vdp_st = VDP_STATUS_ERROR; -- vdp_st = vdp_video_mixer_create(vdp_device, -- m_feature_count, -- m_features, -- ARSIZE(parameters), -- parameters, -- parameter_values, -- &videoMixer); -- CheckStatus(vdp_st, __LINE__); -- -- SetHWUpscaling(); -- } -- -- if (tmpBrightness != g_settings.m_currentVideoSettings.m_Brightness || -- tmpContrast != g_settings.m_currentVideoSettings.m_Contrast) -- { -- SetColor(); -- tmpBrightness = g_settings.m_currentVideoSettings.m_Brightness; -- tmpContrast = g_settings.m_currentVideoSettings.m_Contrast; -- } -- if (tmpNoiseReduction != g_settings.m_currentVideoSettings.m_NoiseReduction) -- { -- tmpNoiseReduction = g_settings.m_currentVideoSettings.m_NoiseReduction; -- SetNoiseReduction(); -- } -- if (tmpSharpness != g_settings.m_currentVideoSettings.m_Sharpness) -- { -- tmpSharpness = g_settings.m_currentVideoSettings.m_Sharpness; -- SetSharpness(); -- } -- if ( tmpDeintMode != g_settings.m_currentVideoSettings.m_DeinterlaceMode || -- tmpDeintGUI != g_settings.m_currentVideoSettings.m_InterlaceMethod || -- (tmpDeintGUI == VS_INTERLACEMETHOD_AUTO && tmpDeint != AutoInterlaceMethod())) -- { -- tmpDeintMode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- tmpDeintGUI = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (tmpDeintGUI == VS_INTERLACEMETHOD_AUTO) -- tmpDeint = AutoInterlaceMethod(); -- else -- tmpDeint = tmpDeintGUI; -- -- SetDeinterlacing(); -- } --} -- --bool CVDPAU::Supports(VdpVideoMixerFeature feature) -+bool CDecoder::Supports(VdpVideoMixerFeature feature) - { -- for(int i = 0; i < m_feature_count; i++) -+ for(int i = 0; i < m_vdpauConfig.featureCount; i++) - { -- if(m_features[i] == feature) -+ if(m_vdpauConfig.vdpFeatures[i] == feature) - return true; - } - return false; - } - --bool CVDPAU::Supports(EINTERLACEMETHOD method) -+bool CDecoder::Supports(EINTERLACEMETHOD method) - { - if(method == VS_INTERLACEMETHOD_VDPAU_BOB - || method == VS_INTERLACEMETHOD_AUTO) - return true; - -+ if (g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) -+ { -+ if (method == VS_INTERLACEMETHOD_RENDER_BOB) -+ return true; -+ } -+ - for(SInterlaceMapping* p = g_interlace_mapping; p->method != VS_INTERLACEMETHOD_NONE; p++) - { - if(p->method == method) -@@ -542,149 +389,12 @@ - return false; - } - --EINTERLACEMETHOD CVDPAU::AutoInterlaceMethod() --{ -- return VS_INTERLACEMETHOD_VDPAU_TEMPORAL; --} -- --void CVDPAU::SetColor() --{ -- VdpStatus vdp_st; -- -- if (tmpBrightness != g_settings.m_currentVideoSettings.m_Brightness) -- m_Procamp.brightness = (float)((g_settings.m_currentVideoSettings.m_Brightness)-50) / 100; -- if (tmpContrast != g_settings.m_currentVideoSettings.m_Contrast) -- m_Procamp.contrast = (float)((g_settings.m_currentVideoSettings.m_Contrast)+50) / 100; -- -- if(vid_height >= 600 || vid_width > 1024) -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_709, &m_CSCMatrix); -- else -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); -- -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; -- if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) -- { -- void const * pm_CSCMatix[] = { &studioCSC }; -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -- } -- else -- { -- void const * pm_CSCMatix[] = { &m_CSCMatrix }; -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -- } -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetNoiseReduction() --{ -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION }; -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL }; -- VdpStatus vdp_st; -- -- if (!g_settings.m_currentVideoSettings.m_NoiseReduction) -- { -- VdpBool enabled[]= {0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- return; -- } -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- void* nr[] = { &g_settings.m_currentVideoSettings.m_NoiseReduction }; -- CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",g_settings.m_currentVideoSettings.m_NoiseReduction); -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, nr); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetSharpness() --{ -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS }; -- VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL }; -- VdpStatus vdp_st; -- -- if (!g_settings.m_currentVideoSettings.m_Sharpness) -- { -- VdpBool enabled[]={0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- return; -- } -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); -- void* sh[] = { &g_settings.m_currentVideoSettings.m_Sharpness }; -- CLog::Log(LOGNOTICE,"Setting Sharpness to %f",g_settings.m_currentVideoSettings.m_Sharpness); -- vdp_st = vdp_video_mixer_set_attribute_values(videoMixer, ARSIZE(attributes), attributes, sh); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::SetHWUpscaling() --{ --#ifdef VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 -- if(!Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1) || !upScale) -- return; -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -- VdpStatus vdp_st; -- VdpBool enabled[]={1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- CheckStatus(vdp_st, __LINE__); --#endif --} -- --void CVDPAU::SetDeinterlacing() -+EINTERLACEMETHOD CDecoder::AutoInterlaceMethod() - { -- VdpStatus vdp_st; -- EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (method == VS_INTERLACEMETHOD_AUTO) -- method = AutoInterlaceMethod(); -- -- VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -- VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -- VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE }; -- if (mode == VS_DEINTERLACEMODE_OFF) -- { -- VdpBool enabled[]={0,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else -- { -- if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF) -- { -- VdpBool enabled[]={1,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF) -- { -- VdpBool enabled[]={1,1,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else if (method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE) -- { -- VdpBool enabled[]={1,0,1}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- else -- { -- VdpBool enabled[]={0,0,0}; -- vdp_st = vdp_video_mixer_set_feature_enables(videoMixer, ARSIZE(feature), feature, enabled); -- } -- } -- -- CheckStatus(vdp_st, __LINE__); -+ return VS_INTERLACEMETHOD_RENDER_BOB; - } - --void CVDPAU::InitVDPAUProcs() -+void CDecoder::InitVDPAUProcs() - { - char* error; - -@@ -694,151 +404,115 @@ - if (error) - { - CLog::Log(LOGERROR,"(VDPAU) - %s in %s",error,__FUNCTION__); -- vdp_device = VDP_INVALID_HANDLE; -- -- //g_application.m_guiDialogKaiToast.QueueNotification(CGUIDialogKaiToast::Error, "VDPAU", error, 10000); -- -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - return; - } - - if (dl_vdp_device_create_x11) - { -- CSingleLock lock(g_graphicsContext); -- m_Display = g_Windowing.GetDisplay(); -+ m_Display = XOpenDisplay(NULL); - } - - int mScreen = DefaultScreen(m_Display); - VdpStatus vdp_st; - - // Create Device -- // tested on 64bit Ubuntu 11.10 and it deadlocked without this -- XLockDisplay(m_Display); - vdp_st = dl_vdp_device_create_x11(m_Display, //x_display, - mScreen, //x_screen, -- &vdp_device, -- &vdp_get_proc_address); -- XUnlockDisplay(m_Display); -+ &m_vdpauConfig.vdpDevice, -+ &m_vdpauConfig.vdpProcs.vdp_get_proc_address); - -- CLog::Log(LOGNOTICE,"vdp_device = 0x%08x vdp_st = 0x%08x",vdp_device,vdp_st); -+ CLog::Log(LOGNOTICE,"vdp_device = 0x%08x vdp_st = 0x%08x",m_vdpauConfig.vdpDevice,vdp_st); - if (vdp_st != VDP_STATUS_OK) - { - CLog::Log(LOGERROR,"(VDPAU) unable to init VDPAU - vdp_st = 0x%x. Falling back.",vdp_st); -- vdp_device = VDP_INVALID_HANDLE; -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - return; - } - -- if (vdp_st != VDP_STATUS_OK) -- { -- CLog::Log(LOGERROR,"(VDPAU) - Unable to create X11 device in %s",__FUNCTION__); -- vdp_device = VDP_INVALID_HANDLE; -- return; -- } - #define VDP_PROC(id, proc) \ - do { \ -- vdp_st = vdp_get_proc_address(vdp_device, id, (void**)&proc); \ -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_get_proc_address(m_vdpauConfig.vdpDevice, id, (void**)&proc); \ - CheckStatus(vdp_st, __LINE__); \ - } while(0); - -- VDP_PROC(VDP_FUNC_ID_GET_ERROR_STRING , vdp_get_error_string); -- VDP_PROC(VDP_FUNC_ID_DEVICE_DESTROY , vdp_device_destroy); -- VDP_PROC(VDP_FUNC_ID_GENERATE_CSC_MATRIX , vdp_generate_csc_matrix); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_CREATE , vdp_video_surface_create); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY , vdp_video_surface_destroy); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR , vdp_video_surface_put_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR , vdp_video_surface_get_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR , vdp_output_surface_put_bits_y_cb_cr); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE , vdp_output_surface_put_bits_native); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE , vdp_output_surface_create); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY , vdp_output_surface_destroy); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE , vdp_output_surface_get_bits_native); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, vdp_output_surface_render_output_surface); -- VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED , vdp_output_surface_put_bits_indexed); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_CREATE , vdp_video_mixer_create); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES , vdp_video_mixer_set_feature_enables); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_DESTROY , vdp_video_mixer_destroy); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_RENDER , vdp_video_mixer_render); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES , vdp_video_mixer_set_attribute_values); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT , vdp_video_mixer_query_parameter_support); -- VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT , vdp_video_mixer_query_feature_support); -- VDP_PROC(VDP_FUNC_ID_DECODER_CREATE , vdp_decoder_create); -- VDP_PROC(VDP_FUNC_ID_DECODER_DESTROY , vdp_decoder_destroy); -- VDP_PROC(VDP_FUNC_ID_DECODER_RENDER , vdp_decoder_render); -- VDP_PROC(VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES , vdp_decoder_query_caps); -- VDP_PROC(VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER , vdp_preemption_callback_register); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY , vdp_presentation_queue_target_destroy); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE , vdp_presentation_queue_create); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY , vdp_presentation_queue_destroy); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY , vdp_presentation_queue_display); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, vdp_presentation_queue_block_until_surface_idle); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 , vdp_presentation_queue_target_create_x11); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS , vdp_presentation_queue_query_surface_status); -- VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME , vdp_presentation_queue_get_time); -- -+ VDP_PROC(VDP_FUNC_ID_GET_ERROR_STRING , m_vdpauConfig.vdpProcs.vdp_get_error_string); -+ VDP_PROC(VDP_FUNC_ID_DEVICE_DESTROY , m_vdpauConfig.vdpProcs.vdp_device_destroy); -+ VDP_PROC(VDP_FUNC_ID_GENERATE_CSC_MATRIX , m_vdpauConfig.vdpProcs.vdp_generate_csc_matrix); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_CREATE , m_vdpauConfig.vdpProcs.vdp_video_surface_create); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY , m_vdpauConfig.vdpProcs.vdp_video_surface_destroy); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_video_surface_put_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_video_surface_get_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_y_cb_cr); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_native); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_CREATE , m_vdpauConfig.vdpProcs.vdp_output_surface_create); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY , m_vdpauConfig.vdpProcs.vdp_output_surface_destroy); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE , m_vdpauConfig.vdpProcs.vdp_output_surface_get_bits_native); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE, m_vdpauConfig.vdpProcs.vdp_output_surface_render_output_surface); -+ VDP_PROC(VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED , m_vdpauConfig.vdpProcs.vdp_output_surface_put_bits_indexed); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_CREATE , m_vdpauConfig.vdpProcs.vdp_video_mixer_create); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES , m_vdpauConfig.vdpProcs.vdp_video_mixer_set_feature_enables); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_DESTROY , m_vdpauConfig.vdpProcs.vdp_video_mixer_destroy); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_RENDER , m_vdpauConfig.vdpProcs.vdp_video_mixer_render); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES , m_vdpauConfig.vdpProcs.vdp_video_mixer_set_attribute_values); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT , m_vdpauConfig.vdpProcs.vdp_video_mixer_query_parameter_support); -+ VDP_PROC(VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT , m_vdpauConfig.vdpProcs.vdp_video_mixer_query_feature_support); -+ VDP_PROC(VDP_FUNC_ID_DECODER_CREATE , m_vdpauConfig.vdpProcs.vdp_decoder_create); -+ VDP_PROC(VDP_FUNC_ID_DECODER_DESTROY , m_vdpauConfig.vdpProcs.vdp_decoder_destroy); -+ VDP_PROC(VDP_FUNC_ID_DECODER_RENDER , m_vdpauConfig.vdpProcs.vdp_decoder_render); -+ VDP_PROC(VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES , m_vdpauConfig.vdpProcs.vdp_decoder_query_caps); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_target_destroy); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE , m_vdpauConfig.vdpProcs.vdp_presentation_queue_create); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_destroy); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY , m_vdpauConfig.vdpProcs.vdp_presentation_queue_display); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE, m_vdpauConfig.vdpProcs.vdp_presentation_queue_block_until_surface_idle); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 , m_vdpauConfig.vdpProcs.vdp_presentation_queue_target_create_x11); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS , m_vdpauConfig.vdpProcs.vdp_presentation_queue_query_surface_status); -+ VDP_PROC(VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME , m_vdpauConfig.vdpProcs.vdp_presentation_queue_get_time); -+ - #undef VDP_PROC - - // set all vdpau resources to invalid -- vdp_flip_target = VDP_INVALID_HANDLE; -- vdp_flip_queue = VDP_INVALID_HANDLE; -- videoMixer = VDP_INVALID_HANDLE; -- totalAvailableOutputSurfaces = 0; -- presentSurface = VDP_INVALID_HANDLE; -- outputSurface = VDP_INVALID_HANDLE; -- for (int i = 0; i < NUM_OUTPUT_SURFACES; i++) -- outputSurfaces[i] = VDP_INVALID_HANDLE; -- -- m_vdpauOutputMethod = OUTPUT_NONE; -- -- CExclusiveLock lock(m_DisplaySection); - m_DisplayState = VDPAU_OPEN; -- vdpauConfigured = false; -+ m_vdpauConfigured = false; - } - --void CVDPAU::FiniVDPAUProcs() -+void CDecoder::FiniVDPAUProcs() - { -- if (vdp_device == VDP_INVALID_HANDLE) return; -+ if (m_vdpauConfig.vdpDevice == VDP_INVALID_HANDLE) return; - - VdpStatus vdp_st; -- vdp_st = vdp_device_destroy(vdp_device); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_device_destroy(m_vdpauConfig.vdpDevice); - CheckStatus(vdp_st, __LINE__); -- vdp_device = VDP_INVALID_HANDLE; -- vdpauConfigured = false; -+ m_vdpauConfig.vdpDevice = VDP_INVALID_HANDLE; - } - --void CVDPAU::InitCSCMatrix(int Height) -+void CDecoder::FiniVDPAUOutput() - { -+ if (m_vdpauConfig.vdpDevice == VDP_INVALID_HANDLE || !m_vdpauConfigured) return; -+ -+ CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); -+ -+ // uninit output -+ m_vdpauOutput.Dispose(); -+ m_vdpauConfigured = false; -+ - VdpStatus vdp_st; -- m_Procamp.struct_version = VDP_PROCAMP_VERSION; -- m_Procamp.brightness = 0.0; -- m_Procamp.contrast = 1.0; -- m_Procamp.saturation = 1.0; -- m_Procamp.hue = 0; -- vdp_st = vdp_generate_csc_matrix(&m_Procamp, -- (Height < 720)? VDP_COLOR_STANDARD_ITUR_BT_601 : VDP_COLOR_STANDARD_ITUR_BT_709, -- &m_CSCMatrix); -- CheckStatus(vdp_st, __LINE__); --} -- --void CVDPAU::FiniVDPAUOutput() --{ -- FiniOutputMethod(); -- -- if (vdp_device == VDP_INVALID_HANDLE || !vdpauConfigured) return; - -- CLog::Log(LOGNOTICE, " (VDPAU) %s", __FUNCTION__); -- -- VdpStatus vdp_st; -- -- vdp_st = vdp_decoder_destroy(decoder); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_destroy(m_vdpauConfig.vdpDecoder); - if (CheckStatus(vdp_st, __LINE__)) - return; -- decoder = VDP_INVALID_HANDLE; -+ m_vdpauConfig.vdpDecoder = VDP_INVALID_HANDLE; - -- for (unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ CSingleLock lock(m_videoSurfaceSec); -+ CLog::Log(LOGDEBUG, "CVDPAU::FiniVDPAUOutput destroying %d video surfaces", (int)m_videoSurfaces.size()); -+ -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) - { - vdpau_render_state *render = m_videoSurfaces[i]; - if (render->surface != VDP_INVALID_HANDLE) - { -- vdp_st = vdp_video_surface_destroy(render->surface); -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_video_surface_destroy(render->surface); - render->surface = VDP_INVALID_HANDLE; - } - if (CheckStatus(vdp_st, __LINE__)) -@@ -846,8 +520,7 @@ - } - } - -- --void CVDPAU::ReadFormatOf( PixelFormat fmt -+void CDecoder::ReadFormatOf( PixelFormat fmt - , VdpDecoderProfile &vdp_decoder_profile - , VdpChromaType &vdp_chroma_type) - { -@@ -885,170 +558,78 @@ - } - } - -- --bool CVDPAU::ConfigVDPAU(AVCodecContext* avctx, int ref_frames) -+bool CDecoder::ConfigVDPAU(AVCodecContext* avctx, int ref_frames) - { - FiniVDPAUOutput(); - - VdpStatus vdp_st; - VdpDecoderProfile vdp_decoder_profile; -- vid_width = avctx->width; -- vid_height = avctx->height; -- surface_width = avctx->coded_width; -- surface_height = avctx->coded_height; -- -- past[1] = past[0] = current = future = NULL; -- CLog::Log(LOGNOTICE, " (VDPAU) screenWidth:%i vidWidth:%i surfaceWidth:%i",OutWidth,vid_width,surface_width); -- CLog::Log(LOGNOTICE, " (VDPAU) screenHeight:%i vidHeight:%i surfaceHeight:%i",OutHeight,vid_height,surface_height); -- ReadFormatOf(avctx->pix_fmt, vdp_decoder_profile, vdp_chroma_type); -+ -+ m_vdpauConfig.vidWidth = avctx->width; -+ m_vdpauConfig.vidHeight = avctx->height; -+ m_vdpauConfig.surfaceWidth = avctx->coded_width; -+ m_vdpauConfig.surfaceHeight = avctx->coded_height; -+ -+ SetWidthHeight(avctx->width,avctx->height); -+ -+ CLog::Log(LOGNOTICE, " (VDPAU) screenWidth:%i vidWidth:%i surfaceWidth:%i",m_vdpauConfig.outWidth,m_vdpauConfig.vidWidth,m_vdpauConfig.surfaceWidth); -+ CLog::Log(LOGNOTICE, " (VDPAU) screenHeight:%i vidHeight:%i surfaceHeight:%i",m_vdpauConfig.outHeight,m_vdpauConfig.vidHeight,m_vdpauConfig.surfaceHeight); -+ -+ ReadFormatOf(avctx->pix_fmt, vdp_decoder_profile, m_vdpauConfig.vdpChromaType); - - if(avctx->pix_fmt == PIX_FMT_VDPAU_H264) - { -- max_references = ref_frames; -- if (max_references > 16) max_references = 16; -- if (max_references < 5) max_references = 5; -+ m_vdpauConfig.maxReferences = ref_frames; -+ if (m_vdpauConfig.maxReferences > 16) m_vdpauConfig.maxReferences = 16; -+ if (m_vdpauConfig.maxReferences < 5) m_vdpauConfig.maxReferences = 5; - } - else -- max_references = 2; -+ m_vdpauConfig.maxReferences = 2; - -- vdp_st = vdp_decoder_create(vdp_device, -+ vdp_st = m_vdpauConfig.vdpProcs.vdp_decoder_create(m_vdpauConfig.vdpDevice, - vdp_decoder_profile, -- surface_width, -- surface_height, -- max_references, -- &decoder); -- if (CheckStatus(vdp_st, __LINE__)) -- return false; -- -- m_vdpauOutputMethod = OUTPUT_NONE; -- -- vdpauConfigured = true; -- return true; --} -- --bool CVDPAU::ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame) --{ -- VdpStatus vdp_st; -- -- if (m_vdpauOutputMethod == OUTPUT_PIXMAP) -- return true; -- -- FiniOutputMethod(); -- -- MakePixmap(avctx->width,avctx->height); -- -- vdp_st = vdp_presentation_queue_target_create_x11(vdp_device, -- m_Pixmap, //x_window, -- &vdp_flip_target); -- if (CheckStatus(vdp_st, __LINE__)) -- return false; -- -- vdp_st = vdp_presentation_queue_create(vdp_device, -- vdp_flip_target, -- &vdp_flip_queue); -+ m_vdpauConfig.surfaceWidth, -+ m_vdpauConfig.surfaceHeight, -+ m_vdpauConfig.maxReferences, -+ &m_vdpauConfig.vdpDecoder); - if (CheckStatus(vdp_st, __LINE__)) - return false; - -- totalAvailableOutputSurfaces = 0; -- -- int tmpMaxOutputSurfaces = NUM_OUTPUT_SURFACES; -- if (vid_width == FULLHD_WIDTH) -- tmpMaxOutputSurfaces = NUM_OUTPUT_SURFACES_FOR_FULLHD; -- -- // Creation of outputSurfaces -- for (int i = 0; i < NUM_OUTPUT_SURFACES && i < tmpMaxOutputSurfaces; i++) -- { -- vdp_st = vdp_output_surface_create(vdp_device, -- VDP_RGBA_FORMAT_B8G8R8A8, -- OutWidth, -- OutHeight, -- &outputSurfaces[i]); -- if (CheckStatus(vdp_st, __LINE__)) -+ // initialize output -+ CSingleLock lock(g_graphicsContext); -+ m_vdpauConfig.stats = &m_bufferStats; -+ m_vdpauConfig.vdpau = this; -+ m_bufferStats.Reset(); -+ m_vdpauOutput.Start(); -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::INIT, -+ &reply, -+ 2000, -+ &m_vdpauConfig, -+ sizeof(m_vdpauConfig))) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - vdpau output returned error", __FUNCTION__); -+ m_vdpauOutput.Dispose(); - return false; -- totalAvailableOutputSurfaces++; -- } -- CLog::Log(LOGNOTICE, " (VDPAU) Total Output Surfaces Available: %i of a max (tmp: %i const: %i)", -- totalAvailableOutputSurfaces, -- tmpMaxOutputSurfaces, -- NUM_OUTPUT_SURFACES); -- -- // create 3 pitches of black lines needed for clipping top -- // and bottom lines when de-interlacing -- m_BlackBar = new uint32_t[3*OutWidth]; -- memset(m_BlackBar, 0, 3*OutWidth*sizeof(uint32_t)); -- -- surfaceNum = presentSurfaceNum = 0; -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- videoMixer = VDP_INVALID_HANDLE; -- -- m_vdpauOutputMethod = OUTPUT_PIXMAP; -- -- return true; --} -- --bool CVDPAU::FiniOutputMethod() --{ -- VdpStatus vdp_st; -- -- if (vdp_flip_queue != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_presentation_queue_destroy(vdp_flip_queue); -- vdp_flip_queue = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (vdp_flip_target != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_presentation_queue_target_destroy(vdp_flip_target); -- vdp_flip_target = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (m_glPixmap) -- { -- CLog::Log(LOGDEBUG, "GLX: Destroying glPixmap"); -- glXDestroyPixmap(m_Display, m_glPixmap); -- m_glPixmap = None; -- } -- -- if (m_Pixmap) -- { -- CLog::Log(LOGDEBUG, "GLX: Destroying XPixmap"); -- XFreePixmap(m_Display, m_Pixmap); -- m_Pixmap = None; -- } -- -- outputSurface = presentSurface = VDP_INVALID_HANDLE; -- -- for (int i = 0; i < totalAvailableOutputSurfaces; i++) -- { -- if (outputSurfaces[i] == VDP_INVALID_HANDLE) -- continue; -- vdp_st = vdp_output_surface_destroy(outputSurfaces[i]); -- outputSurfaces[i] = VDP_INVALID_HANDLE; -- CheckStatus(vdp_st, __LINE__); -- } -- -- if (videoMixer != VDP_INVALID_HANDLE) -- { -- vdp_st = vdp_video_mixer_destroy(videoMixer); -- videoMixer = VDP_INVALID_HANDLE; -- if (CheckStatus(vdp_st, __LINE__)); -+ } - } -- -- if (m_BlackBar) -+ else - { -- delete [] m_BlackBar; -- m_BlackBar = NULL; -+ CLog::Log(LOGERROR, "VDPAU::%s - failed to init output", __FUNCTION__); -+ m_vdpauOutput.Dispose(); -+ return false; - } - -- while (!m_DVDVideoPics.empty()) -- m_DVDVideoPics.pop(); -- -+ m_inMsgEvent.Reset(); -+ m_vdpauConfigured = true; - return true; - } - --void CVDPAU::SpewHardwareAvailable() //Copyright (c) 2008 Wladimir J. van der Laan -- VDPInfo -+void CDecoder::SpewHardwareAvailable() //CopyrighVDPAUt (c) 2008 Wladimir J. van der Laan -- VDPInfo - { - VdpStatus rv; - CLog::Log(LOGNOTICE,"VDPAU Decoder capabilities:"); -@@ -1058,7 +639,7 @@ - { - VdpBool is_supported = false; - uint32_t max_level, max_macroblocks, max_width, max_height; -- rv = vdp_decoder_query_caps(vdp_device, decoder_profiles[x].id, -+ rv = m_vdpauConfig.vdpProcs.vdp_decoder_query_caps(m_vdpauConfig.vdpDevice, decoder_profiles[x].id, - &is_supported, &max_level, &max_macroblocks, &max_width, &max_height); - if(rv == VDP_STATUS_OK && is_supported) - { -@@ -1067,13 +648,13 @@ - } - } - CLog::Log(LOGNOTICE,"------------------------------------"); -- m_feature_count = 0; -+ m_vdpauConfig.featureCount = 0; - #define CHECK_SUPPORT(feature) \ - do { \ - VdpBool supported; \ -- if(vdp_video_mixer_query_feature_support(vdp_device, feature, &supported) == VDP_STATUS_OK && supported) { \ -+ if(m_vdpauConfig.vdpProcs.vdp_video_mixer_query_feature_support(m_vdpauConfig.vdpDevice, feature, &supported) == VDP_STATUS_OK && supported) { \ - CLog::Log(LOGNOTICE, "Mixer feature: "#feature); \ -- m_features[m_feature_count++] = feature; \ -+ m_vdpauConfig.vdpFeatures[m_vdpauConfig.featureCount++] = feature; \ - } \ - } while(false) - -@@ -1097,7 +678,7 @@ - - } - --bool CVDPAU::IsSurfaceValid(vdpau_render_state *render) -+bool CDecoder::IsSurfaceValid(vdpau_render_state *render) - { - // find render state in queue - bool found(false); -@@ -1124,34 +705,34 @@ - return true; - } - --int CVDPAU::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) -+int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) - { - //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -- struct pictureAge* pA = &vdp->picAge; -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); -+ struct PictureAge* pA = &vdp->m_picAge; - - // while we are waiting to recover we can't do anything -- CSharedLock lock(vdp->m_DecoderSection); -+ CSingleLock lock(vdp->m_DecoderSection); - -- { CSharedLock dLock(vdp->m_DisplaySection); -- if(vdp->m_DisplayState != VDPAU_OPEN) -- { -- CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - returning due to awaiting recovery"); -- return -1; -- } -+ if(vdp->m_DisplayState != VDPAU_OPEN) -+ { -+ CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - returning due to awaiting recovery"); -+ return -1; - } - - vdpau_render_state * render = NULL; - - // find unused surface -- for(unsigned int i = 0; i < vdp->m_videoSurfaces.size(); i++) -- { -- if(!(vdp->m_videoSurfaces[i]->state & (FF_VDPAU_STATE_USED_FOR_REFERENCE | FF_VDPAU_STATE_USED_FOR_RENDER))) -+ { CSingleLock lock(vdp->m_videoSurfaceSec); -+ for(unsigned int i = 0; i < vdp->m_videoSurfaces.size(); i++) - { -- render = vdp->m_videoSurfaces[i]; -- render->state = 0; -- break; -+ if(!(vdp->m_videoSurfaces[i]->state & (FF_VDPAU_STATE_USED_FOR_REFERENCE | FF_VDPAU_STATE_USED_FOR_RENDER))) -+ { -+ render = vdp->m_videoSurfaces[i]; -+ render->state = 0; -+ break; -+ } - } - } - -@@ -1160,21 +741,22 @@ - { - // create a new surface - VdpDecoderProfile profile; -- ReadFormatOf(avctx->pix_fmt, profile, vdp->vdp_chroma_type); -+ ReadFormatOf(avctx->pix_fmt, profile, vdp->m_vdpauConfig.vdpChromaType); - render = (vdpau_render_state*)calloc(sizeof(vdpau_render_state), 1); - if (render == NULL) - { - CLog::Log(LOGWARNING, "CVDPAU::FFGetBuffer - calloc failed"); - return -1; - } -+ CSingleLock lock(vdp->m_videoSurfaceSec); - render->surface = VDP_INVALID_HANDLE; - vdp->m_videoSurfaces.push_back(render); - } - - if (render->surface == VDP_INVALID_HANDLE) - { -- vdp_st = vdp->vdp_video_surface_create(vdp->vdp_device, -- vdp->vdp_chroma_type, -+ vdp_st = vdp->m_vdpauConfig.vdpProcs.vdp_video_surface_create(vdp->m_vdpauConfig.vdpDevice, -+ vdp->m_vdpauConfig.vdpChromaType, - avctx->coded_width, - avctx->coded_height, - &render->surface); -@@ -1214,15 +796,16 @@ - return 0; - } - --void CVDPAU::FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic) -+void CDecoder::FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic) - { - //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); -+ - vdpau_render_state * render; - unsigned int i; - -- CSharedLock lock(vdp->m_DecoderSection); -+ CSingleLock lock(vdp->m_DecoderSection); - - render=(vdpau_render_state*)pic->data[0]; - if(!render) -@@ -1231,6 +814,8 @@ - return; - } - -+ CSingleLock vLock(vdp->m_videoSurfaceSec); -+ render->state &= ~FF_VDPAU_STATE_USED_FOR_REFERENCE; - for(i=0; i<4; i++) - pic->data[i]= NULL; - -@@ -1245,21 +830,18 @@ - } - - --void CVDPAU::FFDrawSlice(struct AVCodecContext *s, -+void CDecoder::FFDrawSlice(struct AVCodecContext *s, - const AVFrame *src, int offset[4], - int y, int type, int height) - { - CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)s->opaque; -- CVDPAU* vdp = (CVDPAU*)ctx->GetHardware(); -+ CDecoder* vdp = (CDecoder*)ctx->GetHardware(); - - // while we are waiting to recover we can't do anything -- CSharedLock lock(vdp->m_DecoderSection); -- -- { CSharedLock dLock(vdp->m_DisplaySection); -- if(vdp->m_DisplayState != VDPAU_OPEN) -- return; -- } -+ CSingleLock lock(vdp->m_DecoderSection); - -+ if(vdp->m_DisplayState != VDPAU_OPEN) -+ return; - - if(src->linesize[0] || src->linesize[1] || src->linesize[2] - || offset[0] || offset[1] || offset[2]) -@@ -1289,59 +871,41 @@ - if(s->pix_fmt == PIX_FMT_VDPAU_H264) - max_refs = render->info.h264.num_ref_frames; - -- if(vdp->decoder == VDP_INVALID_HANDLE -- || vdp->vdpauConfigured == false -- || vdp->max_references < max_refs) -+ if(vdp->m_vdpauConfig.vdpDecoder == VDP_INVALID_HANDLE -+ || vdp->m_vdpauConfigured == false -+ || vdp->m_vdpauConfig.maxReferences < max_refs) - { - if(!vdp->ConfigVDPAU(s, max_refs)) - return; - } - -- vdp_st = vdp->vdp_decoder_render(vdp->decoder, -+ uint64_t startTime = CurrentHostCounter(); -+ uint16_t decoded, processed, rend; -+ vdp->m_bufferStats.Get(decoded, processed, rend); -+ vdp_st = vdp->m_vdpauConfig.vdpProcs.vdp_decoder_render(vdp->m_vdpauConfig.vdpDecoder, - render->surface, - (VdpPictureInfo const *)&(render->info), - render->bitstream_buffers_used, - render->bitstream_buffers); - vdp->CheckStatus(vdp_st, __LINE__); -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (diff*1000/CurrentHostFrequency() > 30) -+ CLog::Log(LOGWARNING,"CVDPAU::DrawSlice - VdpDecoderRender long decoding: %d ms, dec: %d, proc: %d, rend: %d", (int)((diff*1000)/CurrentHostFrequency()), decoded, processed, rend); -+ - } - --int CVDPAU::Decode(AVCodecContext *avctx, AVFrame *pFrame) --{ -- //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); -- VdpStatus vdp_st; -- VdpTime time; - -+int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bool bHardDrain) -+{ - int result = Check(avctx); - if (result) - return result; - -- CSharedLock lock(m_DecoderSection); -+ CSingleLock lock(m_DecoderSection); - -- if (!vdpauConfigured) -+ if (!m_vdpauConfigured) - return VC_ERROR; - -- // configure vdpau output -- if (!ConfigOutputMethod(avctx, pFrame)) -- return VC_FLUSHED; -- -- outputSurface = outputSurfaces[surfaceNum]; -- -- CheckFeatures(); -- -- if (( (int)outRectVid.x1 != OutWidth ) || -- ( (int)outRectVid.y1 != OutHeight )) -- { -- outRectVid.x0 = 0; -- outRectVid.y0 = 0; -- outRectVid.x1 = OutWidth; -- outRectVid.y1 = OutHeight; -- } -- -- EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -- EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -- if (method == VS_INTERLACEMETHOD_AUTO) -- method = AutoInterlaceMethod(); -- - if(pFrame) - { // we have a new frame from decoder - -@@ -1349,7 +913,10 @@ - if(!render) // old style ffmpeg gave data on plane 0 - render = (vdpau_render_state*)pFrame->data[0]; - if(!render) -+ { -+ CLog::Log(LOGERROR, "CVDPAU::Decode: no valid frame"); - return VC_ERROR; -+ } - - // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid - if (!IsSurfaceValid(render)) -@@ -1358,256 +925,175 @@ - return VC_BUFFER; - } - -+ CSingleLock lock(m_videoSurfaceSec); - render->state |= FF_VDPAU_STATE_USED_FOR_RENDER; -+ lock.Leave(); -+ -+ // send frame to output for processing -+ CVdpauDecodedPicture pic; -+ memset(&pic.DVDPic, 0, sizeof(pic.DVDPic)); -+ ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&pic.DVDPic); -+ pic.render = render; -+ m_bufferStats.IncDecoded(); -+ m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); - -- ClearUsedForRender(&past[0]); -- past[0] = past[1]; -- past[1] = current; -- current = future; -- future = render; -- -- DVDVideoPicture DVDPic; -- memset(&DVDPic, 0, sizeof(DVDVideoPicture)); -- ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&DVDPic); -- m_DVDVideoPics.push(DVDPic); -- -- int pics = m_DVDVideoPics.size(); -- if (pics < 2) -- return VC_BUFFER; -- else if (pics > 2) -- { -- // this should not normally happen -- CLog::Log(LOGERROR, "CVDPAU::Decode - invalid number of pictures in queue"); -- while (pics-- != 2) -- m_DVDVideoPics.pop(); -+ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); -+ if (m_codecControl & DVP_FLAG_SKIP_PROC) -+ { -+ m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); - } -+ } - -- if (mode == VS_DEINTERLACEMODE_FORCE -- || (mode == VS_DEINTERLACEMODE_AUTO && m_DVDVideoPics.front().iFlags & DVP_FLAG_INTERLACED)) -+ int retval = 0; -+ uint16_t decoded, processed, render; -+ Message *msg; -+ while (m_vdpauOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::ERROR) - { -- if((method == VS_INTERLACEMETHOD_VDPAU_BOB -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE )) -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ m_bufferStats.Get(decoded, processed, render); -+ -+ uint64_t startTime = CurrentHostCounter(); -+ while (!retval) -+ { -+ if (m_vdpauOutput.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) - { -- if(method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -- || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -- || avctx->skip_frame == AVDISCARD_NONREF) -- m_mixerstep = 0; -- else -- m_mixerstep = 1; -- -- if(m_DVDVideoPics.front().iFlags & DVP_FLAG_TOP_FIELD_FIRST) -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -- else -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ if (m_presentPicture) -+ { -+ m_presentPicture->ReturnUnused(); -+ m_presentPicture = 0; -+ } -+ -+ m_presentPicture = *(CVdpauRenderPicture**)msg->data; -+ m_presentPicture->vdpau = this; -+ m_bufferStats.DecRender(); -+ m_bufferStats.Get(decoded, processed, render); -+ retval |= VC_PICTURE; -+ msg->Release(); -+ break; -+ } -+ msg->Release(); -+ } -+ else if (m_vdpauOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::STATS) -+ { -+ m_bufferStats.Get(decoded, processed, render); - } - else - { -- m_mixerstep = 0; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; - } -+ msg->Release(); - } -- else -+ -+ if ((m_codecControl & DVP_FLAG_DRAIN)) - { -- m_mixerstep = 0; -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ if (decoded + processed + render < 4) -+ { -+ retval |= VC_BUFFER; -+ } - } -- -- } -- else if(m_mixerstep == 1) -- { // no new frame given, output second field of old frame -- -- if(avctx->skip_frame == AVDISCARD_NONREF) -+ else - { -- ClearUsedForRender(&past[1]); -- m_DVDVideoPics.pop(); -- return VC_BUFFER; -+ if (decoded < 4 && (processed + render) < 3) -+ { -+ retval |= VC_BUFFER; -+ } - } - -- m_mixerstep = 2; -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD) -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -- else -- m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ if (!retval && !m_inMsgEvent.WaitMSec(2000)) -+ break; - } -- else -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (retval & VC_PICTURE) - { -- CLog::Log(LOGERROR, "CVDPAU::Decode - invalid mixer state reached"); -- return VC_BUFFER; -+ m_bufferStats.SetParams(diff, m_speed); - } -+ if (diff*1000/CurrentHostFrequency() > 50) -+ CLog::Log(LOGDEBUG,"CVDPAU::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); - -- VdpVideoSurface past_surfaces[2] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -- VdpVideoSurface futu_surfaces[1] = { VDP_INVALID_HANDLE }; -- -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -- { -- if (past[0]) -- past_surfaces[1] = past[0]->surface; -- if (past[1]) -- past_surfaces[0] = past[1]->surface; -- futu_surfaces[0] = future->surface; -- } -- else -+ if (!retval) - { -- if(m_mixerstep == 1) -- { // first field -- if (past[1]) -- { -- past_surfaces[1] = past[1]->surface; -- past_surfaces[0] = past[1]->surface; -- } -- futu_surfaces[0] = current->surface; -- } -- else -- { // second field -- if (past[1]) -- past_surfaces[1] = past[1]->surface; -- past_surfaces[0] = current->surface; -- futu_surfaces[0] = future->surface; -- } -+ CLog::Log(LOGERROR, "VDPAU::%s - timed out waiting for output message", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; -+ retval |= VC_ERROR; - } - -- vdp_st = vdp_presentation_queue_block_until_surface_idle(vdp_flip_queue,outputSurface,&time); -- -- VdpRect sourceRect = {0,0,vid_width, vid_height}; -- -- vdp_st = vdp_video_mixer_render(videoMixer, -- VDP_INVALID_HANDLE, -- 0, -- m_mixerfield, -- 2, -- past_surfaces, -- current->surface, -- 1, -- futu_surfaces, -- &sourceRect, -- outputSurface, -- &(outRectVid), -- &(outRectVid), -- 0, -- NULL); -- CheckStatus(vdp_st, __LINE__); -- -- surfaceNum++; -- if (surfaceNum >= totalAvailableOutputSurfaces) surfaceNum = 0; -+ return retval; -+} - -- if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -- { -- ClearUsedForRender(&past[0]); -- return VC_BUFFER | VC_PICTURE; -- } -- else -- { -- // in order to clip top and bottom lines when de-interlacing -- // we black those lines as a work around for not working -- // background colour using the mixer -- // pixel perfect is preferred over overscanning or zooming -+bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+{ -+ CSingleLock lock(m_DecoderSection); - -- VdpRect clipRect = outRectVid; -- clipRect.y1 = clipRect.y0 + 2; -- uint32_t *data[] = {m_BlackBar}; -- uint32_t pitches[] = {outRectVid.x1}; -- vdp_st = vdp_output_surface_put_bits_native(outputSurface, -- (void**)data, -- pitches, -- &clipRect); -- CheckStatus(vdp_st, __LINE__); -+ if (m_DisplayState != VDPAU_OPEN) -+ return false; - -- clipRect = outRectVid; -- clipRect.y0 = clipRect.y1 - 2; -- vdp_st = vdp_output_surface_put_bits_native(outputSurface, -- (void**)data, -- pitches, -- &clipRect); -- CheckStatus(vdp_st, __LINE__); -+ *picture = m_presentPicture->DVDPic; -+ picture->vdpau = m_presentPicture; - -- if(m_mixerstep == 1) -- return VC_PICTURE; -- else -- { -- ClearUsedForRender(&past[1]); -- return VC_BUFFER | VC_PICTURE; -- } -- } -+ return true; - } - --bool CVDPAU::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+void CDecoder::Reset() - { -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return false; -- } -+ CSingleLock lock(m_DecoderSection); - -- *picture = m_DVDVideoPics.front(); -- // if this is the first field of an interlaced frame, we'll need -- // this same picture for the second field later -- if (m_mixerstep != 1) -- m_DVDVideoPics.pop(); -- -- picture->format = DVDVideoPicture::FMT_VDPAU; -- picture->iFlags &= DVP_FLAG_DROPPED; -- picture->iWidth = OutWidth; -- picture->iHeight = OutHeight; -- picture->vdpau = this; -+ if (!m_vdpauConfigured) -+ return; - -- if(m_mixerstep) -- { -- picture->iRepeatPicture = -0.5; -- if(m_mixerstep > 1) -+ Message *reply; -+ if (m_vdpauOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) - { -- picture->dts = DVD_NOPTS_VALUE; -- picture->pts = DVD_NOPTS_VALUE; -+ CLog::Log(LOGERROR, "VDPAU::%s - flush returned error", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; - } -+ else -+ m_bufferStats.Reset(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "VDPAU::%s - flush timed out", __FUNCTION__); -+ m_DisplayState = VDPAU_ERROR; - } -- return true; - } - --void CVDPAU::Reset() -+bool CDecoder::CanSkipDeint() - { -- // invalidate surfaces and picture queue when seeking -- ClearUsedForRender(&past[0]); -- ClearUsedForRender(&past[1]); -- ClearUsedForRender(¤t); -- ClearUsedForRender(&future); -- -- while (!m_DVDVideoPics.empty()) -- m_DVDVideoPics.pop(); -+ return m_bufferStats.CanSkipDeint(); - } - --void CVDPAU::Present() -+void CDecoder::SetSpeed(int speed) - { -- //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); -- VdpStatus vdp_st; -- -- CSharedLock lock(m_DecoderSection); -- -- { CSharedLock dLock(m_DisplaySection); -- if (m_DisplayState != VDPAU_OPEN) -- return; -- } -- -- presentSurface = outputSurface; -+ m_speed = speed; -+} - -- vdp_st = vdp_presentation_queue_display(vdp_flip_queue, -- presentSurface, -- 0, -- 0, -- 0); -- CheckStatus(vdp_st, __LINE__); -+void CDecoder::ReturnRenderPicture(CVdpauRenderPicture *renderPic) -+{ -+ m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); - } - --bool CVDPAU::CheckStatus(VdpStatus vdp_st, int line) -+bool CDecoder::CheckStatus(VdpStatus vdp_st, int line) - { - if (vdp_st != VDP_STATUS_OK) - { -- CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -- -- CExclusiveLock lock(m_DisplaySection); -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_vdpauConfig.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); - - if(m_DisplayState == VDPAU_OPEN) - { -@@ -1625,4 +1111,2432 @@ - return false; - } - -+//----------------------------------------------------------------------------- -+// RenderPicture -+//----------------------------------------------------------------------------- -+ -+CVdpauRenderPicture* CVdpauRenderPicture::Acquire() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (refCount == 0) -+ vdpau->Acquire(); -+ -+ refCount++; -+ return this; -+} -+ -+long CVdpauRenderPicture::Release() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ refCount--; -+ if (refCount > 0) -+ return refCount; -+ -+ lock.Leave(); -+ vdpau->ReturnRenderPicture(this); -+ vdpau->ReleasePicReference(); -+ -+ return refCount; -+} -+ -+void CVdpauRenderPicture::ReturnUnused() -+{ -+ { CSingleLock lock(*renderPicSection); -+ if (refCount > 0) -+ return; -+ } -+ if (vdpau) -+ vdpau->ReturnRenderPicture(this); -+} -+ -+//----------------------------------------------------------------------------- -+// Mixer -+//----------------------------------------------------------------------------- -+CMixer::CMixer(CEvent *inMsgEvent) : -+ CThread("Vdpau Mixer Thread"), -+ m_controlPort("ControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("DataPort", inMsgEvent, &m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+} -+ -+CMixer::~CMixer() -+{ -+ Dispose(); -+} -+ -+void CMixer::Start() -+{ -+ Create(); -+} -+ -+void CMixer::Dispose() -+{ -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void CMixer::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "CMixer::OnStartup: Output Thread created"); -+} -+ -+void CMixer::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "CMixer::OnExit: Output Thread terminated"); -+} -+ -+enum MIXER_STATES -+{ -+ M_TOP = 0, // 0 -+ M_TOP_ERROR, // 1 -+ M_TOP_UNCONFIGURED, // 2 -+ M_TOP_CONFIGURED, // 3 -+ M_TOP_CONFIGURED_WAIT1, // 4 -+ M_TOP_CONFIGURED_STEP1, // 5 -+ M_TOP_CONFIGURED_WAIT2, // 6 -+ M_TOP_CONFIGURED_STEP2, // 7 -+}; -+ -+int MIXER_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_WAIT1 -+ 3, //TOP_CONFIGURED_STEP1 -+ 3, //TOP_CONFIGURED_WAIT2 -+ 3, //TOP_CONFIGURED_STEP2 -+}; -+ -+void CMixer::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = MIXER_parentStates[state]) -+ { -+ switch (state) -+ { -+ case M_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::FLUSH: -+ Flush(); -+ msg->Reply(CMixerControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "CMixer::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case M_TOP_ERROR: // TOP -+ break; -+ -+ case M_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::INIT: -+ CVdpauConfig *data; -+ data = (CVdpauConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ if (!m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ msg->Reply(CMixerControlProtocol::ACC); -+ } -+ else -+ { -+ msg->Reply(CMixerControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED: -+ if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case CMixerDataProtocol::FRAME: -+ CVdpauDecodedPicture *frame; -+ frame = (CVdpauDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_decodedPics.push(*frame); -+ } -+ m_extTimeout = 0; -+ return; -+ case CMixerDataProtocol::BUFFER: -+ VdpOutputSurface *surf; -+ surf = (VdpOutputSurface*)msg->data; -+ if (surf) -+ { -+ m_outputSurfaces.push(*surf); -+ } -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_WAIT1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ if (!m_decodedPics.empty() && !m_outputSurfaces.empty()) -+ { -+ m_state = M_TOP_CONFIGURED_STEP1; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+// if (m_extTimeout != 0) -+// { -+// SetPostProcFeatures(false); -+// CLog::Log(LOGWARNING,"CVDPAU::Mixer timeout - decoded: %d, outputSurf: %d", (int)m_decodedPics.size(), (int)m_outputSurfaces.size()); -+// } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_STEP1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ m_mixerInput.push_front(m_decodedPics.front()); -+ m_decodedPics.pop(); -+ if (m_mixerInput.size() < 2) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ return; -+ } -+ InitCycle(); -+ ProcessPicture(); -+ if (m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 1000; -+ return; -+ } -+ if (m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ m_outputSurfaces.pop(); -+ m_config.stats->IncProcessed(); -+ m_config.stats->DecDecoded(); -+ m_dataPort.SendInMessage(CMixerDataProtocol::PICTURE,&m_processPicture,sizeof(m_processPicture)); -+ if (m_mixersteps > 1) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT2; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ FiniCycle(); -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_WAIT2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ if (!m_outputSurfaces.empty()) -+ { -+ m_state = M_TOP_CONFIGURED_STEP2; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+// if (m_extTimeout != 0) -+// { -+// SetPostProcFeatures(false); -+// CLog::Log(LOGNOTICE,"---mixer wait2 decoded: %d, outputSurf: %d", (int)m_decodedPics.size(), (int)m_outputSurfaces.size()); -+// } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case M_TOP_CONFIGURED_STEP2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case CMixerControlProtocol::TIMEOUT: -+ m_processPicture.outputSurface = m_outputSurfaces.front(); -+ m_mixerstep = 1; -+ ProcessPicture(); -+ if (m_vdpError) -+ { -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 1000; -+ return; -+ } -+ if (m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ m_outputSurfaces.pop(); -+ m_config.stats->IncProcessed(); -+ m_dataPort.SendInMessage(CMixerDataProtocol::PICTURE,&m_processPicture,sizeof(m_processPicture)); -+ FiniCycle(); -+ m_state = M_TOP_CONFIGURED_WAIT1; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "CMixer::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void CMixer::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = M_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = CMixerControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Uninit(); -+} -+ -+void CMixer::CreateVdpauMixer() -+{ -+ CLog::Log(LOGNOTICE, " (VDPAU) Creating the video mixer"); -+ -+ InitCSCMatrix(m_config.vidWidth); -+ -+ VdpVideoMixerParameter parameters[] = { -+ VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, -+ VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, -+ VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE}; -+ -+ void const * parameter_values[] = { -+ &m_config.surfaceWidth, -+ &m_config.surfaceHeight, -+ &m_config.vdpChromaType}; -+ -+ VdpStatus vdp_st = VDP_STATUS_ERROR; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_create(m_config.vdpDevice, -+ m_config.featureCount, -+ m_config.vdpFeatures, -+ ARSIZE(parameters), -+ parameters, -+ parameter_values, -+ &m_videoMixer); -+ CheckStatus(vdp_st, __LINE__); -+ -+ // create 3 pitches of black lines needed for clipping top -+ // and bottom lines when de-interlacing -+ m_BlackBar = new uint32_t[3*m_config.outWidth]; -+ memset(m_BlackBar, 0, 3*m_config.outWidth*sizeof(uint32_t)); -+ -+} -+ -+void CMixer::InitCSCMatrix(int Width) -+{ -+ VdpStatus vdp_st; -+ m_Procamp.struct_version = VDP_PROCAMP_VERSION; -+ m_Procamp.brightness = 0.0; -+ m_Procamp.contrast = 1.0; -+ m_Procamp.saturation = 1.0; -+ m_Procamp.hue = 0; -+ vdp_st = m_config.vdpProcs.vdp_generate_csc_matrix(&m_Procamp, -+ (Width < 1000)? VDP_COLOR_STANDARD_ITUR_BT_601 : VDP_COLOR_STANDARD_ITUR_BT_709, -+ &m_CSCMatrix); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::CheckFeatures() -+{ -+ if (m_Upscale != m_config.upscale) -+ { -+ SetHWUpscaling(); -+ m_Upscale = m_config.upscale; -+ } -+ if (m_Brightness != g_settings.m_currentVideoSettings.m_Brightness || -+ m_Contrast != g_settings.m_currentVideoSettings.m_Contrast) -+ { -+ SetColor(); -+ m_Brightness = g_settings.m_currentVideoSettings.m_Brightness; -+ m_Contrast = g_settings.m_currentVideoSettings.m_Contrast; -+ } -+ if (m_NoiseReduction != g_settings.m_currentVideoSettings.m_NoiseReduction) -+ { -+ m_NoiseReduction = g_settings.m_currentVideoSettings.m_NoiseReduction; -+ SetNoiseReduction(); -+ } -+ if (m_Sharpness != g_settings.m_currentVideoSettings.m_Sharpness) -+ { -+ m_Sharpness = g_settings.m_currentVideoSettings.m_Sharpness; -+ SetSharpness(); -+ } -+ if (m_DeintMode != g_settings.m_currentVideoSettings.m_DeinterlaceMode || -+ m_Deint != g_settings.m_currentVideoSettings.m_InterlaceMethod) -+ { -+ m_DeintMode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ m_Deint = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ SetDeinterlacing(); -+ } -+} -+ -+void CMixer::SetPostProcFeatures(bool postProcEnabled) -+{ -+ if (m_PostProc != postProcEnabled) -+ { -+ if (postProcEnabled) -+ { -+ SetNoiseReduction(); -+ SetSharpness(); -+ SetDeinterlacing(); -+ SetHWUpscaling(); -+ } -+ else -+ PostProcOff(); -+ m_PostProc = postProcEnabled; -+ } -+} -+ -+void CMixer::PostProcOff() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -+ VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE}; -+ -+ VdpBool enabled[]={0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION}; -+ -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS}; -+ -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ DisableHQScaling(); -+} -+ -+ -+bool CMixer::GenerateStudioCSCMatrix(VdpColorStandard colorStandard, VdpCSCMatrix &studioCSCMatrix) -+{ -+ // instead use studioCSCKCoeffs601[3], studioCSCKCoeffs709[3] to generate float[3][4] matrix (float studioCSC[3][4]) -+ // m00 = mRY = red: luma factor (contrast factor) (1.0) -+ // m10 = mGY = green: luma factor (contrast factor) (1.0) -+ // m20 = mBY = blue: luma factor (contrast factor) (1.0) -+ // -+ // m01 = mRB = red: blue color diff coeff (0.0) -+ // m11 = mGB = green: blue color diff coeff (-2Kb(1-Kb)/(Kg)) -+ // m21 = mBB = blue: blue color diff coeff ((1-Kb)/0.5) -+ // -+ // m02 = mRR = red: red color diff coeff ((1-Kr)/0.5) -+ // m12 = mGR = green: red color diff coeff (-2Kr(1-Kr)/(Kg)) -+ // m22 = mBR = blue: red color diff coeff (0.0) -+ // -+ // m03 = mRC = red: colour zero offset (brightness factor) (-(1-Kr)/0.5 * (128/255)) -+ // m13 = mGC = green: colour zero offset (brightness factor) ((256/255) * (Kb(1-Kb) + Kr(1-Kr)) / Kg) -+ // m23 = mBC = blue: colour zero offset (brightness factor) (-(1-Kb)/0.5 * (128/255)) -+ -+ // columns -+ int Y = 0; -+ int Cb = 1; -+ int Cr = 2; -+ int C = 3; -+ // rows -+ int R = 0; -+ int G = 1; -+ int B = 2; -+ // colour standard coefficients for red, geen, blue -+ double Kr, Kg, Kb; -+ // colour diff zero position (use standard 8-bit coding precision) -+ double CDZ = 128; //256*0.5 -+ // range excursion (use standard 8-bit coding precision) -+ double EXC = 255; //256-1 -+ -+ if (colorStandard == VDP_COLOR_STANDARD_ITUR_BT_601) -+ { -+ Kr = studioCSCKCoeffs601[0]; -+ Kg = studioCSCKCoeffs601[1]; -+ Kb = studioCSCKCoeffs601[2]; -+ } -+ else // assume VDP_COLOR_STANDARD_ITUR_BT_709 -+ { -+ Kr = studioCSCKCoeffs709[0]; -+ Kg = studioCSCKCoeffs709[1]; -+ Kb = studioCSCKCoeffs709[2]; -+ } -+ // we keep luma unscaled to retain the levels present in source so that 16-235 luma is converted to RGB 16-235 -+ studioCSCMatrix[R][Y] = 1.0; -+ studioCSCMatrix[G][Y] = 1.0; -+ studioCSCMatrix[B][Y] = 1.0; -+ -+ studioCSCMatrix[R][Cb] = 0.0; -+ studioCSCMatrix[G][Cb] = (double)-2 * Kb * (1 - Kb) / Kg; -+ studioCSCMatrix[B][Cb] = (double)(1 - Kb) / 0.5; -+ -+ studioCSCMatrix[R][Cr] = (double)(1 - Kr) / 0.5; -+ studioCSCMatrix[G][Cr] = (double)-2 * Kr * (1 - Kr) / Kg; -+ studioCSCMatrix[B][Cr] = 0.0; -+ -+ studioCSCMatrix[R][C] = (double)-1 * studioCSCMatrix[R][Cr] * CDZ/EXC; -+ studioCSCMatrix[G][C] = (double)-1 * (studioCSCMatrix[G][Cb] + studioCSCMatrix[G][Cr]) * CDZ/EXC; -+ studioCSCMatrix[B][C] = (double)-1 * studioCSCMatrix[B][Cb] * CDZ/EXC; -+ -+ return true; -+} -+ -+void CMixer::SetColor() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_Brightness != g_settings.m_currentVideoSettings.m_Brightness) -+ m_Procamp.brightness = (float)((g_settings.m_currentVideoSettings.m_Brightness)-50) / 100; -+ if (m_Contrast != g_settings.m_currentVideoSettings.m_Contrast) -+ m_Procamp.contrast = (float)((g_settings.m_currentVideoSettings.m_Contrast)+50) / 100; -+ -+ VdpColorStandard colorStandard; -+// if(vid_height >= 600 || vid_width > 1024) -+ if(m_config.surfaceWidth > 1000) -+ colorStandard = VDP_COLOR_STANDARD_ITUR_BT_709; -+ //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_709, &m_CSCMatrix); -+ else -+ colorStandard = VDP_COLOR_STANDARD_ITUR_BT_601; -+ //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); -+ -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; -+ if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) -+ { -+ float studioCSC[3][4]; -+ GenerateStudioCSCMatrix(colorStandard, studioCSC); -+ void const * pm_CSCMatix[] = { &studioCSC }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -+ } -+ else -+ { -+ vdp_st = m_config.vdpProcs.vdp_generate_csc_matrix(&m_Procamp, colorStandard, &m_CSCMatrix); -+ void const * pm_CSCMatix[] = { &m_CSCMatrix }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, pm_CSCMatix); -+ } -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetNoiseReduction() -+{ -+ if(!m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION)) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION }; -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL }; -+ VdpStatus vdp_st; -+ -+ if (!g_settings.m_currentVideoSettings.m_NoiseReduction) -+ { -+ VdpBool enabled[]= {0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ return; -+ } -+ VdpBool enabled[]={1}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ void* nr[] = { &g_settings.m_currentVideoSettings.m_NoiseReduction }; -+ CLog::Log(LOGNOTICE,"Setting Noise Reduction to %f",g_settings.m_currentVideoSettings.m_NoiseReduction); -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, nr); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetSharpness() -+{ -+ if(!m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_SHARPNESS)) -+ return; -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_SHARPNESS }; -+ VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL }; -+ VdpStatus vdp_st; -+ -+ if (!g_settings.m_currentVideoSettings.m_Sharpness) -+ { -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ return; -+ } -+ VdpBool enabled[]={1}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ void* sh[] = { &g_settings.m_currentVideoSettings.m_Sharpness }; -+ CLog::Log(LOGNOTICE,"Setting Sharpness to %f",g_settings.m_currentVideoSettings.m_Sharpness); -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attributes), attributes, sh); -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+EINTERLACEMETHOD CMixer::GetDeinterlacingMethod(bool log /* = false */) -+{ -+ EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ if (method == VS_INTERLACEMETHOD_AUTO) -+ { -+ int deint = -1; -+ if (m_config.outHeight >= 720) -+ deint = g_advancedSettings.m_videoVDPAUdeintHD; -+ else -+ deint = g_advancedSettings.m_videoVDPAUdeintSD; -+ -+ if (deint != -1) -+ { -+ if (m_config.vdpau->Supports(EINTERLACEMETHOD(deint))) -+ { -+ method = EINTERLACEMETHOD(deint); -+ if (log) -+ CLog::Log(LOGNOTICE, "CVDPAU::GetDeinterlacingMethod: set de-interlacing to %d", deint); -+ } -+ else -+ { -+ if (log) -+ CLog::Log(LOGWARNING, "CVDPAU::GetDeinterlacingMethod: method for de-interlacing (advanced settings) not supported"); -+ } -+ } -+ } -+ return method; -+} -+ -+void CMixer::SetDeinterlacing() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = GetDeinterlacingMethod(true); -+ -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL, -+ VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL, -+ VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE }; -+ -+ if (mode == VS_DEINTERLACEMODE_OFF) -+ { -+ VdpBool enabled[] = {0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else -+ { -+ if (method == VS_INTERLACEMETHOD_AUTO) -+ { -+ VdpBool enabled[] = {1,1,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF) -+ { -+ VdpBool enabled[] = {1,0,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else if (method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF) -+ { -+ VdpBool enabled[] = {1,1,0}; -+ if (g_advancedSettings.m_videoVDPAUtelecine) -+ enabled[2] = 1; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ else -+ { -+ VdpBool enabled[]={0,0,0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ } -+ } -+ CheckStatus(vdp_st, __LINE__); -+ -+ SetDeintSkipChroma(); -+ -+ m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); -+} -+ -+void CMixer::SetDeintSkipChroma() -+{ -+ VdpVideoMixerAttribute attribute[] = { VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE}; -+ VdpStatus vdp_st; -+ -+ uint8_t val; -+ if (g_advancedSettings.m_videoVDPAUdeintSkipChromaHD && m_config.outHeight >= 720) -+ val = 1; -+ else -+ val = 0; -+ -+ void const *values[]={&val}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_attribute_values(m_videoMixer, ARSIZE(attribute), attribute, values); -+ -+ CheckStatus(vdp_st, __LINE__); -+} -+ -+void CMixer::SetHWUpscaling() -+{ -+#ifdef VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 -+ -+ VdpStatus vdp_st; -+ VdpBool enabled[]={1}; -+ switch (m_config.upscale) -+ { -+ case 9: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 8: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 7: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 6: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 5: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 4: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 3: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 2: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ case 1: -+ if (m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ break; -+ } -+ default: -+ DisableHQScaling(); -+ return; -+ } -+ CheckStatus(vdp_st, __LINE__); -+#endif -+} -+ -+void CMixer::DisableHQScaling() -+{ -+ VdpStatus vdp_st; -+ -+ if (m_videoMixer == VDP_INVALID_HANDLE) -+ return; -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L2 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L3 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L4 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L5 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L6 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L7 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ -+ if(m_config.vdpau->Supports(VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9)) -+ { -+ VdpVideoMixerFeature feature[] = { VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9 }; -+ VdpBool enabled[]={0}; -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); -+ CheckStatus(vdp_st, __LINE__); -+ } -+} -+ -+ -+void CMixer::Init() -+{ -+ m_Brightness = 0.0; -+ m_Contrast = 0.0; -+ m_NoiseReduction = 0.0; -+ m_Sharpness = 0.0; -+ m_DeintMode = 0; -+ m_Deint = 0; -+ m_PostProc = false; -+ m_vdpError = false; -+ -+ m_config.upscale = g_advancedSettings.m_videoVDPAUScaling; -+ m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); -+ -+ CreateVdpauMixer(); -+} -+ -+void CMixer::Uninit() -+{ -+ Flush(); -+ while (!m_outputSurfaces.empty()) -+ { -+ m_outputSurfaces.pop(); -+ } -+ m_config.vdpProcs.vdp_video_mixer_destroy(m_videoMixer); -+} -+ -+void CMixer::Flush() -+{ -+ while (!m_mixerInput.empty()) -+ { -+ CVdpauDecodedPicture pic = m_mixerInput.back(); -+ m_mixerInput.pop_back(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ while (!m_decodedPics.empty()) -+ { -+ CVdpauDecodedPicture pic = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ Message *msg; -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == CMixerDataProtocol::FRAME) -+ { -+ CVdpauDecodedPicture pic = *(CVdpauDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (msg->signal == CMixerDataProtocol::BUFFER) -+ { -+ VdpOutputSurface *surf; -+ surf = (VdpOutputSurface*)msg->data; -+ m_outputSurfaces.push(*surf); -+ } -+ msg->Release(); -+ } -+} -+ -+void CMixer::InitCycle() -+{ -+ CheckFeatures(); -+ uint64_t latency; -+ int speed; -+ m_config.stats->GetParams(latency, speed); -+ latency = (latency*1000)/CurrentHostFrequency(); -+ if (speed != DVD_PLAYSPEED_NORMAL) -+ SetPostProcFeatures(false); -+ else -+ SetPostProcFeatures(true); -+ -+ m_config.stats->SetCanSkipDeint(false); -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = GetDeinterlacingMethod(); -+ bool interlaced = m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_INTERLACED; -+ -+ if (mode == VS_DEINTERLACEMODE_FORCE || -+ (mode == VS_DEINTERLACEMODE_AUTO && interlaced)) -+ { -+ if((method == VS_INTERLACEMETHOD_AUTO && interlaced) -+ || method == VS_INTERLACEMETHOD_VDPAU_BOB -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE ) -+ { -+ if(method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF -+ || method == VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF -+ || !g_graphicsContext.IsFullScreenVideo()) -+ m_mixersteps = 1; -+ else -+ { -+ m_mixersteps = 2; -+ m_config.stats->SetCanSkipDeint(true); -+ } -+ -+ if (m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_DROPDEINT) -+ { -+ m_mixersteps = 1; -+ } -+ -+ if(m_mixerInput[1].DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ else -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ m_config.useInteropYuv = false; -+ } -+ else if (method == VS_INTERLACEMETHOD_RENDER_BOB && m_config.useInteropYuv) -+ { -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU_420; -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "CMixer::%s - interlace method not supported", __FUNCTION__); -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ } -+ } -+ else -+ { -+ m_mixersteps = 1; -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; -+ -+ if (m_config.useInteropYuv) -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU_420; -+ else -+ { -+ m_mixerInput[1].DVDPic.format = DVDVideoPicture::FMT_VDPAU; -+ m_mixerInput[1].DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ } -+ } -+ m_mixerstep = 0; -+ -+ if (m_mixerInput[1].DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ m_processPicture.outputSurface = m_outputSurfaces.front(); -+ m_mixerInput[1].DVDPic.iWidth = m_config.outWidth; -+ m_mixerInput[1].DVDPic.iHeight = m_config.outHeight; -+ } -+ else -+ { -+ m_mixerInput[1].DVDPic.iWidth = m_config.vidWidth; -+ m_mixerInput[1].DVDPic.iHeight = m_config.vidHeight; -+ } -+ -+ m_processPicture.DVDPic = m_mixerInput[1].DVDPic; -+ m_processPicture.render = m_mixerInput[1].render; -+} -+ -+void CMixer::FiniCycle() -+{ -+ while (m_mixerInput.size() > 3) -+ { -+ CVdpauDecodedPicture &tmp = m_mixerInput.back(); -+ if (tmp.render && m_processPicture.DVDPic.format != DVDVideoPicture::FMT_VDPAU_420) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ tmp.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ m_mixerInput.pop_back(); -+// m_config.stats->DecDecoded(); -+ } -+} -+ -+void CMixer::ProcessPicture() -+{ -+ if (m_processPicture.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ return; -+ -+ int cmd = 0; -+ m_config.stats->GetCmd(cmd); -+ if (cmd & DVP_FLAG_SKIP_PROC) -+ { -+ m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; -+ return; -+ } -+ -+ VdpStatus vdp_st; -+ -+ if (m_mixerstep == 1) -+ { -+ if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD) -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD; -+ else -+ m_mixerfield = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; -+ } -+ -+ VdpVideoSurface past_surfaces[4] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE, VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -+ VdpVideoSurface futu_surfaces[2] = { VDP_INVALID_HANDLE, VDP_INVALID_HANDLE }; -+ uint32_t pastCount = 4; -+ uint32_t futuCount = 2; -+ -+ if(m_mixerfield == VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -+ { -+ // use only 2 past 1 future for progressive/weave -+ // (only used for postproc anyway eg noise reduction) -+ if (m_mixerInput.size() > 3) -+ past_surfaces[1] = m_mixerInput[3].render->surface; -+ if (m_mixerInput.size() > 2) -+ past_surfaces[0] = m_mixerInput[2].render->surface; -+ futu_surfaces[0] = m_mixerInput[0].render->surface; -+ pastCount = 2; -+ futuCount = 1; -+ } -+ else -+ { -+ if(m_mixerstep == 0) -+ { // first field -+ if (m_mixerInput.size() > 3) -+ { -+ past_surfaces[3] = m_mixerInput[3].render->surface; -+ past_surfaces[2] = m_mixerInput[3].render->surface; -+ } -+ if (m_mixerInput.size() > 2) -+ { -+ past_surfaces[1] = m_mixerInput[2].render->surface; -+ past_surfaces[0] = m_mixerInput[2].render->surface; -+ } -+ futu_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[1] = m_mixerInput[0].render->surface;; -+ } -+ else -+ { // second field -+ if (m_mixerInput.size() > 3) -+ { -+ past_surfaces[3] = m_mixerInput[3].render->surface; -+ } -+ if (m_mixerInput.size() > 2) -+ { -+ past_surfaces[2] = m_mixerInput[2].render->surface; -+ past_surfaces[1] = m_mixerInput[2].render->surface; -+ } -+ past_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[0] = m_mixerInput[1].render->surface; -+ futu_surfaces[1] = m_mixerInput[1].render->surface; -+ -+ m_processPicture.DVDPic.pts = DVD_NOPTS_VALUE; -+ m_processPicture.DVDPic.dts = DVD_NOPTS_VALUE; -+ } -+ m_processPicture.DVDPic.iRepeatPicture = 0.0; -+ } // interlaced -+ -+ VdpRect sourceRect; -+ sourceRect.x0 = 0; -+ sourceRect.y0 = 0; -+ sourceRect.x1 = m_config.vidWidth; -+ sourceRect.y1 = m_config.vidHeight; -+ -+ VdpRect destRect; -+ destRect.x0 = 0; -+ destRect.y0 = 0; -+ destRect.x1 = m_config.outWidth; -+ destRect.y1 = m_config.outHeight; -+ -+ // start vdpau video mixer -+ vdp_st = m_config.vdpProcs.vdp_video_mixer_render(m_videoMixer, -+ VDP_INVALID_HANDLE, -+ 0, -+ m_mixerfield, -+ pastCount, -+ past_surfaces, -+ m_mixerInput[1].render->surface, -+ futuCount, -+ futu_surfaces, -+ &sourceRect, -+ m_processPicture.outputSurface, -+ &destRect, -+ &destRect, -+ 0, -+ NULL); -+ CheckStatus(vdp_st, __LINE__); -+ -+ if (m_mixerfield != VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME) -+ { -+ // in order to clip top and bottom lines when de-interlacing -+ // we black those lines as a work around for not working -+ // background colour using the mixer -+ // pixel perfect is preferred over overscanning or zooming -+ -+ VdpRect clipRect = destRect; -+ clipRect.y1 = clipRect.y0 + 2; -+ uint32_t *data[] = {m_BlackBar}; -+ uint32_t pitches[] = {destRect.x1}; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_put_bits_native(m_processPicture.outputSurface, -+ (void**)data, -+ pitches, -+ &clipRect); -+ CheckStatus(vdp_st, __LINE__); -+ -+ clipRect = destRect; -+ clipRect.y0 = clipRect.y1 - 2; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_put_bits_native(m_processPicture.outputSurface, -+ (void**)data, -+ pitches, -+ &clipRect); -+ CheckStatus(vdp_st, __LINE__); -+ } -+} -+ -+ -+bool CMixer::CheckStatus(VdpStatus vdp_st, int line) -+{ -+ if (vdp_st != VDP_STATUS_OK) -+ { -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_config.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -+ m_vdpError = true; -+ return true; -+ } -+ return false; -+} -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+COutput::COutput(CEvent *inMsgEvent) : -+ CThread("Vdpau Output Thread"), -+ m_controlPort("OutputControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("OutputDataPort", inMsgEvent, &m_outMsgEvent), -+ m_mixer(&m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+ -+ CVdpauRenderPicture pic; -+ pic.renderPicSection = &m_bufferPool.renderPicSec; -+ pic.refCount = 0; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; i++) -+ { -+ m_bufferPool.allRenderPics.push_back(pic); -+ } -+ for (unsigned int i = 0; i < m_bufferPool.allRenderPics.size(); ++i) -+ { -+ m_bufferPool.freeRenderPics.push_back(&m_bufferPool.allRenderPics[i]); -+ } -+} -+ -+void COutput::Start() -+{ -+ Create(); -+} -+ -+COutput::~COutput() -+{ -+ Dispose(); -+ -+ m_bufferPool.freeRenderPics.clear(); -+ m_bufferPool.usedRenderPics.clear(); -+ m_bufferPool.allRenderPics.clear(); -+} -+ -+void COutput::Dispose() -+{ -+ CSingleLock lock(g_graphicsContext); -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void COutput::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnStartup: Output Thread created"); -+} -+ -+void COutput::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnExit: Output Thread terminated"); -+} -+ -+enum OUTPUT_STATES -+{ -+ O_TOP = 0, // 0 -+ O_TOP_ERROR, // 1 -+ O_TOP_UNCONFIGURED, // 2 -+ O_TOP_CONFIGURED, // 3 -+ O_TOP_CONFIGURED_IDLE, // 4 -+ O_TOP_CONFIGURED_WORK, // 5 -+}; -+ -+int VDPAU_OUTPUT_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_IDLE -+ 3, //TOP_CONFIGURED_WORK -+}; -+ -+void COutput::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = VDPAU_OUTPUT_parentStates[state]) -+ { -+ switch (state) -+ { -+ case O_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::RETURNPIC: -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "COutput::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case O_TOP_ERROR: -+ break; -+ -+ case O_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::INIT: -+ CVdpauConfig *data; -+ data = (CVdpauConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ Message *reply; -+ if (m_mixer.m_controlPort.SendOutMessageSync(CMixerControlProtocol::INIT, -+ &reply, 1000, &m_config, sizeof(m_config))) -+ { -+ if (reply->signal != CMixerControlProtocol::ACC) -+ m_vdpError = true; -+ reply->Release(); -+ } -+ -+ // set initial number of -+ m_bufferPool.numOutputSurfaces = 4; -+ EnsureBufferPool(); -+ if (!m_vdpError) -+ { -+ m_state = O_TOP_CONFIGURED_IDLE; -+ msg->Reply(COutputControlProtocol::ACC); -+ } -+ else -+ { -+ m_state = O_TOP_ERROR; -+ msg->Reply(COutputControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::NEWFRAME: -+ CVdpauDecodedPicture *frame; -+ frame = (CVdpauDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::FRAME, -+ frame,sizeof(CVdpauDecodedPicture)); -+ } -+ return; -+ case COutputDataProtocol::RETURNPIC: -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ m_controlPort.SendInMessage(COutputControlProtocol::STATS); -+ m_state = O_TOP_CONFIGURED_WORK; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_mixer.m_dataPort) -+ { -+ switch (signal) -+ { -+ case CMixerDataProtocol::PICTURE: -+ CVdpauProcessedPicture *pic; -+ pic = (CVdpauProcessedPicture*)msg->data; -+ m_bufferPool.processedPics.push(*pic); -+ m_state = O_TOP_CONFIGURED_WORK; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_IDLE: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+// uint16_t decoded, processed, render; -+// m_config.stats->Get(decoded, processed, render); -+// CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WORK: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (HasWork()) -+ { -+ CVdpauRenderPicture *pic; -+ pic = ProcessMixerPicture(); -+ if (pic) -+ { -+ m_config.stats->DecProcessed(); -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ m_extTimeout = 1; -+ } -+ else -+ { -+ m_state = O_TOP_CONFIGURED_IDLE; -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "COutput::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void COutput::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = O_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ // check mixer data port -+ else if (m_mixer.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_mixer.m_dataPort; -+ } -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = COutputControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Flush(); -+ Uninit(); -+} -+ -+bool COutput::Init() -+{ -+ if (!CreateGlxContext()) -+ return false; -+ -+ if (!GLInit()) -+ return false; -+ -+ m_mixer.Start(); -+ m_vdpError = false; -+ -+ return true; -+} -+ -+bool COutput::Uninit() -+{ -+ m_mixer.Dispose(); -+ GLUnmapSurfaces(); -+ GLUnbindPixmaps(); -+ ReleaseBufferPool(); -+ DestroyGlxContext(); -+ return true; -+} -+ -+void COutput::Flush() -+{ -+ Message *reply; -+ if (m_mixer.m_controlPort.SendOutMessageSync(CMixerControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ reply->Release(); -+ } -+ else -+ CLog::Log(LOGERROR, "Coutput::%s - failed to flush mixer", __FUNCTION__); -+ -+ Message *msg; -+ while (m_mixer.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == CMixerDataProtocol::PICTURE) -+ { -+ CVdpauProcessedPicture pic = *(CVdpauProcessedPicture*)msg->data; -+ if (pic.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::NEWFRAME) -+ { -+ CVdpauDecodedPicture pic = *(CVdpauDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (msg->signal == COutputDataProtocol::RETURNPIC) -+ { -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ CVdpauRenderPicture *pic; -+ pic = *((CVdpauRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ } -+ -+ // reset used render flag which was cleared on mixer flush -+ std::deque::iterator it; -+ for (it = m_bufferPool.usedRenderPics.begin(); it != m_bufferPool.usedRenderPics.end(); ++it) -+ { -+ if ((*it)->DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ std::map::iterator it2; -+ it2 = m_bufferPool.glVideoSurfaceMap.find((*it)->sourceIdx); -+ if (it2 == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::Flush - gl surface not found"); -+ continue; -+ } -+ vdpau_render_state *render = it2->second.sourceVuv; -+ if (render) -+ render->state |= FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ } -+} -+ -+bool COutput::HasWork() -+{ -+ if (m_config.usePixmaps) -+ { -+ if (!m_bufferPool.processedPics.empty() && FindFreePixmap() >= 0) -+ return true; -+ if (!m_bufferPool.notVisiblePixmaps.empty() && !m_bufferPool.freeRenderPics.empty()) -+ return true; -+ return false; -+ } -+ else -+ { -+ if (!m_bufferPool.processedPics.empty() && !m_bufferPool.freeRenderPics.empty()) -+ return true; -+ return false; -+ } -+} -+ -+CVdpauRenderPicture* COutput::ProcessMixerPicture() -+{ -+ CVdpauRenderPicture *retPic = 0; -+ -+ if (m_config.usePixmaps) -+ { -+ if (!m_bufferPool.processedPics.empty() && FindFreePixmap() >= 0) -+ { -+ unsigned int i = FindFreePixmap(); -+ VdpauBufferPool::Pixmaps *pixmap = &m_bufferPool.pixmaps[i]; -+ pixmap->used = true; -+ CVdpauProcessedPicture pic = m_bufferPool.processedPics.front(); -+ m_bufferPool.processedPics.pop(); -+ pixmap->surface = pic.outputSurface; -+ pixmap->DVDPic = pic.DVDPic; -+ pixmap->id = i; -+ m_bufferPool.notVisiblePixmaps.push_back(pixmap); -+ VdpStatus vdp_st; -+ m_config.vdpProcs.vdp_presentation_queue_display(pixmap->vdp_flip_queue, -+ pixmap->surface,0,0,0); -+ } -+ if (!m_bufferPool.notVisiblePixmaps.empty() && !m_bufferPool.freeRenderPics.empty()) -+ { -+ VdpStatus vdp_st; -+ VdpTime time; -+ VdpPresentationQueueStatus status; -+ VdpauBufferPool::Pixmaps *pixmap = m_bufferPool.notVisiblePixmaps.front(); -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_query_surface_status( -+ pixmap->vdp_flip_queue, pixmap->surface, &status, &time); -+ -+ if (vdp_st == VDP_STATUS_OK && status == VDP_PRESENTATION_QUEUE_STATUS_VISIBLE) -+ { -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ retPic->sourceIdx = pixmap->id; -+ retPic->DVDPic = pixmap->DVDPic; -+ retPic->valid = true; -+ retPic->texture[0] = pixmap->texture; -+ retPic->crop = CRect(0,0,0,0); -+ m_bufferPool.notVisiblePixmaps.pop_front(); -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, &pixmap->surface, sizeof(pixmap->surface)); -+ } -+ } -+ } // pixmap -+ else if (!m_bufferPool.processedPics.empty() && !m_bufferPool.freeRenderPics.empty()) -+ { -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ CVdpauProcessedPicture procPic = m_bufferPool.processedPics.front(); -+ m_bufferPool.processedPics.pop(); -+ -+ retPic->DVDPic = procPic.DVDPic; -+ retPic->valid = true; -+ if (retPic->DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ m_config.useInteropYuv = false; -+ m_bufferPool.numOutputSurfaces = NUM_RENDER_PICS; -+ EnsureBufferPool(); -+ GLMapSurfaces(); -+ retPic->sourceIdx = procPic.outputSurface; -+ retPic->texture[0] = m_bufferPool.glOutputSurfaceMap[procPic.outputSurface].texture[0]; -+ retPic->crop = CRect(0,0,0,0); -+ } -+ else -+ { -+ m_config.useInteropYuv = true; -+ GLMapSurfaces(); -+ retPic->sourceIdx = procPic.render->surface; -+ for (unsigned int i=0; i<4; ++i) -+ retPic->texture[i] = m_bufferPool.glVideoSurfaceMap[procPic.render->surface].texture[i]; -+ retPic->texWidth = m_config.surfaceWidth; -+ retPic->texHeight = m_config.surfaceHeight; -+ retPic->crop.x1 = 0; -+ retPic->crop.y1 = 0; -+ retPic->crop.x2 = m_config.surfaceWidth - m_config.vidWidth; -+ retPic->crop.y2 = m_config.surfaceHeight - m_config.vidHeight; -+ } -+ } -+ return retPic; -+} -+ -+void COutput::ProcessReturnPicture(CVdpauRenderPicture *pic) -+{ -+ std::deque::iterator it; -+ it = std::find(m_bufferPool.usedRenderPics.begin(), m_bufferPool.usedRenderPics.end(), pic); -+ if (it == m_bufferPool.usedRenderPics.end()) -+ { -+ CLog::Log(LOGWARNING, "COutput::ProcessReturnPicture - pic not found"); -+ return; -+ } -+ m_bufferPool.usedRenderPics.erase(it); -+ m_bufferPool.freeRenderPics.push_back(pic); -+ if (!pic->valid) -+ { -+ CLog::Log(LOGDEBUG, "COutput::%s - return of invalid render pic", __FUNCTION__); -+ return; -+ } -+ -+ if (m_config.usePixmaps) -+ { -+ m_bufferPool.pixmaps[pic->sourceIdx].used = false; -+ return; -+ } -+ else if (pic->DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) -+ { -+ std::map::iterator it; -+ it = m_bufferPool.glVideoSurfaceMap.find(pic->sourceIdx); -+ if (it == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); -+ return; -+ } -+ vdpau_render_state *render = it->second.sourceVuv; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ render->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -+ } -+ else if (pic->DVDPic.format == DVDVideoPicture::FMT_VDPAU) -+ { -+ std::map::iterator it; -+ it = m_bufferPool.glOutputSurfaceMap.find(pic->sourceIdx); -+ if (it == m_bufferPool.glOutputSurfaceMap.end()) -+ { -+ CLog::Log(LOGDEBUG, "COutput::ProcessReturnPicture - gl surface not found"); -+ return; -+ } -+ VdpOutputSurface outSurf = it->second.sourceRgb; -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, &outSurf, sizeof(outSurf)); -+ } -+} -+ -+int COutput::FindFreePixmap() -+{ -+ // find free pixmap -+ unsigned int i; -+ for (i = 0; i < m_bufferPool.pixmaps.size(); ++i) -+ { -+ if (!m_bufferPool.pixmaps[i].used) -+ break; -+ } -+ if (i == m_bufferPool.pixmaps.size()) -+ return -1; -+ else -+ return i; -+} -+ -+bool COutput::EnsureBufferPool() -+{ -+ VdpStatus vdp_st; -+ -+ // Creation of outputSurfaces -+ VdpOutputSurface outputSurface; -+ for (int i = m_bufferPool.outputSurfaces.size(); i < m_bufferPool.numOutputSurfaces; i++) -+ { -+ vdp_st = m_config.vdpProcs.vdp_output_surface_create(m_config.vdpDevice, -+ VDP_RGBA_FORMAT_B8G8R8A8, -+ m_config.outWidth, -+ m_config.outHeight, -+ &outputSurface); -+ if (CheckStatus(vdp_st, __LINE__)) -+ return false; -+ m_bufferPool.outputSurfaces.push_back(outputSurface); -+ -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, -+ &outputSurface, -+ sizeof(VdpOutputSurface)); -+ CLog::Log(LOGNOTICE, "VDPAU::COutput::InitBufferPool - Output Surface created"); -+ } -+ -+ -+ if (m_config.usePixmaps && m_bufferPool.pixmaps.empty()) -+ { -+ // create pixmpas -+ VdpauBufferPool::Pixmaps pixmap; -+ int numPixmaps = NUM_RENDER_PICS; -+ for (unsigned int i = 0; i < numPixmaps; i++) -+ { -+ pixmap.pixmap = None; -+ pixmap.glPixmap = None; -+ pixmap.vdp_flip_queue = VDP_INVALID_HANDLE; -+ pixmap.vdp_flip_target = VDP_INVALID_HANDLE; -+ MakePixmap(pixmap); -+ glXMakeCurrent(m_Display, None, NULL); -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_target_create_x11(m_config.vdpDevice, -+ pixmap.pixmap, //x_window, -+ &pixmap.vdp_flip_target); -+ -+ CheckStatus(vdp_st, __LINE__); -+ -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_create(m_config.vdpDevice, -+ pixmap.vdp_flip_target, -+ &pixmap.vdp_flip_queue); -+ CheckStatus(vdp_st, __LINE__); -+ glXMakeCurrent(m_Display, m_glPixmap, m_glContext); -+ -+ pixmap.id = i; -+ pixmap.used = false; -+ m_bufferPool.pixmaps.push_back(pixmap); -+ } -+ GLBindPixmaps(); -+ } -+ -+ return true; -+} -+ -+void COutput::ReleaseBufferPool() -+{ -+ VdpStatus vdp_st; -+ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.usePixmaps) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); ++i) -+ { -+ if (m_bufferPool.pixmaps[i].vdp_flip_queue != VDP_INVALID_HANDLE) -+ { -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_destroy(m_bufferPool.pixmaps[i].vdp_flip_queue); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ if (m_bufferPool.pixmaps[i].vdp_flip_target != VDP_INVALID_HANDLE) -+ { -+ vdp_st = m_config.vdpProcs.vdp_presentation_queue_target_destroy(m_bufferPool.pixmaps[i].vdp_flip_target); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ if (m_bufferPool.pixmaps[i].glPixmap) -+ { -+ glXDestroyPixmap(m_Display, m_bufferPool.pixmaps[i].glPixmap); -+ } -+ if (m_bufferPool.pixmaps[i].pixmap) -+ { -+ XFreePixmap(m_Display, m_bufferPool.pixmaps[i].pixmap); -+ } -+ } -+ m_bufferPool.pixmaps.clear(); -+ } -+ -+ // release all output surfaces -+ for (unsigned int i = 0; i < m_bufferPool.outputSurfaces.size(); ++i) -+ { -+ if (m_bufferPool.outputSurfaces[i] == VDP_INVALID_HANDLE) -+ continue; -+ vdp_st = m_config.vdpProcs.vdp_output_surface_destroy(m_bufferPool.outputSurfaces[i]); -+ CheckStatus(vdp_st, __LINE__); -+ } -+ m_bufferPool.outputSurfaces.clear(); -+ -+ // invalidate all used render pictures -+ for (unsigned int i = 0; i < m_bufferPool.usedRenderPics.size(); ++i) -+ { -+ m_bufferPool.usedRenderPics[i]->valid = false; -+ } -+} -+ -+void COutput::InitMixer() -+{ -+ for (unsigned int i = 0; i < m_bufferPool.outputSurfaces.size(); ++i) -+ { -+ m_mixer.m_dataPort.SendOutMessage(CMixerDataProtocol::BUFFER, -+ &m_bufferPool.outputSurfaces[i], -+ sizeof(VdpOutputSurface)); -+ } -+} -+ -+bool COutput::MakePixmap(VdpauBufferPool::Pixmaps &pixmap) -+{ -+ CLog::Log(LOGNOTICE,"Creating %ix%i pixmap", m_config.outWidth, m_config.outHeight); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, DefaultRootWindow(m_Display), &wndattribs); -+ -+ pixmap.pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ m_config.outWidth, -+ m_config.outHeight, -+ wndattribs.depth); -+ if (!pixmap.pixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COUtput::MakePixmap - GLX Error: MakePixmap: Unable to create XPixmap"); -+ return false; -+ } -+ -+// XGCValues values = {}; -+// GC xgc; -+// values.foreground = BlackPixel (m_Display, DefaultScreen (m_Display)); -+// xgc = XCreateGC(m_Display, pixmap.pixmap, GCForeground, &values); -+// XFillRectangle(m_Display, pixmap.pixmap, xgc, 0, 0, m_config.outWidth, m_config.outHeight); -+// XFreeGC(m_Display, xgc); -+ -+ if(!MakePixmapGL(pixmap)) -+ return false; -+ -+ return true; -+} -+ -+bool COutput::MakePixmapGL(VdpauBufferPool::Pixmaps &pixmap) -+{ -+ int num=0; -+ int fbConfigIndex = 0; -+ -+ int doubleVisAttributes[] = { -+ GLX_RENDER_TYPE, GLX_RGBA_BIT, -+ GLX_RED_SIZE, 8, -+ GLX_GREEN_SIZE, 8, -+ GLX_BLUE_SIZE, 8, -+ GLX_ALPHA_SIZE, 8, -+ GLX_DEPTH_SIZE, 8, -+ GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, -+ GLX_BIND_TO_TEXTURE_RGBA_EXT, True, -+ GLX_DOUBLEBUFFER, False, -+ GLX_Y_INVERTED_EXT, True, -+ GLX_X_RENDERABLE, True, -+ None -+ }; -+ -+ int pixmapAttribs[] = { -+ GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, -+ GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT, -+ None -+ }; -+ -+ GLXFBConfig *fbConfigs; -+ fbConfigs = glXChooseFBConfig(m_Display, DefaultScreen(m_Display), doubleVisAttributes, &num); -+ if (fbConfigs==NULL) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::MakPixmapGL - No compatible framebuffers found"); -+ return false; -+ } -+ fbConfigIndex = 0; -+ -+ pixmap.glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], pixmap.pixmap, pixmapAttribs); -+ -+ if (!pixmap.glPixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::MakPixmapGL - Could not create Pixmap"); -+ XFree(fbConfigs); -+ return false; -+ } -+ XFree(fbConfigs); -+ return true; -+} -+ -+bool COutput::GLInit() -+{ -+ glXBindTexImageEXT = NULL; -+ glXReleaseTexImageEXT = NULL; -+#ifdef GL_NV_vdpau_interop -+ glVDPAUInitNV = NULL; -+ glVDPAUFiniNV = NULL; -+ glVDPAURegisterOutputSurfaceNV = NULL; -+ glVDPAURegisterVideoSurfaceNV = NULL; -+ glVDPAUIsSurfaceNV = NULL; -+ glVDPAUUnregisterSurfaceNV = NULL; -+ glVDPAUSurfaceAccessNV = NULL; -+ glVDPAUMapSurfacesNV = NULL; -+ glVDPAUUnmapSurfacesNV = NULL; -+ glVDPAUGetSurfaceivNV = NULL; -+#endif -+ -+ m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"); -+ -+#ifdef GL_NV_vdpau_interop -+ if (glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ if (!glVDPAUInitNV) -+ glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUInitNV"); -+ if (!glVDPAUFiniNV) -+ glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glXGetProcAddress((GLubyte *) "glVDPAUFiniNV"); -+ if (!glVDPAURegisterOutputSurfaceNV) -+ glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterOutputSurfaceNV"); -+ if (!glVDPAURegisterVideoSurfaceNV) -+ glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAURegisterVideoSurfaceNV"); -+ if (!glVDPAUIsSurfaceNV) -+ glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUIsSurfaceNV"); -+ if (!glVDPAUUnregisterSurfaceNV) -+ glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnregisterSurfaceNV"); -+ if (!glVDPAUSurfaceAccessNV) -+ glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUSurfaceAccessNV"); -+ if (!glVDPAUMapSurfacesNV) -+ glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUMapSurfacesNV"); -+ if (!glVDPAUUnmapSurfacesNV) -+ glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUUnmapSurfacesNV"); -+ if (!glVDPAUGetSurfaceivNV) -+ glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glXGetProcAddress((GLubyte *) "glVDPAUGetSurfaceivNV"); -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput GL interop supported"); -+ } -+ else -+#endif -+ { -+ m_config.usePixmaps = true; -+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); -+ } -+ if (!glXBindTexImageEXT) -+ glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); -+ if (!glXReleaseTexImageEXT) -+ glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT"); -+ -+#ifdef GL_NV_vdpau_interop -+ if (!m_config.usePixmaps) -+ { -+ while (glGetError() != GL_NO_ERROR); -+ glVDPAUInitNV(reinterpret_cast(m_config.vdpDevice), reinterpret_cast(m_config.vdpProcs.vdp_get_proc_address)); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput - GLInitInterop glVDPAUInitNV failed"); -+ m_vdpError = true; -+ return false; -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: vdpau gl interop initialized"); -+ } -+#endif -+ return true; -+} -+ -+void COutput::GLMapSurfaces() -+{ -+#ifdef GL_NV_vdpau_interop -+ if (m_config.usePixmaps) -+ return; -+ -+ if (m_config.useInteropYuv) -+ { -+ VdpauBufferPool::GLVideoSurface glSurface; -+ if (m_config.videoSurfaces->size() != m_bufferPool.glVideoSurfaceMap.size()) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ for (int i = 0; i < m_config.videoSurfaces->size(); i++) -+ { -+ if ((*m_config.videoSurfaces)[i]->surface == VDP_INVALID_HANDLE) -+ continue; -+ -+ if (m_bufferPool.glVideoSurfaceMap.find((*m_config.videoSurfaces)[i]->surface) == m_bufferPool.glVideoSurfaceMap.end()) -+ { -+ glSurface.sourceVuv = (*m_config.videoSurfaces)[i]; -+ while (glGetError() != GL_NO_ERROR) ; -+ glGenTextures(4, glSurface.texture); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error creating texture"); -+ m_vdpError = true; -+ } -+ glSurface.glVdpauSurface = glVDPAURegisterVideoSurfaceNV(reinterpret_cast((*m_config.videoSurfaces)[i]->surface), -+ GL_TEXTURE_2D, 4, glSurface.texture); -+ -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error register video surface"); -+ m_vdpError = true; -+ } -+ glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); -+ m_vdpError = true; -+ } -+ glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); -+ m_vdpError = true; -+ } -+ m_bufferPool.glVideoSurfaceMap[(*m_config.videoSurfaces)[i]->surface] = glSurface; -+ if (m_vdpError) -+ return; -+ CLog::Log(LOGNOTICE, "VDPAU::COutput registered surface"); -+ } -+ } -+ } -+ } -+ else -+ { -+ if (m_bufferPool.glOutputSurfaceMap.size() != m_bufferPool.numOutputSurfaces) -+ { -+ VdpauBufferPool::GLVideoSurface glSurface; -+ for (int i=m_bufferPool.glOutputSurfaceMap.size(); i(m_bufferPool.outputSurfaces[i]), -+ GL_TEXTURE_2D, 1, glSurface.texture); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error register output surface"); -+ m_vdpError = true; -+ } -+ glVDPAUSurfaceAccessNV(glSurface.glVdpauSurface, GL_READ_ONLY); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error setting access"); -+ m_vdpError = true; -+ } -+ glVDPAUMapSurfacesNV(1, &glSurface.glVdpauSurface); -+ if (glGetError() != GL_NO_ERROR) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput error mapping surface"); -+ m_vdpError = true; -+ } -+ m_bufferPool.glOutputSurfaceMap[m_bufferPool.outputSurfaces[i]] = glSurface; -+ if (m_vdpError) -+ return; -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput registered output surfaces"); -+ } -+ } -+#endif -+} -+ -+void COutput::GLUnmapSurfaces() -+{ -+#ifdef GL_NV_vdpau_interop -+ if (m_config.usePixmaps) -+ return; -+ -+ { CSingleLock lock(*m_config.videoSurfaceSec); -+ std::map::iterator it; -+ for (it = m_bufferPool.glVideoSurfaceMap.begin(); it != m_bufferPool.glVideoSurfaceMap.end(); ++it) -+ { -+ glVDPAUUnregisterSurfaceNV(it->second.glVdpauSurface); -+ glDeleteTextures(4, it->second.texture); -+ } -+ m_bufferPool.glVideoSurfaceMap.clear(); -+ } -+ -+ std::map::iterator it; -+ for (it = m_bufferPool.glOutputSurfaceMap.begin(); it != m_bufferPool.glOutputSurfaceMap.end(); ++it) -+ { -+ glVDPAUUnregisterSurfaceNV(it->second.glVdpauSurface); -+ glDeleteTextures(1, it->second.texture); -+ } -+ m_bufferPool.glOutputSurfaceMap.clear(); -+ -+ glVDPAUFiniNV(); -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: vdpau gl interop finished"); -+ -+#endif -+} -+ -+void COutput::GLBindPixmaps() -+{ -+ if (!m_config.usePixmaps) -+ return; -+ -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); i++) -+ { -+ // create texture -+ glGenTextures(1, &m_bufferPool.pixmaps[i].texture); -+ -+ //bind texture -+ glBindTexture(GL_TEXTURE_2D, m_bufferPool.pixmaps[i].texture); -+ -+ // bind pixmap -+ glXBindTexImageEXT(m_Display, m_bufferPool.pixmaps[i].glPixmap, GLX_FRONT_LEFT_EXT, NULL); -+ -+ glBindTexture(GL_TEXTURE_2D, 0); -+ } -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: bound pixmaps"); -+} -+ -+void COutput::GLUnbindPixmaps() -+{ -+ if (!m_config.usePixmaps) -+ return; -+ -+ for (unsigned int i = 0; i < m_bufferPool.pixmaps.size(); i++) -+ { -+ // create texture -+ if (!glIsTexture(m_bufferPool.pixmaps[i].texture)) -+ continue; -+ -+ //bind texture -+ glBindTexture(GL_TEXTURE_2D, m_bufferPool.pixmaps[i].texture); -+ -+ // release pixmap -+ glXReleaseTexImageEXT(m_Display, m_bufferPool.pixmaps[i].glPixmap, GLX_FRONT_LEFT_EXT); -+ -+ glBindTexture(GL_TEXTURE_2D, 0); -+ -+ glDeleteTextures(1, &m_bufferPool.pixmaps[i].texture); -+ } -+ CLog::Log(LOGNOTICE, "VDPAU::COutput: unbound pixmaps"); -+} -+ -+bool COutput::CheckStatus(VdpStatus vdp_st, int line) -+{ -+ if (vdp_st != VDP_STATUS_OK) -+ { -+ CLog::Log(LOGERROR, " (VDPAU) Error: %s(%d) at %s:%d\n", m_config.vdpProcs.vdp_get_error_string(vdp_st), vdp_st, __FILE__, line); -+ m_vdpError = true; -+ return true; -+ } -+ return false; -+} -+ -+bool COutput::CreateGlxContext() -+{ -+ GLXContext glContext; -+ Window window; -+ -+ m_Display = g_Windowing.GetDisplay(); -+ glContext = g_Windowing.GetGlxContext(); -+ m_Window = g_Windowing.GetWmWindow(); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, m_Window, &wndattribs); -+ -+ // Get visual Info -+ XVisualInfo visInfo; -+ visInfo.visualid = wndattribs.visual->visualid; -+ int nvisuals = 0; -+ XVisualInfo* visuals = XGetVisualInfo(m_Display, VisualIDMask, &visInfo, &nvisuals); -+ if (nvisuals != 1) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::CreateGlxContext - could not find visual"); -+ return false; -+ } -+ visInfo = visuals[0]; -+ XFree(visuals); -+ -+ m_pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ 192, -+ 108, -+ visInfo.depth); -+ if (!m_pixmap) -+ { -+ CLog::Log(LOGERROR, "VDPAU::COutput::CreateGlxContext - Unable to create XPixmap"); -+ return false; -+ } -+ -+ // create gl pixmap -+ m_glPixmap = glXCreateGLXPixmap(m_Display, &visInfo, m_pixmap); -+ -+ if (!m_glPixmap) -+ { -+ CLog::Log(LOGINFO, "VDPAU::COutput::CreateGlxContext - Could not create glPixmap"); -+ return false; -+ } -+ -+ m_glContext = glXCreateContext(m_Display, &visInfo, glContext, True); -+ -+ if (!glXMakeCurrent(m_Display, m_glPixmap, m_glContext)) -+ { -+ CLog::Log(LOGINFO, "VDPAU::COutput::CreateGlxContext - Could not make Pixmap current"); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE, "VDPAU::COutput::CreateGlxContext - created context"); -+ return true; -+} -+ -+bool COutput::DestroyGlxContext() -+{ -+ if (m_glContext) -+ { -+ glXMakeCurrent(m_Display, None, NULL); -+ glXDestroyContext(m_Display, m_glContext); -+ } -+ m_glContext = 0; -+ -+ if (m_glPixmap) -+ glXDestroyPixmap(m_Display, m_glPixmap); -+ m_glPixmap = 0; -+ -+ if (m_pixmap) -+ XFreePixmap(m_Display, m_pixmap); -+ m_pixmap = 0; -+ -+ return true; -+} -+ -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h 2012-05-14 14:15:12.131220406 +0200 -@@ -1,4 +1,3 @@ -- - #pragma once - /* - * Copyright (C) 2005-2009 Team XBMC -@@ -21,6 +20,24 @@ - * - */ - -+/** -+ * design goals: -+ * - improve performance -+ * max out hw resources: e.g. make 1080p60 play on ION2 -+ * allow advanced de-interlacing on ION -+ * -+ * - add vdpau/opengl interop -+ * -+ * - remove tight dependency to render thread -+ * prior design needed to hijack render thread in order to do -+ * gl interop functions. In particular this was a problem for -+ * init and clear down. Introduction of GL_NV_vdpau_interop -+ * increased the need to be independent from render thread -+ * -+ * - move to an actor based design in order to reduce the number -+ * of locks needed. -+ */ -+ - #include "DllAvUtil.h" - #include "DVDVideoCodec.h" - #include "DVDVideoCodecFFmpeg.h" -@@ -37,118 +54,31 @@ - #include "settings/VideoSettings.h" - #include "guilib/DispResource.h" - #include "threads/Event.h" --namespace Surface { class CSurface; } -- --#define NUM_OUTPUT_SURFACES 4 --#define NUM_VIDEO_SURFACES_MPEG2 10 // (1 frame being decoded, 2 reference) --#define NUM_VIDEO_SURFACES_H264 32 // (1 frame being decoded, up to 16 references) --#define NUM_VIDEO_SURFACES_VC1 10 // (same as MPEG-2) --#define NUM_OUTPUT_SURFACES_FOR_FULLHD 2 --#define FULLHD_WIDTH 1920 -- --class CVDPAU -- : public CDVDVideoCodecFFmpeg::IHardwareDecoder -- , public IDispResource --{ --public: -- -- struct pictureAge -- { -- int b_age; -- int ip_age[2]; -- }; -- -- struct Desc -- { -- const char *name; -- uint32_t id; -- uint32_t aux; /* optional extra parameter... */ -- }; -+#include "threads/Thread.h" -+#include "utils/ActorProtocol.h" - -- CVDPAU(); -- virtual ~CVDPAU(); -- -- virtual bool Open (AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces = 0); -- virtual int Decode (AVCodecContext* avctx, AVFrame* frame); -- virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -- virtual void Reset(); -- virtual void Close(); -- -- virtual int Check(AVCodecContext* avctx); -- -- virtual const std::string Name() { return "vdpau"; } -- -- bool MakePixmap(int width, int height); -- bool MakePixmapGL(); -- -- void ReleasePixmap(); -- void BindPixmap(); -- -- PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT; -- PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT; -- GLXPixmap m_glPixmap; -- Pixmap m_Pixmap; -+using namespace Actor; - -- static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -- static void FFDrawSlice(struct AVCodecContext *s, -- const AVFrame *src, int offset[4], -- int y, int type, int height); -- static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); - -- void Present(); -- bool ConfigVDPAU(AVCodecContext *avctx, int ref_frames); -- void SpewHardwareAvailable(); -- void InitCSCMatrix(int Height); -- bool CheckStatus(VdpStatus vdp_st, int line); -- bool IsSurfaceValid(vdpau_render_state *render); -- -- void CheckFeatures(); -- void SetColor(); -- void SetNoiseReduction(); -- void SetSharpness(); -- void SetDeinterlacing(); -- void SetHWUpscaling(); -+#define FULLHD_WIDTH 1920 -+#define MAX_PIC_Q_LENGTH 20 //for non-interop_yuv this controls the max length of the decoded pic to render completion Q - -- pictureAge picAge; -- vdpau_render_state *past[2], *current, *future; -- int tmpDeintMode, tmpDeintGUI, tmpDeint; -- float tmpNoiseReduction, tmpSharpness; -- float tmpBrightness, tmpContrast; -- int OutWidth, OutHeight; -- bool upScale; -- std::queue m_DVDVideoPics; -- -- static inline void ClearUsedForRender(vdpau_render_state **st) -- { -- if (*st) { -- (*st)->state &= ~FF_VDPAU_STATE_USED_FOR_RENDER; -- *st = NULL; -- } -- } -+namespace VDPAU -+{ - -- VdpProcamp m_Procamp; -- VdpCSCMatrix m_CSCMatrix; -- VdpDevice HasDevice() { return vdp_device != VDP_INVALID_HANDLE; }; -- VdpChromaType vdp_chroma_type; -+/** -+ * VDPAU interface to driver -+ */ - -+struct VDPAU_procs -+{ -+ VdpGetProcAddress * vdp_get_proc_address; -+ VdpDeviceDestroy * vdp_device_destroy; - -- // protected: -- void InitVDPAUProcs(); -- void FiniVDPAUProcs(); -- void FiniVDPAUOutput(); -- bool ConfigOutputMethod(AVCodecContext *avctx, AVFrame *pFrame); -- bool FiniOutputMethod(); -- -- VdpDevice vdp_device; -- VdpGetProcAddress * vdp_get_proc_address; -- VdpPresentationQueueTarget vdp_flip_target; -- VdpPresentationQueue vdp_flip_queue; -- VdpDeviceDestroy * vdp_device_destroy; -- -- VdpVideoSurfaceCreate * vdp_video_surface_create; -- VdpVideoSurfaceDestroy * vdp_video_surface_destroy; -- VdpVideoSurfacePutBitsYCbCr * vdp_video_surface_put_bits_y_cb_cr; -- VdpVideoSurfaceGetBitsYCbCr * vdp_video_surface_get_bits_y_cb_cr; -+ VdpVideoSurfaceCreate * vdp_video_surface_create; -+ VdpVideoSurfaceDestroy * vdp_video_surface_destroy; -+ VdpVideoSurfacePutBitsYCbCr * vdp_video_surface_put_bits_y_cb_cr; -+ VdpVideoSurfaceGetBitsYCbCr * vdp_video_surface_get_bits_y_cb_cr; - - VdpOutputSurfacePutBitsYCbCr * vdp_output_surface_put_bits_y_cb_cr; - VdpOutputSurfacePutBitsNative * vdp_output_surface_put_bits_native; -@@ -158,15 +88,15 @@ - VdpOutputSurfaceRenderOutputSurface * vdp_output_surface_render_output_surface; - VdpOutputSurfacePutBitsIndexed * vdp_output_surface_put_bits_indexed; - -- VdpVideoMixerCreate * vdp_video_mixer_create; -- VdpVideoMixerSetFeatureEnables * vdp_video_mixer_set_feature_enables; -- VdpVideoMixerQueryParameterSupport * vdp_video_mixer_query_parameter_support; -- VdpVideoMixerQueryFeatureSupport * vdp_video_mixer_query_feature_support; -- VdpVideoMixerDestroy * vdp_video_mixer_destroy; -- VdpVideoMixerRender * vdp_video_mixer_render; -- VdpVideoMixerSetAttributeValues * vdp_video_mixer_set_attribute_values; -+ VdpVideoMixerCreate * vdp_video_mixer_create; -+ VdpVideoMixerSetFeatureEnables * vdp_video_mixer_set_feature_enables; -+ VdpVideoMixerQueryParameterSupport * vdp_video_mixer_query_parameter_support; -+ VdpVideoMixerQueryFeatureSupport * vdp_video_mixer_query_feature_support; -+ VdpVideoMixerDestroy * vdp_video_mixer_destroy; -+ VdpVideoMixerRender * vdp_video_mixer_render; -+ VdpVideoMixerSetAttributeValues * vdp_video_mixer_set_attribute_values; - -- VdpGenerateCSCMatrix * vdp_generate_csc_matrix; -+ VdpGenerateCSCMatrix * vdp_generate_csc_matrix; - - VdpPresentationQueueTargetDestroy * vdp_presentation_queue_target_destroy; - VdpPresentationQueueCreate * vdp_presentation_queue_create; -@@ -179,64 +109,467 @@ - - VdpGetErrorString * vdp_get_error_string; - -- VdpDecoderCreate * vdp_decoder_create; -- VdpDecoderDestroy * vdp_decoder_destroy; -- VdpDecoderRender * vdp_decoder_render; -- VdpDecoderQueryCapabilities * vdp_decoder_query_caps; -+ VdpDecoderCreate * vdp_decoder_create; -+ VdpDecoderDestroy * vdp_decoder_destroy; -+ VdpDecoderRender * vdp_decoder_render; -+ VdpDecoderQueryCapabilities * vdp_decoder_query_caps; - - VdpPreemptionCallbackRegister * vdp_preemption_callback_register; - -- VdpOutputSurface outputSurfaces[NUM_OUTPUT_SURFACES]; -- VdpOutputSurface outputSurface; -- VdpOutputSurface presentSurface; -- -- VdpDecoder decoder; -- VdpVideoMixer videoMixer; -- VdpRect outRect; -- VdpRect outRectVid; -+}; - -- static void* dl_handle; -- VdpStatus (*dl_vdp_device_create_x11)(Display* display, int screen, VdpDevice* device, VdpGetProcAddress **get_proc_address); -- VdpStatus (*dl_vdp_get_proc_address)(VdpDevice device, VdpFuncId function_id, void** function_pointer); -- VdpStatus (*dl_vdp_preemption_callback_register)(VdpDevice device, VdpPreemptionCallback callback, void* context); -+//----------------------------------------------------------------------------- -+// VDPAU data structs -+//----------------------------------------------------------------------------- - -- int surfaceNum; -- int presentSurfaceNum; -- int totalAvailableOutputSurfaces; -- uint32_t vid_width, vid_height; -- int surface_width, surface_height; -- uint32_t max_references; -- Display* m_Display; -- bool vdpauConfigured; -- uint32_t *m_BlackBar; -+class CDecoder; -+ -+/** -+ * Buffer statistics used to control number of frames in queue -+ */ -+ -+class CVdpauBufferStats -+{ -+public: -+ uint16_t decodedPics; -+ uint16_t processedPics; -+ uint16_t renderPics; -+ uint64_t latency; // time decoder has waited for a frame, ideally there is no latency -+ int playSpeed; -+ bool canSkipDeint; -+ int processCmd; -+ -+ void IncDecoded() { CSingleLock l(m_sec); decodedPics++;} -+ void DecDecoded() { CSingleLock l(m_sec); decodedPics--;} -+ void IncProcessed() { CSingleLock l(m_sec); processedPics++;} -+ void DecProcessed() { CSingleLock l(m_sec); processedPics--;} -+ void IncRender() { CSingleLock l(m_sec); renderPics++;} -+ void DecRender() { CSingleLock l(m_sec); renderPics--;} -+ void Reset() { CSingleLock l(m_sec); decodedPics=0; processedPics=0;renderPics=0;latency=0;} -+ void Get(uint16_t &decoded, uint16_t &processed, uint16_t &render) {CSingleLock l(m_sec); decoded = decodedPics, processed=processedPics, render=renderPics;} -+ void SetParams(uint64_t time, int speed) { CSingleLock l(m_sec); latency = time; playSpeed = speed; } -+ void GetParams(uint64_t &lat, int &speed) { CSingleLock l(m_sec); lat = latency; speed = playSpeed; } -+ void SetCmd(int cmd) { CSingleLock l(m_sec); processCmd = cmd; } -+ void GetCmd(int &cmd) { CSingleLock l(m_sec); cmd = processCmd; processCmd = 0; } -+ void SetCanSkipDeint(bool canSkip) { CSingleLock l(m_sec); canSkipDeint = canSkip; } -+ bool CanSkipDeint() { CSingleLock l(m_sec); if (canSkipDeint) return true; else return false;} -+private: -+ CCriticalSection m_sec; -+}; -+ -+/** -+ * CVdpauConfig holds all configuration parameters needed by vdpau -+ * The structure is sent to the internal classes CMixer and COutput -+ * for init. -+ */ -+ -+struct CVdpauConfig -+{ -+ int surfaceWidth; -+ int surfaceHeight; -+ int vidWidth; -+ int vidHeight; -+ int outWidth; -+ int outHeight; -+ VDPAU_procs vdpProcs; -+ VdpDevice vdpDevice; -+ VdpDecoder vdpDecoder; -+ VdpChromaType vdpChromaType; -+ CVdpauBufferStats *stats; -+ CDecoder *vdpau; -+ int featureCount; -+ int upscale; -+ VdpVideoMixerFeature vdpFeatures[10]; -+ std::vector *videoSurfaces; -+ CCriticalSection *videoSurfaceSec; -+ bool usePixmaps; -+ int numRenderBuffers; -+ uint32_t maxReferences; -+ bool useInteropYuv; -+}; -+ -+/** -+ * Holds a decoded frame -+ * Input to COutput for further processing -+ */ -+struct CVdpauDecodedPicture -+{ -+ DVDVideoPicture DVDPic; -+ vdpau_render_state *render; -+}; -+ -+/** -+ * Frame after having been processed by vdpau mixer -+ */ -+struct CVdpauProcessedPicture -+{ -+ DVDVideoPicture DVDPic; -+ vdpau_render_state *render; -+ VdpOutputSurface outputSurface; -+}; - -+/** -+ * Ready to render textures -+ * Sent from COutput back to CDecoder -+ * Objects are referenced by DVDVideoPicture and are sent -+ * to renderer -+ */ -+class CVdpauRenderPicture -+{ -+ friend class CDecoder; -+ friend class COutput; -+public: -+ DVDVideoPicture DVDPic; -+ int texWidth, texHeight; -+ CRect crop; -+ GLuint texture[4]; -+ uint32_t sourceIdx; -+ bool valid; -+ CDecoder *vdpau; -+ CVdpauRenderPicture* Acquire(); -+ long Release(); -+private: -+ void ReturnUnused(); -+ int refCount; -+ CCriticalSection *renderPicSection; -+}; - -+//----------------------------------------------------------------------------- -+// Mixer -+//----------------------------------------------------------------------------- -+ -+class CMixerControlProtocol : public Protocol -+{ -+public: -+ CMixerControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT = 0, -+ FLUSH, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ }; -+}; -+ -+class CMixerDataProtocol : public Protocol -+{ -+public: -+ CMixerDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ FRAME, -+ BUFFER, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * Embeds the vdpau video mixer -+ * Embedded by COutput class, gets decoded frames from COutput, processes -+ * them in mixer ands sends processed frames back to COutput -+ */ -+class CMixer : private CThread -+{ -+public: -+ CMixer(CEvent *inMsgEvent); -+ virtual ~CMixer(); -+ void Start(); -+ void Dispose(); -+ CMixerControlProtocol m_controlPort; -+ CMixerDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ void Init(); -+ void Uninit(); -+ void Flush(); -+ void CreateVdpauMixer(); -+ void ProcessPicture(); -+ void InitCycle(); -+ void FiniCycle(); -+ void CheckFeatures(); -+ void SetPostProcFeatures(bool postProcEnabled); -+ void PostProcOff(); -+ void InitCSCMatrix(int Width); -+ bool GenerateStudioCSCMatrix(VdpColorStandard colorStandard, VdpCSCMatrix &studioCSCMatrix); -+ void SetColor(); -+ void SetNoiseReduction(); -+ void SetSharpness(); -+ void SetDeintSkipChroma(); -+ void SetDeinterlacing(); -+ void SetHWUpscaling(); -+ void DisableHQScaling(); -+ EINTERLACEMETHOD GetDeinterlacingMethod(bool log = false); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_vdpError; -+ CVdpauConfig m_config; -+ VdpVideoMixer m_videoMixer; -+ VdpProcamp m_Procamp; -+ VdpCSCMatrix m_CSCMatrix; -+ bool m_PostProc; -+ float m_Brightness; -+ float m_Contrast; -+ float m_NoiseReduction; -+ float m_Sharpness; -+ int m_DeintMode; -+ int m_Deint; -+ int m_Upscale; -+ uint32_t *m_BlackBar; - VdpVideoMixerPictureStructure m_mixerfield; -- int m_mixerstep; -+ int m_mixerstep; -+ int m_mixersteps; -+ CVdpauProcessedPicture m_processPicture; -+ std::queue m_outputSurfaces; -+ std::queue m_decodedPics; -+ std::deque m_mixerInput; -+}; -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+ -+/** -+ * Buffer pool holds allocated vdpau and gl resources -+ * Embedded in COutput -+ */ -+struct VdpauBufferPool -+{ -+ struct Pixmaps -+ { -+ unsigned short id; -+ bool used; -+ DVDVideoPicture DVDPic; -+ GLuint texture; -+ Pixmap pixmap; -+ GLXPixmap glPixmap; -+ VdpPresentationQueueTarget vdp_flip_target; -+ VdpPresentationQueue vdp_flip_queue; -+ VdpOutputSurface surface; -+ }; -+ struct GLVideoSurface -+ { -+ GLuint texture[4]; -+#ifdef GL_NV_vdpau_interop -+ GLvdpauSurfaceNV glVdpauSurface; -+#endif -+ vdpau_render_state *sourceVuv; -+ VdpOutputSurface sourceRgb; -+ }; -+ unsigned short numOutputSurfaces; -+ std::vector pixmaps; -+ std::vector outputSurfaces; -+ std::deque notVisiblePixmaps; -+ std::vector allRenderPics; -+ std::map glVideoSurfaceMap; -+ std::map glOutputSurfaceMap; -+ std::queue processedPics; -+ std::deque usedRenderPics; -+ std::deque freeRenderPics; -+ CCriticalSection renderPicSec; -+}; -+ -+class COutputControlProtocol : public Protocol -+{ -+public: -+ COutputControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT, -+ FLUSH, -+ PRECLEANUP, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ STATS, -+ }; -+}; -+ -+class COutputDataProtocol : public Protocol -+{ -+public: -+ COutputDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ NEWFRAME = 0, -+ RETURNPIC, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * COutput is embedded in CDecoder and embeds CMixer -+ * The class has its own OpenGl context which is shared with render thread -+ * COuput generated ready to render textures and passes them back to -+ * CDecoder -+ */ -+class COutput : private CThread -+{ -+public: -+ COutput(CEvent *inMsgEvent); -+ virtual ~COutput(); -+ void Start(); -+ void Dispose(); -+ COutputControlProtocol m_controlPort; -+ COutputDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ bool HasWork(); -+ CVdpauRenderPicture *ProcessMixerPicture(); -+ void ProcessReturnPicture(CVdpauRenderPicture *pic); -+ int FindFreePixmap(); -+ bool Init(); -+ bool Uninit(); -+ void Flush(); -+ bool CreateGlxContext(); -+ bool DestroyGlxContext(); -+ bool EnsureBufferPool(); -+ void ReleaseBufferPool(); -+ void InitMixer(); -+ bool GLInit(); -+ void GLMapSurfaces(); -+ void GLUnmapSurfaces(); -+ void GLBindPixmaps(); -+ void GLUnbindPixmaps(); -+ bool MakePixmap(VdpauBufferPool::Pixmaps &pixmap); -+ bool MakePixmapGL(VdpauBufferPool::Pixmaps &pixmap); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_vdpError; -+ CVdpauConfig m_config; -+ VdpauBufferPool m_bufferPool; -+ CMixer m_mixer; -+ Display *m_Display; -+ Window m_Window; -+ GLXContext m_glContext; -+ GLXWindow m_glWindow; -+ Pixmap m_pixmap; -+ GLXPixmap m_glPixmap; -+ -+ // gl functions -+ PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT; -+ PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT; -+#ifdef GL_NV_vdpau_interop -+ PFNGLVDPAUINITNVPROC glVDPAUInitNV; -+ PFNGLVDPAUFININVPROC glVDPAUFiniNV; -+ PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC glVDPAURegisterOutputSurfaceNV; -+ PFNGLVDPAUREGISTERVIDEOSURFACENVPROC glVDPAURegisterVideoSurfaceNV; -+ PFNGLVDPAUISSURFACENVPROC glVDPAUIsSurfaceNV; -+ PFNGLVDPAUUNREGISTERSURFACENVPROC glVDPAUUnregisterSurfaceNV; -+ PFNGLVDPAUSURFACEACCESSNVPROC glVDPAUSurfaceAccessNV; -+ PFNGLVDPAUMAPSURFACESNVPROC glVDPAUMapSurfacesNV; -+ PFNGLVDPAUUNMAPSURFACESNVPROC glVDPAUUnmapSurfacesNV; -+ PFNGLVDPAUGETSURFACEIVNVPROC glVDPAUGetSurfaceivNV; -+#endif -+}; -+ -+//----------------------------------------------------------------------------- -+// VDPAU decoder -+//----------------------------------------------------------------------------- -+ -+/** -+ * VDPAU main class -+ */ -+class CDecoder -+ : public CDVDVideoCodecFFmpeg::IHardwareDecoder -+ , public IDispResource -+{ -+ friend class CVdpauRenderPicture; -+ -+public: -+ -+ struct PictureAge -+ { -+ int b_age; -+ int ip_age[2]; -+ }; -+ -+ struct Desc -+ { -+ const char *name; -+ uint32_t id; -+ uint32_t aux; /* optional extra parameter... */ -+ }; -+ -+ CDecoder(); -+ virtual ~CDecoder(); -+ -+ virtual bool Open (AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces = 0); -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame) {return Decode(avctx, frame, false, false);}; -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame, bool bSoftDrain = false, bool bHardDrain = false); -+ virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -+ virtual void Reset(); -+ virtual void Close(); -+ virtual long Release(); -+ virtual bool CanSkipDeint(); -+ virtual void SetSpeed(int speed); -+ -+ virtual int Check(AVCodecContext* avctx); -+ virtual const std::string Name() { return "vdpau"; } - - bool Supports(VdpVideoMixerFeature feature); - bool Supports(EINTERLACEMETHOD method); - EINTERLACEMETHOD AutoInterlaceMethod(); -+ static bool IsVDPAUFormat(PixelFormat fmt); - -- VdpVideoMixerFeature m_features[10]; -- int m_feature_count; -+ static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -+ static void FFDrawSlice(struct AVCodecContext *s, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height); -+ static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); -+ -+ virtual void OnLostDevice(); -+ virtual void OnResetDevice(); -+ -+protected: -+ void SetWidthHeight(int width, int height); -+ bool ConfigVDPAU(AVCodecContext *avctx, int ref_frames); -+ void SpewHardwareAvailable(); -+ bool CheckStatus(VdpStatus vdp_st, int line); -+ bool IsSurfaceValid(vdpau_render_state *render); -+ void InitVDPAUProcs(); -+ void FiniVDPAUProcs(); -+ void FiniVDPAUOutput(); -+ void ReturnRenderPicture(CVdpauRenderPicture *renderPic); -+ long ReleasePicReference(); - -- static bool IsVDPAUFormat(PixelFormat fmt); - static void ReadFormatOf( PixelFormat fmt - , VdpDecoderProfile &decoder_profile - , VdpChromaType &chroma_type); - -- std::vector m_videoSurfaces; -- DllAvUtil m_dllAvUtil; -- -- enum VDPAUOutputMethod -- { -- OUTPUT_NONE, -- OUTPUT_PIXMAP, -- OUTPUT_GL_INTEROP_RGB, -- OUTPUT_GL_INTEROP_YUV -- }; -- VDPAUOutputMethod m_vdpauOutputMethod; -+ VdpStatus (*dl_vdp_device_create_x11)(Display* display, int screen, VdpDevice* device, VdpGetProcAddress **get_proc_address); -+ VdpStatus (*dl_vdp_get_proc_address)(VdpDevice device, VdpFuncId function_id, void** function_pointer); -+ VdpStatus (*dl_vdp_preemption_callback_register)(VdpDevice device, VdpPreemptionCallback callback, void* context); - - // OnLostDevice triggers transition from all states to LOST - // internal errors trigger transition from OPEN to RESET -@@ -247,9 +580,27 @@ - , VDPAU_LOST - , VDPAU_ERROR - } m_DisplayState; -- CSharedSection m_DecoderSection; -- CSharedSection m_DisplaySection; -+ CCriticalSection m_DecoderSection; - CEvent m_DisplayEvent; -- virtual void OnLostDevice(); -- virtual void OnResetDevice(); -+ -+ static void* dl_handle; -+ DllAvUtil m_dllAvUtil; -+ Display* m_Display; -+ ThreadIdentifier m_decoderThread; -+ bool m_vdpauConfigured; -+ CVdpauConfig m_vdpauConfig; -+ std::vector m_videoSurfaces; -+ CCriticalSection m_videoSurfaceSec; -+ PictureAge m_picAge; -+ -+ COutput m_vdpauOutput; -+ CVdpauBufferStats m_bufferStats; -+ CEvent m_inMsgEvent; -+ CVdpauRenderPicture *m_presentPicture; -+ -+ int m_speed; -+ int m_codecControl; - }; -+ -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 2012-05-14 14:15:12.135220486 +0200 -@@ -0,0 +1,2382 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include "system.h" -+#ifdef HAVE_LIBXVBA -+#include -+#include -+#include "XVBA.h" -+#include "windowing/WindowingFactory.h" -+#include "guilib/GraphicContext.h" -+#include "settings/GUISettings.h" -+#include "settings/Settings.h" -+#include "utils/TimeUtils.h" -+#include "cores/dvdplayer/DVDClock.h" -+ -+using namespace XVBA; -+ -+// XVBA interface -+ -+#define XVBA_LIBRARY "libXvBAW.so.1" -+ -+typedef Bool (*XVBAQueryExtensionProc) (Display *dpy, int *vers); -+typedef Status (*XVBACreateContextProc) (void *input, void *output); -+typedef Status (*XVBADestroyContextProc) (void *context); -+typedef Bool (*XVBAGetSessionInfoProc) (void *input, void *output); -+typedef Status (*XVBACreateSurfaceProc) (void *input, void *output); -+typedef Status (*XVBACreateGLSharedSurfaceProc)(void *input, void *output); -+typedef Status (*XVBADestroySurfaceProc) (void *surface); -+typedef Status (*XVBACreateDecodeBuffersProc) (void *input, void *output); -+typedef Status (*XVBADestroyDecodeBuffersProc) (void *input); -+typedef Status (*XVBAGetCapDecodeProc) (void *input, void *output); -+typedef Status (*XVBACreateDecodeProc) (void *input, void *output); -+typedef Status (*XVBADestroyDecodeProc) (void *session); -+typedef Status (*XVBAStartDecodePictureProc) (void *input); -+typedef Status (*XVBADecodePictureProc) (void *input); -+typedef Status (*XVBAEndDecodePictureProc) (void *input); -+typedef Status (*XVBASyncSurfaceProc) (void *input, void *output); -+typedef Status (*XVBAGetSurfaceProc) (void *input); -+typedef Status (*XVBATransferSurfaceProc) (void *input); -+ -+static struct -+{ -+ XVBAQueryExtensionProc QueryExtension; -+ XVBACreateContextProc CreateContext; -+ XVBADestroyContextProc DestroyContext; -+ XVBAGetSessionInfoProc GetSessionInfo; -+ XVBACreateSurfaceProc CreateSurface; -+ XVBACreateGLSharedSurfaceProc CreateGLSharedSurface; -+ XVBADestroySurfaceProc DestroySurface; -+ XVBACreateDecodeBuffersProc CreateDecodeBuffers; -+ XVBADestroyDecodeBuffersProc DestroyDecodeBuffers; -+ XVBAGetCapDecodeProc GetCapDecode; -+ XVBACreateDecodeProc CreateDecode; -+ XVBADestroyDecodeProc DestroyDecode; -+ XVBAStartDecodePictureProc StartDecodePicture; -+ XVBADecodePictureProc DecodePicture; -+ XVBAEndDecodePictureProc EndDecodePicture; -+ XVBASyncSurfaceProc SyncSurface; -+ XVBAGetSurfaceProc GetSurface; -+ XVBATransferSurfaceProc TransferSurface; -+}g_XVBA_vtable; -+ -+//----------------------------------------------------------------------------- -+//----------------------------------------------------------------------------- -+ -+CXVBAContext *CXVBAContext::m_context = 0; -+CCriticalSection CXVBAContext::m_section; -+Display *CXVBAContext::m_display = 0; -+void *CXVBAContext::m_dlHandle = 0; -+ -+CXVBAContext::CXVBAContext() -+{ -+ m_context = 0; -+// m_dlHandle = 0; -+ m_xvbaContext = 0; -+ m_refCount = 0; -+} -+ -+void CXVBAContext::Release() -+{ -+ CSingleLock lock(m_section); -+ -+ m_refCount--; -+ if (m_refCount <= 0) -+ { -+ Close(); -+ delete this; -+ m_context = 0; -+ } -+} -+ -+void CXVBAContext::Close() -+{ -+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder context"); -+ -+ DestroyContext(); -+// if (m_dlHandle) -+// { -+// dlclose(m_dlHandle); -+// m_dlHandle = 0; -+// } -+} -+ -+bool CXVBAContext::EnsureContext(CXVBAContext **ctx) -+{ -+ CSingleLock lock(m_section); -+ -+ if (m_context) -+ { -+ m_context->m_refCount++; -+ *ctx = m_context; -+ return true; -+ } -+ -+ m_context = new CXVBAContext(); -+ *ctx = m_context; -+ { -+ CSingleLock gLock(g_graphicsContext); -+ if (!m_context->LoadSymbols() || !m_context->CreateContext()) -+ { -+ delete m_context; -+ m_context = 0; -+ return false; -+ } -+ } -+ -+ m_context->m_refCount++; -+ -+ *ctx = m_context; -+ return true; -+} -+ -+bool CXVBAContext::LoadSymbols() -+{ -+ if (!m_dlHandle) -+ { -+ m_dlHandle = dlopen(XVBA_LIBRARY, RTLD_LAZY); -+ if (!m_dlHandle) -+ { -+ const char* error = dlerror(); -+ if (!error) -+ error = "dlerror() returned NULL"; -+ -+ CLog::Log(LOGERROR,"XVBA::LoadSymbols: Unable to get handle to lib: %s", error); -+ return false; -+ } -+ } -+ else -+ return true; -+ -+#define INIT_PROC(PREFIX, PROC) do { \ -+ g_##PREFIX##_vtable.PROC = (PREFIX##PROC##Proc) \ -+ dlsym(m_dlHandle, #PREFIX #PROC); \ -+ } while (0) -+ -+#define INIT_PROC_CHECK(PREFIX, PROC) do { \ -+ dlerror(); \ -+ INIT_PROC(PREFIX, PROC); \ -+ if (dlerror()) { \ -+ dlclose(m_dlHandle); \ -+ m_dlHandle = NULL; \ -+ return false; \ -+ } \ -+ } while (0) -+ -+#define XVBA_INIT_PROC(PROC) INIT_PROC_CHECK(XVBA, PROC) -+ -+ XVBA_INIT_PROC(QueryExtension); -+ XVBA_INIT_PROC(CreateContext); -+ XVBA_INIT_PROC(DestroyContext); -+ XVBA_INIT_PROC(GetSessionInfo); -+ XVBA_INIT_PROC(CreateSurface); -+ XVBA_INIT_PROC(CreateGLSharedSurface); -+ XVBA_INIT_PROC(DestroySurface); -+ XVBA_INIT_PROC(CreateDecodeBuffers); -+ XVBA_INIT_PROC(DestroyDecodeBuffers); -+ XVBA_INIT_PROC(GetCapDecode); -+ XVBA_INIT_PROC(CreateDecode); -+ XVBA_INIT_PROC(DestroyDecode); -+ XVBA_INIT_PROC(StartDecodePicture); -+ XVBA_INIT_PROC(DecodePicture); -+ XVBA_INIT_PROC(EndDecodePicture); -+ XVBA_INIT_PROC(SyncSurface); -+ XVBA_INIT_PROC(GetSurface); -+ XVBA_INIT_PROC(TransferSurface); -+ -+#undef XVBA_INIT_PROC -+#undef INIT_PROC -+ -+ return true; -+} -+ -+bool CXVBAContext::CreateContext() -+{ -+ if (m_xvbaContext) -+ return true; -+ -+ CLog::Log(LOGNOTICE,"XVBA::CreateContext - creating decoder context"); -+ -+ Drawable window; -+ { CSingleLock lock(g_graphicsContext); -+ if (!m_display) -+ m_display = XOpenDisplay(NULL); -+ window = 0; -+ } -+ -+ int version; -+ if (!g_XVBA_vtable.QueryExtension(m_display, &version)) -+ return false; -+ CLog::Log(LOGNOTICE,"XVBA::CreateContext - opening xvba version: %i", version); -+ -+ // create XVBA Context -+ XVBA_Create_Context_Input contextInput; -+ XVBA_Create_Context_Output contextOutput; -+ contextInput.size = sizeof(contextInput); -+ contextInput.display = m_display; -+ contextInput.draw = window; -+ contextOutput.size = sizeof(contextOutput); -+ if(Success != g_XVBA_vtable.CreateContext(&contextInput, &contextOutput)) -+ { -+ CLog::Log(LOGERROR,"XVBA::CreateContext - failed to create context"); -+ return false; -+ } -+ m_xvbaContext = contextOutput.context; -+ -+ return true; -+} -+ -+void CXVBAContext::DestroyContext() -+{ -+ if (!m_xvbaContext) -+ return; -+ -+ g_XVBA_vtable.DestroyContext(m_xvbaContext); -+ m_xvbaContext = 0; -+// XCloseDisplay(m_display); -+} -+ -+void *CXVBAContext::GetContext() -+{ -+ return m_xvbaContext; -+} -+ -+//----------------------------------------------------------------------------- -+//----------------------------------------------------------------------------- -+ -+static unsigned int decoderId = 0; -+ -+CDecoder::CDecoder() : m_xvbaOutput(&m_inMsgEvent) -+{ -+ m_xvbaConfig.context = 0; -+ m_xvbaConfig.xvbaSession = 0; -+ m_xvbaConfig.videoSurfaces = &m_videoSurfaces; -+ m_xvbaConfig.videoSurfaceSec = &m_videoSurfaceSec; -+ m_xvbaConfig.apiSec = &m_apiSec; -+ -+ m_displayState = XVBA_OPEN; -+} -+ -+CDecoder::~CDecoder() -+{ -+ Close(); -+} -+ -+typedef struct { -+ unsigned int size; -+ unsigned int num_of_decodecaps; -+ XVBADecodeCap decode_caps_list[]; -+} XVBA_GetCapDecode_Output_Base; -+ -+void CDecoder::OnLostDevice() -+{ -+ CLog::Log(LOGNOTICE,"XVBA::OnLostDevice event"); -+ -+ CSingleLock lock(m_decoderSection); -+ DestroySession(); -+ if (m_xvbaConfig.context) -+ m_xvbaConfig.context->Release(); -+ m_xvbaConfig.context = 0; -+ -+ m_displayState = XVBA_LOST; -+ m_displayEvent.Reset(); -+} -+ -+void CDecoder::OnResetDevice() -+{ -+ CLog::Log(LOGNOTICE,"XVBA::OnResetDevice event"); -+ -+ CSingleLock lock(m_decoderSection); -+ if (m_displayState == XVBA_LOST) -+ { -+ m_displayState = XVBA_RESET; -+ lock.Leave(); -+ m_displayEvent.Set(); -+ } -+} -+ -+bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned int surfaces) -+{ -+ std::string Vendor = g_Windowing.GetRenderVendor(); -+ std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); -+ if (Vendor.compare(0, 3, "ati") != 0) -+ { -+ return false; -+ } -+ -+ m_decoderId = decoderId++; -+ -+ CLog::Log(LOGNOTICE,"(XVBA::Open) opening xvba decoder, id: %d", m_decoderId); -+ -+ if(avctx->coded_width == 0 -+ || avctx->coded_height == 0) -+ { -+ CLog::Log(LOGWARNING,"(XVBA) no width/height available, can't init"); -+ return false; -+ } -+ -+ if (!m_dllAvUtil.Load()) -+ return false; -+ -+ if (!CXVBAContext::EnsureContext(&m_xvbaConfig.context)) -+ return false; -+ -+ // xvba get session info -+ XVBA_GetSessionInfo_Input sessionInput; -+ XVBA_GetSessionInfo_Output sessionOutput; -+ sessionInput.size = sizeof(sessionInput); -+ sessionInput.context = m_xvbaConfig.context->GetContext(); -+ sessionOutput.size = sizeof(sessionOutput); -+ if (Success != g_XVBA_vtable.GetSessionInfo(&sessionInput, &sessionOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) can't get session info"); -+ return false; -+ } -+ if (sessionOutput.getcapdecode_output_size == 0) -+ { -+ CLog::Log(LOGERROR,"(XVBA) session decode not supported"); -+ return false; -+ } -+ -+ // get decoder capabilities -+ XVBA_GetCapDecode_Input capInput; -+ XVBA_GetCapDecode_Output *capOutput; -+ capInput.size = sizeof(capInput); -+ capInput.context = m_xvbaConfig.context->GetContext(); -+ capOutput = (XVBA_GetCapDecode_Output *)calloc(sessionOutput.getcapdecode_output_size, 1); -+ capOutput->size = sessionOutput.getcapdecode_output_size; -+ if (Success != g_XVBA_vtable.GetCapDecode(&capInput, capOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) can't get decode capabilities"); -+ return false; -+ } -+ -+ int match = -1; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_H264 && -+ capOutput->decode_caps_list[i].flags == XVBA_H264_HIGH) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_H264_HIGH not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_VC1) -+ { -+ // search for profile advanced -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_VC1 && -+ capOutput->decode_caps_list[i].flags == XVBA_VC1_ADVANCED) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_VC1_ADVANCED not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_MPEG2VIDEO) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_MPEG2_VLD) -+ { -+ // XXX: uncomment when implemented -+ // match = (int) i; -+ // break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_MPEG2_VLD not found"); -+ } -+ } -+ else if (avctx->codec_id == CODEC_ID_WMV3) -+ { -+ // search for profile high -+ for (unsigned int i = 0; i < capOutput->num_of_decodecaps; ++i) -+ { -+ if (capOutput->decode_caps_list[i].capability_id == XVBA_VC1 && -+ capOutput->decode_caps_list[i].flags == XVBA_VC1_MAIN) -+ { -+ match = (int) i; -+ break; -+ } -+ } -+ if (match < 0) -+ { -+ CLog::Log(LOGNOTICE, "(XVBA::Open) - profile XVBA_VC1_MAIN not found"); -+ } -+ } -+ -+ if (match < 0) -+ { -+ free(capOutput); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE,"(XVBA) using decoder capability id: %i flags: %i", -+ capOutput->decode_caps_list[match].capability_id, -+ capOutput->decode_caps_list[match].flags); -+ CLog::Log(LOGNOTICE,"(XVBA) using surface type: %x", -+ capOutput->decode_caps_list[match].surface_type); -+ -+ m_xvbaConfig.decoderCap = capOutput->decode_caps_list[match]; -+ -+ free(capOutput); -+ -+ // set some varables -+ m_xvbaConfig.xvbaSession = 0; -+ m_xvbaBufferPool.data_buffer = 0; -+ m_xvbaBufferPool.iq_matrix_buffer = 0; -+ m_xvbaBufferPool.picture_descriptor_buffer = 0; -+ picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -+ m_presentPicture = 0; -+ m_xvbaConfig.numRenderBuffers = surfaces; -+ m_decoderThread = CThread::GetCurrentThreadId(); -+ m_speed = DVD_PLAYSPEED_NORMAL; -+ -+ if (1) //g_guiSettings.GetBool("videoplayer.usexvbasharedsurface")) -+ m_xvbaConfig.useSharedSurfaces = true; -+ else -+ m_xvbaConfig.useSharedSurfaces = false; -+ -+ m_displayState = XVBA_OPEN; -+ -+ // setup ffmpeg -+ avctx->thread_count = 1; -+ avctx->get_buffer = CDecoder::FFGetBuffer; -+ avctx->release_buffer = CDecoder::FFReleaseBuffer; -+ avctx->draw_horiz_band = CDecoder::FFDrawSlice; -+ avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; -+ -+ g_Windowing.Register(this); -+ return true; -+} -+ -+void CDecoder::Close() -+{ -+ CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder, id: %d", m_decoderId); -+ -+ if (!m_xvbaConfig.context) -+ return; -+ -+ DestroySession(); -+ if (m_xvbaConfig.context) -+ m_xvbaConfig.context->Release(); -+ m_xvbaConfig.context = 0; -+ -+ while (!m_videoSurfaces.empty()) -+ { -+ xvba_render_state *render = m_videoSurfaces.back(); -+ if(render->buffers_alllocated > 0) -+ m_dllAvUtil.av_free(render->buffers); -+ m_videoSurfaces.pop_back(); -+ free(render); -+ } -+ -+ g_Windowing.Unregister(this); -+ m_dllAvUtil.Unload(); -+} -+ -+long CDecoder::Release() -+{ -+ // check if we should do some pre-cleanup here -+ // a second decoder might need resources -+ if (m_xvbaConfig.xvbaSession) -+ { -+ CSingleLock lock(m_decoderSection); -+ CLog::Log(LOGNOTICE,"XVBA::Release pre-cleanup"); -+ -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - pre-cleanup returned error", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - pre-cleanup timed out", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ -+ for(unsigned int i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ xvba_render_state *render = m_videoSurfaces[i]; -+ if (render->surface && !(render->state & FF_XVBA_STATE_USED_FOR_RENDER)) -+ { -+ g_XVBA_vtable.DestroySurface(render->surface); -+ render->surface = 0; -+ render->picture_descriptor = 0; -+ render->iq_matrix = 0; -+ } -+ } -+ } -+ IHardwareDecoder::Release(); -+} -+ -+long CDecoder::ReleasePicReference() -+{ -+ return IHardwareDecoder::Release(); -+} -+ -+bool CDecoder::Supports(EINTERLACEMETHOD method) -+{ -+ if(method == VS_INTERLACEMETHOD_AUTO) -+ return true; -+ -+ if (1) //g_guiSettings.GetBool("videoplayer.usexvbasharedsurface")) -+ { -+ if (method == VS_INTERLACEMETHOD_XVBA) -+ return true; -+ } -+ -+ return false; -+} -+ -+void CDecoder::ResetState() -+{ -+ picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; -+ -+ m_displayState = XVBA_OPEN; -+} -+ -+int CDecoder::Check(AVCodecContext* avctx) -+{ -+ EDisplayState state; -+ -+ { CSingleLock lock(m_decoderSection); -+ state = m_displayState; -+ } -+ -+ if (state == XVBA_LOST) -+ { -+ CLog::Log(LOGNOTICE,"XVBA::Check waiting for display reset event"); -+ if (!m_displayEvent.WaitMSec(2000)) -+ { -+ CLog::Log(LOGERROR, "XVBA::Check - device didn't reset in reasonable time"); -+ state = XVBA_RESET;; -+ } -+ else -+ { CSingleLock lock(m_decoderSection); -+ state = m_displayState; -+ } -+ } -+ if (state == XVBA_RESET || state == XVBA_ERROR) -+ { -+ CLog::Log(LOGNOTICE,"XVBA::Check - Attempting recovery"); -+ -+ CSingleLock gLock(g_graphicsContext); -+ CSingleLock lock(m_decoderSection); -+ -+ DestroySession(); -+ ResetState(); -+ CXVBAContext::EnsureContext(&m_xvbaConfig.context); -+ -+ if (state == XVBA_RESET) -+ return VC_FLUSHED; -+ else -+ return VC_ERROR; -+ } -+ return 0; -+} -+ -+void CDecoder::SetError(const char* function, const char* msg, int line) -+{ -+ CLog::Log(LOGERROR, "XVBA::%s - %s, line %d", function, msg, line); -+ CSingleLock lock(m_decoderSection); -+ m_displayState = XVBA_ERROR; -+} -+ -+bool CDecoder::CreateSession(AVCodecContext* avctx) -+{ -+ m_xvbaConfig.surfaceWidth = (avctx->coded_width+15) & ~15; -+ m_xvbaConfig.surfaceHeight = (avctx->coded_height+15) & ~15; -+ -+ m_xvbaConfig.vidWidth = avctx->width; -+ m_xvbaConfig.vidHeight = avctx->height; -+ -+ XVBA_Create_Decode_Session_Input sessionInput; -+ XVBA_Create_Decode_Session_Output sessionOutput; -+ -+ sessionInput.size = sizeof(sessionInput); -+ sessionInput.width = m_xvbaConfig.surfaceWidth; -+ sessionInput.height = m_xvbaConfig.surfaceHeight; -+ sessionInput.context = m_xvbaConfig.context->GetContext(); -+ sessionInput.decode_cap = &m_xvbaConfig.decoderCap; -+ sessionOutput.size = sizeof(sessionOutput); -+ -+ if (Success != g_XVBA_vtable.CreateDecode(&sessionInput, &sessionOutput)) -+ { -+ SetError(__FUNCTION__, "failed to create decoder session", __LINE__); -+ CLog::Log(LOGERROR, "Decoder failed with following stats: m_surfaceWidth %u, m_surfaceHeight %u," -+ " m_vidWidth %u, m_vidHeight %u, coded_width %d, coded_height %d", -+ m_xvbaConfig.surfaceWidth, -+ m_xvbaConfig.surfaceHeight, -+ m_xvbaConfig.vidWidth, -+ m_xvbaConfig.vidHeight, -+ avctx->coded_width, -+ avctx->coded_height); -+ return false; -+ } -+ m_xvbaConfig.xvbaSession = sessionOutput.session; -+ -+ // create decode buffers -+ XVBA_Create_DecodeBuff_Input bufferInput; -+ XVBA_Create_DecodeBuff_Output bufferOutput; -+ -+ bufferInput.size = sizeof(bufferInput); -+ bufferInput.session = m_xvbaConfig.xvbaSession; -+ bufferInput.buffer_type = XVBA_PICTURE_DESCRIPTION_BUFFER; -+ bufferInput.num_of_buffers = 1; -+ bufferOutput.size = sizeof(bufferOutput); -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create picture buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.picture_descriptor_buffer = bufferOutput.buffer_list; -+ -+ // data buffer -+ bufferInput.buffer_type = XVBA_DATA_BUFFER; -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create data buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.data_buffer = bufferOutput.buffer_list; -+ -+ // QO Buffer -+ bufferInput.buffer_type = XVBA_QM_BUFFER; -+ if (Success != g_XVBA_vtable.CreateDecodeBuffers(&bufferInput, &bufferOutput) -+ || bufferOutput.num_of_buffers_in_list != 1) -+ { -+ SetError(__FUNCTION__, "failed to create qm buffer", __LINE__); -+ return false; -+ } -+ m_xvbaBufferPool.iq_matrix_buffer = bufferOutput.buffer_list; -+ -+ -+ // initialize output -+ CSingleLock lock(g_graphicsContext); -+ m_xvbaConfig.stats = &m_bufferStats; -+ m_bufferStats.Reset(); -+ m_xvbaOutput.Start(); -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::INIT, -+ &reply, -+ 2000, -+ &m_xvbaConfig, -+ sizeof(m_xvbaConfig))) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - vdpau output returned error", __FUNCTION__); -+ m_xvbaOutput.Dispose(); -+ return false; -+ } -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - failed to init output", __FUNCTION__); -+ m_xvbaOutput.Dispose(); -+ return false; -+ } -+ m_inMsgEvent.Reset(); -+ -+ return true; -+} -+ -+void CDecoder::DestroySession() -+{ -+ m_xvbaOutput.Dispose(); -+ -+ XVBA_Destroy_Decode_Buffers_Input bufInput; -+ bufInput.size = sizeof(bufInput); -+ bufInput.num_of_buffers_in_list = 1; -+ -+ for (unsigned int i=0; isurface) -+ { -+ g_XVBA_vtable.DestroySurface(render->surface); -+ render->surface = 0; -+ render->picture_descriptor = 0; -+ render->iq_matrix = 0; -+ } -+ } -+ -+ if (m_xvbaConfig.xvbaSession) -+ g_XVBA_vtable.DestroyDecode(m_xvbaConfig.xvbaSession); -+ m_xvbaConfig.xvbaSession = 0; -+} -+ -+bool CDecoder::IsSurfaceValid(xvba_render_state *render) -+{ -+ // find render state in queue -+ bool found(false); -+ unsigned int i; -+ for(i = 0; i < m_videoSurfaces.size(); ++i) -+ { -+ if(m_videoSurfaces[i] == render) -+ { -+ found = true; -+ break; -+ } -+ } -+ if (!found) -+ { -+ CLog::Log(LOGERROR,"%s - video surface not found", __FUNCTION__); -+ return false; -+ } -+ if (m_videoSurfaces[i]->surface == 0) -+ { -+ m_videoSurfaces[i]->state = 0; -+ return false; -+ } -+ -+ return true; -+} -+ -+bool CDecoder::EnsureDataControlBuffers(unsigned int num) -+{ -+ if (m_xvbaBufferPool.data_control_buffers.size() >= num) -+ return true; -+ -+ unsigned int missing = num - m_xvbaBufferPool.data_control_buffers.size(); -+ -+ XVBA_Create_DecodeBuff_Input bufferInput; -+ XVBA_Create_DecodeBuff_Output bufferOutput; -+ bufferInput.size = sizeof(bufferInput); -+ bufferInput.session = m_xvbaConfig.xvbaSession; -+ bufferInput.buffer_type = XVBA_DATA_CTRL_BUFFER; -+ bufferInput.num_of_buffers = 1; -+ bufferOutput.size = sizeof(bufferOutput); -+ -+ for (unsigned int i=0; iopaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ unsigned int i; -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ xvba_render_state * render = NULL; -+ render = (xvba_render_state*)pic->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFReleaseBuffer - invalid context handle provided"); -+ return; -+ } -+ -+ for(i=0; i<4; i++) -+ pic->data[i]= NULL; -+ -+ // find render state in queue -+ if (!xvba->IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGDEBUG, "XVBA::FFReleaseBuffer - ignoring invalid buffer"); -+ return; -+ } -+ -+ render->state &= ~FF_XVBA_STATE_USED_FOR_REFERENCE; -+} -+ -+void CDecoder::FFDrawSlice(struct AVCodecContext *avctx, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height) -+{ -+ CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ if(xvba->m_displayState != XVBA_OPEN) -+ return; -+ -+ if(src->linesize[0] || src->linesize[1] || src->linesize[2] -+ || offset[0] || offset[1] || offset[2]) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFDrawSlice - invalid linesizes or offsets provided"); -+ return; -+ } -+ -+ xvba_render_state * render; -+ -+ render = (xvba_render_state*)src->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFDrawSlice - invalid context handle provided"); -+ return; -+ } -+ -+ // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid -+ if (!xvba->IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGWARNING, "XVBA::FFDrawSlice - ignoring invalid buffer"); -+ return; -+ } -+ -+ // decoding -+ XVBA_Decode_Picture_Start_Input startInput; -+ startInput.size = sizeof(startInput); -+ startInput.session = xvba->m_xvbaConfig.xvbaSession; -+ startInput.target_surface = render->surface; -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.StartDecodePicture(&startInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to start decoding", __LINE__); -+ return; -+ } -+ } -+ -+ XVBA_Decode_Picture_Input picInput; -+ picInput.size = sizeof(picInput); -+ picInput.session = xvba->m_xvbaConfig.xvbaSession; -+ XVBABufferDescriptor *list[2]; -+ picInput.buffer_list = list; -+ list[0] = xvba->m_xvbaBufferPool.picture_descriptor_buffer; -+ picInput.num_of_buffers_in_list = 1; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ list[1] = xvba->m_xvbaBufferPool.iq_matrix_buffer; -+ picInput.num_of_buffers_in_list = 2; -+ } -+ -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.DecodePicture(&picInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 1", __LINE__); -+ return; -+ } -+ } -+ -+ if (!xvba->EnsureDataControlBuffers(render->num_slices)) -+ return; -+ -+ XVBADataCtrl *dataControl; -+ int location = 0; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer = 0; -+ for (unsigned int j = 0; j < render->num_slices; ++j) -+ { -+ int startCodeSize = 0; -+ uint8_t startCode[] = {0x00,0x00,0x01}; -+ if (avctx->codec_id == CODEC_ID_H264) -+ { -+ startCodeSize = 3; -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location, -+ startCode, 3); -+ } -+ else if (avctx->codec_id == CODEC_ID_VC1 && -+ (memcmp(render->buffers[j].buffer, startCode, 3) != 0)) -+ { -+ startCodeSize = 4; -+ uint8_t sdf = 0x0d; -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location, -+ startCode, 3); -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location+3, -+ &sdf, 1); -+ } -+ // check for potential buffer overwrite -+ unsigned int bytesToCopy = render->buffers[j].size; -+ unsigned int freeBufferSize = xvba->m_xvbaBufferPool.data_buffer->buffer_size - -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer; -+ if (bytesToCopy >= freeBufferSize) -+ { -+ xvba->SetError(__FUNCTION__, "bitstream buffer too large, maybe corrupted packet", __LINE__); -+ return; -+ } -+ memcpy((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+location+startCodeSize, -+ render->buffers[j].buffer, -+ render->buffers[j].size); -+ dataControl = (XVBADataCtrl*)xvba->m_xvbaBufferPool.data_control_buffers[j]->bufferXVBA; -+ dataControl->SliceDataLocation = location; -+ dataControl->SliceBytesInBuffer = render->buffers[j].size+startCodeSize; -+ dataControl->SliceBitsInBuffer = dataControl->SliceBytesInBuffer * 8; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer += dataControl->SliceBytesInBuffer; -+ location += dataControl->SliceBytesInBuffer; -+ } -+ -+ int bufSize = xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer; -+ int padding = bufSize % 128; -+ if (padding) -+ { -+ padding = 128 - padding; -+ xvba->m_xvbaBufferPool.data_buffer->data_size_in_buffer += padding; -+ memset((uint8_t*)xvba->m_xvbaBufferPool.data_buffer->bufferXVBA+bufSize,0,padding); -+ } -+ -+ picInput.num_of_buffers_in_list = 2; -+ for (unsigned int i = 0; i < render->num_slices; ++i) -+ { -+ list[0] = xvba->m_xvbaBufferPool.data_buffer; -+ list[0]->data_offset = 0; -+ list[1] = xvba->m_xvbaBufferPool.data_control_buffers[i]; -+ list[1]->data_size_in_buffer = sizeof(*dataControl); -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.DecodePicture(&picInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 2", __LINE__); -+ return; -+ } -+ } -+ } -+ XVBA_Decode_Picture_End_Input endInput; -+ endInput.size = sizeof(endInput); -+ endInput.session = xvba->m_xvbaConfig.xvbaSession; -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.EndDecodePicture(&endInput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to decode picture 3", __LINE__); -+ return; -+ } -+ } -+ -+ // decode sync and error -+ XVBA_Surface_Sync_Input syncInput; -+ XVBA_Surface_Sync_Output syncOutput; -+ syncInput.size = sizeof(syncInput); -+ syncInput.session = xvba->m_xvbaConfig.xvbaSession; -+ syncInput.surface = render->surface; -+ syncInput.query_status = XVBA_GET_SURFACE_STATUS; -+ syncOutput.size = sizeof(syncOutput); -+ int64_t start = CurrentHostCounter(); -+ while (1) -+ { -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed sync surface 1", __LINE__); -+ return; -+ } -+ } -+ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) -+ break; -+ if (CurrentHostCounter() - start > CurrentHostFrequency()) -+ { -+ xvba->SetError(__FUNCTION__, "timed out waiting for surface", __LINE__); -+ break; -+ } -+ usleep(100); -+ } -+ render->state |= FF_XVBA_STATE_DECODED; -+} -+ -+int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) -+{ -+ CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; -+ CDecoder* xvba = (CDecoder*)ctx->GetHardware(); -+ struct pictureAge* pA = &xvba->picAge; -+ -+ pic->data[0] = -+ pic->data[1] = -+ pic->data[2] = -+ pic->data[3] = 0; -+ -+ pic->linesize[0] = -+ pic->linesize[1] = -+ pic->linesize[2] = -+ pic->linesize[3] = 0; -+ -+ CSingleLock lock(xvba->m_decoderSection); -+ -+ if(xvba->m_displayState != XVBA_OPEN) -+ return -1; -+ -+ if (xvba->m_xvbaConfig.xvbaSession == 0) -+ { -+ if (!xvba->CreateSession(avctx)) -+ return -1; -+ } -+ -+ xvba_render_state * render = NULL; -+ // find unused surface -+ { CSingleLock lock(xvba->m_videoSurfaceSec); -+ for(unsigned int i = 0; i < xvba->m_videoSurfaces.size(); ++i) -+ { -+ if(!(xvba->m_videoSurfaces[i]->state & (FF_XVBA_STATE_USED_FOR_REFERENCE | FF_XVBA_STATE_USED_FOR_RENDER))) -+ { -+ render = xvba->m_videoSurfaces[i]; -+ render->state = 0; -+ break; -+ } -+ } -+ } -+ -+ // create a new render state -+ if (render == NULL) -+ { -+ render = (xvba_render_state*)calloc(sizeof(xvba_render_state), 1); -+ if (render == NULL) -+ { -+ CLog::Log(LOGERROR, "XVBA::FFGetBuffer - calloc failed"); -+ return -1; -+ } -+ render->surface = 0; -+ render->buffers_alllocated = 0; -+ CSingleLock lock(xvba->m_videoSurfaceSec); -+ xvba->m_videoSurfaces.push_back(render); -+ } -+ -+ // create a new surface -+ if (render->surface == 0) -+ { -+ XVBA_Create_Surface_Input surfaceInput; -+ XVBA_Create_Surface_Output surfaceOutput; -+ surfaceInput.size = sizeof(surfaceInput); -+ surfaceInput.surface_type = xvba->m_xvbaConfig.decoderCap.surface_type; -+ surfaceInput.width = xvba->m_xvbaConfig.surfaceWidth; -+ surfaceInput.height = xvba->m_xvbaConfig.surfaceHeight; -+ surfaceInput.session = xvba->m_xvbaConfig.xvbaSession; -+ surfaceOutput.size = sizeof(surfaceOutput); -+ { CSingleLock lock(xvba->m_apiSec); -+ if (Success != g_XVBA_vtable.CreateSurface(&surfaceInput, &surfaceOutput)) -+ { -+ xvba->SetError(__FUNCTION__, "failed to create video surface", __LINE__); -+ return -1; -+ } -+ } -+ render->surface = surfaceOutput.surface; -+ render->picture_descriptor = (XVBAPictureDescriptor *)xvba->m_xvbaBufferPool.picture_descriptor_buffer->bufferXVBA; -+ render->iq_matrix = (XVBAQuantMatrixAvc *)xvba->m_xvbaBufferPool.iq_matrix_buffer->bufferXVBA; -+ CLog::Log(LOGDEBUG, "XVBA::FFGetBuffer - created video surface"); -+ } -+ -+ if (render == NULL) -+ return -1; -+ -+ pic->data[0] = (uint8_t*)render; -+ -+ if(pic->reference) -+ { -+ pic->age = pA->ip_age[0]; -+ pA->ip_age[0]= pA->ip_age[1]+1; -+ pA->ip_age[1]= 1; -+ pA->b_age++; -+ } -+ else -+ { -+ pic->age = pA->b_age; -+ pA->ip_age[0]++; -+ pA->ip_age[1]++; -+ pA->b_age = 1; -+ } -+ pic->type= FF_BUFFER_TYPE_USER; -+ -+ render->state |= FF_XVBA_STATE_USED_FOR_REFERENCE; -+ render->state &= ~FF_XVBA_STATE_DECODED; -+ pic->reordered_opaque= avctx->reordered_opaque; -+ -+ return 0; -+} -+ -+int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) -+{ -+ int result = Check(avctx); -+ if (result) -+ return result; -+ -+ CSingleLock lock(m_decoderSection); -+ -+ if(frame) -+ { // we have a new frame from decoder -+ -+ xvba_render_state * render = (xvba_render_state*)frame->data[0]; -+ if(!render) -+ { -+ CLog::Log(LOGERROR, "XVBA::Decode - no render buffer"); -+ return VC_ERROR; -+ } -+ -+ // ffmpeg vc-1 decoder does not flush, make sure the data buffer is still valid -+ if (!IsSurfaceValid(render)) -+ { -+ CLog::Log(LOGWARNING, "XVBA::Decode - ignoring invalid buffer"); -+ return VC_BUFFER; -+ } -+ if (!(render->state & FF_XVBA_STATE_DECODED)) -+ { -+ CLog::Log(LOGDEBUG, "XVBA::Decode - ffmpeg failed"); -+ return VC_BUFFER; -+ } -+ -+ CSingleLock lock(m_videoSurfaceSec); -+ render->state |= FF_XVBA_STATE_USED_FOR_RENDER; -+ lock.Leave(); -+ -+ // send frame to output for processing -+ CXvbaDecodedPicture pic; -+ memset(&pic.DVDPic, 0, sizeof(pic.DVDPic)); -+ ((CDVDVideoCodecFFmpeg*)avctx->opaque)->GetPictureCommon(&pic.DVDPic); -+ pic.render = render; -+ m_bufferStats.IncDecoded(); -+ m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); -+ -+ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); -+ if (m_codecControl & DVP_FLAG_SKIP_PROC) -+ { -+ m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); -+ } -+ } -+ -+ int retval = 0; -+ uint16_t decoded, processed, render; -+ Message *msg; -+ while (m_xvbaOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::ERROR) -+ { -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ m_bufferStats.Get(decoded, processed, render); -+ -+ uint64_t startTime = CurrentHostCounter(); -+ while (!retval) -+ { -+ if (m_xvbaOutput.m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ if (m_presentPicture) -+ { -+ m_presentPicture->ReturnUnused(); -+ m_presentPicture = 0; -+ } -+ -+ m_presentPicture = *(CXvbaRenderPicture**)msg->data; -+ m_presentPicture->xvba = this; -+ m_bufferStats.DecRender(); -+ m_bufferStats.Get(decoded, processed, render); -+ retval |= VC_PICTURE; -+ } -+ msg->Release(); -+ } -+ else if (m_xvbaOutput.m_controlPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputControlProtocol::STATS) -+ { -+ m_bufferStats.Get(decoded, processed, render); -+ } -+ else -+ { -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ msg->Release(); -+ } -+ -+ if ((m_codecControl & DVP_FLAG_DRAIN)) -+ { -+ if (decoded + processed + render < 2) -+ { -+ retval |= VC_BUFFER; -+ } -+ } -+ else -+ { -+ if (decoded + processed + render < 4) -+ { -+ retval |= VC_BUFFER; -+ } -+ } -+ -+ if (!retval && !m_inMsgEvent.WaitMSec(2000)) -+ break; -+ } -+ uint64_t diff = CurrentHostCounter() - startTime; -+ if (retval & VC_PICTURE) -+ { -+ m_bufferStats.SetParams(diff, m_speed); -+ if (diff*1000/CurrentHostFrequency() > 50) -+ CLog::Log(LOGDEBUG,"XVBA::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); -+ } -+ -+ if (!retval) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - timed out waiting for output message", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ retval |= VC_ERROR; -+ } -+ -+ return retval; -+ -+} -+ -+bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture) -+{ -+ CSingleLock lock(m_decoderSection); -+ -+ if (m_displayState != XVBA_OPEN) -+ return false; -+ -+ *picture = m_presentPicture->DVDPic; -+ picture->xvba = m_presentPicture; -+ -+ return true; -+} -+ -+void CDecoder::ReturnRenderPicture(CXvbaRenderPicture *renderPic) -+{ -+ m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); -+} -+ -+ -+//void CDecoder::CopyYV12(int index, uint8_t *dest) -+//{ -+// CSharedLock lock(m_decoderSection); -+// -+// { CSharedLock dLock(m_displaySection); -+// if(m_displayState != XVBA_OPEN) -+// return; -+// } -+// -+// if (!m_flipBuffer[index].outPic) -+// { -+// CLog::Log(LOGWARNING, "XVBA::Present: present picture is NULL"); -+// return; -+// } -+// -+// XVBA_GetSurface_Target target; -+// target.size = sizeof(target); -+// target.surfaceType = XVBA_YV12; -+// target.flag = XVBA_FRAME; -+// -+// XVBA_Get_Surface_Input input; -+// input.size = sizeof(input); -+// input.session = m_xvbaSession; -+// input.src_surface = m_flipBuffer[index].outPic->render->surface; -+// input.target_buffer = dest; -+// input.target_pitch = m_surfaceWidth; -+// input.target_width = m_surfaceWidth; -+// input.target_height = m_surfaceHeight; -+// input.target_parameter = target; -+// { CSingleLock lock(m_apiSec); -+// if (Success != g_XVBA_vtable.GetSurface(&input)) -+// { -+// CLog::Log(LOGERROR,"(XVBA::CopyYV12) failed to get surface"); -+// } -+// } -+//} -+ -+void CDecoder::Reset() -+{ -+ CSingleLock lock(m_decoderSection); -+ -+ if (!m_xvbaConfig.xvbaSession) -+ return; -+ -+ Message *reply; -+ if (m_xvbaOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::FLUSH, -+ &reply, -+ 2000)) -+ { -+ bool success = reply->signal == COutputControlProtocol::ACC ? true : false; -+ reply->Release(); -+ if (!success) -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - flush returned error", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+ else -+ m_bufferStats.Reset(); -+ } -+ else -+ { -+ CLog::Log(LOGERROR, "XVBA::%s - flush timed out", __FUNCTION__); -+ m_displayState = XVBA_ERROR; -+ } -+} -+ -+bool CDecoder::CanSkipDeint() -+{ -+ return m_bufferStats.CanSkipDeint(); -+} -+ -+void CDecoder::SetSpeed(int speed) -+{ -+ m_speed = speed; -+} -+ -+//----------------------------------------------------------------------------- -+// RenderPicture -+//----------------------------------------------------------------------------- -+ -+CXvbaRenderPicture* CXvbaRenderPicture::Acquire() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (refCount == 0) -+ xvba->Acquire(); -+ -+ refCount++; -+ return this; -+} -+ -+long CXvbaRenderPicture::Release() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ refCount--; -+ if (refCount > 0) -+ return refCount; -+ -+ lock.Leave(); -+ xvba->ReturnRenderPicture(this); -+ xvba->ReleasePicReference(); -+ -+ return refCount; -+} -+ -+void CXvbaRenderPicture::Transfer() -+{ -+ CSingleLock lock(*renderPicSection); -+ -+ if (valid) -+ xvbaOutput->TransferSurface(sourceIdx); -+} -+ -+void CXvbaRenderPicture::ReturnUnused() -+{ -+ { CSingleLock lock(*renderPicSection); -+ if (refCount > 0) -+ return; -+ } -+ if (xvba) -+ xvba->ReturnRenderPicture(this); -+} -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+COutput::COutput(CEvent *inMsgEvent) : -+ CThread("XVBA Output Thread"), -+ m_controlPort("OutputControlPort", inMsgEvent, &m_outMsgEvent), -+ m_dataPort("OutputDataPort", inMsgEvent, &m_outMsgEvent) -+{ -+ m_inMsgEvent = inMsgEvent; -+ -+ CXvbaRenderPicture pic; -+ pic.renderPicSection = &m_bufferPool.renderPicSec; -+ pic.refCount = 0; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; i++) -+ { -+ m_bufferPool.allRenderPics.push_back(pic); -+ } -+ for (unsigned int i = 0; i < m_bufferPool.allRenderPics.size(); ++i) -+ { -+ m_bufferPool.freeRenderPics.push_back(&m_bufferPool.allRenderPics[i]); -+ } -+} -+ -+void COutput::Start() -+{ -+ Create(); -+} -+ -+COutput::~COutput() -+{ -+ Dispose(); -+ -+ m_bufferPool.freeRenderPics.clear(); -+ m_bufferPool.usedRenderPics.clear(); -+ m_bufferPool.allRenderPics.clear(); -+} -+ -+void COutput::Dispose() -+{ -+ CSingleLock lock(g_graphicsContext); -+ m_bStop = true; -+ m_outMsgEvent.Set(); -+ StopThread(); -+ m_controlPort.Purge(); -+ m_dataPort.Purge(); -+} -+ -+void COutput::OnStartup() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnStartup: Output Thread created"); -+} -+ -+void COutput::OnExit() -+{ -+ CLog::Log(LOGNOTICE, "COutput::OnExit: Output Thread terminated"); -+} -+ -+enum OUTPUT_STATES -+{ -+ O_TOP = 0, // 0 -+ O_TOP_ERROR, // 1 -+ O_TOP_UNCONFIGURED, // 2 -+ O_TOP_CONFIGURED, // 3 -+ O_TOP_CONFIGURED_WAIT_RES1, // 4 -+ O_TOP_CONFIGURED_WAIT_DEC, // 5 -+ O_TOP_CONFIGURED_STEP1, // 6 -+ O_TOP_CONFIGURED_WAIT_RES2, // 7 -+ O_TOP_CONFIGURED_STEP2, // 8 -+}; -+ -+int OUTPUT_parentStates[] = { -+ -1, -+ 0, //TOP_ERROR -+ 0, //TOP_UNCONFIGURED -+ 0, //TOP_CONFIGURED -+ 3, //TOP_CONFIGURED_WAIT_RES1 -+ 3, //TOP_CONFIGURED_WAIT_DEC -+ 3, //TOP_CONFIGURED_STEP1 -+ 3, //TOP_CONFIGURED_WAIT_RES2 -+ 3, //TOP_CONFIGURED_STEP2 -+}; -+ -+void COutput::StateMachine(int signal, Protocol *port, Message *msg) -+{ -+ for (int state = m_state; ; state = OUTPUT_parentStates[state]) -+ { -+ switch (state) -+ { -+ case O_TOP: // TOP -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::RETURNPIC: -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ return; -+ default: -+ break; -+ } -+ } -+ { -+ std::string portName = port == NULL ? "timer" : port->portName; -+ CLog::Log(LOGWARNING, "COutput::%s - signal: %d form port: %s not handled for state: %d", __FUNCTION__, signal, portName.c_str(), m_state); -+ } -+ return; -+ -+ case O_TOP_ERROR: -+ m_extTimeout = 1000; -+ break; -+ -+ case O_TOP_UNCONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::INIT: -+ CXvbaConfig *data; -+ data = (CXvbaConfig*)msg->data; -+ if (data) -+ { -+ m_config = *data; -+ } -+ Init(); -+ EnsureBufferPool(); -+ if (!m_xvbaError) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ msg->Reply(COutputControlProtocol::ACC); -+ } -+ else -+ { -+ m_state = O_TOP_ERROR; -+ msg->Reply(COutputControlProtocol::ERROR); -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED: -+ if (port == &m_controlPort) -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::FLUSH: -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ Flush(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ case COutputControlProtocol::PRECLEANUP: -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ Flush(); -+ PreReleaseBufferPool(); -+ msg->Reply(COutputControlProtocol::ACC); -+ return; -+ default: -+ break; -+ } -+ } -+ else if (port == &m_dataPort) -+ { -+ switch (signal) -+ { -+ case COutputDataProtocol::NEWFRAME: -+ CXvbaDecodedPicture *frame; -+ frame = (CXvbaDecodedPicture*)msg->data; -+ if (frame) -+ { -+ m_decodedPics.push(*frame); -+ m_extTimeout = 0; -+ } -+ return; -+ case COutputDataProtocol::RETURNPIC: -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ m_controlPort.SendInMessage(COutputControlProtocol::STATS); -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_RES1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (!m_decodedPics.empty() && FindFreeSurface() >= 0 && !m_bufferPool.freeRenderPics.empty()) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_DEC; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ if (m_extTimeout != 0) -+ { -+ uint16_t decoded, processed, render; -+ m_config.stats->Get(decoded, processed, render); -+// CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_DEC: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (IsDecodingFinished()) -+ { -+ m_state = O_TOP_CONFIGURED_STEP1; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ m_extTimeout = 1; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_STEP1: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ m_processPicture = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ InitCycle(); -+ CXvbaRenderPicture *pic; -+ pic = ProcessPicture(); -+ if (pic) -+ { -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ if (m_xvbaError) -+ { -+ m_state = O_TOP_ERROR; -+ return; -+ } -+ if (m_deinterlacing && !m_deintSkip) -+ { -+ m_state = O_TOP_CONFIGURED_WAIT_RES2; -+ m_extTimeout = 0; -+ } -+ else -+ { -+ FiniCycle(); -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ m_extTimeout = 0; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_WAIT_RES2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ if (FindFreeSurface() >= 0 && !m_bufferPool.freeRenderPics.empty()) -+ { -+ m_state = O_TOP_CONFIGURED_STEP2; -+ m_bStateMachineSelfTrigger = true; -+ } -+ else -+ { -+ if (m_extTimeout != 0) -+ { -+ uint16_t decoded, processed, render; -+ m_config.stats->Get(decoded, processed, render); -+ CLog::Log(LOGDEBUG, "CVDPAU::COutput - timeout idle: decoded: %d, proc: %d, render: %d", decoded, processed, render); -+ } -+ m_extTimeout = 100; -+ } -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ case O_TOP_CONFIGURED_STEP2: -+ if (port == NULL) // timeout -+ { -+ switch (signal) -+ { -+ case COutputControlProtocol::TIMEOUT: -+ CXvbaRenderPicture *pic; -+ m_deintStep = 1; -+ pic = ProcessPicture(); -+ if (pic) -+ { -+ m_config.stats->IncRender(); -+ m_dataPort.SendInMessage(COutputDataProtocol::PICTURE, &pic, sizeof(pic)); -+ } -+ if (m_xvbaError) -+ { -+ m_state = O_TOP_ERROR; -+ return; -+ } -+ FiniCycle(); -+ m_state = O_TOP_CONFIGURED_WAIT_RES1; -+ m_extTimeout = 0; -+ return; -+ default: -+ break; -+ } -+ } -+ break; -+ -+ default: // we are in no state, should not happen -+ CLog::Log(LOGERROR, "COutput::%s - no valid state: %d", __FUNCTION__, m_state); -+ return; -+ } -+ } // for -+} -+ -+void COutput::Process() -+{ -+ Message *msg; -+ Protocol *port; -+ bool gotMsg; -+ -+ m_state = O_TOP_UNCONFIGURED; -+ m_extTimeout = 1000; -+ m_bStateMachineSelfTrigger = false; -+ -+ while (!m_bStop) -+ { -+ gotMsg = false; -+ -+ if (m_bStateMachineSelfTrigger) -+ { -+ m_bStateMachineSelfTrigger = false; -+ // self trigger state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ // check control port -+ else if (m_controlPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_controlPort; -+ } -+ // check data port -+ else if (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ gotMsg = true; -+ port = &m_dataPort; -+ } -+ if (gotMsg) -+ { -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ continue; -+ } -+ -+ // wait for message -+ else if (m_outMsgEvent.WaitMSec(m_extTimeout)) -+ { -+ continue; -+ } -+ // time out -+ else -+ { -+ msg = m_controlPort.GetMessage(); -+ msg->signal = COutputControlProtocol::TIMEOUT; -+ port = 0; -+ // signal timeout to state machine -+ StateMachine(msg->signal, port, msg); -+ if (!m_bStateMachineSelfTrigger) -+ { -+ msg->Release(); -+ msg = NULL; -+ } -+ } -+ } -+ Flush(); -+ Uninit(); -+} -+ -+bool COutput::Init() -+{ -+ if (!CreateGlxContext()) -+ return false; -+ -+ m_xvbaError = false; -+ m_processPicture.render = 0; -+ -+ return true; -+} -+ -+bool COutput::Uninit() -+{ -+ ReleaseBufferPool(); -+ DestroyGlxContext(); -+ return true; -+} -+ -+void COutput::Flush() -+{ -+ while (!m_decodedPics.empty()) -+ { -+ CXvbaDecodedPicture pic = m_decodedPics.front(); -+ m_decodedPics.pop(); -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ -+ if (m_processPicture.render) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ m_processPicture.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ m_processPicture.render = 0; -+ } -+ -+ Message *msg; -+ while (m_dataPort.ReceiveOutMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::NEWFRAME) -+ { -+ CXvbaDecodedPicture pic = *(CXvbaDecodedPicture*)msg->data; -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ if (pic.render) -+ pic.render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ else if (msg->signal == COutputDataProtocol::RETURNPIC) -+ { -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ msg->Release(); -+ } -+ -+ while (m_dataPort.ReceiveInMessage(&msg)) -+ { -+ if (msg->signal == COutputDataProtocol::PICTURE) -+ { -+ CXvbaRenderPicture *pic; -+ pic = *((CXvbaRenderPicture**)msg->data); -+ ProcessReturnPicture(pic); -+ } -+ } -+} -+ -+bool COutput::IsDecodingFinished() -+{ -+ return true; -+ -+ // check for decoding to be finished -+ CXvbaDecodedPicture decodedPic = m_decodedPics.front(); -+ -+ XVBA_Surface_Sync_Input syncInput; -+ XVBA_Surface_Sync_Output syncOutput; -+ syncInput.size = sizeof(syncInput); -+ syncInput.session = m_config.xvbaSession; -+ syncInput.surface = decodedPic.render->surface; -+ syncInput.query_status = XVBA_GET_SURFACE_STATUS; -+ syncOutput.size = sizeof(syncOutput); -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) -+ { -+ CLog::Log(LOGERROR,"XVBA - failed sync surface"); -+ m_xvbaError = true; -+ return false; -+ } -+ } -+ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) -+ return true; -+ -+ return false; -+} -+ -+void COutput::TransferSurface(uint32_t source) -+{ -+ XvbaBufferPool::GLVideoSurface *glSurface = &m_bufferPool.glSurfaces[source]; -+ -+ if (glSurface->transferred) -+ return; -+ -+ glSurface->transferred = true; -+ -+ // transfer surface -+ XVBA_Transfer_Surface_Input transInput; -+ transInput.size = sizeof(transInput); -+ transInput.session = m_config.xvbaSession; -+ transInput.src_surface = glSurface->render->surface; -+ transInput.target_surface = glSurface->glSurface; -+ transInput.flag = glSurface->field; -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.TransferSurface(&transInput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to transfer surface"); -+ m_xvbaError = true; -+ return; -+ } -+ } -+} -+ -+CXvbaRenderPicture* COutput::ProcessPicture() -+{ -+ CXvbaRenderPicture *retPic = 0; -+ -+ if (m_deintStep == 1) -+ { -+ if(m_field == XVBA_TOP_FIELD) -+ m_field = XVBA_BOTTOM_FIELD; -+ else -+ m_field = XVBA_TOP_FIELD; -+ } -+ -+ // find unused shared surface -+ unsigned int idx = FindFreeSurface(); -+ XvbaBufferPool::GLVideoSurface *glSurface = &m_bufferPool.glSurfaces[idx]; -+ glSurface->used = true; -+ glSurface->field = m_field; -+ glSurface->render = m_processPicture.render; -+ glSurface->transferred = false; -+ -+ int cmd = 0; -+ m_config.stats->GetCmd(cmd); -+ -+// if (!(cmd & DVP_FLAG_SKIP_PROC)) -+// { -+ // transfer surface -+ XVBA_Transfer_Surface_Input transInput; -+ transInput.size = sizeof(transInput); -+ transInput.session = m_config.xvbaSession; -+ transInput.src_surface = m_processPicture.render->surface; -+ transInput.target_surface = glSurface->glSurface; -+ transInput.flag = m_field; -+ { CSingleLock lock(*(m_config.apiSec)); -+ if (Success != g_XVBA_vtable.TransferSurface(&transInput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to transfer surface"); -+ m_xvbaError = true; -+ return retPic; -+ } -+ } -+ -+ // make sure that transfer is completed -+// uint64_t maxTimeout = 1000000000LL; -+// GLsync ReadyFence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); -+// glClientWaitSync(ReadyFence, GL_SYNC_FLUSH_COMMANDS_BIT, maxTimeout); -+// glDeleteSync(ReadyFence); -+// glFinish();GL_SYNC_FLUSH_COMMANDS_BIT -+// } -+// else -+// { -+// CLog::Log(LOGDEBUG,"XVBA::ProcessPicture - skipped transfer surface"); -+// m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; -+// } -+ -+ // prepare render pic -+ retPic = m_bufferPool.freeRenderPics.front(); -+ m_bufferPool.freeRenderPics.pop_front(); -+ m_bufferPool.usedRenderPics.push_back(retPic); -+ retPic->sourceIdx = glSurface->id; -+ retPic->DVDPic = m_processPicture.DVDPic; -+ retPic->valid = true; -+ retPic->texture = glSurface->texture; -+ retPic->crop = CRect(0,0,0,0); -+ retPic->texWidth = m_config.surfaceWidth; -+ retPic->texHeight = m_config.surfaceHeight; -+ retPic->xvbaOutput = this; -+ -+ // set repeat pic for de-interlacing -+ if (m_deinterlacing) -+ { -+ if (m_deintStep == 1) -+ { -+ retPic->DVDPic.pts = DVD_NOPTS_VALUE; -+ retPic->DVDPic.dts = DVD_NOPTS_VALUE; -+ } -+ retPic->DVDPic.iRepeatPicture = 0.0; -+ } -+ -+ return retPic; -+} -+ -+void COutput::ProcessReturnPicture(CXvbaRenderPicture *pic) -+{ -+ std::deque::iterator it; -+ it = std::find(m_bufferPool.usedRenderPics.begin(), m_bufferPool.usedRenderPics.end(), pic); -+ if (it == m_bufferPool.usedRenderPics.end()) -+ { -+ CLog::Log(LOGWARNING, "COutput::ProcessReturnPicture - pic not found"); -+ return; -+ } -+ m_bufferPool.usedRenderPics.erase(it); -+ m_bufferPool.freeRenderPics.push_back(pic); -+ if (!pic->valid) -+ { -+ CLog::Log(LOGDEBUG, "COutput::%s - return of invalid render pic", __FUNCTION__); -+ return; -+ } -+ -+ if (m_config.useSharedSurfaces) -+ { -+ xvba_render_state *render = m_bufferPool.glSurfaces[pic->sourceIdx].render; -+ if (render) -+ { -+ // check if video surface if referenced by other glSurfaces -+ bool referenced(false); -+ for (unsigned int i=0; isourceIdx) -+ continue; -+ if (m_bufferPool.glSurfaces[i].render == render) -+ { -+ referenced = true; -+ break; -+ } -+ } -+ if (m_processPicture.render == render) -+ referenced = true; -+ -+ // release video surface -+ if (!referenced) -+ { -+ CSingleLock lock(*m_config.videoSurfaceSec); -+ render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ } -+ -+ // unreference video surface -+ m_bufferPool.glSurfaces[pic->sourceIdx].render = 0; -+ } -+ m_bufferPool.glSurfaces[pic->sourceIdx].used = false; -+ return; -+ } -+} -+ -+int COutput::FindFreeSurface() -+{ -+ // find free shared surface -+ unsigned int i; -+ for (i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].used) -+ break; -+ } -+ if (i == m_bufferPool.glSurfaces.size()) -+ return -1; -+ else -+ return i; -+} -+ -+void COutput::InitCycle() -+{ -+ uint64_t latency; -+ int speed; -+ m_config.stats->GetParams(latency, speed); -+ latency = (latency*1000)/CurrentHostFrequency(); -+ -+ m_config.stats->SetCanSkipDeint(false); -+ -+ EDEINTERLACEMODE mode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; -+ EINTERLACEMETHOD method = g_settings.m_currentVideoSettings.m_InterlaceMethod; -+ bool interlaced = m_processPicture.DVDPic.iFlags & DVP_FLAG_INTERLACED; -+ -+ if (mode == VS_DEINTERLACEMODE_FORCE || -+ (mode == VS_DEINTERLACEMODE_AUTO && interlaced)) -+ { -+ if((method == VS_INTERLACEMETHOD_AUTO && interlaced) -+ || method == VS_INTERLACEMETHOD_XVBA) -+ { -+ m_deinterlacing = true; -+ m_deintSkip = false; -+ m_config.stats->SetCanSkipDeint(true); -+ -+ if (m_processPicture.DVDPic.iFlags & DVP_FLAG_DROPDEINT) -+ { -+ m_deintSkip = true; -+ } -+ -+ // do only half deinterlacing -+ if (speed != DVD_PLAYSPEED_NORMAL || !g_graphicsContext.IsFullScreenVideo()) -+ { -+ m_config.stats->SetCanSkipDeint(false); -+ m_deintSkip = true; -+ } -+ -+ if(m_processPicture.DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) -+ m_field = XVBA_TOP_FIELD; -+ else -+ m_field = XVBA_BOTTOM_FIELD; -+ } -+ } -+ else -+ { -+ m_deinterlacing = false; -+ m_field = XVBA_FRAME; -+ } -+ -+ m_processPicture.DVDPic.format = DVDVideoPicture::FMT_XVBA; -+ m_processPicture.DVDPic.iFlags &= ~(DVP_FLAG_TOP_FIELD_FIRST | -+ DVP_FLAG_REPEAT_TOP_FIELD | -+ DVP_FLAG_INTERLACED); -+ m_processPicture.DVDPic.iWidth = m_config.vidWidth; -+ m_processPicture.DVDPic.iHeight = m_config.vidHeight; -+ -+ m_deintStep = 0; -+} -+ -+void COutput::FiniCycle() -+{ -+// { CSingleLock lock(*m_config.videoSurfaceSec); -+// m_processPicture.render->state &= ~FF_XVBA_STATE_USED_FOR_RENDER; -+// } -+ m_processPicture.render = 0; -+ m_config.stats->DecDecoded(); -+} -+ -+bool COutput::EnsureBufferPool() -+{ -+ if (m_config.useSharedSurfaces && m_bufferPool.glSurfaces.empty()) -+ { -+ GLenum textureTarget; -+ if (!glewIsSupported("GL_ARB_texture_non_power_of_two") && glewIsSupported("GL_ARB_texture_rectangle")) -+ { -+ textureTarget = GL_TEXTURE_RECTANGLE_ARB; -+ } -+ else -+ textureTarget = GL_TEXTURE_2D; -+ -+ // create shared surfaces -+ XvbaBufferPool::GLVideoSurface surface; -+ for (unsigned int i = 0; i < NUM_RENDER_PICS; ++i) -+ { -+ glEnable(textureTarget); -+ glGenTextures(1, &surface.texture); -+ glBindTexture(textureTarget, surface.texture); -+ glTexParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4); -+ glTexImage2D(textureTarget, 0, GL_RGBA, m_config.surfaceWidth, m_config.surfaceHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); -+ -+ XVBA_Create_GLShared_Surface_Input surfInput; -+ XVBA_Create_GLShared_Surface_Output surfOutput; -+ surfInput.size = sizeof(surfInput); -+ surfInput.session = m_config.xvbaSession; -+ surfInput.gltexture = surface.texture; -+ surfInput.glcontext = m_glContext; -+ surfOutput.size = sizeof(surfOutput); -+ surfOutput.surface = 0; -+ if (Success != g_XVBA_vtable.CreateGLSharedSurface(&surfInput, &surfOutput)) -+ { -+ CLog::Log(LOGERROR,"(XVBA) failed to create shared surface"); -+ m_xvbaError = true; -+ break; -+ } -+ CLog::Log(LOGDEBUG, "XVBA::GetTexture - created shared surface"); -+ -+ surface.glSurface = surfOutput.surface; -+ surface.id = i; -+ surface.used = false; -+ surface.render = 0; -+ m_bufferPool.glSurfaces.push_back(surface); -+ } -+ glDisable(textureTarget); -+ } -+ -+ return true; -+} -+ -+void COutput::ReleaseBufferPool() -+{ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.useSharedSurfaces) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].glSurface) -+ continue; -+ g_XVBA_vtable.DestroySurface(m_bufferPool.glSurfaces[i].glSurface); -+ glDeleteTextures(1, &m_bufferPool.glSurfaces[i].texture); -+ } -+ m_bufferPool.glSurfaces.clear(); -+ } -+ // invalidate all used render pictures -+ for (unsigned int i = 0; i < m_bufferPool.usedRenderPics.size(); ++i) -+ { -+ m_bufferPool.usedRenderPics[i]->valid = false; -+ unsigned int idx = m_bufferPool.usedRenderPics[i]->sourceIdx; -+ if (m_bufferPool.glSurfaces[idx].render) -+ { -+ { CSingleLock lock(*m_config.videoSurfaceSec); -+ m_bufferPool.glSurfaces[idx].render->state &= ~(FF_XVBA_STATE_USED_FOR_RENDER | FF_XVBA_STATE_DECODED); -+ m_bufferPool.glSurfaces[idx].render = 0; -+ } -+ } -+ } -+} -+ -+void COutput::PreReleaseBufferPool() -+{ -+ CSingleLock lock(m_bufferPool.renderPicSec); -+ -+ if (m_config.useSharedSurfaces) -+ { -+ for (unsigned int i = 0; i < m_bufferPool.glSurfaces.size(); ++i) -+ { -+ if (!m_bufferPool.glSurfaces[i].used) -+ { -+ g_XVBA_vtable.DestroySurface(m_bufferPool.glSurfaces[i].glSurface); -+ glDeleteTextures(1, &m_bufferPool.glSurfaces[i].texture); -+ m_bufferPool.glSurfaces[i].glSurface = 0; -+ m_bufferPool.glSurfaces[i].used = true; -+ } -+ } -+ } -+} -+ -+bool COutput::CreateGlxContext() -+{ -+ GLXContext glContext; -+ Window window; -+ -+ m_Display = g_Windowing.GetDisplay(); -+ glContext = g_Windowing.GetGlxContext(); -+ m_Window = g_Windowing.GetWmWindow(); -+ -+ // Get our window attribs. -+ XWindowAttributes wndattribs; -+ XGetWindowAttributes(m_Display, m_Window, &wndattribs); -+ -+ // Get visual Info -+ XVisualInfo visInfo; -+ visInfo.visualid = wndattribs.visual->visualid; -+ int nvisuals = 0; -+ XVisualInfo* visuals = XGetVisualInfo(m_Display, VisualIDMask, &visInfo, &nvisuals); -+ if (nvisuals != 1) -+ { -+ CLog::Log(LOGERROR, "XVBA::COutput::CreateGlxContext - could not find visual"); -+ return false; -+ } -+ visInfo = visuals[0]; -+ XFree(visuals); -+ -+ m_pixmap = XCreatePixmap(m_Display, -+ DefaultRootWindow(m_Display), -+ 192, -+ 108, -+ visInfo.depth); -+ if (!m_pixmap) -+ { -+ CLog::Log(LOGERROR, "XVBA::COutput::CreateGlxContext - Unable to create XPixmap"); -+ return false; -+ } -+ -+ // create gl pixmap -+ m_glPixmap = glXCreateGLXPixmap(m_Display, &visInfo, m_pixmap); -+ -+ if (!m_glPixmap) -+ { -+ CLog::Log(LOGINFO, "XVBA::COutput::CreateGlxContext - Could not create glPixmap"); -+ return false; -+ } -+ -+ m_glContext = glXCreateContext(m_Display, &visInfo, glContext, True); -+ -+ if (!glXMakeCurrent(m_Display, m_glPixmap, m_glContext)) -+ { -+ CLog::Log(LOGINFO, "XVBA::COutput::CreateGlxContext - Could not make Pixmap current"); -+ return false; -+ } -+ -+ CLog::Log(LOGNOTICE, "XVBA::COutput::CreateGlxContext - created context"); -+ return true; -+} -+ -+bool COutput::DestroyGlxContext() -+{ -+ if (m_glContext) -+ { -+ glXMakeCurrent(m_Display, None, NULL); -+ glXDestroyContext(m_Display, m_glContext); -+ } -+ m_glContext = 0; -+ -+ if (m_glPixmap) -+ glXDestroyPixmap(m_Display, m_glPixmap); -+ m_glPixmap = 0; -+ -+ if (m_pixmap) -+ XFreePixmap(m_Display, m_pixmap); -+ m_pixmap = 0; -+ -+ return true; -+} -+ -+#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 2012-05-14 14:15:12.137220527 +0200 -@@ -0,0 +1,386 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+#pragma once -+ -+#include "X11/Xlib.h" -+#include "amd/amdxvba.h" -+#include "DllAvCodec.h" -+#include "DVDCodecs/Video/DVDVideoCodecFFmpeg.h" -+#include "threads/Thread.h" -+#include "threads/CriticalSection.h" -+#include "threads/SharedSection.h" -+#include "threads/Event.h" -+#include "guilib/DispResource.h" -+#include "guilib/Geometry.h" -+#include "libavcodec/xvba.h" -+#include "utils/ActorProtocol.h" -+#include "settings/VideoSettings.h" -+#include -+#include -+#include -+#include -+ -+using namespace Actor; -+ -+ -+namespace XVBA -+{ -+ -+//----------------------------------------------------------------------------- -+// XVBA data structs -+//----------------------------------------------------------------------------- -+ -+class CDecoder; -+class CXVBAContext; -+class COutput; -+ -+#define NUM_RENDER_PICS 9 -+ -+/** -+ * Buffer statistics used to control number of frames in queue -+ */ -+ -+class CXvbaBufferStats -+{ -+public: -+ uint16_t decodedPics; -+ uint16_t processedPics; -+ uint16_t renderPics; -+ uint64_t latency; // time decoder has waited for a frame, ideally there is no latency -+ int playSpeed; -+ bool canSkipDeint; -+ int processCmd; -+ -+ void IncDecoded() { CSingleLock l(m_sec); decodedPics++;} -+ void DecDecoded() { CSingleLock l(m_sec); decodedPics--;} -+ void IncProcessed() { CSingleLock l(m_sec); processedPics++;} -+ void DecProcessed() { CSingleLock l(m_sec); processedPics--;} -+ void IncRender() { CSingleLock l(m_sec); renderPics++;} -+ void DecRender() { CSingleLock l(m_sec); renderPics--;} -+ void Reset() { CSingleLock l(m_sec); decodedPics=0; processedPics=0;renderPics=0;latency=0;} -+ void Get(uint16_t &decoded, uint16_t &processed, uint16_t &render) {CSingleLock l(m_sec); decoded = decodedPics, processed=processedPics, render=renderPics;} -+ void SetParams(uint64_t time, int speed) { CSingleLock l(m_sec); latency = time; playSpeed = speed; } -+ void GetParams(uint64_t &lat, int &speed) { CSingleLock l(m_sec); lat = latency; speed = playSpeed; } -+ void SetCmd(int cmd) { CSingleLock l(m_sec); processCmd = cmd; } -+ void GetCmd(int &cmd) { CSingleLock l(m_sec); cmd = processCmd; processCmd = 0; } -+ void SetCanSkipDeint(bool canSkip) { CSingleLock l(m_sec); canSkipDeint = canSkip; } -+ bool CanSkipDeint() { CSingleLock l(m_sec); if (canSkipDeint) return true; else return false;} -+private: -+ CCriticalSection m_sec; -+}; -+ -+/** -+ * CXvbaConfig holds all configuration parameters needed by vdpau -+ * The structure is sent to the internal classes CMixer and COutput -+ * for init. -+ */ -+ -+struct CXvbaConfig -+{ -+ int surfaceWidth; -+ int surfaceHeight; -+ int vidWidth; -+ int vidHeight; -+ int outWidth; -+ int outHeight; -+ bool useSharedSurfaces; -+ -+ CXVBAContext *context; -+ XVBADecodeCap decoderCap; -+ void *xvbaSession; -+ std::vector *videoSurfaces; -+ CCriticalSection *videoSurfaceSec; -+ CCriticalSection *apiSec; -+ -+ CXvbaBufferStats *stats; -+ int numRenderBuffers; -+ uint32_t maxReferences; -+}; -+ -+/** -+ * Holds a decoded frame -+ * Input to COutput for further processing -+ */ -+struct CXvbaDecodedPicture -+{ -+ DVDVideoPicture DVDPic; -+ xvba_render_state *render; -+}; -+ -+/** -+ * Ready to render textures -+ * Sent from COutput back to CDecoder -+ * Objects are referenced by DVDVideoPicture and are sent -+ * to renderer -+ */ -+class CXvbaRenderPicture -+{ -+ friend class CDecoder; -+ friend class COutput; -+public: -+ DVDVideoPicture DVDPic; -+ int texWidth, texHeight; -+ CRect crop; -+ GLuint texture; -+ uint32_t sourceIdx; -+ bool valid; -+ CDecoder *xvba; -+ CXvbaRenderPicture* Acquire(); -+ long Release(); -+ void Transfer(); -+private: -+ void ReturnUnused(); -+ int refCount; -+ CCriticalSection *renderPicSection; -+ COutput *xvbaOutput; -+}; -+ -+//----------------------------------------------------------------------------- -+// Output -+//----------------------------------------------------------------------------- -+ -+/** -+ * Buffer pool holds allocated xvba and gl resources -+ * Embedded in COutput -+ */ -+struct XvbaBufferPool -+{ -+ struct GLVideoSurface -+ { -+ unsigned int id; -+ bool used; -+ bool transferred; -+ GLuint texture; -+ void *glSurface; -+ xvba_render_state *render; -+ XVBA_SURFACE_FLAG field; -+ }; -+ std::vector glSurfaces; -+ std::vector allRenderPics; -+ std::deque usedRenderPics; -+ std::deque freeRenderPics; -+ CCriticalSection renderPicSec; -+}; -+ -+class COutputControlProtocol : public Protocol -+{ -+public: -+ COutputControlProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ INIT, -+ FLUSH, -+ PRECLEANUP, -+ TIMEOUT, -+ }; -+ enum InSignal -+ { -+ ACC, -+ ERROR, -+ STATS, -+ }; -+}; -+ -+class COutputDataProtocol : public Protocol -+{ -+public: -+ COutputDataProtocol(std::string name, CEvent* inEvent, CEvent *outEvent) : Protocol(name, inEvent, outEvent) {}; -+ enum OutSignal -+ { -+ NEWFRAME = 0, -+ RETURNPIC, -+ }; -+ enum InSignal -+ { -+ PICTURE, -+ }; -+}; -+ -+/** -+ * COutput is embedded in CDecoder and embeds CMixer -+ * The class has its own OpenGl context which is shared with render thread -+ * COuput generated ready to render textures and passes them back to -+ * CDecoder -+ */ -+class COutput : private CThread -+{ -+public: -+ COutput(CEvent *inMsgEvent); -+ virtual ~COutput(); -+ void Start(); -+ void Dispose(); -+ void TransferSurface(uint32_t source); -+ COutputControlProtocol m_controlPort; -+ COutputDataProtocol m_dataPort; -+protected: -+ void OnStartup(); -+ void OnExit(); -+ void Process(); -+ void StateMachine(int signal, Protocol *port, Message *msg); -+ bool HasWork(); -+ bool IsDecodingFinished(); -+ CXvbaRenderPicture* ProcessPicture(); -+ void ProcessReturnPicture(CXvbaRenderPicture *pic); -+ int FindFreeSurface(); -+ void InitCycle(); -+ void FiniCycle(); -+ bool Init(); -+ bool Uninit(); -+ void Flush(); -+ bool CreateGlxContext(); -+ bool DestroyGlxContext(); -+ bool EnsureBufferPool(); -+ void ReleaseBufferPool(); -+ void PreReleaseBufferPool(); -+ CEvent m_outMsgEvent; -+ CEvent *m_inMsgEvent; -+ int m_state; -+ bool m_bStateMachineSelfTrigger; -+ -+ // extended state variables for state machine -+ int m_extTimeout; -+ bool m_xvbaError; -+ CXvbaConfig m_config; -+ XvbaBufferPool m_bufferPool; -+ Display *m_Display; -+ Window m_Window; -+ GLXContext m_glContext; -+ GLXWindow m_glWindow; -+ Pixmap m_pixmap; -+ GLXPixmap m_glPixmap; -+ std::queue m_decodedPics; -+ CXvbaDecodedPicture m_processPicture; -+ XVBA_SURFACE_FLAG m_field; -+ bool m_deinterlacing; -+ int m_deintStep; -+ bool m_deintSkip; -+}; -+ -+//----------------------------------------------------------------------------- -+// XVBA decoder -+//----------------------------------------------------------------------------- -+ -+class CXVBAContext -+{ -+public: -+ static bool EnsureContext(CXVBAContext **ctx); -+ void *GetContext(); -+ void Release(); -+private: -+ CXVBAContext(); -+ void Close(); -+ bool LoadSymbols(); -+ bool CreateContext(); -+ void DestroyContext(); -+ static CXVBAContext *m_context; -+ static CCriticalSection m_section; -+ static Display *m_display; -+ int m_refCount; -+ static void *m_dlHandle; -+ void *m_xvbaContext; -+}; -+ -+class CDecoder : public CDVDVideoCodecFFmpeg::IHardwareDecoder, -+ public IDispResource -+{ -+ friend class CXvbaRenderPicture; -+ -+public: -+ -+ struct pictureAge -+ { -+ int b_age; -+ int ip_age[2]; -+ }; -+ -+ enum EDisplayState -+ { XVBA_OPEN -+ , XVBA_RESET -+ , XVBA_LOST -+ , XVBA_ERROR -+ }; -+ -+ CDecoder(); -+ virtual ~CDecoder(); -+ virtual void OnLostDevice(); -+ virtual void OnResetDevice(); -+ -+ virtual bool Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned int surfaces = 0); -+ virtual int Decode (AVCodecContext* avctx, AVFrame* frame); -+ virtual bool GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture); -+ virtual void Reset(); -+ virtual void Close(); -+ virtual int Check(AVCodecContext* avctx); -+ virtual long Release(); -+ virtual const std::string Name() { return "xvba"; } -+ virtual bool CanSkipDeint(); -+ virtual void SetSpeed(int speed); -+ -+ bool Supports(EINTERLACEMETHOD method); -+ long ReleasePicReference(); -+ -+protected: -+ bool CreateSession(AVCodecContext* avctx); -+ void DestroySession(); -+ bool EnsureDataControlBuffers(unsigned int num); -+ void ResetState(); -+ void SetError(const char* function, const char* msg, int line); -+ bool IsSurfaceValid(xvba_render_state *render); -+ void ReturnRenderPicture(CXvbaRenderPicture *renderPic); -+ -+ // callbacks for ffmpeg -+ static void FFReleaseBuffer(AVCodecContext *avctx, AVFrame *pic); -+ static void FFDrawSlice(struct AVCodecContext *avctx, -+ const AVFrame *src, int offset[4], -+ int y, int type, int height); -+ static int FFGetBuffer(AVCodecContext *avctx, AVFrame *pic); -+ -+ DllAvUtil m_dllAvUtil; -+ CCriticalSection m_decoderSection; -+ CEvent m_displayEvent; -+ EDisplayState m_displayState; -+ CXvbaConfig m_xvbaConfig; -+ std::vector m_videoSurfaces; -+ CCriticalSection m_apiSec, m_videoSurfaceSec; -+ ThreadIdentifier m_decoderThread; -+ -+ unsigned int m_decoderId; -+ struct XVBABufferPool -+ { -+ XVBABufferDescriptor *picture_descriptor_buffer; -+ XVBABufferDescriptor *iq_matrix_buffer; -+ XVBABufferDescriptor *data_buffer; -+ std::vector data_control_buffers; -+ }; -+ XVBABufferPool m_xvbaBufferPool; -+ -+ pictureAge picAge; -+ -+ COutput m_xvbaOutput; -+ CXvbaBufferStats m_bufferStats; -+ CEvent m_inMsgEvent; -+ CXvbaRenderPicture *m_presentPicture; -+ -+ int m_speed; -+ int m_codecControl; -+}; -+ -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-05-14 14:11:52.793931617 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-05-14 14:35:25.789526441 +0200 -@@ -19,7 +19,6 @@ - * - */ - --#include "threads/SystemClock.h" - #include "system.h" - #ifndef __STDC_CONSTANT_MACROS - #define __STDC_CONSTANT_MACROS -@@ -44,6 +43,7 @@ - #include "filesystem/Directory.h" - #include "utils/log.h" - #include "threads/Thread.h" -+#include "threads/SystemClock.h" - #include "utils/TimeUtils.h" - - void CDemuxStreamAudioFFmpeg::GetStreamInfo(std::string& strInfo) -@@ -154,16 +154,12 @@ - ++it; - } - --#ifdef _MSC_VER --static __declspec(thread) CDVDDemuxFFmpeg* g_demuxer = 0; --#else --static TLS g_tls; --#define g_demuxer (*((CDVDDemuxFFmpeg**)g_tls.Get())) --#endif -+static XbmcThreads::ThreadLocal g_demuxer; - - static int interrupt_cb(void* unused) - { -- if(g_demuxer && g_demuxer->Aborted()) -+ CDVDDemuxFFmpeg* demuxer = g_demuxer.get(); -+ if(demuxer && demuxer->Aborted()) - return 1; - return 0; - } -@@ -235,7 +231,7 @@ - std::string strFile; - m_iCurrentPts = DVD_NOPTS_VALUE; - m_speed = DVD_PLAYSPEED_NORMAL; -- g_demuxer = this; -+ g_demuxer.set(this); - m_program = UINT_MAX; - const AVIOInterruptCB int_cb = { interrupt_cb, NULL }; - -@@ -499,7 +495,7 @@ - - void CDVDDemuxFFmpeg::Dispose() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if (m_pFormatContext) - { -@@ -540,7 +536,7 @@ - - void CDVDDemuxFFmpeg::Flush() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - // naughty usage of an internal ffmpeg function - if (m_pFormatContext) -@@ -556,7 +552,7 @@ - - void CDVDDemuxFFmpeg::SetSpeed(int iSpeed) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if(!m_pFormatContext) - return; -@@ -618,7 +614,7 @@ - - DemuxPacket* CDVDDemuxFFmpeg::Read() - { -- g_demuxer = this; -+ g_demuxer.set(this); - - AVPacket pkt; - DemuxPacket* pPacket = NULL; -@@ -810,7 +806,7 @@ - - bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - if(time < 0) - time = 0; -@@ -870,7 +866,7 @@ - - bool CDVDDemuxFFmpeg::SeekByte(__int64 pos) - { -- g_demuxer = this; -+ g_demuxer.set(this); - - CSingleLock lock(m_critSection); - int ret = m_dllAvFormat.av_seek_frame(m_pFormatContext, -1, pos, AVSEEK_FLAG_BYTE); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-05-14 14:15:12.140220588 +0200 -@@ -21,6 +21,7 @@ - - #include "DVDPerformanceCounter.h" - #include "DVDMessageQueue.h" -+#include "utils/TimeUtils.h" - - #include "dvd_config.h" - -@@ -68,22 +69,16 @@ - - inline __int64 get_thread_cpu_usage(ProcessPerformance* p) - { -- if (p->hThread) -+ if (p->thread) - { -- FILETIME dummy; -- FILETIME current_time_thread; -- FILETIME current_time_system; - ULARGE_INTEGER old_time_thread; - ULARGE_INTEGER old_time_system; - - old_time_thread.QuadPart = p->timer_thread.QuadPart; - old_time_system.QuadPart = p->timer_system.QuadPart; - -- GetThreadTimes(p->hThread, &dummy, &dummy, ¤t_time_thread, &dummy); -- GetSystemTimeAsFileTime(¤t_time_system); -- -- FILETIME_TO_ULARGE_INTEGER(p->timer_thread, current_time_thread); -- FILETIME_TO_ULARGE_INTEGER(p->timer_system, current_time_system); -+ p->timer_thread.QuadPart = p->thread->GetAbsoluteUsage(); -+ p->timer_system.QuadPart = CurrentHostCounter(); - - __int64 threadTime = (p->timer_thread.QuadPart - old_time_thread.QuadPart); - __int64 systemTime = (p->timer_system.QuadPart - old_time_system.QuadPart); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-05-14 14:15:12.141220608 +0200 -@@ -24,7 +24,7 @@ - #define FILETIME_TO_ULARGE_INTEGER(ularge, filetime) { ularge.u.HighPart = filetime.dwHighDateTime; ularge.u.LowPart = filetime.dwLowDateTime; } - - #include "system.h" -- -+#include "threads/Thread.h" - #include "threads/SingleLock.h" - - class CDVDMessageQueue; -@@ -33,7 +33,7 @@ - { - ULARGE_INTEGER timer_thread; - ULARGE_INTEGER timer_system; -- HANDLE hThread; -+ CThread* thread; - } ProcessPerformance; - - class CDVDPerformanceCounter -@@ -45,20 +45,20 @@ - bool Initialize(); - void DeInitialize(); - -- void EnableAudioQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pAudioQueue = pQueue; } -- void DisableAudioQueue() { CSingleLock lock(m_critSection); m_pAudioQueue = NULL; } -+ void EnableAudioQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pAudioQueue = pQueue; } -+ void DisableAudioQueue() { CSingleLock lock(m_critSection); m_pAudioQueue = NULL; } - -- void EnableVideoQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pVideoQueue = pQueue; } -- void DisableVideoQueue() { CSingleLock lock(m_critSection); m_pVideoQueue = NULL; } -+ void EnableVideoQueue(CDVDMessageQueue* pQueue) { CSingleLock lock(m_critSection); m_pVideoQueue = pQueue; } -+ void DisableVideoQueue() { CSingleLock lock(m_critSection); m_pVideoQueue = NULL; } - -- void EnableVideoDecodePerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_videoDecodePerformance.hThread = hThread; } -- void DisableVideoDecodePerformance() { CSingleLock lock(m_critSection); m_videoDecodePerformance.hThread = NULL; } -+ void EnableVideoDecodePerformance(CThread *thread) { CSingleLock lock(m_critSection); m_videoDecodePerformance.thread = thread; } -+ void DisableVideoDecodePerformance() { CSingleLock lock(m_critSection); m_videoDecodePerformance.thread = NULL; } - -- void EnableAudioDecodePerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_audioDecodePerformance.hThread = hThread; } -- void DisableAudioDecodePerformance() { CSingleLock lock(m_critSection); m_audioDecodePerformance.hThread = NULL; } -+ void EnableAudioDecodePerformance(CThread *thread) { CSingleLock lock(m_critSection); m_audioDecodePerformance.thread = thread; } -+ void DisableAudioDecodePerformance() { CSingleLock lock(m_critSection); m_audioDecodePerformance.thread = NULL; } - -- void EnableMainPerformance(HANDLE hThread) { CSingleLock lock(m_critSection); m_mainPerformance.hThread = hThread; } -- void DisableMainPerformance() { CSingleLock lock(m_critSection); m_mainPerformance.hThread = NULL; } -+ void EnableMainPerformance(CThread *thread) { CSingleLock lock(m_critSection); m_mainPerformance.thread = thread; } -+ void DisableMainPerformance() { CSingleLock lock(m_critSection); m_mainPerformance.thread = NULL; } - - CDVDMessageQueue* m_pAudioQueue; - CDVDMessageQueue* m_pVideoQueue; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-05-14 14:15:12.142220628 +0200 -@@ -518,7 +518,7 @@ - m_decode.msg = NULL; - m_decode.Release(); - -- g_dvdPerformanceCounter.EnableAudioDecodePerformance(ThreadHandle()); -+ g_dvdPerformanceCounter.EnableAudioDecodePerformance(this); - - #ifdef _WIN32 - CoInitializeEx(NULL, COINIT_MULTITHREADED); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-05-14 14:15:12.145220688 +0200 -@@ -348,7 +348,7 @@ - - // if playing a file close it first - // this has to be changed so we won't have to close it. -- if(ThreadHandle()) -+ if(IsRunning()) - CloseFile(); - - m_bAbortRequest = false; -@@ -366,7 +366,7 @@ - m_ready.Reset(); - - #if defined(HAS_VIDEO_PLAYBACK) -- g_renderManager.PreInit(); -+ g_renderManager.PreInit(&m_clock); - #endif - - Create(); -@@ -440,9 +440,8 @@ - - m_messenger.Init(); - -- g_dvdPerformanceCounter.EnableMainPerformance(ThreadHandle()); -- - CUtil::ClearTempFonts(); -+ g_dvdPerformanceCounter.EnableMainPerformance(this); - } - - bool CDVDPlayer::OpenInputStream() -@@ -1585,7 +1584,7 @@ - - } - else if (m_CurrentVideo.id >= 0 -- && m_CurrentVideo.inited == true -+ && (m_CurrentVideo.inited == true || GetPlaySpeed() < 0) - && m_SpeedState.lastpts != m_dvdPlayerVideo.GetCurrentPts() - && m_SpeedState.lasttime != GetTime()) - { -@@ -2262,6 +2261,11 @@ - if (speed != DVD_PLAYSPEED_PAUSE && m_playSpeed != DVD_PLAYSPEED_PAUSE && speed != m_playSpeed) - m_callback.OnPlayBackSpeedChanged(speed / DVD_PLAYSPEED_NORMAL); - -+ if (m_playSpeed < 0 && speed >= 0) -+ { -+ m_messenger.Put(new CDVDMsgPlayerSeek(GetTime(), true, true, true)); -+ } -+ - // if playspeed is different then DVD_PLAYSPEED_NORMAL or DVD_PLAYSPEED_PAUSE - // audioplayer, stops outputing audio to audiorendere, but still tries to - // sleep an correct amount for each packet -@@ -2278,6 +2282,7 @@ - // until our buffers are somewhat filled - if(m_pDemuxer) - m_pDemuxer->SetSpeed(speed); -+ - } - else if (pMsg->IsType(CDVDMsg::PLAYER_CHANNEL_SELECT_NUMBER) && m_messenger.GetPacketCount(CDVDMsg::PLAYER_CHANNEL_SELECT_NUMBER) == 0) - { -@@ -2897,7 +2902,7 @@ - m_dvdPlayerAudio.SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); - - /* audio normally won't consume full cpu, so let it have prio */ -- m_dvdPlayerAudio.SetPriority(GetThreadPriority(*this)+1); -+ m_dvdPlayerAudio.SetPriority(GetPriority()+1); - - return true; - } -@@ -2962,11 +2967,11 @@ - // the CoreAudio audio device handler thread. We do the same for - // the DVDPlayerVideo thread so it can run to sleep without getting - // swapped out by a busy OS. -- m_dvdPlayerVideo.SetPrioritySched_RR(); -+ m_dvdPlayerVideo.SetPriority(GetSchedRRPriority()); - #else - /* use same priority for video thread as demuxing thread, as */ - /* otherwise demuxer will starve if video consumes the full cpu */ -- m_dvdPlayerVideo.SetPriority(GetThreadPriority(*this)); -+ m_dvdPlayerVideo.SetPriority(GetPriority()); - #endif - return true; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-05-14 14:11:52.795931658 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-05-14 14:38:53.481710398 +0200 -@@ -189,7 +189,7 @@ - return false; - } - -- if(g_guiSettings.GetBool("videoplayer.usedisplayasclock") && g_VideoReferenceClock.ThreadHandle() == NULL) -+ if(g_guiSettings.GetBool("videoplayer.usedisplayasclock") && !g_VideoReferenceClock.IsRunning()) - { - g_VideoReferenceClock.Create(); - //we have to wait for the clock to start otherwise alsa can cause trouble -@@ -247,6 +247,7 @@ - m_stalled = m_messageQueue.GetPacketCount(CDVDMsg::DEMUXER_PACKET) == 0; - m_started = false; - m_codecname = m_pVideoCodec->GetName(); -+ g_renderManager.EnableBuffering(false); - } - - void CDVDPlayerVideo::CloseStream(bool bWaitForBuffers) -@@ -291,7 +292,7 @@ - m_iCurrentPts = DVD_NOPTS_VALUE; - m_FlipTimeStamp = m_pClock->GetAbsoluteClock(); - -- g_dvdPerformanceCounter.EnableVideoDecodePerformance(ThreadHandle()); -+ g_dvdPerformanceCounter.EnableVideoDecodePerformance(this); - } - - void CDVDPlayerVideo::Process() -@@ -311,8 +312,10 @@ - - int iDropped = 0; //frames dropped in a row - bool bRequestDrop = false; -+ int iDropDirective; - - m_videoStats.Start(); -+ m_droppingStats.Reset(); - - while (!m_bStop) - { -@@ -416,6 +419,8 @@ - picture.iFlags &= ~DVP_FLAG_ALLOCATED; - m_packets.clear(); - m_started = false; -+ m_droppingStats.Reset(); -+ g_renderManager.EnableBuffering(false); - } - else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (CDVDPlayerVideo::Flush()) - { -@@ -428,6 +433,8 @@ - //we need to recalculate the framerate - //TODO: this needs to be set on a streamchange instead - ResetFrameRateCalc(); -+ m_droppingStats.Reset(); -+ g_renderManager.EnableBuffering(false); - - m_stalled = true; - m_started = false; -@@ -445,6 +452,10 @@ - m_speed = static_cast(pMsg)->m_value; - if(m_speed == DVD_PLAYSPEED_PAUSE) - m_iNrOfPicturesNotToSkip = 0; -+ m_droppingStats.Reset(); -+// g_renderManager.EnableBuffering(m_speed == DVD_PLAYSPEED_NORMAL); -+ if (m_pVideoCodec) -+ m_pVideoCodec->SetSpeed(m_speed); - } - else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED)) - { -@@ -479,6 +490,29 @@ - m_iNrOfPicturesNotToSkip = 1; - } - -+ bRequestDrop = false; -+ iDropDirective = CalcDropRequirement(pts); -+ if (iDropDirective & EOS_VERYLATE) -+ { -+ if (m_bAllowDrop) -+ { -+ m_pullupCorrection.Flush(); -+ bRequestDrop = true; -+ } -+ } -+ int codecControl = 0; -+ if (iDropDirective & EOS_BUFFER_LEVEL) -+ { -+ if (iDropDirective & EOS_BUFFER_LEVEL) -+ codecControl |= DVP_FLAG_DRAIN; -+ } -+ m_pVideoCodec->SetCodecControl(codecControl); -+ if (iDropDirective & EOS_DROPPED) -+ { -+ m_iDroppedFrames++; -+ iDropped++; -+ } -+ - #ifdef PROFILE - bRequestDrop = false; - #else -@@ -488,6 +522,7 @@ - bRequestDrop = false; - m_iDroppedRequest = 0; - m_iLateFrames = 0; -+ m_droppingStats.m_requestOutputDrop = false; - } - #endif - -@@ -526,7 +561,7 @@ - if(m_pVideoCodec->GetConvergeCount() > 0) - { - m_packets.push_back(DVDMessageListItem(pMsg, 0)); -- if(m_packets.size() > m_pVideoCodec->GetConvergeCount() -+ if(m_packets.size() > m_pVideoCodec->GetConvergeCount() - || m_packets.size() * frametime > DVD_SEC_TO_TIME(10)) - m_packets.pop_front(); - } -@@ -536,11 +571,13 @@ - // picture from a demux packet, this should be reasonable - // for libavformat as a demuxer as it normally packetizes - // pictures when they come from demuxer -- if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) -- { -- m_iDroppedFrames++; -- iDropped++; -- } -+// if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) -+// { -+// m_iDroppedFrames++; -+// iDropped++; -+// } -+ -+ bRequestDrop = false; - - // loop while no error - while (!m_bStop) -@@ -563,6 +600,8 @@ - - m_pVideoCodec->Reset(); - m_packets.clear(); -+ picture.iFlags &= ~DVP_FLAG_ALLOCATED; -+ g_renderManager.DiscardBuffer(); - break; - } - -@@ -672,11 +711,15 @@ - CDVDCodecUtils::FreePicture(pTempYUVPackedPicture); - #endif - -+ if (!m_bFpsInvalid) -+ frametime = (double)DVD_TIME_BASE/m_fFrameRate; -+ - if(m_started == false) - { - m_codecname = m_pVideoCodec->GetName(); - m_started = true; - m_messageParent.Put(new CDVDMsgInt(CDVDMsg::PLAYER_STARTED, DVDPLAYER_VIDEO)); -+ g_renderManager.EnableBuffering(true); - } - - // guess next frame pts. iDuration is always valid -@@ -1039,6 +1082,10 @@ - flags |= CONF_FLAGS_FORMAT_VDPAU; - formatstr = "VDPAU"; - break; -+ case DVDVideoPicture::FMT_VDPAU_420: -+ flags |= CONF_FLAGS_FORMAT_VDPAU_420; -+ formatstr = "VDPAU_420"; -+ break; - case DVDVideoPicture::FMT_DXVA: - flags |= CONF_FLAGS_FORMAT_DXVA; - formatstr = "DXVA"; -@@ -1054,6 +1101,10 @@ - flags |= CONF_FLAGS_FORMAT_CVBREF; - formatstr = "BGRA"; - break; -+ case DVDVideoPicture::FMT_XVBA: -+ flags |= CONF_FLAGS_FORMAT_XVBA; -+ formatstr = "XVBA"; -+ break; - } - - if(m_bAllowFullscreen) -@@ -1162,50 +1213,63 @@ - m_FlipTimeStamp += max(0.0, iSleepTime); - m_FlipTimeStamp += iFrameDuration; - -- if (iSleepTime <= 0 && m_speed) -- m_iLateFrames++; -- else -- m_iLateFrames = 0; -+// if (iSleepTime <= 0 && m_speed) -+// m_iLateFrames++; -+// else -+// m_iLateFrames = 0; -+// -+// // ask decoder to drop frames next round, as we are very late -+// if(m_iLateFrames > 10) -+// { -+// if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+// { -+// //if we're calculating the framerate, -+// //don't drop frames until we've calculated a stable framerate -+// if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) -+// { -+// result |= EOS_VERYLATE; -+// m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it -+// } -+// -+// //if we requested 5 drops in a row and we're still late, drop on output -+// //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate -+// if (m_iDroppedRequest > 5) -+// { -+// m_iDroppedRequest--; //decrease so we only drop half the frames -+// return result | EOS_DROPPED; -+// } -+// m_iDroppedRequest++; -+// } -+// } -+// else -+// { -+// m_iDroppedRequest = 0; -+// } -+ -+ if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+ || (pPicture->iFlags & DVP_FLAG_DROPPED)) -+ { -+ m_droppingStats.AddOutputDropGain(pts, 1/m_fFrameRate); -+ m_droppingStats.m_requestOutputDrop = false; -+ CLog::Log(LOGDEBUG,"%s - dropped in output", __FUNCTION__); -+ return result | EOS_DROPPED; -+ } - -- // ask decoder to drop frames next round, as we are very late -- if(m_iLateFrames > 10) -+ if( m_speed < 0 ) - { -- if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) -+ double decoderPts = m_droppingStats.m_lastDecoderPts; -+ double renderPts = m_droppingStats.m_lastRenderPts; -+ if (pts > renderPts) - { -- //if we're calculating the framerate, -- //don't drop frames until we've calculated a stable framerate -- if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) -+ if (decoderPts >= renderPts) - { -- result |= EOS_VERYLATE; -- m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it -+ Sleep(200); - } -- -- //if we requested 5 drops in a row and we're still late, drop on output -- //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate -- if (m_iDroppedRequest > 5) -- { -- m_iDroppedRequest--; //decrease so we only drop half the frames -- return result | EOS_DROPPED; -- } -- m_iDroppedRequest++; -- } -- } -- else -- { -- m_iDroppedRequest = 0; -- } -- -- if( m_speed < 0 ) -- { -- if( iClockSleep < -DVD_MSEC_TO_TIME(200) -- && !(pPicture->iFlags & DVP_FLAG_NOSKIP) ) - return result | EOS_DROPPED; -+ } - } - -- if( (pPicture->iFlags & DVP_FLAG_DROPPED) ) -- return result | EOS_DROPPED; -- -- if( m_speed != DVD_PLAYSPEED_NORMAL && limited ) -+ if( m_speed != DVD_PLAYSPEED_NORMAL && m_speed >= 0 && limited ) - { - // calculate frame dropping pattern to render at this speed - // we do that by deciding if this or next frame is closest -@@ -1241,6 +1305,16 @@ - mDisplayField = FS_BOT; - } - -+ int buffer = g_renderManager.WaitForBuffer(m_bStop); -+ while (buffer < 0 && !CThread::m_bStop && -+ CDVDClock::GetAbsoluteClock(false) < iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500) ) -+ { -+ Sleep(1); -+ buffer = g_renderManager.WaitForBuffer(m_bStop); -+ } -+ if (buffer < 0) -+ return EOS_DROPPED; -+ - ProcessOverlays(pPicture, pts); - AutoCrop(pPicture); - -@@ -1257,7 +1331,7 @@ - if (index < 0) - return EOS_DROPPED; - -- g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, mDisplayField); -+ g_renderManager.FlipPage(CThread::m_bStop, pts, -1, mDisplayField, m_speed); - - return result; - #else -@@ -1271,7 +1345,8 @@ - if ((pPicture->format == DVDVideoPicture::FMT_YUV420P) || - (pPicture->format == DVDVideoPicture::FMT_NV12) || - (pPicture->format == DVDVideoPicture::FMT_YUY2) || -- (pPicture->format == DVDVideoPicture::FMT_UYVY)) -+ (pPicture->format == DVDVideoPicture::FMT_UYVY) || -+ (pPicture->format == DVDVideoPicture::FMT_VDPAU_420)) - { - RECT crop; - -@@ -1500,7 +1575,7 @@ - double frameduration = m_pullupCorrection.GetFrameDuration(); - - if (frameduration == DVD_NOPTS_VALUE || -- (g_advancedSettings.m_videoFpsDetect == 1 && m_pullupCorrection.GetPatternLength() > 1)) -+ (g_advancedSettings.m_videoFpsDetect == 1 && (m_pullupCorrection.GetPatternLength() > 1 && !m_bFpsInvalid))) - { - //reset the stored framerates if no good framerate was detected - m_fStableFrameRate = 0.0; -@@ -1556,3 +1631,142 @@ - m_iFrameRateCount = 0; - } - } -+ -+int CDVDPlayerVideo::CalcDropRequirement(double pts) -+{ -+ int result = 0; -+ double iSleepTime; -+ double iDecoderPts, iRenderPts; -+ double iInterval; -+ int interlaced; -+ double iGain; -+ double iLateness; -+ bool bNewFrame; -+ int iSkippedDeint = 0; -+ int iBufferLevel; -+ -+ // get decoder stats -+ if (!m_pVideoCodec->GetPts(iDecoderPts, iSkippedDeint, interlaced)) -+ iDecoderPts = pts; -+ -+ // get render stats -+ g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); -+ -+ if (iBufferLevel < 2) -+ { -+ result |= EOS_BUFFER_LEVEL; -+ if (iBufferLevel < 1) -+ CLog::Log(LOGDEBUG,"--------------------- hurry: %d", iBufferLevel); -+ } -+ -+ bNewFrame = iDecoderPts != m_droppingStats.m_lastDecoderPts; -+ -+ if (interlaced) -+ iInterval = 2/m_fFrameRate*(double)DVD_TIME_BASE; -+ else -+ iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; -+ -+ // add any gains regardless of being late -+ if (m_droppingStats.m_lastDecoderPts > 0 -+ && bNewFrame -+ && m_bAllowDrop -+ && m_droppingStats.m_dropRequests > 0) -+ { -+ iGain = (iDecoderPts - m_droppingStats.m_lastDecoderPts - iInterval)/(double)DVD_TIME_BASE; -+ if (iSkippedDeint) -+ { -+ CDroppingStats::CGain gain; -+ gain.gain = 1/m_fFrameRate; -+ gain.pts = iDecoderPts; -+ m_droppingStats.m_gain.push_back(gain); -+ m_droppingStats.m_totalGain += gain.gain; -+ result |= EOS_DROPPED; -+ m_droppingStats.m_dropRequests = 0; -+ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - dropped de-interlacing cycle, Sleeptime: %f, Bufferlevel: %d", iSleepTime, iBufferLevel); -+ } -+ else if (iGain > 1/m_fFrameRate) -+ { -+ CDroppingStats::CGain gain; -+ gain.gain = iGain; -+ gain.pts = iDecoderPts; -+ m_droppingStats.m_gain.push_back(gain); -+ m_droppingStats.m_totalGain += iGain; -+ result |= EOS_DROPPED; -+ m_droppingStats.m_dropRequests = 0; -+ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - dropped in decoder, Sleeptime: %f, Bufferlevel: %d, Gain: %f", iSleepTime, iBufferLevel, iGain); -+ } -+ -+ } -+ m_droppingStats.m_lastDecoderPts = iDecoderPts; -+ -+ // subtract gains -+ while (!m_droppingStats.m_gain.empty() && -+ iRenderPts >= m_droppingStats.m_gain.front().pts) -+ { -+ m_droppingStats.m_totalGain -= m_droppingStats.m_gain.front().gain; -+ m_droppingStats.m_gain.pop_front(); -+ } -+ -+// if (iSleepTime < 0) -+// { -+// CLog::Log(LOGNOTICE,"----- sleep: %f, gain :%f", -+// iSleepTime, m_droppingStats.m_totalGain); -+// } -+ -+ // calculate lateness -+ iLateness = iSleepTime + m_droppingStats.m_totalGain; -+ if (iLateness < 0 && m_speed) -+ { -+ if (bNewFrame) -+ m_droppingStats.m_lateFrames++; -+ -+ // if lateness is smaller than frametime, we observe this state -+ // for 10 cycles -+ if (m_droppingStats.m_lateFrames > 10 || iLateness < -2/m_fFrameRate) -+ { -+ // is frame allowed to skip -+ if (m_iNrOfPicturesNotToSkip <= 0) -+ { -+ result |= EOS_VERYLATE; -+ -+ // drop in output -+ if (m_droppingStats.m_dropRequests > 7 && g_graphicsContext.IsFullScreenVideo()) -+ { -+ m_droppingStats.m_dropRequests--; //decrease so we only drop half the frames -+ m_droppingStats.m_requestOutputDrop = true; -+ CLog::Log(LOGNOTICE,"-------- drop output"); -+ } -+ else if (bNewFrame) -+ m_droppingStats.m_dropRequests++; -+ } -+ } -+ } -+ else -+ { -+ m_droppingStats.m_dropRequests = 0; -+ m_droppingStats.m_lateFrames = 0; -+ m_droppingStats.m_requestOutputDrop = false; -+ } -+ m_droppingStats.m_lastRenderPts = iRenderPts; -+ return result; -+} -+ -+void CDroppingStats::Reset() -+{ -+ m_gain.clear(); -+ m_totalGain = 0; -+ m_lastDecoderPts = 0; -+ m_lastRenderPts = 0; -+ m_lateFrames = 0; -+ m_dropRequests = 0; -+ m_requestOutputDrop = false; -+} -+ -+void CDroppingStats::AddOutputDropGain(double pts, double frametime) -+{ -+ CDroppingStats::CGain gain; -+ gain.gain = frametime; -+ gain.pts = pts; -+ m_gain.push_back(gain); -+ m_totalGain += frametime; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.h xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.h ---- xbmc-pvr-11.0.1/xbmc/cores/dvdplayer/DVDPlayerVideo.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.h 2012-05-14 14:15:12.150220789 +0200 -@@ -38,6 +38,26 @@ - - #define VIDEO_PICTURE_QUEUE_SIZE 1 - -+class CDroppingStats -+{ -+public: -+ void Reset(); -+ void AddOutputDropGain(double pts, double frametime); -+ struct CGain -+ { -+ double gain; -+ double pts; -+ }; -+ std::deque m_gain; -+ double m_totalGain; -+ double m_lastDecoderPts; -+ double m_lastRenderPts; -+ unsigned int m_lateFrames; -+ unsigned int m_dropRequests; -+ bool m_requestOutputDrop; -+}; -+ -+ - class CDVDPlayerVideo : public CThread - { - public: -@@ -111,6 +131,7 @@ - #define EOS_ABORT 1 - #define EOS_DROPPED 2 - #define EOS_VERYLATE 4 -+#define EOS_BUFFER_LEVEL 8 - - void AutoCrop(DVDVideoPicture* pPicture); - void AutoCrop(DVDVideoPicture *pPicture, RECT &crop); -@@ -130,9 +151,11 @@ - int m_iLateFrames; - int m_iDroppedFrames; - int m_iDroppedRequest; -+ double m_iLastSleepTime; - - void ResetFrameRateCalc(); - void CalcFrameRate(); -+ int CalcDropRequirement(double pts); - - double m_fFrameRate; //framerate of the video currently playing - bool m_bCalcFrameRate; //if we should calculate the framerate from the timestamps -@@ -193,5 +216,7 @@ - CPullupCorrection m_pullupCorrection; - - std::list m_packets; -+ -+ CDroppingStats m_droppingStats; - }; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/paplayer/PAPlayer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/paplayer/PAPlayer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/paplayer/PAPlayer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/paplayer/PAPlayer.cpp 2012-05-14 14:15:12.151220809 +0200 -@@ -52,7 +52,7 @@ - // Supporting all open audio codec standards. - // First one being nullsoft's nsv audio decoder format - --PAPlayer::PAPlayer(IPlayerCallback& callback) : IPlayer(callback) -+PAPlayer::PAPlayer(IPlayerCallback& callback) : CThread("PAPlayer"), IPlayer(callback) - { - m_bIsPlaying = false; - m_bPaused = false; -@@ -168,7 +168,7 @@ - - *m_currentFile = file; - -- if (ThreadHandle() == NULL) -+ if (!IsRunning()) - Create(); - - m_startEvent.Set(); -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-05-14 14:15:12.155220890 +0200 -@@ -61,6 +61,9 @@ - VA_MICRO_VERSION == 0 && VA_SDS_VERSION < 5))) - - #endif -+#ifdef HAVE_LIBXVBA -+#include "cores/dvdplayer/DVDCodecs/Video/XVBA.h" -+#endif - - #ifdef HAS_GLX - #include -@@ -121,6 +124,9 @@ - #ifdef HAVE_LIBVDPAU - vdpau = NULL; - #endif -+#ifdef HAVE_LIBXVBA -+ xvba = NULL; -+#endif - } - - CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() -@@ -224,7 +230,7 @@ - - void CLinuxRendererGL::ManageTextures() - { -- m_NumYV12Buffers = 2; -+// m_NumYV12Buffers = NUM_BUFFERS; - //m_iYV12RenderBuffer = 0; - return; - } -@@ -241,6 +247,11 @@ - else - CLog::Log(LOGNOTICE,"Using GL_TEXTURE_2D"); - -+ // function pointer for texture might change in -+ // call to LoadShaders -+ for (int i = 0 ; i < m_NumYV12Buffers ; i++) -+ (this->*m_textureDelete)(i); -+ - // create the yuv textures - LoadShaders(); - -@@ -567,6 +578,18 @@ - - glFinish(); - m_bValidated = false; -+ m_iYV12RenderBuffer = 0; -+} -+ -+void CLinuxRendererGL::ReleaseBuffer(int idx) -+{ -+ YUVBUFFER &buf = m_buffers[idx]; -+#ifdef HAVE_LIBVDPAU -+ SAFE_RELEASE(buf.vdpau); -+#endif -+#ifdef HAVE_LIBXVBA -+ SAFE_RELEASE(buf.xvba); -+#endif - } - - void CLinuxRendererGL::Update(bool bPauseDrawing) -@@ -640,6 +663,18 @@ - - glDisable(GL_POLYGON_STIPPLE); - } -+ else if( CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420 -+ && !(flags & (RENDER_FLAG_TOP | RENDER_FLAG_BOT))) -+ { -+ glDisable(GL_BLEND); -+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); -+ Render(flags | RENDER_FLAG_TOP, index); -+ -+ glEnable(GL_BLEND); -+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -+ glColor4f(1.0f, 1.0f, 1.0f, 128 / 255.0f); -+ Render(flags | RENDER_FLAG_BOT , index); -+ } - else - Render(flags, index); - -@@ -718,11 +753,6 @@ - - m_buffers[m_iYV12RenderBuffer].flipindex = ++m_flipindex; - --#ifdef HAVE_LIBVDPAU -- if((m_renderMethod & RENDER_VDPAU) && m_buffers[m_iYV12RenderBuffer].vdpau) -- m_buffers[m_iYV12RenderBuffer].vdpau->Present(); --#endif -- - return; - } - -@@ -737,7 +767,6 @@ - m_resolution = RES_DESKTOP; - - m_iYV12RenderBuffer = 0; -- m_NumYV12Buffers = 2; - - // setup the background colour - m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff; -@@ -817,7 +846,7 @@ - case VS_SCALINGMETHOD_LINEAR: - SetTextureFilter(m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR); - m_renderQuality = RQ_SINGLEPASS; -- if (((m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) && m_nonLinStretch) -+ if (((m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || (m_renderMethod & RENDER_XVBA)) && m_nonLinStretch) - { - m_pVideoFilterShader = new StretchFilterShader(); - if (!m_pVideoFilterShader->CompileAndLink()) -@@ -898,6 +927,11 @@ - CLog::Log(LOGNOTICE, "GL: Using VAAPI render method"); - m_renderMethod = RENDER_VAAPI; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA) -+ { -+ CLog::Log(LOGNOTICE, "GL: Using XVBA render method"); -+ m_renderMethod = RENDER_XVBA; -+ } - else - { - int requestedMethod = g_guiSettings.GetInt("videoplayer.rendermethod"); -@@ -1026,12 +1060,24 @@ - m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture; - m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420) -+ { -+ m_textureUpload = &CLinuxRendererGL::UploadVDPAUTexture420; -+ m_textureCreate = &CLinuxRendererGL::CreateVDPAUTexture420; -+ m_textureDelete = &CLinuxRendererGL::DeleteVDPAUTexture420; -+ } - else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VAAPI) - { - m_textureUpload = &CLinuxRendererGL::UploadVAAPITexture; - m_textureCreate = &CLinuxRendererGL::CreateVAAPITexture; - m_textureDelete = &CLinuxRendererGL::DeleteVAAPITexture; - } -+ else if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA) -+ { -+ m_textureUpload = &CLinuxRendererGL::UploadXVBATexture; -+ m_textureCreate = &CLinuxRendererGL::CreateXVBATexture; -+ m_textureDelete = &CLinuxRendererGL::DeleteXVBATexture; -+ } - else - { - // setup default YV12 texture handlers -@@ -1132,6 +1178,13 @@ - RenderVAAPI(renderBuffer, m_currentField); - } - #endif -+#ifdef HAVE_LIBXVBA -+ else if (m_renderMethod & RENDER_XVBA) -+ { -+ UpdateVideoFilter(); -+ RenderXVBA(renderBuffer, m_currentField); -+ } -+#endif - else - { - RenderSoftware(renderBuffer, m_currentField); -@@ -1434,17 +1487,12 @@ - void CLinuxRendererGL::RenderVDPAU(int index, int field) - { - #ifdef HAVE_LIBVDPAU -- YUVPLANE &plane = m_buffers[index].fields[field][0]; -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- -- if (!vdpau) -- return; -+ YUVPLANE &plane = m_buffers[index].fields[0][1]; - - glEnable(m_textureTarget); - glActiveTextureARB(GL_TEXTURE0); -- glBindTexture(m_textureTarget, plane.id); - -- vdpau->BindPixmap(); -+ glBindTexture(m_textureTarget, plane.id); - - // Try some clamping or wrapping - glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -@@ -1502,8 +1550,6 @@ - if (m_pVideoFilterShader) - m_pVideoFilterShader->Disable(); - -- vdpau->ReleasePixmap(); -- - glBindTexture (m_textureTarget, 0); - glDisable(m_textureTarget); - #endif -@@ -1598,6 +1644,77 @@ - #endif - } - -+void CLinuxRendererGL::RenderXVBA(int index, int field) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[0][1]; -+ -+ glEnable(m_textureTarget); -+ glActiveTextureARB(GL_TEXTURE0); -+ -+ glBindTexture(m_textureTarget, plane.id); -+ -+ // Try some clamping or wrapping -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ -+ if (m_pVideoFilterShader) -+ { -+ GLint filter; -+ if (!m_pVideoFilterShader->GetTextureFilter(filter)) -+ filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR; -+ -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, filter); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, filter); -+ m_pVideoFilterShader->SetSourceTexture(0); -+ m_pVideoFilterShader->SetWidth(m_sourceWidth); -+ m_pVideoFilterShader->SetHeight(m_sourceHeight); -+ -+ //disable non-linear stretch when a dvd menu is shown, parts of the menu are rendered through the overlay renderer -+ //having non-linear stretch on breaks the alignment -+ if (g_application.m_pPlayer && g_application.m_pPlayer->IsInMenu()) -+ m_pVideoFilterShader->SetNonLinStretch(1.0); -+ else -+ m_pVideoFilterShader->SetNonLinStretch(pow(g_settings.m_fPixelRatio, g_advancedSettings.m_videoNonLinStretchRatio)); -+ -+ m_pVideoFilterShader->Enable(); -+ } -+ else -+ { -+ GLint filter = m_scalingMethod == VS_SCALINGMETHOD_NEAREST ? GL_NEAREST : GL_LINEAR; -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, filter); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, filter); -+ } -+ -+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); -+ VerifyGLState(); -+ -+ glBegin(GL_QUADS); -+ if (m_textureTarget==GL_TEXTURE_2D) -+ { -+ glTexCoord2f(plane.rect.x1, plane.rect.y1); glVertex2f(m_destRect.x1, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y1); glVertex2f(m_destRect.x2, m_destRect.y1); -+ glTexCoord2f(plane.rect.x2, plane.rect.y2); glVertex2f(m_destRect.x2, m_destRect.y2); -+ glTexCoord2f(plane.rect.x1, plane.rect.y2); glVertex2f(m_destRect.x1, m_destRect.y2); -+ } -+ else -+ { -+ glTexCoord2f(m_destRect.x1, m_destRect.y1); glVertex4f(m_destRect.x1, m_destRect.y1, 0.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y1); glVertex4f(m_destRect.x2, m_destRect.y1, 1.0f, 0.0f); -+ glTexCoord2f(m_destRect.x2, m_destRect.y2); glVertex4f(m_destRect.x2, m_destRect.y2, 1.0f, 1.0f); -+ glTexCoord2f(m_destRect.x1, m_destRect.y2); glVertex4f(m_destRect.x1, m_destRect.y2, 0.0f, 1.0f); -+ } -+ glEnd(); -+ VerifyGLState(); -+ -+ if (m_pVideoFilterShader) -+ m_pVideoFilterShader->Disable(); -+ -+ glBindTexture (m_textureTarget, 0); -+ glDisable(m_textureTarget); -+#endif -+} -+ - void CLinuxRendererGL::RenderSoftware(int index, int field) - { - YUVPLANES &planes = m_buffers[index].fields[field]; -@@ -2162,12 +2279,14 @@ - { - #ifdef HAVE_LIBVDPAU - YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; - - SAFE_RELEASE(m_buffers[index].vdpau); - - if(plane.id && glIsTexture(plane.id)) - glDeleteTextures(1, &plane.id); - plane.id = 0; -+ fields[0][1].id = 0; - #endif - } - -@@ -2201,8 +2320,156 @@ - void CLinuxRendererGL::UploadVDPAUTexture(int index) - { - #ifdef HAVE_LIBVDPAU -+ VDPAU::CVdpauRenderPicture *vdpau = m_buffers[index].vdpau; -+ -+ unsigned int flipindex = m_buffers[index].flipindex; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ if (!vdpau) -+ { -+ fields[0][1].id = plane.id; -+ m_eventTexturesDone[index]->Set(); -+ CLog::Log(LOGWARNING,"--------- no vdpau texture, index: %d", index); -+ return; -+ } -+ -+// CLog::Log(LOGNOTICE,"-------- rendered output surf: %d", vdpau->sourceIdx); -+// CLog::Log(LOGNOTICE,"-------- pts: %f", vdpau->DVDPic.pts); -+ fields[0][1].id = vdpau->texture[0]; -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+} -+ -+void CLinuxRendererGL::DeleteVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ -+ SAFE_RELEASE(m_buffers[index].vdpau); -+ -+ if(plane.id && glIsTexture(plane.id)) -+ glDeleteTextures(1, &plane.id); -+ plane.id = 0; -+ fields[1][0].id = 0; -+ fields[1][1].id = 0; -+ fields[2][0].id = 0; -+ fields[2][1].id = 0; -+ -+#endif -+} -+ -+bool CLinuxRendererGL::CreateVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ YV12Image &im = m_buffers[index].image; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ GLuint *pbo = m_buffers[index].pbo; -+ -+ DeleteVDPAUTexture420(index); -+ -+ memset(&im , 0, sizeof(im)); -+ memset(&fields, 0, sizeof(fields)); -+ -+ im.cshift_x = 1; -+ im.cshift_y = 1; -+ -+ im.plane[0] = NULL; -+ im.plane[1] = NULL; -+ im.plane[2] = NULL; -+ -+ for(int p = 0;p<3;p++) -+ { -+ pbo[p] = None; -+ } -+ -+ glEnable(m_textureTarget); -+ glGenTextures(1, &plane.id); -+ glDisable(m_textureTarget); -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadVDPAUTexture420(int index) -+{ -+#ifdef HAVE_LIBVDPAU -+ VDPAU::CVdpauRenderPicture *vdpau = m_buffers[index].vdpau; -+ YV12Image &im = m_buffers[index].image; -+ -+ unsigned int flipindex = m_buffers[index].flipindex; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ if (!vdpau) -+ { -+ fields[1][0].id = plane.id; -+ fields[1][1].id = plane.id; -+ fields[2][0].id = plane.id; -+ fields[2][1].id = plane.id; -+ m_eventTexturesDone[index]->Set(); -+ return; -+ } -+ -+ im.height = vdpau->texHeight; -+ im.width = vdpau->texWidth; -+ -+ // YUV -+ for (int f = FIELD_FULL; f<=FIELD_BOT ; f++) -+ { -+ int fieldshift = (f==FIELD_FULL) ? 0 : 1; -+ YUVPLANES &planes = fields[f]; -+ -+ planes[0].texwidth = im.width; -+ planes[0].texheight = im.height >> fieldshift; -+ -+ planes[1].texwidth = planes[0].texwidth >> im.cshift_x; -+ planes[1].texheight = planes[0].texheight >> im.cshift_y; -+ planes[2].texwidth = planes[1].texwidth; -+ planes[2].texheight = planes[1].texheight; -+ -+ for (int p = 0; p < 3; p++) -+ { -+ planes[p].pixpertex_x = 1; -+ planes[p].pixpertex_y = 1; -+ } -+ } -+ // crop -+// m_sourceRect.x1 += vdpau->crop.x1; -+// m_sourceRect.x2 -= vdpau->crop.x2; -+// m_sourceRect.y1 += vdpau->crop.y1; -+// m_sourceRect.y2 -= vdpau->crop.y2; -+ -+ // set textures -+ fields[1][0].id = vdpau->texture[0]; -+ fields[1][1].id = vdpau->texture[2]; -+ fields[2][0].id = vdpau->texture[1]; -+ fields[2][1].id = vdpau->texture[3]; -+ -+ glEnable(m_textureTarget); -+ for (int f = 1; f < 3; f++) -+ { -+ for (int p=0;p<2;p++) -+ { -+ glBindTexture(m_textureTarget,fields[f][p].id); -+ 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); -+ -+ glBindTexture(m_textureTarget,0); -+ VerifyGLState(); -+ } -+ fields[f][2].id = fields[f][1].id; -+ } -+ CalculateTextureSourceRects(index, 3); -+ glDisable(m_textureTarget); -+ - m_eventTexturesDone[index]->Set(); -- glPixelStorei(GL_UNPACK_ALIGNMENT,1); //what's this for? - #endif - } - -@@ -2352,6 +2619,93 @@ - #endif - } - -+void CLinuxRendererGL::DeleteXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[0][0]; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ -+ SAFE_RELEASE(m_buffers[index].xvba); -+ -+ if(plane.id && glIsTexture(plane.id)) -+ glDeleteTextures(1, &plane.id); -+ plane.id = 0; -+ fields[0][1].id = 0; -+#endif -+} -+ -+bool CLinuxRendererGL::CreateXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YV12Image &im = m_buffers[index].image; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][0]; -+ -+ DeleteXVBATexture(index); -+ -+ memset(&im , 0, sizeof(im)); -+ memset(&fields, 0, sizeof(fields)); -+ -+ glGenTextures(1, &plane.id); -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba = m_buffers[index].xvba; -+ YV12Image &im = m_buffers[index].image; -+ -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &plane = fields[0][1]; -+ -+ if (!xvba) -+ { -+ fields[0][1].id = fields[0][0].id; -+ m_eventTexturesDone[index]->Set(); -+ CLog::Log(LOGWARNING,"CLinuxRendererGL::UploadXVBATexture no xvba texture, index: %d", index); -+ return; -+ } -+// xvba->Transfer(); -+ -+ fields[0][1].id = xvba->texture; -+ -+ im.height = xvba->texHeight; -+ im.width = xvba->texWidth; -+ -+ plane.texwidth = xvba->texWidth; -+ plane.texheight = xvba->texHeight; -+ plane.pixpertex_x = 1; -+ plane.pixpertex_y = 1; -+ -+ plane.rect = m_sourceRect; -+ plane.width = im.width; -+ plane.height = im.height; -+ -+ plane.height /= plane.pixpertex_y; -+ plane.rect.y1 /= plane.pixpertex_y; -+ plane.rect.y2 /= plane.pixpertex_y; -+ plane.width /= plane.pixpertex_x; -+ plane.rect.x1 /= plane.pixpertex_x; -+ plane.rect.x2 /= plane.pixpertex_x; -+ -+ if (m_textureTarget == GL_TEXTURE_2D) -+ { -+ plane.height /= plane.texheight; -+ plane.rect.y1 /= plane.texheight; -+ plane.rect.y2 /= plane.texheight; -+ plane.width /= plane.texwidth; -+ plane.rect.x1 /= plane.texwidth; -+ plane.rect.x2 /= plane.texwidth; -+ } -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+} -+ - void CLinuxRendererGL::UploadYUV422PackedTexture(int source) - { - YUVBUFFER& buf = m_buffers[source]; -@@ -2935,6 +3289,9 @@ - if (m_renderMethod & RENDER_VAAPI) - return false; - -+ if (m_renderMethod & RENDER_XVBA) -+ return false; -+ - return (m_renderMethod & RENDER_GLSL) - || (m_renderMethod & RENDER_ARB) - || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -2948,6 +3305,9 @@ - if (m_renderMethod & RENDER_VAAPI) - return false; - -+ if (m_renderMethod & RENDER_XVBA) -+ return false; -+ - return (m_renderMethod & RENDER_GLSL) - || (m_renderMethod & RENDER_ARB) - || ((m_renderMethod & RENDER_SW) && glewIsSupported("GL_ARB_imaging") == GL_TRUE); -@@ -2971,7 +3331,8 @@ - if (feature == RENDERFEATURE_NONLINSTRETCH) - { - if (((m_renderMethod & RENDER_GLSL) && !(m_renderMethod & RENDER_POT)) || -- (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) -+ (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || -+ (m_renderMethod & RENDER_XVBA)) - return true; - } - -@@ -2998,12 +3359,13 @@ - if(method == VS_INTERLACEMETHOD_AUTO) - return true; - -- if(m_renderMethod & RENDER_VDPAU) -+ if(m_renderMethod & RENDER_VDPAU || -+ CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_VDPAU_420) - { - #ifdef HAVE_LIBVDPAU -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- if(vdpau) -- return vdpau->Supports(method); -+ VDPAU::CVdpauRenderPicture *vdpauPic = m_buffers[m_iYV12RenderBuffer].vdpau; -+ if(vdpauPic && vdpauPic->vdpau) -+ return vdpauPic->vdpau->Supports(method); - #endif - return false; - } -@@ -3027,6 +3389,16 @@ - return false; - } - -+ if(m_renderMethod & RENDER_XVBA) -+ { -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba = m_buffers[m_iYV12RenderBuffer].xvba; -+ if(xvba) -+ return xvba->xvba->Supports(method); -+#endif -+ return false; -+ } -+ - #ifdef TARGET_DARWIN - // YADIF too slow for HD but we have no methods to fall back - // to something that works so just turn it off. -@@ -3069,7 +3441,7 @@ - || method == VS_SCALINGMETHOD_LANCZOS3) - { - if ((glewIsSupported("GL_EXT_framebuffer_object") && (m_renderMethod & RENDER_GLSL)) || -- (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI)) -+ (m_renderMethod & RENDER_VDPAU) || (m_renderMethod & RENDER_VAAPI) || (m_renderMethod & RENDER_XVBA)) - { - // spline36 and lanczos3 are only allowed through advancedsettings.xml - if(method != VS_SCALINGMETHOD_SPLINE36 -@@ -3088,9 +3460,9 @@ - if(m_renderMethod & RENDER_VDPAU) - { - #ifdef HAVE_LIBVDPAU -- CVDPAU *vdpau = m_buffers[m_iYV12RenderBuffer].vdpau; -- if(vdpau) -- return vdpau->AutoInterlaceMethod(); -+ VDPAU::CVdpauRenderPicture *vdpauPic = m_buffers[m_iYV12RenderBuffer].vdpau; -+ if(vdpauPic && vdpauPic->vdpau) -+ return vdpauPic->vdpau->AutoInterlaceMethod(); - #endif - return VS_INTERLACEMETHOD_NONE; - } -@@ -3136,20 +3508,31 @@ - } - - #ifdef HAVE_LIBVDPAU --void CLinuxRendererGL::AddProcessor(CVDPAU* vdpau) -+void CLinuxRendererGL::AddProcessor(VDPAU::CVdpauRenderPicture *vdpau, int index) - { -- YUVBUFFER &buf = m_buffers[NextYV12Texture()]; -+ YUVBUFFER &buf = m_buffers[index]; -+ VDPAU::CVdpauRenderPicture *pic = vdpau->Acquire(); - SAFE_RELEASE(buf.vdpau); -- buf.vdpau = (CVDPAU*)vdpau->Acquire(); -+ buf.vdpau = pic; - } - #endif - - #ifdef HAVE_LIBVA --void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder) -+void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder, int index) - { -- YUVBUFFER &buf = m_buffers[NextYV12Texture()]; -+ YUVBUFFER &buf = m_buffers[index]; - buf.vaapi.surface = holder.surface; - } - #endif - -+#ifdef HAVE_LIBXVBA -+void CLinuxRendererGL::AddProcessor(XVBA::CXvbaRenderPicture* xvba, int index) -+{ -+ YUVBUFFER &buf = m_buffers[index]; -+ XVBA::CXvbaRenderPicture *pic = xvba->Acquire(); -+ SAFE_RELEASE(buf.xvba); -+ buf.xvba = pic; -+} -+#endif -+ - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-05-14 14:15:12.156220910 +0200 -@@ -35,13 +35,14 @@ - - class CRenderCapture; - --class CVDPAU; - class CBaseTexture; - namespace Shaders { class BaseYUV2RGBShader; } - namespace Shaders { class BaseVideoFilterShader; } - namespace VAAPI { struct CHolder; } -+namespace VDPAU { class CVdpauRenderPicture; } -+namespace XVBA { class CXvbaRenderPicture; } - --#define NUM_BUFFERS 3 -+#define NUM_BUFFERS 10 - - - #undef ALIGN -@@ -94,6 +95,7 @@ - RENDER_VDPAU=0x08, - RENDER_POT=0x10, - RENDER_VAAPI=0x20, -+ RENDER_XVBA=0x40, - }; - - enum RenderQuality -@@ -141,14 +143,19 @@ - virtual void UnInit(); - virtual void Reset(); /* resets renderer after seek for example */ - virtual void Flush(); -+ virtual void ReleaseBuffer(int idx); -+ virtual void SetProcessorSize(int numBuffers) { m_NumYV12Buffers = numBuffers; } -+ virtual unsigned int GetProcessorSize() { return m_NumYV12Buffers; } - - #ifdef HAVE_LIBVDPAU -- virtual void AddProcessor(CVDPAU* vdpau); -+ virtual void AddProcessor(VDPAU::CVdpauRenderPicture* vdpau, int index); - #endif - #ifdef HAVE_LIBVA -- virtual void AddProcessor(VAAPI::CHolder& holder); -+ virtual void AddProcessor(VAAPI::CHolder& holder, int index); -+#endif -+#ifdef HAVE_LIBXVBA -+ virtual void AddProcessor(XVBA::CXvbaRenderPicture* xvba, int index); - #endif -- - virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255); - - // Feature support -@@ -190,6 +197,10 @@ - void DeleteVDPAUTexture(int index); - bool CreateVDPAUTexture(int index); - -+ void UploadVDPAUTexture420(int index); -+ void DeleteVDPAUTexture420(int index); -+ bool CreateVDPAUTexture420(int index); -+ - void UploadVAAPITexture(int index); - void DeleteVAAPITexture(int index); - bool CreateVAAPITexture(int index); -@@ -198,6 +209,10 @@ - void DeleteYUV422PackedTexture(int index); - bool CreateYUV422PackedTexture(int index); - -+ void UploadXVBATexture(int index); -+ void DeleteXVBATexture(int index); -+ bool CreateXVBATexture(int index); -+ - void UploadRGBTexture(int index); - void ToRGBFrame(YV12Image* im, unsigned flipIndexPlane, unsigned flipIndexBuf); - void ToRGBFields(YV12Image* im, unsigned flipIndexPlaneTop, unsigned flipIndexPlaneBot, unsigned flipIndexBuf); -@@ -210,7 +225,9 @@ - void RenderSinglePass(int renderBuffer, int field); // single pass glsl renderer - void RenderSoftware(int renderBuffer, int field); // single pass s/w yuv2rgb renderer - void RenderVDPAU(int renderBuffer, int field); // render using vdpau hardware -+ void RenderVDPAUYV12(int renderBuffer, int field); // render using vdpau hardware - void RenderVAAPI(int renderBuffer, int field); // render using vdpau hardware -+ void RenderXVBA(int renderBuffer, int field); // render using xvba hardware - - CFrameBufferObject m_fbo; - -@@ -265,11 +282,14 @@ - GLuint pbo[MAX_PLANES]; - - #ifdef HAVE_LIBVDPAU -- CVDPAU* vdpau; -+ VDPAU::CVdpauRenderPicture *vdpau; - #endif - #ifdef HAVE_LIBVA - VAAPI::CHolder& vaapi; - #endif -+#ifdef HAVE_LIBXVBA -+ XVBA::CXvbaRenderPicture *xvba; -+#endif - }; - - typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.cpp 2012-05-14 14:15:12.157220930 +0200 -@@ -89,7 +89,7 @@ - CRenderer::CRenderer() - { - m_render = 0; -- m_decode = (m_render + 1) % 2; -+// m_decode = (m_render + 1) % 2; - } - - CRenderer::~CRenderer() -@@ -154,9 +154,10 @@ - { - CSingleLock lock(m_section); - -- for(int i = 0; i < 2; i++) -+ for(int i = 0; i < m_iNumBuffers; i++) - Release(m_buffers[i]); - -+ m_render = 0; - Release(m_cleanup); - } - -@@ -164,10 +165,23 @@ - { - CSingleLock lock(m_section); - -- m_render = m_decode; -- m_decode =(m_decode + 1) % 2; -+// m_render = m_decode; -+ m_render = (m_render + 1) % m_iNumBuffers; -+ -+// Release(m_buffers[m_decode]); -+} -+ -+void CRenderer::SetBuffer(int idx) -+{ -+ CSingleLock lock(m_section); -+ Release(m_buffers[idx]); -+ m_decode = idx; -+} - -- Release(m_buffers[m_decode]); -+void CRenderer::ReleaseBuffer(int idx) -+{ -+ CSingleLock lock(m_section); -+ Release(m_buffers[idx]); - } - - void CRenderer::Render() -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/OverlayRenderer.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/OverlayRenderer.h 2012-05-14 14:15:12.157220930 +0200 -@@ -99,6 +99,9 @@ - void Flip(); - void Render(); - void Flush(); -+ void SetNumBuffers(int numBuffers) { m_iNumBuffers = numBuffers; } -+ void SetBuffer(int idx); -+ void ReleaseBuffer(int idx); - - protected: - -@@ -124,7 +127,8 @@ - void Release(SElementV& list); - - CCriticalSection m_section; -- SElementV m_buffers[2]; -+ SElementV m_buffers[10]; -+ int m_iNumBuffers; - int m_decode; - int m_render; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderFlags.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderFlags.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderFlags.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderFlags.h 2012-05-14 14:15:12.158220950 +0200 -@@ -76,8 +76,10 @@ - #define CONF_FLAGS_FORMAT_YUY2 0x008000 - #define CONF_FLAGS_FORMAT_DXVA 0x010000 - #define CONF_FLAGS_FORMAT_VDPAU 0x020000 -+#define CONF_FLAGS_FORMAT_VDPAU_420 0x22000 - #define CONF_FLAGS_FORMAT_VAAPI 0x030000 - #define CONF_FLAGS_FORMAT_OMXEGL 0x040000 - #define CONF_FLAGS_FORMAT_CVBREF 0x080000 - #define CONF_FLAGS_FORMAT_BYPASS 0x100000 -+#define CONF_FLAGS_FORMAT_XVBA 0x200000 - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-05-14 14:15:12.160220990 +0200 -@@ -26,6 +26,7 @@ - #include "utils/MathUtils.h" - #include "threads/SingleLock.h" - #include "utils/log.h" -+#include "utils/TimeUtils.h" - - #include "Application.h" - #include "settings/Settings.h" -@@ -53,6 +54,8 @@ - #include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" - #include "../dvdplayer/DVDCodecs/DVDCodecUtils.h" - -+#include "windowing/WindowingFactory.h" -+ - #define MAXPRESENTDELAY 0.500 - - /* at any point we want an exclusive lock on rendermanager */ -@@ -246,6 +249,7 @@ - m_bReconfigured = true; - m_presentstep = PRESENT_IDLE; - m_presentevent.Set(); -+// ResetRenderBuffer(); - } - - return result; -@@ -277,8 +281,12 @@ - if (!m_pRenderer) - return; - -+ if (m_presentstep == PRESENT_IDLE) -+ PrepareNextRender(); -+ - if(m_presentstep == PRESENT_FLIP) - { -+ FlipRenderBuffer(); - m_overlays.Flip(); - m_pRenderer->FlipPage(m_presentsource); - m_presentstep = PRESENT_FRAME; -@@ -286,6 +294,8 @@ - } - } - -+// CLog::Log(LOGNOTICE,"------ current: %d", m_iCurrentRenderBuffer); -+ - if (g_advancedSettings.m_videoDisableBackgroundDeinterlace) - { - CSharedLock lock(m_sharedSection); -@@ -297,7 +307,7 @@ - m_presentevent.Set(); - } - --unsigned int CXBMCRenderManager::PreInit() -+unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) - { - CRetakeLock lock(m_sharedSection); - -@@ -305,6 +315,7 @@ - m_presenterr = 0.0; - m_errorindex = 0; - memset(m_errorbuff, 0, sizeof(m_errorbuff)); -+ m_pClock = pClock; - - m_bIsStarted = false; - m_bPauseDrawing = false; -@@ -323,6 +334,17 @@ - - UpdateDisplayLatency(); - -+ m_swapCount = 1; -+// std::string Vendor = g_Windowing.GetRenderVendor(); -+// std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); -+// if (Vendor.compare(0, 3, "ati") == 0) -+// { -+// m_swapCount = 2; -+// } -+ ResetRenderBuffer(); -+ m_bUseBuffering = false; -+ m_overlays.SetNumBuffers(m_iNumRenderBuffers); -+ m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); - return m_pRenderer->PreInit(); - } - -@@ -351,7 +373,9 @@ - - CRetakeLock lock(m_sharedSection); - m_pRenderer->Flush(); -+ m_overlays.Flush(); - m_flushEvent.Set(); -+ ResetRenderBuffer(); - } - else - { -@@ -512,25 +536,21 @@ - m_captures.erase(it); - } - --void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/) -+void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/, int speed /*= 0*/) - { -- if(timestamp - GetPresentTime() > MAXPRESENTDELAY) -- timestamp = GetPresentTime() + MAXPRESENTDELAY; -- -- /* 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_bUseBuffering) - { -- 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; -@@ -538,58 +558,67 @@ - { CRetakeLock lock(m_sharedSection); - if(!m_pRenderer) return; - -- m_presenttime = timestamp; -- m_presentfield = sync; -- m_presentstep = PRESENT_FLIP; -- m_presentsource = source; -+ double presenttime = timestamp; -+ EFIELDSYNC presentfield = sync; -+ EPRESENTMETHOD presentmethod; -+ - EDEINTERLACEMODE deinterlacemode = g_settings.m_currentVideoSettings.m_DeinterlaceMode; - EINTERLACEMETHOD interlacemethod = AutoInterlaceMethodInternal(g_settings.m_currentVideoSettings.m_InterlaceMethod); - - bool invert = false; - - if (deinterlacemode == VS_DEINTERLACEMODE_OFF) -- m_presentmethod = PRESENT_METHOD_SINGLE; -+ presentmethod = PRESENT_METHOD_SINGLE; - else - { -- if (deinterlacemode == VS_DEINTERLACEMODE_AUTO && m_presentfield == FS_NONE) -- m_presentmethod = PRESENT_METHOD_SINGLE; -+ if (deinterlacemode == VS_DEINTERLACEMODE_AUTO && presentfield == FS_NONE) -+ presentmethod = PRESENT_METHOD_SINGLE; - else - { -- if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BLEND) m_presentmethod = PRESENT_METHOD_BLEND; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE) m_presentmethod = PRESENT_METHOD_WEAVE; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED) { m_presentmethod = PRESENT_METHOD_WEAVE ; invert = true; } -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB) m_presentmethod = PRESENT_METHOD_BOB; -- else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) { m_presentmethod = PRESENT_METHOD_BOB; invert = true; } -- else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BOB) m_presentmethod = PRESENT_METHOD_BOB; -- else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BEST) m_presentmethod = PRESENT_METHOD_BOB; -- else m_presentmethod = PRESENT_METHOD_SINGLE; -+ if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BLEND) presentmethod = PRESENT_METHOD_BLEND; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE) presentmethod = PRESENT_METHOD_WEAVE; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED) { presentmethod = PRESENT_METHOD_WEAVE ; invert = true; } -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB) presentmethod = PRESENT_METHOD_BOB; -+ else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) { presentmethod = PRESENT_METHOD_BOB; invert = true; } -+ else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BOB) presentmethod = PRESENT_METHOD_BOB; -+ else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BEST) presentmethod = PRESENT_METHOD_BOB; -+ else presentmethod = PRESENT_METHOD_SINGLE; - - /* default to odd field if we want to deinterlace and don't know better */ -- if (deinterlacemode == VS_DEINTERLACEMODE_FORCE && m_presentfield == FS_NONE) -- m_presentfield = FS_TOP; -+ if (deinterlacemode == VS_DEINTERLACEMODE_FORCE && presentfield == FS_NONE) -+ presentfield = FS_TOP; - - /* invert present field */ - if(invert) - { -- if( m_presentfield == FS_BOT ) -- m_presentfield = FS_TOP; -+ if( presentfield == FS_BOT ) -+ presentfield = FS_TOP; - else -- m_presentfield = FS_BOT; -+ presentfield = FS_BOT; - } - } - } - -+ FlipFreeBuffer(); -+ m_renderBuffers[m_iOutputRenderBuffer].pts = timestamp; -+ m_renderBuffers[m_iOutputRenderBuffer].presentfield = presentfield; -+ m_renderBuffers[m_iOutputRenderBuffer].presentmethod = presentmethod; -+ m_speed = speed; - } - - g_application.NewFrame(); -- /* wait untill render thread have flipped buffers */ -- timeout = m_presenttime + 1.0; -- while(m_presentstep == PRESENT_FLIP && !bStop) -+ -+ if (!m_bUseBuffering) - { -- 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; -+ } - } - } - } -@@ -631,8 +660,12 @@ - if (!m_pRenderer) - return; - -+ if (m_presentstep == PRESENT_IDLE) -+ PrepareNextRender(); -+ - if(m_presentstep == PRESENT_FLIP) - { -+ FlipRenderBuffer(); - m_overlays.Flip(); - m_pRenderer->FlipPage(m_presentsource); - m_presentstep = PRESENT_FRAME; -@@ -647,6 +680,8 @@ - WaitPresentTime(m_presenttime); - - m_presentevent.Set(); -+ -+ m_rendertime = CurrentHostCounter(); - } - - /* simple present method */ -@@ -753,7 +788,7 @@ - return 1; - - YV12Image image; -- int index = m_pRenderer->GetImage(&image); -+ int index = m_pRenderer->GetImage(&image, (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); - - if(index < 0) - return index; -@@ -776,8 +811,9 @@ - CDVDCodecUtils::CopyDXVA2Picture(&image, &pic); - } - #ifdef HAVE_LIBVDPAU -- else if(pic.format == DVDVideoPicture::FMT_VDPAU) -- m_pRenderer->AddProcessor(pic.vdpau); -+ else if(pic.format == DVDVideoPicture::FMT_VDPAU -+ || pic.format == DVDVideoPicture::FMT_VDPAU_420) -+ m_pRenderer->AddProcessor(pic.vdpau, index); - #endif - #ifdef HAVE_LIBOPENMAX - else if(pic.format == DVDVideoPicture::FMT_OMXEGL) -@@ -789,7 +825,11 @@ - #endif - #ifdef HAVE_LIBVA - else if(pic.format == DVDVideoPicture::FMT_VAAPI) -- m_pRenderer->AddProcessor(*pic.vaapi); -+ m_pRenderer->AddProcessor(*pic.vaapi, index); -+#endif -+#ifdef HAVE_LIBXVBA -+ else if(pic.format == DVDVideoPicture::FMT_XVBA) -+ m_pRenderer->AddProcessor(pic.xvba, index); - #endif - m_pRenderer->ReleaseImage(index, false); - -@@ -809,3 +849,212 @@ - - return mInt; - } -+ -+int CXBMCRenderManager::WaitForBuffer(volatile bool& bStop) -+{ -+ CSharedLock lock(m_sharedSection); -+ if (!m_pRenderer) -+ return -1; -+ -+ //wait up to a second as this is our slowest allowed output rate -+ double timeout = GetPresentTime() + 0.1; -+ while(!HasFreeBuffer() && !bStop) -+ { -+ lock.Leave(); -+ m_flipEvent.WaitMSec(50); -+ if(GetPresentTime() > timeout && !bStop) -+ { -+ CLog::Log(LOGWARNING, "CRenderManager::WaitForBuffer - timeout waiting for buffer"); -+ return -1; -+ } -+ lock.Enter(); -+ } -+ lock.Leave(); -+ -+ { CRetakeLock lock(m_sharedSection); -+ m_overlays.SetBuffer((m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); -+ } -+ -+ if (bStop) -+ return -1; -+ -+ return 1; -+} -+ -+int CXBMCRenderManager::GetNextRenderBufferIndex() -+{ -+ if (m_iOutputRenderBuffer == m_iCurrentRenderBuffer) -+ return -1; -+ return (m_iCurrentRenderBuffer + 1) % m_iNumRenderBuffers; -+} -+ -+void CXBMCRenderManager::FlipRenderBuffer() -+{ -+ m_iCurrentRenderBuffer = GetNextRenderBufferIndex(); -+// CLog::Log(LOGNOTICE,"-------- flip render: %d", m_iCurrentRenderBuffer); -+} -+ -+int CXBMCRenderManager::FlipFreeBuffer() -+{ -+ // See "Render Buffer State Description" in header for information. -+ if (HasFreeBuffer()) -+ { -+ m_bAllRenderBuffersDisplayed = false; -+ m_iOutputRenderBuffer = (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers; -+ return m_iOutputRenderBuffer; -+ } -+} -+ -+bool CXBMCRenderManager::HasFreeBuffer() -+{ -+ if (!m_bUseBuffering) -+ { -+ if (m_iOutputRenderBuffer != m_iCurrentRenderBuffer) -+ return false; -+ else -+ return true; -+ } -+ -+ int outputPlusSwap = (m_iOutputRenderBuffer + m_swapCount) % m_iNumRenderBuffers; -+ if ((m_iOutputRenderBuffer == m_iDisplayedRenderBuffer && !m_bAllRenderBuffersDisplayed) -+ || outputPlusSwap == m_iCurrentRenderBuffer) -+ return false; -+ else -+ return true; -+} -+ -+void CXBMCRenderManager::ResetRenderBuffer() -+{ -+ m_iNumRenderBuffers = 5; -+ m_iCurrentRenderBuffer = 0; -+ m_iFlipRequestRenderBuffer = 0; -+ m_iOutputRenderBuffer = 0; -+ m_iDisplayedRenderBuffer = 0; -+ m_bAllRenderBuffersDisplayed = true; -+ m_sleeptime = 1.0; -+ m_presentPts = DVD_NOPTS_VALUE; -+// m_bUseBuffering = true; -+ m_speed = 0; -+} -+ -+void CXBMCRenderManager::PrepareNextRender() -+{ -+ int idx = GetNextRenderBufferIndex(); -+ if (idx < 0) -+ { -+ if (m_speed >= DVD_PLAYSPEED_NORMAL && g_graphicsContext.IsFullScreenVideo()) -+ CLog::Log(LOGNOTICE,"----------- no buffer, out: %d, current: %d, display: %d", -+ m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); -+ return; -+ } -+ -+ double iClockSleep, iPlayingClock, iCurrentClock; -+ iPlayingClock = m_pClock->GetClock(iCurrentClock, false); -+ iClockSleep = m_renderBuffers[idx].pts - iPlayingClock; -+ -+ if (m_speed) -+ iClockSleep = iClockSleep * DVD_PLAYSPEED_NORMAL / m_speed; -+ -+ double presenttime = (iCurrentClock + iClockSleep) / DVD_TIME_BASE; -+ double clocktime = iCurrentClock / DVD_TIME_BASE; -+ if(presenttime - clocktime > MAXPRESENTDELAY) -+ presenttime = clocktime + MAXPRESENTDELAY; -+ -+ m_sleeptime = presenttime - clocktime; -+ -+// double interval; -+// if (g_VideoReferenceClock.GetRefreshRate(&interval) > 0) -+// { -+// if (m_swaptime > interval * 0.7) -+// { -+// presenttime += interval; -+// CLog::Log(LOGDEBUG,"------------ very long swaptime"); -+// } -+// } -+ -+ if (g_graphicsContext.IsFullScreenVideo() || presenttime <= clocktime+0.01) -+ { -+ m_presentPts = m_renderBuffers[idx].pts; -+ m_presenttime = presenttime; -+ m_presentmethod = m_renderBuffers[idx].presentmethod; -+ m_presentfield = m_renderBuffers[idx].presentfield; -+ m_presentstep = PRESENT_FLIP; -+ m_presentsource = idx; -+ } -+} -+ -+void CXBMCRenderManager::EnableBuffering(bool enable) -+{ -+ CRetakeLock lock(m_sharedSection); -+ m_bUseBuffering = enable; -+ if (!m_bUseBuffering) -+ m_iOutputRenderBuffer = m_iCurrentRenderBuffer; -+ -+ CLog::Log(LOGDEBUG, "CXBMCRenderManager::EnableBuffering - %d", m_bUseBuffering); -+} -+ -+void CXBMCRenderManager::DiscardBuffer() -+{ -+ CRetakeLock lock(m_sharedSection); -+ m_iOutputRenderBuffer = m_iCurrentRenderBuffer; -+} -+ -+void CXBMCRenderManager::NotifyDisplayFlip() -+{ -+ CRetakeLock lock(m_sharedSection); -+ if (!m_pRenderer) -+ return; -+ -+// if (g_graphicsContext.IsFullScreenVideo()) -+// { -+// uint64_t diff = CurrentHostCounter() - m_rendertime; -+// m_swaptime = ((double)(diff))/CurrentHostFrequency(); -+// int waittime = (int)((diff*1000LL)/CurrentHostFrequency()); -+// if (waittime > 15) -+// { -+// CLog::Log(LOGNOTICE,"------------------ wait swap buffers: %f, sleep: %f", m_swaptime, m_sleeptime); -+// } -+// } -+ -+ int last = m_iDisplayedRenderBuffer; -+ m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - m_swapCount) % m_iNumRenderBuffers; -+ m_iFlipRequestRenderBuffer = m_iCurrentRenderBuffer; -+ -+// // we have caught up with output so all buffers are re-usable -+// if (last != m_iDisplayedRenderBuffer -+// && m_iDisplayedRenderBuffer == m_iOutputRenderBuffer) -+// { -+// CLog::Log(LOGNOTICE,"-------------- all displayed"); -+// m_bAllRenderBuffersDisplayed = true; -+// } -+ -+ if (last != m_iDisplayedRenderBuffer -+ && m_iDisplayedRenderBuffer != m_iCurrentRenderBuffer) -+ { -+ m_pRenderer->ReleaseBuffer(m_iDisplayedRenderBuffer); -+ m_overlays.ReleaseBuffer(m_iDisplayedRenderBuffer); -+ } -+ -+ lock.Leave(); -+ m_flipEvent.Set(); -+} -+ -+bool CXBMCRenderManager::GetStats(double &sleeptime, double &pts, int &bufferLevel) -+{ -+ CSharedLock lock(m_sharedSection); -+ sleeptime = m_sleeptime; -+ pts = m_presentPts; -+ bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; -+ return true; -+} -+ -+bool CXBMCRenderManager::HasFrame() -+{ -+ CSharedLock lock(m_sharedSection); -+ if (m_presentstep == PRESENT_IDLE && -+ GetNextRenderBufferIndex() < 0 && -+ m_speed > 0) -+ return false; -+ else -+ return true; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.h xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.h ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/RenderManager.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/RenderManager.h 2012-05-14 14:15:12.161221010 +0200 -@@ -39,10 +39,11 @@ - #include "OverlayRenderer.h" - - class CRenderCapture; -+class CDVDClock; - - namespace DXVA { class CProcessor; } - namespace VAAPI { class CSurfaceHolder; } --class CVDPAU; -+namespace VDPAU { struct CVdpauRenderPicture; } - struct DVDVideoPicture; - - #define ERRORBUFFSIZE 30 -@@ -73,8 +74,8 @@ - - int AddVideoPicture(DVDVideoPicture& picture); - -- void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE); -- unsigned int PreInit(); -+ void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE, int speed = 0); -+ unsigned int PreInit(CDVDClock *pClock); - void UnInit(); - bool Flush(); - -@@ -182,6 +183,13 @@ - - CSharedSection& GetSection() { return m_sharedSection; }; - -+ int WaitForBuffer(volatile bool& bStop); -+ void NotifyDisplayFlip(); -+ bool GetStats(double &sleeptime, double &pts, int &bufferLevel); -+ bool HasFrame(); -+ void EnableBuffering(bool enable); -+ void DiscardBuffer(); -+ - protected: - void Render(bool clear, DWORD flags, DWORD alpha); - -@@ -190,6 +198,13 @@ - void PresentBob(bool clear, DWORD flags, DWORD alpha); - void PresentBlend(bool clear, DWORD flags, DWORD alpha); - -+ int GetNextRenderBufferIndex(); -+ void FlipRenderBuffer(); -+ int FlipFreeBuffer(); -+ bool HasFreeBuffer(); -+ void ResetRenderBuffer(); -+ void PrepareNextRender(); -+ - EINTERLACEMETHOD AutoInterlaceMethodInternal(EINTERLACEMETHOD mInt); - - bool m_bPauseDrawing; // true if we should pause rendering -@@ -220,6 +235,43 @@ - double m_displayLatency; - void UpdateDisplayLatency(); - -+ // Render Buffer State Description: -+ // -+ // Output: is the buffer about to or having its texture prepared for render (ie from output thread). -+ // Cannot go past the "Displayed" buffer (otherwise we will probably overwrite buffers not yet -+ // displayed or even rendered). -+ // Current: is the current buffer being or having been submitted for render to back buffer. -+ // Cannot go past "Output" buffer (else it would be rendering old output). -+ // FlipRequest: is the render buffer that has last been submitted for render AND importantly has had -+ // swap-buffer flip subsequently invoked (thus flip to front buffer is requested for vblank -+ // subsequent to render completion). -+ // Displayed: is the buffer that is now considered to be safely copied from back buffer to front buffer -+ // (we assume that after two swap-buffer flips for the same "Current" render buffer that that -+ // buffer will be safe, but otherwise we consider that only the previous-to-"Current" is guaranteed). -+ // Last: is the last buffer successfully submitted for render to back buffer (purpose: to rollback to in -+ // unexpected case where a texture render fails). -+ -+ int m_iCurrentRenderBuffer; -+ int m_iNumRenderBuffers; -+// int m_iLastRenderBuffer; -+ int m_iFlipRequestRenderBuffer; -+ int m_iOutputRenderBuffer; -+ int m_iDisplayedRenderBuffer; -+ bool m_bAllRenderBuffersDisplayed; -+ bool m_bUseBuffering; -+ int m_speed; -+ CEvent m_flipEvent; -+ -+ struct -+ { -+ double pts; -+ EFIELDSYNC presentfield; -+ EPRESENTMETHOD presentmethod; -+ }m_renderBuffers[5]; -+ -+ double m_sleeptime; -+ double m_presentPts; -+ - double m_presenttime; - double m_presentcorr; - double m_presenterr; -@@ -231,7 +283,10 @@ - int m_presentsource; - CEvent m_presentevent; - CEvent m_flushEvent; -- -+ CDVDClock *m_pClock; -+ uint64_t m_rendertime; -+ double m_swaptime; -+ unsigned int m_swapCount; - - OVERLAY::CRenderer m_overlays; - -diff -Naur xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp ---- xbmc-pvr-11.0.1/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-05-14 14:15:12.162221031 +0200 -@@ -186,6 +186,8 @@ - m_defines += "#define XBMC_YUY2\n"; - else if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_UYVY) - m_defines += "#define XBMC_UYVY\n"; -+ else if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_VDPAU_420) -+ m_defines += "#define XBMC_VDPAU_NV12\n"; - - VertexShader()->LoadSource("yuv2rgb_vertex.glsl", m_defines); - #elif HAS_GLES == 2 -diff -Naur xbmc-pvr-11.0.1/xbmc/dialogs/GUIDialogCache.cpp xbmc-pvr-11.0.1.patch/xbmc/dialogs/GUIDialogCache.cpp ---- xbmc-pvr-11.0.1/xbmc/dialogs/GUIDialogCache.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/dialogs/GUIDialogCache.cpp 2012-05-14 14:15:12.163221052 +0200 -@@ -29,7 +29,7 @@ - #include "threads/SingleLock.h" - #include "utils/TimeUtils.h" - --CGUIDialogCache::CGUIDialogCache(DWORD dwDelay, const CStdString& strHeader, const CStdString& strMsg) -+CGUIDialogCache::CGUIDialogCache(DWORD dwDelay, const CStdString& strHeader, const CStdString& strMsg) : CThread("CGUIDialogCache") - { - m_pDlg = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FileCache.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileCache.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FileCache.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileCache.cpp 2012-05-14 14:15:12.163221052 +0200 -@@ -79,7 +79,7 @@ - }; - - --CFileCache::CFileCache() -+CFileCache::CFileCache() : CThread("CFileCache") - { - m_bDeleteCache = true; - m_nSeekResult = 0; -@@ -95,7 +95,7 @@ - m_cacheFull = false; - } - --CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache) -+CFileCache::CFileCache(CCacheStrategy *pCache, bool bDeleteCache) : CThread("CFileCache") - { - m_pCache = pCache; - m_bDeleteCache = bDeleteCache; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FilePipe.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FilePipe.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FilePipe.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FilePipe.cpp 2012-05-14 14:15:12.164221072 +0200 -@@ -24,6 +24,8 @@ - #include "PipesManager.h" - #include "utils/StringUtils.h" - -+#define INFINITE 0xFFFFFFFF -+ - using namespace XFILE; - - CFilePipe::CFilePipe() : m_pos(0), m_length(-1), m_pipe(NULL) -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/FileRar.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileRar.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/FileRar.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/FileRar.cpp 2012-05-14 14:15:12.165221092 +0200 -@@ -43,7 +43,7 @@ - #define SEEKTIMOUT 30000 - - #ifdef HAS_FILESYSTEM_RAR --CFileRarExtractThread::CFileRarExtractThread() : hRunning(true), hQuit(true) -+CFileRarExtractThread::CFileRarExtractThread() : CThread("CFileRarExtractThread"), hRunning(true), hQuit(true) - { - m_pArc = NULL; - m_pCmd = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/HTSPDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/HTSPDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/HTSPDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/HTSPDirectory.cpp 2012-05-14 14:15:12.166221112 +0200 -@@ -76,7 +76,7 @@ - static CCriticalSection g_section; - - --CHTSPDirectorySession::CHTSPDirectorySession() -+CHTSPDirectorySession::CHTSPDirectorySession() : CThread("CHTSPDirectorySession") - { - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/LastFMDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/LastFMDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/LastFMDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/LastFMDirectory.cpp 2012-05-14 14:15:12.167221132 +0200 -@@ -69,7 +69,7 @@ - m_dlgProgress->Progress(); - } - -- CThread thread(this); -+ CThread thread(this, "CLastFMDirectory"); - m_strSource = url; - m_strDestination = "special://temp/lastfm.xml"; - thread.Create(); -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/MythSession.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/MythSession.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/MythSession.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/MythSession.cpp 2012-05-14 14:15:12.168221152 +0200 -@@ -359,7 +359,7 @@ - return; - } - --CMythSession::CMythSession(const CURL& url) -+CMythSession::CMythSession(const CURL& url) : CThread("CMythSession") - { - m_control = NULL; - m_event = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/PipesManager.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/PipesManager.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/PipesManager.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/PipesManager.cpp 2012-05-14 14:15:12.169221172 +0200 -@@ -23,6 +23,8 @@ - #include "threads/SingleLock.h" - #include "Application.h" - -+#define INFINITE 0xFFFFFFFF -+ - #ifndef min - #define min(a,b) ((a) < (b) ? (a) : (b)) - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/RarManager.h xbmc-pvr-11.0.1.patch/xbmc/filesystem/RarManager.h ---- xbmc-pvr-11.0.1/xbmc/filesystem/RarManager.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/RarManager.h 2012-05-14 14:15:12.169221172 +0200 -@@ -71,7 +71,7 @@ - CRarManager(); - ~CRarManager(); - bool CacheRarredFile(CStdString& strPathInCache, const CStdString& strRarPath, -- const CStdString& strPathInRar, BYTE bOptions = EXFILE_AUTODELETE, -+ const CStdString& strPathInRar, uint8_t bOptions = EXFILE_AUTODELETE, - const CStdString& strDir =RAR_DEFAULT_CACHE, const int64_t iSize=-1); - bool GetPathInCache(CStdString& strPathInCache, const CStdString& strRarPath, - const CStdString& strPathInRar = ""); -diff -Naur xbmc-pvr-11.0.1/xbmc/filesystem/SAPDirectory.cpp xbmc-pvr-11.0.1.patch/xbmc/filesystem/SAPDirectory.cpp ---- xbmc-pvr-11.0.1/xbmc/filesystem/SAPDirectory.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/filesystem/SAPDirectory.cpp 2012-05-14 14:15:12.170221192 +0200 -@@ -272,7 +272,7 @@ - using namespace SDP; - - --CSAPSessions::CSAPSessions() -+CSAPSessions::CSAPSessions() : CThread("CSAPSessions") - { - m_socket = INVALID_SOCKET; - } -@@ -486,7 +486,7 @@ - - CSingleLock lock(g_sapsessions.m_section); - -- if(g_sapsessions.ThreadHandle() == NULL) -+ if(!g_sapsessions.IsRunning()) - g_sapsessions.Create(); - - // check if we can find this session in our cache -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-05-14 14:15:12.171221212 +0200 -@@ -181,9 +181,9 @@ - m_threadState = state; - } - --void CGUIPythonWindow::WaitForActionEvent(unsigned int timeout) -+void CGUIPythonWindow::WaitForActionEvent() - { -- g_pythonParser.WaitForEvent(m_actionEvent, timeout); -+ g_pythonParser.WaitForEvent(m_actionEvent); - m_actionEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-05-14 14:15:12.171221212 +0200 -@@ -51,7 +51,7 @@ - virtual bool OnAction(const CAction &action); - virtual bool OnBack(int actionID); - void SetCallbackWindow(void* state, void *object); -- void WaitForActionEvent(unsigned int timeout); -+ void WaitForActionEvent(); - void PulseActionEvent(); - void SetDestroyAfterDeinit(bool destroy = true); - protected: -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-05-14 14:15:12.172221232 +0200 -@@ -279,9 +279,9 @@ - UpdateButtons(); - } - --void CGUIPythonWindowXML::WaitForActionEvent(unsigned int timeout) -+void CGUIPythonWindowXML::WaitForActionEvent() - { -- g_pythonParser.WaitForEvent(m_actionEvent, timeout); -+ g_pythonParser.WaitForEvent(m_actionEvent); - m_actionEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-05-14 14:15:12.173221252 +0200 -@@ -40,7 +40,7 @@ - virtual void AllocResources(bool forceLoad = false); - virtual void FreeResources(bool forceUnLoad = false); - void Process(unsigned int currentTime, CDirtyRegionList ®ions); -- void WaitForActionEvent(unsigned int timeout); -+ void WaitForActionEvent(); - void PulseActionEvent(); - void AddItem(CFileItemPtr fileItem,int itemPosition); - void RemoveItem(int itemPosition); -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-05-14 14:15:12.174221272 +0200 -@@ -540,11 +540,11 @@ - - CPyThreadState pyState; - if (WindowXML_Check(self)) -- ((CGUIPythonWindowXML*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindowXML*)self->pWindow)->WaitForActionEvent(); - else if (WindowXMLDialog_Check(self)) -- ((CGUIPythonWindowXMLDialog*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindowXMLDialog*)self->pWindow)->WaitForActionEvent(); - else -- ((CGUIPythonWindow*)self->pWindow)->WaitForActionEvent(INFINITE); -+ ((CGUIPythonWindow*)self->pWindow)->WaitForActionEvent(); - } - } - Py_INCREF(Py_None); -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.cpp xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.cpp 2012-05-14 14:15:12.175221293 +0200 -@@ -676,11 +676,11 @@ - m_globalEvent.Set(); - } - --void XBPython::WaitForEvent(CEvent& hEvent, unsigned int timeout) -+void XBPython::WaitForEvent(CEvent& hEvent) - { - // wait for either this event our our global event - XbmcThreads::CEventGroup eventGroup(&hEvent, &m_globalEvent, NULL); -- eventGroup.wait(timeout); -+ eventGroup.wait(); - m_globalEvent.Reset(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.h xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.h ---- xbmc-pvr-11.0.1/xbmc/interfaces/python/XBPython.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/interfaces/python/XBPython.h 2012-05-14 14:15:12.176221314 +0200 -@@ -61,7 +61,7 @@ - void Process(); - - void PulseGlobalEvent(); -- void WaitForEvent(CEvent& hEvent, unsigned int timeout); -+ void WaitForEvent(CEvent& hEvent); - - int ScriptsSize(); - int GetPythonScriptId(int scriptPosition); -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/Makefile.in xbmc-pvr-11.0.1.patch/xbmc/linux/Makefile.in ---- xbmc-pvr-11.0.1/xbmc/linux/Makefile.in 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/Makefile.in 2012-05-14 14:15:12.176221314 +0200 -@@ -10,14 +10,11 @@ - LinuxResourceCounter.cpp \ - LinuxTimezone.cpp \ - PosixMountProvider.cpp \ -- XEventUtils.cpp \ - XFileUtils.cpp \ - XHandle.cpp \ - XLCDproc.cpp \ - XMemUtils.cpp \ -- XSyncUtils.cpp \ - XTimeUtils.cpp \ -- XThreadUtils.cpp \ - - LIB=linux.a - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/PlatformDefs.h xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformDefs.h ---- xbmc-pvr-11.0.1/xbmc/linux/PlatformDefs.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformDefs.h 2012-05-14 14:15:12.177221334 +0200 -@@ -182,8 +182,6 @@ - #define EXCEPTION_EXECUTE_HANDLER ... - //NOTE: dont try to define __except because it breaks g++ (already uses it). - --typedef pthread_t ThreadIdentifier; -- - struct CXHandle; // forward declaration - typedef CXHandle* HANDLE; - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/PlatformInclude.h xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformInclude.h ---- xbmc-pvr-11.0.1/xbmc/linux/PlatformInclude.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/PlatformInclude.h 2012-05-14 14:15:12.178221354 +0200 -@@ -25,10 +25,7 @@ - #include "PlatformDefs.h" - #include "XHandlePublic.h" - #include "XFileUtils.h" --#include "XSyncUtils.h" --#include "XEventUtils.h" - #include "XTimeUtils.h" --#include "XThreadUtils.h" - #include "XMemUtils.h" - #include "ConvUtils.h" - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,144 +0,0 @@ --/* -- * Copyright (C) 2005-2008 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 -- * -- */ -- --#include "system.h" --#include "PlatformDefs.h" --#include "XEventUtils.h" --#include "XHandle.h" --#include "utils/log.h" --#include "threads/SingleLock.h" -- --using namespace std; -- --HANDLE WINAPI CreateEvent(void *pDummySec, bool bManualReset, bool bInitialState, char *szDummyName) --{ -- CXHandle *pHandle = new CXHandle(CXHandle::HND_EVENT); -- pHandle->m_bManualEvent = bManualReset; -- pHandle->m_hCond = new XbmcThreads::ConditionVariable(); -- pHandle->m_hMutex = new CCriticalSection(); -- pHandle->m_bEventSet = false; -- -- if (bInitialState) -- SetEvent(pHandle); -- -- return pHandle; --} -- --// --// The state of a manual-reset event object remains signaled until it is set explicitly to the nonsignaled --// state by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait --// operations for the specified event object by calling one of the wait functions, can be released while the --// object's state is signaled. --// --// The state of an auto-reset event object remains signaled until a single waiting thread is released, at --// which time the system automatically sets the state to nonsignaled. If no threads are waiting, the event --// object's state remains signaled. --// --bool WINAPI SetEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = true; -- -- // we must guarantee that these handle's won't be deleted, until we are done -- list events = hEvent->m_hParents; -- for(list::iterator it = events.begin();it != events.end();it++) -- DuplicateHandle(GetCurrentProcess(), *it, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- lock.Leave(); -- -- for(list::iterator it = events.begin();it != events.end();it++) -- { -- SetEvent(*it); -- CloseHandle(*it); -- } -- -- DuplicateHandle(GetCurrentProcess(), hEvent, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- if (hEvent->m_bManualEvent == true) -- hEvent->m_hCond->notifyAll(); -- else -- hEvent->m_hCond->notify(); -- -- CloseHandle(hEvent); -- -- return true; --} -- --bool WINAPI ResetEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = false; -- -- return true; --} -- --bool WINAPI PulseEvent(HANDLE hEvent) --{ -- if (hEvent == NULL || hEvent->m_hCond == NULL || hEvent->m_hMutex == NULL) -- return false; -- -- CSingleLock lock(*(hEvent->m_hMutex)); -- // we must guarantee that these handle's won't be deleted, until we are done -- list events = hEvent->m_hParents; -- for(list::iterator it = events.begin();it != events.end();it++) -- DuplicateHandle(GetCurrentProcess(), *it, GetCurrentProcess(), NULL, 0, FALSE, DUPLICATE_SAME_ACCESS); -- -- if(events.size()) -- { -- CLog::Log(LOGWARNING,"PulseEvent - ineffecient multiwait detected"); -- hEvent->m_bEventSet = true; -- } -- -- lock.Leave(); -- -- for(list::iterator it = events.begin();it != events.end();it++) -- { -- SetEvent(*it); -- CloseHandle(*it); -- -- if (hEvent->m_bManualEvent == false) -- break; -- } -- -- // for multiwaits, we must yield some time to get the multiwaits to notice it was signaled -- if(events.size()) -- Sleep(10); -- -- // we should always unset the event on pulse -- { -- CSingleLock lock2(*(hEvent->m_hMutex)); -- hEvent->m_bEventSet = false; -- } -- -- if (hEvent->m_bManualEvent == true) -- hEvent->m_hCond->notifyAll(); -- else -- hEvent->m_hCond->notify(); -- -- return true; --} -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XEventUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XEventUtils.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,38 +0,0 @@ --#ifndef __X_EVENT_UTIL_H__ --#define __X_EVENT_UTIL_H__ -- --/* -- * Copyright (C) 2005-2008 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 -- * -- */ -- --#include "XHandlePublic.h" -- --#ifdef _LINUX -- --HANDLE WINAPI CreateEvent(void *pDummySec, bool bManualReset, bool bInitialState, char *szDummyName); --bool WINAPI SetEvent(HANDLE hEvent); --bool WINAPI ResetEvent(HANDLE hEvent); --bool WINAPI PulseEvent(HANDLE hEvent); -- --#endif -- -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XHandle.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XHandle.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.cpp 2012-05-14 14:15:12.185221494 +0200 -@@ -20,12 +20,15 @@ - */ - - #include "XHandle.h" --#include "XThreadUtils.h" - #include "utils/log.h" - #include "threads/SingleLock.h" - - int CXHandle::m_objectTracker[10] = {0}; - -+HANDLE WINAPI GetCurrentProcess(void) { -+ return (HANDLE)-1; // -1 a special value - pseudo handle -+} -+ - CXHandle::CXHandle() - { - Init(); -@@ -47,11 +50,6 @@ - - Init(); - -- if (m_threadValid) -- { -- CLog::Log(LOGERROR, "%s - thread handle copied instead of passed!", __FUNCTION__); -- } -- - if (src.m_hMutex) - m_hMutex = new CCriticalSection(); - -@@ -80,7 +78,7 @@ - CLog::Log(LOGERROR,"%s, destroying handle with ref count %d", __FUNCTION__, m_nRefCount); - assert(false); - } -- -+ - if (m_hMutex) { - delete m_hMutex; - } -@@ -93,10 +91,6 @@ - delete m_hCond; - } - -- if (m_threadValid) { -- pthread_join(m_hThread, NULL); -- } -- - if ( fd != 0 ) { - close(fd); - } -@@ -107,11 +101,9 @@ - { - fd=0; - m_hMutex=NULL; -- m_threadValid=false; - m_hCond=NULL; - m_type = HND_NULL; - RecursionCount=0; -- OwningThread=0; - m_bManualEvent=FALSE; - m_bEventSet=FALSE; - m_nFindFileIterator=0 ; -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XHandle.h xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.h ---- xbmc-pvr-11.0.1/xbmc/linux/XHandle.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XHandle.h 2012-05-14 14:15:12.186221514 +0200 -@@ -25,7 +25,6 @@ - #ifndef _WIN32 - - #include --#include - - #include "PlatformDefs.h" - #include "XHandlePublic.h" -@@ -36,7 +35,7 @@ - struct CXHandle { - - public: -- typedef enum { HND_NULL = 0, HND_FILE, HND_EVENT, HND_MUTEX, HND_THREAD, HND_FIND_FILE } HandleType; -+ typedef enum { HND_NULL = 0, HND_FILE, HND_EVENT, HND_MUTEX, HND_FIND_FILE } HandleType; - - CXHandle(); - CXHandle(HandleType nType); -@@ -47,8 +46,6 @@ - inline HandleType GetType() { return m_type; } - void ChangeType(HandleType newType); - -- ThreadIdentifier m_hThread; -- bool m_threadValid; - XbmcThreads::ConditionVariable *m_hCond; - std::list m_hParents; - -@@ -62,7 +59,6 @@ - // simulate mutex and critical section - CCriticalSection *m_hMutex; - int RecursionCount; // for mutex - for compatibility with WIN32 critical section -- pthread_t OwningThread; - int fd; - bool m_bManualEvent; - time_t m_tmCreation; -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.cpp 2012-05-14 14:15:12.187221534 +0200 -@@ -25,6 +25,10 @@ - - #include "XMemUtils.h" - -+#ifdef __APPLE__ -+#include -+#endif -+ - #undef ALIGN - #define ALIGN(value, alignment) (((value)+(alignment-1))&~(alignment-1)) - -@@ -49,4 +53,130 @@ - free(pFull); - } - -+#ifndef _WIN32 -+ -+#if defined(_LINUX) && !defined(__APPLE__) && !defined(__FreeBSD__) -+static FILE* procMeminfoFP = NULL; -+#endif -+ -+void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) -+{ -+ if (!lpBuffer) -+ return; -+ -+ memset(lpBuffer, 0, sizeof(MEMORYSTATUSEX)); -+ -+#ifdef __APPLE__ -+ uint64_t physmem; -+ size_t len = sizeof physmem; -+ int mib[2] = { CTL_HW, HW_MEMSIZE }; -+ size_t miblen = sizeof(mib) / sizeof(mib[0]); -+ -+ // Total physical memory. -+ if (sysctl(mib, miblen, &physmem, &len, NULL, 0) == 0 && len == sizeof (physmem)) -+ lpBuffer->ullTotalPhys = physmem; -+ -+ // Virtual memory. -+ mib[0] = CTL_VM; mib[1] = VM_SWAPUSAGE; -+ struct xsw_usage swap; -+ len = sizeof(struct xsw_usage); -+ if (sysctl(mib, miblen, &swap, &len, NULL, 0) == 0) -+ { -+ lpBuffer->ullAvailPageFile = swap.xsu_avail; -+ lpBuffer->ullTotalVirtual = lpBuffer->ullTotalPhys + swap.xsu_total; -+ } -+ -+ // In use. -+ mach_port_t stat_port = mach_host_self(); -+ vm_statistics_data_t vm_stat; -+ mach_msg_type_number_t count = sizeof(vm_stat) / sizeof(natural_t); -+ if (host_statistics(stat_port, HOST_VM_INFO, (host_info_t)&vm_stat, &count) == 0) -+ { -+ // Find page size. -+ int pageSize; -+ mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; -+ len = sizeof(int); -+ if (sysctl(mib, miblen, &pageSize, &len, NULL, 0) == 0) -+ { -+ uint64_t used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pageSize; -+ -+ lpBuffer->ullAvailPhys = lpBuffer->ullTotalPhys - used; -+ lpBuffer->ullAvailVirtual = lpBuffer->ullAvailPhys; // FIXME. -+ } -+ } -+#elif defined(__FreeBSD__) -+ /* sysctl hw.physmem */ -+ size_t physmem = 0, mem_free = 0, pagesize = 0, swap_free = 0; -+ size_t mem_avail = 0, mem_inactive = 0, mem_cache = 0, len = 0; -+ -+ /* physmem */ -+ len = sizeof(physmem); -+ if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0) { -+ lpBuffer->ullTotalPhys = physmem; -+ lpBuffer->ullTotalVirtual = physmem; -+ } -+ /* pagesize */ -+ len = sizeof(pagesize); -+ if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0) -+ pagesize = 4096; -+ /* mem_inactive */ -+ len = sizeof(mem_inactive); -+ if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0) -+ mem_inactive *= pagesize; -+ /* mem_cache */ -+ len = sizeof(mem_cache); -+ if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0) -+ mem_cache *= pagesize; -+ /* mem_free */ -+ len = sizeof(mem_free); -+ if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0) -+ mem_free *= pagesize; -+ -+ /* mem_avail = mem_inactive + mem_cache + mem_free */ -+ lpBuffer->ullAvailPhys = mem_inactive + mem_cache + mem_free; -+ lpBuffer->ullAvailVirtual = mem_inactive + mem_cache + mem_free; -+ -+ if (sysctlbyname("vm.stats.vm.v_swappgsout", &swap_free, &len, NULL, 0) == 0) -+ lpBuffer->ullAvailPageFile = swap_free * pagesize; -+#else -+ struct sysinfo info; -+ char name[32]; -+ unsigned val; -+ if (!procMeminfoFP && (procMeminfoFP = fopen("/proc/meminfo", "r")) == NULL) -+ sysinfo(&info); -+ else -+ { -+ memset(&info, 0, sizeof(struct sysinfo)); -+ info.mem_unit = 4096; -+ while (fscanf(procMeminfoFP, "%31s %u%*[^\n]\n", name, &val) != EOF) -+ { -+ if (strncmp("MemTotal:", name, 9) == 0) -+ info.totalram = val/4; -+ else if (strncmp("MemFree:", name, 8) == 0) -+ info.freeram = val/4; -+ else if (strncmp("Buffers:", name, 8) == 0) -+ info.bufferram += val/4; -+ else if (strncmp("Cached:", name, 7) == 0) -+ info.bufferram += val/4; -+ else if (strncmp("SwapTotal:", name, 10) == 0) -+ info.totalswap = val/4; -+ else if (strncmp("SwapFree:", name, 9) == 0) -+ info.freeswap = val/4; -+ else if (strncmp("HighTotal:", name, 10) == 0) -+ info.totalhigh = val/4; -+ else if (strncmp("HighFree:", name, 9) == 0) -+ info.freehigh = val/4; -+ } -+ rewind(procMeminfoFP); -+ fflush(procMeminfoFP); -+ } -+ lpBuffer->ullAvailPageFile = (info.freeswap * info.mem_unit); -+ lpBuffer->ullAvailPhys = ((info.freeram + info.bufferram) * info.mem_unit); -+ lpBuffer->ullAvailVirtual = ((info.freeram + info.bufferram) * info.mem_unit); -+ lpBuffer->ullTotalPhys = (info.totalram * info.mem_unit); -+ lpBuffer->ullTotalVirtual = (info.totalram * info.mem_unit); -+#endif -+} -+ -+#endif - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XMemUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XMemUtils.h 2012-05-14 14:15:12.187221534 +0200 -@@ -22,10 +22,14 @@ - * - */ - -+#include "linux/PlatformDefs.h" -+ - // aligned memory allocation and free. memory returned will be aligned to "alignTo" bytes. - // this is a linux (actually platfom free) implementation of the win32 CRT methods _aligned_malloc and _aligned_free. - void *_aligned_malloc(size_t s, size_t alignTo); - void _aligned_free(void *p) ; - -+void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); -+ - #endif - -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,169 +0,0 @@ --/* -- * Copyright (C) 2005-2008 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 -- * -- */ -- --#ifndef _WIN32 -- -- --#include --#include --#include --#include --#include --#ifdef __APPLE__ --#include --#endif -- --#include "XSyncUtils.h" --#include "XTimeUtils.h" --#include "PlatformDefs.h" --#include "XHandle.h" --#include "XEventUtils.h" -- --using namespace std; --using namespace XbmcThreads; -- --#include "../utils/log.h" --#include "../utils/TimeUtils.h" -- --#if defined(_LINUX) && !defined(__APPLE__) && !defined(__FreeBSD__) --static FILE* procMeminfoFP = NULL; --#endif -- --void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) --{ -- if (!lpBuffer) -- return; -- -- memset(lpBuffer, 0, sizeof(MEMORYSTATUSEX)); -- --#ifdef __APPLE__ -- uint64_t physmem; -- size_t len = sizeof physmem; -- int mib[2] = { CTL_HW, HW_MEMSIZE }; -- size_t miblen = sizeof(mib) / sizeof(mib[0]); -- -- // Total physical memory. -- if (sysctl(mib, miblen, &physmem, &len, NULL, 0) == 0 && len == sizeof (physmem)) -- lpBuffer->ullTotalPhys = physmem; -- -- // Virtual memory. -- mib[0] = CTL_VM; mib[1] = VM_SWAPUSAGE; -- struct xsw_usage swap; -- len = sizeof(struct xsw_usage); -- if (sysctl(mib, miblen, &swap, &len, NULL, 0) == 0) -- { -- lpBuffer->ullAvailPageFile = swap.xsu_avail; -- lpBuffer->ullTotalVirtual = lpBuffer->ullTotalPhys + swap.xsu_total; -- } -- -- // In use. -- mach_port_t stat_port = mach_host_self(); -- vm_statistics_data_t vm_stat; -- mach_msg_type_number_t count = sizeof(vm_stat) / sizeof(natural_t); -- if (host_statistics(stat_port, HOST_VM_INFO, (host_info_t)&vm_stat, &count) == 0) -- { -- // Find page size. -- int pageSize; -- mib[0] = CTL_HW; mib[1] = HW_PAGESIZE; -- len = sizeof(int); -- if (sysctl(mib, miblen, &pageSize, &len, NULL, 0) == 0) -- { -- uint64_t used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pageSize; -- -- lpBuffer->ullAvailPhys = lpBuffer->ullTotalPhys - used; -- lpBuffer->ullAvailVirtual = lpBuffer->ullAvailPhys; // FIXME. -- } -- } --#elif defined(__FreeBSD__) -- /* sysctl hw.physmem */ -- size_t physmem = 0, mem_free = 0, pagesize = 0, swap_free = 0; -- size_t mem_avail = 0, mem_inactive = 0, mem_cache = 0, len = 0; -- -- /* physmem */ -- len = sizeof(physmem); -- if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0) { -- lpBuffer->ullTotalPhys = physmem; -- lpBuffer->ullTotalVirtual = physmem; -- } -- /* pagesize */ -- len = sizeof(pagesize); -- if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0) -- pagesize = 4096; -- /* mem_inactive */ -- len = sizeof(mem_inactive); -- if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0) -- mem_inactive *= pagesize; -- /* mem_cache */ -- len = sizeof(mem_cache); -- if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0) -- mem_cache *= pagesize; -- /* mem_free */ -- len = sizeof(mem_free); -- if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0) -- mem_free *= pagesize; -- -- /* mem_avail = mem_inactive + mem_cache + mem_free */ -- lpBuffer->ullAvailPhys = mem_inactive + mem_cache + mem_free; -- lpBuffer->ullAvailVirtual = mem_inactive + mem_cache + mem_free; -- -- if (sysctlbyname("vm.stats.vm.v_swappgsout", &swap_free, &len, NULL, 0) == 0) -- lpBuffer->ullAvailPageFile = swap_free * pagesize; --#else -- struct sysinfo info; -- char name[32]; -- unsigned val; -- if (!procMeminfoFP && (procMeminfoFP = fopen("/proc/meminfo", "r")) == NULL) -- sysinfo(&info); -- else -- { -- memset(&info, 0, sizeof(struct sysinfo)); -- info.mem_unit = 4096; -- while (fscanf(procMeminfoFP, "%31s %u%*[^\n]\n", name, &val) != EOF) -- { -- if (strncmp("MemTotal:", name, 9) == 0) -- info.totalram = val/4; -- else if (strncmp("MemFree:", name, 8) == 0) -- info.freeram = val/4; -- else if (strncmp("Buffers:", name, 8) == 0) -- info.bufferram += val/4; -- else if (strncmp("Cached:", name, 7) == 0) -- info.bufferram += val/4; -- else if (strncmp("SwapTotal:", name, 10) == 0) -- info.totalswap = val/4; -- else if (strncmp("SwapFree:", name, 9) == 0) -- info.freeswap = val/4; -- else if (strncmp("HighTotal:", name, 10) == 0) -- info.totalhigh = val/4; -- else if (strncmp("HighFree:", name, 9) == 0) -- info.freehigh = val/4; -- } -- rewind(procMeminfoFP); -- fflush(procMeminfoFP); -- } -- lpBuffer->ullAvailPageFile = (info.freeswap * info.mem_unit); -- lpBuffer->ullAvailPhys = ((info.freeram + info.bufferram) * info.mem_unit); -- lpBuffer->ullAvailVirtual = ((info.freeram + info.bufferram) * info.mem_unit); -- lpBuffer->ullTotalPhys = (info.totalram * info.mem_unit); -- lpBuffer->ullTotalVirtual = (info.totalram * info.mem_unit); --#endif --} -- --#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.h xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.h ---- xbmc-pvr-11.0.1/xbmc/linux/XSyncUtils.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XSyncUtils.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,44 +0,0 @@ --#ifndef __X_SYNC_UTILS_ --#define __X_SYNC_UTILS_ -- --/* -- * Copyright (C) 2005-2008 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 -- * -- */ -- --#include "PlatformDefs.h" --#include "XHandlePublic.h" -- --#ifdef _LINUX -- --#define STATUS_WAIT_0 ((DWORD )0x00000000L) --#define WAIT_FAILED ((DWORD)0xFFFFFFFF) --#define WAIT_OBJECT_0 ((STATUS_WAIT_0 ) + 0 ) --#define WAIT_TIMEOUT 258L --#define INFINITE 0xFFFFFFFF --#define STATUS_ABANDONED_WAIT_0 0x00000080 --#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0 ) + 0 ) --#define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0 ) + 0 ) -- --void GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer); -- --#endif -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/linux/XThreadUtils.cpp xbmc-pvr-11.0.1.patch/xbmc/linux/XThreadUtils.cpp ---- xbmc-pvr-11.0.1/xbmc/linux/XThreadUtils.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/linux/XThreadUtils.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,210 +0,0 @@ --/* -- * Copyright (C) 2005-2009 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 -- * -- */ -- --#include "PlatformDefs.h" --#include "XHandle.h" --#include "XThreadUtils.h" --#include "XTimeUtils.h" --#include "XEventUtils.h" --#include "system.h" --#include "utils/log.h" -- --#ifdef _LINUX --#include --#include --#include -- --HANDLE WINAPI CreateThread( -- LPSECURITY_ATTRIBUTES lpThreadAttributes, -- SIZE_T dwStackSize, -- LPTHREAD_START_ROUTINE lpStartAddress, -- LPVOID lpParameter, -- DWORD dwCreationFlags, -- LPDWORD lpThreadId -- ) { -- -- // a thread handle would actually contain an event -- // the event would mark if the thread is running or not. it will be used in the Wait functions. -- HANDLE h = CreateEvent(NULL, TRUE, FALSE, NULL); -- h->ChangeType(CXHandle::HND_THREAD); --#ifdef __APPLE__ -- h->m_machThreadPort = MACH_PORT_NULL; --#endif -- pthread_attr_t attr; -- pthread_attr_init(&attr); -- if (dwStackSize > PTHREAD_STACK_MIN) -- pthread_attr_setstacksize(&attr, dwStackSize); -- if (pthread_create(&(h->m_hThread), &attr, (void*(*)(void*))lpStartAddress, lpParameter) == 0) -- h->m_threadValid = true; -- else -- { -- CloseHandle(h); -- h = NULL; -- } -- pthread_attr_destroy(&attr); -- -- if (h && lpThreadId) -- // WARNING: This can truncate thread IDs on x86_64. -- *lpThreadId = (DWORD)h->m_hThread; -- return h; --} -- -- --#if 0 // Deprecated, use CThread::GetCurrentThreadId() instead --DWORD WINAPI GetCurrentThreadId(void) { -- // WARNING: This can truncate thread IDs on x86_64. -- return (DWORD)pthread_self(); --} --#endif -- --HANDLE WINAPI GetCurrentThread(void) { -- return (HANDLE)-1; // -1 a special value - pseudo handle --} -- --HANDLE WINAPI GetCurrentProcess(void) { -- return (HANDLE)-1; // -1 a special value - pseudo handle --} -- --HANDLE _beginthreadex( -- void *security, -- unsigned stack_size, -- int ( *start_address )( void * ), -- void *arglist, -- unsigned initflag, -- unsigned *thrdaddr --) { -- -- HANDLE h = CreateThread(NULL, stack_size, start_address, arglist, initflag, (LPDWORD)thrdaddr); -- return h; -- --} -- --uintptr_t _beginthread( -- void( *start_address )( void * ), -- unsigned stack_size, -- void *arglist --) { -- HANDLE h = CreateThread(NULL, stack_size, (LPTHREAD_START_ROUTINE)start_address, arglist, 0, NULL); -- return (uintptr_t)h; --} -- --BOOL WINAPI GetThreadTimes ( -- HANDLE hThread, -- LPFILETIME lpCreationTime, -- LPFILETIME lpExitTime, -- LPFILETIME lpKernelTime, -- LPFILETIME lpUserTime --) { -- if (!hThread) -- return false; -- if (!hThread->m_threadValid) -- return false; -- -- if (hThread == (HANDLE)-1) { -- if (lpCreationTime) -- TimeTToFileTime(0,lpCreationTime); -- if (lpExitTime) -- TimeTToFileTime(time(NULL),lpExitTime); -- if (lpKernelTime) -- TimeTToFileTime(0,lpKernelTime); -- if (lpUserTime) -- TimeTToFileTime(0,lpUserTime); -- -- return true; -- } -- -- if (lpCreationTime) -- TimeTToFileTime(hThread->m_tmCreation,lpCreationTime); -- if (lpExitTime) -- TimeTToFileTime(time(NULL),lpExitTime); -- if (lpKernelTime) -- TimeTToFileTime(0,lpKernelTime); -- --#ifdef __APPLE__ -- thread_info_data_t threadInfo; -- mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX; -- -- if (hThread->m_machThreadPort == MACH_PORT_NULL) -- hThread->m_machThreadPort = pthread_mach_thread_np(hThread->m_hThread); -- -- kern_return_t ret = thread_info(hThread->m_machThreadPort, THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount); -- if (ret == KERN_SUCCESS) -- { -- thread_basic_info_t threadBasicInfo = (thread_basic_info_t)threadInfo; -- -- if (lpUserTime) -- { -- // User time. -- unsigned long long time = ((__int64)threadBasicInfo->user_time.seconds * 10000000L) + threadBasicInfo->user_time.microseconds*10L; -- lpUserTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpUserTime->dwHighDateTime = (time >> 32); -- } -- -- if (lpKernelTime) -- { -- // System time. -- unsigned long long time = ((__int64)threadBasicInfo->system_time.seconds * 10000000L) + threadBasicInfo->system_time.microseconds*10L; -- lpKernelTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpKernelTime->dwHighDateTime = (time >> 32); -- } -- } -- else -- { -- if (lpUserTime) -- lpUserTime->dwLowDateTime = lpUserTime->dwHighDateTime = 0; -- -- if (lpKernelTime) -- lpKernelTime->dwLowDateTime = lpKernelTime->dwHighDateTime = 0; -- } --#elif _POSIX_THREAD_CPUTIME != -1 -- if(lpUserTime) -- { -- lpUserTime->dwLowDateTime = 0; -- lpUserTime->dwHighDateTime = 0; -- clockid_t clock; -- if (pthread_getcpuclockid(hThread->m_hThread, &clock) == 0) -- { -- struct timespec tp = {}; -- clock_gettime(clock, &tp); -- unsigned long long time = (unsigned long long)tp.tv_sec * 10000000 + (unsigned long long)tp.tv_nsec/100; -- lpUserTime->dwLowDateTime = (time & 0xFFFFFFFF); -- lpUserTime->dwHighDateTime = (time >> 32); -- } -- } --#else -- if (lpUserTime) -- TimeTToFileTime(0,lpUserTime); --#endif -- return true; --} -- --BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority) --{ -- return true; --} -- --int GetThreadPriority(HANDLE hThread) --{ -- return 0; --} -- --#endif -- -diff -Naur xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScanner.cpp xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp ---- xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-05-14 14:15:12.192221636 +0200 -@@ -57,7 +57,7 @@ - using namespace XFILE; - using namespace MUSIC_GRABBER; - --CMusicInfoScanner::CMusicInfoScanner() -+CMusicInfoScanner::CMusicInfoScanner() : CThread("CMusicInfoScanner") - { - m_bRunning = false; - m_pObserver = NULL; -@@ -99,7 +99,7 @@ - - // Create the thread to count all files to be scanned - SetPriority( GetMinPriority() ); -- CThread fileCountReader(this); -+ CThread fileCountReader(this, "CMusicInfoScanner"); - if (m_pObserver) - fileCountReader.Create(); - -diff -Naur xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScraper.cpp xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp ---- xbmc-pvr-11.0.1/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-05-14 14:15:12.192221636 +0200 -@@ -28,7 +28,7 @@ - using namespace ADDON; - using namespace std; - --CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr &scraper) -+CMusicInfoScraper::CMusicInfoScraper(const ADDON::ScraperPtr &scraper) : CThread("CMusicInfoScraper") - { - m_bSucceeded=false; - m_bCanceled=false; -diff -Naur xbmc-pvr-11.0.1/xbmc/music/LastFmManager.cpp xbmc-pvr-11.0.1.patch/xbmc/music/LastFmManager.cpp ---- xbmc-pvr-11.0.1/xbmc/music/LastFmManager.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/music/LastFmManager.cpp 2012-05-14 14:15:12.193221656 +0200 -@@ -70,7 +70,7 @@ - - CLastFmManager* CLastFmManager::m_pInstance=NULL; - --CLastFmManager::CLastFmManager() -+CLastFmManager::CLastFmManager() : CThread("CLastFmManager") - { - m_RadioTrackQueue = new CPlayList; - } -@@ -534,7 +534,7 @@ - if (iNrCachedTracks == 0) - { - //get more tracks -- if (ThreadHandle() != NULL) -+ if (IsRunning()) - { - m_hWorkerEvent.Set(); - } -@@ -633,7 +633,7 @@ - { - m_RadioSession = ""; - } -- if (m_ThreadHandle) -+ if (IsRunning()) - { - m_bStop = true; - m_hWorkerEvent.Set(); -diff -Naur xbmc-pvr-11.0.1/xbmc/network/AirPlayServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/AirPlayServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/AirPlayServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/AirPlayServer.cpp 2012-05-14 14:15:12.194221676 +0200 -@@ -184,7 +184,7 @@ - } - } - --CAirPlayServer::CAirPlayServer(int port, bool nonlocal) -+CAirPlayServer::CAirPlayServer(int port, bool nonlocal) : CThread("AirPlayServer") - { - m_port = port; - m_nonlocal = nonlocal; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/AirTunesServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/AirTunesServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/AirTunesServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/AirTunesServer.cpp 2012-05-14 14:15:12.195221696 +0200 -@@ -292,7 +292,7 @@ - } - } - --CAirTunesServer::CAirTunesServer(int port, bool nonlocal) -+CAirTunesServer::CAirTunesServer(int port, bool nonlocal) : CThread("CAirTunesServer") - { - m_port = port; - m_pLibShairport = new DllLibShairport(); -diff -Naur xbmc-pvr-11.0.1/xbmc/network/libscrobbler/scrobbler.cpp xbmc-pvr-11.0.1.patch/xbmc/network/libscrobbler/scrobbler.cpp ---- xbmc-pvr-11.0.1/xbmc/network/libscrobbler/scrobbler.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/libscrobbler/scrobbler.cpp 2012-05-14 14:15:12.196221716 +0200 -@@ -46,7 +46,7 @@ - #define SCROBBLER_ACTION_NOWPLAYING 2 - - CScrobbler::CScrobbler(const CStdString &strHandshakeURL, const CStdString &strLogPrefix) -- : CThread() -+ : CThread("CScrobbler") - { - m_bBanned = false; - m_bBadAuth = false; -@@ -67,7 +67,7 @@ - ResetState(); - LoadCredentials(); - LoadJournal(); -- if (!ThreadHandle()) -+ if (!IsRunning()) - Create(); - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/network/Network.h xbmc-pvr-11.0.1.patch/xbmc/network/Network.h ---- xbmc-pvr-11.0.1/xbmc/network/Network.h 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/Network.h 2012-05-14 14:15:12.197221736 +0200 -@@ -24,6 +24,7 @@ - - #include - #include "utils/StdString.h" -+#include "system.h" - - enum EncMode { ENC_NONE = 0, ENC_WEP = 1, ENC_WPA = 2, ENC_WPA2 = 3 }; - enum NetworkAssignment { NETWORK_DASH = 0, NETWORK_DHCP = 1, NETWORK_STATIC = 2, NETWORK_DISABLED = 3 }; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/TCPServer.cpp xbmc-pvr-11.0.1.patch/xbmc/network/TCPServer.cpp ---- xbmc-pvr-11.0.1/xbmc/network/TCPServer.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/TCPServer.cpp 2012-05-14 14:15:12.197221736 +0200 -@@ -85,7 +85,7 @@ - } - } - --CTCPServer::CTCPServer(int port, bool nonlocal) -+CTCPServer::CTCPServer(int port, bool nonlocal) : CThread("CTCPServer") - { - m_port = port; - m_nonlocal = nonlocal; -diff -Naur xbmc-pvr-11.0.1/xbmc/network/UdpClient.cpp xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.cpp ---- xbmc-pvr-11.0.1/xbmc/network/UdpClient.cpp 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.cpp 2012-05-14 14:15:12.198221756 +0200 -@@ -35,7 +35,7 @@ - - #define UDPCLIENT_DEBUG_LEVEL LOGDEBUG - --CUdpClient::CUdpClient(void) : CThread() -+CUdpClient::CUdpClient(void) : CThread("CUdpClient") - {} - - CUdpClient::~CUdpClient(void) -diff -Naur xbmc-pvr-11.0.1/xbmc/network/UdpClient.h xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.h ---- xbmc-pvr-11.0.1/xbmc/network/UdpClient.h 2012-03-27 17:55:33.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/network/UdpClient.h 2012-05-14 14:15:12.199221776 +0200 -@@ -25,6 +25,7 @@ - #include "threads/CriticalSection.h" - #include - #include -+#include "system.h" - - class CUdpClient : CThread - { -diff -Naur xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-pvr-11.0.1/xbmc/peripherals/Peripherals.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/peripherals/Peripherals.cpp 2012-05-14 14:15:12.199221776 +0200 -@@ -19,6 +19,7 @@ - * - */ - -+#include "system.h" - #include "Peripherals.h" - #include "bus/PeripheralBus.h" - #include "devices/PeripheralBluetooth.h" -diff -Naur xbmc-pvr-11.0.1/xbmc/pictures/GUIWindowSlideShow.cpp xbmc-pvr-11.0.1.patch/xbmc/pictures/GUIWindowSlideShow.cpp ---- xbmc-pvr-11.0.1/xbmc/pictures/GUIWindowSlideShow.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/pictures/GUIWindowSlideShow.cpp 2012-05-14 14:15:12.201221817 +0200 -@@ -67,7 +67,7 @@ - - static float zoomamount[10] = { 1.0f, 1.2f, 1.5f, 2.0f, 2.8f, 4.0f, 6.0f, 9.0f, 13.5f, 20.0f }; - --CBackgroundPicLoader::CBackgroundPicLoader() -+CBackgroundPicLoader::CBackgroundPicLoader() : CThread("CBackgroundPicLoader") - { - m_pCallback = NULL; - m_isLoading = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/rendering/dx/RenderSystemDX.cpp xbmc-pvr-11.0.1.patch/xbmc/rendering/dx/RenderSystemDX.cpp ---- xbmc-pvr-11.0.1/xbmc/rendering/dx/RenderSystemDX.cpp 2012-03-27 17:55:35.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/rendering/dx/RenderSystemDX.cpp 2012-05-14 14:15:12.202221838 +0200 -@@ -569,7 +569,7 @@ - - //CVideoReferenceClock polls GetRasterStatus too, - //polling it from two threads at the same time is bad -- if (g_advancedSettings.m_sleepBeforeFlip > 0 && g_VideoReferenceClock.ThreadHandle() == NULL) -+ if (g_advancedSettings.m_sleepBeforeFlip > 0 && !g_VideoReferenceClock.IsRunning()) - { - //save current thread priority and set thread priority to THREAD_PRIORITY_TIME_CRITICAL - int priority = GetThreadPriority(GetCurrentThread()); -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.cpp 2012-05-14 14:15:12.203221858 +0200 -@@ -96,12 +96,18 @@ - m_videoAllowMpeg4VAAPI = false; - m_videoDisableBackgroundDeinterlace = false; - m_videoCaptureUseOcclusionQuery = -1; //-1 is auto detect -+ m_videoVDPAUdeintHD = -1; -+ m_videoVDPAUdeintSD = -1; -+ m_videoVDPAUtelecine = false; -+ m_videoVDPAUmaxHeight = -1; -+ m_videoVDPAUdeintSkipChromaHD = false; - m_DXVACheckCompatibility = false; - m_DXVACheckCompatibilityPresent = false; - m_DXVAForceProcessorRenderer = true; - m_DXVANoDeintProcForProgressive = false; - m_videoFpsDetect = 1; - m_videoDefaultLatency = 0.0; -+ m_vblankPolling = false; - - m_musicUseTimeSeeking = true; - m_musicTimeSeekForward = 10; -@@ -470,6 +476,11 @@ - XMLUtils::GetBoolean(pElement,"allowmpeg4vaapi",m_videoAllowMpeg4VAAPI); - XMLUtils::GetBoolean(pElement, "disablebackgrounddeinterlace", m_videoDisableBackgroundDeinterlace); - XMLUtils::GetInt(pElement, "useocclusionquery", m_videoCaptureUseOcclusionQuery, -1, 1); -+ XMLUtils::GetInt(pElement,"vdpauHDdeint",m_videoVDPAUdeintHD); -+ XMLUtils::GetInt(pElement,"vdpauSDdeint",m_videoVDPAUdeintSD); -+ XMLUtils::GetInt(pElement,"vdpauMaxHeight",m_videoVDPAUmaxHeight); -+ XMLUtils::GetBoolean(pElement,"vdpauInvTelecine",m_videoVDPAUtelecine); -+ XMLUtils::GetBoolean(pElement,"vdpauHDdeintSkipChroma",m_videoVDPAUdeintSkipChromaHD); - - TiXmlElement* pAdjustRefreshrate = pElement->FirstChildElement("adjustrefreshrate"); - if (pAdjustRefreshrate) -@@ -559,6 +570,8 @@ - //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps - XMLUtils::GetInt(pElement, "fpsdetect", m_videoFpsDetect, 0, 2); - -+ XMLUtils::GetBoolean(pElement,"vblankpolling", m_vblankPolling); -+ - // Store global display latency settings - TiXmlElement* pVideoLatency = pElement->FirstChildElement("latency"); - if (pVideoLatency) -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.h xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.h ---- xbmc-pvr-11.0.1/xbmc/settings/AdvancedSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/AdvancedSettings.h 2012-05-14 14:15:12.204221878 +0200 -@@ -111,6 +111,11 @@ - int m_videoPercentSeekBackwardBig; - CStdString m_videoPPFFmpegDeint; - CStdString m_videoPPFFmpegPostProc; -+ int m_videoVDPAUdeintHD; -+ int m_videoVDPAUdeintSD; -+ bool m_videoVDPAUtelecine; -+ int m_videoVDPAUmaxHeight; -+ bool m_videoVDPAUdeintSkipChromaHD; - bool m_musicUseTimeSeeking; - int m_musicTimeSeekForward; - int m_musicTimeSeekBackward; -@@ -143,6 +148,7 @@ - bool m_DXVAForceProcessorRenderer; - bool m_DXVANoDeintProcForProgressive; - int m_videoFpsDetect; -+ bool m_vblankPolling; - - CStdString m_videoDefaultPlayer; - CStdString m_videoDefaultDVDPlayer; -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/GUISettings.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/GUISettings.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/GUISettings.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/GUISettings.cpp 2012-05-14 14:15:12.205221898 +0200 -@@ -588,10 +588,15 @@ - - #ifdef HAVE_LIBVDPAU - AddBool(vp, "videoplayer.usevdpau", 13425, true); -+ AddBool(vp, "videoplayer.usevdpauinteroprgb", 13433, true); -+ AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); - #endif - #ifdef HAVE_LIBVA - AddBool(vp, "videoplayer.usevaapi", 13426, true); - #endif -+#ifdef HAVE_LIBXVBA -+ AddBool(vp, "videoplayer.usexvba", 13435, true); -+#endif - #ifdef HAS_DX - AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false); - #endif -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-pvr-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-pvr-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-05-14 14:15:12.207221938 +0200 -@@ -557,6 +557,40 @@ - pControl->SetEnabled(true); - } - } -+ else if (strSetting.Equals("videoplayer.usevdpauinteropyuv")) -+ { -+ bool hasInterop = false; -+#ifdef GL_NV_vdpau_interop -+ hasInterop = true; -+#endif -+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); -+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ pControl->SetEnabled(true); -+ } -+ else -+ { -+ pControl->SetEnabled(false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); -+ } -+ } -+ else if (strSetting.Equals("videoplayer.usevdpauinteroprgb")) -+ { -+ bool hasInterop = false; -+#ifdef GL_NV_vdpau_interop -+ hasInterop = true; -+#endif -+ CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); -+ if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) -+ { -+ pControl->SetEnabled(true); -+ } -+ else -+ { -+ pControl->SetEnabled(false); -+ g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); -+ } -+ } - else - #endif - if (strSetting.Equals("videoscreen.resolution")) -diff -Naur xbmc-pvr-11.0.1/xbmc/settings/VideoSettings.h xbmc-pvr-11.0.1.patch/xbmc/settings/VideoSettings.h ---- xbmc-pvr-11.0.1/xbmc/settings/VideoSettings.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/settings/VideoSettings.h 2012-05-14 14:15:12.208221958 +0200 -@@ -66,6 +66,8 @@ - VS_INTERLACEMETHOD_SW_BLEND = 20, - VS_INTERLACEMETHOD_AUTO_ION = 21, - -+ VS_INTERLACEMETHOD_XVBA = 22, -+ - VS_INTERLACEMETHOD_MAX // do not use and keep as last enum value. - }; - -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 2012-05-14 14:15:12.208221958 +0200 -@@ -0,0 +1,47 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return 96; -+} -+ -+bool CThread::SetPrioritySched_RR(int iPriority) -+{ -+ // Changing to SCHED_RR is safe under OSX, you don't need elevated privileges and the -+ // OSX scheduler will monitor SCHED_RR threads and drop to SCHED_OTHER if it detects -+ // the thread running away. OSX automatically does this with the CoreAudio audio -+ // device handler thread. -+ int32_t result; -+ thread_extended_policy_data_t theFixedPolicy; -+ -+ // make thread fixed, set to 'true' for a non-fixed thread -+ theFixedPolicy.timeshare = false; -+ result = thread_policy_set(pthread_mach_thread_np(ThreadId()), THREAD_EXTENDED_POLICY, -+ (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT); -+ -+ int policy; -+ struct sched_param param; -+ result = pthread_getschedparam(ThreadId(), &policy, ¶m ); -+ // change from default SCHED_OTHER to SCHED_RR -+ policy = SCHED_RR; -+ result = pthread_setschedparam(ThreadId(), policy, ¶m ); -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/linux/ThreadSchedImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 2012-05-14 14:15:12.209221978 +0200 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return GetNormalPriority(); -+} -+ -+bool CThread::SetPrioritySched_RR(int iPriority) -+{ -+ return false; -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp 2012-05-14 14:15:12.210221998 +0200 -@@ -0,0 +1,220 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+ -+void CThread::Create(bool bAutoDelete, unsigned stacksize) -+{ -+ if (m_ThreadId != 0) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread- old thread id not null", __FUNCTION__); -+ exit(1); -+ } -+ m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -+ m_iLastUsage = 0; -+ m_fLastUsage = 0.0f; -+ m_bAutoDelete = bAutoDelete; -+ m_bStop = false; -+ m_StopEvent.Reset(); -+ m_TermEvent.Reset(); -+ m_StartEvent.Reset(); -+ -+ pthread_attr_t attr; -+ pthread_attr_init(&attr); -+ if (stacksize > PTHREAD_STACK_MIN) -+ pthread_attr_setstacksize(&attr, stacksize); -+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); -+ if (pthread_create(&m_ThreadId, &attr, (void*(*)(void*))staticThread, this) != 0) -+ { -+ CLog::Log(LOGNOTICE, "%s - fatal error creating thread",__FUNCTION__); -+ } -+ pthread_attr_destroy(&attr); -+} -+ -+void CThread::TermHandler() -+{ -+ -+} -+ -+void CThread::SetThreadInfo() -+{ -+ m_ThreadOpaque.LwpId = syscall(SYS_gettid); -+ -+ // start thread with nice level of appication -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ if (setpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId, appNice) != 0) -+ CLog::Log(LOGERROR, "%s: error %s", __FUNCTION__, strerror(errno)); -+} -+ -+ThreadIdentifier CThread::GetCurrentThreadId() -+{ -+ return pthread_self(); -+} -+ -+bool CThread::IsCurrentThread(const ThreadIdentifier tid) -+{ -+ return pthread_equal(pthread_self(), tid); -+} -+ -+int CThread::GetMinPriority(void) -+{ -+ // one level lower than application -+ return -1; -+} -+ -+int CThread::GetMaxPriority(void) -+{ -+ // one level higher than application -+ return 1; -+} -+ -+int CThread::GetNormalPriority(void) -+{ -+ // same level as application -+ return 0; -+} -+ -+bool CThread::SetPriority(const int iPriority) -+{ -+ bool bReturn = false; -+ -+ // wait until thread is running, it needs to get its lwp id -+ m_StartEvent.Wait(); -+ -+ CSingleLock lock(m_CriticalSection); -+ -+ // get min prio for SCHED_RR -+ int minRR = GetMaxPriority() + 1; -+ -+ if (!m_ThreadId) -+ bReturn = false; -+ else if (iPriority >= minRR) -+ bReturn = SetPrioritySched_RR(iPriority); -+ else -+ { -+ // get user max prio -+ struct rlimit limit; -+ int userMaxPrio; -+ if (getrlimit(RLIMIT_NICE, &limit) == 0) -+ { -+ userMaxPrio = limit.rlim_cur - 20; -+ } -+ else -+ userMaxPrio = 0; -+ -+ // keep priority in bounds -+ int prio = iPriority; -+ if (prio >= GetMaxPriority()) -+ prio = std::min(GetMaxPriority(), userMaxPrio); -+ if (prio < GetMinPriority()) -+ prio = GetMinPriority(); -+ -+ // nice level of application -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ if (prio) -+ prio = prio > 0 ? appNice-1 : appNice+1; -+ -+ if (setpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId, prio) == 0) -+ bReturn = true; -+ else -+ CLog::Log(LOGERROR, "%s: error %s", __FUNCTION__, strerror(errno)); -+ } -+ -+ return bReturn; -+} -+ -+int CThread::GetPriority() -+{ -+ int iReturn; -+ -+ // lwp id is valid after start signel has fired -+ m_StartEvent.Wait(); -+ -+ CSingleLock lock(m_CriticalSection); -+ -+ int appNice = getpriority(PRIO_PROCESS, getpid()); -+ int prio = getpriority(PRIO_PROCESS, m_ThreadOpaque.LwpId); -+ iReturn = appNice - prio; -+ -+ return iReturn; -+} -+ -+bool CThread::WaitForThreadExit(unsigned int milliseconds) -+{ -+ bool bReturn = m_TermEvent.WaitMSec(milliseconds); -+ -+ return bReturn; -+} -+ -+int64_t CThread::GetAbsoluteUsage() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ if (!m_ThreadId) -+ return 0; -+ -+ clockid_t clock; -+ int64_t time = 0; -+ if (pthread_getcpuclockid(m_ThreadId, &clock) == 0) -+ { -+ struct timespec tp; -+ clock_gettime(clock, &tp); -+ time = (int64_t)tp.tv_sec * 10000000 + tp.tv_nsec/100; -+ } -+ return time; -+} -+ -+float CThread::GetRelativeUsage() -+{ -+ unsigned int iTime = XbmcThreads::SystemClockMillis(); -+ iTime *= 10000; // convert into 100ns tics -+ -+ // only update every 1 second -+ if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -+ -+ int64_t iUsage = GetAbsoluteUsage(); -+ -+ if (m_iLastUsage > 0 && m_iLastTime > 0) -+ m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -+ -+ m_iLastUsage = iUsage; -+ m_iLastTime = iTime; -+ -+ return m_fLastUsage; -+} -+ -+int64_t CThread::GetCurrentThreadUsage() -+{ -+ pthread_t tid = pthread_self(); -+ clockid_t clock; -+ int64_t time = 0; -+ if (pthread_getcpuclockid(tid, &clock) == 0) -+ { -+ struct timespec tp; -+ clock_gettime(clock, &tp); -+ time = (int64_t)tp.tv_sec * 10000000 + tp.tv_nsec/100; -+ } -+ return time; -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-05-14 14:15:12.210221998 +0200 -@@ -0,0 +1,39 @@ -+/* -+* Copyright (C) 2005-2011 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 -+* -+*/ -+ -+#pragma once -+ -+#include -+ -+struct threadOpaque -+{ -+ pid_t LwpId; -+}; -+ -+typedef pthread_t ThreadIdentifier; -+typedef threadOpaque ThreadOpaque; -+typedef int THREADFUNC; -+ -+namespace XbmcThreads -+{ -+ inline static void ThreadSleep(unsigned int millis) { usleep(millis*1000); } -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.cpp 2012-05-14 14:15:12.211222019 +0200 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#pragma once -+ -+#if (defined TARGET_POSIX) -+#include "threads/platform/pthreads/ThreadImpl.cpp" -+#if defined(TARGET_DARWIN_IOS) -+#include "threads/platform/darwin/ThreadSchedImpl.cpp" -+#else -+#include "threads/platform/linux/ThreadSchedImpl.cpp" -+#endif -+#elif (defined TARGET_WINDOWS) -+#include "threads/platform/win/ThreadImpl.cpp" -+#endif -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/ThreadImpl.h 2012-05-14 14:15:12.211222019 +0200 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#pragma once -+ -+#if (defined TARGET_POSIX) -+#include "threads/platform/pthreads/ThreadImpl.h" -+#elif (defined TARGET_WINDOWS) -+#include "threads/platform/win/ThreadImpl.h" -+#endif -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.cpp 2012-05-14 14:15:12.212222039 +0200 -@@ -0,0 +1,207 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include -+ -+ -+void CThread::Create(bool bAutoDelete, unsigned stacksize) -+{ -+ if (m_ThreadId != 0) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread- old thread id not null", __FUNCTION__); -+ exit(1); -+ } -+ m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -+ m_iLastUsage = 0; -+ m_fLastUsage = 0.0f; -+ m_bAutoDelete = bAutoDelete; -+ m_bStop = false; -+ m_StopEvent.Reset(); -+ m_TermEvent.Reset(); -+ m_StartEvent.Reset(); -+ -+ m_ThreadOpaque.handle = CreateThread(NULL,stacksize, (LPTHREAD_START_ROUTINE)&staticThread, this, 0, &m_ThreadId); -+ if (m_ThreadOpaque.handle == NULL) -+ { -+ CLog::Log(LOGERROR, "%s - fatal error creating thread", __FUNCTION__); -+ } -+} -+ -+void CThread::TermHandler() -+{ -+ CloseHandle(m_ThreadOpaque.handle); -+ m_ThreadOpaque.handle = NULL; -+} -+ -+void CThread::SetThreadInfo() -+{ -+ const unsigned int MS_VC_EXCEPTION = 0x406d1388; -+ struct THREADNAME_INFO -+ { -+ DWORD dwType; // must be 0x1000 -+ LPCSTR szName; // pointer to name (in same addr space) -+ DWORD dwThreadID; // thread ID (-1 caller thread) -+ DWORD dwFlags; // reserved for future use, most be zero -+ } info; -+ -+ info.dwType = 0x1000; -+ info.szName = m_ThreadName.c_str(); -+ info.dwThreadID = m_ThreadId; -+ info.dwFlags = 0; -+ -+ try -+ { -+ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); -+ } -+ catch(...) -+ { -+ } -+} -+ -+ThreadIdentifier CThread::GetCurrentThreadId() -+{ -+ return ::GetCurrentThreadId(); -+} -+ -+bool CThread::IsCurrentThread(const ThreadIdentifier tid) -+{ -+ return (::GetCurrentThreadId() == tid); -+} -+ -+int CThread::GetMinPriority(void) -+{ -+ return(THREAD_PRIORITY_IDLE); -+} -+ -+int CThread::GetMaxPriority(void) -+{ -+ return(THREAD_PRIORITY_HIGHEST); -+} -+ -+int CThread::GetNormalPriority(void) -+{ -+ return(THREAD_PRIORITY_NORMAL); -+} -+ -+int CThread::GetSchedRRPriority(void) -+{ -+ return GetNormalPriority(); -+} -+ -+bool CThread::SetPriority(const int iPriority) -+{ -+ bool bReturn = false; -+ -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadOpaque.handle) -+ { -+ bReturn = SetThreadPriority(m_ThreadOpaque.handle, iPriority) == TRUE; -+ } -+ -+ return bReturn; -+} -+ -+int CThread::GetPriority() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ int iReturn = THREAD_PRIORITY_NORMAL; -+ if (m_ThreadOpaque.handle) -+ { -+ iReturn = GetThreadPriority(m_ThreadOpaque.handle); -+ } -+ return iReturn; -+} -+ -+bool CThread::WaitForThreadExit(unsigned int milliseconds) -+{ -+ bool bReturn = true; -+ -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadId && m_ThreadOpaque.handle != NULL) -+ { -+ // boost priority of thread we are waiting on to same as caller -+ int callee = GetThreadPriority(m_ThreadOpaque.handle); -+ int caller = GetThreadPriority(GetCurrentThread()); -+ if(caller > callee) -+ SetThreadPriority(m_ThreadOpaque.handle, caller); -+ -+ lock.Leave(); -+ bReturn = m_TermEvent.WaitMSec(milliseconds); -+ lock.Enter(); -+ -+ // restore thread priority if thread hasn't exited -+ if(caller > callee && m_ThreadOpaque.handle) -+ SetThreadPriority(m_ThreadOpaque.handle, callee); -+ } -+ return bReturn; -+} -+ -+int64_t CThread::GetAbsoluteUsage() -+{ -+ CSingleLock lock(m_CriticalSection); -+ -+ if (!m_ThreadOpaque.handle) -+ return 0; -+ -+ uint64_t time = 0; -+ FILETIME CreationTime, ExitTime, UserTime, KernelTime; -+ if( GetThreadTimes(m_ThreadOpaque.handle, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -+ { -+ time = (((uint64_t)UserTime.dwHighDateTime) << 32) + ((uint64_t)UserTime.dwLowDateTime); -+ time += (((uint64_t)KernelTime.dwHighDateTime) << 32) + ((uint64_t)KernelTime.dwLowDateTime); -+ } -+ return time; -+} -+ -+float CThread::GetRelativeUsage() -+{ -+ unsigned int iTime = XbmcThreads::SystemClockMillis(); -+ iTime *= 10000; // convert into 100ns tics -+ -+ // only update every 1 second -+ if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -+ -+ int64_t iUsage = GetAbsoluteUsage(); -+ -+ if (m_iLastUsage > 0 && m_iLastTime > 0) -+ m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -+ -+ m_iLastUsage = iUsage; -+ m_iLastTime = iTime; -+ -+ return m_fLastUsage; -+} -+ -+int64_t CThread::GetCurrentThreadUsage() -+{ -+ HANDLE h = GetCurrentThread(); -+ -+ uint64_t time = 0; -+ FILETIME CreationTime, ExitTime, UserTime, KernelTime; -+ if( GetThreadTimes(h, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -+ { -+ time = (((uint64_t)UserTime.dwHighDateTime) << 32) + ((uint64_t)UserTime.dwLowDateTime); -+ time += (((uint64_t)KernelTime.dwHighDateTime) << 32) + ((uint64_t)KernelTime.dwLowDateTime); -+ } -+ return time; -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/platform/win/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/platform/win/ThreadImpl.h 2012-05-14 14:15:12.212222039 +0200 -@@ -0,0 +1,40 @@ -+/* -+* Copyright (C) 2005-2011 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 -+* -+*/ -+ -+#pragma once -+ -+#include -+ -+ -+struct threadOpaque -+{ -+ HANDLE handle; -+}; -+ -+typedef DWORD ThreadIdentifier; -+typedef threadOpaque ThreadOpaque; -+typedef DWORD THREADFUNC; -+ -+namespace XbmcThreads -+{ -+ inline static void ThreadSleep(unsigned int millis) { Sleep(millis); } -+} -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/Thread.cpp xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.cpp ---- xbmc-pvr-11.0.1/xbmc/threads/Thread.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.cpp 2012-05-14 14:15:12.214222079 +0200 -@@ -20,41 +20,27 @@ - - #include "threads/SystemClock.h" - #include "Thread.h" --#ifndef _LINUX --#include --#include "utils/win32exception.h" --#ifndef _MT --#pragma message( "Please compile using multithreaded run-time libraries" ) --#endif --typedef unsigned (WINAPI *PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter); --#else --#include "PlatformInclude.h" --#include "XHandle.h" --#include --typedef int (*PBEGINTHREADEX_THREADFUNC)(LPVOID lpThreadParameter); --#endif -- --#if defined(__GNUC__) && !defined(__clang__) --#include --using namespace __cxxabiv1; --#endif -- - #include "utils/log.h" - #include "utils/TimeUtils.h" - #include "threads/ThreadLocal.h" - -+#define __STDC_FORMAT_MACROS -+#include -+ - static XbmcThreads::ThreadLocal currentThread; - -+#include "threads/platform/ThreadImpl.cpp" -+ - ////////////////////////////////////////////////////////////////////// - // Construction/Destruction - ////////////////////////////////////////////////////////////////////// - --CThread::CThread(const char* ThreadName) : m_StopEvent(true,true) -+CThread::CThread(const char* ThreadName) -+: m_StopEvent(true,true), m_TermEvent(true), m_StartEvent(true) - { - m_bStop = false; - - m_bAutoDelete = false; -- m_ThreadHandle = NULL; - m_ThreadId = 0; - m_iLastTime = 0; - m_iLastUsage = 0; -@@ -66,12 +52,12 @@ - m_ThreadName = ThreadName; - } - --CThread::CThread(IRunnable* pRunnable, const char* ThreadName) : m_StopEvent(true,true) -+CThread::CThread(IRunnable* pRunnable, const char* ThreadName) -+: m_StopEvent(true,true), m_TermEvent(true), m_StartEvent(true) - { - m_bStop = false; - - m_bAutoDelete = false; -- m_ThreadHandle = NULL; - m_ThreadId = 0; - m_iLastTime = 0; - m_iLastUsage = 0; -@@ -85,171 +71,62 @@ - - CThread::~CThread() - { -- if (m_ThreadHandle != NULL) -- { -- CloseHandle(m_ThreadHandle); -- } -- m_ThreadHandle = NULL; -- -+ StopThread(); - } - --#ifndef _WIN32 --void CThread::term_handler (int signum) -+bool CThread::IsRunning() - { -- CLog::Log(LOGERROR,"thread 0x%lx (%lu) got signal %d. calling OnException and terminating thread abnormally.", (long unsigned int)pthread_self(), (long unsigned int)pthread_self(), signum); -- -- CThread* curThread = currentThread.get(); -- if (curThread) -- { -- curThread->m_bStop = TRUE; -- curThread->m_StopEvent.Set(); -- -- curThread->OnException(); -- if( curThread->IsAutoDelete() ) -- delete curThread; -- } -- -- pthread_exit(NULL); -+ return m_ThreadId ? true : false; - } - --int CThread::staticThread(void* data) --#else --DWORD WINAPI CThread::staticThread(LPVOID* data) --#endif -+THREADFUNC CThread::staticThread(void* data) - { - CThread* pThread = (CThread*)(data); -+ std::string name; -+ ThreadIdentifier id; -+ bool autodelete; -+ - if (!pThread) { - CLog::Log(LOGERROR,"%s, sanity failed. thread is NULL.",__FUNCTION__); - return 1; - } - -- if (pThread->m_ThreadName.empty()) -- pThread->m_ThreadName = pThread->GetTypeName(); -- pThread->SetDebugCallStackName(pThread->m_ThreadName.c_str()); -+ name = pThread->m_ThreadName; -+ id = pThread->m_ThreadId; -+ autodelete = pThread->m_bAutoDelete; - -- CLog::Log(LOGDEBUG,"Thread %s start, auto delete: %d", pThread->m_ThreadName.c_str(), pThread->IsAutoDelete()); -+ pThread->SetThreadInfo(); -+ -+ CLog::Log(LOGNOTICE,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false")); - - currentThread.set(pThread); --#ifndef _LINUX -- /* install win32 exception translator */ -- win32_exception::install_handler(); --#else -- struct sigaction action; -- action.sa_handler = term_handler; -- sigemptyset (&action.sa_mask); -- action.sa_flags = 0; -- //sigaction (SIGABRT, &action, NULL); -- //sigaction (SIGSEGV, &action, NULL); --#endif -+ pThread->m_StartEvent.Set(); - -+ pThread->OnStartup(); -+ pThread->Process(); -+ pThread->OnExit(); - -- try -- { -- pThread->OnStartup(); -- } --#ifndef _LINUX -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- if( pThread->IsAutoDelete() ) -- { -- delete pThread; -- _endthreadex(123); -- return 0; -- } -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread startup, aborting. auto delete: %d", __FUNCTION__, pThread->m_ThreadName.c_str(), pThread->IsAutoDelete()); -- if( pThread->IsAutoDelete() ) -- { -- delete pThread; --#ifndef _LINUX -- _endthreadex(123); --#endif -- return 0; -- } -- } -+ // lock during termination -+ CSingleLock lock(pThread->m_CriticalSection); - -- try -- { -- pThread->Process(); -- } --#ifndef _LINUX -- catch (const access_violation &e) -- { -- e.writelog(__FUNCTION__); -- } -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread process, attemping cleanup in OnExit", __FUNCTION__, pThread->m_ThreadName.c_str()); -- } -+ pThread->m_ThreadId = 0; -+ pThread->m_TermEvent.Set(); -+ pThread->TermHandler(); - -- try -- { -- pThread->OnExit(); -- } --#ifndef _LINUX -- catch (const access_violation &e) -- { -- e.writelog(__FUNCTION__); -- } -- catch (const win32_exception &e) -- { -- e.writelog(__FUNCTION__); -- } --#endif -- catch(...) -- { -- CLog::Log(LOGERROR, "%s - thread %s, Unhandled exception caught in thread exit", __FUNCTION__, pThread->m_ThreadName.c_str()); -- } -+ lock.Leave(); - -- if ( pThread->IsAutoDelete() ) -+ if (autodelete) - { -- CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating (autodelete)", pThread->m_ThreadName.c_str(), (uint64_t)CThread::GetCurrentThreadId()); -+ CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating (autodelete)", name.c_str(), (uint64_t)id); - delete pThread; - pThread = NULL; - } - else -- CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating", pThread->m_ThreadName.c_str(), (uint64_t)CThread::GetCurrentThreadId()); -- --// DXMERGE - this looks like it might have used to have been useful for something... --// g_graphicsContext.DeleteThreadContext(); -+ CLog::Log(LOGDEBUG,"Thread %s %"PRIu64" terminating", name.c_str(), (uint64_t)id); - --#ifndef _LINUX -- _endthreadex(123); --#endif - return 0; - } - --void CThread::Create(bool bAutoDelete, unsigned stacksize) --{ -- if (m_ThreadHandle != NULL) -- { -- throw 1; //ERROR should not b possible!!! -- } -- m_iLastTime = XbmcThreads::SystemClockMillis() * 10000; -- m_iLastUsage = 0; -- m_fLastUsage = 0.0f; -- m_bAutoDelete = bAutoDelete; -- m_bStop = false; -- m_StopEvent.Reset(); -- -- m_ThreadHandle = (HANDLE)_beginthreadex(NULL, stacksize, (PBEGINTHREADEX_THREADFUNC)staticThread, (void*)this, 0, &m_ThreadId); -- --#ifdef _LINUX -- if (m_ThreadHandle && m_ThreadHandle->m_threadValid && m_bAutoDelete) -- // FIXME: WinAPI can truncate 64bit pthread ids -- pthread_detach(m_ThreadHandle->m_hThread); --#endif --} -- - bool CThread::IsAutoDelete() const - { - return m_bAutoDelete; -@@ -259,213 +136,17 @@ - { - m_bStop = true; - m_StopEvent.Set(); -- if (m_ThreadHandle && bWait) -+ CSingleLock lock(m_CriticalSection); -+ if (m_ThreadId && bWait) - { -- WaitForThreadExit(INFINITE); -- CloseHandle(m_ThreadHandle); -- m_ThreadHandle = NULL; -+ lock.Leave(); -+ WaitForThreadExit(0xFFFFFFFF); - } - } - - ThreadIdentifier CThread::ThreadId() const - { --#ifdef _LINUX -- if (m_ThreadHandle && m_ThreadHandle->m_threadValid) -- return m_ThreadHandle->m_hThread; -- else -- return 0; --#else - return m_ThreadId; --#endif --} -- -- --CThread::operator HANDLE() --{ -- return m_ThreadHandle; --} -- --CThread::operator HANDLE() const --{ -- return m_ThreadHandle; --} -- --bool CThread::SetPriority(const int iPriority) --// Set thread priority --// Return true for success --{ -- bool rtn = false; -- -- if (m_ThreadHandle) -- { -- rtn = SetThreadPriority( m_ThreadHandle, iPriority ) == TRUE; -- } -- -- return(rtn); --} -- --void CThread::SetPrioritySched_RR(void) --{ --#ifdef __APPLE__ -- // Changing to SCHED_RR is safe under OSX, you don't need elevated privileges and the -- // OSX scheduler will monitor SCHED_RR threads and drop to SCHED_OTHER if it detects -- // the thread running away. OSX automatically does this with the CoreAudio audio -- // device handler thread. -- int32_t result; -- thread_extended_policy_data_t theFixedPolicy; -- -- // make thread fixed, set to 'true' for a non-fixed thread -- theFixedPolicy.timeshare = false; -- result = thread_policy_set(pthread_mach_thread_np(ThreadId()), THREAD_EXTENDED_POLICY, -- (thread_policy_t)&theFixedPolicy, THREAD_EXTENDED_POLICY_COUNT); -- -- int policy; -- struct sched_param param; -- result = pthread_getschedparam(ThreadId(), &policy, ¶m ); -- // change from default SCHED_OTHER to SCHED_RR -- policy = SCHED_RR; -- result = pthread_setschedparam(ThreadId(), policy, ¶m ); --#endif --} -- --int CThread::GetMinPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int min = sched_get_priority_min(policy); -- -- return(min); --#else -- return(THREAD_PRIORITY_IDLE); --#endif --} -- --int CThread::GetMaxPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int max = sched_get_priority_max(policy); -- -- return(max); --#else -- return(THREAD_PRIORITY_HIGHEST); --#endif --} -- --int CThread::GetNormalPriority(void) --{ --#if 0 --//#if defined(__APPLE__) -- struct sched_param sched; -- int rtn, policy; -- -- rtn = pthread_getschedparam(ThreadId(), &policy, &sched); -- int min = sched_get_priority_min(policy); -- int max = sched_get_priority_max(policy); -- -- return( min + ((max-min) / 2) ); --#else -- return(THREAD_PRIORITY_NORMAL); --#endif --} -- -- --void CThread::SetDebugCallStackName( const char *name ) --{ --#ifdef _WIN32 -- const unsigned int MS_VC_EXCEPTION = 0x406d1388; -- struct THREADNAME_INFO -- { -- DWORD dwType; // must be 0x1000 -- LPCSTR szName; // pointer to name (in same addr space) -- DWORD dwThreadID; // thread ID (-1 caller thread) -- DWORD dwFlags; // reserved for future use, most be zero -- } info; -- -- info.dwType = 0x1000; -- info.szName = name; -- info.dwThreadID = m_ThreadId; -- info.dwFlags = 0; -- -- try -- { -- RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info); -- } -- catch(...) -- { -- } --#endif --} -- --// Get the thread name using the implementation dependant typeid() class --// and attempt to clean it. --std::string CThread::GetTypeName(void) --{ -- std::string name = typeid(*this).name(); -- --#if defined(_MSC_VER) -- // Visual Studio 2010 returns the name as "class CThread" etc -- if (name.substr(0, 6) == "class ") -- name = name.substr(6, name.length() - 6); --#elif defined(__GNUC__) && !defined(__clang__) -- // gcc provides __cxa_demangle to demangle the name -- char* demangled = NULL; -- int status; -- -- demangled = __cxa_demangle(name.c_str(), NULL, 0, &status); -- if (status == 0) -- name = demangled; -- else -- CLog::Log(LOGDEBUG,"%s, __cxa_demangle(%s) failed with status %d", __FUNCTION__, name.c_str(), status); -- -- if (demangled) -- free(demangled); --#endif -- -- return name; --} -- --bool CThread::WaitForThreadExit(unsigned int milliseconds) --// Waits for thread to exit, timeout in given number of msec. --// Returns true when thread ended --{ -- if (!m_ThreadHandle) return true; -- --#ifndef _LINUX -- // boost priority of thread we are waiting on to same as caller -- int callee = GetThreadPriority(m_ThreadHandle); -- int caller = GetThreadPriority(GetCurrentThread()); -- if(caller > callee) -- SetThreadPriority(m_ThreadHandle, caller); -- -- if (::WaitForSingleObject(m_ThreadHandle, milliseconds) != WAIT_TIMEOUT) -- return true; -- -- // restore thread priority if thread hasn't exited -- if(caller > callee) -- SetThreadPriority(m_ThreadHandle, callee); --#else -- if (!(m_ThreadHandle->m_threadValid) || pthread_join(m_ThreadHandle->m_hThread, NULL) == 0) -- { -- m_ThreadHandle->m_threadValid = false; -- return true; -- } --#endif -- -- return false; --} -- --HANDLE CThread::ThreadHandle() --{ -- return m_ThreadHandle; - } - - void CThread::Process() -@@ -474,54 +155,14 @@ - m_pRunnable->Run(); - } - --float CThread::GetRelativeUsage() --{ -- unsigned __int64 iTime = XbmcThreads::SystemClockMillis(); -- iTime *= 10000; // convert into 100ns tics -- -- // only update every 1 second -- if( iTime < m_iLastTime + 1000*10000 ) return m_fLastUsage; -- -- FILETIME CreationTime, ExitTime, UserTime, KernelTime; -- if( GetThreadTimes( m_ThreadHandle, &CreationTime, &ExitTime, &KernelTime, &UserTime ) ) -- { -- unsigned __int64 iUsage = 0; -- iUsage += (((unsigned __int64)UserTime.dwHighDateTime) << 32) + ((unsigned __int64)UserTime.dwLowDateTime); -- iUsage += (((unsigned __int64)KernelTime.dwHighDateTime) << 32) + ((unsigned __int64)KernelTime.dwLowDateTime); -- -- if(m_iLastUsage > 0 && m_iLastTime > 0) -- m_fLastUsage = (float)( iUsage - m_iLastUsage ) / (float)( iTime - m_iLastTime ); -- -- m_iLastUsage = iUsage; -- m_iLastTime = iTime; -- -- return m_fLastUsage; -- } -- return 0.0f; --} -- - bool CThread::IsCurrentThread() const - { - return IsCurrentThread(ThreadId()); - } - -- --ThreadIdentifier CThread::GetCurrentThreadId() -+CThread* CThread::GetCurrentThread() - { --#ifdef _LINUX -- return pthread_self(); --#else -- return ::GetCurrentThreadId(); --#endif --} -- --bool CThread::IsCurrentThread(const ThreadIdentifier tid) --{ --#ifdef _LINUX -- return pthread_equal(pthread_self(), tid); --#else -- return (::GetCurrentThreadId() == tid); --#endif -+ return currentThread.get(); - } - - void CThread::Sleep(unsigned int milliseconds) -@@ -529,7 +170,7 @@ - if(milliseconds > 10 && IsCurrentThread()) - m_StopEvent.WaitMSec(milliseconds); - else -- ::Sleep(milliseconds); -+ XbmcThreads::ThreadSleep(milliseconds); - } - - -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/Thread.h xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.h ---- xbmc-pvr-11.0.1/xbmc/threads/Thread.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/Thread.h 2012-05-14 14:15:12.215222099 +0200 -@@ -23,19 +23,13 @@ - // - ////////////////////////////////////////////////////////////////////// - --#if !defined(AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_) && !defined(AFX_THREAD_H__67621B15_8724_4B5D_9343_7667075C89F2__INCLUDED_) --#define AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_ -- --#if _MSC_VER > 1000 - #pragma once --#endif // _MSC_VER > 1000 - - #include --#include "system.h" // for HANDLE --#ifdef _LINUX --#include "PlatformInclude.h" --#endif -+#include - #include "Event.h" -+#include "threads/ThreadImpl.h" -+#include "threads/ThreadLocal.h" - - class IRunnable - { -@@ -44,37 +38,36 @@ - virtual ~IRunnable() {} - }; - --#ifdef CTHREAD --#undef CTHREAD --#endif -- - // minimum as mandated by XTL - #define THREAD_MINSTACKSIZE 0x10000 - - class CThread - { - public: -- CThread(const char* ThreadName = NULL); -- CThread(IRunnable* pRunnable, const char* ThreadName = NULL); -+ CThread(const char* ThreadName); -+ CThread(IRunnable* pRunnable, const char* ThreadName); - virtual ~CThread(); - void Create(bool bAutoDelete = false, unsigned stacksize = 0); - bool WaitForThreadExit(unsigned int milliseconds); - void Sleep(unsigned int milliseconds); - bool SetPriority(const int iPriority); -- void SetPrioritySched_RR(void); -+ int GetPriority(void); - int GetMinPriority(void); - int GetMaxPriority(void); - int GetNormalPriority(void); -- HANDLE ThreadHandle(); -- operator HANDLE(); -- operator HANDLE() const; -+ int GetSchedRRPriority(void); -+ bool SetPrioritySched_RR(int iPriority); - bool IsAutoDelete() const; - virtual void StopThread(bool bWait = true); - float GetRelativeUsage(); // returns the relative cpu usage of this thread since last call -+ int64_t GetAbsoluteUsage(); - bool IsCurrentThread() const; -+ bool IsRunning(); - - static bool IsCurrentThread(const ThreadIdentifier tid); - static ThreadIdentifier GetCurrentThreadId(); -+ static CThread* GetCurrentThread(); -+ static int64_t GetCurrentThreadUsage(); - protected: - virtual void OnStartup(){}; - virtual void OnExit(){}; -@@ -82,7 +75,6 @@ - virtual void Process(); - - volatile bool m_bStop; -- HANDLE m_ThreadHandle; - - enum WaitResponse { WAIT_INTERRUPTED = -1, WAIT_SIGNALED = 0, WAIT_TIMEDOUT = 1 }; - -@@ -108,36 +100,22 @@ - } - - private: -- /*! \brief set the threadname for the debugger/callstack, implementation dependent. -- */ -- void SetDebugCallStackName( const char *threadName ); -- std::string GetTypeName(void); -- --private: -+ static THREADFUNC staticThread(void *data); - ThreadIdentifier ThreadId() const; -+ void SetThreadInfo(); -+ void TermHandler(); -+ -+ ThreadIdentifier m_ThreadId; -+ ThreadOpaque m_ThreadOpaque; - bool m_bAutoDelete; - CEvent m_StopEvent; -- unsigned m_ThreadId; // This value is unreliable on platforms using pthreads -- // Use m_ThreadHandle->m_hThread instead -+ CEvent m_TermEvent; -+ CEvent m_StartEvent; -+ CCriticalSection m_CriticalSection; - IRunnable* m_pRunnable; -- -- unsigned __int64 m_iLastUsage; -- unsigned __int64 m_iLastTime; -+ uint64_t m_iLastUsage; -+ uint64_t m_iLastTime; - float m_fLastUsage; - - std::string m_ThreadName; -- --#ifdef _LINUX -- static void term_handler (int signum); --#endif -- --#ifndef _WIN32 -- static int staticThread(void* data); --#else -- static DWORD WINAPI staticThread(LPVOID* data); --#endif -- --private: - }; -- --#endif // !defined(AFX_THREAD_H__ACFB7357_B961_4AC1_9FB2_779526219817__INCLUDED_) -diff -Naur xbmc-pvr-11.0.1/xbmc/threads/ThreadImpl.h xbmc-pvr-11.0.1.patch/xbmc/threads/ThreadImpl.h ---- xbmc-pvr-11.0.1/xbmc/threads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/threads/ThreadImpl.h 2012-05-14 14:15:12.215222099 +0200 -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#pragma once -+ -+#include "threads/platform/ThreadImpl.h" -+ -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.cpp 2012-05-14 14:15:12.216222119 +0200 -@@ -0,0 +1,254 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include "ActorProtocol.h" -+ -+using namespace Actor; -+ -+void Message::Release() -+{ -+ bool skip; -+ origin->Lock(); -+ skip = isSync ? !isSyncFini : false; -+ isSyncFini = true; -+ origin->Unlock(); -+ -+ if (skip) -+ return; -+ -+ // free data buffer -+ if (data != buffer) -+ delete [] data; -+ -+ // delete event in case of sync message -+ if (event) -+ delete event; -+ -+ origin->ReturnMessage(this); -+} -+ -+bool Message::Reply(int sig, void *data /* = NULL*/, int size /* = 0 */) -+{ -+ if (!isSync) -+ { -+ if (isOut) -+ return origin->SendInMessage(sig, data, size); -+ else -+ return origin->SendOutMessage(sig, data, size); -+ } -+ -+ origin->Lock(); -+ -+ if (!isSyncTimeout) -+ { -+ Message *msg = origin->GetMessage(); -+ msg->signal = sig; -+ msg->isOut = !isOut; -+ replyMessage = msg; -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ } -+ -+ origin->Unlock(); -+ -+ if (event) -+ event->Set(); -+ -+ return true; -+} -+ -+Protocol::~Protocol() -+{ -+ Message *msg; -+ Purge(); -+ while (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ delete msg; -+ } -+} -+ -+Message *Protocol::GetMessage() -+{ -+ Message *msg; -+ -+ CSingleLock lock(criticalSection); -+ -+ if (!freeMessageQueue.empty()) -+ { -+ msg = freeMessageQueue.front(); -+ freeMessageQueue.pop(); -+ } -+ else -+ msg = new Message(); -+ -+ msg->isSync = false; -+ msg->isSyncFini = false; -+ msg->isSyncTimeout = false; -+ msg->event = NULL; -+ msg->data = NULL; -+ msg->payloadSize = 0; -+ msg->replyMessage = NULL; -+ msg->origin = this; -+ -+ return msg; -+} -+ -+void Protocol::ReturnMessage(Message *msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ freeMessageQueue.push(msg); -+} -+ -+bool Protocol::SendOutMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = true; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ outMessages.push(msg); -+ } -+ containerOutEvent->Set(); -+ -+ return true; -+} -+ -+bool Protocol::SendInMessage(int signal, void *data /* = NULL */, int size /* = 0 */, Message *outMsg /* = NULL */) -+{ -+ Message *msg; -+ if (outMsg) -+ msg = outMsg; -+ else -+ msg = GetMessage(); -+ -+ msg->signal = signal; -+ msg->isOut = false; -+ -+ if (data) -+ { -+ if (size > MSG_INTERNAL_BUFFER_SIZE) -+ msg->data = new uint8_t[size]; -+ else -+ msg->data = msg->buffer; -+ memcpy(msg->data, data, size); -+ } -+ -+ { CSingleLock lock(criticalSection); -+ inMessages.push(msg); -+ } -+ containerInEvent->Set(); -+ -+ return true; -+} -+ -+ -+bool Protocol::SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data /* = NULL */, int size /* = 0 */) -+{ -+ Message *msg = GetMessage(); -+ msg->isOut = true; -+ msg->isSync = true; -+ msg->event = new CEvent; -+ msg->event->Reset(); -+ SendOutMessage(signal, data, size, msg); -+ -+ if (!msg->event->WaitMSec(timeout)) -+ { -+ msg->origin->Lock(); -+ if (msg->replyMessage) -+ *retMsg = msg->replyMessage; -+ else -+ { -+ *retMsg = NULL; -+ msg->isSyncTimeout = true; -+ } -+ msg->origin->Unlock(); -+ } -+ else -+ *retMsg = msg->replyMessage; -+ -+ msg->Release(); -+ -+ if (*retMsg) -+ return true; -+ else -+ return false; -+} -+ -+bool Protocol::ReceiveOutMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (outMessages.empty() || outDefered) -+ return false; -+ -+ *msg = outMessages.front(); -+ outMessages.pop(); -+ -+ return true; -+} -+ -+bool Protocol::ReceiveInMessage(Message **msg) -+{ -+ CSingleLock lock(criticalSection); -+ -+ if (inMessages.empty() || inDefered) -+ return false; -+ -+ *msg = inMessages.front(); -+ inMessages.pop(); -+ -+ return true; -+} -+ -+ -+void Protocol::Purge() -+{ -+ Message *msg; -+ -+ while (ReceiveInMessage(&msg)) -+ msg->Release(); -+ -+ while (ReceiveOutMessage(&msg)) -+ msg->Release(); -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.h xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.h ---- xbmc-pvr-11.0.1/xbmc/utils/ActorProtocol.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/ActorProtocol.h 2012-05-14 14:15:12.217222140 +0200 -@@ -0,0 +1,89 @@ -+ -+#pragma once -+ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include "threads/Thread.h" -+#include "utils/log.h" -+#include -+#include "memory.h" -+ -+#define MSG_INTERNAL_BUFFER_SIZE 32 -+ -+namespace Actor -+{ -+ -+class Protocol; -+ -+class Message -+{ -+ friend class Protocol; -+public: -+ int signal; -+ bool isSync; -+ bool isSyncFini; -+ bool isOut; -+ bool isSyncTimeout; -+ int payloadSize; -+ uint8_t buffer[MSG_INTERNAL_BUFFER_SIZE]; -+ uint8_t *data; -+ Message *replyMessage; -+ Protocol *origin; -+ CEvent *event; -+ -+ void Release(); -+ bool Reply(int sig, void *data = NULL, int size = 0); -+ -+private: -+ Message() {isSync = false; data = NULL; event = NULL; replyMessage = NULL;}; -+}; -+ -+class Protocol -+{ -+public: -+ Protocol(std::string name, CEvent* inEvent, CEvent *outEvent) -+ : inDefered(false), outDefered(false), portName(name) {containerInEvent = inEvent; containerOutEvent = outEvent;}; -+ virtual ~Protocol(); -+ Message *GetMessage(); -+ void ReturnMessage(Message *msg); -+ bool SendOutMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendInMessage(int signal, void *data = NULL, int size = 0, Message *outMsg = NULL); -+ bool SendOutMessageSync(int signal, Message **retMsg, int timeout, void *data = NULL, int size = 0); -+ bool ReceiveOutMessage(Message **msg); -+ bool ReceiveInMessage(Message **msg); -+ void Purge(); -+ void DeferIn(bool value) {inDefered = value;}; -+ void DeferOut(bool value) {outDefered = value;}; -+ void Lock() {criticalSection.lock();}; -+ void Unlock() {criticalSection.unlock();}; -+ std::string portName; -+ -+protected: -+ CEvent *containerInEvent, *containerOutEvent; -+ CCriticalSection criticalSection; -+ std::queue outMessages; -+ std::queue inMessages; -+ std::queue freeMessageQueue; -+ bool inDefered, outDefered; -+}; -+ -+} -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/AlarmClock.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/AlarmClock.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/AlarmClock.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/AlarmClock.cpp 2012-05-14 14:15:12.217222140 +0200 -@@ -28,7 +28,7 @@ - - using namespace std; - --CAlarmClock::CAlarmClock() : m_bIsRunning(false) -+CAlarmClock::CAlarmClock() : CThread("CAlarmClock"), m_bIsRunning(false) - { - } - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/AsyncFileCopy.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/AsyncFileCopy.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/AsyncFileCopy.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/AsyncFileCopy.cpp 2012-05-14 14:15:12.218222160 +0200 -@@ -26,7 +26,7 @@ - #include "log.h" - #include "utils/TimeUtils.h" - --CAsyncFileCopy::CAsyncFileCopy() -+CAsyncFileCopy::CAsyncFileCopy() : CThread("CAsyncFileCopy") - { - m_cancelled = false; - m_succeeded = false; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.cpp 2012-05-14 14:15:12.218222160 +0200 -@@ -32,7 +32,7 @@ - - WORD CDownloadQueue::m_wNextQueueId = 0; - --CDownloadQueue::CDownloadQueue(void) : CThread() -+CDownloadQueue::CDownloadQueue(void) : CThread("CDownloadQueue") - { - m_bStop = false; - m_wQueueId = m_wNextQueueId++; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.h xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.h ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueue.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueue.h 2012-05-14 14:15:12.219222180 +0200 -@@ -26,6 +26,8 @@ - #include "threads/CriticalSection.h" - #include "StdString.h" - -+#include "system.h" -+ - struct TICKET - { - TICKET(WORD aQueueId, DWORD aItemId) -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/DownloadQueueManager.h xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueueManager.h ---- xbmc-pvr-11.0.1/xbmc/utils/DownloadQueueManager.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/DownloadQueueManager.h 2012-05-14 14:15:12.220222200 +0200 -@@ -22,6 +22,7 @@ - */ - - #include "DownloadQueue.h" -+#include "system.h" - - #define MAX_DOWNLOAD_QUEUES 3 - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/JobManager.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/JobManager.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/JobManager.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/JobManager.cpp 2012-05-14 14:15:12.220222200 +0200 -@@ -24,6 +24,9 @@ - #include "threads/SingleLock.h" - #include "utils/log.h" - -+#include "system.h" -+ -+ - using namespace std; - - bool CJob::ShouldCancel(unsigned int progress, unsigned int total) const -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/LCD.h xbmc-pvr-11.0.1.patch/xbmc/utils/LCD.h ---- xbmc-pvr-11.0.1/xbmc/utils/LCD.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/LCD.h 2012-05-14 14:15:12.221222220 +0200 -@@ -68,8 +68,9 @@ - void LoadSkin(const CStdString &xmlFile); - void Reset(); - void Render(LCD_MODE mode); -- ILCD() : m_disableOnPlay(DISABLE_ON_PLAY_NONE), -- m_eCurrentCharset(CUSTOM_CHARSET_DEFAULT) {} -+ ILCD() : CThread("ILCD"), -+ m_disableOnPlay(DISABLE_ON_PLAY_NONE), -+ m_eCurrentCharset(CUSTOM_CHARSET_DEFAULT) {} - protected: - virtual void Process() = 0; - void StringToLCDCharSet(CStdString& strText); -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/Makefile xbmc-pvr-11.0.1.patch/xbmc/utils/Makefile ---- xbmc-pvr-11.0.1/xbmc/utils/Makefile 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/Makefile 2012-05-14 14:15:12.222222240 +0200 -@@ -59,6 +59,7 @@ - Weather.cpp \ - Win32Exception.cpp \ - XMLUtils.cpp \ -+ ActorProtocol.cpp \ - - LIB=utils.a - -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/RssReader.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/RssReader.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.cpp 2012-05-14 14:15:12.223222260 +0200 -@@ -44,7 +44,7 @@ - // Construction/Destruction - ////////////////////////////////////////////////////////////////////// - --CRssReader::CRssReader() : CThread() -+CRssReader::CRssReader() : CThread("CRssReader") - { - m_pObserver = NULL; - m_spacesBetweenFeeds = 0; -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/RssReader.h xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.h ---- xbmc-pvr-11.0.1/xbmc/utils/RssReader.h 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/RssReader.h 2012-05-14 14:15:12.223222260 +0200 -@@ -39,6 +39,9 @@ - - #include "tinyXML/tinyxml.h" - -+#include "system.h" -+ -+ - #define RSS_COLOR_BODY 0 - #define RSS_COLOR_HEADLINE 1 - #define RSS_COLOR_CHANNEL 2 -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/Splash.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/Splash.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/Splash.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/Splash.cpp 2012-05-14 14:15:12.224222280 +0200 -@@ -31,7 +31,7 @@ - - using namespace XFILE; - --CSplash::CSplash(const CStdString& imageName) -+CSplash::CSplash(const CStdString& imageName) : CThread("CSplash") - { - m_ImageName = imageName; - fade = 0.5; -@@ -139,5 +139,5 @@ - - bool CSplash::IsRunning() - { -- return (m_ThreadHandle != NULL); -+ return (IsRunning()); - } -diff -Naur xbmc-pvr-11.0.1/xbmc/utils/TuxBoxUtil.cpp xbmc-pvr-11.0.1.patch/xbmc/utils/TuxBoxUtil.cpp ---- xbmc-pvr-11.0.1/xbmc/utils/TuxBoxUtil.cpp 2012-03-27 17:55:37.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/utils/TuxBoxUtil.cpp 2012-05-14 14:15:12.225222300 +0200 -@@ -48,7 +48,7 @@ - CTuxBoxUtil g_tuxbox; - CTuxBoxService g_tuxboxService; - --CTuxBoxService::CTuxBoxService() -+CTuxBoxService::CTuxBoxService() : CThread("CTuxBoxService") - { - } - CTuxBoxService::~CTuxBoxService() -diff -Naur xbmc-pvr-11.0.1/xbmc/video/dialogs/GUIDialogVideoSettings.cpp xbmc-pvr-11.0.1.patch/xbmc/video/dialogs/GUIDialogVideoSettings.cpp ---- xbmc-pvr-11.0.1/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2012-05-14 14:14:51.709808795 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/dialogs/GUIDialogVideoSettings.cpp 2012-05-14 14:15:12.226222321 +0200 -@@ -107,12 +107,12 @@ - entries.push_back(make_pair(VS_INTERLACEMETHOD_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL , 16311)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL , 16310)); -- entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16021)); -+ entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_BOB , 16326)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF, 16318)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF , 16317)); -- entries.push_back(make_pair(VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE , 16314)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BOB , 16320)); - entries.push_back(make_pair(VS_INTERLACEMETHOD_DXVA_BEST , 16321)); -+ entries.push_back(make_pair(VS_INTERLACEMETHOD_XVBA , 16327)); - - /* remove unsupported methods */ - for(vector >::iterator it = entries.begin(); it != entries.end();) -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.cpp 2012-05-14 14:15:12.227222342 +0200 -@@ -116,7 +116,7 @@ - m_state = FIND_MOVIE; - m_strMovie = strMovie; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (m_state != DO_NOTHING) -@@ -160,7 +160,7 @@ - { // threaded version - m_state = GET_DETAILS; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -@@ -195,7 +195,7 @@ - { // threaded version - m_state = GET_EPISODE_DETAILS; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -@@ -230,7 +230,7 @@ - { // threaded version - m_state = GET_EPISODE_LIST; - m_found = 0; -- if (ThreadHandle()) -+ if (IsRunning()) - StopThread(); - Create(); - while (!m_found) -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.h xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.h ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoDownloader.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoDownloader.h 2012-05-14 14:15:12.228222362 +0200 -@@ -42,7 +42,7 @@ - class CVideoInfoDownloader : public CThread - { - public: -- CVideoInfoDownloader(const ADDON::ScraperPtr &scraper) : m_info(scraper) {} -+ CVideoInfoDownloader(const ADDON::ScraperPtr &scraper) : CThread("CVideoInfoDownloader"), m_info(scraper) {} - virtual ~CVideoInfoDownloader() {} - - // threaded lookup functions -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoInfoScanner.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoScanner.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoInfoScanner.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoInfoScanner.cpp 2012-05-14 14:15:12.229222382 +0200 -@@ -54,7 +54,7 @@ - namespace VIDEO - { - -- CVideoInfoScanner::CVideoInfoScanner() -+ CVideoInfoScanner::CVideoInfoScanner() : CThread("CVideoInfoScanner") - { - m_bRunning = false; - m_pObserver = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.cpp xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.cpp ---- xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.cpp 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.cpp 2012-05-14 14:15:12.231222422 +0200 -@@ -31,6 +31,7 @@ - #include - #include - #include "windowing/WindowingFactory.h" -+ #include "settings/AdvancedSettings.h" - #define NVSETTINGSCMD "nvidia-settings -nt -q RefreshRate3" - #elif defined(__APPLE__) && !defined(__arm__) - #include -@@ -107,7 +108,7 @@ - - #endif - --CVideoReferenceClock::CVideoReferenceClock() -+CVideoReferenceClock::CVideoReferenceClock() : CThread("CVideoReferenceClock") - { - m_SystemFrequency = CurrentHostFrequency(); - m_ClockSpeed = 1.0; -@@ -118,7 +119,7 @@ - - #if defined(HAS_GLX) && defined(HAS_XRANDR) - m_Dpy = NULL; -- m_UseNvSettings = true; -+ m_UseNvSettings = false; - #endif - } - -@@ -270,12 +271,21 @@ - return false; - } - -+ m_bIsATI = false; -+ m_bPolling = false; -+ - CStdString Vendor = g_Windowing.GetRenderVendor(); - Vendor.ToLower(); - if (Vendor.compare(0, 3, "ati") == 0) - { - CLog::Log(LOGDEBUG, "CVideoReferenceClock: GL_VENDOR: %s, using ati workaround", Vendor.c_str()); - m_bIsATI = true; -+ m_bPolling = true; -+ } -+ if (g_advancedSettings.m_vblankPolling) -+ { -+ m_bPolling = true; -+ CLog::Log(LOGDEBUG, "CVideoReferenceClock: use polling"); - } - - m_vInfo = glXChooseVisual(m_Dpy, DefaultScreen(m_Dpy), singleBufferAttributes); -@@ -285,7 +295,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - { - Swa.border_pixel = 0; - Swa.event_mask = StructureNotifyMask; -@@ -313,7 +323,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - ReturnV = glXMakeCurrent(m_Dpy, m_Window, m_Context); - else - ReturnV = glXMakeCurrent(m_Dpy, m_glPixmap, m_Context); -@@ -324,7 +334,7 @@ - return false; - } - -- if (!m_bIsATI) -+ if (!m_bPolling) - { - m_glXWaitVideoSyncSGI = (int (*)(int, int, unsigned int*))glXGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI"); - if (!m_glXWaitVideoSyncSGI) -@@ -369,6 +379,9 @@ - UpdateRefreshrate(true); //forced refreshrate update - m_MissedVblanks = 0; - -+ if (m_bPolling) -+ SetPriority(1); -+ - return true; - } - -@@ -567,7 +580,7 @@ - while(!m_bStop) - { - //wait for the next vblank -- if (!m_bIsATI) -+ if (!m_bPolling) - { - ReturnV = m_glXWaitVideoSyncSGI(2, (VblankCount + 1) % 2, &VblankCount); - m_glXGetVideoSyncSGI(&VblankCount); //the vblank count returned by glXWaitVideoSyncSGI is not always correct -@@ -591,7 +604,7 @@ - sleepTime = std::max(int(300000LL/m_RefreshRate), sleepTime); - - unsigned int iterations = 0; -- while (VblankCount == PrevVblankCount && !m_bStop) -+ while (VblankCount == PrevVblankCount && iterations < 500 && !m_bStop) - { - usleep(sleepTime); - m_glXGetVideoSyncSGI(&VblankCount); -@@ -652,7 +665,7 @@ - } - - CLog::Log(LOGDEBUG, "CVideoReferenceClock: Attaching glX context"); -- if (!m_bIsATI) -+ if (!m_bPolling) - ReturnV = glXMakeCurrent(m_Dpy, m_Window, m_Context); - else - ReturnV = glXMakeCurrent(m_Dpy, m_glPixmap, m_Context); -@@ -1275,6 +1288,9 @@ - - if (m_UseVblank) //when true the vblank is used as clock source - { -+ if (Target < m_CurrTime) -+ Target = m_CurrTime + 0.5/m_RefreshRate; -+ - while (m_CurrTime < Target) - { - //calculate how long to sleep before we should have gotten a signal that a vblank happened -diff -Naur xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.h xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.h ---- xbmc-pvr-11.0.1/xbmc/video/VideoReferenceClock.h 2012-03-27 17:55:34.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/video/VideoReferenceClock.h 2012-05-14 14:15:12.232222442 +0200 -@@ -125,6 +125,7 @@ - - bool m_UseNvSettings; - bool m_bIsATI; -+ bool m_bPolling; - - #elif defined(_WIN32) && defined(HAS_DX) - bool SetupD3D(); -diff -Naur xbmc-pvr-11.0.1/xbmc/win32/PlatformDefs.h xbmc-pvr-11.0.1.patch/xbmc/win32/PlatformDefs.h ---- xbmc-pvr-11.0.1/xbmc/win32/PlatformDefs.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/win32/PlatformDefs.h 2012-05-14 14:15:12.232222442 +0200 -@@ -33,7 +33,6 @@ - typedef __int64 fpos64_t; - typedef __int64 __off64_t; - typedef long __off_t; --typedef unsigned long ThreadIdentifier; - - #define ssize_t int - -diff -Naur xbmc-pvr-11.0.1/xbmc/win32/WindowHelper.cpp xbmc-pvr-11.0.1.patch/xbmc/win32/WindowHelper.cpp ---- xbmc-pvr-11.0.1/xbmc/win32/WindowHelper.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/win32/WindowHelper.cpp 2012-05-14 14:15:12.233222462 +0200 -@@ -28,7 +28,7 @@ - - CWHelper g_windowHelper; - --CWHelper::CWHelper(void) -+CWHelper::CWHelper(void) : CThread("CWHelper") - { - m_hwnd = NULL; - m_hProcess = NULL; -diff -Naur xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.cpp xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.cpp ---- xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.cpp 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.cpp 2012-05-14 14:15:12.234222482 +0200 -@@ -35,6 +35,8 @@ - #include - #include "cores/VideoRenderers/RenderManager.h" - #include "utils/TimeUtils.h" -+#include "settings/AdvancedSettings.h" -+#include "settings/GUISettings.h" - - #if defined(HAS_XRANDR) - #include -@@ -52,6 +54,7 @@ - m_wmWindow = 0; - m_bWasFullScreenBeforeMinimize = false; - m_dpyLostTime = 0; -+ m_internalModeSwitch = false; - - XSetErrorHandler(XErrorHandler); - } -@@ -178,6 +181,45 @@ - return false; - } - -+void CWinSystemX11::RefreshWindow() -+{ -+ // save current mode if this is not an internal request -+ if (!m_internalModeSwitch) -+ { -+ CLog::Log(LOGNOTICE, "CWinSystemX11::RefreshWindow - external or initial xrandr event"); -+ m_xrandrOut = g_xrandr.GetCurrentOutput(); -+ m_xrandrMode = g_xrandr.GetCurrentMode(m_xrandrOut.name); -+ } -+ m_internalModeSwitch = false; -+ -+ g_xrandr.Query(true); -+ XOutput out = g_xrandr.GetCurrentOutput(); -+ XMode mode = g_xrandr.GetCurrentMode(out.name); -+ -+ RESOLUTION_INFO res; -+ unsigned int i; -+ bool found(false); -+ for (i = RES_DESKTOP; i < g_settings.m_ResInfo.size(); ++i) -+ { -+ if (g_settings.m_ResInfo[i].strId == mode.id) -+ { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ { -+ CLog::Log(LOGERROR, "CWinSystemX11::RefreshWindow - could not find resolution"); -+ return; -+ } -+ -+ g_graphicsContext.SetVideoResolution((RESOLUTION)i, true); -+ g_guiSettings.SetInt("window.width", mode.w); -+ g_guiSettings.SetInt("window.height", mode.h); -+ g_settings.Save(); -+} -+ - bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) - { - m_nWidth = res.iWidth; -@@ -193,13 +235,32 @@ - mode.hz = res.fRefreshRate; - mode.id = res.strId; - -- if(m_bFullScreen) -+ XOutput currout = g_xrandr.GetCurrentOutput(); -+ XMode currmode = g_xrandr.GetCurrentMode(currout.name); -+ -+ if (m_xrandrOut.name.empty()) -+ { -+ m_xrandrOut = currout; -+ m_xrandrMode = currmode; -+ } -+ -+ if(!m_bFullScreen) - { -+ // reset to mode we had before internal mode switch -+ out = m_xrandrOut; -+ mode = m_xrandrMode; -+ } -+ -+ // only call xrandr if mode changes -+ if (currout.name != out.name || currmode.w != mode.w || currmode.h != mode.h || -+ currmode.hz != mode.hz || currmode.id != mode.id) -+ { -+ CLog::Log(LOGNOTICE, "CWinSystemX11::SetFullScreen - calling xrandr"); - OnLostDevice(); -+ m_internalModeSwitch = true; - g_xrandr.SetMode(out, mode); - } -- else -- g_xrandr.RestoreState(); -+ - #endif - - int options = SDL_OPENGL; -@@ -493,6 +554,7 @@ - if (bGotEvent || bTimeout) - { - CLog::Log(LOGDEBUG, "%s - notify display reset event", __FUNCTION__); -+ RefreshWindow(); - - CSingleLock lock(m_resourceSection); - -diff -Naur xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.h xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.h ---- xbmc-pvr-11.0.1/xbmc/windowing/X11/WinSystemX11.h 2012-03-27 17:55:38.000000000 +0200 -+++ xbmc-pvr-11.0.1.patch/xbmc/windowing/X11/WinSystemX11.h 2012-05-14 14:15:12.234222482 +0200 -@@ -27,6 +27,7 @@ - #include "utils/Stopwatch.h" - #include - #include "threads/CriticalSection.h" -+#include "XRandR.h" - - class IDispResource; - -@@ -60,6 +61,9 @@ - // Local to WinSystemX11 only - Display* GetDisplay() { return m_dpy; } - GLXWindow GetWindow() { return m_glWindow; } -+ GLXContext GetGlxContext() { return m_glContext; } -+ Window GetWmWindow() { return m_wmWindow; } -+ void RefreshWindow(); - - protected: - bool RefreshGlxContext(); -@@ -76,6 +80,9 @@ - CCriticalSection m_resourceSection; - std::vector m_resources; - uint64_t m_dpyLostTime; -+ XOutput m_xrandrOut; -+ XMode m_xrandrMode; -+ bool m_internalModeSwitch; - - private: - bool IsSuitableVisual(XVisualInfo *vInfo); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch deleted file mode 100644 index 078997f175f..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.02-xvba_support-gcc-4.7.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h ---- xbmc-11.0.1/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-03-23 07:22:04.215885089 +0100 -+++ xbmc-11.0.1.patch/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-03-23 07:24:07.875383186 +0100 -@@ -22,6 +22,7 @@ - #pragma once - - #include -+#include - - struct threadOpaque - { diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch deleted file mode 100644 index 18b28b23f7c..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.11-disable_interop.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-11.0.1/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-06-30 19:13:51.558262433 +0200 -+++ xbmc-11.0.1.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-06-30 19:59:14.545818328 +0200 -@@ -553,7 +553,7 @@ - { - bool hasInterop = false; - #ifdef GL_NV_vdpau_interop -- hasInterop = true; -+ hasInterop = false; - #endif - CGUIControl *pControl = (CGUIControl *)GetControl(pSettingControl->GetID()); - if (pControl && hasInterop && glewIsSupported("GL_NV_vdpau_interop")) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch deleted file mode 100644 index 5f4ae3111c0..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-902.12-linuxrenderer_delete_texture_targets_on_reconfigure.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 9687cc6b6f90fb40e39060eff9e4d8283254b770 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Fri, 13 Jul 2012 18:57:37 +0200 -Subject: [PATCH] linuxrenderer: delete texture targets on reconfigure - ---- - xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -index 7c46cfd..85fc50c 100644 ---- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -+++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp -@@ -261,6 +261,12 @@ bool CLinuxRendererGL::ValidateRenderTarget() - else - CLog::Log(LOGNOTICE,"Using GL_TEXTURE_2D"); - -+ // function pointer for texture might change in -+ // call to LoadShaders -+ glFinish(); -+ for (int i = 0 ; i < m_NumYV12Buffers ; i++) -+ (this->*m_textureDelete)(i); -+ - // create the yuv textures - LoadShaders(); - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch deleted file mode 100644 index 0cfaf7fff4e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-903.01-fixed_still_frames_at_the_start_of_a_VTS_in_dvd_could_end_up_not_showing.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 497941802e56121adf03428d964e225c80989afd Mon Sep 17 00:00:00 2001 -From: elupus -Date: Sat, 7 Apr 2012 00:08:34 +0200 -Subject: [PATCH] fixed: still frames at the start of a VTS in dvd could end - up not showing - -This occured due to a change in behavior in updated ffmpeg. Old code would -return EOF once after a VTS change to trigger demuxer flush, however -updated ffmpeg will read multiple times causing demuxer reset actions -to get executed after actual data having been processed by demuxer. ---- - .../cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -index dbdff52..3ae4843 100644 ---- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -+++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamNavigator.cpp -@@ -419,9 +419,12 @@ int CDVDInputStreamNavigator::ProcessBlock(BYTE* dest_buffer, int* read) - iNavresult = NAVRESULT_HOLD; - } - else -+ { - iNavresult = m_pDVDPlayer->OnDVDNavResult(buf, DVDNAV_VTS_CHANGE); -- -- m_bInMenu = (0 == m_dll.dvdnav_is_domain_vts(m_dvdnav)); -+ m_holdmode = HOLDMODE_HELD; -+ m_lastevent = DVDNAV_NOP; -+ m_bInMenu = (0 == m_dll.dvdnav_is_domain_vts(m_dvdnav)); -+ } - } - break; - --- -1.7.10 - - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch deleted file mode 100644 index 17a606f1b15..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-981-toggleButtonState.patch +++ /dev/null @@ -1,304 +0,0 @@ -diff -Naur xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h ---- xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h 2011-12-10 22:16:22.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h 2011-12-17 18:43:42.183704449 +0100 -@@ -57,6 +57,7 @@ - virtual CStdString GetDescription() const; - void SetToggleSelect(const CStdString &toggleSelect); - void SetAltClickActions(const CGUIAction &clickActions); -+ bool IsSelected() const { return m_bSelected; }; - - protected: - virtual bool UpdateColors(); -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-17 18:43:42.216705084 +0100 -@@ -135,6 +135,11 @@ - - typedef struct { - PyObject_HEAD_XBMC_CONTROL -+ bool bIsSelected; -+ } ControlToggle; -+ -+ typedef struct { -+ PyObject_HEAD_XBMC_CONTROL - std::string strFont; - color_t textColor; - std::vector vecLabels; -@@ -263,7 +268,8 @@ - extern PyTypeObject ControlRadioButton_Type; - extern PyTypeObject ControlSlider_Type; - extern PyTypeObject ControlEdit_Type; -- -+ extern PyTypeObject ControlToggle_Type; -+ - CGUIControl* ControlLabel_Create(ControlLabel* pControl); - CGUIControl* ControlFadeLabel_Create(ControlFadeLabel* pControl); - CGUIControl* ControlTextBox_Create(ControlTextBox* pControl); -@@ -276,6 +282,7 @@ - CGUIControl* ControlRadioButton_Create(ControlRadioButton* pControl); - CGUIControl* ControlSlider_Create(ControlSlider* pControl); - CGUIControl* ControlEdit_Create(ControlEdit* pControl); -+ CGUIControl* ControlToggle_Create(ControlToggle* pControl); - - void initControl_Type(); - void initControlSpin_Type(); -@@ -291,6 +298,7 @@ - void initControlRadioButton_Type(); - void initControlSlider_Type(); - void initControlEdit_Type(); -+ void initControlToggle_Type(); - } - - #ifdef __cplusplus -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 2011-12-17 18:43:42.217705104 +0100 -@@ -0,0 +1,181 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include -+ -+#include "guilib/GUIToggleButtonControl.h" -+#include "guilib/GUIFontManager.h" -+#include "control.h" -+#include "pyutil.h" -+ -+using namespace std; -+ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+namespace PYXBMC -+{ -+ PyObject* ControlToggle_New( -+ PyTypeObject *type, -+ PyObject *args, -+ PyObject *kwds ) -+ { -+ static const char *keywords[] = { -+ "x", "y", "width", "height", "label", -+ "focusTexture", "noFocusTexture", -+ "textOffsetX", "textOffsetY", "alignment", -+ "font", "textColor", "disabledColor", "angle", "shadowColor", "focusedColor", NULL }; -+ ControlToggle *self; -+ char* cFont = NULL; -+ char* cTextureFocus = NULL; -+ char* cTextureNoFocus = NULL; -+ char* cTextColor = NULL; -+ char* cDisabledColor = NULL; -+ char* cShadowColor = NULL; -+ char* cFocusedColor = NULL; -+ -+ PyObject* pObjectText; -+ -+ self = (ControlToggle*)type->tp_alloc(type, 0); -+ if (!self) return NULL; -+ new(&self->bIsSelected) bool(); -+ -+ if (!PyArg_ParseTupleAndKeywords( -+ args, -+ kwds, -+ (char*)"llllO|sslllssslss", -+ (char**)keywords, -+ &self->dwPosX, -+ &self->dwPosY, -+ &self->dwWidth, -+ &self->dwHeight, -+ &pObjectText, -+ &cTextureFocus, -+ &cTextureNoFocus, -+ &cFont, -+ &cTextColor, -+ &cDisabledColor, -+ &cShadowColor, -+ &cFocusedColor)) -+ { -+ Py_DECREF( self ); -+ return NULL; -+ } -+ -+ -+ cTextureFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturefocus", (char*)"button-focus.png"); -+ cTextureNoFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturenofocus", (char*)"button-nofocus.jpg"); -+ -+ return (PyObject*)self; -+ } -+ -+ void ControlToggle_Dealloc(ControlToggle* self) -+ { -+ self->ob_type->tp_free((PyObject*)self); -+ } -+ -+ -+ // isSelected() Method -+ PyDoc_STRVAR(isSelected__doc__, -+ "isSelected() -- Returns the toggle buttons's selected status.\n" -+ "\n" -+ "example:\n" -+ " - is = self.togglebutton.isSelected()\n"); -+ -+ PyObject* ControlToggle_IsSelected(ControlToggle *self, PyObject *args) -+ { -+ bool isSelected = false; -+ -+ PyXBMCGUILock(); -+ if (self->pGUIControl) -+ isSelected = ((CGUIToggleButtonControl*)self->pGUIControl)->IsSelected(); -+ PyXBMCGUIUnlock(); -+ -+ return Py_BuildValue((char*)"b", isSelected); -+ } -+ -+ -+ PyMethodDef ControlToggle_methods[] = { -+ {(char*)"isSelected", (PyCFunction)ControlToggle_IsSelected, METH_VARARGS, isSelected__doc__}, -+ {NULL, NULL, 0, NULL} -+ }; -+ -+ // ControlRadioButton class -+ PyDoc_STRVAR(ControlToggle__doc__, -+ "ControlRadioButton class.\n" -+ "\n" -+ "ControlRadioButton(x, y, width, height, label[, focusTexture, noFocusTexture, textOffsetX, textOffsetY,\n" -+ " alignment, font, textColor, disabledColor, angle, shadowColor, focusedColor,\n" -+ " radioFocusTexture, noRadioFocusTexture])\n" -+ "\n" -+ "x : integer - x coordinate of control.\n" -+ "y : integer - y coordinate of control.\n" -+ "width : integer - width of control.\n" -+ "height : integer - height of control.\n" -+ "label : string or unicode - text string.\n" -+ "focusTexture : [opt] string - filename for focus texture.\n" -+ "noFocusTexture : [opt] string - filename for no focus texture.\n" -+ "textOffsetX : [opt] integer - x offset of label.\n" -+ "textOffsetY : [opt] integer - y offset of label.\n" -+ "alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n" -+ "font : [opt] string - font used for label text. (e.g. 'font13')\n" -+ "textColor : [opt] hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')\n" -+ "disabledColor : [opt] hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')\n" -+ "angle : [opt] integer - angle of control. (+ rotates CCW, - rotates CW)\n" -+ "shadowColor : [opt] hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')\n" -+ "focusedColor : [opt] hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')\n" -+ "radioFocusTexture : [opt] string - filename for radio focus texture.\n" -+ "noRadioFocusTexture : [opt] string - filename for radio no focus texture.\n" -+ "\n" -+ "*Note, You can use the above as keywords for arguments and skip certain optional arguments.\n" -+ " Once you use a keyword, all following arguments require the keyword.\n" -+ " After you create the control, you need to add it to the window with addControl().\n" -+ "\n" -+ "example:\n" -+ " - self.radiobutton = xbmcgui.ControlToggleButton(100, 250, 200, 50, 'Status', font='font14')\n"); -+ -+ // Restore code and data sections to normal. -+ -+ PyTypeObject ControlToggle_Type; -+ -+ void initControlToggle_Type() -+ { -+ PyXBMCInitializeTypeObject(&ControlToggle_Type); -+ -+ ControlToggle_Type.tp_name = (char*)"xbmcgui.ControlToggleButton"; -+ ControlToggle_Type.tp_basicsize = sizeof(ControlToggle); -+ ControlToggle_Type.tp_dealloc = (destructor)ControlToggle_Dealloc; -+ ControlToggle_Type.tp_compare = 0; -+ ControlToggle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; -+ ControlToggle_Type.tp_doc = ControlToggle__doc__; -+ ControlToggle_Type.tp_methods = ControlToggle_methods; -+ ControlToggle_Type.tp_base = &Control_Type; -+ ControlToggle_Type.tp_new = ControlToggle_New; -+ } -+} -+ -+#ifdef __cplusplus -+} -+#endif -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-17 18:44:47.447960296 +0100 -@@ -13,6 +13,7 @@ - controlslider.cpp \ - controlspin.cpp \ - controltextbox.cpp \ -+ controltogglebutton.cpp \ - dialog.cpp \ - GUIPythonWindow.cpp \ - GUIPythonWindowDialog.cpp \ -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-17 18:43:42.218705123 +0100 -@@ -277,6 +277,12 @@ - if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); - ((ControlButton*)pControl)->align = li.align; - break; -+ case CGUIControl::GUICONTROL_TOGGLEBUTTON: -+ pControl = (Control*)ControlToggle_Type.tp_alloc(&ControlToggle_Type, 0); -+ new(&((ControlToggle*)pControl)->bIsSelected) bool(); -+ -+ break; -+ - default: - break; - } -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-17 18:43:42.219705142 +0100 -@@ -138,6 +138,7 @@ - initAction_Type(); - initControlRadioButton_Type(); - initControlEdit_Type(); -+ initControlToggle_Type(); - - if (PyType_Ready(&Window_Type) < 0 || - PyType_Ready(&WindowDialog_Type) < 0 || -@@ -160,7 +161,8 @@ - PyType_Ready(&ControlSlider_Type) < 0 || - PyType_Ready(&ControlRadioButton_Type) < 0 || - PyType_Ready(&ControlEdit_Type) < 0 || -- PyType_Ready(&Action_Type) < 0) -+ PyType_Ready(&Action_Type) < 0 || -+ PyType_Ready(&ControlToggle_Type) < 0) - return; - - } -@@ -200,6 +202,7 @@ - Py_INCREF(&Action_Type); - Py_INCREF(&ControlRadioButton_Type); - Py_INCREF(&ControlEdit_Type); -+ Py_INCREF(&ControlToggle_Type); - - pXbmcGuiModule = Py_InitModule3((char*)"xbmcgui", xbmcGuiMethods, xbmcgui_module_documentation); - -@@ -227,7 +230,8 @@ - PyModule_AddObject(pXbmcGuiModule, (char*)"Action", (PyObject *)&Action_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlRadioButton", (PyObject*)&ControlRadioButton_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlEdit", (PyObject*)&ControlEdit_Type); -- -+ PyModule_AddObject(pXbmcGuiModule, (char*)"ControlToggle", (PyObject*)&ControlToggle_Type); -+ - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__author__", (char*)PY_XBMC_AUTHOR); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__date__", (char*)"14 July 2006"); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__version__", (char*)"1.2"); -diff -Naur xbmc-f3b0020/XBMC.xcodeproj/project.pbxproj xbmc-f3b0020.patch/XBMC.xcodeproj/project.pbxproj diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch deleted file mode 100644 index 8a8a5d49e8e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-982-UDisk-device-must-be-remount-in-DeviceChanged-event.patch +++ /dev/null @@ -1,27 +0,0 @@ -From f025c39679b438cb91a0ef0f205736ff92fddeac Mon Sep 17 00:00:00 2001 -From: Vic Lee -Date: Thu, 10 Feb 2011 09:36:15 +0800 -Subject: [PATCH 5/5] UDisk: device must be remount in DeviceChanged event - - -Signed-off-by: Vic Lee ---- - xbmc/linux/UDisksProvider.cpp | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -diff --git a/xbmc/storage/linux/UDisksProvider.cpp b/xbmc/storage/linux/UDisksProvider.cpp -index 8e9b378..e24502a 100644 ---- a/xbmc/storage/linux/UDisksProvider.cpp -+++ b/xbmc/storage/linux/UDisksProvider.cpp -@@ -368,6 +368,8 @@ void CUDisksProvider::DeviceChanged(const char *object, IStorageEventsCallback * - { - bool mounted = device->m_isMounted; - device->Update(); -+ if (g_advancedSettings.m_handleMounting) -+ device->Mount(); - if (!mounted && device->m_isMounted && callback) - callback->OnStorageAdded(device->m_Label, device->m_MountPath); - else if (mounted && !device->m_isMounted && callback) --- -1.7.2.3 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch deleted file mode 100644 index 24af12df393..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-983-fixed-failure-to-broswe-for-smb-shares.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f52dd9a555e8e4b087ec6fbf040dc1f1155c4136 Mon Sep 17 00:00:00 2001 -From: "S. Davilla" -Date: Sat, 21 Apr 2012 14:11:56 -0400 -Subject: [PATCH] fixed, failure to broswe for smb shares. this hits all 1st - time installs - ---- - xbmc/filesystem/SmbFile.cpp | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/xbmc/filesystem/FileSmb.cpp b/xbmc/filesystem/FileSmb.cpp -index 382553c..c390031 100644 ---- a/xbmc/filesystem/FileSmb.cpp -+++ b/xbmc/filesystem/FileSmb.cpp -@@ -61,7 +61,6 @@ SMBCSRV* xb_smbc_cache(SMBCCTX* c, const char* server, const char* share, const - m_IdleTimeout = 0; - #endif - m_context = NULL; -- smbc_init(xb_smbc_auth, 0); - } - - CSMB::~CSMB() -@@ -149,6 +148,10 @@ void CSMB::Init() - } - #endif - -+ // reads smb.conf so this MUST be after we create smb.conf -+ // multiple smbc_init calls are ignored by libsmbclient. -+ smbc_init(xb_smbc_auth, 0); -+ - #ifdef TARGET_WINDOWS - // set the log function - set_log_callback(xb_smbc_log); --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch deleted file mode 100644 index 6163872d60a..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-984-do-not-remount-non-optical-devices-in-DeviceChanged-event.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/xbmc/storage/linux/UDisksProvider.cpp b/xbmc/storage/linux/UDisksProvider.cpp -index 6afc1a8..c940e69 100644 ---- a/xbmc/storage/linux/UDisksProvider.cpp -+++ b/xbmc/storage/linux/UDisksProvider.cpp -@@ -356,7 +356,7 @@ void CUDisksProvider::DeviceChanged(const char *object, IStorageEventsCallback * - { - bool mounted = device->m_isMounted; - device->Update(); -- if (g_advancedSettings.m_handleMounting) -+ if (g_advancedSettings.m_handleMounting && device->m_isOptical) - device->Mount(); - if (!mounted && device->m_isMounted && callback) - callback->OnStorageAdded(device->m_Label, device->m_MountPath); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch deleted file mode 100644 index 05379ebdf6e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-990-wiimote.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h b/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -index dbdbb94..6f68715 100644 ---- a/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -+++ b/tools/EventClients/Clients/WiiRemote/WiiUse_WiiRemote.h -@@ -27,7 +27,7 @@ - #include "../../lib/c++/xbmcclient.h" - #endif - //#ifndef WIN32 --// #include -+ #include - //#endif - #include "wiiuse.h" - //#define ICON_PATH "../../" diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable deleted file mode 100644 index f2cbebb6872..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-991-set_wakeup_at_timer_at_suspend_or_hibernate.patch.disable +++ /dev/null @@ -1,101 +0,0 @@ -diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp -index 7ef2027..bea711b 100644 ---- a/xbmc/ApplicationMessenger.cpp -+++ b/xbmc/ApplicationMessenger.cpp -@@ -73,6 +73,9 @@ - #include "utils/JobManager.h" - #include "storage/DetectDVDType.h" - -+#include "pvr/PVRManager.h" -+ -+using namespace PVR; - using namespace std; - - CDelayedMessage::CDelayedMessage(ThreadMessage& msg, unsigned int delay) -@@ -261,12 +264,14 @@ void CApplicationMessenger::ProcessMessage(ThreadMessage *pMsg) - - case TMSG_HIBERNATE: - { -+ g_PVRManager.SetWakeupCommand(); - g_powerManager.Hibernate(); - } - break; - - case TMSG_SUSPEND: - { -+ g_PVRManager.SetWakeupCommand(); - g_powerManager.Suspend(); - } - break; -diff --git a/xbmc/pvr/PVRManager.h b/xbmc/pvr/PVRManager.h -index 94a8c9a..99280c6 100644 ---- a/xbmc/pvr/PVRManager.h -+++ b/xbmc/pvr/PVRManager.h -@@ -450,6 +450,11 @@ namespace PVR - */ - void LoadCurrentChannelSettings(void); - -+ /*! -+ * @brief Executes "pvrpowermanagement.setwakeupcmd" -+ */ -+ bool SetWakeupCommand(void); -+ - protected: - /*! - * @brief PVR update and control thread. -@@ -525,11 +530,6 @@ namespace PVR - void ShowProgressDialog(const CStdString &strText, int iProgress); - - /*! -- * @brief Executes "pvrpowermanagement.setwakeupcmd" -- */ -- bool SetWakeupCommand(void); -- -- /*! - * @brief Hide the progress dialog if it's visible. - */ - void HideProgressDialog(void); -diff --git a/xbmc/pvr/timers/PVRTimers.cpp b/xbmc/pvr/timers/PVRTimers.cpp -index cfba9bb..4e757d6 100644 ---- a/xbmc/pvr/timers/PVRTimers.cpp -+++ b/xbmc/pvr/timers/PVRTimers.cpp -@@ -714,8 +714,7 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTimeSpan prewakeup(0, 0, g_guiSettings.GetInt("pvrpowermanagement.prewakeup"), 0); - const CDateTimeSpan idle(0, 0, g_guiSettings.GetInt("pvrpowermanagement.backendidletime"), 0); - -- CDateTime timerwakeuptime; -- CDateTime dailywakeuptime; -+ CDateTime retVal; - - /* Check next active time */ - CPVRTimerInfoTag timer; -@@ -724,15 +723,16 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTime start = timer.StartAsUTC(); - - if ((start - idle) > now) { -- timerwakeuptime = start - prewakeup; -+ retVal = start - prewakeup; - } else { -- timerwakeuptime = now + idle; -+ retVal = now + idle; - } - } - - /* check daily wake up */ - if (dailywakup) - { -+ CDateTime dailywakeuptime; - dailywakeuptime.SetFromDBTime(g_guiSettings.GetString("pvrpowermanagement.dailywakeuptime", false)); - dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); - -@@ -746,8 +746,9 @@ CDateTime CPVRTimers::GetNextEventTime(void) const - const CDateTimeSpan oneDay(1,0,0,0); - dailywakeuptime += oneDay; - } -+ if (dailywakeuptime < retVal) -+ retVal = dailywakeuptime; - } - -- const CDateTime retVal((dailywakeuptime < timerwakeuptime) ? dailywakeuptime : timerwakeuptime); - return retVal; - } diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch deleted file mode 100644 index 9c73a9644e2..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999-crosscompile.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/Makefile.include.in b/Makefile.include.in -index b70245d..0537b86 100644 ---- a/Makefile.include.in -+++ b/Makefile.include.in -@@ -1,4 +1,4 @@ --AR=ar -+AR=@AR@ - ARFLAGS=crus - RM=rm -rf - SHELL=@SHELL@ -diff --git a/configure.in b/configure.in -index 7348529..baea8e0 100755 ---- a/configure.in -+++ b/configure.in -@@ -22,7 +22,7 @@ AC_DEFUN([XB_FIND_SONAME], - AC_MSG_CHECKING([for lib$2 soname]) - $1_FILENAME=$($CC -nostdlib -o /dev/null $LDFLAGS -l$2 -Wl,-M 2>/dev/null | grep "^LOAD.*$2" | awk '{V=2; print $V}') - if [[ ! -z $$1_FILENAME ]]; then -- $1_SONAME=$(objdump -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') -+ $1_SONAME=$($OBJDUMP -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') - fi - else - AC_MSG_CHECKING([for lib$2 dylib]) diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch deleted file mode 100644 index 9f209e8e04e..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.002-268d6a0-fix_ASIC_hang.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 268d6a01b6a7dea0d53b042c246c95e87f4fc3d8 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Thu, 26 Jul 2012 15:43:24 +0200 -Subject: [PATCH] move deleting gl textures to TextureManager, fixes asic hang - on AMD - ---- - xbmc/Application.cpp | 4 ++-- - xbmc/guilib/GUIFontTTFGL.cpp | 3 ++- - xbmc/guilib/TextureManager.cpp | 13 +++++++++++++ - xbmc/guilib/TextureManager.h | 2 ++ - 4 files changed, 19 insertions(+), 3 deletions(-) - -diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index 71d8a4e..b66459a 100644 ---- a/xbmc/Application.cpp -+++ b/xbmc/Application.cpp -@@ -2231,8 +2231,6 @@ void CApplication::Render() - - g_Windowing.EndRender(); - -- g_TextureManager.FreeUnusedTextures(); -- - // reset our info cache - we do this at the end of Render so that it is - // fresh for the next process(), or after a windowclose animation (where process() - // isn't called) -@@ -2270,6 +2268,8 @@ void CApplication::Render() - } - CTimeUtils::UpdateFrameTime(flip); - -+ g_TextureManager.FreeUnusedTextures(); -+ - g_renderManager.UpdateResolution(); - g_renderManager.ManageCaptures(); - } -diff --git a/xbmc/guilib/GUIFontTTFGL.cpp b/xbmc/guilib/GUIFontTTFGL.cpp -index 87e07ca..6c93eb8 100644 ---- a/xbmc/guilib/GUIFontTTFGL.cpp -+++ b/xbmc/guilib/GUIFontTTFGL.cpp -@@ -24,6 +24,7 @@ - #include "GUIFontTTFGL.h" - #include "GUIFontManager.h" - #include "Texture.h" -+#include "TextureManager.h" - #include "GraphicContext.h" - #include "gui3d.h" - #include "utils/log.h" -@@ -234,7 +235,7 @@ void CGUIFontTTFGL::DeleteHardwareTexture() - if (m_bTextureLoaded) - { - if (glIsTexture(m_nTexture)) -- glDeleteTextures(1, (GLuint*) &m_nTexture); -+ g_TextureManager.ReleaseHwTexture(m_nTexture); - m_bTextureLoaded = false; - } - } -diff --git a/xbmc/guilib/TextureManager.cpp b/xbmc/guilib/TextureManager.cpp -index 9ef7889..ccd0d03 100644 ---- a/xbmc/guilib/TextureManager.cpp -+++ b/xbmc/guilib/TextureManager.cpp -@@ -457,6 +457,19 @@ void CGUITextureManager::FreeUnusedTextures() - for (ivecTextures i = m_unusedTextures.begin(); i != m_unusedTextures.end(); ++i) - delete *i; - m_unusedTextures.clear(); -+ -+#if defined(HAS_GL) || defined(HAS_GLES) -+ for (unsigned int i = 0; i < m_unusedHwTextures.size(); ++i) -+ { -+ glDeleteTextures(1, (GLuint*) &m_unusedHwTextures[i]); -+ } -+#endif -+ m_unusedHwTextures.clear(); -+} -+ -+void CGUITextureManager::ReleaseHwTexture(unsigned int texture) -+{ -+ m_unusedHwTextures.push_back(texture); - } - - void CGUITextureManager::Cleanup() -diff --git a/xbmc/guilib/TextureManager.h b/xbmc/guilib/TextureManager.h -index dd47f48..001f470 100644 ---- a/xbmc/guilib/TextureManager.h -+++ b/xbmc/guilib/TextureManager.h -@@ -124,9 +124,11 @@ class CGUITextureManager - void RemoveTexturePath(const CStdString &texturePath); ///< Remove a path from the paths to check when loading media - - void FreeUnusedTextures(); ///< Free textures (called from app thread only) -+ void ReleaseHwTexture(unsigned int texture); - protected: - std::vector m_vecTextures; - std::vector m_unusedTextures; -+ std::vector m_unusedHwTextures; - typedef std::vector::iterator ivecTextures; - // we have 2 texture bundles (one for the base textures, one for the theme) - CTextureBundle m_TexBundle[2]; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch deleted file mode 100644 index a6a73bf20cd..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.003-rar-PR1147.patch +++ /dev/null @@ -1,148 +0,0 @@ -From f01f95af95f287847c850572abe16b6969967ba7 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 19:01:17 +0300 -Subject: [PATCH 1/3] fixed: crashes with corrupted rar files - -UnrarXLib does not handle invalid files gracefully enough, and some -files can cause it to tell CRarFile that it has written more data into -its buffer than actually fits there, causing CRarFile::Read() to -eventually overread the buffer. - -Add checks in CRarFile for the validity of byte counts retrieved from -UnrarXLib to prevent crashes in such situations. -(cherry picked from commit ca9457286994ef0b021744797b8d78fb78260436) ---- - xbmc/filesystem/FileRar.cpp | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/xbmc/filesystem/FileRar.cpp b/xbmc/filesystem/FileRar.cpp -index 9c87a35..d026f8f 100644 ---- a/xbmc/filesystem/FileRar.cpp -+++ b/xbmc/filesystem/FileRar.cpp -@@ -310,6 +310,14 @@ unsigned int CFileRar::Read(void *lpBuf, int64_t uiBufSize) - - m_iDataInBuffer = MAXWINMEMSIZE-m_pExtract->GetDataIO().UnpackToMemorySize; - -+ if (m_iDataInBuffer < 0 || -+ m_iDataInBuffer > MAXWINMEMSIZE - (m_szStartOfBuffer - m_szBuffer)) -+ { -+ // invalid data returned by UnrarXLib, prevent a crash -+ CLog::Log(LOGERROR, "CRarFile::Read - Data buffer in inconsistent state"); -+ m_iDataInBuffer = 0; -+ } -+ - if (m_iDataInBuffer == 0) - break; - -@@ -471,6 +479,15 @@ int64_t CFileRar::Seek(int64_t iFilePosition, int iWhence) - } - m_iDataInBuffer = m_pExtract->GetDataIO().m_iSeekTo; // keep data - m_iBufferStart = m_pExtract->GetDataIO().m_iStartOfBuffer; -+ -+ if (m_iDataInBuffer < 0 || m_iDataInBuffer > MAXWINMEMSIZE) -+ { -+ // invalid data returned by UnrarXLib, prevent a crash -+ CLog::Log(LOGERROR, "CRarFile::Seek - Data buffer in inconsistent state"); -+ m_iDataInBuffer = 0; -+ return -1; -+ } -+ - m_szStartOfBuffer = m_szBuffer+MAXWINMEMSIZE-m_iDataInBuffer; - m_iFilePosition = iFilePosition; - --- -1.7.10 - - -From de1be4534cf410896b3102f95b6e02019ed64a90 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 17:13:07 +0300 -Subject: [PATCH 2/3] fixed: rars that have unpacked size stored on first - volume only - -Some multi-volume RAR files have their unpacked size set as 0 in all -volumes except the first one. - -Use the previous unpacked size instead of 0 in such cases in order to -support such files properly. -(cherry picked from commit 683457d27736c09415a11d80933553f75139a253) ---- - lib/UnrarXLib/volume.cpp | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/lib/UnrarXLib/volume.cpp b/lib/UnrarXLib/volume.cpp -index 1f4d5e3..b24e98b 100644 ---- a/lib/UnrarXLib/volume.cpp -+++ b/lib/UnrarXLib/volume.cpp -@@ -15,6 +15,7 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman - Log(Arc.FileName,St(MDataBadCRC),hd->FileName,Arc.FileName); - } - -+ Int64 PrevFullUnpSize = hd->FullUnpSize; - Int64 PosBeforeClose=Arc.Tell(); - Arc.Close(); - -@@ -144,6 +145,13 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,char Comman - } - } - #endif -+ -+ if (hd->FullUnpSize == 0) -+ { -+ // some archives only have correct UnpSize in the first volume -+ hd->FullUnpSize = PrevFullUnpSize; -+ } -+ - if (DataIO!=NULL) - { - if (HeaderType==ENDARC_HEAD) --- -1.7.10 - - -From d7bed5ddbbc98d7fedac663410d8e7e64bdf20c7 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Wed, 16 May 2012 00:14:49 +0300 -Subject: [PATCH 3/3] fixed: CRarFile::Read() returning wrong data after some - seek patterns - -Certain seek patterns on a file inside a non-compressed rar file can -cause CmdExtract::UnstoreFile() to think that the destination buffer has -been filled (as DestUnpSize counter, originally set to the file size, -reaches zero). - -However, counting written bytes using DestUnpSize doesn't make sense for -the UnpackToMemory codepath used for non-compressed rar files, as there -can be seeks which can eventually cause more data to be read than what -the actual file size was. The actual output buffer is internally handled -by ComprDataIO. - -The check in UnstoreFile() will result in not all data being written to -the destination buffer, causing CRarFile::Read() to return old stale -data. - -Fix that by dropping the unnecessary DestUnpSize handling in -UnpackToMemory codepath of CmdExtract::UnstoreFile(). -(cherry picked from commit 840cd4ce4ac8c781e7d35db2ed86d575a42c37e7) ---- - lib/UnrarXLib/extract.cpp | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/lib/UnrarXLib/extract.cpp b/lib/UnrarXLib/extract.cpp -index b4a8091..368a899 100644 ---- a/lib/UnrarXLib/extract.cpp -+++ b/lib/UnrarXLib/extract.cpp -@@ -863,10 +863,7 @@ void CmdExtract::UnstoreFile(ComprDataIO &DataIO,Int64 DestUnpSize) - } - if (Code > 0) - { -- Code=Code=0) -- DestUnpSize-=Code; - } - else - { --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch deleted file mode 100644 index 4885fe33e98..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.011-airtunes_reapply_lost_fix.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ab175ba28508445f6aff57386a8ce04b58a86f60 Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Fri, 11 May 2012 19:56:37 +0200 -Subject: [PATCH] [fix] - reapply fix for airtunes with AE which was lost - during merge - ---- - xbmc/network/AirTunesServer.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index 285a0a6..a60ad09 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -125,11 +125,11 @@ ao_device* CAirTunesServer::AudioOutputFunctions::ao_open_live(int driver_id, ao - if (ao_get_option(option, "name")) - item.GetMusicInfoTag()->SetTitle(ao_get_option(option, "name")); - -- g_application.getApplicationMessenger().PlayFile(item); -- - ThreadMessage tMsg2 = { TMSG_GUI_ACTIVATE_WINDOW, WINDOW_VISUALISATION, 0 }; - g_application.getApplicationMessenger().SendMessage(tMsg2, true); - -+ g_application.getApplicationMessenger().PlayFile(item); -+ - return (ao_device*) device; - } - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch deleted file mode 100644 index 9ea05b62811..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.012-airtunes_implementation_for_windows_using_libshairplay.patch +++ /dev/null @@ -1,527 +0,0 @@ -From b73018af2ae69c7cfad0a4461d169a49c7d0dfbf Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Tue, 15 May 2012 19:12:07 +0200 -Subject: [PATCH] [airtunes] - implementation for windows using libshairplay - ---- - xbmc/network/AirTunesServer.cpp | 330 +++++++++++++++++++++++++++++++++++++-- - xbmc/network/AirTunesServer.h | 23 +++ - 2 files changed, 343 insertions(+), 10 deletions(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index a60ad09..e14da90 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -17,7 +17,9 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#if !defined(TARGET_WINDOWS) - #pragma GCC diagnostic ignored "-Wwrite-strings" -+#endif - - #include "AirTunesServer.h" - -@@ -37,15 +39,243 @@ - #include "music/tags/MusicInfoTag.h" - #include "FileItem.h" - #include "GUIInfoManager.h" -+#include "guilib/GUIWindowManager.h" - #include "utils/Variant.h" - #include "settings/AdvancedSettings.h" -+#include "utils/EndianSwap.h" -+ -+#include -+#include -+ - - using namespace XFILE; - -+#if defined(TARGET_WINDOWS) -+DllLibShairplay *CAirTunesServer::m_pLibShairplay = NULL; -+#else - DllLibShairport *CAirTunesServer::m_pLibShairport = NULL; -+#endif - CAirTunesServer *CAirTunesServer::ServerInstance = NULL; - CStdString CAirTunesServer::m_macAddress; - -+//parse daap metadata - thx to project MythTV -+std::map decodeDMAP(const char *buffer, unsigned int size) -+{ -+ std::map result; -+ unsigned int offset = 8; -+ while (offset < size) -+ { -+ std::string tag; -+ tag.append(buffer + offset, 4); -+ offset += 4; -+ uint32_t length = Endian_SwapBE32(*(uint32_t *)(buffer + offset)); -+ offset += sizeof(uint32_t); -+ std::string content; -+ content.append(buffer + offset, length);//possible fixme - utf8? -+ offset += length; -+ result[tag] = content; -+ } -+ return result; -+} -+ -+void CAirTunesServer::SetMetadataFromBuffer(const char *buffer, unsigned int size) -+{ -+ MUSIC_INFO::CMusicInfoTag tag; -+ std::map metadata = decodeDMAP(buffer, size); -+ if(metadata["asal"].length()) -+ tag.SetAlbum(metadata["asal"]);//album -+ if(metadata["minm"].length()) -+ tag.SetTitle(metadata["minm"]);//title -+ if(metadata["asar"].length()) -+ tag.SetArtist(metadata["asar"]);//artist -+ g_infoManager.SetCurrentSongTag(tag); -+} -+ -+void CAirTunesServer::SetCoverArtFromBuffer(const char *buffer, unsigned int size) -+{ -+ XFILE::CFile tmpFile; -+ const char *tmpFileName = "special://temp/airtunes_album_thumb.jpg"; -+ -+ if(!size) -+ return; -+ -+ if (tmpFile.OpenForWrite(tmpFileName, true)) -+ { -+ int writtenBytes=0; -+ writtenBytes = tmpFile.Write(buffer, size); -+ tmpFile.Close(); -+ -+ if(writtenBytes) -+ { -+ //reset to empty before setting the new one -+ //else it won't get refreshed because the name didn't change -+ g_infoManager.SetCurrentAlbumThumb(""); -+ g_infoManager.SetCurrentAlbumThumb(tmpFileName); -+ //update the ui -+ CGUIMessage msg(GUI_MSG_NOTIFY_ALL,0,0,GUI_MSG_REFRESH_THUMBS); -+ g_windowManager.SendThreadMessage(msg); -+ } -+ } -+} -+ -+#if defined(TARGET_WINDOWS) -+#define RSA_KEY " \ -+-----BEGIN RSA PRIVATE KEY-----\ -+MIIEpQIBAAKCAQEA59dE8qLieItsH1WgjrcFRKj6eUWqi+bGLOX1HL3U3GhC/j0Qg90u3sG/1CUt\ -+wC5vOYvfDmFI6oSFXi5ELabWJmT2dKHzBJKa3k9ok+8t9ucRqMd6DZHJ2YCCLlDRKSKv6kDqnw4U\ -+wPdpOMXziC/AMj3Z/lUVX1G7WSHCAWKf1zNS1eLvqr+boEjXuBOitnZ/bDzPHrTOZz0Dew0uowxf\ -+/+sG+NCK3eQJVxqcaJ/vEHKIVd2M+5qL71yJQ+87X6oV3eaYvt3zWZYD6z5vYTcrtij2VZ9Zmni/\ -+UAaHqn9JdsBWLUEpVviYnhimNVvYFZeCXg/IdTQ+x4IRdiXNv5hEewIDAQABAoIBAQDl8Axy9XfW\ -+BLmkzkEiqoSwF0PsmVrPzH9KsnwLGH+QZlvjWd8SWYGN7u1507HvhF5N3drJoVU3O14nDY4TFQAa\ -+LlJ9VM35AApXaLyY1ERrN7u9ALKd2LUwYhM7Km539O4yUFYikE2nIPscEsA5ltpxOgUGCY7b7ez5\ -+NtD6nL1ZKauw7aNXmVAvmJTcuPxWmoktF3gDJKK2wxZuNGcJE0uFQEG4Z3BrWP7yoNuSK3dii2jm\ -+lpPHr0O/KnPQtzI3eguhe0TwUem/eYSdyzMyVx/YpwkzwtYL3sR5k0o9rKQLtvLzfAqdBxBurciz\ -+aaA/L0HIgAmOit1GJA2saMxTVPNhAoGBAPfgv1oeZxgxmotiCcMXFEQEWflzhWYTsXrhUIuz5jFu\ -+a39GLS99ZEErhLdrwj8rDDViRVJ5skOp9zFvlYAHs0xh92ji1E7V/ysnKBfsMrPkk5KSKPrnjndM\ -+oPdevWnVkgJ5jxFuNgxkOLMuG9i53B4yMvDTCRiIPMQ++N2iLDaRAoGBAO9v//mU8eVkQaoANf0Z\ -+oMjW8CN4xwWA2cSEIHkd9AfFkftuv8oyLDCG3ZAf0vrhrrtkrfa7ef+AUb69DNggq4mHQAYBp7L+\ -+k5DKzJrKuO0r+R0YbY9pZD1+/g9dVt91d6LQNepUE/yY2PP5CNoFmjedpLHMOPFdVgqDzDFxU8hL\ -+AoGBANDrr7xAJbqBjHVwIzQ4To9pb4BNeqDndk5Qe7fT3+/H1njGaC0/rXE0Qb7q5ySgnsCb3DvA\ -+cJyRM9SJ7OKlGt0FMSdJD5KG0XPIpAVNwgpXXH5MDJg09KHeh0kXo+QA6viFBi21y340NonnEfdf\ -+54PX4ZGS/Xac1UK+pLkBB+zRAoGAf0AY3H3qKS2lMEI4bzEFoHeK3G895pDaK3TFBVmD7fV0Zhov\ -+17fegFPMwOII8MisYm9ZfT2Z0s5Ro3s5rkt+nvLAdfC/PYPKzTLalpGSwomSNYJcB9HNMlmhkGzc\ -+1JnLYT4iyUyx6pcZBmCd8bD0iwY/FzcgNDaUmbX9+XDvRA0CgYEAkE7pIPlE71qvfJQgoA9em0gI\ -+LAuE4Pu13aKiJnfft7hIjbK+5kyb3TysZvoyDnb3HOKvInK7vXbKuU4ISgxB2bB3HcYzQMGsz1qJ\ -+2gG0N5hvJpzwwhbhXqFKA4zaaSrw622wDniAK5MlIE0tIAKKP4yxNGjoD2QYjhBGuhvkWKY=\ -+-----END RSA PRIVATE KEY-----" -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_metadata(void *cls, void *session, const void *buffer, int buflen) -+{ -+ CAirTunesServer::SetMetadataFromBuffer((char *)buffer, buflen); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_coverart(void *cls, void *session, const void *buffer, int buflen) -+{ -+ CAirTunesServer::SetCoverArtFromBuffer((char *)buffer, buflen); -+} -+ -+void* CAirTunesServer::AudioOutputFunctions::audio_init(void *cls, int bits, int channels, int samplerate) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->OpenForWrite(XFILE::PipesManager::GetInstance().GetUniquePipeName()); -+ pipe->SetOpenThreashold(300); -+ -+ BXA_FmtHeader header; -+ strncpy(header.fourcc, "BXA ", 4); -+ header.type = BXA_PACKET_TYPE_FMT; -+ header.bitsPerSample = bits; -+ header.channels = channels; -+ header.sampleRate = samplerate; -+ header.durationMs = 0; -+ -+ if (pipe->Write(&header, sizeof(header)) == 0) -+ return 0; -+ -+ ThreadMessage tMsg = { TMSG_MEDIA_STOP }; -+ g_application.getApplicationMessenger().SendMessage(tMsg, true); -+ -+ CFileItem item; -+ item.SetPath(pipe->GetName()); -+ item.SetMimeType("audio/x-xbmc-pcm"); -+ -+ ThreadMessage tMsg2 = { TMSG_GUI_ACTIVATE_WINDOW, WINDOW_VISUALISATION, 0 }; -+ g_application.getApplicationMessenger().SendMessage(tMsg2, true); -+ -+ g_application.getApplicationMessenger().PlayFile(item); -+ -+ return "XBMC-AirTunes";//session -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_set_volume(void *cls, void *session, float volume) -+{ -+ //volume from -144 - 0 -+ float volPercent = 1 - volume/-144; -+ g_application.SetVolume(volPercent, false);//non-percent volume 0.0-1.0 -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_process(void *cls, void *session, const void *buffer, int buflen) -+{ -+ #define NUM_OF_BYTES 64 -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ int sentBytes = 0; -+ unsigned char buf[NUM_OF_BYTES]; -+ -+ while (sentBytes < buflen) -+ { -+ int n = (buflen - sentBytes < NUM_OF_BYTES ? buflen - sentBytes : NUM_OF_BYTES); -+ memcpy(buf, (char*) buffer + sentBytes, n); -+ -+ if (pipe->Write(buf, n) == 0) -+ return; -+ -+ sentBytes += n; -+ } -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_flush(void *cls, void *session) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->Flush(); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::audio_destroy(void *cls, void *session) -+{ -+ XFILE::CPipeFile *pipe=(XFILE::CPipeFile *)cls; -+ pipe->SetEof(); -+ pipe->Close(); -+ -+ //fix airplay video for ios5 devices -+ //on ios5 when airplaying video -+ //the client first opens an airtunes stream -+ //while the movie is loading -+ //in that case we don't want to stop the player here -+ //because this would stop the airplaying video -+#ifdef HAS_AIRPLAY -+ if (!CAirPlayServer::IsPlaying()) -+#endif -+ { -+ ThreadMessage tMsg = { TMSG_MEDIA_STOP }; -+ g_application.getApplicationMessenger().SendMessage(tMsg, true); -+ CLog::Log(LOGDEBUG, "AIRTUNES: AirPlay not running - stopping player"); -+ } -+} -+ -+void shairplay_log(int level, const char *msg) -+{ -+ int xbmcLevel = LOGINFO; -+ -+ switch(level) -+ { -+ case RAOP_LOG_EMERG: // system is unusable -+ xbmcLevel = LOGFATAL; -+ break; -+ case RAOP_LOG_ALERT: // action must be taken immediately -+ case RAOP_LOG_CRIT: // critical conditions -+ xbmcLevel = LOGSEVERE; -+ break; -+ case RAOP_LOG_ERR: // error conditions -+ xbmcLevel = LOGERROR; -+ break; -+ case RAOP_LOG_WARNING: // warning conditions -+ xbmcLevel = LOGWARNING; -+ break; -+ case RAOP_LOG_NOTICE: // normal but significant condition -+ xbmcLevel = LOGNOTICE; -+ break; -+ case RAOP_LOG_INFO: // informational -+ xbmcLevel = LOGINFO; -+ break; -+ case RAOP_LOG_DEBUG: // debug-level messages -+ xbmcLevel = LOGDEBUG; -+ break; -+ default: -+ break; -+ } -+ CLog::Log(xbmcLevel, "AIRTUNES: %s", msg); -+} -+ -+#else -+ - struct ao_device_xbmc - { - XFILE::CPipeFile *pipe; -@@ -214,6 +444,17 @@ char* CAirTunesServer::AudioOutputFunctions::ao_get_option(ao_option *options, c - return NULL; - } - -+int shairport_log(const char* msg, size_t msgSize) -+{ -+ if( g_advancedSettings.m_logEnableAirtunes) -+ { -+ CLog::Log(LOGDEBUG, "AIRTUNES: %s", msg); -+ } -+ return 1; -+} -+ -+#endif -+ - bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, const CStdString &password/*=""*/) - { - bool success = false; -@@ -243,7 +484,9 @@ bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, con - ServerInstance = new CAirTunesServer(port, nonlocal); - if (ServerInstance->Initialize(password)) - { -+#ifndef TARGET_WINDOWS - ServerInstance->Create(); -+#endif - success = true; - } - -@@ -264,6 +507,9 @@ bool CAirTunesServer::StartServer(int port, bool nonlocal, bool usePassword, con - txt["sr"] = "44100"; - txt["pw"] = "false"; - txt["vn"] = "3"; -+ txt["da"] = "true"; -+ txt["vs"] = "130.14"; -+ txt["md"] = "0,1,2"; - txt["txtvers"] = "1"; - - CZeroconf::GetInstance()->PublishService("servers.airtunes", "_raop._tcp", appName, port, txt); -@@ -276,10 +522,12 @@ void CAirTunesServer::StopServer(bool bWait) - { - if (ServerInstance) - { -+#if !defined(TARGET_WINDOWS) - if (m_pLibShairport->IsLoaded()) - { - m_pLibShairport->shairport_exit(); - } -+#endif - ServerInstance->StopThread(bWait); - ServerInstance->Deinitialize(); - if (bWait) -@@ -295,47 +543,98 @@ void CAirTunesServer::StopServer(bool bWait) - CAirTunesServer::CAirTunesServer(int port, bool nonlocal) : CThread("AirTunesServer") - { - m_port = port; -+#if defined(TARGET_WINDOWS) -+ m_pLibShairplay = new DllLibShairplay(); -+ m_pPipe = new XFILE::CPipeFile; -+#else - m_pLibShairport = new DllLibShairport(); -+#endif - } - - CAirTunesServer::~CAirTunesServer() - { -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay->IsLoaded()) -+ { -+ m_pLibShairplay->Unload(); -+ } -+ delete m_pLibShairplay; -+ delete m_pPipe; -+#else - if (m_pLibShairport->IsLoaded()) - { - m_pLibShairport->Unload(); - } - delete m_pLibShairport; -+#endif - } - - void CAirTunesServer::Process() - { - m_bStop = false; - -+#if !defined(TARGET_WINDOWS) - while (!m_bStop && m_pLibShairport->shairport_is_running()) - { - m_pLibShairport->shairport_loop(); - } -+#endif - } - --int shairport_log(const char* msg, size_t msgSize) -+bool CAirTunesServer::Initialize(const CStdString &password) - { -- if( g_advancedSettings.m_logEnableAirtunes) -+ bool ret = false; -+ -+ Deinitialize(); -+ -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay->Load()) - { -- CLog::Log(LOGDEBUG, "AIRTUNES: %s", msg); -+ -+ raop_callbacks_t ao; -+ ao.cls = m_pPipe; -+ ao.audio_init = AudioOutputFunctions::audio_init; -+ ao.audio_set_volume = AudioOutputFunctions::audio_set_volume; -+ ao.audio_set_metadata = AudioOutputFunctions::audio_set_metadata; -+ ao.audio_set_coverart = AudioOutputFunctions::audio_set_coverart; -+ ao.audio_process = AudioOutputFunctions::audio_process; -+ ao.audio_flush = AudioOutputFunctions::audio_flush; -+ ao.audio_destroy = AudioOutputFunctions::audio_destroy; -+ m_pLibShairplay->EnableDelayedUnload(false); -+ m_pRaop = m_pLibShairplay->raop_init(1, &ao, RSA_KEY);//1 - we handle one client at a time max -+ ret = m_pRaop != NULL; -+ -+ if(ret) -+ { -+ char macAdr[6]; -+ unsigned short port = (unsigned short)m_port; -+ -+ m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_WARNING); -+ if(g_advancedSettings.m_logEnableAirtunes) -+ { -+ m_pLibShairplay->raop_set_log_level(m_pRaop, RAOP_LOG_DEBUG); -+ } -+ -+ m_pLibShairplay->raop_set_log_callback(m_pRaop, shairplay_log); -+ -+ CNetworkInterface *net = g_application.getNetwork().GetFirstConnectedInterface(); -+ -+ if (net) -+ { -+ net->GetMacAddressRaw(macAdr); -+ } -+ -+ ret = m_pLibShairplay->raop_start(m_pRaop, &port, macAdr, 6, password.c_str()) >= 0; -+ } - } -- return 1; --} - --bool CAirTunesServer::Initialize(const CStdString &password) --{ -- bool ret = false; -+#else -+ - int numArgs = 3; - CStdString hwStr; - CStdString pwStr; - CStdString portStr; - -- Deinitialize(); -- - hwStr.Format("--mac=%s", m_macAddress.c_str()); - pwStr.Format("--password=%s",password.c_str()); - portStr.Format("--server_port=%d",m_port); -@@ -368,16 +667,27 @@ bool CAirTunesServer::Initialize(const CStdString &password) - m_pLibShairport->shairport_main(numArgs, argv); - ret = true; - } -+#endif - return ret; - } - - void CAirTunesServer::Deinitialize() - { -+#if defined(TARGET_WINDOWS) -+ if (m_pLibShairplay && m_pLibShairplay->IsLoaded()) -+ { -+ m_pLibShairplay->raop_stop(m_pRaop); -+ m_pLibShairplay->raop_destroy(m_pRaop); -+ m_pLibShairplay->Unload(); -+ } -+#else - if (m_pLibShairport && m_pLibShairport->IsLoaded()) - { - m_pLibShairport->shairport_exit(); - m_pLibShairport->Unload(); - } -+#endif - } - - #endif -+ -diff --git a/xbmc/network/AirTunesServer.h b/xbmc/network/AirTunesServer.h -index da893df..4a30e0a 100644 ---- a/xbmc/network/AirTunesServer.h -+++ b/xbmc/network/AirTunesServer.h -@@ -26,7 +26,11 @@ - - #ifdef HAS_AIRTUNES - -+#if defined(TARGET_WINDOWS) -+#include "DllLibShairplay.h" -+#else - #include "DllLibShairport.h" -+#endif - #include - #include - #include -@@ -41,11 +45,14 @@ - - class DllLibShairport; - -+ - class CAirTunesServer : public CThread - { - public: - static bool StartServer(int port, bool nonlocal, bool usePassword, const CStdString &password=""); - static void StopServer(bool bWait); -+ static void SetMetadataFromBuffer(const char *buffer, unsigned int size); -+ static void SetCoverArtFromBuffer(const char *buffer, unsigned int size); - - protected: - void Process(); -@@ -57,13 +64,28 @@ class CAirTunesServer : public CThread - void Deinitialize(); - - int m_port; -+#if defined(TARGET_WINDOWS) -+ static DllLibShairplay *m_pLibShairplay;//the lib -+ raop_t *m_pRaop; -+ XFILE::CPipeFile *m_pPipe; -+#else - static DllLibShairport *m_pLibShairport;//the lib -+#endif - static CAirTunesServer *ServerInstance; - static CStdString m_macAddress; - - class AudioOutputFunctions - { - public: -+#if defined(TARGET_WINDOWS) -+ static void* audio_init(void *cls, int bits, int channels, int samplerate); -+ static void audio_set_volume(void *cls, void *session, float volume); -+ static void audio_set_metadata(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_set_coverart(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_process(void *cls, void *session, const void *buffer, int buflen); -+ static void audio_flush(void *cls, void *session); -+ static void audio_destroy(void *cls, void *session); -+#else - static void ao_initialize(void); - static int ao_play(ao_device *device, char *output_samples, uint32_t num_bytes); - static int ao_default_driver_id(void); -@@ -74,6 +96,7 @@ class CAirTunesServer : public CThread - static int ao_append_option(ao_option **options, const char *key, const char *value); - static void ao_free_options(ao_option *options); - static char* ao_get_option(ao_option *options, const char* key); -+#endif - }; - }; - --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch deleted file mode 100644 index 44bd4b83a92..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.013-airtunes-add_dmap_metadata_parsing.patch +++ /dev/null @@ -1,64 +0,0 @@ -From b7fb4615609c684a98dc1cc27906aaa0f117837f Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Wed, 9 May 2012 18:53:45 +0200 -Subject: [PATCH] [airtunes] - add dmap metadata parsing - ---- - xbmc/network/AirTunesServer.cpp | 13 ++++++++++++- - xbmc/network/AirTunesServer.h | 2 ++ - 2 files changed, 14 insertions(+), 1 deletion(-) - -diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp -index e14da90..2ad097e 100644 ---- a/xbmc/network/AirTunesServer.cpp -+++ b/xbmc/network/AirTunesServer.cpp -@@ -47,7 +47,6 @@ - #include - #include - -- - using namespace XFILE; - - #if defined(TARGET_WINDOWS) -@@ -390,6 +389,16 @@ int CAirTunesServer::AudioOutputFunctions::ao_close(ao_device *device) - return 0; - } - -+void CAirTunesServer::AudioOutputFunctions::ao_set_metadata(const char *buffer, unsigned int size) -+{ -+ CAirTunesServer::SetMetadataFromBuffer(buffer, size); -+} -+ -+void CAirTunesServer::AudioOutputFunctions::ao_set_metadata_coverart(const char *buffer, unsigned int size) -+{ -+ CAirTunesServer::SetCoverArtFromBuffer(buffer, size); -+} -+ - /* -- Device Setup/Playback/Teardown -- */ - int CAirTunesServer::AudioOutputFunctions::ao_append_option(ao_option **options, const char *key, const char *value) - { -@@ -658,6 +667,8 @@ bool CAirTunesServer::Initialize(const CStdString &password) - ao.ao_append_option = AudioOutputFunctions::ao_append_option; - ao.ao_free_options = AudioOutputFunctions::ao_free_options; - ao.ao_get_option = AudioOutputFunctions::ao_get_option; -+ ao.ao_set_metadata = AudioOutputFunctions::ao_set_metadata; -+ ao.ao_set_metadata_coverart = AudioOutputFunctions::ao_set_metadata_coverart; - struct printfPtr funcPtr; - funcPtr.extprintf = shairport_log; - -diff --git a/xbmc/network/AirTunesServer.h b/xbmc/network/AirTunesServer.h -index 4a30e0a..0a4ce5a 100644 ---- a/xbmc/network/AirTunesServer.h -+++ b/xbmc/network/AirTunesServer.h -@@ -96,6 +96,8 @@ class CAirTunesServer : public CThread - static int ao_append_option(ao_option **options, const char *key, const char *value); - static void ao_free_options(ao_option *options); - static char* ao_get_option(ao_option *options, const char* key); -+ static void ao_set_metadata(const char *buffer, unsigned int size); -+ static void ao_set_metadata_coverart(const char *buffer, unsigned int size); - #endif - }; - }; --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch deleted file mode 100644 index 9b256ef6ac0..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.021-libnfs-1.3_support.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 23ce80d7f303aa3fb282a67b973c20a2e84e48d2 Mon Sep 17 00:00:00 2001 -From: Memphiz -Date: Fri, 4 May 2012 19:19:26 +0200 -Subject: [PATCH 2/2] [nfs] - make impl compatible with latest libnfs and - avoid usage of off64_t and size_t - ---- - xbmc/filesystem/DllLibNfs.h | 36 ++++++++++++++++++------------------ - xbmc/filesystem/NFSFile.cpp | 10 +++++----- - xbmc/filesystem/NFSFile.h | 8 ++++---- - 3 files changed, 27 insertions(+), 27 deletions(-) - -diff --git a/xbmc/filesystem/DllLibNfs.h b/xbmc/filesystem/DllLibNfs.h -index 37dfc9c..54c6872 100644 ---- a/xbmc/filesystem/DllLibNfs.h -+++ b/xbmc/filesystem/DllLibNfs.h -@@ -44,8 +44,8 @@ class DllLibNfsInterface - 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 @@ class DllLibNfsInterface - 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 @@ class DllLibNfsInterface - 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 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - 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 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - 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 @@ class DllLibNfs : public DllDynamic, DllLibNfsInterface - 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 --git a/xbmc/filesystem/FileNFS.cpp b/xbmc/filesystem/FileNFS.cpp -index 2f820f7..751eb54 100644 ---- a/xbmc/filesystem/FileNFS.cpp -+++ b/xbmc/filesystem/FileNFS.cpp -@@ -375,7 +375,7 @@ void CNfsConnection::resetKeepAlive(struct nfsfh *_pFileHandle) - //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); -@@ -461,7 +461,7 @@ void CNfsConnection::AddIdleConnection() - int64_t CNFSFile::GetPosition() - { - int ret = 0; -- off64_t offset = 0; -+ uint64_t offset = 0; - CSingleLock lock(gNfsConnection); - - if (gNfsConnection.GetNfsContext() == NULL || m_pFileHandle == NULL) return 0; -@@ -587,7 +587,7 @@ unsigned int CNFSFile::Read(void *lpBuf, int64_t uiBufSize) - - 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 - -@@ -605,7 +605,7 @@ unsigned int CNFSFile::Read(void *lpBuf, int64_t uiBufSize) - int64_t CNFSFile::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; -@@ -667,7 +667,7 @@ int CNFSFile::Write(const void* lpBuf, int64_t uiBufSize) - //write chunk - writtenBytes = gNfsConnection.GetImpl()->nfs_write(m_pNfsContext, - m_pFileHandle, -- (size_t)chunkSize, -+ chunkSize, - (char *)lpBuf + numberOfBytesWritten); - //decrease left bytes - leftBytes-= writtenBytes; -diff --git a/xbmc/filesystem/FileNFS.h b/xbmc/filesystem/FileNFS.h -index 47d8d4a..df131b0 100644 ---- a/xbmc/filesystem/FileNFS.h -+++ b/xbmc/filesystem/FileNFS.h -@@ -65,8 +65,8 @@ class CNfsConnection : public CCriticalSection - ~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 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 @@ class CNfsConnection : public CCriticalSection - 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 --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch deleted file mode 100644 index f37fef13c22..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.055-search-dialogs-workaround.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/xbmc/filesystem/PluginDirectory.cpp b/xbmc/filesystem/PluginDirectory.cpp -index 9e519fb..b64267b 100644 ---- a/xbmc/filesystem/PluginDirectory.cpp -+++ b/xbmc/filesystem/PluginDirectory.cpp -@@ -479,7 +479,7 @@ bool CPluginDirectory::WaitOnScriptResult(const CStdString &scriptPath, const CS - } - - // check whether we should pop up the progress dialog -- if (!progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar) -+ if (!progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar && !g_windowManager.HasModalDialog()) - { // loading takes more then 1.5 secs, show a progress dialog - progressBar = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - -diff --git a/xbmc/interfaces/python/xbmcmodule/keyboard.cpp b/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -index 0330215..0604a65 100644 ---- a/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -+++ b/xbmc/interfaces/python/xbmcmodule/keyboard.cpp -@@ -92,6 +92,9 @@ namespace PYXBMC - - if (!PyArg_ParseTuple(args, (char*)"|i", &autoClose)) return NULL; - -+ if (g_windowManager.IsWindowActive(WINDOW_DIALOG_PROGRESS)) -+ g_windowManager.CloseDialogs(); -+ - PyXBMCGUILock(); - pKeyboard->Initialize(); - pKeyboard->SetHeading(self->strHeading); diff --git a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch b/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch deleted file mode 100644 index ab26872ab7d..00000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-pvr-11.0.2-999.056-remove-broken-scrapers.patch +++ /dev/null @@ -1,7338 +0,0 @@ -From f8ef1ccfc32335af2608236dba4fd85084a94fee Mon Sep 17 00:00:00 2001 -From: Martijn Kaijser -Date: Sun, 8 Jul 2012 12:49:57 +0200 -Subject: [PATCH 1/4] remove broken scrapers - ---- - addons/metadata.albums.allmusic.com/addon.xml | 82 -------------------- - addons/metadata.albums.allmusic.com/allmusic.xml | 44 ----------- - addons/metadata.albums.allmusic.com/icon.png | Bin 12584 -> 0 bytes - .../resources/language/Bulgarian/strings.xml | 5 -- - .../language/Chinese (Simple)/strings.xml | 5 -- - .../resources/language/Dutch/strings.xml | 5 -- - .../resources/language/English/strings.xml | 5 -- - .../resources/language/Finnish/strings.xml | 5 -- - .../resources/language/French/strings.xml | 5 -- - .../resources/language/German/strings.xml | 5 -- - .../resources/language/Hungarian/strings.xml | 5 -- - .../resources/language/Korean/strings.xml | 5 -- - .../resources/language/Polish/strings.xml | 5 -- - .../resources/language/Portuguese/strings.xml | 5 -- - .../resources/language/Russian/strings.xml | 5 -- - .../resources/language/Spanish/strings.xml | 5 -- - .../resources/language/Swedish/strings.xml | 10 --- - .../resources/settings.xml | 5 -- - addons/metadata.artists.allmusic.com/addon.xml | 81 ------------------- - addons/metadata.artists.allmusic.com/allmusic.xml | 68 ---------------- - addons/metadata.artists.allmusic.com/icon.png | Bin 12584 -> 0 bytes - .../resources/language/Bulgarian/strings.xml | 7 -- - .../language/Chinese (Simple)/strings.xml | 7 -- - .../resources/language/Dutch/strings.xml | 7 -- - .../resources/language/English/strings.xml | 7 -- - .../resources/language/Finnish/strings.xml | 7 -- - .../resources/language/French/strings.xml | 7 -- - .../resources/language/German/strings.xml | 7 -- - .../resources/language/Hungarian/strings.xml | 7 -- - .../resources/language/Korean/strings.xml | 7 -- - .../resources/language/Polish/strings.xml | 7 -- - .../resources/language/Portuguese/strings.xml | 7 -- - .../resources/language/Russian/strings.xml | 7 -- - .../resources/language/Spanish/strings.xml | 7 -- - .../resources/language/Swedish/strings.xml | 12 --- - .../resources/settings.xml | 7 -- - addons/metadata.yahoomusic.com/addon.xml | 30 ------- - addons/metadata.yahoomusic.com/icon.png | Bin 17271 -> 0 bytes - .../resources/language/Dutch/strings.xml | 5 -- - .../resources/language/English/strings.xml | 5 -- - .../resources/language/Finnish/strings.xml | 5 -- - .../resources/language/Hungarian/strings.xml | 5 -- - .../resources/language/Korean/strings.xml | 5 -- - .../resources/language/Polish/strings.xml | 5 -- - .../resources/language/Portuguese/strings.xml | 5 -- - .../resources/language/Swedish/strings.xml | 9 --- - .../metadata.yahoomusic.com/resources/settings.xml | 4 - - addons/metadata.yahoomusic.com/yahoomusic.xml | 42 ---------- - 48 files changed, 585 deletions(-) - delete mode 100644 addons/metadata.albums.allmusic.com/addon.xml - delete mode 100644 addons/metadata.albums.allmusic.com/allmusic.xml - delete mode 100644 addons/metadata.albums.allmusic.com/icon.png - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/English/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/French/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/German/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml - delete mode 100644 addons/metadata.albums.allmusic.com/resources/settings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/addon.xml - delete mode 100644 addons/metadata.artists.allmusic.com/allmusic.xml - delete mode 100644 addons/metadata.artists.allmusic.com/icon.png - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/English/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/French/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/German/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml - delete mode 100644 addons/metadata.artists.allmusic.com/resources/settings.xml - delete mode 100644 addons/metadata.yahoomusic.com/addon.xml - delete mode 100644 addons/metadata.yahoomusic.com/icon.png - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Dutch/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/English/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml - delete mode 100644 addons/metadata.yahoomusic.com/resources/settings.xml - delete mode 100644 addons/metadata.yahoomusic.com/yahoomusic.xml - -diff --git a/addons/metadata.albums.allmusic.com/addon.xml b/addons/metadata.albums.allmusic.com/addon.xml -deleted file mode 100644 -index dea6306..0000000 ---- a/addons/metadata.albums.allmusic.com/addon.xml -+++ /dev/null -@@ -1,82 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° албуми от AllMusic.com -- AllMusic album information -- Alben Scraper für AllMusic.com -- Scraper de Ãlbums de AllMusic -- Scraper d'albums musicaux AllMusic -- AllMusic.com -albumitietojen lataaja -- AllMusic.com album információk -- AllMusic-albuminfo -- Informacje o albumach z AllMusic -- Scraper de músicas AllMusic -- Catalog AllMusic pentru informaÈ›ii albume -- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± альбоме из AllMusic -- AllMusic albuminformation -- AllMusic音ä¹ä¸“è¾‘ä¿¡æ¯ -- Попълнете метаинформациÑта в библиотеката Ñи от AllMusic.com. --УебÑайтът allmusic.com е Ñъздаден през 19995, като мÑÑто за ÑтраÑтни музикални фенове. --РедакторÑкиÑÑ‚ колектив AMG заедно ÑÑŠÑ Ñтотици екÑперти (и малко фанатици на тема allmusic.com) Ñа направили Ñайта един от най-подробните (и най-чеÑто ползваните) източници на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° музикална тема. Ð’Ñички те Ñа Ñе поÑветили на Ñъздаването и поддържането на базата от данни, на разпроÑтранÑването на Ñъдържание от AMG, което Ñе очаква от любителите на музика и профеÑионалиÑти в Ð¼ÑƒÐ·Ð¸ÐºÐ°Ð»Ð½Ð¸Ñ Ð¾Ñ‚Ñ€Ð°Ñъл. --ЗаÑегнати Ñа вÑички жанрове и Ñтилове музика. От най-комерÑиалните и популÑрни до най-невъзприетите. Критиката към артиÑти и албуми Ñе прави в контекÑта на Ñъответните им жанрове - от опера до гаражен рок. Така Ñе оÑигури актуална Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° почитателите на вÑеки Ñтил, за любимите им артиÑти и Ñе предÑтавÑÑ‚ нови творби. -- Use AllMusic.com to fill your library metadata information. --The allmusic website was created in 1995 as a place for music fans to indulge their passion. --The AMG editorial staff, along with hundreds of expert contributors (all music fanatics in their own right), has made allmusic the most comprehensive music reference source on the planet. They are all dedicated to creating and maintaining the knowledgeable, spirited content that music lovers and industry professionals have come to expect from AMG. --All genres and styles of music are covered here, ranging from the most commercially popular to the most obscure. We critique albums and artists within the context of their own genres - from opera to garage rock to traditional country. This ensures that fans of any style of music can depend on us to keep them up-to-date with their favorite artists as well as introduce them to new sounds. -- Benutze den AllMusic.com-Scraper um deine Musik-Bibliothek mit Metadaten zu füllen. --AllMusic.com wurde 1995 gegründet, um Musikliebhabern einen Platz zu geben, Ihre Leidenschaft auszuleben. --Die AMG Redaktion, zusammen mit hunderten Experten (alles Fachmänner auf Ihrem Gebiet) als Beitragende, machte AllMusic.com zur umfangreichsten Quelle für Musikinformationen auf dem Planeten. Sie sind alle engagiert, um den lebhaften Inhalt, welcher von Musikliebhabern und der Musikindustrie von AMG erwartet wird, zu Erstellen und Pflegen. --Alle Genres und Stile der Musik werden hier abgedeckt, reichend von Mainstream bis zum Underground. Wir schreiben Kritiken zu Alben, im Kontext zu dem passenden Genre - von Oper über Garagen Rock bis hin zu traditioneller Country Musik. Das garantiert Fans jeglicher Musikrichtung, dass sie sich auf uns verlassen können, weil wir sie immer up-to-date über Ihre Liblingskünstler halten und Ihnen auch neue Sounds vorstellen -- Este scraper utiliza Allmusic.com para rellenar la información de la librería musical. --La página web allmusic fue creada en el 1995 cómo un sitio donde los fans podíaan compartir su pasión por la música. --El equipo de AMG, junto con cuentos de colaboradores expertos (todos ellos fans de la música) han hecho de allmusic uno de los sitios más extensos del planeta. Todos ellos intentan crear y mantener unos contenidos que los amantes de la música y los profesionales del sector obtienen de AMG. --Todos los géneros y estilos musicales tienen cabida, desde los más comerciales hasta los más oscuros. En allmusic se critican los álbumes y los artistas en el entorno que les corresponde - desde opera, pasando por rock hasta country tradicional. Así se asegura que los fans de cualquier estilo de música puedan depender de nosotros para mantenerse al día de las novedades de sus artistas favoritos y descubrir nuevos sonidos. -- Käytä AllMusic.com -sivustoa täyttämään kirjastosi metatiedot. --AllMusic.com -sivusto luotiin vuonna 1995 paikaksi, jossa musiikkifanit voivat tyydyttää intohimonsa musiikkiin. --AMG-toimituksen henkilökunta, satojen asiansa tuntevien lahjoittajien kanssa (kaikki musiikkifanaatikot), ovat tehneet AllMusic.com -sivustosta koko planeetan kattavimman musiikkitietolähteen. He ovat kaikki sitoutuneita luomaan ja ylläpitämään asioista perillä olevaa henkevää sisältöä, jota musiikista pitävät ja musiikkialan ammattilaiset odottavat AMG:ltä. --Kaikki musiikin lajityypit ja tyylisuunnat ovat edustettuina täällä, vaihdellen kaupallisesti suosituimmista kaikista huomaamattomimpiin. Me arvostelemme albumit ja esittäjät heidän oman lajityyppinsä sisällä - oopperasta ja autotallirokista aina perinteiseen country-musiikkiin. Tämä varmistaa, että minkä tahansa tyylisuunnan fanit voivat luottaa, että samalla kun pidämme heidät ajan tasalla heidän lempiartististansa, niin esittelemme myös heille uusia äänimaailmoita. -- Utiliser AllMusic.com pour la récupération des méta-données. --Le site web AllMusic a été créé en 1995 afin que les fans de musique puissent assouvir leur passion. --L'équipe rédactionnelle d'AMG, forte de ses centaines de contributeurs avisés (tous passionnés de musique à part entière), a fait de AllMusic la source de référence la plus complète de toute la planète. Chacun s'investissant dans la construction et la maintenance d'un contenu aussi passionné et judicieux que tout amoureux de musique ou tout professionnel de l'industrie serait en droit d'attendre d'AMG. --Tous les styles et tous les genres y sont représentés, allant du plus commercial au plus confidentiel. Nous critiquons albums et artistes dans le cadre de leur propre style - de l'opéra à la country traditionnelle en passant par le rock garage. Pour les fans de chaque style musical, c'est l'assurance que nous les tenons informés sur leurs artistes préférés ou à l'apprentissage de nouvelles sonorités. -- Az AllMusic.com használata a médiatáradatok feltöltésére. Ez a webhely 1995-ben a zenerajongók szenvedélyének kiszolgálására jött létre. --Az AMG szerkesztÅ‘i csapata a szakértÅ‘ közreműködÅ‘kkel együtt (mind zenei fanatikus a maga nemében), az allmusic-ot a legátfogóbb zenei információforrássá tették a világon. --Minden létezÅ‘ stílus és zenei irányzat feldolgozásra kerül itt. Kezdve a legpopulárisabbtól a legismeretlenebbig. Mi kritikát mondunk a lemezekrÅ‘l és elÅ‘adókról, az operától a garázs rock-on át a hagyományos country zenéig. Ez biztosítja, hogy bármely stílus rajongói napra készek legyenek a kedvenc elÅ‘adóikkal, ugyanakkor az új hangzások is eljussanak hozzájuk. -- AllMusic.com gebruiken om de metadata van uw collectie op te halen. --De AllMusic-website werd in 1995 opgericht om muziekfans een online thuis te bieden. --De AMG-redactie heeft van AllMusic het meest complete muzieknaslagwerk gemaakt op deze planeet, mede dankzij de bijdragen van honderden experts. Het is hun missie om de hoogstaande inhoud te blijven aanbieden die muziekliefhebbers en professionals ondertussen van AMG verwachten. --Alle genres en stijlen - of het nu de meest commerciële of de meest obscure zijn - krijgen hier een plaatsje. We bespreken albums en artiesten in de context van hun eigen genre, van opera over garagerock tot traditionele country. Hierdoor kunnen fans van elke muziekstijl bij ons terecht voor de laatste informatie over hun favoriete artiesten, of om nieuwe muziek te leren ontdekken. -- Używa AllMusic.com do pobierania informacji o albumach z Twojej muzycznej biblioteki. -- Use o AllMusic.com para obter a informação da sua Biblioteca de música. O site allmusic foi criado em 1995 para alimentar a paixão dos fans de música. --O pessoal da redacção da AMG, em conjunto com centenas de especialistas (todos fanáticos por música à sua maneira), tornaram o allmusic o mais completo site de referência musical do planeta. Continuam dedicados a criar e manter o conhecimento, espírito e conteúdos que fans de música e profissionais da indústria se habituaram a obter da AMG. --Todos os géneros e estilos de música podem ser encontrados aqui, desde o mais comercial e popular até à música mais rara. Nós revemos e criticamos álbuns e artistas dentro do contexto do seu género - the ópera a rock de garagem, de pop a música country. Isto assegura que fans de qualquer género podem depender de nós para os manter actualizados sobre os seus artistas favoritos bem como de novos sons. -- FolosiÈ›i AllMusic.com ca sursă pentru mediateca dumneavoastră. --Site-ul allmusic a fost creat în 1995 ca un loc unde iubitorii de muzică să se răsfeÈ›e. Echipa editorială AMG, împreună cu sute de contribuitori experÈ›i (niÈ™te fanatici după muzică în felul lor), au făcut allmusic cea mai cuprinzătoare sursă de referinÈ›e muzicale de pe planetă. ToÈ›i sunt dedicaÈ›i să creeze È™i să întreÈ›ină conÈ›inutul pe care iubitorii de muzică È™i profesioniÈ™tii din industrie îl aÈ™teaptă de la AMG. --Toate genurile È™i stilurile de muzică sunt incluse aici, începând de la cele mai populare către cele mai obscure. Noi criticăm albumele È™i artiÈ™tii în contextul genurilor proprii. ToÈ›i fanii oricărui stil de muzică pot conta pe noi să îi È›inem la curent cu artiÈ™tii lor favoriÈ›i, dar È™i să le prezentăm noi cântece. -- ИÑпользуйте AllMusic.com Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð°-данных в вашу библиотеку. --Сайт allmusic был Ñоздан в 1995 как меÑто Ð´Ð»Ñ Ñ„Ð°Ð½Ð°Ñ‚Ð¾Ð² музыки, где они могли бы удовлетворÑÑ‚ÑŒ Ñвою ÑтраÑÑ‚ÑŒ. --РедакторÑкий ÑоÑтав AMG, вмеÑте Ñ ÑотнÑми учаÑтников-ÑкÑпертов (каждый по-Ñвоему фанат музыки), Ñделали allmusic Ñамым полным иÑточником информации о музыке на планете. Ð’Ñе они поÑвÑтили ÑÐµÐ±Ñ Ñозданию и поддержке полезного, и познавательного, контента который любители музыки, и профеÑÑионалы индуÑтрии, ожидают от AMG. --ЗдеÑÑŒ предÑтавлены вÑе Ñтили и жанры музыки, от Ñамых коммерчеÑки популÑрных до наиболее неизвеÑтных. Мы критикуем альбомы и иÑполнителей в контекÑте их ÑобÑтвенного жанра - от оперы и гаражного рока до традиционного кантри. Это обеÑпечивает то, что фанат любого ÑÑ‚Ð¸Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸ может полагатьÑÑ Ð½Ð° Ð½Ð°Ñ Ð² поддержке актуальноÑти Ñвоих познаний о любимом иÑполнителе и также раÑширÑÑ‚ÑŒ Ñвои знаниÑ. -- LÃ¥t AllMusic.com fylla dina mappar med metadatainformation. --AllMusic's webbplats skapades 1995 som en plats för musikälskare där de kunde njuta av sin passion. --AMG's redaktion har tillsammans med hundratals experter och bidragsgivare, alla musikfanatiker pÃ¥ sina egna sätt, gjort AllMusic till den mest omfattande källan inom musikreferens pÃ¥ den här planeten. De är alla kunniga och engagerade med att skapa och upprätthÃ¥lla ett innehÃ¥ll pÃ¥ webbplatsen, som musikälskare och branschfolk förväntar sig av AMG. --Alla genrer och stilar av musik behandlas här, allt frÃ¥n det mest kommersiellt populära till det mest suspekta. De kritiserar album och artister inom ramen för sina egna genrer, allt frÃ¥n opera, garagerock till traditionell countrymusik. Detta säkerställer att alla fans oavsett musikstil kan lita pÃ¥ dem och hÃ¥lla sig uppdaterade med sina favoritartister och bli introducerade till nya ljud. -- 从AllMusic.com网站获å–音ä¹èµ„料。 --allmusic网站创建于1995年,它是音ä¹çˆ±å¥½è€…çš„ä¹å›­ã€‚ --AMG的编辑和许多专业撰稿人(都是音ä¹ç‹‚热分å­ï¼‰å…±åŒæŠŠallmusic建æˆä¸–界上最全é¢çš„音ä¹èµ„料库。他们致力于创造和维护音ä¹çˆ±å¥½è€…和业内专业人士期望从AMG得到的知识和精神产å“。 --这里涵盖了所有的音ä¹æµæ´¾å’Œé£Žæ ¼ï¼Œè¯„价从最æµè¡Œåˆ°æ™¦æ¶©å’Œå†·é—¨çš„音ä¹ï¼Œè®¨è®ºä¸åŒé£Žæ ¼çš„专辑和艺术家 - 从歌剧到摇滚ä¹åˆ°ä¼ ç»Ÿçš„乡æ‘音ä¹ã€‚力求让所有音ä¹çˆ±å¥½è€…都能在这里了解他所喜爱的艺术家最新动æ€ï¼Œå¹¶ä¸ºä»–们介ç»æ–°çš„音ä¹ã€‚ -- all -- -- -diff --git a/addons/metadata.albums.allmusic.com/allmusic.xml b/addons/metadata.albums.allmusic.com/allmusic.xml -deleted file mode 100644 -index 1e86b27..0000000 ---- a/addons/metadata.albums.allmusic.com/allmusic.xml -+++ /dev/null -@@ -1,44 +0,0 @@ -- -- -- -- -- (allmusic.com/album/.*) -- -- -- -- -- -- -- -- -- -- -- <td class="text-center">[^<]*<a href.*?www.allmusic.com/album/([^"]*)">([^<]*).*?<td>([^<]*)</td>.*?<td>.*?<td>([^<]*) -- -- -- <td class="text-center">[^<]*</td>.*?www.allmusic.com/album/([^"]*)">([^<]*).*?<td>([^<]*)</td>.*?<td>.*?<td>([^<]*) -- -- -- -- -- -- -- -- <h1 class="title">([^<]*)</h1> -- -- -- <a href="http://www.allmusic.com/album/([^"]*)">Overview< -- -- -- <meta name="title" content="([^-]*)- ([^<]*)" /> -- -- -- <a href="http://www.allmusic.com/album/([^"]*)">Overview< -- -- -- <a href="http://www.allmusic.com/album/([^"]*)">Overview< -- -- -- -- -- -diff --git a/addons/metadata.albums.allmusic.com/icon.png b/addons/metadata.albums.allmusic.com/icon.png -deleted file mode 100644 -index 9c18e20111f1fed8e64c953057274b43c58fbeef..0000000000000000000000000000000000000000 -GIT binary patch -literal 0 -HcmV?d00001 - -literal 12584 -zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F -z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f -zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b -z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ -z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ -zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz -zAi082_V3b^XI=KgANV6LL -zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP -zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF -zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw -z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR -z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys -z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D -z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH -zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn -z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( -z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH -zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa -zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB -zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA -zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 -z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK -z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) -zyB`c7|3N6k5q$CQ(PFSer%%D@ -z7n -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 -z)sC5E|ws -zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA -z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u -zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU -z#|~thGoUPelc>KIkDF&G -zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o -zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb -z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y -zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD -zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp -z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 -zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` -z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN -zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha -zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi -zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o -z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq -z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg -z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW -zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH -z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! -z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A -zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ -zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* -zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l -zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ -zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e -zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE -zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x -z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw -zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh -zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 -zrx|`}gDZVX6{jd)H4o -zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP -zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI -zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge -zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs -z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? -z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 -z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> -z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 -ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG -z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S -zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o -zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 -z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) -zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X -z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i -zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI -z7PKqr&+>B8QSiepK1yNOlk -zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< -zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 -z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| -z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ -zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q -z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d -z4cSeAh+BD?v-)h3awd -zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c -z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( -z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh -zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V -z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU -z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq -zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} -zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU -zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? -zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z -zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R -zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw -zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- -zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I -zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY -z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl -z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb -z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n -zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr -zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< - -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml -deleted file mode 100644 -index 7b03b74..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Bulgarian/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Вземи Ñнимки за албум от Allmusic.com -- Вземи Ñнимки за албум от Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml -deleted file mode 100644 -index 6b0eca4..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Chinese (Simple)/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- 从Allmusic.com获å–专辑图片 -- 从Last.fm获å–专辑图片 -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml -deleted file mode 100644 -index 556ea1c..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Dutch/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Allmusic.com gebruiken voor albumminiaturen -- Last.fm gebruiken voor albumminiaturen -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml -deleted file mode 100644 -index 661ec19..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/English/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Grab album thumbs from Allmusic.com -- Grab album thumbs from Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml -deleted file mode 100644 -index 75d3ef6..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Finnish/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Hae albumin kuvakkeet osoitteesta Allmusic.com -- Hae albumin kuvakkeet osoitteesta Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml -deleted file mode 100644 -index 93bda6f..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/French/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Récupérer les pochettes album depuis Allmusic.com -- Récupérer les pochettes album depuis Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml -deleted file mode 100644 -index d418c1f..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/German/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Ziehe Alben Cover von Allmusic.com -- Ziehe Alben Cover von Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml -deleted file mode 100644 -index 5038141..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Hungarian/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Album bélyegkép letöltése az Allmusic.com-ról -- Album bélyegkép letöltése a Last.fm-rÅ‘l -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml -deleted file mode 100644 -index a5202b8..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Korean/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Allmusic.com ì—ì„œ 앨범 사진 가져오기 -- Last.fm ì—ì„œ 앨범 사진 가져오기 -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml -deleted file mode 100644 -index d521f48..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Polish/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Pobierz miniatury albumów z Allmusic.com -- Pobierz miniatury albumów z Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml -deleted file mode 100644 -index 2b2b603..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Portuguese/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Descarregar miniaturas do álbum de Allmusic.com -- Descarregar miniaturas do álbum de Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml -deleted file mode 100644 -index 6f34cd6..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Russian/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Получать миниатюры альбомов Ñ Allmusic.com -- Получать миниатюры альбомов Ñ Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml -deleted file mode 100644 -index 16b217f..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Spanish/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- Descargar imágenes de Allmusic.com -- Descargar imágenes de Last.fm -- -diff --git a/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml b/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml -deleted file mode 100644 -index 3804ab1..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/language/Swedish/strings.xml -+++ /dev/null -@@ -1,10 +0,0 @@ -- -- -- -- -- -- -- -- Hämta albumminiatyr frÃ¥n Allmusic.com -- Hämta albumminiatyr frÃ¥n Last.fm -- -\ No newline at end of file -diff --git a/addons/metadata.albums.allmusic.com/resources/settings.xml b/addons/metadata.albums.allmusic.com/resources/settings.xml -deleted file mode 100644 -index 3071c6d..0000000 ---- a/addons/metadata.albums.allmusic.com/resources/settings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- -- -diff --git a/addons/metadata.artists.allmusic.com/addon.xml b/addons/metadata.artists.allmusic.com/addon.xml -deleted file mode 100644 -index 41e7af2..0000000 ---- a/addons/metadata.artists.allmusic.com/addon.xml -+++ /dev/null -@@ -1,81 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -- Инф. за артиÑти от AllMusic + Ñнимки на артиÑти от HTBackdrops -- AllMusic artist information + HTBackdrops artist images -- Scraper für Künstler-Informationen von AllMusic.com -- Descarga información de Artistas de AllMusic -- AllMusic.com -esittäjätietojen ja HTBackdrops-esittäjäkuvien lataaja -- Scraper d'artistes musicaux AllMusic -- AllMusic elÅ‘adó információk -- AllMusic-artiestinfo -- Informacje o artystach AllMusic -- Scraper de músicas AllMusic -- Catalog AllMusic pentru informaÈ›ii artiÈ™ti -- Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑполнителе из AllMusic -- AllMusic artistinformation + HTBackdrops artistbilder -- AllMusicè‰ºæœ¯å®¶ä¿¡æ¯ -- Попълнете метаинформациÑта в библиотеката Ñи от AllMusic.com --УебÑайтът allmusic.com е Ñъздаден през 19995, като мÑÑто за ÑтраÑтни музикални фенове. ЗаÑегнати Ñа вÑички жанрове и Ñтилове музика. От най-комерÑиалните и популÑрни до най-невъзприетите. Критиката към артиÑти и албуми Ñе прави в контекÑта на Ñъответните им жанрове - от опера до гаражен рок. --Home Theater Backdrops (HTBackdrops.com) предÑтавлÑва база от данни Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð²Ð¸Ð¶Ð²Ð°Ð½Ð° от общноÑтта около уебÑайта. Съдържа виÑококачеÑтвени изображениÑта на артиÑти под формата на миниатюри и fanarts. Ð’Ñички те Ñа Ñъздадени или произхождат от общноÑтта. МолÑ, обмиÑлете възможноÑтта да качите Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° любимите ви артиÑти. -- Use AllMusic.com to fill your libray metadata information. --The allmusic website was created in 1995 as a place for music fans to indulge their passion. All genres and styles of music are covered here, ranging from the most commercially popular to the most obscure. We critique albums and artists within the context of their own genres - from opera to garage rock to traditional country. -- --Home Theater Backdrops (HTBackdrops.com) is a community driven image database for high quality artist images like thumbs and fanarts. All images have been created or sourced by its members. Please consider uploading your own images of your favorite musician. -- Benutze den AllMusic.com-Scraper um deine Musik-Bibliothek mit Metadaten zu füllen. --AllMusic.com wurde 1995 gegründet, um Musikliebhabern einen Platz zu geben, Ihre Leidenschaft auszuleben. --Die AMG Redaktion, zusammen mit hunderten Experten (alles Fachmänner auf Ihrem Gebiet) als Beitragende, machte AllMusic.com zur umfangreichsten Quelle für Musikinformationen auf dem Planeten. Sie sind alle engagiert, um den lebhaften Inhalt, welcher von Musikliebhabern und der Musikindustrie von AMG erwartet wird, zu Erstellen und Pflegen. --Alle Genres und Stile der Musik werden hier abgedeckt, reichend von Mainstream bis zum Underground. Wir schreiben Kritiken zu Alben, im Kontext zu dem passenden Genre - von Oper über Garagen Rock bis hin zu traditioneller Country Musik. Das garantiert Fans jeglicher Musikrichtung, dass sie sich auf uns verlassen können, weil wir sie immer up-to-date über Ihre Liblingskünstler halten und Ihnen auch neue Sounds vorstellen -- Este scraper utiliza Allmusic.com para rellenar la información de la librería musical. --La página web allmusic fue creada en el 1995 cómo un sitio donde los fans podíaan compartir su pasión por la música. --El equipo de AMG, junto con cuentos de colaboradores expertos (todos ellos fans de la música) han hecho de allmusic uno de los sitios más extensos del planeta. Todos ellos intentan crear y mantener unos contenidos que los amantes de la música y los profesionales del sector obtienen de AMG. --Todos los géneros y estilos musicales tienen cabida, desde los más comerciales hasta los más oscuros. En allmusic se critican los álbumes y los artistas en el entorno que les corresponde - desde opera, pasando por rock hasta country tradicional. Así se asegura que los fans de cualquier estilo de música puedan depender de nosotros para mantenerse al día de las novedades de sus artistas favoritos y descubrir nuevos sonidos. -- Käytä AllMusic.com -sivustoa täyttämään kirjastosi metatiedot. --AllMusic.com -sivusto luotiin vuonna 1995 paikaksi, jossa musiikkifanit voivat tyydyttää intohimonsa musiikkiin. Kaikki musiikin lajityypit ja tyylisuunnat ovat edustettuina täällä, vaihdellen kaupallisesti suosituimmista kaikkein huomaamattomimpiin. Me arvostelemme albumit ja esittäjät heidän oman lajityyppinsä sisällä - oopperasta ja autotallirokista aina perinteiseen country-musiikkiin. --HTBackdrops.com -sivusto on yhteisön ylläpitämä tietokanta korkealaatuisille esittäjä- ja fanitaidekuville. Sivuston jäsenet ovat luoneet kaikki sivuston kuvat. Lähetä meille itse tekemäsi suosikkiartistiesi kuvat, jotta voimme lisätä ne tietokantaan. -- Utiliser AllMusic.com pour la récupération des méta-données. --Le site web AllMusic a été créé en 1995 afin que les fans de musique puissent assouvir leur passion. --L'équipe rédactionnelle d'AMG, forte de ses centaines de contributeurs avisés (tous passionnés de musique à part entière), a fait de AllMusic la source de référence la plus complète de toute la planète. Chacun s'investissant dans la construction et la maintenance d'un contenu aussi passionné et judicieux que tout amoureux de musique ou tout professionnel de l'industrie serait en droit d'attendre d'AMG. --Tous les styles et tous les genres y sont représentés, allant du plus commercial au plus confidentiel. Nous critiquons albums et artistes dans le cadre de leur propre style - de l'opéra à la country traditionnelle en passant par le rock garage. Pour les fans de chaque style musical, c'est l'assurance que nous les tenons informés sur leurs artistes préférés ou à l'apprentissage de nouvelles sonorités. -- Az AllMusic.com használata a médiatáradatok feltöltésére. Ez a webhely 1995-ben a zenerajongók szenvedélyének kiszolgálására jött létre. --Az AMG szerkesztÅ‘i csapata a szakértÅ‘ közreműködÅ‘kkel együtt (mind zenei fanatikus a maga nemében), az allmusic-ot a legátfogóbb zenei információforrássá tették a világon. --Minden létezÅ‘ stílus és zenei irányzat feldolgozásra kerül itt. Kezdve a legpopulárisabbtól a legismeretlenebbig. Mi kritikát mondunk a lemezekrÅ‘l és elÅ‘adókról, az operától a garázs rock-on át a hagyományos country zenéig. Ez biztosítja, hogy bármely stílus rajongói napra készek legyenek a kedvenc elÅ‘adóikkal, ugyanakkor az új hangzások is eljussanak hozzájuk. -- AllMusic.com gebruiken om de metadata van uw collectie op te halen. --De AllMusic-website werd in 1995 opgericht om muziekfans een online thuis te bieden. --De AMG-redactie heeft van AllMusic het meest complete muzieknaslagwerk gemaakt op deze planeet, mede dankzij de bijdragen van honderden experts. Het is hun missie om de hoogstaande inhoud te blijven aanbieden die muziekliefhebbers en professionals ondertussen van AMG verwachten. --Alle genres en stijlen - of het nu de meest commerciële of de meest obscure zijn - krijgen hier een plaatsje. We bespreken albums en artiesten in de context van hun eigen genre, van opera over garagerock tot traditionele country. Hierdoor kunnen fans van elke muziekstijl bij ons terecht voor de laatste informatie over hun favoriete artiesten, of om nieuwe muziek te leren ontdekken. -- Używa AllMusic.com do pobierania informacji o zawartoÅ›ci Twojej muzycznej biblioteki. -- Use o AllMusic.com para obter a informação da sua Biblioteca de música. O site allmusic foi criado em 1995 para alimentar a paixão dos fans de música. --O pessoal da redacção da AMG, em conjunto com centenas de especialistas (todos fanáticos por música à sua maneira), tornaram o allmusic o mais completo site de referência musical do planeta. Continuam dedicados a criar e manter o conhecimento, espírito e conteúdos que fans de música e profissionais da indústria se habituaram a obter da AMG. --Todos os géneros e estilos de música podem ser encontrados aqui, desde o mais comercial e popular até à música mais rara. Nós revemos e criticamos álbuns e artistas dentro do contexto do seu género - the ópera a rock de garagem, de pop a música country. Isto assegura que fans de qualquer género podem depender de nós para os manter actualizados sobre os seus artistas favoritos bem como de novos sons. -- FolosiÈ›i AllMusic.com ca sursă pentru mediateca dumneavoastră. --Site-ul allmusic a fost creat în 1995 ca un loc unde iubitorii de muzică să se răsfeÈ›e. Toate genurile È™i stilurile de muzică sunt incluse aici, începând de la cele mai populare către cele mai obscure. Noi criticăm albumele È™i artiÈ™tii în contextul genurilor proprii. -- --Home Theater Backdrops (HTBackdrops.com) este o bază de date de imagini realizată de comunitate pentru imagini de înaltă calitate ale artiÈ™tiilor, cum ar fi miniaturi È™i imagini realizate de fani (fanarts). Toate imaginile au fost create sau au ca sursă membrii ei. Vă rugăm să luaÈ›i în considerare că puteÈ›i încărca propriile imagini cu muzicianul preferat. -- ИÑпользуйте AllMusic.com Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð°-данных в вашу библиотеку. --Сайт allmusic был Ñоздан в 1995 как меÑто Ð´Ð»Ñ Ñ„Ð°Ð½Ð°Ñ‚Ð¾Ð² музыки, где они могли бы удовлетворÑÑ‚ÑŒ Ñвою ÑтраÑÑ‚ÑŒ. --РедакторÑкий ÑоÑтав AMG, вмеÑте Ñ ÑотнÑми учаÑтников-ÑкÑпертов (каждый по-Ñвоему фанат музыки), Ñделали allmusic Ñамым полным иÑточником информации о музыке на планете. Ð’Ñе они поÑвÑтили ÑÐµÐ±Ñ Ñозданию и поддержке полезного, и познавательного, контента который любители музыки, и профеÑÑионалы индуÑтрии, ожидают от AMG. --ЗдеÑÑŒ предÑтавлены вÑе Ñтили и жанры музыки, от Ñамых коммерчеÑки популÑрных до наиболее неизвеÑтных. Мы критикуем альбомы и иÑполнителей в контекÑте их ÑобÑтвенного жанра - от оперы и гаражного рока до традиционного кантри. Это обеÑпечивает то, что фанат любого ÑÑ‚Ð¸Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸ может полагатьÑÑ Ð½Ð° Ð½Ð°Ñ Ð² поддержке актуальноÑти Ñвоих познаний о любимом иÑполнителе и также раÑширÑÑ‚ÑŒ Ñвои знаниÑ. -- LÃ¥t AllMusic.com fylla dina mappar med metadatainformation. --AllMusic's webbplats skapades 1995 som en plats för musikälskare där de kunde njuta av sin passion. Alla genrer och stilar av musik behandlas här, allt frÃ¥n det mest kommersiellt populära till det mest suspekta. De kritiserar album och artister inom ramen för sina egna genrer, allt frÃ¥n opera, garagerock till traditionell countrymusik. -- --Home Theater Backdrops (HTBackdrops.com) är en gemenskapsdriven bilddatabas för högkvalitativa miniatyrer och fanart pÃ¥ artister. Alla bilder har skapats eller bidragits frÃ¥n medlemmarna. Överväg att ladda upp dina egna bilder av dina favoritartister. -- 从AllMusic.com网站获å–音ä¹èµ„料。 --allmusic网站创建于1995年,它是音ä¹çˆ±å¥½è€…çš„ä¹å›­ã€‚ --AMG的编辑和许多专业撰稿人(都是音ä¹ç‹‚热分å­ï¼‰å…±åŒæŠŠallmusic建æˆä¸–界上最全é¢çš„音ä¹èµ„料库。他们致力于创造和维护音ä¹çˆ±å¥½è€…和业内专业人士期望从AMG得到的知识和精神产å“。 --这里涵盖了所有的音ä¹æµæ´¾å’Œé£Žæ ¼ï¼Œè¯„价从最æµè¡Œåˆ°æ™¦æ¶©å’Œå†·é—¨çš„音ä¹ï¼Œè®¨è®ºä¸åŒé£Žæ ¼çš„专辑和艺术家 - 从歌剧到摇滚ä¹åˆ°ä¼ ç»Ÿçš„乡æ‘音ä¹ã€‚力求让所有音ä¹çˆ±å¥½è€…都能在这里了解他所喜爱的艺术家最新动æ€ï¼Œå¹¶ä¸ºä»–们介ç»æ–°çš„音ä¹ã€‚ -- all -- -- -diff --git a/addons/metadata.artists.allmusic.com/allmusic.xml b/addons/metadata.artists.allmusic.com/allmusic.xml -deleted file mode 100644 -index 7ea01cc..0000000 ---- a/addons/metadata.artists.allmusic.com/allmusic.xml -+++ /dev/null -@@ -1,68 +0,0 @@ -- -- -- -- -- (allmusic.com/artist/.*) -- -- -- -- -- -- -- -- -- -- -- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/credits" -- -- -- (.+) -- -- -- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/biography" -- -- -- (.+) -- -- -- <meta name="title" content="([^"]*)".*?<a href="http://www.allmusic.com/artist/([^/]*)/discography" -- -- -- (.+) -- -- -- <td><a href="http://www.allmusic.com/artist/([^"]*)">([^<]*)</a></td>[^>]*>([^<]*)</td>[^>]*>([^<]*)</td> -- -- -- -- -- -- -- -- <meta name="title" content="([^"]*) -- -- -- http://www.allmusic.com/artist/([^&"/]*)/ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -diff --git a/addons/metadata.artists.allmusic.com/icon.png b/addons/metadata.artists.allmusic.com/icon.png -deleted file mode 100644 -index 9c18e20111f1fed8e64c953057274b43c58fbeef..0000000000000000000000000000000000000000 -GIT binary patch -literal 0 -HcmV?d00001 - -literal 12584 -zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F -z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f -zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b -z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ -z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ -zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz -zAi082_V3b^XI=KgANV6LL -zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP -zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF -zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw -z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR -z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys -z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D -z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH -zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn -z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( -z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH -zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa -zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB -zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA -zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 -z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK -z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) -zyB`c7|3N6k5q$CQ(PFSer%%D@ -z7n -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 -z)sC5E|ws -zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA -z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u -zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU -z#|~thGoUPelc>KIkDF&G -zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o -zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb -z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y -zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD -zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp -z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 -zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` -z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN -zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha -zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi -zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o -z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq -z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg -z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW -zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH -z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! -z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A -zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ -zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* -zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l -zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ -zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e -zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE -zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x -z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw -zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh -zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 -zrx|`}gDZVX6{jd)H4o -zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP -zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI -zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge -zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs -z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? -z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 -z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> -z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 -ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG -z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S -zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o -zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 -z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) -zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X -z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i -zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI -z7PKqr&+>B8QSiepK1yNOlk -zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< -zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 -z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| -z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ -zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q -z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d -z4cSeAh+BD?v-)h3awd -zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c -z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( -z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh -zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V -z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU -z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq -zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} -zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU -zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? -zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z -zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R -zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw -zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- -zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I -zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY -z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl -z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb -z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n -zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr -zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< - -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml -deleted file mode 100644 -index ebedf10..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Bulgarian/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Включи поÑтер -- Вземи Ñнимки за албум от Allmusic.com -- Вземи Ñнимки за албум от Last.fm -- Вземи Ñнимки за албум от HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml -deleted file mode 100644 -index 0dae926..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Chinese (Simple)/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- å¯ç”¨åŒäººç”» -- 从Allmusic.com获å–艺人图片 -- 从Last.fm获å–艺人图片 -- 从HTBackdrops获å–艺人图片 -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml -deleted file mode 100644 -index 19ece63..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Dutch/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Fanart inschakelen -- Allmusic.com gebruiken voor artiestminiaturen -- Last.fm gebruiken voor artiestminiaturen -- HTBackdrops gebruiken voor artiestminiaturen -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml -deleted file mode 100644 -index 7534b41..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/English/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Download Fanarts from HTBackdrops.com -- Grab artist thumbs from Allmusic.com -- Grab artist thumbs from Last.fm -- Grab artist thumbs from HTBackdrops.com -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml -deleted file mode 100644 -index ae4ff3c..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Finnish/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Fanitaide käytössä -- Hae esittäjän kuvakkeet osoitteesta Allmusic.com -- Hae esittäjän kuvakkeet osoitteesta Last.fm -- Hae esittäjän kuvakkeet osoitteesta HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml -deleted file mode 100644 -index 27f6352..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/French/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Activer les Fanarts -- Récupérer les images artistes depuis Allmusic.com -- Récupérer les images artistes depuis Last.fm -- Récupérer les images artistes depuis HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml -deleted file mode 100644 -index 9e44c44..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/German/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Aktiviere Fanart -- Ziehe Bilder des Künstler von Allmusic.com -- Ziehe Bilder des Künstler von Last.fm -- Ziehe Bilder des Künstler von HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml -deleted file mode 100644 -index 3502108..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Hungarian/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Fanartképek letöltése a HTBackdrops.com-ról -- ElÅ‘adó bélyegkép letöltése az Allmusic.com-ról -- ElÅ‘adó bélyegkép letöltése a Last.fm-rÅ‘l -- ElÅ‘adó bélyegkép letöltése a HTBackdrops.com-ról -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml -deleted file mode 100644 -index e62f7b7..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Korean/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- 팬아트 가져오기 -- Allmusic.com ì—ì„œ ìŒì•…ê°€ 사진 가져오기 -- Last.fm ì—ì„œ ìŒì•…ê°€ 사진 가져오기 -- HTBackdrops ì—ì„œ ìŒì•…ê°€ 사진 가져오기 -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml -deleted file mode 100644 -index 5a4ab39..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Polish/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- WÅ‚Ä…cz fanart -- Pobierz miniaturÄ™ artysty z Allmusic.com -- Pobierz miniaturÄ™ artysty z Last.fm -- Pobierz miniaturÄ™ artysty z HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml -deleted file mode 100644 -index bbe7a67..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Portuguese/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Ligar Fanart -- Descarregar miniaturas do artista de Allmusic.com -- Descarregar miniaturas do artista de Last.fm -- Descarregar miniaturas do artista de HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml -deleted file mode 100644 -index 7d24737..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Russian/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Включить Фанарт -- Брать миниатюры Ñ Allmusic.com -- Брать миниатюры Ñ Last.fm -- Брать миниатюры Ñ HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml -deleted file mode 100644 -index 7ce046c..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Spanish/strings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- Descargar Fanart -- Descargar miniaturas de artista de Allmusic.com -- Descargar miniaturas de artista de Last.fm -- Descargar miniaturas de artista de HTBackdrops -- -diff --git a/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml b/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml -deleted file mode 100644 -index a63aa7c..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/language/Swedish/strings.xml -+++ /dev/null -@@ -1,12 +0,0 @@ -- -- -- -- -- -- -- -- Ladda ner fanart frÃ¥n HTBackdrops.com -- Hämta artistminiatyr frÃ¥n Allmusic.com -- Hämta artistminiatyr frÃ¥n Last.fm -- Hämta artistminiatyr frÃ¥n HTBackdrops.com -- -\ No newline at end of file -diff --git a/addons/metadata.artists.allmusic.com/resources/settings.xml b/addons/metadata.artists.allmusic.com/resources/settings.xml -deleted file mode 100644 -index bbae2a6..0000000 ---- a/addons/metadata.artists.allmusic.com/resources/settings.xml -+++ /dev/null -@@ -1,7 +0,0 @@ -- -- -- -- -- -- -- -diff --git a/addons/metadata.yahoomusic.com/addon.xml b/addons/metadata.yahoomusic.com/addon.xml -deleted file mode 100644 -index 425358f..0000000 ---- a/addons/metadata.yahoomusic.com/addon.xml -+++ /dev/null -@@ -1,30 +0,0 @@ -- -- -- -- -- -- -- -- Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„. за музикални клипове от Yahoo! -- Yahoo! Music Video Scraper -- Yahoo! musiikkivideotietojen lataaja -- Yahoo! videóklip leolvasó -- 야후! ë®¤ì§ ë¹„ë””ì˜¤ 스í¬ëž˜í¼ -- Scraper teledysków Yahoo! -- Scraper de música Yahoo! -- Skrapa för Yahoo! musik -- Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° музикални клипове -- Download Music Video information -- Lataa musiikkivideoiden tiedot -- Videóklip információk letöltése a Yahoo! webhelyrÅ‘l -- ë®¤ì§ ë¹„ë””ì˜¤ ì •ë³´ 다운로드 -- Pobieraj informacje o teledyskach z music.yahoo.com -- Descarregar informação de filmes de music.yahoo.com -- Ladda ner musikvideoinformation frÃ¥n music.yahoo.com -- -- -diff --git a/addons/metadata.yahoomusic.com/icon.png b/addons/metadata.yahoomusic.com/icon.png -deleted file mode 100644 -index f04e6f44aa41fa0d3f839984aebc31e9ff771f8f..0000000000000000000000000000000000000000 -GIT binary patch -literal 0 -HcmV?d00001 - -literal 17271 -zcmZs?1yCGK*fqLH(8V=CU?Bu|3-0dj?(XjH!JPmBf?I&#&f)|JAwclJ;;zBr&imcE -zRp0&V->R+|sM+qB>F(z_=R9ZQRF!2g&`8igAP|O}tfV>!1P7eLfl%Oq!yL8Hf+t&1x}PC^3W>h5A~=V%22`7Re|*l21T -z5DML{UyCcmhGr!j8y%|y&yQ>Idl|Izfyib8(GXN)}eT=AzWxA -zT)$^3uL4RaK1kF*NxU2+Dh(G}kVB&Z`ho~DowP8AfmE46rnDiubD+?IyW9XckU<6| -z0o<2V5CqRERuW_@0IHqQj+X-IvVrie6^8ggf0#jRayr(spl@xU{%LIVCJ+i3#HJP- -zMGry@0GW=xfA0&5%mv{~U+M^6FxF%5F#vBWw@I*rnolas0EO8NSx1M3oNiil7uMgaA0W_|R07~>ubzFUG3%$Nd6HT&O_&e+kY1_G&0#M)Gc~TF -zAkd~~@azi{Ycolx08*&aOUZ{*L|bF@FJ89^)=gNVEub$4%Q{!C|GgWj;*^f1rJe2V -zKk`H324)jFK`%CgCjC0kj`zWWPq#OJd$*{=IE=z%5bypD{jWl1~O_q6T -zLw|jGH%B!jXWpU9fDco{bxV@WOT6MJqlyzxqaXh8>(z2=gXs}Lc!L}C&0ZKTAeFh& -z$O7S?0xh<#XaCkM2z1%yGVq%Y1tHWnVspml^-Sbh=F10AsI^?08wg}9NzI};(JV5G -z0s={X31j#sMtVI!%+!xWHt=S30R737CsLexXiywm9L+M6%-xi}He8%8dg|Ld22{*wOX -ztp5IhsVbjKmgIf<__C!#6Ea^06NGUrYP(h|?cV~b9G!e0LE -z4)zY$4w6+4hnQArp88s4u_g|8vc7m-ajSZRT1+J#mscL&R0N@%LRno&<{XJFk?pNr -z!@g%H&RQn9a`sQ1Uy}zi``P;l*FIp3Xo85*SR1;x`NYV?HgA218*&uO-_9kx9o1y} -z$bOWwmy4C_qNU5w$`DA9I)RocpGlKR%D}2wRb5`aUX8AGr8TLUTxF~gR4=W?sR64( -z{hd{#Rb8NZq(Q1-QzcLtQ*Be}qABtR(|D#Ka?8J6RA_t{e!b&swh`zkno -z9si7ei=MQcOR>$B#w(?i9L -z3|JSb8BC3|0-h!o9Oia&5q!rwx^kf=VFVSGC^O46%ifGk?U)rTotOS3jg@FOVhE## -zIgL1tl+qy4P|_$U9V(sXsVjAq)0Yb<3Mh_F{g^75TFB+j7h+%J*vsF`U(DZVGu8Li -zXKJl%ZMTwZ+SV`EJ8kWDj?(ATE7R4|H)@uyE2#Uh&{fw}fm6|;oUU9`xL^bQcF{WC -zTGjUU+s+@PmHJkv)*v$*b0V9z;dF|iSicN@92%luh7G}vO9a$Ue -z*_QXbaWmTV|8-N4-<&^qQn}J_%5!RW8nasTgR6+XP><8&Cv;5WuiDP62zpT_o5MzJ -zu!@9Am`%&xdsYk9RGqrTZ*65h)wgD6M8f}s-HTwtFu{-O9P4@}KR))ijkQgxKwSz= -zqBbN#-oIMD`oGSCDndWN*&xJ)iG>-!Ki>HVQuZZ@@UK|?Yg#%HOZ?IyMj)0PUKhSI -zP)BJycAQd2dApZ0ojPrY8KoM$zwi^;Y}YIS8Vsh5iiy&R7D;lA)g_r_&*t`-U6t_I -zkbIELl3dTXVOQa6V3y}*5Uysi7hL|>$<-+`!eXuWV_vsFSI$v^jE{w(p2yj-cjM{g -zDrT!-3mq0fl*2k^j-{8AJ -z8!FaWp4r$x5{3-q%9pYXO8#lbsomUu)We)*OgkNsv{fnHiWrJ(`TT{1dEO8w4k7*? -z_K3996gTl|N~QExn?svjYwyWgtEi@zVdsQ4R`N{bafjxV+BbU4XszPq`;eN%B0d|5Sxj8i8+nkQCLK7KwcdOg7%#NAA5EsIvrVScB(+f!@L*CgoXw}J*E -zc*7X2jZ`bx9^cB~G_O)~qLW=8+(YB9g?TY -zOlORx3+rbVamEbd>f9ws%`qj89Jqh-iM*yw-fsv(>}p!@b&c)WK-3r(aESz*~#r>6yX=b -zGxB@P*2RwB^Y4BMX{skLFdoTZj#Bi#6rA}mWAI>Tefm7I_1;y|Z~NdDb>o&CgMZmO -zF`#x6d5*&Soy|K|d-1%>Jn4Lmyhj6bgHDwn!m|s9>;6wND->9txdiq61g?#iq0Fm&iR_3vp3u)aMYE&MpWcHQH5LHN2bU&tr4)^p|W -zayxu`vq88P>`wbUJ=wM7Lwj1+t%hl|v%q>z> -z#LP?TO){3mo8;W&$!Lt|qe5O`KE5px_veGB3W*uZ8Ja?(my(ysdLlyB;Jf*w#p&6c -z+2ZWW?DRgTz_RDV{-d`IDlA#|^{_l-9i -zKPw*7-=?R(A|m8mJy~!vuK;)xVj-)p1OoYg0D(dyK%o0q;CKK6d9i^&ho&G9e+~#l -ztf5XJvR)u#XGomoA(9n}PnQ|B_J -z=gLj*jYF^4JoXAbPM?FPefT!6gwC1Uo(SMUIaQ+l??E6$;FkYa%c1Y*#S}ygeX9t7 -zXfOywgAF{080K5NJU;q0&rxk>52I9;InNos5Iies? -zDA3{m+2%-1-+@f6@j$f*AP^papMb&tcQZu-MT)_NB7s0TjU@kb5e9GpaNU26Z7vY# -zF>cUS^W;zCk29>?Da@`ln5(Z4dEW-br9XnP3mbk3Uy_Ahl0tXRdz1)xMR-@T$*K8L -zIufutzEq63C!1`CVQ|-)MO(mU=|ZR} -zF(#roxr%AI5JeJD;y$AP4(OU -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 -zLat|J0(&bfZ6);e4~84!VlCR**(1gUK~?dU -zu7y6((;t$$7?N4lWT7H96Xw){5+CMVlBqoZ(9ai+e= -za_qp88L`L(iFc-aPL{pqls*C^M}a!8!=qv0=&COn+jOOkb*01OlYD0To55>;q4+@! -z7^07-=l9mucu99ev5FrENp*N+>tg615C~a51H^X2{|FnJSlCUUYWcE>6{4b~G&Mf{ -zmaqI`D}hz`VhE2XU#Uuwm1SKv?UmlWL0ci@38s}mM5H*?blN`PW=OZ4AT3VAA_Zgw -z%oqWI6_D7urZ%Ib`TZRv$s#=*#0G9KXfwSzEU_hIHYMJ?;-v83cWYP_Smg$?6+j6$ -zSVQg=@~5oXey}jF$)~-_=}nH$z8>lrWU(+Sx*lNRL9ksp!9s7G3V7WH&uq$R-uTC( -zq!|9ax;JQJVPKh#RqjAtbDn>FnxUYJkKeyMUG2Ck%QhBQV-g5(bGy*myhVea1Kg$W -zX(wydP@+kY&{y6bAyT}!*=9zbnt_Z+i2|P5$m~sven-&bAf3t{A=*x6W>(uqu+7iC -zqQJ}Xn?;k?C7U9gNZ)_Q7|k{&I4mbadsp?{?gKry#sy)gmiFtW78Vu;2Kk20 -ziC%AO>Ak{(dPRp&IU3(>{Wz-cQlv|?|DaC&tMBntM<$634ojZe;)NTlVRH-C`Z -zoGx$xIDNXOS2WNe@VaQ`{le8fPgnU6anPcgs#q5&pqffqJ0tk4DrANMC-LY+jW1*msJ!NU{uq__7VMjW-$mh_Q&=1+P;ms1?!|O^QPuGzsqemVUvuaKL5WA -z4Fg}E?q@y{5|)dNqt?vJV{gZ1M$p13DJjj*&*RDw#*Y+}=zt4M8y3$l?$WQ$%h -z08NL^PR&@@1~#%q$Eqwhu2B;A8{bhg5TZNx`gzI8(PaDpQpVv~+t|**tlSuH -z*_eGxFtEts;pDJ!lM*Df4*%GPo;n*CN^|R}R%IBpX2cI$#2Qhdbi40-1_)U(wTzEX -z+uXtCg*jM^lqK=27CGkAJDCX-Y^S -zh{>Ag0X2C=EiD45C{=2pKW=DA4xlwzW+TOvHZ(W$Pb5fDi9`Oh^^%@QeVF6&qrv6>KfTvCDIIJeKpe>t|!azm&fJ!UoPo+H(LR&cZ_BN8*W6!sH7} -ziRhx(kBwQpIV424+)VP~ND&g@0(}hAu -z7l@^-s=~tb_Rh|y$Hy!Tc|@b4azFMM5{8Ym=2MPILSZFS2RTSF2}_Qx4Sg^AbQz=9 -zu`JPM)ipJKf@ZbJgGrol-Rq_v9xm$Wh@)-;Uq0qBnh~dsORAv)7DRI_#S^&;}JRt`2ojRQ&e3*GHtH0vib -ze)f2x1|;nLlhUlGmdS>WkrBF*4;%Q%)i=!_1yBOrx`IfQPIH*>5W_~lKMXV-H(HEJ -zQoRwA-4a-*rwW}U;P>4B(XNuHK;_fXw~^cZ+|bYva?-LmWPYQIo-xNYw`hZfSi<~e -zZDnQUzZ^U)V&Zxje_O;m8+^KYUsAF?iA$=X9GG?rhX#uxGXADtcYp6OO7iN)+s)eZ -zT>!h1DB+%-o?gC8y!nUy%5oOY|LU1}H5$wvS3vf!hAz(tiy -z1Nvvl&R3*~7)Z&_uUR|-=z)=*-guKOnMPpZw7Fy9fxBlzb -z!L0x#%GQN1q8KnZHVPSLjHZ3Ro7!sgPGeQjL^qZ&FK>W%n0T=))wpZd+H5|ebKA`3 -zd938%HdQ}>se~W)->3aPyml -zS8uNUjSP9+mlTX>xj5W_o%5b#Ku#Pa}pJYW8H*g*j6o(Dn5zFPv0Zxm}hOef;Hp -zAP|sydY+$eH$(#OT&=CYBSU!$);l}BvoIc>MLx69rplsh;dX_?coD^9(}pg1iGJ?# -zo&sr4$nWy2bb5Lk?#d;znKt!r(&UJ$_>yHHo4yu?ys%ekl9;UQ4#nZoDt`ue)CQy5 -zpH0`h=iubgIUr=u&Z-$0OuCVY$x^4;VhNxlRROv5d)W?ScFpTn3^1WI=@`_2K7lAE -zcscgo%F5~@Gqfk*_T~93L`E&x`yVb?;h_MGdV**oDT91jA@Y3o`WS*$Y`eOPP%(GE -zUz$wL>uOrbj1FZ3zo(nPL)(E5|iVAuFa5a8sf7#C#I81P5#gV$?cy{KaSI5$|R^XWn(G7ei4->U+ -zK|1ZZ9RQX}Zf$LCm17>YTpD$8Zj4aCzg0kL3+@x)_6nAk=0hBSrNbeHeRS&lVX4jz -zCIzbxK;D6)1AD&=Zyg^r>M_+9l6TD?x_1Q?W4}Y29e@lsF-^Lo?%0op3>Q*sJUk-! -zY&_Qh?7)B9Vh=>)d=vC^G3vAKXQQH$tgMrg-DXea(1;iYA1!+o00apIw#_P)fG6fhBUfROVY%^MJDW+_8tYj7h -ztty4a+_tt9h(WdVn!^dV33mD -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 -z($Tf6(+Cw3L6i(_x~I^2`g>ECW^ -z|GUn?K!U~&I*lf2;c%|dyeTV7)sZz0zPGBFv*XID*3|oX -z4UhY89ruZqN;hk%?QC0>)PJ@FH~IqHDWRQZwot3^yK!=7xyz?PvV?3}`BN_~)JQOC -z!`n;G!9Fj#OT8H4(ia3fYIwC@Y2D#3zzzQ!C)h8h1Z68(WPC4V<2_R-geXP=E|a5V -zws=t3$}|N>Oc$Pbb*x4Rn{;}zi-D&t0VgHq1npY04VKcJyp?syz1>+~2q3H`yM{@> -z@4A|<0fd#Vvo03}x$&<`<5gAmsdVAaRaI4uOOE_&pKX8brl}xMyDXX!|MN$P!NgG3 -z*RGk5ibBe=Li(fNtG84umK}7r8ABJJ{*`5RWPV}S_qfqUMyODW2G1nurbOgvb0LPJ -zmy*!|SGrhx5-}WQvot9QvthA9(^_Hg&VixmEc8YeRs2k9Ml>0jjn`y2lriHv@Z_)AgjjMUV$Y#Wk0t)QUi -zVu=__4!k6EJU?6iAUDAD*7tHVUsKXD%DPK|o~{uyGl)5t9|qEE=_;NNw8Yk#k7{wiY#J+XsCP*75=u(_Gp -zK)Zm5VbhD$7dmH-Oagqvy7??Et(GV|*X#Y+&H9<~@gEZ;GxE7hjuiSR2;q=aSuP*v -z&HhRf*Kj<{jo_7iZ!BYMpp2U)Pg$oed=3RTRs=Fu+E?KUG`QgN+=;5~S_1y(WgxHa*XQD-Dg|d`!q;ad`Qnl8bxlE8D2Xc6D -zyQwXcY{R0P7ILpOh-6zEiqm6RkFiwFii -za7{KLQr=V2g-PP6hRdq!sJc$QJQLsuOtB?S&I={o&1aivOBn`+n%xx!IR6-vg;V=7 -zG@SZgX~1+}-GSEzh&8)w<>lo-5nZlKn%qTDyJ>Q#ron~u!7n)YWq0a50a3@z!VS** -zYe1A3VjJk^E(dC&Px~@8G0rB5U;R{D_+5D65#j6Iz~_Tey`?gJq%_oJ0e72D&=dRw -ze1SB~OE^ -zhY6W2jll&c!I0L{tvW)UkMcJcpqG~%g@NvStxl6I`orJE2oQ4xKJFz6)cZeO6qJ>9 -z#IfoVbA3AB$<_k)EzeUtT$jxZpsMmD-OWg8YW{XwYSJuD!OA_?1hy9j0J(KEKliy7 -zvwrp|$am0f|7JS<`A2LU5TsosBqEGMmiqSvCf%_So&Kn{I_k~F;oT4r?5PykbLAuN -zjbvt68ihQ^1EBJK{7tq=FyDD0akOMD^C(P8Ro=@h==Et2S-{(nv~fniZi}d|-5NGB -zIbG=FV7q^O(h^mZ(ZuAyQ8hQGaqVvx0m=mlxY&s+*73zb`LzEghcTp|AOv!vPGV+H8L4wASubj|HQuQ -zcW5)t%p}{pP%6!-2;WmnsUbiOH{qux0JV8kYK-sZ{tmE9B!t{g!rVIoC20}K&Ax*1 -zO6XoCcS*33-fk6m^Vg4zT!ESl|patU?GKL-e)SncyY9ap=Odb -z%)}if`??oE00opX1Ez)8;Zh?1Og-P_Rr6s -zbL;DG$GsaWD=Ss$IM@_u&$NL&_5ZMBaQJCx0MO1CsKrE`KHYiL00v -z83p~YQt_B&&hLDemjjHCtEw6roQFsSVn)>f!rtFk3_OqzAJk>Z?rUw;W9S(&1*+&6 -zdkt8JfDKS4dBMuc4!PGWd$J|q);W$^ib?scXV1z>LzSJS-s=~;riuz=lE%DDeW98@ -ziq4k@(!Ckhr4A1pKfez7GAa~ts#HU8-$P)pD8#gFWu{2vbu)(Ibg7xva8|8sVthhB -z%53Q8V-eq6lN(G$iN^VAcj{_yCR@JDz2oyJEN)nY+8HroKokPVd+#u1yu5B08@k;A -z)!3Chf0lQ{mI+;^jdjra>i2vLc$E@g`p@87vqX14KvsBux{{y>R0YCGXPrS?R(AHJ -zB}b|(HSV)&e}a`>!=i#(#^lc7$%&Bv^*&Hr(b3b3gGg#GOdt}m`Ce=V;C=@2PNPTp -z3-I@r*}aNVez6l18{n33vL(lASyDD&xM5qYe|H2id5bA@G9YFpG>e30skl`C#Qmf!j8M2vhuW4*&?8nt*jX6=l}&<`kHzBwiPpC -zoH$JyjSg`fvz}atYf(d8&+~rD^rNfb2U?po+d{1|XP2XW-Z+?|zP`Pkot?kGzqNI_ -zB8`O}p_Ez-6u`ECF9E3h11#>uyK58{W+n;zQdhx%8n+4#js~rwxu)i*ON^j_8rMjA -z)N{i=HNvbsu|tH%$P1=)y{ccQ9RRrgRLAK}; -zK`<;qlA*2@s0F;|EzoxGkdcY(MlIu5vFv2Z)9H7sU0Zi<;ptct0^?Z{=b2T)+2dgn -zp-QQdjYd&d=`eTt+ymm>uC -z!KljI48vjKVWO0THSCIPhvs;bzi{UGpxa~#ZWLf7pn}3j?D_wUl}T?F-ywrDg*t5? -zIh}xhn&_b_pkdJCF-><0&}9q_H(DJT8PfD7J!+9)XqX|`!2F4y!AAiy+~xorX+y#d -znY -- -- -- Afmetingen van de voorbeeld afbeeldingen -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/English/strings.xml b/addons/metadata.yahoomusic.com/resources/language/English/strings.xml -deleted file mode 100644 -index b41bc3e..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/English/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- Thumb(s) Size -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml -deleted file mode 100644 -index cba8217..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Finnish/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- Pienoiskuvien koko -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml -deleted file mode 100644 -index 8944ed5..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Hungarian/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- Bélyegképek mérete -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml -deleted file mode 100644 -index 4532347..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Korean/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- 미리보기 í¬ê¸° -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml -deleted file mode 100644 -index 05b9a8d..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Polish/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- Rozmiar miniatur -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml -deleted file mode 100644 -index 72d365c..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Portuguese/strings.xml -+++ /dev/null -@@ -1,5 +0,0 @@ -- -- -- -- Tamanho de miniaturas -- -diff --git a/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml b/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml -deleted file mode 100644 -index aa781c2..0000000 ---- a/addons/metadata.yahoomusic.com/resources/language/Swedish/strings.xml -+++ /dev/null -@@ -1,9 +0,0 @@ -- -- -- -- -- -- -- -- Miniatyrstorlek -- -diff --git a/addons/metadata.yahoomusic.com/resources/settings.xml b/addons/metadata.yahoomusic.com/resources/settings.xml -deleted file mode 100644 -index 373a6de..0000000 ---- a/addons/metadata.yahoomusic.com/resources/settings.xml -+++ /dev/null -@@ -1,4 +0,0 @@ -- -- -- -- -diff --git a/addons/metadata.yahoomusic.com/yahoomusic.xml b/addons/metadata.yahoomusic.com/yahoomusic.xml -deleted file mode 100644 -index 9bd5a3f..0000000 ---- a/addons/metadata.yahoomusic.com/yahoomusic.xml -+++ /dev/null -@@ -1,42 +0,0 @@ -- -- -- -- -- -- -- -- -- -- -- <Video.*?title="([^"]*)".*?copyrightYear="([^"]*)".*?\/([0-9]*)\?size.*?name="([^"]*)".*?</Video> -- -- -- -- -- -- -- -- <Video.*?title="([^"]*)" -- -- -- <Artist.*?name="([^"]*)" -- -- -- <Release.*?title="([^"]*)" -- -- -- label="([^"]*)" -- -- -- copyrightYear="([0-9]*)" -- -- -- <Category.*?name="([^"]*)" rating="([^"]*)" type="Genre"> -- -- -- \/([0-9]*)\?size -- -- -- -- -- --- -1.7.10 - - -From 4c4ccf0e898d8ad1636a9fec5d22c4b1195ca520 Mon Sep 17 00:00:00 2001 -From: Martijn Kaijser -Date: Sun, 8 Jul 2012 12:54:29 +0200 -Subject: [PATCH 2/4] update common scraper modules - ---- - addons/metadata.common.allmusic.com/addon.xml | 2 +- - addons/metadata.common.allmusic.com/allmusic.xml | 523 +++++++++++++++++--- - addons/metadata.common.allmusic.com/icon.png | Bin 0 -> 12584 bytes - addons/metadata.common.amazon.de/addon.xml | 17 + - addons/metadata.common.amazon.de/amazonde.xml | 15 + - addons/metadata.common.fanart.tv/addon.xml | 41 ++ - addons/metadata.common.fanart.tv/fanarttv.xml | 58 +++ - addons/metadata.common.htbackdrops.com/addon.xml | 2 +- - .../htbackdrops.xml | 35 +- - addons/metadata.common.htbackdrops.com/icon.png | Bin 0 -> 11423 bytes - addons/metadata.common.last.fm/addon.xml | 2 +- - addons/metadata.common.last.fm/icon.png | Bin 0 -> 14392 bytes - addons/metadata.common.last.fm/lastfm.xml | 278 ++++++++++- - addons/metadata.common.musicbrainz.org/addon.xml | 43 ++ - .../musicbrainz.xml | 170 +++++++ - 15 files changed, 1081 insertions(+), 105 deletions(-) - create mode 100644 addons/metadata.common.allmusic.com/icon.png - create mode 100644 addons/metadata.common.amazon.de/addon.xml - create mode 100644 addons/metadata.common.amazon.de/amazonde.xml - create mode 100644 addons/metadata.common.fanart.tv/addon.xml - create mode 100644 addons/metadata.common.fanart.tv/fanarttv.xml - create mode 100644 addons/metadata.common.htbackdrops.com/icon.png - create mode 100644 addons/metadata.common.last.fm/icon.png - create mode 100644 addons/metadata.common.musicbrainz.org/addon.xml - create mode 100644 addons/metadata.common.musicbrainz.org/musicbrainz.xml - -diff --git a/addons/metadata.common.allmusic.com/addon.xml b/addons/metadata.common.allmusic.com/addon.xml -index 0fc8372..8a990a9 100644 ---- a/addons/metadata.common.allmusic.com/addon.xml -+++ b/addons/metadata.common.allmusic.com/addon.xml -@@ -1,7 +1,7 @@ -  - - - -diff --git a/addons/metadata.common.allmusic.com/allmusic.xml b/addons/metadata.common.allmusic.com/allmusic.xml -index dec3959..fa593d6 100644 ---- a/addons/metadata.common.allmusic.com/allmusic.xml -+++ b/addons/metadata.common.allmusic.com/allmusic.xml -@@ -1,147 +1,506 @@ - -- -- -- -- <td class="sorted cell">([^<]*)</td>.*?<td class="cell"><a href="[^>]*>([^<]*)<.*?<td class="cell">([^<]*)< -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <td class="year[^"]*"(?:\stitle="[^"]*")*\s*data-sort-value="[^>]*>([^<]*)</td>[^<]*<td class=".*?title="([^"]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- -- (.*?)&(.+) -+ -+ " itemprop="description">(.*?)div class="advertisement leaderboard"> - -- -+ -+ -+ last.fm -+ -+ ^$ -+ -+ - (.+) - -- -+ -+ -+ -+ -+ -+ -+ - -- -- -+ -+ - -- -- Biography</h2>.*?</p>(.*?)</p> -+ -+ -+ -+ -+ " itemprop="description">(.*?)div class="advertisement leaderboard"> - - - -- -- -+ -+ -+ -+ -+ -+ -+ -+ - -- -- <h2 class="title">Review</h2>.*?</p>(.*?)</p> -+ -+ http://schema.org/MusicGroup">[^<]*<span itemprop="name">([^<]*)</span> - -- -+ - -- -- -- -- -- <meta name="title" content="([^"]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ -+ MusicBrainz -+ -+ ^$ -+ -+ -+ <(?:born|formed)*>(.+)</(?:born|formed)*> - -- -- <h3>Born[^>]*>[^>]*>(.*?)</p> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- -- <h3>Birth[^>]*>[^>]*>(.*?)</p> -+ -+ <dt>\s*Born[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Died[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Formed[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ <dt>\s*Disbanded[^>]*>[^>]*>[^>]*>(.*?\d{4})\s*([^<]*)? -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- -- <h3>Died[^>]*>[^>]*>(.*?)</p> -+ -+ <dd class="active">([^<]*)< - -- -- <h3>Formed[^>]*>[^>]*>(.*?)</p> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- -- <h3>Disbanded[^>]*>[^>]*>(.*?)</p> -+ -+ - - -- <h3>Years Active</h3>(.*?)</p> -+ <dt>Genres</dt>(.*?)</dd> -+ -+ -+ <li><a href="/genre/[^"]*">(<strong>)?([^<]*) - -- -- <span class="active">([0-9]+)</span> -+ -+ -+ last.fm -+ -+ <genre></genre> - -- -- (.+)/ -+ -+ <genre>(.+)</genre> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -- <h3>Genres</h3>(.*?)</div> -+ <dt>Genres</dt>(.*?)</dd> -+ -+ -+ <li><a href="/genre/[^"]*">(<strong>)?([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- -- <a href="/explore/genre/[^>]*>(<strong>)?([^<]*) -+ -+ - - -- <h3>Styles</h3>(.*?)</div> -+ <dt>Styles</dt>(.*?)</dd> - -- -- <li>[^>]*>([^<]*)</a></li> -+ -+ <li><a href="/style/[^"]*">([^<]*) -+ -+ -+ -+ last.fm -+ -+ <style></style> -+ -+ -+ <style>(.+)</style> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <dt>Styles</dt>(.*?)</dd> -+ -+ -+ <li><a href="/style/[^"]*">([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - -- <h3>Moods</h3>(.*?)</div> -+ <h4>artist moods</h4>(.*?)</ul> - -- -+ - <li>[^>]*>([^<]*)</a></li> - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- <h3>Instruments</h3>(.*?)</div> -+ <h4>photo gallery</h4>(.*?)<h4> - -- -- <li>[^>]*>([^<]*)</a></li> -+ -+ <img src="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*) - -- -- <img id="artist_image" src="([^"]*)" -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <span itemprop="description">([^<]*) - - - -- -- -- -- -- <meta name="title" content="([^-]*)-[^<]*" /> -- -- -- <meta name="title" content="[^-]*- ([^<]*)" /> -- -- -- <h3>Rating</h3>[^_]*_r([0-9^]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <div class="album-title">([^<]*) - -- -- <h3>Label</h3>[^>]*>([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <div class="album-artist">[^>]*>([^<]*) - -- -- <h3>Type</h3>[^>]*>([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ itemprop="rating">([0-9^]*) - -- -- <h3>Release Date</h3>[^>]*>([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <dd class="release-date">([^<]*) - -- -- <span>Release Date.*?([0-9]+)</ -+ -+ <dd class="release-date">([^,]*,)?([^<]*) - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- <h3>Genre[s]?</h3>(.*?)</div> -+ <dd class="genres">(.*?)</dd> - -- -+ - <li>[^>]*>([^<]*)</a></li> - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- <h3>Style[s]?</h3>(.*?)</div> -+ <dd class="styles">(.*?)</dd> - -- -+ - <li>[^>]*>([^<]*)</a></li> - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- <h3>Mood[s]?</h3>(.*?)</div> -+ >\s*<h4>album moods</h4>(.*?)</ul> - -- -+ - <li>[^>]*>([^<]*)</a></li> - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - -- <h3>Theme[s]?</h3>(.*?)</div> -+ <h4>album themes</h4>(.*?)</ul> - -- -+ - <li>[^>]*>([^<]*)</a></li> - -- -- "cell">([0-9]+)<.*?<td class="cell">[^>]*>([^<]*)</a></td>.*?<td class="cell">([0-9]*:[0-9]*)</td> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <td class="tracknum">([0-9]*).*?<div class="title">[^>]*>([^<]*).*?<td class="time">([^<]*) - -- -- http://image.allmusic.com/([^"]*)" -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <meta property="og:image" content="http://cps-static.rovicorp.com/3/JPG_[^/]*/([^"]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ - - - -- -+ -+ - -diff --git a/addons/metadata.common.allmusic.com/icon.png b/addons/metadata.common.allmusic.com/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..9c18e20111f1fed8e64c953057274b43c58fbeef -GIT binary patch -literal 12584 -zcmY*<1yoeu7w#ZPcOxO)5+dCVN=SF7bV?81(jp}-B?wBVLx;2oNJ$OdL)Y-`@cX~F -z)>~(>=3ef(d!PO7z0W=8d^`57nj#M7GfWT&grlq^rwIZf0hdT1bX4HS*rVJQ_`z^f -zGVla}u!stBVt8>(+^^f!fMUm)_RGytc*Cs3R@G^4-8fn&I`$_eJ`Mg5>^PT|-bOja@GObyZQt|?gZ{n%@hI!rDuKQ?fjYOYxZIng8D#jX}J#H7_W4b -z0)bY&z>{!J?z(3oqNpLx@FJ!|6nj&w0`JRs+gd!S22jDyyxyrB0vq|lQ -z>s}cni(h&{aJz1^PQ81lYp~ee<@w6bHOA1FCZUQbS1a8kXDTIBl%daiE`N=PG6SL$I7I#^)dZ^uwGl{yhWB+<_CRukU$DZc~Nd+ -zg?#ab1z+E*bL|oYg0;DJ{b5B%4zUkk9rt-SlDt5MDyO=GK&EnxT-v|tBnQwz -zAi082_V3b^XI=KgANV6LL -zL0^Sk+5hajZWVG{?77wW4<8i5Q29;_0Tdq@S_>L!C4CirwZBT`v{a0*2<9;aF_0rP -zx>@Mc%HPy8w-Q|Ul3Tvyjn-G`6TWF(B0eaX_2{6zW37wzAKzZHJF -zXfo_@R^+@=dd848G;i%#izfV$la^yJ5}FI`f$~8qp>!}K%v?(;_b*pkYpj~T99~mw -z;BUOzK()zyDXmkSt+`ZQs7=71WGM5kuu-!{Bf6aEm3OxAXgI0zo04xu=~K__$?PxR -z)ogpU5-g?DsAWv({T|*?+|JlWKJ&rGi6RLfh_Pd($RS4~x1;bOugO#?rI?DR7|`Ys -z9$xvRG17qG#7EUH0|N{_ni7mb1+X6xmcF4CG+=k*x54>hEW>K_D -z8he_%r8TFuREAkbswysWUd{E@v4pa)P0k16Qg)b`_tP{aPsO$DpI^t;4OI~Lz4pEH -zP1(63wmxbdHY4f+_87TXAHTb+7&Z66!ik2gNsp9liAB0a#%e@L%cNNGv_gUc-iLSn -z#_Nph&i&5)#muP8bj)v5cU2FwHC0?V>u)3^zs9nPr1Gg1-ir%-`?@c8>UoS0=$RsW#Jo48i*2M(>z5HijHX_*BG}tt( -z-s75Q7P%}N%l>Z@;C}Kqy34K1v6QiQxRGzc+cOhr7Mm9FJz#8>$mmGDD9J>(82x9HyczsH -zlZ&#R%W^kzpXC1K*zu|h*SvVm&o1$m%Ry{ju=Q1|WIva!!N|0JuD-I<8!BNg_G$qa -zr=QDr2dB|%xocSK0c4rngC=f%g=5`kk!7S6T!fq=pQKb`)Pz1BOXIVblYU@=5&1AB -zV)}JcciYi(PYO)N{FOCkr%{6`v8(#0?x(c#`!V+Mm2hsfM6gsOx2xc&Eaiygk!HWA -zb$%%>(!m>^nv(1;^Oa6Dt@VR@m3bVa2P1XA7Lo-&ALTzB5Ox!;rZ$#Dz0rF?t-sk(!R-lWwh%rNY>)V`ijcl7VB}_-?lrO|6b%7 -z;ePs>v6+GEf-^T?kF%^>e{g;wzrdX_%DT`N-YDBr3=wN?w<#MM8x@t*{-S-ReWNXK -z_XB^ny|Q<-Nqv&jlSM9o1>uX`5T++qz51>e#P4SD$X3O}?o) -zyB`c7|3N6k5q$CQ(PFSer%%D@ -z7n -z-kTkp%$zLDfMujXoC8blcRTkeY8Lvt`)Pg-`SS6ap6T8mbong$P#+a9KNAQP5)J}gKLEcwAdoi?2()Vs -z0*PdTKxD3|W_=1E5VMxDoV2#@{C=*H8|7@)*29uLs5i11zdbFLH6>Napq5iOm1&^b -zTfxe8U-ff*nL{c}MKcW+&aqK3_jTy!h%U|D#{q2`BE6Zk==Lw|8-@e5sqXu|KS+dY -zOWq1<*7x4#(n>u+aYq}ING?(W1tGUm;;ihEWmHU|p(Vf{Aj{Wd305C?|NQPF&z#$v -zE~SV%H%*8PS&C7V`{?fdE0-E#gD#61zrQBQY5x-jA{;lmvxJo_c4 -zv{3>fY?cy6IlasR75rIMiux97(2Ss(2&VO?Mz$Eg9-ov>l1?%fB9I_czMspC7%a4g -z2|DXU|5ny%R>uY^=!{ZUZYHQeN6y7A0}eW50y=OPR}~!kJX!{=v4L`Pa%dafMLf1? -z4vuX^M?{;_43ip6>L*`gfYv~is!Q9IE~RLJ*UQS6n_G~&cuutbAY=%d7=-=@jF{z2 -zl}qF~CPGvcy1{{6vc^YOV)kE;{{V~%zl*eaN(hXXE|{8JKFb6{I^Yq99PDcj{NN5c -z2pBE=?W4?^irRS!P%Hv&2s2=su_Ln#7>8bv4x&67mTZ<$E2GmlKRD=WtrwaMDeZNI -z<47w3N*Om>c`&8#+ur==gUUfOeO(^ys%KabrxQW|UO`qE*(VYQokvrxiPJMkpb$#B -zU=#Y_r)vNZH6`0la)2?**1b}L>M4s-S_J=v0_7|#3J_QdV1{16wUUF}5_lnxCPP+L -zJa;q!1Wxmk6qW)?ftJ!v59M~1#YZTJgL=Os4%1kB -z#NUC8Mh3iL^Z#ki>;BKZfD(&>Yl9wo38zjY;kf(RtK -z;Pvb{sX&NNcgavSx$r)$B4TUz@3nj2B`stc8>wU(mPo<1h67O$R*)I&ul0_<}aV*Us~;nTXf<*KE}mkkx*-L;$9 -zm?}URd`8Sb6JT~81pE|{?^4VRa0?WYm(d^RkXa(wFeM1_DC_kSWnVZfUHz%R?oSgl -z=;k-0tEqfAO5WBRQt!4U-|LMGI(^RC{F50YR|`Ks3aSB;dn1Ybft{%`cle#34ESZ7 -z_=BiGT?8aSjW%r82qF8JejJ1|X;HDPV=W9WNBf)07 -z@t4DIITun)_G=fMR)o|hxBfZ_3aT<|6Ok9$BL~ -zIjY_|yb}8)OW+q8SKnj*dS#dpEL^IA3(HVuj$7#0Hz+OhVbo*X6yd@AQ=su-oNE}q -zzkWJAFYnRO3o&T|iOW|J!1g?L*Z}vmst!8$64gp>DTuw>SL-5yqM`usqp#`(1#pXe -zEWY@~j!vZ_8@kH||3)Q6O$#BgmL61ZK>{5M<%AG2D710cEEFn@RACO9eMFvM3ajMD -z4o@-jJlV@7*JcnY@y=i!CjJx|`|GP}t&ZWvaj1*(Y6+jgXA%FmT2MVlVh8jHK_b}R -zr)I5N3ja;iXRN6?80!r(2V)_4vS@8xu^$5hxAFJGN^Ccupl6?V;Vee<#FW>>U!CLI -zQ$tZ5UL+k~t>sm4NS|Dj)PRE}IWCZ)?@{eU`{Dx1MP^ -z33OJ}5txQbHD46*5CY#*EJKB3W3Fgz_DCmzHk}sQPM4;mEP)D2m>&L6VM)v{e0#2p -zWkc<5a^Lu;VUgS|LdvS5wR4=cb5xz~-!VxiBel+{hA6BCZ9NA!PK}O=fvrMQ$hykU -zz$UqCF{{B%kHHNJp~Udc)9?CMaS8IQdUshWs9IWD%|1sorDbIV*r)`ta>;6CDGR1_ -zHb3;un-*5zw@uE>ME(3JfsKP>@c_SHJG~zL*sLW@l5>KhOHZ)>$vKhttg)e+nRv@E -z+>t8Ct_$h)0jz9p&<|oac3m2`kS~YN6dv(rBWV9ZDQoKPL;f+ -z664h1q5p|VB6Gd3$@V)}dG&zdvDeBarM2Xk47o#3jCbB&<#PEhj@6=c5F0A8=b$!K -z!j>SZ1FI1=b0y{fCT>tS!!06a1o4+tXwydNAoo* -zO7?89u~xmI`fAg|zc(%qf*?B20nvE;AZobTzIn(BHv@{spJp^Vk09hji){r%n+ -z&n>sr?x(K=1!vo@kjyRmrxLr*$usWnYyDg)K~&?V%F5hP;~S0K%!|P -zN;*60d25!mc62p#-WJoBR`dYhPC*tD_bumyKI~rvMHKT+(#r;k3wZ`gY2InYOMg%s -zvGNvYzZPZEd?#n=K7xj%GEzKbE3a4iJlcO@lH~ZHq&$!&<3XU&CXl_lMl$HxC|C6E -zAXP#iZ_D?vmJObwr{meYx@QY4niLVmIhh8APscsC9ZrfMO+-u15`88p(h2suvUKh6 -zn?0qnDUuyGU;;d9KgE@}JC+UH5?$^}QWqkBlerB3> -zZmdqec%}CjKXLs#VVpUW7m-yRSj^iWUE)&r)t#k3O@7h`h7|3~068mn;}+hilR5eJ -z<3H;wCAw-7+Z?~DI_r-E=g1-9we)1;o<-g)n(qSr_h>dh$=Y;~4tb%bVR2*{>q{$E -z;@Kq~Mh~p}vEs+erz0IxH8E+EXh>#_t&H_jF>iiK8QqXyMy}wPa#~3c{MY#qwD-b0R}C(jAo-@$(+)b^PXXUb?mEv8>Uw0CP(x0%5{Hsoe1+;MSc2My$Lt9W{@ -zR_}$4`{ih389&paZ}03#^N=s@Z0R|mfQ}b@mLsQaduAbU?*l>~e;>Awjgh<~s0^7n -z)sC5E|ws -zeKy6#GCA^Xvq<>^g?J&Kt`_dIm;%8*9*Ss&U_*g?wCK-H0lqCU2EMr>-VQ7kMH}ZA -z3$9jyfySb|ltKhCI?Nc;dJ;7zL1N=p-Y>#ZhMsDCwJ?k^8#M+$^~PJym1C_fOu1@u -zINIC!^QY=d-q3b0l>}w(g!G+J@86llh<_Kla~H>&gJ!!T{%7U;iDGSLT>P(&0UeHU -z#|~thGoUPelc>KIkDF&G -zC!rW{7xF)2&E9`6c7HZSF7h7x+qZA2xNY_I5t865I{0xHT5U^srCyB-MF_>sk%%{o -zq1dQUKp?1tI<&)noZOaF&wXRY#Hn8^Zm$mGi5j(d2m_kGIS2WaTIug*ao%{NOIyZb -z3N&+%1yH8ixPGO-o~#CsT5ES+A_zDYh|qMk(aU)r9@OzShJ{x|B0Rv8b7BW=*5%I97*G*+^inI-Bq43p`j0vb4E7$VeWatt2vh8nEuq61r(u^)`D25c`zK;6y -zeAJcw-yf|@cw7J4^S`r^WokImtmHSA3!DB0Z8#E1SY!`(!h~$s*btrXE0JaD3@grD -zY+`LoQ3KI8lLW`>Yx$C731Zk%LbajV%#}hS@95z#S)KS&Qc1>(?{8nn1z(o&i{`jp -z^b+jv*@us>a~fn!SuCGE;I?(_+wrzh^=sOjT#(wO;cO-16__x`or)z1K**fI+&2O9 -zCqu{NhRCDG&gz4j^$c%?`H-e#f_>H@cN^U6ePm`I+il*x!&q%-n9oM<{b<92d*QW` -z#W(N<(7E9)dh)lEwv%^`YIr$Un2sI3^e{X1FYG-;ulA=kdxCz2_|XUtRdb~iuEEfN -zGZ9L2u4){Er(O;oZkwvcLvDp~$Psv%yk`*ldH;o~00-bJMhRBha -zZ;e~+3A++Foi8K!Qk;y-_%GjN(edlDDSdtY3DYYZV181dvdma==u1nY(NUp|zBRNi -zR<-Ml&Pxm_qI!yE{vD!tF?hJGH%5YS9v#F{#pLLqF*pj7V0!LWsE<u}gIu$M_+=J0u&$WhlYjFDtF^7o -z{r<*#ve$x#{FMz%js5o!R@edK>PN!JQHS(*QLVz4W6YFQVId!SV^p~E`L*vhu=yHq -z#mRFFllPz9dwWr}h$YE(Agveu+~ym#5@zgB2u0)ZvJaMD(^~+aWQDLt*0r?6{`kQg -z$SV*vRKXS@Lnl|PVf`{ooV%jWQrgIf(xc@ww7l!)#@{5?j3AVpR-~)Dhh6^*4sGQW -zBW;5pNo;K{((`=*4o&*_e4#{Hk@T*O93P&#KVgbVXN7(1)p1u8A@*XiquQFa#+_SH -z;|HupgANO0au`zbf1W>oKA`wKC}MTh0?_KmGP3dI1e{U0o!4B+prrx77b?#Zvir2! -z*$sQ2L!x-$y*6`Ig`(lP(rF<<-nF)ivw!5!vl2QMjWPAI*X(elZ&1PbLTAt6oPr+A -zJoof1EByT2`)*SZ(v{Ak=auyP>BEzH-y$&X>2^qSGD&cab+kHdeO+VH7L^Y_D?^WzX^nl5)(cG!aQLxES+L+{ -zZljSuomo-tj67BJFAVm=6c4_z(q@dZlw2Q;R#Czh* -zA!rpk%Df$Qr+InoaC0m9a6Qgsck-@Gt2E%xEOGScL@v*S_A6f6QXCC0)Ii_ESfX0l -zQp?#j2NXz~2N6~m|B^iu3!h)iy0E@){HAQ+>rG_Vc_JQ~q;+5|@|FplG=L0Q#>=0@ -zsvK>sLs9}hT0orGyopoIZlBV=W51v*_y40eg^M%z<2$NZ9oBemFtOm#sJW9rL5s1e -zNo^YM-RiFM-K8hX1i|q;H4YE02S2wJ^6efXGvpQE -zPpa79@nC=dmjDIpA7Iro{8v^-j-$hbZT!ecUpvZ)F4eisVM;FgN42t(e7&XiXa!JUXHJO{rY6Oq_my7kYhEE~20m@yTQA%yd8tz%$26uc*DmZ#9k;J5R3M*YpfkwdF`u%;`LW9nxG$>x -z40~t8{&k|gHuh!qB#KpPv=6YR{^DVS?sXf8E^kL^?}eK`ZQEB^%{6B;d17t&#pQgw -zX3jZ!in*hy$Cf^_#a!P9%H1BFack-kRBHXQV!LEfc!Z9$r#Ip(&tcB#VpYP)rk*Wh -zm}H!fl_9n6Km)%c>fn_TwSA{?NN$z`eT_aNDR+yQfm(r89Tu<-nHKyO)*ilmlo}*8 -zrx|`}gDZVX6{jd)H4o -zIG)54^8dcbRbr%h&u86A%B-6%-oKjT5V&5-fXpT6))+M|c59*sw|KiI#iXMP -zKZ{=<4{nPeSLo*@GuB#EO%|tgTmBjJJ1ApRwf&@@(uhEB4L=E3SgzSg-cnfp$PDvI -zwy?IAJA1l&c=$<`>i(h$(g%DR-s79@+bs%*OLcz$pTwJqQQ`2~%i@b)Zg7|V(>1Ge -zn$xEb1$Iu|uZ1*gak89nr{bmW4yP!agMxM6M}1zb%Q3;EOHo-@Gvs -z!$nVK{&dSLEL)>RWWAvvc|g28?^UiIqz_@TLVZ9#xGxi7h_5Mj^xk9UD? -z2VA-{Rx3j0mKNt0J}UipHsh#N&!~EDk09JY{!MBicD%l@J3lIkK=M%m89#>*oVt8 -z(e3T+kl~H)({V{N#;Y_I^h?-^#-h~Hk|y71?!1NfZeu2> -z`Eb05Z$-9qPob_3L$?ytPcE>|#u+_((zj38`9&QQ=5OrAKlf@19)59Ie+wK9SZH+3 -ztPFXPHnD8-yyVAAnnG%-!%%A@A&q}JXH2uBf=YR!J+wYql!L+f&847H=U+Wj6N(iG -z_qp(sn%Q{!SL|&68XEYG1CKf^dsnV=BR*#{^>&%#lX08&3PMg2iqM8m#eUvQ*Q|{S -zE`R*SLX3If#WMC;Sj%g7q6;{A!o^)XTxv@_2WE$nkr8uSTU50&qUD>JCT$9-hE$&o -zFRj<(d7jSh8u#~b%iv=KDTEnSp>RJta}dAhi0ZxA+3P0 -z&+01#jUvZkXDdkU4+hvf^|j*IFu$mCeX6~uIdNhWshKINoSeU&Nu8*463T{gWngi) -zAIr>DUVb@D>$$r87l3zpxXgV`JDx9@WHpdj@iIL(V!1j%D6uD=`zLzYzBSH9tj1`X -z4>NCiD6)yX-7|8qb1=ln>a=xVdG)k;Vs=jVgpYWytu1?B=u%0NlZ3|MW@XU#ha+2i -zsFE0+qe{E+8ZPK3EWO6u++1o3ZPcAA&vy;uDo{fC^y<7O*aSB5I&uB@7e~#?N>{iI -z7PKqr&+>B8QSiepK1yNOlk -zgvJy_niQ(IoUE*_gN3FyaHG0~gokU_ho}LXfGWXNBxC)?}z-JIaI?B1+K)obov{q;*<`Zj1%>%!k((&0Iy*@Ten< -zHbd}B4(4VFI_vC`ii`V-h2l7F(rtb^tJEWDTIXSJfD4 -z-iazpm3Uqwhl1d)hbzTEV3!RXENCp+NqFxP=LN(4&d&C!G2b~l_FTfR^G`N| -z;dVoTNLEfq$};o>XNxVKSHClUMu_?xn)~{aUmh(hvJ%hNSy&5Xq>W|=h|#p49k{L^ -zaT|9g5QWmO9THij+a7N0a(b)fey$kY@PJ`%!hkOv-vC}Q -z!^*(Hi2-nG7|G2No!3aZe}ruwY`3Q-LC3%+Tm8qATx=o%p7&m51dUgsEoQLvW-j6d -z4cSeAh+BD?v-)h3awd -zEyn%C0=fOr|G-8NY!O+Zjmf~kKu$r?b$0fOJ_S8>h|!~ks!Eq5J11vyZZ5X4kd8_c -z9B5Yq`q8R*^slevO$LvMNGnT^A3&%C9tA8f6rqp=Z5a#1y9u>7JT+hp^A$@ZVp03( -z60On^D`#0&onTK4%u{ybc}qL3JfI)GwGsG#$AW?Lpxkc~CseYrWX$AqQer9WKcjhh -zc!Ulva!>r2PC?{W`k3Ebos+xL!G8BHf{SWxYZ5Q4u!mRCN%dsV71os)wUq2U2e&9V -z#n9SD5r^CtqGcn1uEb~b7y4c&lQ@z>yP8_hMe}bMw9ycU -z*NjZI)Y)7q99Kn>gc1ka!eR?_1Yc?U0UB|4Lknp}`eVuX9~W9P$P@8ePVPT$*l5tq -zH@{$0$PM7RFcI7?Jar%(LG9tgW(8qnOSk6CwDKNtfDi<2eTkt%z(?^EL6GVsL$&q83097smI4>ygT%gYcqSk)DL} -zUgJog$-xbKeG&Z;q+mc~b`sR#*JFPnSiCyGCYC9g_IxzA)#RzXdj1S}okAYxa+&hU -zwf8O;I)F;{v~!d{P~DKQ7IF9W@P#A&BaKTJd=MWz@V`+}B45X2cb;Vhq|rn2iWm?? -zZuhGTFC+(~Ye!xYgsvQ&JM3q!=rVwH%g2LeI462MY)Z6HLHtofje{!w`5PaAQbk&<0yj-+acFQvk@jLD%_mvwHHFB0j{U_1Nd-Gf}kv(+t#z -zTwpak7K{KCacS)FrPu%Lp;W)?LzMzZSfCIjaBUX<8jHJYA%_3&H5R -zDxHvdBcZR4vLSp6?wF_De(}gR%YZ%Q@5KQT?NP~)xPF;Iv*0!E-6sfM8K?*mgmLiw -zM@++86K;SAdej85=!IO`^B@EPOr;{cyA^v0KLP>XvnY*N(B6w(vKf|b58USn-j@!- -zmIC=+UAu{ttnpaW!VDvuDcSqKwmpk6lZA3usTZWbkGQiXehE}vXgm+_c%=Cw?r_5I -zV2@$DEHzlO)4?C|7{z9@9}%IHc3Z2j43Oy+bZgGWA4+DeXy)9s<&yQ2yCqM55MwF+HaY -z%k))tdBFf-*7%$ZsV@3CqoDcKH1t0&uG2~abTq;=$M@>|0Oeov)l^z*vV!0h!hHFl -z9>9E;|JOHo@?_;duL6mj{NH;3(A=;$|Iy??`3D0qOFSYKc7<`x|4omF4>tRf2~nyb -z$N(GO1U<7LGeID)AP-hXMif!hctdB|f6Z{f;t>f3=)AvCgwq3$T!E)2vtlquXLj!n -zpy=Sy9frsS@SiQkLI~GHd1I9lA_5M$wkU;701zUw1W3>L|4KlLz&*4OYeX#rP|aYr -zJjm_vh&kXFW)g^o24wK@4YplDR2Ug>*8TnzQP2YrXma;qWa$>tC;5?_ydSB0IO-hG(Q9=MFT0ztI1W%n1}rz5X*5< - -literal 0 -HcmV?d00001 - -diff --git a/addons/metadata.common.amazon.de/addon.xml b/addons/metadata.common.amazon.de/addon.xml -new file mode 100644 -index 0000000..d9750bc ---- /dev/null -+++ b/addons/metadata.common.amazon.de/addon.xml -@@ -0,0 +1,17 @@ -+ -+ -+ -+ -+ -+ -+ -+ all -+ 20000 -+ amazon.de Scraper Library -+ Download Music information from amazon.de -+ -+ -diff --git a/addons/metadata.common.amazon.de/amazonde.xml b/addons/metadata.common.amazon.de/amazonde.xml -new file mode 100644 -index 0000000..a8e054b ---- /dev/null -+++ b/addons/metadata.common.amazon.de/amazonde.xml -@@ -0,0 +1,15 @@ -+ -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ Kurzbeschreibung</h3>\s*<div class="productDescriptionWrapper">(.*?)<div class -+ -+ (.+) -+ -+ -+ -diff --git a/addons/metadata.common.fanart.tv/addon.xml b/addons/metadata.common.fanart.tv/addon.xml -new file mode 100644 -index 0000000..0d60546 ---- /dev/null -+++ b/addons/metadata.common.fanart.tv/addon.xml -@@ -0,0 +1,41 @@ -+ -+ -+ -+ -+ -+ -+ -+ all -+ 20000 -+ Библиотека за ÑвалÑне на инф. от fanart.tv -+ fanart.tv Scraper Library -+ Scraper für Hintergründe von fanart.tv -+ Scraper de fanart.tv -+ fanart.tv taustakuvalataajan kirjasto -+ Scraper fanart.tv -+ fanart.tv leolvasó-könyvtár -+ fanart.tv-scraperfuncties -+ Scraper biblioteki fanart.tv -+ Biblioteca de fundos fanart.tv -+ Обработчик Фоновых изображений Ñ fanart.tv -+ Skrapa för fanart.tv -+ fanart.tv刮削器代ç åº“ -+ Ð¡Ð²Ð°Ð»Ñ Ð´ÐµÐºÐ¾Ñ€Ð°Ñ†Ð¸Ð¸ от www.fanart.tv.com -+ Download backdrops from www.fanart.tv.com -+ Downloade Hintergründe von www.fanart.tv.com -+ Descarga fanart y fotos de artistas de www.fanart.tv.com -+ Lataa taustakuvia osoitteesta www.fanart.tv.com -+ Télécharge les backdrops depuis www.htbackgrops.com -+ Fanartképek letöltése www.fanart.tv.com webhelyrÅ‘l -+ Achtergronden ophalen van www.fanart.tv.com -+ Pobieraj tÅ‚a z www.fanart.tv.com -+ Descarregar fundos de www.fanart.tv.com -+ Загружать фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ www.fanart.tv.com -+ Ladda ner bakgrundsbilder frÃ¥n www.fanart.tv.com -+ 从www.fanart.tv.com下载背景图 -+ -+ -diff --git a/addons/metadata.common.fanart.tv/fanarttv.xml b/addons/metadata.common.fanart.tv/fanarttv.xml -new file mode 100644 -index 0000000..f5b6faf ---- /dev/null -+++ b/addons/metadata.common.fanart.tv/fanarttv.xml -@@ -0,0 +1,58 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <artistthumb id="[^"]*" url="([^"]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <artistbackground id="[^"]*" url="([^"]*) -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <albumcover id="[^"]*" url="([^"]*) -+ -+ -+ -+ -+ -diff --git a/addons/metadata.common.htbackdrops.com/addon.xml b/addons/metadata.common.htbackdrops.com/addon.xml -index c77de5f..2b7d8b3 100644 ---- a/addons/metadata.common.htbackdrops.com/addon.xml -+++ b/addons/metadata.common.htbackdrops.com/addon.xml -@@ -1,7 +1,7 @@ - - - - -diff --git a/addons/metadata.common.htbackdrops.com/htbackdrops.xml b/addons/metadata.common.htbackdrops.com/htbackdrops.xml -index e29ee83..0531585 100644 ---- a/addons/metadata.common.htbackdrops.com/htbackdrops.xml -+++ b/addons/metadata.common.htbackdrops.com/htbackdrops.xml -@@ -1,28 +1,51 @@ - -+ -+ -+ -+ -+ - - - - - -- -+ - -+ -+ -+ - - <id>([^<]+)</id>\n[^<]+<aid>5</aid> - -- (.+) -+ - - -+ -+ -+ -+ -+ -+ - - - - - -- -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ - <id>([^<]+)</id>\n[^<]+<aid>1</aid> - -- (.+) -+ -+ (.+) -+ -+ - - - -diff --git a/addons/metadata.common.htbackdrops.com/icon.png b/addons/metadata.common.htbackdrops.com/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..277ec1297aa3bd4132e71aeeafec9e72ccac28cc -GIT binary patch -literal 11423 -zcmbWd1yCK`_a%C9ceelmg2Tn#_2O>9-QAswB*BBby9W*K?jGFTf;$Y~Z@xEg{_oYy -zyn0>L)w|X@XRmcmwVdAFKa>=tP!I_b0RR9BNLpM40D$-iApr1@ABS0VA(oE=gR6v= -ztC+Kyk*k%1J(-%7of$y>BVYrP$r#y_u>x6G$ym5}S%AE3Y-EhUkL^IZzx<;goGVCP -z0&W%J69x+}51(cA2ZZ1#t?dE;ApZSlhY+n`Px%0$Ekxu+0DxaHNH0b(008|RNL)nC -zbNMvW$B}4$zU$)LS`$q+=_P#U5BHB9VKK^wu+0=iY#Z!9fo+mBm^PfS -zvpb|cr43pZsKCWI-Mxy&UTC!}cTXr{j*J}iZ_EGDjWRc#?KiK+6W+L$G$B<SiqH5dwMge<^S93|CJD3BdACgOjYB} -z^$RhCj0fhw%)$Sz5fBbY-;HUA8pzY-3aWwDxcIUUfR9uCACmz@;QWWjj0FAtm;ciJ -z|CM(E)L}9}>;qDuZa1$9@ -zuWx;mw9(g$y7<;Ms^IQFKFQ^lZ@!*LXC#G%#$;2kj|bCt?t0j86IqGh!t#DfJGtF9 -zxnFQvG0BcyST(wr -zIs=|pvZN{38F)|A!mIf9#~ueJG6^078vt1CE%uqJNe4hV;{<}h!ZmXfw{~fDj_~8q -z+wh{TO0saj=|kI?;>f&kvt~7AZV=tZ -zD8+4)Rgocgb(H&?-yrz0Qx+e6Xq7S$9La#~Qb5*D@}ZLf%SVy@Dz8zx-SB@zppbwo#-Yp1HJP%jC8 -z6QKFIPw)xLd)1sG>WtEa0S~g@smRxu$j-_BAv7I5D%L(NtK2H-(7d4dAS#N8ytXi7 -zBG2nu29JS8r!D37(Y#vsD4ojz_I6SNK17aZ6M+vfuLTSG2+ -zKtSjFU!%@m4AT@vzm6z}cAS_XMhM=nWSEgZ&Hp|i>l&&z4Yne5_@r>gA{d8EzYd6^Zj|+G7jwqrF^A0aocJZo -zF`xors@})rzB~Buvd1u0V!4L$*dZ;j%D5D&k~Vzo`qy1J&UcaeKp!C;J8`k -zn1(GC3LCRF1O2TZ@2kgIcqt~LUU}JBs|fxvocB^+s0V3 -z-^9^z5zHMgx!*>r+iIVua#aJ~TrPf@e4ZTKjmR54%kr6(A0_pov>Jtt$X;oG*7bW8 -z7K0*1#&yidp-C9m@V)F$UU!)U-=6G@L_&G)3~+7CMFn;=}&LUz7u)@Zp^ziS1~7-N1fQQyB=UaCpd+fy -z+l!NskrPK{J)hQbU9?UL1PC(dsn_~e=BZ&qCjZ5nAx0$)IBUpKE$-+r8T^ihoFx>n -z*$wvD~iwu+e -zuL*W*whQmhsIO#rH+rYnMSEhJMvm3BAx22KG^Xo@;%rp0f)~}%vUJGot)wVwL(|}H -zfEO_tpW$8SeJ|<6w=>b%5iG%PEP=EL2pVkU?@yb-9$XF`dku?SYXlO_W{$wp4*g;) -zHz+7j+zwWaq`Iu_^B!47v*)lAreYdJZr?;o -zFHFIZhaE(9y^(9a4X=Znx=E(DrOD0f(}Z{9mBvZ`=M^Gxr_idpd}e{KaZEp`f5Tq> -zfK6XUmv5yllTnvkW6T3F`!VeZBSxcxN8j|5>0XNF{+i_`Ws`aIV -z>~$%rpfigHtEpK&_aQw!F6-ro75uT_bn#z%`7t_Z#5CHC6-(x-a{67+H6&uvh>uj_ -zC3bMAt2E(1maO~!jKg7CC*+Kcg8^yvZSQZC%qX%Qg3UcbAps!=BGT?7*~^VlQIbYy -zT%AdxmXu1^JC1UHFzdl%92EUJsKkIZ{$$-5vnC6RWI4S2R9ArX0g=a9i+EByD4WQv -zyWmailv{K0tNR60Rb^CHPwHnB!6O#iG-Keu9LXz`GHkPuMwN@ilLFf#h=9#1NS-n9TC<@QBikh6EfRz^_f9- -zuuFvCMk=M?HoeUaKyHe6LKY7$s-Ln6L87%MiwQ0m-;EhA|1u -ztZO6wPnkQe%5waO@tXqK)!j#tIEXMt@?-!`kbWgC-OOx!=v8oK<#b0!GwpFVdYihE -z1=bvtI_3VYLvdRfLRw5LEa-R(g8ik9eIRw#%M1Re+@Wz4Q6AHdc_Oc{`fMajT -z#Hbx5L-zc43?ZWGxl@^7phi7SXs;o7DPQQ6y5Pr7Syk)#)Z43UaJTqt8G;otK21s0 -zf|kbaV_yjZ>`nzk^>Z)jOSbRT|%HGdAAE^RS`@!I4`n>$GJV -zYt6Vr0;P6bNyvfwc0wSn(chx;VVEI1aT5)y0bIkV-aOBpSw&5Kuf5#jtf%{El4N=r -z>)$C0aaeTBp`z>(IK|Sz5m{5W)vuQ^l|J|W4>PjKVZET@6ZW%If#=Msstaiq<9$Hg -zyH|An=m>tRo_Yd|Y|{yQFRsFKBOZ*uE!@I>jim0z2Z4E%Z8 -z?A{-C0^T;^UXRRILJ(nAmfL6%!c8moCh|V(Cs7RCu_A^$LbvKnpy~3G}OMX@JFxJD)~o3 -zejYNS8438iIki+5SyZSOp3HwU^-bvAD}WyXq?Te-wos*4V+7?ocz!F28XIc7saGmS -zys`Tl8p_h(wx+J-dAmQplbkXRoHtVncYg4_{K}R!GE!e>2W|PqCT*i6Gzw5Ua|?Ft -zXmB&*&M*Erfu>&);3heU)2`{s0rH^mjBGwY)+qr(%F!;5?M`$K19#cgvflxFXh=1K2&LrM5>8 -z5vcBb+gfo5W<%m!S+>X?7iFQ-`$5|=yzw-~cDaX>lts((hJ65_BxgvkNwrz1i1WIh -zU}tBL`Hry#6VmKP%Z7s+>0VrC+>dB|3Q0Uv|LDs;_%i`pK4I@c4B9Fvzs6?8uVccJ -zo#ji|-m5pr+OZW1budR6Lz7+JG$sB0rZ~KXcj1U#+atZ8dE0K_n2?2mC+Mmcc|0!R -z+gx*f*~rG6tCb2q2`P9TfmBIGEUIdQ6uIoO^U0CdPQgM_BeTw#ie|y*Sk3zg8%ALi -zwff15G06%Q7_UyIHOlO>88l10Xp(oyl6G#9@_4csBb1#WEG+xmgAI~FI-D}fh3QZG -z)6+=|Pv(o|3B$}SO74_jd%F+;AvpWuo9MZ8!SkAj9hLwJ%Uhw-XymhfYDx7uF! -zTf{|c_3+-dyq*w&cVx3U8z#_4LnE}(HjXQ;LJbzidZC)xpxHTlg@mwaNqfkc$No~! -zW4yGS%_P`XEw{uBO^_xr`5kJeIwAPxZ%z_stwNGw+to;EvOyMvPt<&aZDMwlQ@)1! -zEpym#-u_T6)@n?o7ksbpa3$}p2bj$o)<}2FB&OlPmzg&+yI3}o?CY|kw7{Txz-@VX -zqiya$I|NT^A(TRB!Co45w(XU-f!We^FB%;+7ezrvY?)=f(evH#1_Gy5)g{_Vyi%51 -zYqjs`FV)b{ce^^bqE%4@g3!!*VU=?lCczP4saO$#vOgO+%qO%y^HjPo*E@F7@homS -z2usBnr5K;JVii1phqB5vTcvl0mTrkU9OX$go&UK!!cu&hgd^u!5F -z9slC8T9*Chy7hWLXmYMaO>FkM_%zFo#hb?kn&aiLm<&=0gH32_BRP5>{d -zyK+!W>iXqJy!kQogrsLtlM2H~F^EDGP-KS`9?MRuTDO`H-rCJZug}iVyC;*)xPN69 -zwc-~g?}$q@OJHMV^K=-N9MjRa?q3ex3%&e3dV7;m&d9f-l1!~4DiV~qU9t_I_3B^q -z;EO6QVpCzz(8@0nS9Oeo{@O>d)AF%QN{?VIX>IeJm??aIc`G1OQcs}bT2*2X@PDy0 -zGTW2T)N812=4n{UYvFb1i8tMZGVnR)d7sYD^tngjQN7#dx+2EJ)Rv60p5(uWtb}Z3T&(o=2&m)u1Pp8N# -z1=O8{t0m8_-hQ*6zVoG0zt#OR45czNlTiE&3hHMS6Va%sJ)6VX@=t49_mN)c_R5Zq -z$I7Oc=lg6VXdP`_S4VZtYVD?~BZq+JgRNdU(RP^qMfG&fAesJ#hNkn?$Nsysp92GI -zV8@^x;ja%{851}*3ke&ZCbn~7tr -z%3+qdJn&U^jA`8{es)3gXCwCKyZP_M9rJTI!cJnmf9q$RB+LI4wRiygfLW?;%#RvW -z3KW^NLO1%*KQK9ZnDDTq5Yj8-;h|_^ -zviai0gFolF&gXH?czeq>Z$n8@3j*_@ee%7K5}Fx&bC;GD=SPLJsara8pFU#fJT41O -z=fb0Y@lz@?{YexQ(cyNGStVWI`k<6bsn>l?65=~E1^6m5^PV^~hf4Oo)_T4T3o9eS -zlf^uHOYhn)syu;lW#mx(8RRZ%t)t9acgzUdQT!th?)kd(Xe*}#D6R~@}e8- -zGyHa$wRGG4bMgHnPw2kk`$ZQ;!8>8 -zf01EVFg6w)kA1P0>w?MOt|A*TRw9JZ_6b;XcvS3+&MexnIfd<0>ZoQIIrqO`bvbVy -z<+*S7=p4Y4xN<S9zS4T0>vCo;B13!XM0pP*Hn)61dLks)TpoozwqkE{{HugL|P2WY3p{kedIx)pI=c$t6RuU#O2gf -zR>T$6M)XeE!vmbLUQP}lZ+H@eRf{K!|M6VK#w)5yK3wHAl(2)lI6RQMf!AWO3W6D%!jW-cZV%{CX=HV7cX`+?QN_AJ&rSv5n@b82k#_5vo4|G}WZ%w1 -z3#q*zJ7-S-`{iYbu**q{9ze9Oi2{;iP#xM7%;T8KNglMr-8-J1LtRffbl<-Lv7hmD -zoqbei5n#`Xx>vb4_L#Vq)APDB7N! -z4O2VqYU966cg}NY7;^7rDkNU)#mNlz{Z3^O=|P^w7Dt_Oepmi!K;;xZNjL6 -zFzE0kyY*G4M`s_Ce4X4b<%BRMS!ImN%NFgr?JQqRo!L+8n5`vz0ZYP0I=k_8tcl3kO7i$`i)F4i~7FQ@@`+G}H}za6ouCu{BI=PNa<3GG)c -ztII^Kmf}nb3WZ>MPIp;r_KxTGN0TeP -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 -zoiKs2urz1f+@SCj*@R2R@#ozYCyiV3g9 -z-0*ZAVMgIYL%VneH-kuPK;YXjb*ueXDIY%O+lMk2^_%Ye)kGvnyAgY+eWLF*4OUi{ -zbrypYS>po(?!j5O>LLm{>8iiTYSWmPzxC -zjY;o2q%UiJ2y0*%Ez?~D>_pSMQ^v!qt2|b=h`D1QR;mD`Osn-ad;V%zD-R6N7yh^3 -z*Ye0&)kBj~w@<_Ft=y3%J;2)>k>x&dJ@>mG6MWE2!a_`gmk9^iiesbKvq(XN+=e%Y -zJ~4lpic^^UG2fS^paA>R#^K;pGPfnx6hktc(T85r5m8aWfy=-{t4zZ9-9sGusomXn -z>suIXoX!;FBPkm@#+{u+v!NMDCY`xFH4WEw%V6kz3-{+Jv2XUim!T&_ZgO&W%MHmN -zS-LL?OV{?QZf~#*6_$w{d;^$^b|-1+IQfV$T@AJ%m}zzzO2F)~kEx<8Kt4XZM`!q+ -zo55(km1dXlY5dP|Q}7UUAXKko+DNjn&L?XU2^^$`RtUdWAY~c|bmnss&#o<7PKgp0scNCA5-#&bs}s8_tQ%qUFv4Rw13!Y^BkqT=PIv{Ycm%DQb^95vb~J -zs6_z+GuGL0s#`o(mG!eX83Jw?or1rikqY{)G$J{4ws#g#E=SO&l9hpGM3hsj+gMGv -zM0>^)7$D`YTb*7vt= -zi%YAo@3Y8;d0b9Ns3??Wwq5fcwhXD@LY+~?ZkJXTadOIkzo8x~*dkOn-Ay3jW9oRe -z*VOOIU}=1ZZ6RIXFFef9Ly<0-k5ik<5QaHhKEp`fJ6B=#Y51h0u8wmEsA+8cWY9QP -zwD{~Y63ol3l{+sfpGlaWUjAv*&tlm5V4^Y@?jj)}=j_Zd4XRho$;pY$e9re$V(0N% -z%ffqkYmz^{&GM&DSfCb6l@-5ppXU)Kst9>F@0_)|+}LJD#`g+_2d!GuAEk|r@p1g5 -z6|?fIzkmMHVQzorbh$2?H>^RJ+a=GUV -zQ$R-!vx<)wlZx3#b -z+aF;Vom+w2pd}q=iXXOU-8&dX#BHUbH4_t4)u5(EoWi$wBC=Qq@2pfVpUO64_ciFwD$=lW3pyfZL*KLga0*#g3{n~ -zSDz_>RAr>>x@i*AKc2eN;I`6$$Dhr3zae~RSgcXSE;@Phmt+tKMJ>?kvTfOafaE=TR_pF2nd2%VV>10-VG=!xOH_Dh5BZDiK -zrb7rGx#p3&=UAJ?g2mkM;=GN!@O1=8N~5KTA`e3-AqM%&ja3B04Kr=L2flfi|9-f6 -zy45w=VNaXD)VJb>`4uI@;lI|BTW5Z&+pZsE3g^g`Q(*D>GLN*j3JXKJu^614(dwqh -zTicXynoAz%QOgSWCL*wq%>U`;yK=tuN5#_9|E(c9nkI}VU&*xn3URjqO{bM~ -z+70e-*#_eAhMbpBIgAKBLh$OufO>ad!+w2r<`4H}s)g&v?RaqMKoR=t^6*XO0RcjS -z{J2F}cgJ{~!jhZEYrSVSG@b7A{0ovO4Gj%J%W|_JPs3Qnzwwt!ViOQAiBrsE -zq){{nfO}cdPT>Hqx(gDBJ29VNcG0C#gU*vf{Da=?i-;kIW2cK_;Q}MS -z5jvx8R)_dQ@W92o1U^&c8sv1Q(;fg=O>by-A;@-e!}tNF{ByDKh5=MJNJF5S4CoDJ -zgjdMdH8~!HB=USk@^8X#GKYAvVq`qfEe0P#PpzrW@RVYb*`l8S|HwlL4~U`gAlzw+ -zb_QlZkAnWb#!WF#ZHyrKrC2KHz -z6Vb_EQze0IDuA*jzz4<|h~oGkj1%w=Mhlpa+_V#gruYNjA@e= -z{sV+ml7}eSN356szKOVt==vYoD&fB}5G6$bH8yY)0!E}E#lwG$M;ZQW{6kzf=wnE_ -zLApUzn4b%TW^v&Eb@bnrAeF|2{;?4Ncn4@AV9aD6kplip1Gd8tmaT;C@IO{~gL^)# -bECU|GNTRyXpEy4L2nK*86vV4U4Z;5nBl^HI - -literal 0 -HcmV?d00001 - -diff --git a/addons/metadata.common.last.fm/addon.xml b/addons/metadata.common.last.fm/addon.xml -index 981cf95..8bece1a 100644 ---- a/addons/metadata.common.last.fm/addon.xml -+++ b/addons/metadata.common.last.fm/addon.xml -@@ -1,7 +1,7 @@ - - - - -diff --git a/addons/metadata.common.last.fm/icon.png b/addons/metadata.common.last.fm/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..b253ec589717cc93876db82f67ec84ffeaecc583 -GIT binary patch -literal 14392 -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 -zKy8#ZYmPFq(95B{jzItPUmcZo1$mOE*PP-AO -z<{*f@r+z|3B}~9=QtqgDH^hC3P8Npwh9gYz_Hf6~NPTp_T%r9B6bmT$sSlb) -z(a2*b&Z&N*f~fo<=q}RhC$6LgVGKlRGGT0!F+esR2^DPKV3o5cTllp7USTIDzD?iW3s9n{%npVeiA%QI5f?LKYYruLaUowY3&Y}Age -zOdiCX+OceUb-2ULMCNJmP92ly%(&i!d?b*L`Czh!xe~duN65R%efQI9 -zg6X@V*XXe74D=ao?E7=A_hI!EGPKhIMYdNx4MF~V1;5#6@<<1qFQu#+6v)M=fOwPh -zRk*!-e&^YsB)18{3`+Q*>8T(kZ9Fj?%OlyCu%k2yLj4S)K9fF;RVqGRpfY2g=5}x3 -zPBxTPh@tJ$ue10TwS~@|`;trdv{}C~BNKD4X?EV-biBgrYHv{IPFvSS;^kJOnThZZ -z_Scy2%b>CQo$ca-jhoSjt=W$dsy;ne_in+8D4ag4UtLUvb!K=_Baj;2+up7TaAMjq -z=7fw=jix(nlvnC_oI<{ULr^^%TBo9Q_kZPbaep-?pCM0AcJ>dD~`onr9w<~R@KT5&psGa64XrSpQUQ{Le -zk@i!}^O3;IHpH;wSjlH-T!^QO;T*K4t!SK-N>Bq7eNUK4uG?t$@GO5D?x -zQHaHBl+2j(P|?Zb%-VvE&$ks?L3i7l7(H&{W7}CnDtS+g)=Uo_8z;-kw*CVXYq83Yw8kwrr&bYQI%1Auw|o -zyvFu!xH%t1#AMND>eqRfj1ru$Al&j7+);9~p4QRElQy*-j>VBSb6l1aML#h>kt8m= -z>0R}htr%_$)X7@wd*w^|EjRqL$+YOG4RVt9up>I@l=Rxi{yrUn{R(D)o0k1LqG3+` -zabV9}8htg+%}nmO{`NH1Z9{&*E&SoQqBh%m|B?|Fw`9d*@i}{PZEw`+%q5@iUVm2j -ztiY>A;gneP*)f^jd0JG`J~r%r9e;L0uO7V3MSGbJG* -zr{323c&+Y_a`g5VpO1$A82m&j8M@DCnCnlnSIjii*W?<0c3+kc_kRqoz7;MvcXC@w -zF%0ndY^y=HeYcM0p<5$l;7)AUXgO1xQC^!?Q6{v*pmn+4B<}+7@Rn0ct5+V#X_v97 -z&xm)=*)Z2{!!!PSNPuj)l5_`ZQ?q#we4cQi&GPg|n%@vU?-PtqG$u;E0U -z^gL5fOGy!&u`91G@#@A_2v>Lxa?44*+Y3;t)O@>}Rp-B# -z=mLG~)!zsah7`X#wK$&(V{xcM2H0L`yPF!%$S~iC?$ZxycWlEb*)u-bwycf?b85ov}Qu1elISqdg4zYAy>3#~& -z)TFLGZ*oz?5H}HDJm1vag!27JwX?&}dT)oh{|N{DPfQ$3Ykkn(p&D -zE%amMhN`Q*r@<&`?`ySWlg@pjEW4XjG`SpJb}ejr_YqG(>&G!F(RH)(#TBjf$x28d -zH{+Z!)UK(j`0rn}F91@yUQQ^GEPy(hABOTXH;1i{F=uMTkzN%pn6Rb@f!l_b%J(qF -z)vvUzS>krEO_0H|nVLTZio{~J2?80*9Ecr`?9cAf*a-H>yz -z&qNt7QK;vev1NePchk4%rDa+_pg9Zo)^o!3I{HRwdEfe$6$WlRHsG$Io0YA0+ZNx~ -ziE^?KdwHHDO2VzT>Ja1kXZSV%8 -znTLLTPJY3v`-5mnZno4wklm4LH*gDu-`&Vs&D8WlhW>H>C_F)dhs)GYM}gmrY^yGw -z(B>S?26zY`Xpg`w5yfKiRHa4JuGpk~ptftg!AYR8V?5T!p{uB -zMvomdUPU{}zw|O+#N__ES?&NH&}xL_#nJcXfDW%n)OT1pzJUcjtZv6bHY3VF;o -zHT7{Vq47(9f4FBBJ+bI*WV288+87xFuwN;83W_*N%Tp-7@#4Dwt*fLz_cR@L|Hp<{ -zSh^`A+5kLF+wr??^IHE|=p}3WF`^z&M{W=cJO5DeUbG?u1=Fb9X}ZiP|NZ&(HNv;j -zOun{%{z#ISG>9XIr|bg0?0bjLMV=RUn^fL`a%$1d^(o}%K0Tdk^*_l72Tf%*vPRut8R;4KwIcy_U$`6DNZ*-iB;7FP-y2G*8F;xn6Pm_ -zduDThtK;Q8rcDMn{}L`AjX;*;w^AN47f*NG -z^M#yYomx9oho9d^c@9AxVy(8~xWIc%Rs8c{os*62>H5-gSzf*<(U}W}eQvL(?Tr`j -zJ+_u~#t+EHNtjvB+#gK|aYefa#J2`fx!<9-=eczMOpdmc`JGm7z53&R3(us1Pjk`r -zq+B5&yrOl9_jy2bMZ3kN_V!4|R1D_ZGOiF;r1=|HyouF>5gUVI&K0OeGRl=N49Il|sJb4Qmh~f6cz6tv1#wQiH;`>Abnt -zSNpzz35nOkP!-x}#=j8*O;CO6-~um&m3p2n2~=e_`wlTrS*Y7dD4QUV^w?Y;n#n8I`Xo*?XmteB^HC-mn_7_ebdENyA}z7y?s?VO(b4CP -z0m^rB1#oBYC@|*R9Dmz`zKm9f7wIZpQMwXOffYO+>KiZdIA640`w^7QezBBLpN^TK -znMuchd4}ieB&2J_J)T;aPzO&(8p*!_l_i&r%w -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 -zQ8?C*^{dl(9K|1bliHHNHEI -zjlHQ^-IDNDw?8hj7QGuV8WN$2R0q>hk|Rg01;cpC83KR^c?uv0_^YA*Kuad^*ve{4 -z*8OXWM`xYRJI?cEtKfKA*JHH7@beRY)Oh!rJwPK$L#}_i+%wHI!R4D@RY>=V&tI5; -zP}~!sf|Y0f3UBv6wcLU25 -zH2@pMobR);j2z1sS%N`CQ#)lIW$g$|zd@zI?{$#U4`V_?)Qrdge(?5`u)F@Zev(op -z3=Ag{V0ZObpnm5hwCu#kA+0)_gNxWsnP~sn?Gvt#6@7rm_DxMzzTcX<7#KA~(7I3@v->Dlau|;C?1&RqVU6bjE*|6!a2g!mu -zorfL)xsdN?(GzKR3jMoWO>@!aVg$OzU7GF0npLC#F~6s|)xum^%CXjCp4I4}X~nz7 -zxRfb*t+n>CnXm2PqQGtHfD)JGdiHqdC$GA8_Xz5cvDXHB#9*XEOLd}q6CCzyiJz(_JS3?S| -z#r4gQQfb_0L#-ml@mHeXuOyAoW{*1gky6D%)sE|`DrX`k+TtTnT36@PV#;^LbJR_l%|B<9EhER~;6S -zmFhN+D@l}-QA1FeeTkZO0}`;!L=>MV$8Kqv8Gt|s*981_+d<7=2~YVXJ~Gg?IVx?6 -zBwm-wKw_7k!P*i*e5M%pzBMt`3OY|#OWJ>gUhx5JwRWSp{eB+T7$ISIQ0SLvbqam!Blp~UI@V%+ -zs^9RZ3K?bpQ$`qv%DIUQ6|UPa3w@O76VK}{=3)6dRtx{O+Vj8Em92nEfvn}f+0EmE -ziq=!B><5zG1L^>>zwTx4H8k-n*L*-DyOQ)YE;3MAGdB-cN9MbqDj1`^I%;ZC`~eG$ -z@}Nt>JOK#fn-M2b46D)eVysPI;|@Jw -zGoL`Thhu4)l<%!=y`%nKJa^Y__Jmt;Gx`XEfbo-DPV)mFniV@(U2&c@D&`t~HPl=0 -zH0%FY=81Q%7!gsP^-rhzcR>7U3@6?49b%0IN}VOCR0WhMEZ4mzl+y -z2>ZVIJR%RTx|xp4GHsKj1nnR7&<2f?dW*fxTkkPX73(#g689!&G9UWFLXZ(O%}!BV -zOqqeIBBP-41JBLueN(R*Mkwh-K{h$sua4-rBNc8iwe&|zmd)9h;`BR?BLQe9m}R

eXc -z;Xl3lVP0DheB{%)seSqk_X#mHs*1cWKG0+CIN!(tgSm6_42#Q_r9Mm7sR#~S(Zkat -z*7)4rn;%6xKJkX2e^1L_Xni#p>eUvvpavs@ml&98oXlx0k4yACnJY~>5WXO2F|VAa -zH%Q4S+M^Jd3zmcw-K%!oxE!vb`)>f!P)#4|eCtf+Me`!?4lOpw#I@OydA_rQi8$3; -zFN&#Y7ufG<->dalFjyi+b|b&aCM!J6Tek5p>+UKVJQg*q5Ai{LvjY?lAwbBH$LLWBP!X}j8wmZzvt^wMfP^pN-D#I-_c=b -z?T7vtoB8#QUeUJ|h`|s+M)6br8RQIWX|3j_m?U~whrznQcd31p|7c0=8J-aP!AE{Y -zWl)I46bx$`OW;3QyV;fB=)}#THR};M&5tNDM6VAMm5Zg{sfrB$HTVQlijSdRm%A~L -z0y~HyCtXMW>FAH2W;tD??n*)JyqbbX;U -zl?l7lJeZSlVOMfDA58@PBOl43>ps}~g9V1g-Zbe<93?hY8ymLFD-I2aVue#?(Snf{ -zkw-8_^Z`_chQLgRysjYf25t%rA!7)6PL}pIbzx6wF+Aokb^=Ry;8O}rYdEitj6yHO -z^kj*$^LHnvOhx4idCnh#QD3BN)*MM1n~YHy#5)fZctmnASO_dak+Z47iuv0QTaL(h -zk>v>$1zSG@^f44uxk8_Y2jOdXj~^Ch~ocR7~D<>^AC{*W+z98 -zZjU^LGXSF%rFT<`7L1kyuml2tQ4TpGJdBV5!cWBuvX2micoGl=pAvnI5>iUnKP9>l -zI8+b~SU(3|C6ho3Gfe2mqIm)olkT@e9j*J*IH;WBegyw7q1{Y}~D&fpCf`d>*@o=iB -z;p11(7!dmj(XcQ}SF<(n>>(FP3@@H;$rlay^xX3ge0Dg2QH7}~NLY_^Nok_0Xyj2&(qf`pCxW~!nMUMTq+ -t!(@j3|Keue|Et~j|7FuLZQ45-5aKK>uoSV93}rt+T3kV_Ttwgh{{Xp+Jz4+& - -literal 0 -HcmV?d00001 - -diff --git a/addons/metadata.common.last.fm/lastfm.xml b/addons/metadata.common.last.fm/lastfm.xml -index 6bd19c6..e8c8ee2 100644 ---- a/addons/metadata.common.last.fm/lastfm.xml -+++ b/addons/metadata.common.last.fm/lastfm.xml -@@ -1,38 +1,287 @@ - -- -+ -+ -+ -+ -+ -+ - - - - -- -+ - -- -+ -+ -+ -+ - <album[^>]*>[^<]*<name>([^<]*?)</name> - - - - -- -- -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <content><!\[CDATA\[(.*?)\]\] -+ -+ -+ -+ allmusic.com -+ -+ ^$ -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <content><!\[CDATA\[(.*?)\]\] -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <tag>.*?<name>([^/lt;]*)</name> -+ -+ -+ -+ allmusic.com -+ -+ <genre></genre> -+ -+ -+ <genre>(.+)</genre> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <tag>.*?<name>([^/lt;]*)</name> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <tag>.*?<name>([^/lt;]*)</name> -+ -+ -+ -+ allmusic.com -+ -+ <style></style> -+ -+ -+ <style>(.+)</style> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <tag>.*?<name>([^/lt;]*)</name> -+ -+ -+ -+ -+ -+ -+ - - -- -- -- -+ -+ -+ - - - -- -+ - -+ -+ -+ - -- <size name="original"[^>]*>([^<]*)<[^<]*<size name="large"[^>]*>([^<]*)< -+ <size name="original"[^>]*>([^<]*)<[^<]*<size name="large"[^>]*>([^<]*)< - -- (.+) -+ - - -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+)::(.+)::(.+)::(.+) -+ -+ -+ -+ -+ -+ <name>(.*?)</name> -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+)::(.+)::(.+)::(.+) -+ -+ -+ -+ -+ -+ <artist>(.*?)</artist> -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+)::(.+)::(.+)::(.+) -+ -+ -+ -+ -+ -+ <releasedate>([^,]*)?([^<]*)?</releasedate> -+ -+ -+ <releasedate>.*?([0-9]{4})[^<]*</releasedate> -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+)::(.+)::(.+)::(.+) -+ -+ -+ -+ -+ -+ <track rank="(.*?)".*?<name>(.*?)</name> -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+)::(.+)::(.+)::(.+) -+ -+ -+ -+ -+ -+ <content><!\[CDATA\[(.*?)(User-|\]\]) -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ - -- -- (.+)::(.+) -+ -+ (.+)::(.+)::(.+)::(.+) - - - -@@ -43,7 +292,8 @@ - - <image size="large">([^<]*)</image> - -- -+ (.+) - - -+ - -diff --git a/addons/metadata.common.musicbrainz.org/addon.xml b/addons/metadata.common.musicbrainz.org/addon.xml -new file mode 100644 -index 0000000..42a2635 ---- /dev/null -+++ b/addons/metadata.common.musicbrainz.org/addon.xml -@@ -0,0 +1,43 @@ -+ -+ -+ -+ -+ -+ -+ -+ all -+ 20000 -+

Библиотека за ÑвалÑне на музикална инф. от MusicBrainz -+ MusicBrainz Music Scraper Library -+ Musik-Scraper für musicbrainz.org -+ Scraper de música de MusicBrainz -+ MusicBrainz musiikkitietojen lataajan kirjasto -+ Scraper MusicBrainz pour la musique -+ MusicBrainz zenei adat leolvasó -+ MusicBrainz-scraperfuncties -+ Scraper muzyki MusicBrainz -+ Scraper de música MusicBrainz -+ Bibliotecă catalog de muzică MusicBrainz -+ ÐœÑƒÐ·Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ MusicBrainz -+ Skrapa för musicbrainz.org -+ MusicBrainz音ä¹åˆ®å‰Šå™¨ä»£ç åº“ -+ Извлича инф. за музикални файлове от www.musicbrainz.org -+ Download Music information from www.musicbrainz.org -+ Downloade Musik Informationen von www.musicbrainz.org -+ Descarga información musical de www.musicbrainz.org -+ Lataa musiikkitietoja osoitteesta www.musicbrainz.org -+ Télécharger les infos musicales depuis www.musicbrainz.org -+ Zene információk letöltése a www.musicbrainz.org webhelyrÅ‘l -+ Muziekinformatie ophalen van www.musicbrainz.org -+ Pobieraj informacje o muzyce z www.musicbrainz.org -+ Descarregar informação de música de www.musicbrainz.org -+ DescărcaÈ›i informaÈ›ii muzică de pe www.musicbrainz.org -+ Загружать информацию о Музыке Ñ www.musicbrainz.org -+ Ladda ner musikinformation frÃ¥n www.musicbrainz.org -+ 从www.musicbrainz.org下载音ä¹ä¿¡æ¯ -+ -+
-diff --git a/addons/metadata.common.musicbrainz.org/musicbrainz.xml b/addons/metadata.common.musicbrainz.org/musicbrainz.xml -new file mode 100644 -index 0000000..16e539b ---- /dev/null -+++ b/addons/metadata.common.musicbrainz.org/musicbrainz.xml -@@ -0,0 +1,170 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ type="Album" id="([^"]*)"><title>([^<]*)</title><first-release-date(\s/)?>(\d{4})? -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <artist type="Person".*?<life-span><begin>([^<]*) -+ -+ -+ <artist type="Person".*?<life-span><begin>[^<]*</begin><end>([^<]*) -+ -+ -+ <artist type="Group".*?<life-span><begin>([^<]*) -+ -+ -+ <artist type="Group".*?<life-span><begin>[^<]*</begin><end>([^<]*) -+ -+ -+ -+ allmusic.com -+ -+ ^$ -+ -+ -+ <(?:born|formed)*>(.+)</(?:born|formed)*> -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <artist type="Person".*?<life-span><begin>([^<]*) -+ -+ -+ <artist type="Person".*?<life-span><begin>[^<]*</begin><end>([^<]*) -+ -+ -+ <artist type="Group".*?<life-span><begin>([^<]*) -+ -+ -+ <artist type="Group".*?<life-span><begin>[^<]*</begin><end>([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <release id="[^"]*"><title>([^<]*)< -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <artist id="[^"]*"><name>([^<]*)< -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ </primary-type><rating votes-count="[^"]*">(\d) -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <label id="[^"]*"><name>([^<]*) -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <first-release-date>([^<]*)< -+ -+ -+ <first-release-date>(\d{4}) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <track><position>(\d+)</position><number>\d*</number>(?:<length>(\d*?)\d{3}</length>)*(?:<recording id="([^"]*)">)*<title>([^<]*)< -+ -+ (.+) -+ -+ -+ -+ --- -1.7.10 - - -From cfb94b4d1baae0b3c0cf3909f247e73666f12b35 Mon Sep 17 00:00:00 2001 -From: Martijn Kaijser -Date: Sun, 8 Jul 2012 14:09:06 +0200 -Subject: [PATCH 3/4] add artists/album universal scrapers for music and - last.fm for musicvideos - ---- - addons/metadata.album.universal/addon.xml | 24 +++ - addons/metadata.album.universal/albumuniversal.xml | 166 ++++++++++++++++++++ - addons/metadata.album.universal/changelog.txt | 36 +++++ - addons/metadata.album.universal/icon.png | Bin 0 -> 59634 bytes - .../resources/language/English/strings.xml | 13 ++ - .../resources/settings.xml | 20 +++ - addons/metadata.artists.universal/addon.xml | 24 +++ - .../metadata.artists.universal/artistuniversal.xml | 146 +++++++++++++++++ - addons/metadata.artists.universal/changelog.txt | 37 +++++ - addons/metadata.artists.universal/icon.png | Bin 0 -> 59634 bytes - .../resources/language/English/strings.xml | 24 +++ - .../resources/settings.xml | 37 +++++ - addons/metadata.musicvideos.last.fm/addon.xml | 32 ++++ - addons/metadata.musicvideos.last.fm/icon.png | Bin 0 -> 14392 bytes - .../lastfmmusicvideos.xml | 63 ++++++++ - .../resources/language/English/strings.xml | 5 + - .../resources/settings.xml | 5 + - 17 files changed, 632 insertions(+) - create mode 100644 addons/metadata.album.universal/addon.xml - create mode 100644 addons/metadata.album.universal/albumuniversal.xml - create mode 100644 addons/metadata.album.universal/changelog.txt - create mode 100644 addons/metadata.album.universal/icon.png - create mode 100644 addons/metadata.album.universal/resources/language/English/strings.xml - create mode 100644 addons/metadata.album.universal/resources/settings.xml - create mode 100644 addons/metadata.artists.universal/addon.xml - create mode 100644 addons/metadata.artists.universal/artistuniversal.xml - create mode 100644 addons/metadata.artists.universal/changelog.txt - create mode 100644 addons/metadata.artists.universal/icon.png - create mode 100644 addons/metadata.artists.universal/resources/language/English/strings.xml - create mode 100644 addons/metadata.artists.universal/resources/settings.xml - create mode 100644 addons/metadata.musicvideos.last.fm/addon.xml - create mode 100644 addons/metadata.musicvideos.last.fm/icon.png - create mode 100644 addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml - create mode 100644 addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml - create mode 100644 addons/metadata.musicvideos.last.fm/resources/settings.xml - -diff --git a/addons/metadata.album.universal/addon.xml b/addons/metadata.album.universal/addon.xml -new file mode 100644 -index 0000000..e25ee4a ---- /dev/null -+++ b/addons/metadata.album.universal/addon.xml -@@ -0,0 +1,24 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Universal Scraper for Albums -+ This scraper collects information from the following supported sites: MusicBrainz, last.fm, allmusic.com and amazon.de, while grabs artwork from: fanart.tv, last.fm and allmusic.com. It can be set field by field that from which site you want that specific information. -+ -+The initial search is always done on MusicBrainz. In case allmusic and/or amazon.de links are not added on the MusicBrainz site, fields from allmusic.com and/or amazon.de cannot be fetched (very easy to add those missing links though). -+ all -+ -+ -diff --git a/addons/metadata.album.universal/albumuniversal.xml b/addons/metadata.album.universal/albumuniversal.xml -new file mode 100644 -index 0000000..9a90ff0 ---- /dev/null -+++ b/addons/metadata.album.universal/albumuniversal.xml -@@ -0,0 +1,166 @@ -+ -+ -+ -+ -+ release/(.+) -+ -+ -+ -+ -+ -+ (.+) -+ -+ -+ (.+)(?:Ft%2e|Feat%2e|Ft.|Feat.|%20and%20) -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation><language>[^<]*</language><script>[^<]*</script></text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group\stype="Album"\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+) -+ -+ -+ id="([^"]*)"><title>([^<]*)</title><status>Official</status><text-representation><language>[^<]*</language><script>[^<]*</script></text-representation><artist-credit><name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>([^<]*)</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>(?:<name-credit(?:>)*(?:\sjoinphrase="[^"]*">)*(?:<name>[^<]*</name)*(?:>)*<artist\sid="[^"]*"><name>[^<]*</name>(?:<sort-name>[^<]*</sort-name>)*(?:<disambiguation>[^<]*</disambiguation>)*(?:<alias-list>.*?</alias-list>)*</artist></name-credit>)*</artist-credit><release-group(?:\stype="[^"]*")*\sid="[^"]*">(?:<primary-type>[^<]*</primary-type>)*(?:<secondary-type-list><secondary-type>[^<]*</secondary-type></secondary-type-list>)*</release-group><date>(\d{4})[^<]*</date>(?:<country>)*([^<]*)?.*?<track-list\scount="(\d+) -+ -+ -+ -+ -+ -+ -+ -+ -+ id="([^"]*) -+ -+ -+ -+ <release-group type="[^"]*" id="([^"]*)" -+ -+ -+ -+ <release id="[^"]*"><title>([^<]*)< -+ -+ -+ -+ <release id="[^"]*"><title>[^<]*<.*?<artist id="[^"]*"><name>([^<]*)< -+ -+ -+ (.+) -+ -+ -+ (.+) -+ -+ -+ (.+) -+ -+ -+ (.+) -+ -+ -+ (.+) -+ -+ -+ allmusic.com -+ -+ -+ last.fm -+ -+ -+ amazon.de -+ -+ -+ MusicBrainz -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com/album/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ http://www.amazon.de/gp/product/([^<]*) -+ -+ -+ -+ -+ -+ -diff --git a/addons/metadata.album.universal/changelog.txt b/addons/metadata.album.universal/changelog.txt -new file mode 100644 -index 0000000..10cbfbf ---- /dev/null -+++ b/addons/metadata.album.universal/changelog.txt -@@ -0,0 +1,36 @@ -+[B]1.2.2[/B] -+Fixed: accommodate new Frodo style URL encoding -+ -+[B]1.2.1[/B] -+Removed: '&' sign from artist splitter -+ -+[B]1.2.0[/B] -+Added: scraping album review from amazon.de (if link exist on MusicBrainz) -+ -+[B]1.1.4[/B] -+Fixed: typo blocks preferring album in search result -+ -+[B]1.1.3[/B] -+Fixed: won't find tracks without recording id -+ -+[B]1.1.2[/B] -+Fixed: won't find tracks without duration -+ -+[B]1.1.1[/B] -+Fixed: artists won't find with 'and' in their name -+ -+[B]1.1.0[/B] -+Added: trying to get album info when multiple artists are credited (first artist will be used) -+Fixed: will not find some albums -+ -+[B]1.0.3[/B] -+Fixed: Some Album releases were not found -+ -+[B]1.0.2[/B] -+Fixed: Track Duration from MusicBrainz was wrong in certain cases. Credits to scudlee! -+ -+[B]1.0.1[/B] -+Fixed: scraping moods from allmusic.com -+ -+[B]1.0.0[/B] -+Initial version -\ No newline at end of file -diff --git a/addons/metadata.album.universal/icon.png b/addons/metadata.album.universal/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..7c3d600dfc876fdcb621927efe52d4f2e2fcd5ff -GIT binary patch -literal 59634 -zcmbTcRa9L;vo5-DcL)v(cejPREZjY~6Wrb1-Cctd+#y(SCuneYmmoL)K6{^gAI>-r -zcfPdD`l_m{t43QzDJx2&AQB(~000!QjD#ux0P(L10f2}6S1h0lv;8aZT_v?$)f_Bb -zJ&c{r0itFOCgwn}ow234s=2Y5m(!TJ0001GVXdz1s;wZ;XX;?bZ2TV@W=}iEe`o+e -zK-kmK*wohC6=-5^X>Bh^e$~}S4zxBCB-i3nU{!DwH@C8u@pd*>^Hx+h^|m$TH6s@m -z0t$HY{bOKf?rIG5wEJf7!sjVS{$G6g{?-4}%|Z_RFA`TlmM1hTWTv9hqSv#|0ov9a=T@$j*-0ss3W|0m7a%z{rHivnouh)n|7L9O^52H~XEGK~V@DP?W>ywEyZ?;q -zzo=bYRn7ljHU5v(F6v&6<}9k_E)H(arvK){g5rO`|7`bv7xW*(f7mXZVqE{j -zfmDK;0P2~<6>q5YFXQxIe57IXL|nEXeG>@ -zt=-Mdq?{e>fd6G*KI{L3d{!}0E(uXK9u9F)kR%%$n<%d+m#7pkFNZk0D61r^IQf5L -z&Hn$`jOCv)EdOzi|Bti$PuD*W{7?0NyZ*n%{|+8=`+pJR{4X@FycbpgfCF-{gs8gb -z+IbH`gWakQ$>XQ(h0Ao_m7j}8-*1AXPQ$ix%>+owP!Xe1SPBGIiJ!2TSe4jhB!RNK -zrK+e0^lDMxqp>RJp%HPNCXpe!luf=>ia^&wNd8C)U6iTsTH5p3eE&l{-TY+0a8|Ia -z`*))vQ?wboU0SJaM(_#w@A>=8=Tm_2$5N9a+&0hzTEY>dzv5H$mFsTyavOS&Z0Rwd@XO&KPiY2$t@H?VG{3d4gt~bS -zZ!aK?cFpm%GbO*6bX(s$sT)mD{4?i+;KXVn!kbjAfW)H?;Za`5)7zv}T!Hkoj^x!G -z*C%qWBQc&w5bi|z)s;Q>Y~jhxNcdzR{&IAgKNOX<$58t7xX@cj?>_22Qu+fEf}3aK -zkNvmA_yK;I2nmPS**0J7lNbqUv~next7U$^a1m+TPFLXl@7|JvH!W{nnJp?}hr&CI -zzqns`wt4DA*6%W6fLejQM4u%LV44Jf@~z*7C-Sp~rvAOT%Yc{i3d9XB#~j~RC_$B8 -z+gI3M4k!E8Co)i*MF9gJLkSZUFP-BB==YBEGc72dV+=GX-zrix#`d+wGNyR~o?eL= -z(FDO^L)#}Uc5|kt5SDRZ8a?UGFqN94{g^-QCQ2c(eO=ml -zg+64uuh~*@9pqO<`zTgXhnbj3B)JD`0GcZ2q_5rLo%3EMAwIM1FUZT!IvbO)vkMXx -znLe`uuF0g$tdm_LoZTN%4jNv1^*I|UgZ|(ztRfnla%OGz!X|9VY(Xq?XYG@x+QuK4 -z}y!-!kjbYuD -zhBTaX{W*jVT!H)Ez_+B7LAvO&Fyv~NOkJKKmEP{!ejjvszRL0b_Hrh@gn*Zi`I$Y% -z57w42c;K86ZY`(1J@3DSX`Makbk!QjleLT(R+;V|=Qos9g~3!-!UT_pnssPA5EOiK -zF&hS`plOI64MCM!CeW;Kw(En0h-jvz#q1zF(~SVyEG-W2pt8}J4cL)LgYmxAFe -zm||FY`O>>iQ4=j4=N9P7Y{ibgs6z}PkC*+TR=kRA*+1KAHGAgaX-XW^p|pgezXw*# -z1bI?7#@PgE8jqf^#{n`+z}oHB&I>Y+CVM6@9&qx86Qo~4??d%lf5@xC0X~52{V--VtPyH -zkpx$p;FJ$y-PLzBbHn6c!@-v?&l(gfbrn#X+AdAz(W*94C6z41ny#yFP%%QP4U}`5 -z>Hg^J4w&_i8Z1bg)_UiBD=Pr5yZ#&GVe5NaRWuq0_)N*z1k}l;!X74zBVfeXXv=DB -z1&d*bG};hvWvK+m9n`vm0alY+<%Mw#45e^b?Yy?NC{xobPW+C= -zfw1YkJd))^WP_LE2~^%R9Uf?>_?UsIpP4ea#1k7-YItsetoSC3L@&&C(w~K7?9cTA -zp^x!N8BxF4j-{ZrLgVw{T?(bhl%Ol$ghBu>`S_;>D$#_jg|3+5)^{3$cGhx%L{(o( -zwK^bf)wtm>^7faTl?;dzM4T{};K=(_6{}rLmUtgHB^>d)rmr*_MQqs+<)^X)@A!+0 -zyUp!pL|eHa -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 -zbO5vz`A|p_u)+qLT1o%VU5j@+0^OU -z;HB_A{8y3`E*ieVmizw36r%EUJYKKDZ0j*SX9m9PjM?c_(kSLRor6}7SJU~RL7`!> -zMQHf^6eA8=;DvV*szV_#O2g%VCWZiq-iP5k^x2|GbePx{mn!c3rAfmji?oERFZPj@ -z&=naEeW`DxDz(W*?9wT@?sVrF_oLxb3hF%rCaKn60E2d+ab&TFepm{JACTCpU+MWr -z1SWh3J&*Q@W!k9_a-vxF?{<16FyCwwYVHpQTsZ$R)nFB5qPUQBK}u5KPOQzd%T`)| -zEAifc6KSC45Bv!EDx -z&B{fJJ>iq@a3v>M} -zphOm0++b`D+>oet3xZO-d1)+>q-bl$a>+5Y4Nte20)y1fS+;F)gvrfo7KT;F$te{& -zzvGx!x+AE)sy)5odql}vyFUJKq$rWeE16vrf1t(4&*mj<%(70I-a|&+C&{VaBB1;{NKTEAr=EiMJt8W#otm# -z@Q7(HA8D>mB(yVR234VD19fxUJdEi=1LCFnK53o6c*+5Tk!o55S>j05zcmLN|bbLi-`Tr^AGlIvY^aX!Q~1p5!!Shg9)8dZW%LrcIY=7&*H<1C{5 -zv5P2K70{kbDXv=SjES_e$eE!(q7yg0X=U$^OpkP#^T|48hcGB`p`yLg0!8W!bCxm? -z`bY9}I^~L^VGDtjIJVl?q8AV$8l;ttwt}HD1t+J~e)^lB6%Nrk -z`0U2%kx@~xDZ{mc>l=*EU8Jh!4^@j3XxpfTX7-~lSPX^Eo!`H|&#~ndS%0^YQBSnC -z->2=zL~#jWu1MLyO4Mwuhp-Ud95@&Ilb!hoC5w$ZL41&}|*HX|=_lfdy -zIdEt^H{mfbWJv0vJ`4PV`MiOvHprqBQ}eS@187}fe&3QBOR%EA=ja8I&|Id}tqMCl -zQv~3#jjR1g+hQFS^RMA+Pz5ldLcoc`RA0qb_n#2tWxw?Y?L#d?aq}z%Y6MZ@EYrdx -zVvAHI0BcE6_BxIOW@_sxUPxZV16dUGO27kMorXlItOg>0bdGC_D>a1^W?71NDup{N= -zzf7dR^=Df^a@H@)Q7sY}e_ONWrh-?W*J{8$Qt!v@Ez9XsN#$p4@ -zex{1RE&9I#MgcDlax40V`s&K^1urbl*XQ -zbMxF-IW}_rrt=Uo{zlD*ASg|U17L((Qa@UJd~(Pa0(4~2KU0L{@F1mY#nIkpsy`M8 -zjsig#2SchK8I(dw-w@~31QQ^yZawHC^VqqwNRw=w`(54r#^DT(8-KF}8i5^0(ht}M -zkQ13BYgHYIe&tF?sEiVnHGC7iCT87m(~8P^b5>=2sgUpoX1_Dk8bMy(TwCg -z-3-V7H^Z_NYG*}ca@;ePpE^K8nKLkEq)Ne}QJJG|(hDYmLFe0&Q#IBla#kIUfeS_y -z^#wg~VwFlPa>N(wX7pdX7z%)PtKE}+-oa##vf?R12fw`1K39PfY*_xxsMRMoS)eJo -zL9$%p5Ac34JT7SqCc&IH_v)@DMTc2;eBJKyOL>+^+!c??vX%-ydulwyzH+{Um1xFd -z7_K<4h)2byp0!^?%IGwY -zaM0n7=kyr^=>ak2V)q|Rzoj~uhl0?~y7otzn=2cj5>b -z8Gk?uDoC8k7(&c;H>T_y%RJt|M3w7QHB2Mv>p)B*tiq>qD*)Tl&Tai2wLiA6c8@vI> -zx&Arb!rAYA^xHj8;~VP5iHtYoTkeIInl*H9Dg_+4YK5+mkSFPS11 -zLOv{uk%oC+2$|G%5qKh2QQzaaqHXc8!EpHa=xDW$4SoMjdE(%I|U>GoxCfl!x -zbl9aBnh@MToc)l)(K`UQ6@&=MP`n8?O5uh8faPQ1%^Lh3dXMq5I8=1VwK+8u4t~*+ -zocPaY9|xbFF}MUF$heozq!_gj^&b~-514bEb-_$7`XnaJ3AQWk#mFeqNQrp%v-_9{ -zzSBDzE1-}mP*-uVrdw{H#rhS>4;CiNyv!t5%^QrlSqDT9#ZR4_e$RQLDS5(Ly$C8q -zv9p+%d^vc`RfJ3fl@;+B1TQnWZIN8j^V%2Np`(V>iK%`u!cwTScMwh9D?LK170`K= -z^O0K$+5C@Qe%4#y8BI8@YNj&ZnW$YKaq9HV*-(R3u-iCi&~he2x)|UG>IPd(fz3iA -z=@kkZAHLhe;j_N4MveYJn~D&ts<84JGCmEC=3Qu-=-+ev{W1Kc?25z`(v>YGf1tTt -zGL$FE`*$}M4`sqZZbINayh;x`n1Ug&_?JMoKi~{7jV%Nma2=xks$5|nc~7R0uP|Au -zL%`g`tDAMsC5>S^EkXB1)*p}^rRhhB}LEn_eX25?!?Hf4m@z*(Z0Dun}XwHto9?v)scm0c{iZ?XxYO?nhZ7HVfh -zmCXr+Q*3_~|jH_d% -zRo(}JD?;5aUq~>7udk{gi3dZ;QB_xP{$O}1GVrlB((RBjmzs4p=H@`e3?-J4j|8=r -z;CU+9xWxA8ii4Uz9M{B}-7dde7zY`DSPdrlkRYaQNRnf~@>U4u -z5-l7F4g#m_%Tr%&|H7oNtAkY$Bb=BtJp$q(ejoGB_$v6|BVY&*LOFUlC# -zph`bHS(Rk2xMYpyfp#T;Sa6EBt*Q~E`O}+7q^ee2T_9pmwA;W|&d16hNU~5&-;IC& -za~IgwOIHH+CtH$2+u1mQ+2tF3&8J13glhQ4pKp=;OqPIn%vswvgDt{0So}q_(rpBu -zETa4opW%z+^ni81C*tKl%@|x8iw->ERRAX^m5$cY4_XRdE#BY -z+!hn1dsCD1B_cu>8i8q_cZmv7UWLdw`}rkSVS`^+ggRZ81FCAz#PBAFV#5U=0_F6X -zP*5a-?mN&Pmq<3xZ3^____D8{R=?ww!mP$wawo+{BsOwt!7*ncYh1B=C7gDjoykYkrQ%V&_C!(q~Iz7iI(u~5#bpkpG3%);0bY6-fxjkM2&d^bl>cf4Jz -zN)b2FM~`X$QIR+z`x*3Awy*}j$a)AtMj3mb;qJ!1M(MFD-)cv*^K-t+2{tCNh6inY -zaWJJrFcv2xho>Ux4d6~Vh9>eWMUov{f(Y~#4Nu~>AoC*?1>@yJEUA`^)SlE_ylj?C -zM7&cFyNc6F&U1V0FiC;?%8#nBmj -z(P6u*YJ#08MG-(TdcydmY$ZNHWFlu}8Q0mq8_hd_Y;!pgy1{(dJ^Tv!~P`}%QC4A -z0nEhB7C(g#xBN;FKk5m3Aios-_ZUlw;0=$-;Fx~WvNPnyX2)^^ou8VVMk(g`gOjGb -zug1=vs5~a|_6PE#KE5v|5iOBr9OemH8386kZ>>C6`!~zF^-OtJi(eVV74gYzDMSSB -z@GkE(>mLGNsZ3Q)uphmC!MYE)7WRRmJi`tUjWk5Gl3eCYO6hTQ6~_>)7+sMm1c6sS -zZE8NWz5TGhwH}M)m=s-Ze8--uMWWs^!eEDBSRsvA6WTAN1&>4FZqcS=av;h;VMJxF -zj+AkJ!`@@;BB?MForVvKos%^|M)8C;v}B!xA627qf^~J|$sfLG0v&ppSO%&eA&#aO -z9bzLX*?WGdP8lt#n4TIPagEM4}DlYC(c7T7YdKDf~|_I$*6-J*XdKI&kvUR -zEd5=~7^yZ=v0*o1HX_qhv0r$X@7u3$pvb1i@RB6C#>8Wd#2*d)R^2delYYerff&Ou -zsfo$8)fEQVkuOiVDc&q)xc6%H+pECxN+GGBi6++4fCrArv1(i@@~wCyC$Epxf;3>n?>rt -z(&$Vs^{PuWgHE)w?*?>?vZi>k^`d58yN;nw>85_a0HE)KWD|&AW<%Xr;8;&$6{5bt -zf5%sBz4yL_vQ+(v?VJHhfRV#*Znz9Crh$ed`#}=t6d4R}xFVLPNoZ_G^qcy_h<-th -z2$xSyMfntDjS%vaRHOo#s{N7MT{2rF0EKTsMcxs$k!%@AKYV%V-bD8j -z)H%o%iO|p=fv9JP7hiXzzLI}FMKYZ(y<#8#UD(LgiJRH9T?iRt;=INS_PtnDB`zEg -zEpKZe(%9ARY&K+{n2cJ=s~OjTQwZ&kT55TKs4BFbf*Pyk2P2j9ri)OgSs5B% -zMjjR_;(UpUiuN>^t8({b*ey-rWX;3tKnF42z+yRASP}~sSgw4> -zu?TasoP}-+D$B*g6U9L&Q(n+ov2JRi3R1+4|96MP%ae`gk_aOv0J2zhWR&>^@m0^> -zj%vPGSXRE2$#NXd#ChPa^f=f|Sy_{EYbd%CkbRXelQ?#10a8g2rko{?FHra^QQX?aP3M=tri;4h5rVEA -zkY^-!Erm5mMtI-tkDvq#t -z$+E(SQJ(45L|zphbxYD{t}}Bi)GknJlr9$^saC0M~e5OqZ(F&!4!QOuo`N -zPl|C1dmB4=5N_y-a+te2#1Fhf;a(ZnDHKHb@rFd>myllcGav%t_Krt;3#2$+5_!i( -z|9+R{#E8RH9GC$-YT;^iopOH@@#ON&HzDIO*sJWdmWNUqrJlG)UZz#K(nl$pi28x< -z3}y#%*b|z{G|oO)Q*SP0C&Z2U(0K<-I5BGl6{d=E*ri)yT2CV;7oO1L9d)Yt&=Hh% -zGcNF(n;w5-iBWW4*&~0a%+7^wGRwGu`rbHFDRb`S6L@!Fp%6(JHCowbp%0$~MV2#$ -zLV0j9Ae3Gs-tX3P!#2hb_lT^|w0`Lkf9Xr+kJ;p1Hw&yCd2MX|I3>3x-bEwB9rC*( -z#7kg^1~G0(F!)}%onVCvc+?%XRB|%C1g#F-`E>dG+E~WNqwy6r6XZpJ)f)t+^d=rv -zfnM#{E8x>NagUc(6_MXnCd)`_&&zSSy!P}06v|mGlC%% -z(;ejqWi&>^K>YAY#^SJmHr;hIyC`|??B5U=53cjCaR~AR?Lv2|qRmnGWie{0(1U+P -zf=S2tqB~Ztl-6nHzJ>i>v49xr=_6OEfI8zuA&5;y`nJ -znjH?$!{Jzs#adnjK^ -zX7vddMe&NiU9)5p6kCdocziJV0;n1V!O!l~yDK9u;g7|O} -z4Q}|wN~~Td_yI1l0TYD3gQNyA5@fQCjECEkL8+~`Mz?H3fZrBbnt}XqUkWRc{nI|k -zJ=$qS^oi;xX!u`BL}0_;11IAo&!jyoO+#pvUH<`?VIe}dc#UVOTOxWd=;$z`){EZ~ -z8@$~+JSQRSw2wrmiTrF_6deiNtL1&S5E2v#tfm;d+~<>qEnA-uB0PBcI{5x9HC;|z -zrqdX2^cW`juz8qWqn-lCT^-Sp(}5R!HUtraLsrlB-ttblbr6{~nPrWk}=ih&!kj4~w0i20&PB66}>+>Vx$xV&EgSsemj%92|aFG5~NaO)>!6$QbqPDdekGmCp -zyGqImE^dkQk;5@@7|GWtzS3ZuPf4+sPT!ubUW3PQz&wK)7Spqr&t8jIc_4askw{$( -z9O_I+7GH4h%MYo+qq;vLu|DVgm^;-;eu!^^c1CJIS&z{oq9iWtR3>89ix!`@TtHlM -zs-aK2(MIY}O?#1dGa4?o%q~1pWe<@)|)4 -z?Ob;s7^csZP`I$_QfGs#b}trs*s+)M7D)QyU#@0pmR%{jZ|4y<)5PAiiziD?d@xdIjYbt -z^yH0a5K}6c(GYAT_I-y+;N)lW1Sb73Da%Duza}XpRE3XfvK8dg-ZZzuZ4&B!UR=*~ -zl4Oc=l0SmaBHA^DUuCF)|H0GP8Yb-*K1yQk!Mcjd@E!@wn_n{({9o&X5;MKrkth$q -z_da1}DWo!_>$jE<-6`zOYqJAi?3oR{SH99UDhtl(XnCJ82UVX6H%eiN=6_|r{dbog -zN${8sMYLxcO6Im9I}0Dm -zoavt?#3flFjbZv-ddtbd;-887Z%uUGk})3(^~JD)TUuO^ -zA%CSO#B=R-2!w^>3DwxuiWM-VvDyVlccVEPatex?YXbS -zB?d^kmQ=it}89>CeKVieKiDHT(w+Po0% -z@H_n?Qp;LSwCzt9C>!9hFV#xOWD!jgGfn5BF-QkAo^%z-HA|=z28@`b+$?29Ld1R- -zSgYv?71wypp`(iJ+9M!%%MBaDv-U}Lcg}+lC>1>5u#?EAJXD$;Cc+76cEQ&$ -zRy4JRw59O1zr;BzaU=PaMygTxad)Q(ETRUH&4E_FV`U -zS#2r##C}C4GKtg0e6DMm55kC9G~q%~g;~j7|-h -z{p!hr1*$GaoCM6zL#E&63rZ-st?2q4j~Q(O3bz7G?(XftD`1G;`$stJ&)DU4cKv3t -z5d9(ncbpfcRTDEcUH_@Bq&;n!b;vo3c?z?0C^Uq2OjI2Gyw}hTzQ{zn>3`?IukEE! -zmeU<$p%6vd)agjL=+|Gq6?pg--due#!?^kNT&_HTZ(fgHLPOlnEk3weLOt+<3S8rl -z8vV`7z{m$JE=5R0r$qszWZ^GTK1K27 -ze`syG^K7VyR9wIA=~*&UH{~U7|8+gdyKtJ1&$O@lCI0~*-OHHcT|1*;h3lBR%W!T< -z{?1NRlY+ZO-1J>$KaOzVi+NEecFx(Cc|>tNXj}Qx?Y*puoqJw=!wlvYwFW4o@{RF3 -zLEQ(-^{v_cuAhhOG#Q|XV9;*CI-&jUUJDFEk%+`XBbzAaX_Y{nV=7m+oXCJL%uzn& -zYbvGV0J&_b;_e^gt@*i{xE)8t378nq3SqiKYXvI4zoUK0+wL}p{4Pj#^~GCRmR1+j -z-TbGPgic~of`Ti$jFc9=IB5N?eNFte$C$$Nx58kweFQ%VRpjxs6hAP&TDSR};8@cv -zj=qMaScHsUJ3b?J^)xf`(XagsRotH%k07FA@w2r`LS~RlTCe0_T8t*+!b$hX%Io(S -zFa(LR0KnUl|C%1yhsy{xzMa9L>H25Hgea<<;WimzM{2LT5xM;|5~04b$vX!BL%yE8 -zqew!*s-atXr$|RB+p=J!6e`6DBAR=O_AZh>uhZ!`{!Jzuc6Xq=!YxCP1Jzh@Ak1fi -z0cmp?`Zr;F=dXT(<{cvvM3*0+LA6&x-W$n0tXXziEJ9f7WooY|qN$Y9*3dVDX)9(^ -zKQUgXb(@;4#`~D1tLG$ht&h~wzP*6jH(4sb#!6-FeMkTG~`CTYb3mFFR;AmUZ{L?Y2{G_u7vhLexl^~LB{p5JT^ILiIl^e)~s -zm4sgviLg~@%oSKb0t|aH3LInJzejp;x{D2&|El?1FD`U*)hrwr{0N>#M+BV3kNGuRaJjU%K5o!$%x`iSdBQb+35_;(#dJJvru-d5mYxQ)_HQ36 -z4(yo8){E$}SV+Lrgqkq%{wfj@B8H*lh -zeDHT^s^T!pDJDJ)b;A*J@fH~TgrlID%1TzptLByV4x!{AeKnegSlPtDc#=BbhCw^k -zk#o7y()l9Z{5Q_oPCH%M0U|Y_-7cpAnzZM#!E@uM;>_!^sl}dUD`s{RVqQ8y%9N`> -zH7=FqK|_A=i}^S3@z<{Nr`DS>3T?*P=>^SUWyq9~KcRXyB^_>nqFA8Zj*M*zKEpr) -z=`b$!Zx1I94hDKW)VuD?s^G7~@}gN4jiw59w4k)o9d>W-5w3O@|9iIC<7E_?&B8_Q -zd-YL)6Xh@|wmaDsg!nY*7}ReL1f{H}uNVxhxKN~Lxm{}{farl5i-#%#+r4E0=KDSG -zd2_gMKpgpkicE9rY7h$HL~fgM(aDGGd;uC+5_`zA5gYcm8e)*3-Z4CN>I2foqBhMpW>TuBjP{CG=6*{&4 -zldb${-h~%aMML41p)#u{R<--f6x>}v!_CqvA<=&DX^$S#=ZN7Y(4 -z6sc#C4#oD(ax!z1NfQlnYJ^YSpaR8peB+k|o3|;=uo9iHR5`_495lsUz9w9K=3Q@# -z`}@$C%~tlOL4wgBve;GZ_d%mvLic29r(Y&X88j82@6K=K+~=2&NPAJcSq7KW*emC^ -z!6VI-6XwqXFmZaxlpX{-rRY|?MEQ;yi+ET{j`&dlh!14aco;82;#=_=T{4!`w=- -zd37RsM-1awy;Dx}&KG$GT0c1UCw!DfxzMDoU(e*k!jtB@-8w>+>hz(f=-HX--sl+W -zl&?a4*w3$JwxIDL7XwfsRCKEwHBVPDtZqC$A%NpAIzpz;^UigDh`ooFoG>rpoK;wd -zJD5Fey#Z~B+1Q$CV%!ew8)B*YzMP0V?EQ7=JgN#%jY} -za`*k&XwVw;8&DZ(Z;SZlezz`K7&PA(x_8Okd$e-11dK7X@w74by``O8u;lk0?7kq~ -zo@5+<)LxVS$?tyMSDO*?a%}z_W9SP22|mBi_`a!W2{}2oE1h9jOV%59)fNP3x&qn3 -zAo4FAZE?b_X{+>7+6O}~uAR}}7zk`f@5-T8>*_1*1o_Wzv4VH#ej1TW>;6f-{pj!d -zOz&U6!FQ|`C!{)LsG+2-^c7mGj9%uB=R{w}gR8B@bC<#s4GESVZUTjtRNuemr~EN$ -zCILgOhz=Z6j;~NEx -zE=Zz7mx;dFwNs{C1hRXNJ5JuhC)7z5k)s3SL=K99Kz#$>%g~R6vMssUnIFFxS;Clg -zT*YZ@DRywSiz1ACBKStdxT`QM!jZzQy3}w`s)C}M*qHXU6~V9Urn!kU)l=FMFlx(YMoeS{YRRMFP~86joVT_}$I_nkbNS;)bBShs4GYet)Vm&>lVR?dIfMzY -zNVLxHG0}atD&onMbdb6!ig5JEh!MD*LuO4sSSh-?(~mE;Xr$zho^d(vHTllkg}kE} -zAe;Wd;o`X!R|@3>cH}9ww?0nR`*-H2OC?*Rq7&g)n%{DdY0wTmh!qgQe1AcE%{0JK?c^AMtqt{Xv2;{I4h}qms)O4b9 -zkzA+rdPM$amp)(7#1+8*m0=Zw7EfOLv3&=)Eexet*`)#Y4y10Ijc;#1ZxMr}0qM>I5O+X*G}K^Y~{tg+;WjYyFva#W*6W)+-{ -zlfZQgP{Mo-IRrl!vK6h(%#xG>>kWoV0WOi}7PQ -zuAx+fHu)HC+$E#vLTuD#)(s4i-sIkKJU@7+BLkt7{8#5SYu`V+^m8Di``+hs{ -z3-fc64?k$-v&`@%?DL_*fA@PuJ}U_6*q?m8r<@VFPVAgWFIBxBrt)rcA1)d7_%tC} -z5f~1E2iDP(xU99=KJYigC54WjJ%wR@x(G4cqZ&KQ+ZF?T0>_qxW-~YM=;cPslZB;tdQ33HRzGrAb=80LQZV!4Yuwm!)r? -z>iX!!{j&$n|E{a|VXeis@AEHd#DF~V?oEw{Ok^-9R2yxt7~k}e+O+yo)7ll{bNkd} -zWg|7QFBvYe1)rO`SnW{8KTxIbrzeg$1qc!%2D5lX4vkTKb!bzN-e>dko~PHAonWA#Pwy7i!RKuKs_SXsDPVhNFeIdEJuu{t-INC=Tx>Gy2FsTz -zW~w$mOk((D`Z}$D`Fe$3EF6ayc0mID8K$dLcEfkt^4WLc|haZ3wkVqG3;RUw1=sG2)ipF{oPgal!P -zw%mv~w}~3c(X=Y1KLh18qReZ_5S1f^#NyC*fH?NavASZsnRp|ppO#<#9{^K8tiJ?# -zVuW#ufR-r*5DyUAg?WJ4<NxO -z2?VNwE+a|*JpH5iXFC14@BQALjScv7e@m|5%f9q2cieILxBl-A6xjpF@y39$ES=P`d -zi8D2!qL#fau;4{9K^ASv(3!6K5(=KAW*a+h=e%Jsg41%hcg4xu+SMOGd2Wyc6+^7{!VNldQ -zF%;4@P){K&i_P#;gYFtr%%*lMv6O>hJ!J4E-5PI;m84b7$0z8zsJzo&3EH8M59!{sJI3zK|Vh5nDhC -zWp#-ydw13h)SXMgDAaSgN!-S0E#<_xoEgER?&TGPg3sfhn$A`$U?QT+EOd2vR&53# -zKM?TBlX&TZ=X}7>s@jEj)k5N^w%x`YVjYHYQY>T>J&%0JKI8PG>$~09uJzrO#Zp6{ -zlmt@;fO=lv`p`p{&YnFn{5Q#rzw+(r&IdmDa5eFWg;An3^Q%<29)rYHs)*@~Hlxpy0Y(?4+(CaKqEc9Ql(C+4rm{I^K6o)IAAyY+& -zHLX^LfnQ5%;1@Gj(C8}GwuAxeRUEhXN=N;yXlL7t^ -z>+@o9kt_SXm35FlQ)iJ~KIT|>6Es@r_Bo2su)@n0GKgqv^RoRb`&T?RmjKs{DFw>X -zE*TfjG^3#W2zetLR)u`vj+?lL2FvC@Sl0(%R?w22S&mGc>y<@I)u72u3xva|Jh{!jMA5n|NHH~av<*mW$85I4>C2L+N -z9H$ZDv$2C9`J-FP4!Fb2#e -zWy2(#zw|qB^}rmWc}J!Ykmk@}PVvdBmZny6*0-V%9 -z|46qV`g=co>#dhG5Q;Ig$CorSCmhY%28uvL)1&*nCqxuE@KL+oUD -zatY|9?-pa8ZtETg -zJSBX3f-ox+5VU8}Z`;1@0xt|ch44e~e$NRG;tzk@-ro6d{@xD@_j@!p>lNvbaWL5* -zVHHXZL#F7buah6(D?6m(%Jo*mieYWMbK0HJKN1y;n=$6C8I2oXa?P5T9o(J*g{H34 -zGsZ4D8^tBQb80(Sp$W?NUnnbxi&fv;#nb0&$e`z~lDV3sE6I%M5KDSr1J5(0S&Lqf -zQAurZKl?j)^}w;K^D;p%o+y*%3ZWvWH^^=oWD$ElBZJT~iy3p}vqzCW4 -z_s#d-dm`3<)aJl$x2lm5xUdm--Xu;+nZ9(y -zY-v&>7Ll(oQ1H}6C24R1N*Z6HHDp+8Y)g~J>Mg~P3;R+VeDndD}0^R9X@|I->KlLzNJuF1IX7v@0Dlr)GwRF7zX8DqY -z>K1#l`YqXhlKn1ufTRIio15SFUEg(*-TpCd-}avGxP=3upq#vh{D}qe7ULijsA12m -zO2LmNKX79@a1JCQBGXdB7aWAH%VEFo@?J-+mMU+GE>Sf#NPigL7Tu)KEO|>nJqO$w -zVk3~dQ0%?pZVa36u)?x2Y?TgeYX{DpGc<(dIGD*#W6TQyayu`N;6&SeV;~3bGQz?# -z@zvUh8I1%MPK4|o9UvuAm4;d`9P#ENnSPZ$TI@E;X@drGO -zq7P5rfE%;oBAn&Lj$1;En+Tc2idOJ80)xzJD`dSpnEB5jO6rgy>A)mY!|EsJ?Acj_ -zZ9UrDHkLiD8Jg;I%`^jn(i3-f-MI@IJvl?|$MW5{h0N_dYpnUaxDvr=d=<#7_0G(s -zlF_!A$1rw_{F8K~B6MA`T)c3yOVAwa!}KmQ|G5UW9VBK?2z+xL9;e-f%}xXyzG -z&|4!WA`E~Mg^de_40_2Am=0(~$ii-_#?-!r0-hl7m*5mI?X>ct%>E$IQBEv`Q3uwk -zHY$;i^NOzIp?jy>wq+%0(3OcwWoMODU)Q!|U1XNU^x)QZJbwWTOej~5ERV6BToH#{ -zj)*qX19`21EsZg9_jFtK_+uY{rw(jhFIu5fNlHv8+B_|eMEzM;GUB~;iG~$A~cxua+Vu9aOs0Xp` -z{M*(J3PIoizy~%nkP$xR+e;oioW0h0%UBhd(h(7kcHYB}eh8jA)V`poK~J%MutjnV -z0}YIU4>MdV!lE{8uZtr=|cf_g^TA&asq@>VpT|$9n`4UvTRH!Wo -zQVb^pncOAN5o9o;Zhpz;Hk>;jLHc4PrUKMTe>L`=>&2$h)jUmwMb%tJx4X`J_m4jm -zpE!^fS0~>s+505s%jHrcoOF+czFjWn?P9rHEYi=E`=*~M3i`@7fBA|1{=D42>TO?h -z>n)e+(Xd!=SdP^iR#^1_Rb((6C^PD(Cl4%fv{iG`3k%AFXw^x`u|$-)@}RpStyvcG -zk^uvdCJkD$`QB1p6ip*exh%%Sp -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 -z2{2Anj8?xTHSdXeL5)qiE#ur4BS -zRvGE22Sl#G^Sq*j5RM7pNI7**i2{uF~jVbfJ6t;m8C9*XeyAuT{JG}{C2if#^(;*sU3L9EojR*txGQN1wB|Q -z07h{|tpMtUwfDdJ;)&ROk%<0)?)+xA-EH`a`=Q=O8{y{nr4ZOi)x!b3q9O71RxfuJ -z9|Z13aj1L+s0a3d8doNPL%|J;Mv&-mDM@JNcwLgGWVb}=^v=91iIgV=87YxYdP78l -zK)9eYx8ZY7QGY=85AjF$%-SFemYN`Y%D5h@IR}??gsw$*F-2a}Y89c(8gP1tj_k2( -zsHJ0@5|Bxt^dRyW0E+aJ+o3y8Ub~KWp3Jy>QN%x);ye@HLlqQpfe%ja!dKo8zwrTL -zr(Y=sRp4Sx2N~HfyvjgjeuSjW8hp5F+%l)Hm-O02df)2tvCv=4Sy;^N`rQOaD4iN4qBkkjy<$7-W8$#&6* -z1tolEj;UUL(!5pQhS2Wa(qgkr_j?LLs5sLS1IZ%&Dht_#kz8nb_^mibl9eL5zA^GP -z0*tZn^-4;8Y8zg5i?b24GGnLAKN>`d^wYA(_y67>{QSRu_(cA`@CuL@ZdHB&VL*hd -z4P6g=+wk`LIUhK_C$-WCSGNo#xOaoWkqE{YtuO)Bg#J;Of50GR#@oEY5e;RS3)!oL -zs1diYj6|gp?|83b5^t9OB*)8k*(V)1-;o~(U6T8*TaqiF!Sn^IL{E1pJ?J=94#G(& -zI~zs2DBuEJ@23P7#bOgI+@!HcVl9Op0 -zbh7TQ?`Zox^LP>1lv)`buj=w1sTtU7yE-4Kb>=jUlE4hlY*QZa$TKzv)>)hu1rWi` -zBxuTg-A)DQpXcfaB!8Ti87j*bqp=$G0h>Wr9Y#Sr%M7)vww^cH;Weei#N -z5SDEPkBg;thO@THuMp?b8du^vI$k+MPLjfb_Rn*V2O=|8(LL$UiWS-pjKb(H^5B&Z2{`QAXWbq4f`_v=< -z)_aNgrF{ei2ZLo0EL3q3v%gZr`xowo@#rQ)!yMwrh{GZ&!hk*8)zbnze{6dZNjlmq -zIQ<|+A*L;Ps#tQ#J}8?kMKGWg`n|1E5wa25seZV%`7c_t}OO2%4w^s7B)pmfzPIV;JmG5Ml55+F>8BfB*Xoq -z>EHZ^|MTO|Ts;xT7ytH=kNl40yLHwpB3=_8)Egj`UxEF=zxPJY2cq>kO;4K45Qt@! -zSY&Km_62ASGO%t}eg_I=k`5&C-+BNgdP&kQ?bsyZ7^N@EaX&L^$`o_DyX=?7@yml) -z%Dt(Ikr!Ob7u(#$7oNj@sbtRB(~Ld}1x4)AePMO?O+#E)j(gR8?;8g)%Iuvod$KD6 -z@9P5BnQdtM_^D^))4Wa#K#ZYUKVndl{iE5B{Ig&Dk-zyLok--1c{@DZf8YDwyRkt* -zj`;zVevj3Cw$@^^bJ)I-njWfy=L -zb>3%|p4l`yoRB$5(--OKYn&bIoQrb@v?D^_hI0KuTn}7LrNB`m@w8C7Xp+=ir)C?~B&@K9RJ*$B= -z8AvjPcFJiWq*-!g3WlTu>Djvv7`Z=7FqiR3>Vhtk<0zeT-=qV{{0B;ZTT2Nj8`cFZ -zT-wjEiqNx9)|-PHKE%c+p-(!{k49mFz8f{;^ghjq^r6XZkGx7rbU_0{MbPO=a+mX7 -zBpvAdr=G2g0Rc)Rq_-dcFaOgMiF`3{Pe1+mM?dnu^$j-v9wh{lJUGt*J2Ux3eA(zh -zr&>WMfu4SD?d<)P*IoaWkHWHJ55S3YM8m~6L)l4ok;J`&-YPw?i3d89PtqSinu -z|6V>0H(c1c&qdv}#5nZwjKE<{Y!G+rJpIark@Z;u-4hS?9&wwWg`$wPj?M(E$`xfX_pfG%$$;W9PByx%8J4xV7ux?;EMq)y5heN$gvEY|oD{cJ{~(Re;jq0_kO+tG;n -z!6W7!qJCBq=T3=$pzpjR!XM$arcOUm<*sv=Qq8t@mS8`v87jy%59JIA4KngVOk?W+e -z`;xD}>&eEd+|k=St`@0Or|sO$Dl@7{O+gLmD1`Q@*8>4gjD>vQqxPhYw6na4i% -z@!$XO?|yW8v}i_2iPkzc|A8e{=(KVe=rxoR9=M(qJNl^n&ordZkkN`dz$nGipLR## -zmi6%1l+6Eke*IVehwu7}C$jhjx&6wo{B*;Hzlc6?704Gga8||l)!=X0ju!_}P~R)0 -zG(}Hg_a%+?fJAjt#6ZY`m8NhI3ek`Sg`+7M6_5v$Y^As8V_$U%;=$uo;@Nmj+Xn&t -zw5|4dQ|Pmha%XY{%(Y3H@Tyn8@|(Wp8(#a`yFb^tc*QGTmj1o%tKM>SboB7UANs{# -z_!n)v&uyy4uS37-=rj$*BFrTJxffHMNzYE1!$(o}5nR8dUg2*~B5aQN9U?Zft69ozmT%m0FH -zzi`Zw6G;Dd_O`y~KmOj=d~VTSxovK4zU^&qN&kN4XMXXQe(Ak!%k5^S^;DXcq_CZ5 -z;!!6^x#R$7GNErpl_esgG)I=5g6vV{9v$}(L?yPGcxv3QkguHFUbNef{xAQnZ2e5x -z>Q;kV3AH9b1_jwhQJHBPRIpdTKSt)j6(ly^&GSz`fA*FOaV^>c3n>JZDO>R_L5I#< -zpUGKJW@TI~6<8UFNz&g15V;GpC;MgSHeMymRd~Y|V;rQzHDAuZ^vm!6_V0Yp=GNvP -z;{<*4H^1Zl```HgviBW;a#ZF1=bV|@a(j}SLJ~*_B%vgsgx*1eh2m46^&x^h1fL52 -z_1U|E`sATLyVwN<#fFGJL6o8hN)wP036Mg1yZ!FY%sKzBoinpHfao(9g{< -z?#$P}-}n2@JMR$;9{y0u0i+Ym`%QA6yKd9YDf69@?U?VD1iZX%+~ZRTtVEqSDwgI>T6TDF`A@Ijv8{3ZZx?;#zcp2UDB#iH -z1V%P-#_W#{f -zR4SFj4m;?UTW%WYA0@IZ9>|H9JK8XO2s`G6cIP2(T3~&QNkze@-W<-~q>MbJT^OS& -z=u%^3#mW`%H5V`3bB9$Px7+G9D=+-Sdm-xu4*>T#)|EuE*v?MOh7-z+(LV%W9ECte -zHc${KNWv1iL;8oc9u-*|(aR$xNi}ldXB*aSup_xDP;tIA?%~DEhHJUlLikV{_-Tuc -z9gM#hmdzZ|Z#-L`4XkT!T83-1C=VFjX~xvQi}d@fpzY0XeqEA`SPLFN;L~|7SWy&m -zC!kbLbYZ#plRQ -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 -z03K|6?wzjN`%&o6uI^GWK -zqkl$pTIr*?;0J<>2#hK8wg^;W=;5Xv5oit4uLay2-Yt_gSUy(L4N&8i23TJOLc$^9 -z-r|Kz$ga-ZjQDq@Q@gT6FtJ&Fc+wQl4!G2X*=2p%=!!C@m7p3%!_AJoh -zNl%2S28Px8{*W1pL*RKRqDK#;uf=D|XBe6pBZojsFGLfpkG0}dHSIE$%!zE>W-iSY -zhd=`U$r%R6Kp@Hil!sJqcLyNFoy_Lm@Mp4+iIh6y8bXGhudKJDIXv7%1O(hOd<=9K -zCm(;zj(X_$+?M|NZXqD{COk0Qpy0$(whyUrSYW}yI!E~k|FkW=0S-9^N7VXUP3^|k -zmD5G76LcUh7Dv;2eIr@K-TRi1cDqpMRJgrVrD}BaA(PB8d5yw-<(o=!PfN$yxSdU2 -zNoIXs%UY18O=Lq+LODu&Y@CB~9UvolwsQ`#}eq;3zsf+h6(O6V5vIr90$u{BCe*>O$*jiWQD6@s9R{_hF?e -zV{*9L6($0lpHL5&HhvT2112Aw(ADD^0C6!&?45%hTB*WE!$g}oB5E8Ry0k=s(=8wkPKuhr}lH~jlB!2g`F&pb6))}^WHmehx9)c9)RPPdYh6l -zB#+9JXr~kcIp5pj7FaOJQr#~#1l%_L0f>c+U0>^%&Yu)JB}5NAHo$ZbjKub&(2n|I -z))u?C;l&XA;BwMjs;D>w3=)*C%Ix%Jnxv_1QV4{jz&WUaOUJ*a!X+Ru@DXuJ8=i!O -zyeCe0{S2xouPY!79OT5Wf9+K%}fnHth+6CdzuD}r$t!2L@)FSJxL`SkWN#QdLF3Q;h*Ti`qA9& -zlx9&%Yn#~W+i -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 -zPCfHwx8Hf|U;EwII1k8` -zk(SjP6b^BgS-KT@h2OWnU2laJJjSmxL!-+~dc*@zgU+s67wAJ*dsp{-(1ETl-PNT!I(TdI4R_yl$T@Gg -zZCrkMNc{*h$GM#Fh96@Fr^BMyFIDhFXr6pjfb$7%qNf*`8Zl3Klj%7Az9169xm -zRD+Is7iI<3F3^F_z0nVJ>+WuZCDm&1tNVtA&idqqaDN6mfuoN+?&U8z1^1Z_4t(k} -z|MkL`9)J5CzkibNJ?X?(z2slt;2FkCFlmZ;azD_B$GPABLX>jg2WqjzMbiCsV!5^Q -zjOwbiS+z7frb^5!*0q#M74--DNe8qm^59|+(J1}YM?jBLYtpiV!E72Z%hpmy0O#d3 -zl|(hgL@{oWsZ>BS2pwI)=m?TyNDnYL!sM8B022dn2#_dubf6}5c2?TktDPMf6k%@A -zxv;ydy`vKq09`>R$B7sJ^6Ilb`QOjPKD!S$jJR7BR96IT|>`_L%RUA5RtKawx|-&G46sSvmi -zss7Dsy(uiF -ziOZKhe*XW=ojYGPCpvZeoxgwmIcJ{vh7*5(+YNv5z3+U-MN5{viql^<|9LJf63*iq -zl-Gou5!BQ$-ic$OZ8pg3&UDk5JuCI%c@d{Aw3bb>V;!MqpkAU;jJid($Vl7VXr2kp -zwN8vnRNB<4V)9JqxydW4(J)D(DisZRMUw0nMR!DIF!Huya1dU9$u(EcnmX;>|90v# -ztGeIWb;0?cKIQZm4R9(IvTd_P2dGj`VfcT^!ib -zb1RhS41BPv_9g9046apP+)9vl>$fcpPKJoFsp}}XG4$Pao2k1Z-Bt=e^ -zNW+t$1C^To{jE2=>wRY)|NQx%|KfR%u3rAw`M{elI_}t4g#{MQ6(hpBL>_8N8&Ua3 -z(^$o6Cv1YrT-&=0^ -zW3cvn?YUd|M~|*vPa%+zJ#5V-Ha9=4C?R&}888w;XAn`<2wP^1p5VrDln9)f -zI>)FXkUwA#p~^lXuA?i6!687B0Qa_fy{&yQA0=NY_Fuhvi%e4G+UpVjh=gmLo|Go6uU;Sj;x4+?>i=KbN8+dP!Yz>rZVH4qm-#ZmarL!0!Ck9g_~T~x;4hfdOe!eU`8 -zGKzNq8}&{%|y+p){CkONdLKSdg+nJO#9Gzuf6fcE6Z;`?ezaX`|K~5 -zy0CcT!7;w&ULRO7IN-^3(mSEO=KVmVTNI!re77wUugW>JmMpoL5nyCQLk$nB0gah= -zG|<=L+4tOMZont}@Y_Gzex_yBs17+u -z4G-(G&+=?!oFlN?KpoK3K~n^!U`8PflE@Dj$q=fhLi&JCpcdC5G(tbHe_IFWfMy-2 -z*WeS*zVKsxgM-gVKL9##NoQwQiOSW9AMmJ5xLiX+TYq}hx8C{gmmGUs^#dP#=@nOe -z=HZ9Y$scvhtKRvZtLtq&67cvv8cG$s4`n{kj8#I%6MA~8v4}{tx1Ot7){3>P7}Lde -z86J(71i%(ug1{Mp4e3-ha)-Q|dmc1**ZD1M<5zwEm;BkQR;+#TDJOJwcW#e!`t`4W -z|K?jHv+U~XIRC?MF8}nK-}(9Sm7C(EX5uQ|qpFT8DyrxxQBeZnzl!3GqfviqcAF%W -z5u7YISz4&cGhpQC=#)ElA(25kc?h4#r&uyd4!s3F6I>==Ami*Lr8Zle=9vcTl%`wz -z`)bw7QH%C_2I|11Ns|vdhu{9G?Qu5y`v<@F^~*y?X;})m;|l>Ji($m#6oT21e7}e;;%tIpq`PpdGq%C;^)W@guz+7 -zJkzRGiQtVN0}u&AzYD>})(7sp;ff!f_tPuR3s4)a3%D{@DtRet;1VrHVRYO!VOk{; -zg>kKEuhWlFRCl_y5ac7D!dHYQKvOlYx#GGpG2e?{bwc>KtABd^_Q(X@`nHdO4umiI -zn$urW{^@-WJTf@c1nD<)mjOsDh8n2~Q1Z@S{@xAh=MOpBGM_Vfs0wQDSP>{N5(nXQ -zPy^Bg3X0&D#F_@pxJDG!PzU&4tJN0NJ0LgKwW_XG-~-RT@FP!y$o}>_Z~OAszx3C> -zYmfPRU-_dO=Fi*9_i^#^MP_QfO+XEJkEpt03M6KzR|dxOF=hC$9W20sV&i*Q*z$?% -zlV*?IuJ+^#SEMIy5AOBqbQ{hwd`i=v@;@WK0zNdSKIlj~9Rqu6J_k>b-y$t~ZV2sgII@7`#x54|Rm;~h8r@%Ddq -zbG~@L0|p2CUwQgVZ@c3Uf7Kho16=flOXtnot62KzToO%fYcB-Ln3gJ}DXp<^L?WK3$CJAnV^#`<1*w`1wYaAs8o_9zEf*_8VM;ar~KKbaP -z3)s^Mao#OA-p;=Yj<37+mXrVW+0|P0|9;+YzWI*VzV=<-3*zm&mwp;@fFe2?7<%{n -zzmz%1P-{_AHA&sXAesr}vMR2CTR@Nk1VRz6B*$(q21R*O79;&C$*EmKCsNq6r0@@9tg^683oYfd@-gnxD&Sg`k^ -z%f5HXcfNPY;LyOrz4xhBp6vAni}0K!Cq1%!+4AKN@-uKXs!3O^Hi*OTm;>PDO7KEa -zr6od(&e2iCGD;zh37~%(2a5wM1mpmC$0`V%mRz9oN -ztz(lu5MpC!xC#V+)sMgRzpIw7E`P&w-*x6*QV+$q-h0>5mp%XW|93y|i(lL*((e%= -zZ+g?|GiOd~Nq;Z?>A-N40`w5~!-+(1z+*AKJPLn4W>C&kV*hco{^4@*3Ea2g$^wN& -zwv6rw&~Y|R6g7I{U7WW}Xy^drB6I~*Fa`erx81AlH3)dM1`lxKKfe>`?C8AUqn`p9 -z`Oak*pY)<7-}&yh{whCk;RP3+bmB|UyUGR8aWtc|i{nkP?#%m1QD?C((v>(5i$zJA -zw+(~_uw!6z&QU99$VsQap!3e^MzvLyNaM=jHdO>v%CFEfC7yIuN-)9#CFC7JqQ$=c -zB`-L-9PRCQ(1I&3zoyX;8khC!HvZ%XzubG#yq#xF|J#Dj3oiKjTi$X(o~NPt_MGP& -z`H}PAT7J#I;P6}C{@L7tM+sN1`dUV)r -zO7$Myv|vUnUfsY&AvXDVPT<94=Hc8}dI6t27n~Bphn&kZ@&Gw)rNPy#me`&;ay3Z% -zx>v4S^Qz~b_|KjR^iG<*(@xWWeZ#Ms&BjeP|MtqC{TL*Bk9m7O$+sVS%yT+Ax^DUX -z^^ilw2@YvjD&4huKllMQ`E33p;!KCLi#|bnIKBt@@aV81)KH|E%$aLNQEt%#INW+? -zqT>&Lc75+o(t*t-n1e1=ew1q2x)*{j7JXelaK*4CipYI`eBi*N_nkRAFpa9oQzspL -z{GnHV|C&+I0n#||0N?x0&mei-|G))*RXFt9-`sxctKRXWA6*L{Li`z6gxqVdxnKVB -zN2}FJ`IQ%b>f5*7xh#U37#)TLrf~>uR;TR_o7F6nzx;SV$sbBN9(_J*k04UICab)X4Uv$k~Y1z*?}- -z5yIe?9C)0Ib$tQoKz*ayqze6M;fm8O -z{mJ*eA0Qif+aK<^_^UtKuzu6-^JaJdr53@@uDanr|MP;6|JPU7Z`d6ELePPI_L=*= -z?|rr$`eXC!_xF78Bi|s=ui+g#05y|T(E~t23<*F?aX+X5nwJPyi*qy|Y1{y-9g4Dc -zt47_XOz+uAzSCgxW4R=1w9f=YF}QimiGdWC9e#|%**=Ft56&VZS3t)uOHmopw3gZt -zo54$$9C+x{puTz7AxErPyZV8p_wzqjuX*$r*Zl0tt9}SE()@XQK8f<^-bWtsoa=A+ -zX`VO1#>bILl8N>D)@Bnqg19qaybc(TwPjz+X+U5);l#k&DCht^f%$;`uh*T&uER9U -zmanhBS1m1V*5H_my^7}D@qFy}?M3?z#xzTy?n -zKmYu5ySqDDI|D<{dhQ#BM{Qhbi;}je(gx{oRH>_^O@kju>JEY*2!WEsMO9mgtu}ca -z;XQ%_(=QGfd|JD?llTI@L!Zu)&eN -zw3#CjMPpnqg*-)MjTXkUMGc(}Gx?_J;i@zbWvf98Lj -zcI)l8lxPYtT$ny>`pGB0=#?)&4ML+Qe*3z0tIq%E>sGG353;0cB|@?R_wYbJLi|B$ -zQ7a4*q8MHXU{M(oI$#+$IXMRsP;C_Y{<`zAxXL}u5#9HVjek-P -z_)tfC1>k%mwxv0GKa_)y8CiX1EKNxbQreuCBDX0Ld%gX_|2X}emyPXP^$mRTBVYOQ -z=PqR-mZ-XrX(eO!!P}Jho?QuV*VWSjqW_9loUlz_Z0OY2y#LS3)=}64canZc1CpAq -z)OB3Nq4lWZ64U{Unh-<8&!V445sE%M#z?~ik4^2;*fe6j{{;1l=_KxK<{?s|V~6n) -zUfzszFVF)_ap#>F4nZV= -zY`FQu0|O}WmAD9g@J{fam~A$V3K-Iahz=AefJ-br!fUfUMh$xQfyYU{3n_O3u~0|H -zooyR17E-E}{>>?Gr;8-plrjW~muxAE2&0KNTz$***;Du4cV0Qysnx0w3mtaU;*~4b -ztYnC&9>YTIW3f>CE#K&$uXyDNmtX#=0}os5d&y4?BX&$wou1 -zy(ZJ{J>F`&|9@yeeROy -z-*oeDHf`FVia8~jEqq|X1>!V5^*^))}aar&&Od+j@SjDGJtYx+x1Iq}dV -z7sIRnbobIi?^LOTQf^ex^SkV_)7k&=vd@0*y`TWKT4l^ -zH*DD8EA*~xNL#8uW!6p -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 -zl70+$R7Gn8QX%B+YL6}t?_ig2nP -zT&+f$j8l@>#tDo=QUX6cS6a4Lb_=>>^-BRxku*QF?2DuW=sdEVTu9D2m5kVjB7^5% -z5=4qIr@izQ|Gbcgg?sM%$6q~k#6ic5T|K1Kr9b$_aVPG7z)^E9`r4;fu6ktK_jYu2 -zec(NxIqQsfzyVeLHLYz>S{HR{j==&reTLjq@|C> -zjBR%QoruyZiyB{_;xqjXuYO%kJfkv~>Ovm0={$F|RmEr}hgI5Rii{uWj68-f65Ed= -z8&kZLs20AuG4k&ysYP+8@=ip)F~W!lLLd@x`X>ui%-C3wekZIkT8hNx&uiT9DBJrm -z*Gc+7=Rt>6gCV{TYEbs0WqmEeA@&0gez|WzIshE>6O$#8t>n&+rTR2Y;>Sbw-~W*P -z7XMSje!v6##{har!)&!LQ0}kQ6AAa)zN6vZiE06oiH$Js`&5AK^Kl#K{KlHw@ -z@4D-rMifAM+9@4kdgX^yxXi{>9kl5jWg^R^sN>r9jwc)tQY{wC95)R3EP}#)(HWWR -z^Ou(Sa75_o7Z&*(T)euQa7N^Hz_kt#b7D{?OpgM`5&bjfq7Y$IwemGn-$6?rZ^Z_M -z{+QhwIgl!+M(k6>Kc&QmC>|6|z7x%JKz3^>bi$bfyKI-PcEb&+_DEV(*mc%uMltv_ -zfNMcz4^^&~Do;S8{e^mH+1L8}tT*=3VU(I%AV+r0sD;XD^t)bv?$ZPP_Vzcv|GF!0 -zpEYxK8Q~tz9Eid#w_W$)kG=WG<7c1xy2HQq?ax2-@crSvvuEw`(GP#`xyPSsr29*z -zE@DW4 -zszg)GOlV7Tr8f<$uDYYuEq<~QF>Q`oT8^PX*3ccEVJL*o#n(Z|Bty|wbVl3O(P*o- -zZ24oYx=$Q&DGA4daTGYCsYuJikf@9Jn4R_Fmp$*uW1cn$(5aKBz5GS5ZZ;dY-g&e3 -zLnOjqLSv1F?rYYpTDJ1~Ykzs|RloSovWM>J>))8=&B?vf7w&!d{CNj1d-%3Sqn`q3 -zR09%4A|Nv|2Zmv@!$iSZ%4sdOXmRYFrc_ZWl3o|JtKro`jpzujh8&4Tzwh*Skx4Wx -z--herY$_ebqde5Y8sa1%#xH>yLamB?#BKVDS*q_=GJS@Bmh;n?BoUDl^o+5BBV*vS -zCA@Sq)y-Uw9(eS;@BZ>bPx8#(^xJ!0^5TygQ#Xbn4-pzs -z!wIgyg*CaeSn?)j)+$0K92!29{yZWmLrj9MZ5BXi2GwBjVY~iz?PBMlpx6oay-*+O -zmVjI;#PX$t&GQ1fu<8h8Z{ok(-Sxt9q^=4z(qSgS6g%Yu_`>rDX#%nS6*q!IVZVfH -zK{O3V&0Q(NIw3Kl;tKI58K#1hTAFh{uu<3yynme;&UE03bX;KbbU^-86iA-Jz?V7d -z`R%z6lgdqvHx#I@dvr99??oOx0))bS&AO$x-gf2H*L-pHnx%+qNT^K1v8p5UY`CAJD5VlM -z8vdzkT^E2Cq-~CxbRbg$rSy7?5Tv;23h+a@-a^s8pI@+6m0Y{_FM#CP)LicwZjRY| -z%o;r39@ecpV}#_CfD#Pe=4>^7@)m_0l2nZ(^w%^JcaVy -z%bQErq(iCazp`0L(5-A^(|Vh5-}x?>DuE`#W)js>Bzc0)J9FpH -zocq?!wl?+jy+LOD;dg)XN8kSSq6PbM^AoRqV@LhzEdAkj=z+)l{PH{A|MpK#m@t7|fk!yYMDNOnvMl~X -z95G*Cafj52B%JC(WcwLDt94Nq0#ykxHtTJa_Anq)3KezD*1h{WzhhXx_q2DC1w>as -z+pzoqB>x7P%at~qRGyUVlyISo%>RWan`Y(L-16+tB?nIrS -zn~(Ixz2d?w?q|wSqr!SkjW^<`Ii2H^#1$SDZ>9a!~<3wroWI6BvccI -zM~sLphW?ED#KA=ZX+k<1(YO{4xkJ>GL7HnE5&VxT)li9>F?}NC1Nfs1r^DdDHgQN& -zHxn?}@TZMp+;4ILgklard9WeEd1SIw=tCUM0kii&^+;*QXH(7G>BUinMuF38bYyb9 -z-rLrZ^JFj%2R9)h&QqEhNV6PU$T<&`64H&f);_X!-6OsxL(^NH+XwQ2 -zxqGO3bWjor;YJi8W|zu^m{w_olT|3qt&lKQZBC@0kO@HOpW_fWrmWcJGGv;#Qzo1y -z@NM$Gm1fiZI2iEWSHBZ8UCS~p{TP{j@dV&1tVb~>U>5`Lr2r*pK`?TTj=B}!bgP;V -zIjQ#GH_Am8SQ88>fa11Orqf(ypa3~Sqj7E+{yf?KjZItrgCi%&H{`Xr!@XWd2oM}c -zQPp8pw4$&a6mjB<@J}oRX-o4iH0`eOw16%}s0lgh18%j*Fb~$G6(Gb-r5g$kVm)={ -zlv-7%I2dU%0!26Bm62-ViOn$sR`dutZp;|)TyVEC6hz|A1tOGwPK8sMD@dDaTJMW0 -z?UsgMa6+=tu=MDU(=2UpT?mwf7!(UNa31*5(wPo;7e8*hS@mZsZymi2;Kgm;Rj3D> -zRafdxD4}lhN&?4CH|j=;$-sg}lhZp>>i+oM(Nv+A+*g<7-iHC2@dEUjm5Q3bmuia+ -zMAiY9M==O;j$;5=#enmWM5c;jZ7Y;bRr8Ewo!dS%@J@ -zxIZQs9JQ-#5t^_QiNJ7r??Mo3OLJwy1l&b!_=FN4hR!-h|=cK9#oo8qfhG&1VIUVMHCdOBE1GLJLCbTpP -z_nQC2ydeZt2$gyroRe!I53iqizucENp;JVMAtzs0ck@GL-d -zj+^F@i}mW!S)R;r@fiowJ=LmZchkVp&SgG>{)l}D#^K{n{Pdxd`kt3eW1 -z<9Zu*!4v_W5&A}mK_3F)i;AXoQk)d0d -zI_Y2H4hv2oYdQ>jz}RCHgdtFtVy_@Y(MRxfnh~`MtAW)azxFwXC)eZJ7gwv%wyjnh -zn>4?#MdCvNgG+g;un4voLMSN6r0Nw|fY}wW(79$d;s(73AUh$0u->kRgW|4=$HFDv{A*UKp!+^Hn|BA7c9?ruq-nsFkZImtY+p%q@6woO8#jptThCSmW#cXcH~< -zeb_AIL{rZ;m2G=WsLzN2a|}gsWJs~LBUvfiPEL81?*2gJlZM<>CgrxC39+%7K -zuto9}JL*z8?<|c^j_(lR+B7=jak1Rq3NU&c9Z;Y8oi0BwCDS(V^ -zkO34ENGhTW&>r4ryBVw0x`rOr&P#j%_F<{KoF4dqN(YQa5c=XXbqJ!gO37`WrFNTk0mNOmLXgho3gi;7HKAMSUxckc& -z-1$)3lwt`LCW);tiP~VH3x?H!f&1H|J>$C6Ydq#zn>xs$E0TsI6M;6IN(sh(IJbBTWtTs1iWsge$M|3+OoJ -zm(ep7eis%R{DG>}BVEN@Ln@mz{)e0!27A47+)A2jZP58mTtU^oGd`G~BkpD{^R*!>1jw`=N-% -zr0_~+Ts%;YF>}`1Pzx>a$RSat7YS9e^1xF1KmG-Yp0KwbeV}u&IiMs8g1;{Ee7zA{ -z8^RrwSMNzIOiq;q8nXiGRb#}@m3|I;VkEk75nN_^E4R9gPaf!xB++NkzoQi*Y%s~U -z1aIXsSaiguyE^JQIbt5WEra0Zx@A -zHXAs3t)MLoehA_3hh8Xp!M7bY=Ma>U#I!5|^R-hC9`mIkjs$fPetNDH8Ok&?q7y1b -z;GiHfpRlJIUD`R^94-i2D5POBQwqFD(7m-r$ySlK<&iA&qNR?CE{mhKv7$~eO?4tB -zfe_>oue`R}XJy8lf9VRikW}zA0GWUG0J#7ew5R=H^ad%0>tC03^n$?UTHd6%z`}qJ -zCIDb>kY~j%*`l_{kGYt*FghdYsRbRl4|E`|6LQbUbRepMB8f+7j!=>fZI?k>5YmB& -zT>;wu3jH)D4WYM?KJYPejr1lx1MzSk=Y*D`iZSL*yfu>n=89qF;aH?RrdNvhrLJvE -zqR(kpWTQkUh{m$6NvQX@Ksp$P{b*V37=DpAY}JZMZq=NhOTu7cw55W~6n7=pD`T%KpxB -zAMpW4M_NKA-tHLX7B#+7DSe14ih0h+$RnK@%bH22h}f?*1gSo$N9W(50_=$x`dJUmZ@S>p(;LGp;3|9g{9Oyv9*L;j`_CgMkMay*=1(aSCFJh>}M%86>`DG^z5OAmeofaO(EsNN8)ef -zpxm&|QMW^x5CX9RkUo(^RooCLYemfU&D*bVPKX+AYqkbCKdmTFD7%=qG^9tT+tKftAU5AjnUML -z3AzF?|Ga@$QxF|;0DFdaN$pa4x|z?0a{+aV$p;-+r@AKK6?UHbNcqkeSAmQwEWOQ(a)$H4Qc;oi)tEAu -zF>UnIyyrU-hagUaHAD_5RARruG*b8plcPy}r~@h6 -zemuK0f5^U;rYZzpD8wx}{6Nx}klE -zvFN6$;*pD?P8F+P7=Qw?(3IZwI+{T?hb$>600|&Z{230@rRkeH!8d3bNiqel0Yad8 -zhlbX!BMtnrD}G~2G-+$p -z-!!SAPAs!$D2jGyni@^J;pwADM42B|#2eMH&(4lkJOCoi6@krFTo)Y(tpNUtMvuh< -z%a;x%QBw?*m{L7bml+($gKmU;VB%_HW>ON2%^ehd8Ut{}q?e=taH?{Qmbm0gL7~j!|xw36+LOL>swwK9m#p} -zD@VsAoT1##(K3XkHM}0!LkvbBqo+Jj3JApvNA>Y_C;A5chvM=3$Xp(P<+D!6&V9)&7{3bKc%LIV6r#N?`T-{>hL8X-ppauN?+s*f-bq8ZXa(@ROKBOJ -z@y0$U9q3{|5L|>W3MpIIcvT{g@SXA&5RUfxP%aR`%lZcH?n)P#9uD6*1Y$;0l6b}b -z0hNQJNpb?juTPhOU#5B6t|S8#DvCb=PtdC;_36IUG}w9=ImZ<9V1TJ5JBx`sxLlXk -zG-JoDw1^ZyUTH&l2g&Cnl@ApSU==o2s20?NE^&)V!OXXZ1!!Di^(lr`E#?Eg6ILp< -z3tnYwkRd`U;3m(|)LVLnMkV<#B+NlL{t69}Iw_33fcd_>NQDfNI&x#r_aJGOM855+{eD(r?UbMsMupm)LwWo9$owP5?ar6#?E3-t9o9VhZdN5)N^WSJ5FGF0rRzX~nPq5|n^39*SLj8B>~G -z(Y7>diBs{3nLO8RS)rQ4Y*LKxv+JN~Ufg}J-%}%LU)7P+MYnLa`(O!|RDupvDm0cL -zhF@YKT5Tk2OwoFyh_JCwi#~uZPyIUYB5cvg0*~9bQFMT>kIhS~5u8%C)Y&hSD>_wx -z>&jbFd@~_z_v|13V|Qb}Xp-L$Xn8iDm-%RNs?;^}q}Q6=q4qjXFDp)-ZaI+@|4-JF -zwt^psm|)+RqZ!yGTaTs6K>ZabpkYf@AaaS)YoYIJ{OlilHQYj&sBEZ&8!dqb`3yz6 -zr7X$h&`sy -z;XsT#7D>#S% -z*z<$UGRUAy4P8QQ_is{N-F_)^NQG4ygXvvIsUcuW9E<^#6fSS@A=rNyzO$#XubyCx -z3c-)~IS)kPK}(;TaSo;fTA${lY_ZtTC{=nJ`T^Aou~1VrLRkh+j|r~BqYHdxCiqm6 -zW6RMiZ&r}Nh9U11^Pmo}A82LB(WQ!Kuoc>sroF6(4VN(8Qco_8Ie^XCvNfMFag&O6 -z7S>mCMZ|!{16gvaSi-Cydz2*j(A^JWaV#w=b%8X3%%66V#4pzKrwQQ4qY8x<#ZS!# -zUtv5-)aR>4`A!>+V#2A>Q|777D@h0FWDDrc1Ftv*b43QCeJRs~`3o0n2dc!mA<>S- -zMXio%qs0zZ5i!PsNeEO(yvO>hfLIOsP=dY{eJ=0=n^jjAwRuWL%#||%-xcPoXS{F+ -zGdNi8+jrLe-6&f)MyX*ac|?}xj46FfKBunIqQw&-)Y -z!T^uW2SUlfg*l$qL59e1cB?jTZcOgpqOdlKDwYfC+;D87r0#*46663nEC@ga*zF+e -z+oyC+S%DcLP2WDJs#Ky{HW_Gv&w5<8R$*#BWPBx>9OqmBSy&fP=Th>SI#+F4=^!5n -zxha+6xPW7WlL-~40!70W9;qZ6Uo2o3o(uRLX_6=(sL-|2E@0#Q5=d5zyaWXDK({bZ -z;%sp&7tIzyJp6R)Ce#70jh6eqCKNTi1>>FozpL={xlb*;*LSUrWYmGdeci+&2qdyC -zOT5zp1|sVwYGB%9MP2!Mk#nVrBLfSS -z^q&Gn0C8owA`{>OLC^t-^1>1qRqCOa(%d4)bY-s5QdhlP9io20rp+T0ItHztstse{ -zs1c?F3oSE{ApI^ZBEe~a=%C#eGefABq)C@1A&n3~;2+I8P_Ta%g%|G`gum7o{)q3% -z_#T4}LhsoS7 -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 -zxWIY9~#YE?OVtmcYQ3vriFv8R@2 -zFvT;dGh=*a<2RCw2zGCNUL4#XethywCxT%LihAGcli*~S4d`V?`l+PaLCXp4Wg!n^ -zQq#v1_XRT~o>}Y>MUAv!JUKzvXw06wN?2thoG&Tr`+>uo%AL-0vCKG<&k%InA&-qL&h!&u -zfw8?@{_FbbpZTGi(+Fcr--5^k$Uy&5nGw@Vsn?lY_TqNdUQ?SWE9sa8{hVqczWob8rdeYe4go6IRdvGb`bIl&$dO3)T?_nSzpn!n~czl -z-3kYhWi~(T0Uti%vy-V7@`(;XR&5w{f`z_c+X-8mTEzTkmu~k|s5;_Vap^7WT~Dv* -zN-g9a9P*sZg*ev(cyStBiFa^t!+PR``a^#r;@hP~+(f~=;0(yJ?rDXol3xAm=E*y@XJPoM-9^LP!RD#as=BXUE?|^q}It -zgsHyL!&jo70mlMyV>~%&JuzCGDdR1=P7hS7FF{H;QWLoPr(1goUIIakx^~M71nuAGPF~zv(096? -zlFjZj>ow-9DOoL2-d@1%hK*t(d&UTif@RGK4M!M -zfu^Jxh7y$}<~pdM1r&^4HIKA}MkF*i(G~DV5d-AY3$4g@wnu8G{0QVsUo>!QjMG2U -z#n%~Gf%PU3@2lt`=PN%;KGQtLEjUUlr>jNjvj^WL11{hHrOp_tXNQ3E`>UD-?XPSC -zG>LX(4{SSJOT~rSBQJ{ih${<8Bosg5%G@d0Y%AVL>msPCocx{C8QIY>oV=8NAnZO& -z6T^8xW=jLAPjJlu>iQv&19O@HOh -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 -z=B0)S^5bg!~_^vg< -zQM7V^2(oObu9s+eAdjB)!PYjRP^U&nd?Cah_dqvi#kA6^d6ZT+IQ?J9FF_XD7ZF}| -zXpgJq(C(`_&ZV4OdO -zygJ9XN0N#2sth%jMW5f1z3nN8hAgN0-&&D?1o0$g_b#g43+YfO3fM5Pv -zY91&)3Eo;UxQogswqA2*$TMru=I|x9p4jpLV((duA6oO!`GzG<5$br0xoZ_`EwqAz -zJ=G5kVb)m>(dY*~ag%a?oK#{BDhDT+jvng3)v55?b*>^_k -zlSiWqD{rDLp(Sw;Vz@DUwC3LY%~uOaawt7=I$K-jA`9EQFvY;D -zy|W`eiuH#S+j{L9RyRvs9>Z4jQ{J;BGiLI}T2C -+ -+ Grab Album Thumbs from fanart.tv -+ Grab Album Thumbs from Last.fm -+ Get Album Review from -+ Preferred Language -+ Get Album Rating from -+ Get Album Styles from -+ Get Album Moods from -+ Get Album Themes from -+ Grab Album Thumbs from allmusic.com -+ Artwork -+ -diff --git a/addons/metadata.album.universal/resources/settings.xml b/addons/metadata.album.universal/resources/settings.xml -new file mode 100644 -index 0000000..8b2a8a9 ---- /dev/null -+++ b/addons/metadata.album.universal/resources/settings.xml -@@ -0,0 +1,20 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/addons/metadata.artists.universal/addon.xml b/addons/metadata.artists.universal/addon.xml -new file mode 100644 -index 0000000..2d94544 ---- /dev/null -+++ b/addons/metadata.artists.universal/addon.xml -@@ -0,0 +1,24 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Universal Scraper for Artists -+ This scraper collects information from the following supported sites: MusicBrainz, last.fm, and allmusic.com, while grabs artwork from: fanart.tv, htbackdrops.com, last.fm and allmusic.com. It can be set field by field that from which site you want that specific information. -+ -+The initial search is always done on MusicBrainz. In case allmusic link is not added on the MusicBrainz site fields from allmusic.com cannot be fetched (very easy to add those missing links though). -+ all -+ -+ -diff --git a/addons/metadata.artists.universal/artistuniversal.xml b/addons/metadata.artists.universal/artistuniversal.xml -new file mode 100644 -index 0000000..ec474e1 ---- /dev/null -+++ b/addons/metadata.artists.universal/artistuniversal.xml -@@ -0,0 +1,146 @@ -+ -+ -+ -+ -+ http://musicbrainz.org/artist/(.+) -+ -+ -+ -+ -+ -+ (.+) -+ -+ -+ (.+)(?:Ft%2e|Feat%2e|Ft.|Feat.|%20and%20) -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ artist ext:score="[^"]*"(?:\stype="[^"]*")* id="([^"]*)"><name>([^<]*)</name>(<sort-name>[^<]*</sort-name>)?(<gender>[^<]*</gender>)?(<country>[^<]*</country>)?(<disambiguation>([^<]*))? -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -+ <artist(?:\stype="[^"]*")* id="([^"]*)"><name>([^<]*) -+ -+ -+ -+ ><relation type="allmusic"><target>http://(www.)?allmusic.com/artist/([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ (.+) -+ -+ -+ ^$ -+ -+ -+ MusicBrainz -+ -+ -+ MusicBrainz -+ -+ -+ last.fm -+ -+ -+ last.fm -+ -+ -+ last.fm -+ -+ -+ last.fm -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ allmusic.com -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ last.fm -+ -+ -+ last.fm -+ -+ -+ MusicBrainz -+ -+ -+ last.fm -+ -+ -+ last.fm -+ -+ -+ MusicBrainz -+ -+ -+ -+ -+ -+ -diff --git a/addons/metadata.artists.universal/changelog.txt b/addons/metadata.artists.universal/changelog.txt -new file mode 100644 -index 0000000..961ee0b ---- /dev/null -+++ b/addons/metadata.artists.universal/changelog.txt -@@ -0,0 +1,37 @@ -+[B]2.0.6[/B] -+Fixed: accommodate new Frodo style URL encoding -+ -+[B]2.0.5[/B] -+Removed: '&' sign from artist splitter -+ -+[B]2.0.4[/B] -+Improved: further improve search results for artists with almost no data -+ -+[B]2.0.3[/B] -+Improved: search results are now return artists with almost no data -+ -+[B]2.0.2[/B] -+Fixed: artists won't find with 'and' in their name -+ -+[B]2.0.1[/B] -+Fixed: potential crashes due to infinite loop -+ -+[B]2.0.0[/B] -+Added: Fallback per field -+Added: scraping in case of multiple artists (feat., ft., &, and) -+Added: other improvements -+ -+[B]1.2.1[/B] -+Added: Enable all source for artwork by default -+ -+[B]1.2.0[/B] -+Added: extra options for Artist Biography -+ -+[B]1.1.1[/B] -+Added: handling of new format of allmusic link -+ -+[B]1.1.0[/B] -+Added: language setting for last.fm artist biography -+ -+[B]1.0.0[/B] -+Initial version -\ No newline at end of file -diff --git a/addons/metadata.artists.universal/icon.png b/addons/metadata.artists.universal/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..7c3d600dfc876fdcb621927efe52d4f2e2fcd5ff -GIT binary patch -literal 59634 -zcmbTcRa9L;vo5-DcL)v(cejPREZjY~6Wrb1-Cctd+#y(SCuneYmmoL)K6{^gAI>-r -zcfPdD`l_m{t43QzDJx2&AQB(~000!QjD#ux0P(L10f2}6S1h0lv;8aZT_v?$)f_Bb -zJ&c{r0itFOCgwn}ow234s=2Y5m(!TJ0001GVXdz1s;wZ;XX;?bZ2TV@W=}iEe`o+e -zK-kmK*wohC6=-5^X>Bh^e$~}S4zxBCB-i3nU{!DwH@C8u@pd*>^Hx+h^|m$TH6s@m -z0t$HY{bOKf?rIG5wEJf7!sjVS{$G6g{?-4}%|Z_RFA`TlmM1hTWTv9hqSv#|0ov9a=T@$j*-0ss3W|0m7a%z{rHivnouh)n|7L9O^52H~XEGK~V@DP?W>ywEyZ?;q -zzo=bYRn7ljHU5v(F6v&6<}9k_E)H(arvK){g5rO`|7`bv7xW*(f7mXZVqE{j -zfmDK;0P2~<6>q5YFXQxIe57IXL|nEXeG>@ -zt=-Mdq?{e>fd6G*KI{L3d{!}0E(uXK9u9F)kR%%$n<%d+m#7pkFNZk0D61r^IQf5L -z&Hn$`jOCv)EdOzi|Bti$PuD*W{7?0NyZ*n%{|+8=`+pJR{4X@FycbpgfCF-{gs8gb -z+IbH`gWakQ$>XQ(h0Ao_m7j}8-*1AXPQ$ix%>+owP!Xe1SPBGIiJ!2TSe4jhB!RNK -zrK+e0^lDMxqp>RJp%HPNCXpe!luf=>ia^&wNd8C)U6iTsTH5p3eE&l{-TY+0a8|Ia -z`*))vQ?wboU0SJaM(_#w@A>=8=Tm_2$5N9a+&0hzTEY>dzv5H$mFsTyavOS&Z0Rwd@XO&KPiY2$t@H?VG{3d4gt~bS -zZ!aK?cFpm%GbO*6bX(s$sT)mD{4?i+;KXVn!kbjAfW)H?;Za`5)7zv}T!Hkoj^x!G -z*C%qWBQc&w5bi|z)s;Q>Y~jhxNcdzR{&IAgKNOX<$58t7xX@cj?>_22Qu+fEf}3aK -zkNvmA_yK;I2nmPS**0J7lNbqUv~next7U$^a1m+TPFLXl@7|JvH!W{nnJp?}hr&CI -zzqns`wt4DA*6%W6fLejQM4u%LV44Jf@~z*7C-Sp~rvAOT%Yc{i3d9XB#~j~RC_$B8 -z+gI3M4k!E8Co)i*MF9gJLkSZUFP-BB==YBEGc72dV+=GX-zrix#`d+wGNyR~o?eL= -z(FDO^L)#}Uc5|kt5SDRZ8a?UGFqN94{g^-QCQ2c(eO=ml -zg+64uuh~*@9pqO<`zTgXhnbj3B)JD`0GcZ2q_5rLo%3EMAwIM1FUZT!IvbO)vkMXx -znLe`uuF0g$tdm_LoZTN%4jNv1^*I|UgZ|(ztRfnla%OGz!X|9VY(Xq?XYG@x+QuK4 -z}y!-!kjbYuD -zhBTaX{W*jVT!H)Ez_+B7LAvO&Fyv~NOkJKKmEP{!ejjvszRL0b_Hrh@gn*Zi`I$Y% -z57w42c;K86ZY`(1J@3DSX`Makbk!QjleLT(R+;V|=Qos9g~3!-!UT_pnssPA5EOiK -zF&hS`plOI64MCM!CeW;Kw(En0h-jvz#q1zF(~SVyEG-W2pt8}J4cL)LgYmxAFe -zm||FY`O>>iQ4=j4=N9P7Y{ibgs6z}PkC*+TR=kRA*+1KAHGAgaX-XW^p|pgezXw*# -z1bI?7#@PgE8jqf^#{n`+z}oHB&I>Y+CVM6@9&qx86Qo~4??d%lf5@xC0X~52{V--VtPyH -zkpx$p;FJ$y-PLzBbHn6c!@-v?&l(gfbrn#X+AdAz(W*94C6z41ny#yFP%%QP4U}`5 -z>Hg^J4w&_i8Z1bg)_UiBD=Pr5yZ#&GVe5NaRWuq0_)N*z1k}l;!X74zBVfeXXv=DB -z1&d*bG};hvWvK+m9n`vm0alY+<%Mw#45e^b?Yy?NC{xobPW+C= -zfw1YkJd))^WP_LE2~^%R9Uf?>_?UsIpP4ea#1k7-YItsetoSC3L@&&C(w~K7?9cTA -zp^x!N8BxF4j-{ZrLgVw{T?(bhl%Ol$ghBu>`S_;>D$#_jg|3+5)^{3$cGhx%L{(o( -zwK^bf)wtm>^7faTl?;dzM4T{};K=(_6{}rLmUtgHB^>d)rmr*_MQqs+<)^X)@A!+0 -zyUp!pL|eHa -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 -zbO5vz`A|p_u)+qLT1o%VU5j@+0^OU -z;HB_A{8y3`E*ieVmizw36r%EUJYKKDZ0j*SX9m9PjM?c_(kSLRor6}7SJU~RL7`!> -zMQHf^6eA8=;DvV*szV_#O2g%VCWZiq-iP5k^x2|GbePx{mn!c3rAfmji?oERFZPj@ -z&=naEeW`DxDz(W*?9wT@?sVrF_oLxb3hF%rCaKn60E2d+ab&TFepm{JACTCpU+MWr -z1SWh3J&*Q@W!k9_a-vxF?{<16FyCwwYVHpQTsZ$R)nFB5qPUQBK}u5KPOQzd%T`)| -zEAifc6KSC45Bv!EDx -z&B{fJJ>iq@a3v>M} -zphOm0++b`D+>oet3xZO-d1)+>q-bl$a>+5Y4Nte20)y1fS+;F)gvrfo7KT;F$te{& -zzvGx!x+AE)sy)5odql}vyFUJKq$rWeE16vrf1t(4&*mj<%(70I-a|&+C&{VaBB1;{NKTEAr=EiMJt8W#otm# -z@Q7(HA8D>mB(yVR234VD19fxUJdEi=1LCFnK53o6c*+5Tk!o55S>j05zcmLN|bbLi-`Tr^AGlIvY^aX!Q~1p5!!Shg9)8dZW%LrcIY=7&*H<1C{5 -zv5P2K70{kbDXv=SjES_e$eE!(q7yg0X=U$^OpkP#^T|48hcGB`p`yLg0!8W!bCxm? -z`bY9}I^~L^VGDtjIJVl?q8AV$8l;ttwt}HD1t+J~e)^lB6%Nrk -z`0U2%kx@~xDZ{mc>l=*EU8Jh!4^@j3XxpfTX7-~lSPX^Eo!`H|&#~ndS%0^YQBSnC -z->2=zL~#jWu1MLyO4Mwuhp-Ud95@&Ilb!hoC5w$ZL41&}|*HX|=_lfdy -zIdEt^H{mfbWJv0vJ`4PV`MiOvHprqBQ}eS@187}fe&3QBOR%EA=ja8I&|Id}tqMCl -zQv~3#jjR1g+hQFS^RMA+Pz5ldLcoc`RA0qb_n#2tWxw?Y?L#d?aq}z%Y6MZ@EYrdx -zVvAHI0BcE6_BxIOW@_sxUPxZV16dUGO27kMorXlItOg>0bdGC_D>a1^W?71NDup{N= -zzf7dR^=Df^a@H@)Q7sY}e_ONWrh-?W*J{8$Qt!v@Ez9XsN#$p4@ -zex{1RE&9I#MgcDlax40V`s&K^1urbl*XQ -zbMxF-IW}_rrt=Uo{zlD*ASg|U17L((Qa@UJd~(Pa0(4~2KU0L{@F1mY#nIkpsy`M8 -zjsig#2SchK8I(dw-w@~31QQ^yZawHC^VqqwNRw=w`(54r#^DT(8-KF}8i5^0(ht}M -zkQ13BYgHYIe&tF?sEiVnHGC7iCT87m(~8P^b5>=2sgUpoX1_Dk8bMy(TwCg -z-3-V7H^Z_NYG*}ca@;ePpE^K8nKLkEq)Ne}QJJG|(hDYmLFe0&Q#IBla#kIUfeS_y -z^#wg~VwFlPa>N(wX7pdX7z%)PtKE}+-oa##vf?R12fw`1K39PfY*_xxsMRMoS)eJo -zL9$%p5Ac34JT7SqCc&IH_v)@DMTc2;eBJKyOL>+^+!c??vX%-ydulwyzH+{Um1xFd -z7_K<4h)2byp0!^?%IGwY -zaM0n7=kyr^=>ak2V)q|Rzoj~uhl0?~y7otzn=2cj5>b -z8Gk?uDoC8k7(&c;H>T_y%RJt|M3w7QHB2Mv>p)B*tiq>qD*)Tl&Tai2wLiA6c8@vI> -zx&Arb!rAYA^xHj8;~VP5iHtYoTkeIInl*H9Dg_+4YK5+mkSFPS11 -zLOv{uk%oC+2$|G%5qKh2QQzaaqHXc8!EpHa=xDW$4SoMjdE(%I|U>GoxCfl!x -zbl9aBnh@MToc)l)(K`UQ6@&=MP`n8?O5uh8faPQ1%^Lh3dXMq5I8=1VwK+8u4t~*+ -zocPaY9|xbFF}MUF$heozq!_gj^&b~-514bEb-_$7`XnaJ3AQWk#mFeqNQrp%v-_9{ -zzSBDzE1-}mP*-uVrdw{H#rhS>4;CiNyv!t5%^QrlSqDT9#ZR4_e$RQLDS5(Ly$C8q -zv9p+%d^vc`RfJ3fl@;+B1TQnWZIN8j^V%2Np`(V>iK%`u!cwTScMwh9D?LK170`K= -z^O0K$+5C@Qe%4#y8BI8@YNj&ZnW$YKaq9HV*-(R3u-iCi&~he2x)|UG>IPd(fz3iA -z=@kkZAHLhe;j_N4MveYJn~D&ts<84JGCmEC=3Qu-=-+ev{W1Kc?25z`(v>YGf1tTt -zGL$FE`*$}M4`sqZZbINayh;x`n1Ug&_?JMoKi~{7jV%Nma2=xks$5|nc~7R0uP|Au -zL%`g`tDAMsC5>S^EkXB1)*p}^rRhhB}LEn_eX25?!?Hf4m@z*(Z0Dun}XwHto9?v)scm0c{iZ?XxYO?nhZ7HVfh -zmCXr+Q*3_~|jH_d% -zRo(}JD?;5aUq~>7udk{gi3dZ;QB_xP{$O}1GVrlB((RBjmzs4p=H@`e3?-J4j|8=r -z;CU+9xWxA8ii4Uz9M{B}-7dde7zY`DSPdrlkRYaQNRnf~@>U4u -z5-l7F4g#m_%Tr%&|H7oNtAkY$Bb=BtJp$q(ejoGB_$v6|BVY&*LOFUlC# -zph`bHS(Rk2xMYpyfp#T;Sa6EBt*Q~E`O}+7q^ee2T_9pmwA;W|&d16hNU~5&-;IC& -za~IgwOIHH+CtH$2+u1mQ+2tF3&8J13glhQ4pKp=;OqPIn%vswvgDt{0So}q_(rpBu -zETa4opW%z+^ni81C*tKl%@|x8iw->ERRAX^m5$cY4_XRdE#BY -z+!hn1dsCD1B_cu>8i8q_cZmv7UWLdw`}rkSVS`^+ggRZ81FCAz#PBAFV#5U=0_F6X -zP*5a-?mN&Pmq<3xZ3^____D8{R=?ww!mP$wawo+{BsOwt!7*ncYh1B=C7gDjoykYkrQ%V&_C!(q~Iz7iI(u~5#bpkpG3%);0bY6-fxjkM2&d^bl>cf4Jz -zN)b2FM~`X$QIR+z`x*3Awy*}j$a)AtMj3mb;qJ!1M(MFD-)cv*^K-t+2{tCNh6inY -zaWJJrFcv2xho>Ux4d6~Vh9>eWMUov{f(Y~#4Nu~>AoC*?1>@yJEUA`^)SlE_ylj?C -zM7&cFyNc6F&U1V0FiC;?%8#nBmj -z(P6u*YJ#08MG-(TdcydmY$ZNHWFlu}8Q0mq8_hd_Y;!pgy1{(dJ^Tv!~P`}%QC4A -z0nEhB7C(g#xBN;FKk5m3Aios-_ZUlw;0=$-;Fx~WvNPnyX2)^^ou8VVMk(g`gOjGb -zug1=vs5~a|_6PE#KE5v|5iOBr9OemH8386kZ>>C6`!~zF^-OtJi(eVV74gYzDMSSB -z@GkE(>mLGNsZ3Q)uphmC!MYE)7WRRmJi`tUjWk5Gl3eCYO6hTQ6~_>)7+sMm1c6sS -zZE8NWz5TGhwH}M)m=s-Ze8--uMWWs^!eEDBSRsvA6WTAN1&>4FZqcS=av;h;VMJxF -zj+AkJ!`@@;BB?MForVvKos%^|M)8C;v}B!xA627qf^~J|$sfLG0v&ppSO%&eA&#aO -z9bzLX*?WGdP8lt#n4TIPagEM4}DlYC(c7T7YdKDf~|_I$*6-J*XdKI&kvUR -zEd5=~7^yZ=v0*o1HX_qhv0r$X@7u3$pvb1i@RB6C#>8Wd#2*d)R^2delYYerff&Ou -zsfo$8)fEQVkuOiVDc&q)xc6%H+pECxN+GGBi6++4fCrArv1(i@@~wCyC$Epxf;3>n?>rt -z(&$Vs^{PuWgHE)w?*?>?vZi>k^`d58yN;nw>85_a0HE)KWD|&AW<%Xr;8;&$6{5bt -zf5%sBz4yL_vQ+(v?VJHhfRV#*Znz9Crh$ed`#}=t6d4R}xFVLPNoZ_G^qcy_h<-th -z2$xSyMfntDjS%vaRHOo#s{N7MT{2rF0EKTsMcxs$k!%@AKYV%V-bD8j -z)H%o%iO|p=fv9JP7hiXzzLI}FMKYZ(y<#8#UD(LgiJRH9T?iRt;=INS_PtnDB`zEg -zEpKZe(%9ARY&K+{n2cJ=s~OjTQwZ&kT55TKs4BFbf*Pyk2P2j9ri)OgSs5B% -zMjjR_;(UpUiuN>^t8({b*ey-rWX;3tKnF42z+yRASP}~sSgw4> -zu?TasoP}-+D$B*g6U9L&Q(n+ov2JRi3R1+4|96MP%ae`gk_aOv0J2zhWR&>^@m0^> -zj%vPGSXRE2$#NXd#ChPa^f=f|Sy_{EYbd%CkbRXelQ?#10a8g2rko{?FHra^QQX?aP3M=tri;4h5rVEA -zkY^-!Erm5mMtI-tkDvq#t -z$+E(SQJ(45L|zphbxYD{t}}Bi)GknJlr9$^saC0M~e5OqZ(F&!4!QOuo`N -zPl|C1dmB4=5N_y-a+te2#1Fhf;a(ZnDHKHb@rFd>myllcGav%t_Krt;3#2$+5_!i( -z|9+R{#E8RH9GC$-YT;^iopOH@@#ON&HzDIO*sJWdmWNUqrJlG)UZz#K(nl$pi28x< -z3}y#%*b|z{G|oO)Q*SP0C&Z2U(0K<-I5BGl6{d=E*ri)yT2CV;7oO1L9d)Yt&=Hh% -zGcNF(n;w5-iBWW4*&~0a%+7^wGRwGu`rbHFDRb`S6L@!Fp%6(JHCowbp%0$~MV2#$ -zLV0j9Ae3Gs-tX3P!#2hb_lT^|w0`Lkf9Xr+kJ;p1Hw&yCd2MX|I3>3x-bEwB9rC*( -z#7kg^1~G0(F!)}%onVCvc+?%XRB|%C1g#F-`E>dG+E~WNqwy6r6XZpJ)f)t+^d=rv -zfnM#{E8x>NagUc(6_MXnCd)`_&&zSSy!P}06v|mGlC%% -z(;ejqWi&>^K>YAY#^SJmHr;hIyC`|??B5U=53cjCaR~AR?Lv2|qRmnGWie{0(1U+P -zf=S2tqB~Ztl-6nHzJ>i>v49xr=_6OEfI8zuA&5;y`nJ -znjH?$!{Jzs#adnjK^ -zX7vddMe&NiU9)5p6kCdocziJV0;n1V!O!l~yDK9u;g7|O} -z4Q}|wN~~Td_yI1l0TYD3gQNyA5@fQCjECEkL8+~`Mz?H3fZrBbnt}XqUkWRc{nI|k -zJ=$qS^oi;xX!u`BL}0_;11IAo&!jyoO+#pvUH<`?VIe}dc#UVOTOxWd=;$z`){EZ~ -z8@$~+JSQRSw2wrmiTrF_6deiNtL1&S5E2v#tfm;d+~<>qEnA-uB0PBcI{5x9HC;|z -zrqdX2^cW`juz8qWqn-lCT^-Sp(}5R!HUtraLsrlB-ttblbr6{~nPrWk}=ih&!kj4~w0i20&PB66}>+>Vx$xV&EgSsemj%92|aFG5~NaO)>!6$QbqPDdekGmCp -zyGqImE^dkQk;5@@7|GWtzS3ZuPf4+sPT!ubUW3PQz&wK)7Spqr&t8jIc_4askw{$( -z9O_I+7GH4h%MYo+qq;vLu|DVgm^;-;eu!^^c1CJIS&z{oq9iWtR3>89ix!`@TtHlM -zs-aK2(MIY}O?#1dGa4?o%q~1pWe<@)|)4 -z?Ob;s7^csZP`I$_QfGs#b}trs*s+)M7D)QyU#@0pmR%{jZ|4y<)5PAiiziD?d@xdIjYbt -z^yH0a5K}6c(GYAT_I-y+;N)lW1Sb73Da%Duza}XpRE3XfvK8dg-ZZzuZ4&B!UR=*~ -zl4Oc=l0SmaBHA^DUuCF)|H0GP8Yb-*K1yQk!Mcjd@E!@wn_n{({9o&X5;MKrkth$q -z_da1}DWo!_>$jE<-6`zOYqJAi?3oR{SH99UDhtl(XnCJ82UVX6H%eiN=6_|r{dbog -zN${8sMYLxcO6Im9I}0Dm -zoavt?#3flFjbZv-ddtbd;-887Z%uUGk})3(^~JD)TUuO^ -zA%CSO#B=R-2!w^>3DwxuiWM-VvDyVlccVEPatex?YXbS -zB?d^kmQ=it}89>CeKVieKiDHT(w+Po0% -z@H_n?Qp;LSwCzt9C>!9hFV#xOWD!jgGfn5BF-QkAo^%z-HA|=z28@`b+$?29Ld1R- -zSgYv?71wypp`(iJ+9M!%%MBaDv-U}Lcg}+lC>1>5u#?EAJXD$;Cc+76cEQ&$ -zRy4JRw59O1zr;BzaU=PaMygTxad)Q(ETRUH&4E_FV`U -zS#2r##C}C4GKtg0e6DMm55kC9G~q%~g;~j7|-h -z{p!hr1*$GaoCM6zL#E&63rZ-st?2q4j~Q(O3bz7G?(XftD`1G;`$stJ&)DU4cKv3t -z5d9(ncbpfcRTDEcUH_@Bq&;n!b;vo3c?z?0C^Uq2OjI2Gyw}hTzQ{zn>3`?IukEE! -zmeU<$p%6vd)agjL=+|Gq6?pg--due#!?^kNT&_HTZ(fgHLPOlnEk3weLOt+<3S8rl -z8vV`7z{m$JE=5R0r$qszWZ^GTK1K27 -ze`syG^K7VyR9wIA=~*&UH{~U7|8+gdyKtJ1&$O@lCI0~*-OHHcT|1*;h3lBR%W!T< -z{?1NRlY+ZO-1J>$KaOzVi+NEecFx(Cc|>tNXj}Qx?Y*puoqJw=!wlvYwFW4o@{RF3 -zLEQ(-^{v_cuAhhOG#Q|XV9;*CI-&jUUJDFEk%+`XBbzAaX_Y{nV=7m+oXCJL%uzn& -zYbvGV0J&_b;_e^gt@*i{xE)8t378nq3SqiKYXvI4zoUK0+wL}p{4Pj#^~GCRmR1+j -z-TbGPgic~of`Ti$jFc9=IB5N?eNFte$C$$Nx58kweFQ%VRpjxs6hAP&TDSR};8@cv -zj=qMaScHsUJ3b?J^)xf`(XagsRotH%k07FA@w2r`LS~RlTCe0_T8t*+!b$hX%Io(S -zFa(LR0KnUl|C%1yhsy{xzMa9L>H25Hgea<<;WimzM{2LT5xM;|5~04b$vX!BL%yE8 -zqew!*s-atXr$|RB+p=J!6e`6DBAR=O_AZh>uhZ!`{!Jzuc6Xq=!YxCP1Jzh@Ak1fi -z0cmp?`Zr;F=dXT(<{cvvM3*0+LA6&x-W$n0tXXziEJ9f7WooY|qN$Y9*3dVDX)9(^ -zKQUgXb(@;4#`~D1tLG$ht&h~wzP*6jH(4sb#!6-FeMkTG~`CTYb3mFFR;AmUZ{L?Y2{G_u7vhLexl^~LB{p5JT^ILiIl^e)~s -zm4sgviLg~@%oSKb0t|aH3LInJzejp;x{D2&|El?1FD`U*)hrwr{0N>#M+BV3kNGuRaJjU%K5o!$%x`iSdBQb+35_;(#dJJvru-d5mYxQ)_HQ36 -z4(yo8){E$}SV+Lrgqkq%{wfj@B8H*lh -zeDHT^s^T!pDJDJ)b;A*J@fH~TgrlID%1TzptLByV4x!{AeKnegSlPtDc#=BbhCw^k -zk#o7y()l9Z{5Q_oPCH%M0U|Y_-7cpAnzZM#!E@uM;>_!^sl}dUD`s{RVqQ8y%9N`> -zH7=FqK|_A=i}^S3@z<{Nr`DS>3T?*P=>^SUWyq9~KcRXyB^_>nqFA8Zj*M*zKEpr) -z=`b$!Zx1I94hDKW)VuD?s^G7~@}gN4jiw59w4k)o9d>W-5w3O@|9iIC<7E_?&B8_Q -zd-YL)6Xh@|wmaDsg!nY*7}ReL1f{H}uNVxhxKN~Lxm{}{farl5i-#%#+r4E0=KDSG -zd2_gMKpgpkicE9rY7h$HL~fgM(aDGGd;uC+5_`zA5gYcm8e)*3-Z4CN>I2foqBhMpW>TuBjP{CG=6*{&4 -zldb${-h~%aMML41p)#u{R<--f6x>}v!_CqvA<=&DX^$S#=ZN7Y(4 -z6sc#C4#oD(ax!z1NfQlnYJ^YSpaR8peB+k|o3|;=uo9iHR5`_495lsUz9w9K=3Q@# -z`}@$C%~tlOL4wgBve;GZ_d%mvLic29r(Y&X88j82@6K=K+~=2&NPAJcSq7KW*emC^ -z!6VI-6XwqXFmZaxlpX{-rRY|?MEQ;yi+ET{j`&dlh!14aco;82;#=_=T{4!`w=- -zd37RsM-1awy;Dx}&KG$GT0c1UCw!DfxzMDoU(e*k!jtB@-8w>+>hz(f=-HX--sl+W -zl&?a4*w3$JwxIDL7XwfsRCKEwHBVPDtZqC$A%NpAIzpz;^UigDh`ooFoG>rpoK;wd -zJD5Fey#Z~B+1Q$CV%!ew8)B*YzMP0V?EQ7=JgN#%jY} -za`*k&XwVw;8&DZ(Z;SZlezz`K7&PA(x_8Okd$e-11dK7X@w74by``O8u;lk0?7kq~ -zo@5+<)LxVS$?tyMSDO*?a%}z_W9SP22|mBi_`a!W2{}2oE1h9jOV%59)fNP3x&qn3 -zAo4FAZE?b_X{+>7+6O}~uAR}}7zk`f@5-T8>*_1*1o_Wzv4VH#ej1TW>;6f-{pj!d -zOz&U6!FQ|`C!{)LsG+2-^c7mGj9%uB=R{w}gR8B@bC<#s4GESVZUTjtRNuemr~EN$ -zCILgOhz=Z6j;~NEx -zE=Zz7mx;dFwNs{C1hRXNJ5JuhC)7z5k)s3SL=K99Kz#$>%g~R6vMssUnIFFxS;Clg -zT*YZ@DRywSiz1ACBKStdxT`QM!jZzQy3}w`s)C}M*qHXU6~V9Urn!kU)l=FMFlx(YMoeS{YRRMFP~86joVT_}$I_nkbNS;)bBShs4GYet)Vm&>lVR?dIfMzY -zNVLxHG0}atD&onMbdb6!ig5JEh!MD*LuO4sSSh-?(~mE;Xr$zho^d(vHTllkg}kE} -zAe;Wd;o`X!R|@3>cH}9ww?0nR`*-H2OC?*Rq7&g)n%{DdY0wTmh!qgQe1AcE%{0JK?c^AMtqt{Xv2;{I4h}qms)O4b9 -zkzA+rdPM$amp)(7#1+8*m0=Zw7EfOLv3&=)Eexet*`)#Y4y10Ijc;#1ZxMr}0qM>I5O+X*G}K^Y~{tg+;WjYyFva#W*6W)+-{ -zlfZQgP{Mo-IRrl!vK6h(%#xG>>kWoV0WOi}7PQ -zuAx+fHu)HC+$E#vLTuD#)(s4i-sIkKJU@7+BLkt7{8#5SYu`V+^m8Di``+hs{ -z3-fc64?k$-v&`@%?DL_*fA@PuJ}U_6*q?m8r<@VFPVAgWFIBxBrt)rcA1)d7_%tC} -z5f~1E2iDP(xU99=KJYigC54WjJ%wR@x(G4cqZ&KQ+ZF?T0>_qxW-~YM=;cPslZB;tdQ33HRzGrAb=80LQZV!4Yuwm!)r? -z>iX!!{j&$n|E{a|VXeis@AEHd#DF~V?oEw{Ok^-9R2yxt7~k}e+O+yo)7ll{bNkd} -zWg|7QFBvYe1)rO`SnW{8KTxIbrzeg$1qc!%2D5lX4vkTKb!bzN-e>dko~PHAonWA#Pwy7i!RKuKs_SXsDPVhNFeIdEJuu{t-INC=Tx>Gy2FsTz -zW~w$mOk((D`Z}$D`Fe$3EF6ayc0mID8K$dLcEfkt^4WLc|haZ3wkVqG3;RUw1=sG2)ipF{oPgal!P -zw%mv~w}~3c(X=Y1KLh18qReZ_5S1f^#NyC*fH?NavASZsnRp|ppO#<#9{^K8tiJ?# -zVuW#ufR-r*5DyUAg?WJ4<NxO -z2?VNwE+a|*JpH5iXFC14@BQALjScv7e@m|5%f9q2cieILxBl-A6xjpF@y39$ES=P`d -zi8D2!qL#fau;4{9K^ASv(3!6K5(=KAW*a+h=e%Jsg41%hcg4xu+SMOGd2Wyc6+^7{!VNldQ -zF%;4@P){K&i_P#;gYFtr%%*lMv6O>hJ!J4E-5PI;m84b7$0z8zsJzo&3EH8M59!{sJI3zK|Vh5nDhC -zWp#-ydw13h)SXMgDAaSgN!-S0E#<_xoEgER?&TGPg3sfhn$A`$U?QT+EOd2vR&53# -zKM?TBlX&TZ=X}7>s@jEj)k5N^w%x`YVjYHYQY>T>J&%0JKI8PG>$~09uJzrO#Zp6{ -zlmt@;fO=lv`p`p{&YnFn{5Q#rzw+(r&IdmDa5eFWg;An3^Q%<29)rYHs)*@~Hlxpy0Y(?4+(CaKqEc9Ql(C+4rm{I^K6o)IAAyY+& -zHLX^LfnQ5%;1@Gj(C8}GwuAxeRUEhXN=N;yXlL7t^ -z>+@o9kt_SXm35FlQ)iJ~KIT|>6Es@r_Bo2su)@n0GKgqv^RoRb`&T?RmjKs{DFw>X -zE*TfjG^3#W2zetLR)u`vj+?lL2FvC@Sl0(%R?w22S&mGc>y<@I)u72u3xva|Jh{!jMA5n|NHH~av<*mW$85I4>C2L+N -z9H$ZDv$2C9`J-FP4!Fb2#e -zWy2(#zw|qB^}rmWc}J!Ykmk@}PVvdBmZny6*0-V%9 -z|46qV`g=co>#dhG5Q;Ig$CorSCmhY%28uvL)1&*nCqxuE@KL+oUD -zatY|9?-pa8ZtETg -zJSBX3f-ox+5VU8}Z`;1@0xt|ch44e~e$NRG;tzk@-ro6d{@xD@_j@!p>lNvbaWL5* -zVHHXZL#F7buah6(D?6m(%Jo*mieYWMbK0HJKN1y;n=$6C8I2oXa?P5T9o(J*g{H34 -zGsZ4D8^tBQb80(Sp$W?NUnnbxi&fv;#nb0&$e`z~lDV3sE6I%M5KDSr1J5(0S&Lqf -zQAurZKl?j)^}w;K^D;p%o+y*%3ZWvWH^^=oWD$ElBZJT~iy3p}vqzCW4 -z_s#d-dm`3<)aJl$x2lm5xUdm--Xu;+nZ9(y -zY-v&>7Ll(oQ1H}6C24R1N*Z6HHDp+8Y)g~J>Mg~P3;R+VeDndD}0^R9X@|I->KlLzNJuF1IX7v@0Dlr)GwRF7zX8DqY -z>K1#l`YqXhlKn1ufTRIio15SFUEg(*-TpCd-}avGxP=3upq#vh{D}qe7ULijsA12m -zO2LmNKX79@a1JCQBGXdB7aWAH%VEFo@?J-+mMU+GE>Sf#NPigL7Tu)KEO|>nJqO$w -zVk3~dQ0%?pZVa36u)?x2Y?TgeYX{DpGc<(dIGD*#W6TQyayu`N;6&SeV;~3bGQz?# -z@zvUh8I1%MPK4|o9UvuAm4;d`9P#ENnSPZ$TI@E;X@drGO -zq7P5rfE%;oBAn&Lj$1;En+Tc2idOJ80)xzJD`dSpnEB5jO6rgy>A)mY!|EsJ?Acj_ -zZ9UrDHkLiD8Jg;I%`^jn(i3-f-MI@IJvl?|$MW5{h0N_dYpnUaxDvr=d=<#7_0G(s -zlF_!A$1rw_{F8K~B6MA`T)c3yOVAwa!}KmQ|G5UW9VBK?2z+xL9;e-f%}xXyzG -z&|4!WA`E~Mg^de_40_2Am=0(~$ii-_#?-!r0-hl7m*5mI?X>ct%>E$IQBEv`Q3uwk -zHY$;i^NOzIp?jy>wq+%0(3OcwWoMODU)Q!|U1XNU^x)QZJbwWTOej~5ERV6BToH#{ -zj)*qX19`21EsZg9_jFtK_+uY{rw(jhFIu5fNlHv8+B_|eMEzM;GUB~;iG~$A~cxua+Vu9aOs0Xp` -z{M*(J3PIoizy~%nkP$xR+e;oioW0h0%UBhd(h(7kcHYB}eh8jA)V`poK~J%MutjnV -z0}YIU4>MdV!lE{8uZtr=|cf_g^TA&asq@>VpT|$9n`4UvTRH!Wo -zQVb^pncOAN5o9o;Zhpz;Hk>;jLHc4PrUKMTe>L`=>&2$h)jUmwMb%tJx4X`J_m4jm -zpE!^fS0~>s+505s%jHrcoOF+czFjWn?P9rHEYi=E`=*~M3i`@7fBA|1{=D42>TO?h -z>n)e+(Xd!=SdP^iR#^1_Rb((6C^PD(Cl4%fv{iG`3k%AFXw^x`u|$-)@}RpStyvcG -zk^uvdCJkD$`QB1p6ip*exh%%Sp -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 -z2{2Anj8?xTHSdXeL5)qiE#ur4BS -zRvGE22Sl#G^Sq*j5RM7pNI7**i2{uF~jVbfJ6t;m8C9*XeyAuT{JG}{C2if#^(;*sU3L9EojR*txGQN1wB|Q -z07h{|tpMtUwfDdJ;)&ROk%<0)?)+xA-EH`a`=Q=O8{y{nr4ZOi)x!b3q9O71RxfuJ -z9|Z13aj1L+s0a3d8doNPL%|J;Mv&-mDM@JNcwLgGWVb}=^v=91iIgV=87YxYdP78l -zK)9eYx8ZY7QGY=85AjF$%-SFemYN`Y%D5h@IR}??gsw$*F-2a}Y89c(8gP1tj_k2( -zsHJ0@5|Bxt^dRyW0E+aJ+o3y8Ub~KWp3Jy>QN%x);ye@HLlqQpfe%ja!dKo8zwrTL -zr(Y=sRp4Sx2N~HfyvjgjeuSjW8hp5F+%l)Hm-O02df)2tvCv=4Sy;^N`rQOaD4iN4qBkkjy<$7-W8$#&6* -z1tolEj;UUL(!5pQhS2Wa(qgkr_j?LLs5sLS1IZ%&Dht_#kz8nb_^mibl9eL5zA^GP -z0*tZn^-4;8Y8zg5i?b24GGnLAKN>`d^wYA(_y67>{QSRu_(cA`@CuL@ZdHB&VL*hd -z4P6g=+wk`LIUhK_C$-WCSGNo#xOaoWkqE{YtuO)Bg#J;Of50GR#@oEY5e;RS3)!oL -zs1diYj6|gp?|83b5^t9OB*)8k*(V)1-;o~(U6T8*TaqiF!Sn^IL{E1pJ?J=94#G(& -zI~zs2DBuEJ@23P7#bOgI+@!HcVl9Op0 -zbh7TQ?`Zox^LP>1lv)`buj=w1sTtU7yE-4Kb>=jUlE4hlY*QZa$TKzv)>)hu1rWi` -zBxuTg-A)DQpXcfaB!8Ti87j*bqp=$G0h>Wr9Y#Sr%M7)vww^cH;Weei#N -z5SDEPkBg;thO@THuMp?b8du^vI$k+MPLjfb_Rn*V2O=|8(LL$UiWS-pjKb(H^5B&Z2{`QAXWbq4f`_v=< -z)_aNgrF{ei2ZLo0EL3q3v%gZr`xowo@#rQ)!yMwrh{GZ&!hk*8)zbnze{6dZNjlmq -zIQ<|+A*L;Ps#tQ#J}8?kMKGWg`n|1E5wa25seZV%`7c_t}OO2%4w^s7B)pmfzPIV;JmG5Ml55+F>8BfB*Xoq -z>EHZ^|MTO|Ts;xT7ytH=kNl40yLHwpB3=_8)Egj`UxEF=zxPJY2cq>kO;4K45Qt@! -zSY&Km_62ASGO%t}eg_I=k`5&C-+BNgdP&kQ?bsyZ7^N@EaX&L^$`o_DyX=?7@yml) -z%Dt(Ikr!Ob7u(#$7oNj@sbtRB(~Ld}1x4)AePMO?O+#E)j(gR8?;8g)%Iuvod$KD6 -z@9P5BnQdtM_^D^))4Wa#K#ZYUKVndl{iE5B{Ig&Dk-zyLok--1c{@DZf8YDwyRkt* -zj`;zVevj3Cw$@^^bJ)I-njWfy=L -zb>3%|p4l`yoRB$5(--OKYn&bIoQrb@v?D^_hI0KuTn}7LrNB`m@w8C7Xp+=ir)C?~B&@K9RJ*$B= -z8AvjPcFJiWq*-!g3WlTu>Djvv7`Z=7FqiR3>Vhtk<0zeT-=qV{{0B;ZTT2Nj8`cFZ -zT-wjEiqNx9)|-PHKE%c+p-(!{k49mFz8f{;^ghjq^r6XZkGx7rbU_0{MbPO=a+mX7 -zBpvAdr=G2g0Rc)Rq_-dcFaOgMiF`3{Pe1+mM?dnu^$j-v9wh{lJUGt*J2Ux3eA(zh -zr&>WMfu4SD?d<)P*IoaWkHWHJ55S3YM8m~6L)l4ok;J`&-YPw?i3d89PtqSinu -z|6V>0H(c1c&qdv}#5nZwjKE<{Y!G+rJpIark@Z;u-4hS?9&wwWg`$wPj?M(E$`xfX_pfG%$$;W9PByx%8J4xV7ux?;EMq)y5heN$gvEY|oD{cJ{~(Re;jq0_kO+tG;n -z!6W7!qJCBq=T3=$pzpjR!XM$arcOUm<*sv=Qq8t@mS8`v87jy%59JIA4KngVOk?W+e -z`;xD}>&eEd+|k=St`@0Or|sO$Dl@7{O+gLmD1`Q@*8>4gjD>vQqxPhYw6na4i% -z@!$XO?|yW8v}i_2iPkzc|A8e{=(KVe=rxoR9=M(qJNl^n&ordZkkN`dz$nGipLR## -zmi6%1l+6Eke*IVehwu7}C$jhjx&6wo{B*;Hzlc6?704Gga8||l)!=X0ju!_}P~R)0 -zG(}Hg_a%+?fJAjt#6ZY`m8NhI3ek`Sg`+7M6_5v$Y^As8V_$U%;=$uo;@Nmj+Xn&t -zw5|4dQ|Pmha%XY{%(Y3H@Tyn8@|(Wp8(#a`yFb^tc*QGTmj1o%tKM>SboB7UANs{# -z_!n)v&uyy4uS37-=rj$*BFrTJxffHMNzYE1!$(o}5nR8dUg2*~B5aQN9U?Zft69ozmT%m0FH -zzi`Zw6G;Dd_O`y~KmOj=d~VTSxovK4zU^&qN&kN4XMXXQe(Ak!%k5^S^;DXcq_CZ5 -z;!!6^x#R$7GNErpl_esgG)I=5g6vV{9v$}(L?yPGcxv3QkguHFUbNef{xAQnZ2e5x -z>Q;kV3AH9b1_jwhQJHBPRIpdTKSt)j6(ly^&GSz`fA*FOaV^>c3n>JZDO>R_L5I#< -zpUGKJW@TI~6<8UFNz&g15V;GpC;MgSHeMymRd~Y|V;rQzHDAuZ^vm!6_V0Yp=GNvP -z;{<*4H^1Zl```HgviBW;a#ZF1=bV|@a(j}SLJ~*_B%vgsgx*1eh2m46^&x^h1fL52 -z_1U|E`sATLyVwN<#fFGJL6o8hN)wP036Mg1yZ!FY%sKzBoinpHfao(9g{< -z?#$P}-}n2@JMR$;9{y0u0i+Ym`%QA6yKd9YDf69@?U?VD1iZX%+~ZRTtVEqSDwgI>T6TDF`A@Ijv8{3ZZx?;#zcp2UDB#iH -z1V%P-#_W#{f -zR4SFj4m;?UTW%WYA0@IZ9>|H9JK8XO2s`G6cIP2(T3~&QNkze@-W<-~q>MbJT^OS& -z=u%^3#mW`%H5V`3bB9$Px7+G9D=+-Sdm-xu4*>T#)|EuE*v?MOh7-z+(LV%W9ECte -zHc${KNWv1iL;8oc9u-*|(aR$xNi}ldXB*aSup_xDP;tIA?%~DEhHJUlLikV{_-Tuc -z9gM#hmdzZ|Z#-L`4XkT!T83-1C=VFjX~xvQi}d@fpzY0XeqEA`SPLFN;L~|7SWy&m -zC!kbLbYZ#plRQ -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 -z03K|6?wzjN`%&o6uI^GWK -zqkl$pTIr*?;0J<>2#hK8wg^;W=;5Xv5oit4uLay2-Yt_gSUy(L4N&8i23TJOLc$^9 -z-r|Kz$ga-ZjQDq@Q@gT6FtJ&Fc+wQl4!G2X*=2p%=!!C@m7p3%!_AJoh -zNl%2S28Px8{*W1pL*RKRqDK#;uf=D|XBe6pBZojsFGLfpkG0}dHSIE$%!zE>W-iSY -zhd=`U$r%R6Kp@Hil!sJqcLyNFoy_Lm@Mp4+iIh6y8bXGhudKJDIXv7%1O(hOd<=9K -zCm(;zj(X_$+?M|NZXqD{COk0Qpy0$(whyUrSYW}yI!E~k|FkW=0S-9^N7VXUP3^|k -zmD5G76LcUh7Dv;2eIr@K-TRi1cDqpMRJgrVrD}BaA(PB8d5yw-<(o=!PfN$yxSdU2 -zNoIXs%UY18O=Lq+LODu&Y@CB~9UvolwsQ`#}eq;3zsf+h6(O6V5vIr90$u{BCe*>O$*jiWQD6@s9R{_hF?e -zV{*9L6($0lpHL5&HhvT2112Aw(ADD^0C6!&?45%hTB*WE!$g}oB5E8Ry0k=s(=8wkPKuhr}lH~jlB!2g`F&pb6))}^WHmehx9)c9)RPPdYh6l -zB#+9JXr~kcIp5pj7FaOJQr#~#1l%_L0f>c+U0>^%&Yu)JB}5NAHo$ZbjKub&(2n|I -z))u?C;l&XA;BwMjs;D>w3=)*C%Ix%Jnxv_1QV4{jz&WUaOUJ*a!X+Ru@DXuJ8=i!O -zyeCe0{S2xouPY!79OT5Wf9+K%}fnHth+6CdzuD}r$t!2L@)FSJxL`SkWN#QdLF3Q;h*Ti`qA9& -zlx9&%Yn#~W+i -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 -zPCfHwx8Hf|U;EwII1k8` -zk(SjP6b^BgS-KT@h2OWnU2laJJjSmxL!-+~dc*@zgU+s67wAJ*dsp{-(1ETl-PNT!I(TdI4R_yl$T@Gg -zZCrkMNc{*h$GM#Fh96@Fr^BMyFIDhFXr6pjfb$7%qNf*`8Zl3Klj%7Az9169xm -zRD+Is7iI<3F3^F_z0nVJ>+WuZCDm&1tNVtA&idqqaDN6mfuoN+?&U8z1^1Z_4t(k} -z|MkL`9)J5CzkibNJ?X?(z2slt;2FkCFlmZ;azD_B$GPABLX>jg2WqjzMbiCsV!5^Q -zjOwbiS+z7frb^5!*0q#M74--DNe8qm^59|+(J1}YM?jBLYtpiV!E72Z%hpmy0O#d3 -zl|(hgL@{oWsZ>BS2pwI)=m?TyNDnYL!sM8B022dn2#_dubf6}5c2?TktDPMf6k%@A -zxv;ydy`vKq09`>R$B7sJ^6Ilb`QOjPKD!S$jJR7BR96IT|>`_L%RUA5RtKawx|-&G46sSvmi -zss7Dsy(uiF -ziOZKhe*XW=ojYGPCpvZeoxgwmIcJ{vh7*5(+YNv5z3+U-MN5{viql^<|9LJf63*iq -zl-Gou5!BQ$-ic$OZ8pg3&UDk5JuCI%c@d{Aw3bb>V;!MqpkAU;jJid($Vl7VXr2kp -zwN8vnRNB<4V)9JqxydW4(J)D(DisZRMUw0nMR!DIF!Huya1dU9$u(EcnmX;>|90v# -ztGeIWb;0?cKIQZm4R9(IvTd_P2dGj`VfcT^!ib -zb1RhS41BPv_9g9046apP+)9vl>$fcpPKJoFsp}}XG4$Pao2k1Z-Bt=e^ -zNW+t$1C^To{jE2=>wRY)|NQx%|KfR%u3rAw`M{elI_}t4g#{MQ6(hpBL>_8N8&Ua3 -z(^$o6Cv1YrT-&=0^ -zW3cvn?YUd|M~|*vPa%+zJ#5V-Ha9=4C?R&}888w;XAn`<2wP^1p5VrDln9)f -zI>)FXkUwA#p~^lXuA?i6!687B0Qa_fy{&yQA0=NY_Fuhvi%e4G+UpVjh=gmLo|Go6uU;Sj;x4+?>i=KbN8+dP!Yz>rZVH4qm-#ZmarL!0!Ck9g_~T~x;4hfdOe!eU`8 -zGKzNq8}&{%|y+p){CkONdLKSdg+nJO#9Gzuf6fcE6Z;`?ezaX`|K~5 -zy0CcT!7;w&ULRO7IN-^3(mSEO=KVmVTNI!re77wUugW>JmMpoL5nyCQLk$nB0gah= -zG|<=L+4tOMZont}@Y_Gzex_yBs17+u -z4G-(G&+=?!oFlN?KpoK3K~n^!U`8PflE@Dj$q=fhLi&JCpcdC5G(tbHe_IFWfMy-2 -z*WeS*zVKsxgM-gVKL9##NoQwQiOSW9AMmJ5xLiX+TYq}hx8C{gmmGUs^#dP#=@nOe -z=HZ9Y$scvhtKRvZtLtq&67cvv8cG$s4`n{kj8#I%6MA~8v4}{tx1Ot7){3>P7}Lde -z86J(71i%(ug1{Mp4e3-ha)-Q|dmc1**ZD1M<5zwEm;BkQR;+#TDJOJwcW#e!`t`4W -z|K?jHv+U~XIRC?MF8}nK-}(9Sm7C(EX5uQ|qpFT8DyrxxQBeZnzl!3GqfviqcAF%W -z5u7YISz4&cGhpQC=#)ElA(25kc?h4#r&uyd4!s3F6I>==Ami*Lr8Zle=9vcTl%`wz -z`)bw7QH%C_2I|11Ns|vdhu{9G?Qu5y`v<@F^~*y?X;})m;|l>Ji($m#6oT21e7}e;;%tIpq`PpdGq%C;^)W@guz+7 -zJkzRGiQtVN0}u&AzYD>})(7sp;ff!f_tPuR3s4)a3%D{@DtRet;1VrHVRYO!VOk{; -zg>kKEuhWlFRCl_y5ac7D!dHYQKvOlYx#GGpG2e?{bwc>KtABd^_Q(X@`nHdO4umiI -zn$urW{^@-WJTf@c1nD<)mjOsDh8n2~Q1Z@S{@xAh=MOpBGM_Vfs0wQDSP>{N5(nXQ -zPy^Bg3X0&D#F_@pxJDG!PzU&4tJN0NJ0LgKwW_XG-~-RT@FP!y$o}>_Z~OAszx3C> -zYmfPRU-_dO=Fi*9_i^#^MP_QfO+XEJkEpt03M6KzR|dxOF=hC$9W20sV&i*Q*z$?% -zlV*?IuJ+^#SEMIy5AOBqbQ{hwd`i=v@;@WK0zNdSKIlj~9Rqu6J_k>b-y$t~ZV2sgII@7`#x54|Rm;~h8r@%Ddq -zbG~@L0|p2CUwQgVZ@c3Uf7Kho16=flOXtnot62KzToO%fYcB-Ln3gJ}DXp<^L?WK3$CJAnV^#`<1*w`1wYaAs8o_9zEf*_8VM;ar~KKbaP -z3)s^Mao#OA-p;=Yj<37+mXrVW+0|P0|9;+YzWI*VzV=<-3*zm&mwp;@fFe2?7<%{n -zzmz%1P-{_AHA&sXAesr}vMR2CTR@Nk1VRz6B*$(q21R*O79;&C$*EmKCsNq6r0@@9tg^683oYfd@-gnxD&Sg`k^ -z%f5HXcfNPY;LyOrz4xhBp6vAni}0K!Cq1%!+4AKN@-uKXs!3O^Hi*OTm;>PDO7KEa -zr6od(&e2iCGD;zh37~%(2a5wM1mpmC$0`V%mRz9oN -ztz(lu5MpC!xC#V+)sMgRzpIw7E`P&w-*x6*QV+$q-h0>5mp%XW|93y|i(lL*((e%= -zZ+g?|GiOd~Nq;Z?>A-N40`w5~!-+(1z+*AKJPLn4W>C&kV*hco{^4@*3Ea2g$^wN& -zwv6rw&~Y|R6g7I{U7WW}Xy^drB6I~*Fa`erx81AlH3)dM1`lxKKfe>`?C8AUqn`p9 -z`Oak*pY)<7-}&yh{whCk;RP3+bmB|UyUGR8aWtc|i{nkP?#%m1QD?C((v>(5i$zJA -zw+(~_uw!6z&QU99$VsQap!3e^MzvLyNaM=jHdO>v%CFEfC7yIuN-)9#CFC7JqQ$=c -zB`-L-9PRCQ(1I&3zoyX;8khC!HvZ%XzubG#yq#xF|J#Dj3oiKjTi$X(o~NPt_MGP& -z`H}PAT7J#I;P6}C{@L7tM+sN1`dUV)r -zO7$Myv|vUnUfsY&AvXDVPT<94=Hc8}dI6t27n~Bphn&kZ@&Gw)rNPy#me`&;ay3Z% -zx>v4S^Qz~b_|KjR^iG<*(@xWWeZ#Ms&BjeP|MtqC{TL*Bk9m7O$+sVS%yT+Ax^DUX -z^^ilw2@YvjD&4huKllMQ`E33p;!KCLi#|bnIKBt@@aV81)KH|E%$aLNQEt%#INW+? -zqT>&Lc75+o(t*t-n1e1=ew1q2x)*{j7JXelaK*4CipYI`eBi*N_nkRAFpa9oQzspL -z{GnHV|C&+I0n#||0N?x0&mei-|G))*RXFt9-`sxctKRXWA6*L{Li`z6gxqVdxnKVB -zN2}FJ`IQ%b>f5*7xh#U37#)TLrf~>uR;TR_o7F6nzx;SV$sbBN9(_J*k04UICab)X4Uv$k~Y1z*?}- -z5yIe?9C)0Ib$tQoKz*ayqze6M;fm8O -z{mJ*eA0Qif+aK<^_^UtKuzu6-^JaJdr53@@uDanr|MP;6|JPU7Z`d6ELePPI_L=*= -z?|rr$`eXC!_xF78Bi|s=ui+g#05y|T(E~t23<*F?aX+X5nwJPyi*qy|Y1{y-9g4Dc -zt47_XOz+uAzSCgxW4R=1w9f=YF}QimiGdWC9e#|%**=Ft56&VZS3t)uOHmopw3gZt -zo54$$9C+x{puTz7AxErPyZV8p_wzqjuX*$r*Zl0tt9}SE()@XQK8f<^-bWtsoa=A+ -zX`VO1#>bILl8N>D)@Bnqg19qaybc(TwPjz+X+U5);l#k&DCht^f%$;`uh*T&uER9U -zmanhBS1m1V*5H_my^7}D@qFy}?M3?z#xzTy?n -zKmYu5ySqDDI|D<{dhQ#BM{Qhbi;}je(gx{oRH>_^O@kju>JEY*2!WEsMO9mgtu}ca -z;XQ%_(=QGfd|JD?llTI@L!Zu)&eN -zw3#CjMPpnqg*-)MjTXkUMGc(}Gx?_J;i@zbWvf98Lj -zcI)l8lxPYtT$ny>`pGB0=#?)&4ML+Qe*3z0tIq%E>sGG353;0cB|@?R_wYbJLi|B$ -zQ7a4*q8MHXU{M(oI$#+$IXMRsP;C_Y{<`zAxXL}u5#9HVjek-P -z_)tfC1>k%mwxv0GKa_)y8CiX1EKNxbQreuCBDX0Ld%gX_|2X}emyPXP^$mRTBVYOQ -z=PqR-mZ-XrX(eO!!P}Jho?QuV*VWSjqW_9loUlz_Z0OY2y#LS3)=}64canZc1CpAq -z)OB3Nq4lWZ64U{Unh-<8&!V445sE%M#z?~ik4^2;*fe6j{{;1l=_KxK<{?s|V~6n) -zUfzszFVF)_ap#>F4nZV= -zY`FQu0|O}WmAD9g@J{fam~A$V3K-Iahz=AefJ-br!fUfUMh$xQfyYU{3n_O3u~0|H -zooyR17E-E}{>>?Gr;8-plrjW~muxAE2&0KNTz$***;Du4cV0Qysnx0w3mtaU;*~4b -ztYnC&9>YTIW3f>CE#K&$uXyDNmtX#=0}os5d&y4?BX&$wou1 -zy(ZJ{J>F`&|9@yeeROy -z-*oeDHf`FVia8~jEqq|X1>!V5^*^))}aar&&Od+j@SjDGJtYx+x1Iq}dV -z7sIRnbobIi?^LOTQf^ex^SkV_)7k&=vd@0*y`TWKT4l^ -zH*DD8EA*~xNL#8uW!6p -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 -zl70+$R7Gn8QX%B+YL6}t?_ig2nP -zT&+f$j8l@>#tDo=QUX6cS6a4Lb_=>>^-BRxku*QF?2DuW=sdEVTu9D2m5kVjB7^5% -z5=4qIr@izQ|Gbcgg?sM%$6q~k#6ic5T|K1Kr9b$_aVPG7z)^E9`r4;fu6ktK_jYu2 -zec(NxIqQsfzyVeLHLYz>S{HR{j==&reTLjq@|C> -zjBR%QoruyZiyB{_;xqjXuYO%kJfkv~>Ovm0={$F|RmEr}hgI5Rii{uWj68-f65Ed= -z8&kZLs20AuG4k&ysYP+8@=ip)F~W!lLLd@x`X>ui%-C3wekZIkT8hNx&uiT9DBJrm -z*Gc+7=Rt>6gCV{TYEbs0WqmEeA@&0gez|WzIshE>6O$#8t>n&+rTR2Y;>Sbw-~W*P -z7XMSje!v6##{har!)&!LQ0}kQ6AAa)zN6vZiE06oiH$Js`&5AK^Kl#K{KlHw@ -z@4D-rMifAM+9@4kdgX^yxXi{>9kl5jWg^R^sN>r9jwc)tQY{wC95)R3EP}#)(HWWR -z^Ou(Sa75_o7Z&*(T)euQa7N^Hz_kt#b7D{?OpgM`5&bjfq7Y$IwemGn-$6?rZ^Z_M -z{+QhwIgl!+M(k6>Kc&QmC>|6|z7x%JKz3^>bi$bfyKI-PcEb&+_DEV(*mc%uMltv_ -zfNMcz4^^&~Do;S8{e^mH+1L8}tT*=3VU(I%AV+r0sD;XD^t)bv?$ZPP_Vzcv|GF!0 -zpEYxK8Q~tz9Eid#w_W$)kG=WG<7c1xy2HQq?ax2-@crSvvuEw`(GP#`xyPSsr29*z -zE@DW4 -zszg)GOlV7Tr8f<$uDYYuEq<~QF>Q`oT8^PX*3ccEVJL*o#n(Z|Bty|wbVl3O(P*o- -zZ24oYx=$Q&DGA4daTGYCsYuJikf@9Jn4R_Fmp$*uW1cn$(5aKBz5GS5ZZ;dY-g&e3 -zLnOjqLSv1F?rYYpTDJ1~Ykzs|RloSovWM>J>))8=&B?vf7w&!d{CNj1d-%3Sqn`q3 -zR09%4A|Nv|2Zmv@!$iSZ%4sdOXmRYFrc_ZWl3o|JtKro`jpzujh8&4Tzwh*Skx4Wx -z--herY$_ebqde5Y8sa1%#xH>yLamB?#BKVDS*q_=GJS@Bmh;n?BoUDl^o+5BBV*vS -zCA@Sq)y-Uw9(eS;@BZ>bPx8#(^xJ!0^5TygQ#Xbn4-pzs -z!wIgyg*CaeSn?)j)+$0K92!29{yZWmLrj9MZ5BXi2GwBjVY~iz?PBMlpx6oay-*+O -zmVjI;#PX$t&GQ1fu<8h8Z{ok(-Sxt9q^=4z(qSgS6g%Yu_`>rDX#%nS6*q!IVZVfH -zK{O3V&0Q(NIw3Kl;tKI58K#1hTAFh{uu<3yynme;&UE03bX;KbbU^-86iA-Jz?V7d -z`R%z6lgdqvHx#I@dvr99??oOx0))bS&AO$x-gf2H*L-pHnx%+qNT^K1v8p5UY`CAJD5VlM -z8vdzkT^E2Cq-~CxbRbg$rSy7?5Tv;23h+a@-a^s8pI@+6m0Y{_FM#CP)LicwZjRY| -z%o;r39@ecpV}#_CfD#Pe=4>^7@)m_0l2nZ(^w%^JcaVy -z%bQErq(iCazp`0L(5-A^(|Vh5-}x?>DuE`#W)js>Bzc0)J9FpH -zocq?!wl?+jy+LOD;dg)XN8kSSq6PbM^AoRqV@LhzEdAkj=z+)l{PH{A|MpK#m@t7|fk!yYMDNOnvMl~X -z95G*Cafj52B%JC(WcwLDt94Nq0#ykxHtTJa_Anq)3KezD*1h{WzhhXx_q2DC1w>as -z+pzoqB>x7P%at~qRGyUVlyISo%>RWan`Y(L-16+tB?nIrS -zn~(Ixz2d?w?q|wSqr!SkjW^<`Ii2H^#1$SDZ>9a!~<3wroWI6BvccI -zM~sLphW?ED#KA=ZX+k<1(YO{4xkJ>GL7HnE5&VxT)li9>F?}NC1Nfs1r^DdDHgQN& -zHxn?}@TZMp+;4ILgklard9WeEd1SIw=tCUM0kii&^+;*QXH(7G>BUinMuF38bYyb9 -z-rLrZ^JFj%2R9)h&QqEhNV6PU$T<&`64H&f);_X!-6OsxL(^NH+XwQ2 -zxqGO3bWjor;YJi8W|zu^m{w_olT|3qt&lKQZBC@0kO@HOpW_fWrmWcJGGv;#Qzo1y -z@NM$Gm1fiZI2iEWSHBZ8UCS~p{TP{j@dV&1tVb~>U>5`Lr2r*pK`?TTj=B}!bgP;V -zIjQ#GH_Am8SQ88>fa11Orqf(ypa3~Sqj7E+{yf?KjZItrgCi%&H{`Xr!@XWd2oM}c -zQPp8pw4$&a6mjB<@J}oRX-o4iH0`eOw16%}s0lgh18%j*Fb~$G6(Gb-r5g$kVm)={ -zlv-7%I2dU%0!26Bm62-ViOn$sR`dutZp;|)TyVEC6hz|A1tOGwPK8sMD@dDaTJMW0 -z?UsgMa6+=tu=MDU(=2UpT?mwf7!(UNa31*5(wPo;7e8*hS@mZsZymi2;Kgm;Rj3D> -zRafdxD4}lhN&?4CH|j=;$-sg}lhZp>>i+oM(Nv+A+*g<7-iHC2@dEUjm5Q3bmuia+ -zMAiY9M==O;j$;5=#enmWM5c;jZ7Y;bRr8Ewo!dS%@J@ -zxIZQs9JQ-#5t^_QiNJ7r??Mo3OLJwy1l&b!_=FN4hR!-h|=cK9#oo8qfhG&1VIUVMHCdOBE1GLJLCbTpP -z_nQC2ydeZt2$gyroRe!I53iqizucENp;JVMAtzs0ck@GL-d -zj+^F@i}mW!S)R;r@fiowJ=LmZchkVp&SgG>{)l}D#^K{n{Pdxd`kt3eW1 -z<9Zu*!4v_W5&A}mK_3F)i;AXoQk)d0d -zI_Y2H4hv2oYdQ>jz}RCHgdtFtVy_@Y(MRxfnh~`MtAW)azxFwXC)eZJ7gwv%wyjnh -zn>4?#MdCvNgG+g;un4voLMSN6r0Nw|fY}wW(79$d;s(73AUh$0u->kRgW|4=$HFDv{A*UKp!+^Hn|BA7c9?ruq-nsFkZImtY+p%q@6woO8#jptThCSmW#cXcH~< -zeb_AIL{rZ;m2G=WsLzN2a|}gsWJs~LBUvfiPEL81?*2gJlZM<>CgrxC39+%7K -zuto9}JL*z8?<|c^j_(lR+B7=jak1Rq3NU&c9Z;Y8oi0BwCDS(V^ -zkO34ENGhTW&>r4ryBVw0x`rOr&P#j%_F<{KoF4dqN(YQa5c=XXbqJ!gO37`WrFNTk0mNOmLXgho3gi;7HKAMSUxckc& -z-1$)3lwt`LCW);tiP~VH3x?H!f&1H|J>$C6Ydq#zn>xs$E0TsI6M;6IN(sh(IJbBTWtTs1iWsge$M|3+OoJ -zm(ep7eis%R{DG>}BVEN@Ln@mz{)e0!27A47+)A2jZP58mTtU^oGd`G~BkpD{^R*!>1jw`=N-% -zr0_~+Ts%;YF>}`1Pzx>a$RSat7YS9e^1xF1KmG-Yp0KwbeV}u&IiMs8g1;{Ee7zA{ -z8^RrwSMNzIOiq;q8nXiGRb#}@m3|I;VkEk75nN_^E4R9gPaf!xB++NkzoQi*Y%s~U -z1aIXsSaiguyE^JQIbt5WEra0Zx@A -zHXAs3t)MLoehA_3hh8Xp!M7bY=Ma>U#I!5|^R-hC9`mIkjs$fPetNDH8Ok&?q7y1b -z;GiHfpRlJIUD`R^94-i2D5POBQwqFD(7m-r$ySlK<&iA&qNR?CE{mhKv7$~eO?4tB -zfe_>oue`R}XJy8lf9VRikW}zA0GWUG0J#7ew5R=H^ad%0>tC03^n$?UTHd6%z`}qJ -zCIDb>kY~j%*`l_{kGYt*FghdYsRbRl4|E`|6LQbUbRepMB8f+7j!=>fZI?k>5YmB& -zT>;wu3jH)D4WYM?KJYPejr1lx1MzSk=Y*D`iZSL*yfu>n=89qF;aH?RrdNvhrLJvE -zqR(kpWTQkUh{m$6NvQX@Ksp$P{b*V37=DpAY}JZMZq=NhOTu7cw55W~6n7=pD`T%KpxB -zAMpW4M_NKA-tHLX7B#+7DSe14ih0h+$RnK@%bH22h}f?*1gSo$N9W(50_=$x`dJUmZ@S>p(;LGp;3|9g{9Oyv9*L;j`_CgMkMay*=1(aSCFJh>}M%86>`DG^z5OAmeofaO(EsNN8)ef -zpxm&|QMW^x5CX9RkUo(^RooCLYemfU&D*bVPKX+AYqkbCKdmTFD7%=qG^9tT+tKftAU5AjnUML -z3AzF?|Ga@$QxF|;0DFdaN$pa4x|z?0a{+aV$p;-+r@AKK6?UHbNcqkeSAmQwEWOQ(a)$H4Qc;oi)tEAu -zF>UnIyyrU-hagUaHAD_5RARruG*b8plcPy}r~@h6 -zemuK0f5^U;rYZzpD8wx}{6Nx}klE -zvFN6$;*pD?P8F+P7=Qw?(3IZwI+{T?hb$>600|&Z{230@rRkeH!8d3bNiqel0Yad8 -zhlbX!BMtnrD}G~2G-+$p -z-!!SAPAs!$D2jGyni@^J;pwADM42B|#2eMH&(4lkJOCoi6@krFTo)Y(tpNUtMvuh< -z%a;x%QBw?*m{L7bml+($gKmU;VB%_HW>ON2%^ehd8Ut{}q?e=taH?{Qmbm0gL7~j!|xw36+LOL>swwK9m#p} -zD@VsAoT1##(K3XkHM}0!LkvbBqo+Jj3JApvNA>Y_C;A5chvM=3$Xp(P<+D!6&V9)&7{3bKc%LIV6r#N?`T-{>hL8X-ppauN?+s*f-bq8ZXa(@ROKBOJ -z@y0$U9q3{|5L|>W3MpIIcvT{g@SXA&5RUfxP%aR`%lZcH?n)P#9uD6*1Y$;0l6b}b -z0hNQJNpb?juTPhOU#5B6t|S8#DvCb=PtdC;_36IUG}w9=ImZ<9V1TJ5JBx`sxLlXk -zG-JoDw1^ZyUTH&l2g&Cnl@ApSU==o2s20?NE^&)V!OXXZ1!!Di^(lr`E#?Eg6ILp< -z3tnYwkRd`U;3m(|)LVLnMkV<#B+NlL{t69}Iw_33fcd_>NQDfNI&x#r_aJGOM855+{eD(r?UbMsMupm)LwWo9$owP5?ar6#?E3-t9o9VhZdN5)N^WSJ5FGF0rRzX~nPq5|n^39*SLj8B>~G -z(Y7>diBs{3nLO8RS)rQ4Y*LKxv+JN~Ufg}J-%}%LU)7P+MYnLa`(O!|RDupvDm0cL -zhF@YKT5Tk2OwoFyh_JCwi#~uZPyIUYB5cvg0*~9bQFMT>kIhS~5u8%C)Y&hSD>_wx -z>&jbFd@~_z_v|13V|Qb}Xp-L$Xn8iDm-%RNs?;^}q}Q6=q4qjXFDp)-ZaI+@|4-JF -zwt^psm|)+RqZ!yGTaTs6K>ZabpkYf@AaaS)YoYIJ{OlilHQYj&sBEZ&8!dqb`3yz6 -zr7X$h&`sy -z;XsT#7D>#S% -z*z<$UGRUAy4P8QQ_is{N-F_)^NQG4ygXvvIsUcuW9E<^#6fSS@A=rNyzO$#XubyCx -z3c-)~IS)kPK}(;TaSo;fTA${lY_ZtTC{=nJ`T^Aou~1VrLRkh+j|r~BqYHdxCiqm6 -zW6RMiZ&r}Nh9U11^Pmo}A82LB(WQ!Kuoc>sroF6(4VN(8Qco_8Ie^XCvNfMFag&O6 -z7S>mCMZ|!{16gvaSi-Cydz2*j(A^JWaV#w=b%8X3%%66V#4pzKrwQQ4qY8x<#ZS!# -zUtv5-)aR>4`A!>+V#2A>Q|777D@h0FWDDrc1Ftv*b43QCeJRs~`3o0n2dc!mA<>S- -zMXio%qs0zZ5i!PsNeEO(yvO>hfLIOsP=dY{eJ=0=n^jjAwRuWL%#||%-xcPoXS{F+ -zGdNi8+jrLe-6&f)MyX*ac|?}xj46FfKBunIqQw&-)Y -z!T^uW2SUlfg*l$qL59e1cB?jTZcOgpqOdlKDwYfC+;D87r0#*46663nEC@ga*zF+e -z+oyC+S%DcLP2WDJs#Ky{HW_Gv&w5<8R$*#BWPBx>9OqmBSy&fP=Th>SI#+F4=^!5n -zxha+6xPW7WlL-~40!70W9;qZ6Uo2o3o(uRLX_6=(sL-|2E@0#Q5=d5zyaWXDK({bZ -z;%sp&7tIzyJp6R)Ce#70jh6eqCKNTi1>>FozpL={xlb*;*LSUrWYmGdeci+&2qdyC -zOT5zp1|sVwYGB%9MP2!Mk#nVrBLfSS -z^q&Gn0C8owA`{>OLC^t-^1>1qRqCOa(%d4)bY-s5QdhlP9io20rp+T0ItHztstse{ -zs1c?F3oSE{ApI^ZBEe~a=%C#eGefABq)C@1A&n3~;2+I8P_Ta%g%|G`gum7o{)q3% -z_#T4}LhsoS7 -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 -zxWIY9~#YE?OVtmcYQ3vriFv8R@2 -zFvT;dGh=*a<2RCw2zGCNUL4#XethywCxT%LihAGcli*~S4d`V?`l+PaLCXp4Wg!n^ -zQq#v1_XRT~o>}Y>MUAv!JUKzvXw06wN?2thoG&Tr`+>uo%AL-0vCKG<&k%InA&-qL&h!&u -zfw8?@{_FbbpZTGi(+Fcr--5^k$Uy&5nGw@Vsn?lY_TqNdUQ?SWE9sa8{hVqczWob8rdeYe4go6IRdvGb`bIl&$dO3)T?_nSzpn!n~czl -z-3kYhWi~(T0Uti%vy-V7@`(;XR&5w{f`z_c+X-8mTEzTkmu~k|s5;_Vap^7WT~Dv* -zN-g9a9P*sZg*ev(cyStBiFa^t!+PR``a^#r;@hP~+(f~=;0(yJ?rDXol3xAm=E*y@XJPoM-9^LP!RD#as=BXUE?|^q}It -zgsHyL!&jo70mlMyV>~%&JuzCGDdR1=P7hS7FF{H;QWLoPr(1goUIIakx^~M71nuAGPF~zv(096? -zlFjZj>ow-9DOoL2-d@1%hK*t(d&UTif@RGK4M!M -zfu^Jxh7y$}<~pdM1r&^4HIKA}MkF*i(G~DV5d-AY3$4g@wnu8G{0QVsUo>!QjMG2U -z#n%~Gf%PU3@2lt`=PN%;KGQtLEjUUlr>jNjvj^WL11{hHrOp_tXNQ3E`>UD-?XPSC -zG>LX(4{SSJOT~rSBQJ{ih${<8Bosg5%G@d0Y%AVL>msPCocx{C8QIY>oV=8NAnZO& -z6T^8xW=jLAPjJlu>iQv&19O@HOh -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 -z=B0)S^5bg!~_^vg< -zQM7V^2(oObu9s+eAdjB)!PYjRP^U&nd?Cah_dqvi#kA6^d6ZT+IQ?J9FF_XD7ZF}| -zXpgJq(C(`_&ZV4OdO -zygJ9XN0N#2sth%jMW5f1z3nN8hAgN0-&&D?1o0$g_b#g43+YfO3fM5Pv -zY91&)3Eo;UxQogswqA2*$TMru=I|x9p4jpLV((duA6oO!`GzG<5$br0xoZ_`EwqAz -zJ=G5kVb)m>(dY*~ag%a?oK#{BDhDT+jvng3)v55?b*>^_k -zlSiWqD{rDLp(Sw;Vz@DUwC3LY%~uOaawt7=I$K-jA`9EQFvY;D -zy|W`eiuH#S+j{L9RyRvs9>Z4jQ{J;BGiLI}T2C -+ -+ Enable Artist Fanarts from HTBackdrops.com -+ Enable Artist Thumbs from allmusic.com -+ Enable Artist Thumbs from last.fm -+ Enable Artist Thumbs from HTBackdrops.com -+ Enable Artist Fanarts from fanart.tv -+ Enable Artist Thumbs from fanart.tv -+ Get Artist Biography from -+ Artwork -+ Get Artist Discography from -+ Get Artist Genres from -+ Get Artist Styles from -+ Get Artist Life-Span from -+ Get Artist Moods from -+ Get Artist Years Active from -+ Preferred Language -+ Fallback to Artist Biography from -+ Fallback to Artist Discography from -+ Fallback to Artist Genres from -+ Fallback to Artist Styles from -+ Fallback to Artist Life-Span from -+ Fallbacks -+ -diff --git a/addons/metadata.artists.universal/resources/settings.xml b/addons/metadata.artists.universal/resources/settings.xml -new file mode 100644 -index 0000000..c91d6c5 ---- /dev/null -+++ b/addons/metadata.artists.universal/resources/settings.xml -@@ -0,0 +1,37 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/addons/metadata.musicvideos.last.fm/addon.xml b/addons/metadata.musicvideos.last.fm/addon.xml -new file mode 100644 -index 0000000..b687aa9 ---- /dev/null -+++ b/addons/metadata.musicvideos.last.fm/addon.xml -@@ -0,0 +1,32 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„. за музикални клипове от Last.fm -+ Last.fm Music Video Scraper -+ Last.fm musiikkivideotietojen lataaja -+ Last.fm videóklip leolvasó -+ 야후! ë®¤ì§ ë¹„ë””ì˜¤ 스í¬ëž˜í¼ -+ Scraper teledysków Last.fm -+ Scraper de música Last.fm -+ Skrapa för Last.fm musik -+ Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° музикални клипове -+ Download Music Video information -+ Lataa musiikkivideoiden tiedot -+ Videóklip információk letöltése a Last.fm webhelyrÅ‘l -+ ë®¤ì§ ë¹„ë””ì˜¤ ì •ë³´ 다운로드 -+ Pobieraj informacje o teledyskach z last.fm -+ Descarregar informação de filmes de last.fm -+ Ladda ner musikvideoinformation frÃ¥n last.fm -+ -+ -diff --git a/addons/metadata.musicvideos.last.fm/icon.png b/addons/metadata.musicvideos.last.fm/icon.png -new file mode 100644 -index 0000000000000000000000000000000000000000..b253ec589717cc93876db82f67ec84ffeaecc583 -GIT binary patch -literal 14392 -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 -zKy8#ZYmPFq(95B{jzItPUmcZo1$mOE*PP-AO -z<{*f@r+z|3B}~9=QtqgDH^hC3P8Npwh9gYz_Hf6~NPTp_T%r9B6bmT$sSlb) -z(a2*b&Z&N*f~fo<=q}RhC$6LgVGKlRGGT0!F+esR2^DPKV3o5cTllp7USTIDzD?iW3s9n{%npVeiA%QI5f?LKYYruLaUowY3&Y}Age -zOdiCX+OceUb-2ULMCNJmP92ly%(&i!d?b*L`Czh!xe~duN65R%efQI9 -zg6X@V*XXe74D=ao?E7=A_hI!EGPKhIMYdNx4MF~V1;5#6@<<1qFQu#+6v)M=fOwPh -zRk*!-e&^YsB)18{3`+Q*>8T(kZ9Fj?%OlyCu%k2yLj4S)K9fF;RVqGRpfY2g=5}x3 -zPBxTPh@tJ$ue10TwS~@|`;trdv{}C~BNKD4X?EV-biBgrYHv{IPFvSS;^kJOnThZZ -z_Scy2%b>CQo$ca-jhoSjt=W$dsy;ne_in+8D4ag4UtLUvb!K=_Baj;2+up7TaAMjq -z=7fw=jix(nlvnC_oI<{ULr^^%TBo9Q_kZPbaep-?pCM0AcJ>dD~`onr9w<~R@KT5&psGa64XrSpQUQ{Le -zk@i!}^O3;IHpH;wSjlH-T!^QO;T*K4t!SK-N>Bq7eNUK4uG?t$@GO5D?x -zQHaHBl+2j(P|?Zb%-VvE&$ks?L3i7l7(H&{W7}CnDtS+g)=Uo_8z;-kw*CVXYq83Yw8kwrr&bYQI%1Auw|o -zyvFu!xH%t1#AMND>eqRfj1ru$Al&j7+);9~p4QRElQy*-j>VBSb6l1aML#h>kt8m= -z>0R}htr%_$)X7@wd*w^|EjRqL$+YOG4RVt9up>I@l=Rxi{yrUn{R(D)o0k1LqG3+` -zabV9}8htg+%}nmO{`NH1Z9{&*E&SoQqBh%m|B?|Fw`9d*@i}{PZEw`+%q5@iUVm2j -ztiY>A;gneP*)f^jd0JG`J~r%r9e;L0uO7V3MSGbJG* -zr{323c&+Y_a`g5VpO1$A82m&j8M@DCnCnlnSIjii*W?<0c3+kc_kRqoz7;MvcXC@w -zF%0ndY^y=HeYcM0p<5$l;7)AUXgO1xQC^!?Q6{v*pmn+4B<}+7@Rn0ct5+V#X_v97 -z&xm)=*)Z2{!!!PSNPuj)l5_`ZQ?q#we4cQi&GPg|n%@vU?-PtqG$u;E0U -z^gL5fOGy!&u`91G@#@A_2v>Lxa?44*+Y3;t)O@>}Rp-B# -z=mLG~)!zsah7`X#wK$&(V{xcM2H0L`yPF!%$S~iC?$ZxycWlEb*)u-bwycf?b85ov}Qu1elISqdg4zYAy>3#~& -z)TFLGZ*oz?5H}HDJm1vag!27JwX?&}dT)oh{|N{DPfQ$3Ykkn(p&D -zE%amMhN`Q*r@<&`?`ySWlg@pjEW4XjG`SpJb}ejr_YqG(>&G!F(RH)(#TBjf$x28d -zH{+Z!)UK(j`0rn}F91@yUQQ^GEPy(hABOTXH;1i{F=uMTkzN%pn6Rb@f!l_b%J(qF -z)vvUzS>krEO_0H|nVLTZio{~J2?80*9Ecr`?9cAf*a-H>yz -z&qNt7QK;vev1NePchk4%rDa+_pg9Zo)^o!3I{HRwdEfe$6$WlRHsG$Io0YA0+ZNx~ -ziE^?KdwHHDO2VzT>Ja1kXZSV%8 -znTLLTPJY3v`-5mnZno4wklm4LH*gDu-`&Vs&D8WlhW>H>C_F)dhs)GYM}gmrY^yGw -z(B>S?26zY`Xpg`w5yfKiRHa4JuGpk~ptftg!AYR8V?5T!p{uB -zMvomdUPU{}zw|O+#N__ES?&NH&}xL_#nJcXfDW%n)OT1pzJUcjtZv6bHY3VF;o -zHT7{Vq47(9f4FBBJ+bI*WV288+87xFuwN;83W_*N%Tp-7@#4Dwt*fLz_cR@L|Hp<{ -zSh^`A+5kLF+wr??^IHE|=p}3WF`^z&M{W=cJO5DeUbG?u1=Fb9X}ZiP|NZ&(HNv;j -zOun{%{z#ISG>9XIr|bg0?0bjLMV=RUn^fL`a%$1d^(o}%K0Tdk^*_l72Tf%*vPRut8R;4KwIcy_U$`6DNZ*-iB;7FP-y2G*8F;xn6Pm_ -zduDThtK;Q8rcDMn{}L`AjX;*;w^AN47f*NG -z^M#yYomx9oho9d^c@9AxVy(8~xWIc%Rs8c{os*62>H5-gSzf*<(U}W}eQvL(?Tr`j -zJ+_u~#t+EHNtjvB+#gK|aYefa#J2`fx!<9-=eczMOpdmc`JGm7z53&R3(us1Pjk`r -zq+B5&yrOl9_jy2bMZ3kN_V!4|R1D_ZGOiF;r1=|HyouF>5gUVI&K0OeGRl=N49Il|sJb4Qmh~f6cz6tv1#wQiH;`>Abnt -zSNpzz35nOkP!-x}#=j8*O;CO6-~um&m3p2n2~=e_`wlTrS*Y7dD4QUV^w?Y;n#n8I`Xo*?XmteB^HC-mn_7_ebdENyA}z7y?s?VO(b4CP -z0m^rB1#oBYC@|*R9Dmz`zKm9f7wIZpQMwXOffYO+>KiZdIA640`w^7QezBBLpN^TK -znMuchd4}ieB&2J_J)T;aPzO&(8p*!_l_i&r%w -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 -zQ8?C*^{dl(9K|1bliHHNHEI -zjlHQ^-IDNDw?8hj7QGuV8WN$2R0q>hk|Rg01;cpC83KR^c?uv0_^YA*Kuad^*ve{4 -z*8OXWM`xYRJI?cEtKfKA*JHH7@beRY)Oh!rJwPK$L#}_i+%wHI!R4D@RY>=V&tI5; -zP}~!sf|Y0f3UBv6wcLU25 -zH2@pMobR);j2z1sS%N`CQ#)lIW$g$|zd@zI?{$#U4`V_?)Qrdge(?5`u)F@Zev(op -z3=Ag{V0ZObpnm5hwCu#kA+0)_gNxWsnP~sn?Gvt#6@7rm_DxMzzTcX<7#KA~(7I3@v->Dlau|;C?1&RqVU6bjE*|6!a2g!mu -zorfL)xsdN?(GzKR3jMoWO>@!aVg$OzU7GF0npLC#F~6s|)xum^%CXjCp4I4}X~nz7 -zxRfb*t+n>CnXm2PqQGtHfD)JGdiHqdC$GA8_Xz5cvDXHB#9*XEOLd}q6CCzyiJz(_JS3?S| -z#r4gQQfb_0L#-ml@mHeXuOyAoW{*1gky6D%)sE|`DrX`k+TtTnT36@PV#;^LbJR_l%|B<9EhER~;6S -zmFhN+D@l}-QA1FeeTkZO0}`;!L=>MV$8Kqv8Gt|s*981_+d<7=2~YVXJ~Gg?IVx?6 -zBwm-wKw_7k!P*i*e5M%pzBMt`3OY|#OWJ>gUhx5JwRWSp{eB+T7$ISIQ0SLvbqam!Blp~UI@V%+ -zs^9RZ3K?bpQ$`qv%DIUQ6|UPa3w@O76VK}{=3)6dRtx{O+Vj8Em92nEfvn}f+0EmE -ziq=!B><5zG1L^>>zwTx4H8k-n*L*-DyOQ)YE;3MAGdB-cN9MbqDj1`^I%;ZC`~eG$ -z@}Nt>JOK#fn-M2b46D)eVysPI;|@Jw -zGoL`Thhu4)l<%!=y`%nKJa^Y__Jmt;Gx`XEfbo-DPV)mFniV@(U2&c@D&`t~HPl=0 -zH0%FY=81Q%7!gsP^-rhzcR>7U3@6?49b%0IN}VOCR0WhMEZ4mzl+y -z2>ZVIJR%RTx|xp4GHsKj1nnR7&<2f?dW*fxTkkPX73(#g689!&G9UWFLXZ(O%}!BV -zOqqeIBBP-41JBLueN(R*Mkwh-K{h$sua4-rBNc8iwe&|zmd)9h;`BR?BLQe9m}R

eXc -z;Xl3lVP0DheB{%)seSqk_X#mHs*1cWKG0+CIN!(tgSm6_42#Q_r9Mm7sR#~S(Zkat -z*7)4rn;%6xKJkX2e^1L_Xni#p>eUvvpavs@ml&98oXlx0k4yACnJY~>5WXO2F|VAa -zH%Q4S+M^Jd3zmcw-K%!oxE!vb`)>f!P)#4|eCtf+Me`!?4lOpw#I@OydA_rQi8$3; -zFN&#Y7ufG<->dalFjyi+b|b&aCM!J6Tek5p>+UKVJQg*q5Ai{LvjY?lAwbBH$LLWBP!X}j8wmZzvt^wMfP^pN-D#I-_c=b -z?T7vtoB8#QUeUJ|h`|s+M)6br8RQIWX|3j_m?U~whrznQcd31p|7c0=8J-aP!AE{Y -zWl)I46bx$`OW;3QyV;fB=)}#THR};M&5tNDM6VAMm5Zg{sfrB$HTVQlijSdRm%A~L -z0y~HyCtXMW>FAH2W;tD??n*)JyqbbX;U -zl?l7lJeZSlVOMfDA58@PBOl43>ps}~g9V1g-Zbe<93?hY8ymLFD-I2aVue#?(Snf{ -zkw-8_^Z`_chQLgRysjYf25t%rA!7)6PL}pIbzx6wF+Aokb^=Ry;8O}rYdEitj6yHO -z^kj*$^LHnvOhx4idCnh#QD3BN)*MM1n~YHy#5)fZctmnASO_dak+Z47iuv0QTaL(h -zk>v>$1zSG@^f44uxk8_Y2jOdXj~^Ch~ocR7~D<>^AC{*W+z98 -zZjU^LGXSF%rFT<`7L1kyuml2tQ4TpGJdBV5!cWBuvX2micoGl=pAvnI5>iUnKP9>l -zI8+b~SU(3|C6ho3Gfe2mqIm)olkT@e9j*J*IH;WBegyw7q1{Y}~D&fpCf`d>*@o=iB -z;p11(7!dmj(XcQ}SF<(n>>(FP3@@H;$rlay^xX3ge0Dg2QH7}~NLY_^Nok_0Xyj2&(qf`pCxW~!nMUMTq+ -t!(@j3|Keue|Et~j|7FuLZQ45-5aKK>uoSV93}rt+T3kV_Ttwgh{{Xp+Jz4+& - -literal 0 -HcmV?d00001 - -diff --git a/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml b/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml -new file mode 100644 -index 0000000..64d58e7 ---- /dev/null -+++ b/addons/metadata.musicvideos.last.fm/lastfmmusicvideos.xml -@@ -0,0 +1,63 @@ -+ -+ -+ -+ -+ (.+)%20%20%20(.+) -+ -+ -+ -+ -+ -+ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) -+ -+ -+ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) -+ -+ -+ </id>\s*<name>([^<]*).*?<artist>\s*<name>([^<]*) -+ -+ -+ -+ -+ -+ -+ -+ </title>\s*<mbid>([^<]*)< -+ -+ -+ <album[^>]*>\s*<artist>\s*[^<]*</artist>\s*<title>([^<]*)</title> -+ -+ -+ <artist>\s*<name>([^<]*)< -+ -+ -+ <name>([^<]*)< -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ <content><!\[CDATA\[(.*?)(User-|\]\]) -+ -+ -+ <tag>\s*<name>([^<]*)</name> -+ -+ -+ <image size="extralarge">\s*([^<]*)\s*</image> -+ -+ -+ (.+) -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml b/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml -new file mode 100644 -index 0000000..acb2b4f ---- /dev/null -+++ b/addons/metadata.musicvideos.last.fm/resources/language/English/strings.xml -@@ -0,0 +1,5 @@ -+ -+ -+ Grab album thumbs from fanart.tv -+ Grab album thumbs from Last.fm -+ -diff --git a/addons/metadata.musicvideos.last.fm/resources/settings.xml b/addons/metadata.musicvideos.last.fm/resources/settings.xml -new file mode 100644 -index 0000000..4034620 ---- /dev/null -+++ b/addons/metadata.musicvideos.last.fm/resources/settings.xml -@@ -0,0 +1,5 @@ -+ -+ -+ -+ -+ --- -1.7.10 - - -From 23dbf6ffda52c35dcca0bb24d667ec880bdf6a17 Mon Sep 17 00:00:00 2001 -From: Martijn Kaijser -Date: Sun, 8 Jul 2012 14:09:54 +0200 -Subject: [PATCH 4/4] make artists/album universal scrapers and last.fm - scrapers default - ---- - xbmc/settings/GUISettings.cpp | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp -index 849953c..086b100 100644 ---- a/xbmc/settings/GUISettings.cpp -+++ b/xbmc/settings/GUISettings.cpp -@@ -274,8 +274,8 @@ void CGUISettings::Initialize() - AddBool(ml, "musiclibrary.showcompilationartists", 13414, true); - AddSeparator(ml,"musiclibrary.sep1"); - AddBool(ml,"musiclibrary.downloadinfo", 20192, false); -- AddDefaultAddon(ml, "musiclibrary.albumsscraper", 20193, "metadata.albums.allmusic.com", ADDON_SCRAPER_ALBUMS); -- AddDefaultAddon(ml, "musiclibrary.artistsscraper", 20194, "metadata.artists.allmusic.com", ADDON_SCRAPER_ARTISTS); -+ AddDefaultAddon(ml, "musiclibrary.albumsscraper", 20193, "metadata.album.universal", ADDON_SCRAPER_ALBUMS); -+ AddDefaultAddon(ml, "musiclibrary.artistsscraper", 20194, "metadata.artists.universal", ADDON_SCRAPER_ARTISTS); - AddBool(ml, "musiclibrary.updateonstartup", 22000, false); - AddBool(ml, "musiclibrary.backgroundupdate", 22001, false); - AddSeparator(ml,"musiclibrary.sep2"); -@@ -774,7 +774,7 @@ void CGUISettings::Initialize() - - AddDefaultAddon(NULL, "scrapers.moviesdefault", 21413, "metadata.themoviedb.org", ADDON_SCRAPER_MOVIES); - AddDefaultAddon(NULL, "scrapers.tvshowsdefault", 21414, "metadata.tvdb.com", ADDON_SCRAPER_TVSHOWS); -- AddDefaultAddon(NULL, "scrapers.musicvideosdefault", 21415, "metadata.yahoomusic.com", ADDON_SCRAPER_MUSICVIDEOS); -+ AddDefaultAddon(NULL, "scrapers.musicvideosdefault", 21415, "metadata.musicvideos.last.fm", ADDON_SCRAPER_MUSICVIDEOS); - AddBool(NULL, "scrapers.langfallback", 21416, false); - - // service settings --- -1.7.10 - From b8a9848924833a40a9d0d97367e7fa9b445d90a1 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Mon, 3 Sep 2012 16:49:04 +0200 Subject: [PATCH 17/32] projects/*/options: Remove PVR= option, not more needed we build with PVR support per default (if supported) Signed-off-by: Stephan Raue --- config/functions | 1 - config/options | 3 --- packages/linux/unpack | 6 ------ projects/ATV/options | 14 ++------------ projects/Fusion/options | 14 ++------------ projects/Generic/options | 14 ++------------ projects/Generic_OSS/options | 14 ++------------ projects/ION/options | 14 ++------------ projects/Intel/options | 14 ++------------ projects/RPi/options | 14 ++------------ projects/Ultra/options | 14 ++------------ projects/Virtual/options | 14 ++------------ 12 files changed, 18 insertions(+), 118 deletions(-) diff --git a/config/functions b/config/functions index 8ba7129c935..fba0f2defc1 100644 --- a/config/functions +++ b/config/functions @@ -358,7 +358,6 @@ fi config_message="$config_message\n $dashes$dashes" config_message="$config_message\n - XBMC version:\t\t\t $MEDIACENTER" - config_message="$config_message\n - XBMC PVR/DVB support:\t\t $PVR" config_message="$config_message\n - XBMC nonfree support:\t\t $NONFREE_SUPPORT" config_message="$config_message\n - XBMC DVDCSS support:\t\t\t $DVDCSS_SUPPORT" diff --git a/config/options b/config/options index 04cb2be9ee5..f1ad3221ba3 100644 --- a/config/options +++ b/config/options @@ -9,9 +9,6 @@ else PROJECT="$PROJECT" fi -# you are a noob: 'Yes' is not 'yes' :) -PVR=`echo $PVR | tr A-Z a-z` - # determines TARGET_ARCH, if not forced by user (i386 / x86_64 / arm) # default is i386 if [ -z "$ARCH" ]; then diff --git a/packages/linux/unpack b/packages/linux/unpack index e9cde0ae7b9..9e3d3920fea 100755 --- a/packages/linux/unpack +++ b/packages/linux/unpack @@ -41,12 +41,6 @@ cp $KERNEL_CFG_FILE $LINUX/.config sed -i -e "s|^CONFIG_INITRAMFS_SOURCE=.*$|CONFIG_INITRAMFS_SOURCE=\"$ROOT/$BUILD/image/initramfs.cpio\"|" \ $LINUX/.config -# wipe out DVB and TV stuff if not building PVR version - if [ ! "$PVR" = yes ]; then - sed -i -e "s|^CONFIG_DVB_CORE=.*$|# CONFIG_DVB_CORE is not set|" $LINUX/.config - sed -i -e "s|^CONFIG_VIDEO_DEV=.*$|# CONFIG_VIDEO_DEV is not set|" $LINUX/.config - fi - # disable swap support if not enabled if [ ! "$SWAP_SUPPORT" = yes ]; then sed -i -e "s|^CONFIG_SWAP=.*$|# CONFIG_SWAP is not set|" $LINUX/.config diff --git a/projects/ATV/options b/projects/ATV/options index 902d8290849..55ce6226a80 100755 --- a/projects/ATV/options +++ b/projects/ATV/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -171,10 +167,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx bcm_sta RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx bcm_sta RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -299,10 +292,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Fusion/options b/projects/Fusion/options index c165249efaa..2a784e419d9 100755 --- a/projects/Fusion/options +++ b/projects/Fusion/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Generic/options b/projects/Generic/options index 046a379b728..ebf605b61c9 100755 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx bcm_sta RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx bcm_sta RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Generic_OSS/options b/projects/Generic_OSS/options index 980ac1dc13a..1527c5e497d 100755 --- a/projects/Generic_OSS/options +++ b/projects/Generic_OSS/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/ION/options b/projects/ION/options index 8e6e1e90ccd..3962d6647d2 100755 --- a/projects/ION/options +++ b/projects/ION/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Intel/options b/projects/Intel/options index 5d02edc2966..0047e57dcaa 100755 --- a/projects/Intel/options +++ b/projects/Intel/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/RPi/options b/projects/RPi/options index 6e773bfced5..bd43c53dd94 100755 --- a/projects/RPi/options +++ b/projects/RPi/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -172,10 +168,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -300,10 +293,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Ultra/options b/projects/Ultra/options index a864ae3a579..332d1f9487d 100755 --- a/projects/Ultra/options +++ b/projects/Ultra/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -170,10 +166,7 @@ # asix-ax887xx: Asix AX887xx USB LAN Driver # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -298,10 +291,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" diff --git a/projects/Virtual/options b/projects/Virtual/options index 51010aa0263..bca96c0c0fd 100755 --- a/projects/Virtual/options +++ b/projects/Virtual/options @@ -5,10 +5,6 @@ DISTRONAME="OpenELEC" fi - if [ "$PVR" = yes ]; then - DISTRONAME="${DISTRONAME}_PVR" - fi - # Welcome Message for e.g. SSH Server (up to 5 Lines) GREETING0="##############################################" GREETING1="# OpenELEC - The living room PC for everyone #" @@ -166,10 +162,7 @@ # vboxguest: Oracle VM VirtualBox Guest Additions / Graphics Card # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="asix-ax887xx AF9035 vboxguest" - ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU vboxguest" - if [ "$PVR" = yes ]; then - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" - fi + ADDITIONAL_DRIVERS="asix-ax887xx RTL8192CU vboxguest AF9035 A867 aver_h826d RTL2832 hdhomerun-driver vtuner-driver" # build with network support (yes / no) NETWORK="yes" @@ -294,10 +287,7 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware" - if [ "$PVR" = yes ]; then - FIRMWARE="$FIRMWARE dvb-firmware" - fi + FIRMWARE="misc-firmware wlan-firmware dvb-firmware" # build with lm_sensors hardware monitoring support (yes / no) SENSOR_SUPPORT="yes" From 382c58b23dffecdb8b9431ae12f5e9426eea73ab Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Mon, 3 Sep 2012 23:41:59 +0300 Subject: [PATCH 18/32] Revert "hts-tvheadend: update to hts-tvheadend-7630970" This reverts commit 95875b3fa307e8c7978af1ba9b41254572a4941b. --- .../service/multimedia/hts-tvheadend/addon | 2 +- .../service/multimedia/hts-tvheadend/build | 2 +- .../multimedia/hts-tvheadend/changelog.txt | 4 - .../service/multimedia/hts-tvheadend/meta | 4 +- ...090-add_CH-GA-Weissenstein_muxes-0.1.patch | 55 ++++ ...-78213a0-091-cwc-connection-attempt.patch} | 0 ...-092-deliver_raw_teletext_to_clients.patch | 146 ++++++++++ ...213a0-093-add_support_for_IPTV_radio.patch | 257 ++++++++++++++++++ 8 files changed, 462 insertions(+), 8 deletions(-) create mode 100644 packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch rename packages/addons/service/multimedia/hts-tvheadend/patches/{hts-tvheadend-0f3c6f7-091-cwc-connection-attempt.patch => hts-tvheadend-78213a0-091-cwc-connection-attempt.patch} (100%) create mode 100644 packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch create mode 100644 packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch diff --git a/packages/addons/service/multimedia/hts-tvheadend/addon b/packages/addons/service/multimedia/hts-tvheadend/addon index 1275f495fbf..839093f68d9 100755 --- a/packages/addons/service/multimedia/hts-tvheadend/addon +++ b/packages/addons/service/multimedia/hts-tvheadend/addon @@ -28,4 +28,4 @@ mkdir -p $ADDON_BUILD/$PKG_ADDON_ID cp -PR $PKG_DIR/config/dvr-config $ADDON_BUILD/$PKG_ADDON_ID/dvr-config mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin - cp -P $PKG_BUILD/build.linux/tvheadend $ADDON_BUILD/$PKG_ADDON_ID/bin/tvheadend + cp -P $PKG_BUILD/build.linux/tvheadend.bundle $ADDON_BUILD/$PKG_ADDON_ID/bin/tvheadend diff --git a/packages/addons/service/multimedia/hts-tvheadend/build b/packages/addons/service/multimedia/hts-tvheadend/build index 17499cc211c..881643a2e71 100755 --- a/packages/addons/service/multimedia/hts-tvheadend/build +++ b/packages/addons/service/multimedia/hts-tvheadend/build @@ -34,7 +34,7 @@ cd $PKG_BUILD --arch=$TARGET_ARCH \ --cpu=$TARGET_CPU \ --cc=$TARGET_CC \ - --enable-bundle \ --release make +make build.linux/tvheadend.bundle diff --git a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt index 3be7fbace09..9f5f9dfdc44 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt +++ b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt @@ -1,7 +1,3 @@ -2.1.4 -- update to hts-tvheadend-7630970 -- add an option to wait for more than 1 adapters to appear - 2.1.3 - update to hts-tvheadend-78213a0 diff --git a/packages/addons/service/multimedia/hts-tvheadend/meta b/packages/addons/service/multimedia/hts-tvheadend/meta index 50305002b1c..43c479c8c76 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/meta +++ b/packages/addons/service/multimedia/hts-tvheadend/meta @@ -19,8 +19,8 @@ ################################################################################ PKG_NAME="hts-tvheadend" -PKG_VERSION="7630970" -PKG_REV="4" +PKG_VERSION="78213a0" +PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.lonelycoder.com/hts/tvheadend_overview.html" diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch new file mode 100644 index 00000000000..e8c60505154 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-090-add_CH-GA-Weissenstein_muxes-0.1.patch @@ -0,0 +1,55 @@ +diff -Naur hts-tvheadend-c88a646/src/linuxtv_muxes.h hts-tvheadend-c88a646.patch/src/linuxtv_muxes.h +--- hts-tvheadend-c88a646/src/linuxtv_muxes.h 2011-09-26 20:18:12.000000000 +0200 ++++ hts-tvheadend-c88a646.patch/src/linuxtv_muxes.h 2011-10-18 13:40:37.768853992 +0200 +@@ -12001,6 +12001,39 @@ + { .freq = 573000000, .symrate = 5217000, .fec = 0, .constellation = 5}, + }; + ++static const struct mux muxes_DVBC_ch_GA_Weissenstein[] = { ++ { .freq = 450000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 506000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 514000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 522000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 530000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 538000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 554000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 562000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 570000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 578000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 586000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 594000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 602000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 610000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 618000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 626000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 634000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 642000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 650000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 658000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 666000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 674000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 682000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 690000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 698000000, .symrate = 6900000, .fec = 0, .constellation = 3}, ++ { .freq = 698000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 706000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 714000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 722000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++ { .freq = 730000000, .symrate = 6900000, .fec = 0, .constellation = 5}, ++}; ++ + static const struct mux muxes_DVBC_ch_Rega_Sense[] = { + { .freq = 434000000, .symrate = 6900000, .fec = 0, .constellation = 3}, + { .freq = 714000000, .symrate = 6900000, .fec = 0, .constellation = 3}, +@@ -12881,6 +12914,11 @@ + + static const struct network networks_DVBC_ch[] = { + { ++ .name = "GA-Weissenstein", ++ .muxes = muxes_DVBC_ch_GA_Weissenstein, ++ .nmuxes = sizeof(muxes_DVBC_ch_GA_Weissenstein) / sizeof(struct mux), ++ }, ++ { + .name = "Rega-Sense", + .muxes = muxes_DVBC_ch_Rega_Sense, + .nmuxes = sizeof(muxes_DVBC_ch_Rega_Sense) / sizeof(struct mux), diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-0f3c6f7-091-cwc-connection-attempt.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-091-cwc-connection-attempt.patch similarity index 100% rename from packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-0f3c6f7-091-cwc-connection-attempt.patch rename to packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-091-cwc-connection-attempt.patch diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch new file mode 100644 index 00000000000..17358b08b32 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-092-deliver_raw_teletext_to_clients.patch @@ -0,0 +1,146 @@ +From 3b407aa2053b1db3316873acd05c64319676eb34 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= +Date: Fri, 30 Sep 2011 12:56:01 +0200 +Subject: [PATCH 1/2] Deliver raw teletext to clients that are able to display + it (e.g. XBMC) + +--- + src/parsers.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/tsdemux.c | 7 +++---- + 2 files changed, 58 insertions(+), 4 deletions(-) + +diff --git a/src/parsers.c b/src/parsers.c +index 9b7337d..68c7996 100644 +--- a/src/parsers.c ++++ b/src/parsers.c +@@ -102,6 +102,9 @@ static void parse_aac(service_t *t, elementary_stream_t *st, const uint8_t *data + static void parse_subtitles(service_t *t, elementary_stream_t *st, + const uint8_t *data, int len, int start); + ++static void parse_teletext(service_t *t, elementary_stream_t *st, ++ const uint8_t *data, int len, int start); ++ + static int parse_mpa(service_t *t, elementary_stream_t *st, size_t len, + uint32_t next_startcode, int sc_offset); + +@@ -158,6 +161,10 @@ static int parse_pes_header(service_t *t, elementary_stream_t *st, + parse_aac(t, st, data, len, start); + break; + ++ case SCT_TELETEXT: ++ parse_teletext(t, st, data, len, start); ++ break; ++ + default: + break; + } +@@ -1232,6 +1239,54 @@ static int parse_pes_header(service_t *t, elementary_stream_t *st, + } + } + ++/** ++ * Teletext parser ++ */ ++static void ++parse_teletext(service_t *t, elementary_stream_t *st, const uint8_t *data, ++ int len, int start) ++{ ++ th_pkt_t *pkt; ++ int psize, hlen; ++ const uint8_t *buf; ++ const uint8_t *d; ++ if(start) { ++ st->es_parser_state = 1; ++ st->es_buf.sb_err = 0; ++ st->es_parser_ptr = 0; ++ sbuf_reset(&st->es_buf); ++ } ++ ++ if(st->es_parser_state == 0) ++ return; ++ ++ sbuf_append(&st->es_buf, data, len); ++ ++ if(st->es_buf.sb_ptr < 6) ++ return; ++ d = st->es_buf.sb_data; ++ ++ psize = d[4] << 8 | d[5]; ++ ++ if(st->es_buf.sb_ptr != psize + 6) ++ return; ++ ++ st->es_parser_state = 0; ++ ++ hlen = parse_pes_header(t, st, d + 6, st->es_buf.sb_ptr - 6); ++ if(hlen < 0) ++ return; ++ ++ psize -= hlen; ++ buf = d + 6 + hlen; ++ ++ if(psize >= 46) { ++ ++ pkt = pkt_alloc(buf, psize, st->es_curpts, st->es_curdts); ++ pkt->pkt_commercial = t->s_tt_commercial_advice; ++ parser_deliver(t, st, pkt); ++ } ++} + + /** + * +diff --git a/src/tsdemux.c b/src/tsdemux.c +index 897fe1d..5fdaf8b 100644 +--- a/src/tsdemux.c ++++ b/src/tsdemux.c +@@ -110,11 +110,10 @@ + got_section, st); + break; + +- case SCT_TELETEXT: +- teletext_input(t, st, tsb); +- break; +- + default: ++ if(st->es_type == SCT_TELETEXT) ++ teletext_input(t, st, tsb); ++ + if(off > 188) + break; + +-- +1.7.5.4 + + +From a8026cd5b412c5096b0904f060ad5ffccdb883cf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jernej=20Fija=C4=8Dko?= +Date: Thu, 17 Nov 2011 08:25:31 +0100 +Subject: [PATCH 2/2] Disable teletext recording to prevent issues with other + elementary streams. Temporary until a better solution + is found. + +--- + src/plumbing/globalheaders.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +diff --git a/src/plumbing/globalheaders.c b/src/plumbing/globalheaders.c +index 703591b..7f183d4 100644 +--- a/src/plumbing/globalheaders.c ++++ b/src/plumbing/globalheaders.c +@@ -202,6 +202,12 @@ + pkt->pkt_componentindex); + assert(ssc != NULL); + ++ if(ssc->ssc_type == SCT_TELETEXT) { ++ free(sm); ++ ssc->ssc_disabled = 1; ++ break; ++ } ++ + pkt = convertpkt(ssc, pkt); + + apply_header(ssc, pkt); +-- +1.7.5.4 + + diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch new file mode 100644 index 00000000000..67810ef2d89 --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-093-add_support_for_IPTV_radio.patch @@ -0,0 +1,257 @@ +From bb048589ab4e09e69b2fba3f639e8287ea9cc7c3 Mon Sep 17 00:00:00 2001 +From: Tadej Novak +Date: Thu, 26 Jan 2012 18:39:09 +0100 +Subject: [PATCH 1/2] IPTV Radio support + +Added service type for IPTV and IPTV radio for easier access in +some software (like XBMC). +--- + src/iptv_input.c | 6 ++++++ + src/service.c | 9 +++++++-- + src/service.h | 2 ++ + src/webui/extjs.c | 10 +++++++++- + src/webui/static/app/iptv.js | 11 +++++++++-- + 5 files changed, 33 insertions(+), 5 deletions(-) + +diff --git a/src/iptv_input.c b/src/iptv_input.c +index 0bfc311..361a151 100644 +--- a/src/iptv_input.c ++++ b/src/iptv_input.c +@@ -428,6 +428,7 @@ + inet_ntop(AF_INET6, &t->s_iptv_group6, abuf6, sizeof(abuf6)); + htsmsg_add_str(m, "group", abuf6); + } ++ htsmsg_add_u32(m, "radio", t->s_servicetype == ST_IPTV_RADIO); + if(t->s_ch != NULL) { + htsmsg_add_str(m, "channelname", t->s_ch->ch_name); + htsmsg_add_u32(m, "mapped", 1); +@@ -591,6 +592,11 @@ + if(!htsmsg_get_u32(c, "port", &u32)) + t->s_iptv_port = u32; + ++ if(!htsmsg_get_u32(c, "radio", &u32) && u32) ++ t->s_servicetype = ST_IPTV_RADIO; ++ else ++ t->s_servicetype = ST_IPTV; ++ + pthread_mutex_lock(&t->s_stream_mutex); + service_make_nicename(t); + psi_load_service_settings(c, t); +diff --git a/src/service.c b/src/service.c +index 1a405d1..6899e2e 100644 +--- a/src/service.c ++++ b/src/service.c +@@ -732,6 +732,8 @@ + { "HDTV", ST_HDTV }, + { "SDTV-AC", ST_AC_SDTV }, + { "HDTV-AC", ST_AC_HDTV }, ++ { "IPTV", ST_IPTV }, ++ { "IPTV Radio", ST_IPTV_RADIO }, + }; + + const char * +@@ -750,7 +752,8 @@ + t->s_servicetype == ST_SDTV || + t->s_servicetype == ST_HDTV || + t->s_servicetype == ST_AC_SDTV || +- t->s_servicetype == ST_AC_HDTV; ++ t->s_servicetype == ST_AC_HDTV || ++ t->s_servicetype == ST_IPTV; + } + + /** +@@ -759,7 +762,9 @@ + int + service_is_radio(service_t *t) + { +- return t->s_servicetype == ST_RADIO; ++ return ++ t->s_servicetype == ST_RADIO || ++ t->s_servicetype == ST_IPTV_RADIO; + } + + /** +diff --git a/src/service.h b/src/service.h +index 2185e42..186278d 100644 +--- a/src/service.h ++++ b/src/service.h +@@ -318,6 +318,8 @@ typedef void (pid_section_callback_t)(struct service *t, + ST_HDTV = 0x11, /* HDTV (MPEG2) */ + ST_AC_SDTV = 0x16, /* Advanced codec SDTV */ + ST_AC_HDTV = 0x19, /* Advanced codec HDTV */ ++ ST_IPTV = 0x30, /* IPTV */ ++ ST_IPTV_RADIO = 0x31, /* Radio over IPTV */ + } s_servicetype; + + +diff --git a/src/webui/extjs.c b/src/webui/extjs.c +index 3ed9f8b..4596005 100644 +--- a/src/webui/extjs.c ++++ b/src/webui/extjs.c +@@ -1313,7 +1313,14 @@ + } + save = 1; + } +- ++ if(!htsmsg_get_u32(c, "radio", &u32)) { ++ if(u32) ++ t->s_servicetype = ST_IPTV_RADIO; ++ else ++ t->s_servicetype = ST_IPTV; ++ save = 1; ++ } ++ + + save |= tvh_str_update(&t->s_iptv_iface, htsmsg_get_str(c, "interface")); + if(save) +@@ -1347,6 +1354,7 @@ + } + + htsmsg_add_u32(r, "port", t->s_iptv_port); ++ htsmsg_add_u32(r, "radio", t->s_servicetype == ST_IPTV_RADIO); + htsmsg_add_u32(r, "enabled", t->s_enabled); + return r; + } +diff --git a/src/webui/static/app/iptv.js b/src/webui/static/app/iptv.js +index acdbfc0..b29e0b9 100644 +--- a/src/webui/static/app/iptv.js ++++ b/src/webui/static/app/iptv.js +@@ -11,6 +11,12 @@ tvheadend.iptv = function(adapterId) { + width: 45 + }); + ++ var radioColumn = new Ext.grid.CheckColumn({ ++ header: "Radio", ++ dataIndex: 'radio', ++ width: 45 ++ }); ++ + var actions = new Ext.ux.grid.RowActions({ + header:'', + dataIndex: 'actions', +@@ -82,6 +88,7 @@ tvheadend.iptv = function(adapterId) { + maxValue: 65535 + }) + }, ++ radioColumn, + { + header: "Service ID", + dataIndex: 'sid', +@@ -105,7 +112,7 @@ tvheadend.iptv = function(adapterId) { + cm.defaultSortable = true; + + var rec = Ext.data.Record.create([ +- 'id', 'enabled', 'channelname', 'interface', 'group', 'port', ++ 'id', 'enabled', 'channelname', 'interface', 'group', 'port', 'radio', + 'sid', 'pmt', 'pcr' + ]); + +@@ -246,7 +253,7 @@ tvheadend.iptv = function(adapterId) { + stripeRows: true, + title: 'IPTV', + iconCls: 'iptv', +- plugins: [enabledColumn, actions], ++ plugins: [enabledColumn, radioColumn, actions], + store: store, + clicksToEdit: 2, + cm: cm, +-- +1.7.5.4 + + +From 18473dd11d983aecb6db6e49b454a5d6bb1a329f Mon Sep 17 00:00:00 2001 +From: Tadej Novak +Date: Mon, 30 Jan 2012 16:55:25 +0100 +Subject: [PATCH 2/2] Use the same service type for all radio types + +Tvheadend now uses same radio type ST_RADIO for DVB and IPTV radios. +Otherwise IPTV streams have ST_IPTV type. +--- + src/iptv_input.c | 4 ++-- + src/service.c | 5 +---- + src/service.h | 1 - + src/webui/extjs.c | 4 ++-- + 4 files changed, 5 insertions(+), 9 deletions(-) + +diff --git a/src/iptv_input.c b/src/iptv_input.c +index 361a151..aeb0ab2 100644 +--- a/src/iptv_input.c ++++ b/src/iptv_input.c +@@ -428,7 +428,7 @@ + inet_ntop(AF_INET6, &t->s_iptv_group6, abuf6, sizeof(abuf6)); + htsmsg_add_str(m, "group", abuf6); + } +- htsmsg_add_u32(m, "radio", t->s_servicetype == ST_IPTV_RADIO); ++ htsmsg_add_u32(m, "radio", t->s_servicetype == ST_RADIO); + if(t->s_ch != NULL) { + htsmsg_add_str(m, "channelname", t->s_ch->ch_name); + htsmsg_add_u32(m, "mapped", 1); +@@ -593,7 +593,7 @@ + t->s_iptv_port = u32; + + if(!htsmsg_get_u32(c, "radio", &u32) && u32) +- t->s_servicetype = ST_IPTV_RADIO; ++ t->s_servicetype = ST_RADIO; + else + t->s_servicetype = ST_IPTV; + +diff --git a/src/service.c b/src/service.c +index 6899e2e..015cd46 100644 +--- a/src/service.c ++++ b/src/service.c +@@ -733,7 +733,6 @@ + { "SDTV-AC", ST_AC_SDTV }, + { "HDTV-AC", ST_AC_HDTV }, + { "IPTV", ST_IPTV }, +- { "IPTV Radio", ST_IPTV_RADIO }, + }; + + const char * +@@ -762,9 +761,7 @@ + int + service_is_radio(service_t *t) + { +- return +- t->s_servicetype == ST_RADIO || +- t->s_servicetype == ST_IPTV_RADIO; ++ return t->s_servicetype == ST_RADIO; + } + + /** +diff --git a/src/service.h b/src/service.h +index 186278d..40d1174 100644 +--- a/src/service.h ++++ b/src/service.h +@@ -319,7 +319,6 @@ typedef void (pid_section_callback_t)(struct service *t, + ST_AC_SDTV = 0x16, /* Advanced codec SDTV */ + ST_AC_HDTV = 0x19, /* Advanced codec HDTV */ + ST_IPTV = 0x30, /* IPTV */ +- ST_IPTV_RADIO = 0x31, /* Radio over IPTV */ + } s_servicetype; + + +diff --git a/src/webui/extjs.c b/src/webui/extjs.c +index 4596005..4487deb 100644 +--- a/src/webui/extjs.c ++++ b/src/webui/extjs.c +@@ -1315,7 +1315,7 @@ + } + if(!htsmsg_get_u32(c, "radio", &u32)) { + if(u32) +- t->s_servicetype = ST_IPTV_RADIO; ++ t->s_servicetype = ST_RADIO; + else + t->s_servicetype = ST_IPTV; + save = 1; +@@ -1354,7 +1354,7 @@ + } + + htsmsg_add_u32(r, "port", t->s_iptv_port); +- htsmsg_add_u32(r, "radio", t->s_servicetype == ST_IPTV_RADIO); ++ htsmsg_add_u32(r, "radio", t->s_servicetype == ST_RADIO); + htsmsg_add_u32(r, "enabled", t->s_enabled); + return r; + } +-- +1.7.5.4 + From 2464f5e37c6de0c596d6ae3579b487530a8dd1dc Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Tue, 4 Sep 2012 00:02:36 +0300 Subject: [PATCH 19/32] hts-tvheadend: add patch to compile with gcc 4.7.1 --- .../hts-tvheadend-78213a0-094-gcc.4.7.1.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch diff --git a/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch new file mode 100644 index 00000000000..0403fa1951a --- /dev/null +++ b/packages/addons/service/multimedia/hts-tvheadend/patches/hts-tvheadend-78213a0-094-gcc.4.7.1.patch @@ -0,0 +1,18 @@ +Author: Adam Sutton +Date: Sun Jul 29 20:37:00 2012 +0100 + + Fix false trigger of uninit var, detected using gcc v4.7.1 (compiling openelec tvh add-on), reported by seo. + +diff --git a/src/htsp.c b/src/htsp.c +index b9fc3e1..ae5bd51 100644 +--- a/src/htsp.c ++++ b/src/htsp.c +@@ -1160,7 +1160,7 @@ htsp_read_message(htsp_connection_t *htsp, htsmsg_t **mp, int timeout) + static int + htsp_read_loop(htsp_connection_t *htsp) + { +- htsmsg_t *m, *reply; ++ htsmsg_t *m = NULL, *reply; + int r, i; + const char *method; + From ffc4e7c3c37d6800f3b2d986647f3decb2070799 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Mon, 3 Sep 2012 23:58:11 +0300 Subject: [PATCH 20/32] hts-tvheadend: bump version --- packages/addons/service/multimedia/hts-tvheadend/changelog.txt | 3 +++ packages/addons/service/multimedia/hts-tvheadend/meta | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt index 9f5f9dfdc44..d0888f10415 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/changelog.txt +++ b/packages/addons/service/multimedia/hts-tvheadend/changelog.txt @@ -1,3 +1,6 @@ +2.1.5 +- add an option to wait for more than 1 adapters to appear + 2.1.3 - update to hts-tvheadend-78213a0 diff --git a/packages/addons/service/multimedia/hts-tvheadend/meta b/packages/addons/service/multimedia/hts-tvheadend/meta index 43c479c8c76..b20e70d6075 100644 --- a/packages/addons/service/multimedia/hts-tvheadend/meta +++ b/packages/addons/service/multimedia/hts-tvheadend/meta @@ -20,7 +20,7 @@ PKG_NAME="hts-tvheadend" PKG_VERSION="78213a0" -PKG_REV="3" +PKG_REV="5" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.lonelycoder.com/hts/tvheadend_overview.html" From c97e3f3412cc5ecaf2ba2a6c832d8a060507359c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 4 Sep 2012 23:25:05 +0200 Subject: [PATCH 21/32] xbmc-frodo-pvr: merge with package 'xbmc-frodo' Signed-off-by: Stephan Raue --- .../xbmc-frodo-theme-Confluence/meta | 6 +- packages/mediacenter/xbmc-frodo/install | 4 +- packages/mediacenter/xbmc-frodo/meta | 15 +- ...2-add_remote_irtrans_mediacenter-0.1.patch | 52 --- ...-add_support_to_specify_GIT_REV-0.1.patch} | 0 ...o-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch} | 0 ...rodo-8f0c91b-311-fix_rsxs_build-0.1.patch} | 0 ...-texturepacker-hostflags-and-rework.patch} | 0 ...0c91b-402-enable_yasm_in_ffmpeg-0.1.patch} | 0 ...ONOPTIMIZE_with_external_Python-0.1.patch} | 0 ...-8f0c91b-452-change_lcd_content-0.1.patch} | 0 ...1b-453-add_openelec.tv_RSS_news-0.1.patch} | 0 ...o-8f0c91b-454-disable_backslash-0.1.patch} | 0 ...f0c91b-457-fix_connection_check-0.1.patch} | 0 ...8f0c91b-463-add_remote_devinput-0.1.patch} | 0 ...4-add_eject_keymapping_for_lirc-0.1.patch} | 0 ...frodo-8f0c91b-981-toggleButtonState.patch} | 0 ...xbmc-frodo-8f0c91b-999-crosscompile.patch} | 0 ...1-add_support_to_specify_GIT_REV-0.1.patch | 39 --- ...vr-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch | 119 ------- ...o-pvr-8f0c91b-311-fix_rsxs_build-0.1.patch | 12 - ...1-texturepacker-hostflags-and-rework.patch | 190 ----------- ...f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch | 21 -- ...HONOPTIMIZE_with_external_Python-0.1.patch | 18 -- ...r-8f0c91b-452-change_lcd_content-0.1.patch | 12 - ...91b-453-add_openelec.tv_RSS_news-0.1.patch | 11 - ...vr-8f0c91b-454-disable_backslash-0.1.patch | 12 - ...8f0c91b-457-fix_connection_check-0.1.patch | 15 - ...2-add_remote_irtrans_mediacenter-0.1.patch | 52 --- ...-8f0c91b-463-add_remote_devinput-0.1.patch | 71 ---- ...64-add_eject_keymapping_for_lirc-0.1.patch | 11 - ...do-pvr-8f0c91b-981-toggleButtonState.patch | 304 ------------------ ...c-frodo-pvr-8f0c91b-999-crosscompile.patch | 23 -- 33 files changed, 7 insertions(+), 980 deletions(-) delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-001-add_support_to_specify_GIT_REV-0.1.patch => xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-303-fix_libdvd_xFLAGS-0.1.patch => xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-311-fix_rsxs_build-0.1.patch => xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch => xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-402-enable_yasm_in_ffmpeg-0.1.patch => xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch => xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-452-change_lcd_content-0.1.patch => xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-453-add_openelec.tv_RSS_news-0.1.patch => xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-454-disable_backslash-0.1.patch => xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-457-fix_connection_check-0.1.patch => xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-463-add_remote_devinput-0.1.patch => xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-464-add_eject_keymapping_for_lirc-0.1.patch => xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-981-toggleButtonState.patch => xbmc-frodo-8f0c91b-981-toggleButtonState.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-58abd46-999-crosscompile.patch => xbmc-frodo-8f0c91b-999-crosscompile.patch} (100%) delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-311-fix_rsxs_build-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-321-texturepacker-hostflags-and-rework.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-452-change_lcd_content-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-454-disable_backslash-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-457-fix_connection_check-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-462-add_remote_irtrans_mediacenter-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-463-add_remote_devinput-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-981-toggleButtonState.patch delete mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta index f7a29399433..97355bda77d 100644 --- a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo-theme-Confluence" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-8f0c91b" -else - PKG_VERSION="58abd46" -fi +PKG_VERSION="8f0c91b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-frodo/install b/packages/mediacenter/xbmc-frodo/install index e492a76b97e..d17d97fccb5 100755 --- a/packages/mediacenter/xbmc-frodo/install +++ b/packages/mediacenter/xbmc-frodo/install @@ -29,9 +29,7 @@ mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin mkdir -p $INSTALL/usr/lib/xbmc cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc diff --git a/packages/mediacenter/xbmc-frodo/meta b/packages/mediacenter/xbmc-frodo/meta index fc1020db0fb..b793564755f 100644 --- a/packages/mediacenter/xbmc-frodo/meta +++ b/packages/mediacenter/xbmc-frodo/meta @@ -19,11 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo" -if [ "$PVR" = yes ]; then - PKG_VERSION="pvr-8f0c91b" -else - PKG_VERSION="58abd46" -fi +PKG_VERSION="8f0c91b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" @@ -46,6 +42,10 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS Imaging" PKG_DEPENDS="$PKG_DEPENDS simplejson" +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" + if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" @@ -176,8 +176,3 @@ fi if [ "$XVBA" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch deleted file mode 100644 index 0edef5a7a52..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-462-add_remote_irtrans_mediacenter-0.1.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -Naur xbmc-pvr-3513480/system/Lircmap.xml xbmc-pvr-3513480.patch/system/Lircmap.xml ---- xbmc-pvr-3513480/system/Lircmap.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/system/Lircmap.xml 2011-04-25 05:31:39.632429078 +0200 -@@ -409,4 +409,48 @@ - KEY_YELLOW - KEY_BLUE - -+ -+ pause -+ stop -+ fwd -+ rew -+ left -+ right -+ up -+ down -+ -+ ch+ -+ ch- -+ back -+

clear -+ play -+ info -+ next -+ prev -+ teletext -+ ehome -+ rec -+ vol+ -+ vol- -+ mute -+ power -+ video -+ music -+ pictures -+ tv -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 0 -+ red -+ green -+ yellow -+ blue -+ - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-402-enable_yasm_in_ffmpeg-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-464-add_eject_keymapping_for_lirc-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-981-toggleButtonState.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-981-toggleButtonState.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-981-toggleButtonState.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-999-crosscompile.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-999-crosscompile.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-58abd46-999-crosscompile.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch deleted file mode 100644 index c013e0ae3aa..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff -Naur xbmc-9389dc8/configure.in xbmc-9389dc8.patch/configure.in ---- xbmc-9389dc8/configure.in 2011-09-01 17:21:47.000000000 +0200 -+++ xbmc-9389dc8.patch/configure.in 2011-09-01 23:30:40.419399392 +0200 -@@ -428,6 +428,14 @@ - esac - AC_SUBST([ARCH]) - -+AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) -+if test "$HAVE_GIT" = "yes" -a "$GIT_REV" = ""; then -+ GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') -+elif test "$GIT_REV" = ""; then -+ GIT_REV="Unknown" -+fi -+final_message="$final_message\n git Rev.:\t${GIT_REV}" -+ - # platform debug flags - if test "$use_debug" = "yes"; then - final_message="$final_message\n Debugging:\tYes" -@@ -1177,7 +1185,6 @@ - fi - fi - --AC_CHECK_PROG(HAVE_GIT,git,"yes","no",) - - # Checks for header files. - AC_HEADER_DIRENT -@@ -1408,12 +1415,6 @@ - final_message="$final_message\n Avahi:\tNo" - fi - --if test "$HAVE_GIT" = "yes"; then -- GIT_REV=$(git --no-pager log --abbrev=7 -n 1 --pretty=format:"%h %ci" HEAD | awk '{gsub("-", "");print $2"-"$1}') --fi --if test "$GIT_REV" = ""; then -- GIT_REV="Unknown" --fi - if test "$host_vendor" = "apple"; then - echo "#define GIT_REV \"$GIT_REV\"" > git_revision.h - else diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch deleted file mode 100644 index 5e76acefe40..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch +++ /dev/null @@ -1,119 +0,0 @@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdcss/src/libdvdcss.pc.in 2011-04-25 05:01:20.091837122 +0200 -@@ -6,5 +6,5 @@ - Name: libdvdcss - Description: DVD access and decryption library. - Version: @VERSION@ --Libs: -L${libdir} -ldvdcss --Cflags: -I{includedir} -I${includedir}/@PACKAGE@ -+Libs: -ldvdcss -+Cflags: -I. -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config2.sh 2011-04-25 05:01:20.549828701 +0200 -@@ -56,17 +56,17 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $dvdread_cflags $extracflags $threadcflags -+ echo $dvdread_cflags $extracflags $threadcflags - fi - - if test "$echo_minicflags" = "yes"; then -- echo -I$prefix/include -I$prefix/include/dvdnav $extracflags $threadcflags -+ echo $extracflags $threadcflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir -ldvdnav $dvdread_libs $threadlib -+ echo -ldvdnav $dvdread_libs $threadlib - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L$libdir -ldvdnavmini $threadlib -+ echo -ldvdnavmini $threadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav-config.in 2011-04-25 05:01:20.624827321 +0200 -@@ -76,13 +76,13 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -I@includedir@/libdvdread @THREAD_CFLAGS@ -+ echo @THREAD_CFLAGS@ - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdnav -ldvdread @THREAD_LIBS@ -+ echo -ldvdnav -ldvdread @THREAD_LIBS@ - fi - - if test "$echo_minilibs" = "yes"; then -- echo -L@libdir@ -ldvdnavmini @THREAD_LIBS@ -+ echo -ldvdnavmini @THREAD_LIBS@ - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnavmini.pc.in 2011-04-25 05:01:21.042819641 +0200 -@@ -7,5 +7,5 @@ - Description: DVD Navigation mini library - Version: @VERSION@ - --Cflags: -I${includedir} @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @DVDREAD_CFLAGS@ @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdnav/misc/dvdnav.pc.in 2011-04-25 05:01:21.262815601 +0200 -@@ -8,5 +8,5 @@ - Version: @VERSION@ - - Requires.private: dvdread >= 4.1.2 --Cflags: -I${includedir} @THREAD_CFLAGS@ --Libs: -L${libdir} -ldvdnav @THREAD_LIBS@ -+Cflags: @THREAD_CFLAGS@ -+Libs: -ldvdnav @THREAD_LIBS@ -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.in 2011-04-25 05:01:21.278815307 +0200 -@@ -72,9 +72,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I@includedir@ -+ echo "" - fi - - if test "$echo_libs" = "yes"; then -- echo -L@libdir@ -ldvdread -+ echo -ldvdread - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread-config.sh 2011-04-25 05:01:21.278815307 +0200 -@@ -48,9 +48,9 @@ - fi - - if test "$echo_cflags" = "yes"; then -- echo -I$prefix/include $extracflags -+ echo $extracflags - fi - - if test "$echo_libs" = "yes"; then -- echo -L$libdir $dvdreadlib -+ echo $dvdreadlib - fi -diff -Naur xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in ---- xbmc-pvr-3513480/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 02:36:42.000000000 +0200 -+++ xbmc-pvr-3513480.patch/lib/libdvd/libdvdread/misc/dvdread.pc.in 2011-04-25 05:01:21.279815289 +0200 -@@ -7,5 +7,5 @@ - Description: Low level DVD access library - Version: @VERSION@ - --Cflags: -I${includedir} --Libs: -L${libdir} -ldvdread -+Cflags: -I. -+Libs: -ldvdread diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-311-fix_rsxs_build-0.1.patch deleted file mode 100644 index fe0ee49cab6..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-311-fix_rsxs_build-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h ---- xbmc-dab646e/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-09-27 15:56:19.000000000 +0200 -+++ xbmc-dab646e.patch/xbmc/screensavers/rsxs-0.9/lib/argp-namefrob.h 2011-10-16 02:13:13.805433847 +0200 -@@ -17,7 +17,7 @@ - with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - --#if !_LIBC -+#if 0 - /* This code is written for inclusion in gnu-libc, and uses names in the - namespace reserved for libc. If we're not compiling in libc, define those - names to be the normal ones instead. */ diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-321-texturepacker-hostflags-and-rework.patch deleted file mode 100644 index cbe5891222d..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-321-texturepacker-hostflags-and-rework.patch +++ /dev/null @@ -1,190 +0,0 @@ -diff -Naur xbmc-frodo-433f681/configure.in xbmc-frodo-433f681.patch/configure.in ---- xbmc-frodo-433f681/configure.in 2012-06-15 02:52:26.000000000 +0200 -+++ xbmc-frodo-433f681.patch/configure.in 2012-06-19 05:26:41.472596903 +0200 -@@ -405,6 +405,12 @@ - [use_texturepacker=$enableval], - [use_texturepacker=auto]) - -+AC_ARG_WITH([texturepacker-root], -+ [AS_HELP_STRING([--with-texturepacker-root], -+ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], -+ [use_texturepacker_root=$withval], -+ [use_texturepacker_root=$prefix]) -+ - AC_ARG_WITH([lirc-device], - [AS_HELP_STRING([--with-lirc-device=file], - [specify the default LIRC device (default is /dev/lircd)])], -@@ -516,8 +522,7 @@ - use_cpu=cortex-a8 - check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] - if test "x$check_sdl_arch" = "xi386"; then -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" -+ use_texturepacker_root="/opt/local" - else - use_texturepacker=no - fi -@@ -533,8 +538,6 @@ - *86*-apple-darwin*) - use_joystick=no - use_vtbdecoder=no -- use_texturepacker_native=yes -- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" - ARCH="x86-osx" - AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") - ;; -@@ -1756,13 +1759,13 @@ - - USE_TEXTUREPACKER_NATIVE=0 - if test "x$use_texturepacker" != "xno"; then -- final_message="$final_message\n TexturePacker:Yes" - USE_TEXTUREPACKER=1 -- if test "x$use_texturepacker_native" = "xyes"; then -+ if test "x$cross_compiling" = "xyes"; then - USE_TEXTUREPACKER_NATIVE=1 -- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then -- USE_TEXTUREPACKER_NATIVE_ROOT= -- fi -+ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" -+ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" -+ else -+ final_message="$final_message\n TexturePacker:Yes" - fi - else - final_message="$final_message\n TexturePacker:No" -diff -Naur xbmc-frodo-433f681/lib/libsquish/Makefile.in xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in ---- xbmc-frodo-433f681/lib/libsquish/Makefile.in 2012-06-15 02:51:53.000000000 +0200 -+++ xbmc-frodo-433f681.patch/lib/libsquish/Makefile.in 2012-06-19 05:42:20.313119617 +0200 -@@ -11,31 +11,34 @@ - singlecolourfit.cpp \ - squish.cpp - --CXXFLAGS+=-I. -+LIB = libsquish.a -+NATIVE_LIB = libsquish-native.so -+CLEAN_FILES += $(NATIVE_LIB) -+ -+HOST_CXX ?= g++ -+CXXFLAGS += -I. -+HOST_CXXFLAGS += -I. -+ - ifeq ($(findstring powerpc,$(ARCH)),powerpc) -- CXXFLAGS+=-DSQUISH_USE_ALTIVEC=1 -maltivec -+ CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec -+ HOST_CXXFLAGS += -DSQUISH_USE_ALTIVEC=1 -maltivec - else ifeq ($(findstring x86,$(ARCH)), x86) -- CXXFLAGS+=-DSQUISH_USE_SSE=2 -msse2 -+ CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 -+ HOST_CXXFLAGS += -DSQUISH_USE_SSE=2 -msse2 - endif - --LIB=libsquish.a -- --ifeq (@USE_TEXTUREPACKER_NATIVE@,1) --NATIVE_LIB=libsquish-native.so --CLEAN_FILES+=$(NATIVE_LIB) -- - ifeq ($(findstring osx,$(ARCH)),osx) --NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) -+ HOST_CXXFLAGS += $(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -m32) - endif - --all: $(LIB) $(NATIVE_LIB) -+$(LIB): $(SRCS) -+ - # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. - $(NATIVE_LIB): $(SRCS) - ifeq ($(findstring osx,$(ARCH)),osx) -- g++ $(NATIVE_ARCH) -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ - else -- g++ -DSQUISH_USE_SSE=2 -msse2 -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ --endif -+ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ - endif - - include ../../Makefile.include -diff -Naur xbmc-frodo-433f681/tools/TexturePacker/Makefile.in xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in ---- xbmc-frodo-433f681/tools/TexturePacker/Makefile.in 2012-06-15 02:52:20.000000000 +0200 -+++ xbmc-frodo-433f681.patch/tools/TexturePacker/Makefile.in 2012-06-19 05:35:15.349564918 +0200 -@@ -1,48 +1,51 @@ --DEFINES += -D_LINUX -DUSE_LZO_PACKING -+DEFINES += -D_LINUX -DUSE_LZO_PACKING - ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) --DEFINES += -DHOST_BIGENDIAN -+DEFINES += -DHOST_BIGENDIAN - endif - --CXXFLAGS+= \ -+SRCS = \ -+ md5.cpp \ -+ SDL_anigif.cpp \ -+ XBTFWriter.cpp \ -+ XBMCTex.cpp \ -+ @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -+ -+TARGET = TexturePacker -+CLEAN_FILES = $(TARGET) -+ -+all: $(TARGET) -+ -+HOST_CXX ?= g++ -+HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ -+ -+LIBS += -lSDL_image -lSDL -llzo2 -+LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish -+HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 -+HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native -+ -+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 -+HOST_CXXFLAGS += \ -+ -I. \ -+ -I@abs_top_srcdir@/lib \ -+ -I@abs_top_srcdir@/xbmc \ -+ -I@abs_top_srcdir@/xbmc/linux \ -+ -I$(HOST_ROOT_PATH)/include -+ - ifeq ($(findstring osx,@ARCH@),osx) - DEFINES += -DTARGET_DARWIN - NATIVE_ARCH=$(shell echo $(CXXFLAGS) | grep x86_64 >/dev/null && echo -m64 || echo -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 -- --LIBS += -lSDL_image -lSDL -llzo2 -- --SRCS = \ -- md5.cpp \ -- SDL_anigif.cpp \ -- XBTFWriter.cpp \ -- XBMCTex.cpp \ -- @abs_top_srcdir@/xbmc/guilib/XBTF.cpp -- -- --TARGET = TexturePacker --CLEAN_FILES=$(TARGET) -- --all: $(TARGET) - - ifeq (@USE_TEXTUREPACKER_NATIVE@,1) - # TexturePacker run native on build system, build it with native tools - $(TARGET): $(SRCS) -- g++ $(DEFINES) $(NATIVE_ARCH) $(CXXFLAGS) $(SRCS) $(LIBS) -o $(TARGET) -+ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so -+ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) -o $(TARGET) - clean: - rm -f $(TARGET) - else diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch deleted file mode 100644 index b8f5b8afcf8..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff -Naur xbmc-pvr-3513480/configure.in xbmc-pvr-3513480.patch/configure.in ---- xbmc-pvr-3513480/configure.in 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/configure.in 2011-04-25 05:14:49.220848143 +0200 -@@ -885,6 +885,9 @@ - AC_MSG_NOTICE($external_ffmpeg_disabled) - USE_EXTERNAL_FFMPEG=0 - AC_DEFINE([PIX_FMT_VDPAU_MPEG4_IN_AVUTIL], [1], [Whether AVUtil defines PIX_FMT_VDPAU_MPEG4.]) -+ -+ # check for yasm -+ AC_CHECK_PROG(HAVE_YASM,yasm,"yes","no",) - fi - - # Python -@@ -1547,6 +1550,7 @@ - `if test "$use_arch" != "no"; then echo --arch=$use_arch; fi`\ - `if test "$use_cpu" != "no"; then echo --cpu=$use_cpu; fi`\ - --target-os=$(tolower $(uname -s)) \ -+ `if test "$HAVE_YASM" = "yes"; then echo --enable-yasm; fi` \ - --disable-muxers \ - --enable-muxer=spdif \ - --enable-muxer=adts \ diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch deleted file mode 100644 index 821c1cc7bd5..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff -Naur xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-a3c804b/xbmc/interfaces/python/XBPython.cpp 2011-08-17 23:40:00.000000000 +0200 -+++ xbmc-a3c804b.patch/xbmc/interfaces/python/XBPython.cpp 2011-08-18 03:50:49.652475572 +0200 -@@ -335,11 +335,9 @@ - // at http://docs.python.org/using/cmdline.html#environment-variables - - #if !defined(_WIN32) -- /* PYTHONOPTIMIZE is set off intentionally when using external Python. -- Reason for this is because we cannot be sure what version of Python -- was used to compile the various Python object files (i.e. .pyo, -- .pyc, etc.). */ -- // check if we are running as real xbmc.app or just binary -+ // Required for python to find optimized code (pyo) files -+ setenv("PYTHONOPTIMIZE", "1", 1); -+ // check if we are running as real xbmc.app or just binary - if (!CUtil::GetFrameworksPath(true).IsEmpty()) - { - // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-452-change_lcd_content-0.1.patch deleted file mode 100644 index 0427b534f9f..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-452-change_lcd_content-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-pvr-3513480/userdata/LCD.xml xbmc-pvr-3513480.patch/userdata/LCD.xml ---- xbmc-pvr-3513480/userdata/LCD.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/userdata/LCD.xml 2011-04-25 05:27:34.956125133 +0200 -@@ -21,7 +21,7 @@ - Freemem: $INFO[System.FreeMemory] - - -- XBMC running... -+ *** OpenELEC *** - $INFO[System.Time] $INFO[System.Date] - Freemem: $INFO[System.FreeMemory] - $INFO[System.ScreenWidth]x$INFO[System.ScreenHeight] $INFO[System.ScreenMode] diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch deleted file mode 100644 index 5b32c0cce76..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/userdata/RssFeeds.xml xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml ---- xbmc-10.1-Dharma/userdata/RssFeeds.xml 2011-03-08 02:49:24.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/userdata/RssFeeds.xml 2011-06-14 17:07:08.450880123 +0200 -@@ -3,6 +3,7 @@ - - - -+ http://openelec.tv/news?format=feed&type=rss - http://feeds.feedburner.com/xbmc - - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-454-disable_backslash-0.1.patch deleted file mode 100644 index 08889202586..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-454-disable_backslash-0.1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Naur xbmc-30a9070/system/keymaps/keyboard.xml xbmc-30a9070.patch/system/keymaps/keyboard.xml ---- xbmc-30a9070/system/keymaps/keyboard.xml 2011-07-28 06:20:13.000000000 +0200 -+++ xbmc-30a9070.patch/system/keymaps/keyboard.xml 2011-07-28 09:39:57.210973380 +0200 -@@ -90,7 +90,7 @@ - Number7 - Number8 - Number9 -- ToggleFullScreen -+ - FirstPage - LastPage - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-457-fix_connection_check-0.1.patch deleted file mode 100644 index 9488def289b..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-457-fix_connection_check-0.1.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Naur a/xbmc/filesystem/CurlFile.cpp b/xbmc/filesystem/CurlFile.cpp ---- a/xbmc/filesystem/CurlFile.cpp 2011-03-08 02:49:14.000000000 +0100 -+++ b/xbmc/filesystem/CurlFile.cpp 2011-10-17 19:21:04.180783870 +0200 -@@ -803,9 +803,9 @@ - // Detect whether we are "online" or not! Very simple and dirty! - bool CFileCurl::IsInternet(bool checkDNS /* = true */) - { -- CStdString strURL = "http://www.google.com"; -+ CStdString strURL = "http://www.openelec.tv"; - if (!checkDNS) -- strURL = "http://74.125.19.103"; // www.google.com ip -+ strURL = "http://212.101.13.10"; // www.openelec.tv ip - - bool found = Exists(strURL); - Close(); diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-462-add_remote_irtrans_mediacenter-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-462-add_remote_irtrans_mediacenter-0.1.patch deleted file mode 100644 index 0edef5a7a52..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-462-add_remote_irtrans_mediacenter-0.1.patch +++ /dev/null @@ -1,52 +0,0 @@ -diff -Naur xbmc-pvr-3513480/system/Lircmap.xml xbmc-pvr-3513480.patch/system/Lircmap.xml ---- xbmc-pvr-3513480/system/Lircmap.xml 2011-04-25 02:36:33.000000000 +0200 -+++ xbmc-pvr-3513480.patch/system/Lircmap.xml 2011-04-25 05:31:39.632429078 +0200 -@@ -409,4 +409,48 @@ - KEY_YELLOW - KEY_BLUE - -+ -+ pause -+ stop -+ fwd -+ rew -+ left -+ right -+ up -+ down -+ -+ ch+ -+ ch- -+ back -+ clear -+ play -+ info -+ next -+ prev -+ teletext -+ ehome -+ rec -+ vol+ -+ vol- -+ mute -+ power -+ video -+ music -+ pictures -+ tv -+ 1 -+ 2 -+ 3 -+ 4 -+ 5 -+ 6 -+ 7 -+ 8 -+ 9 -+ 0 -+ red -+ green -+ yellow -+ blue -+ - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-463-add_remote_devinput-0.1.patch deleted file mode 100644 index 85d635b61b5..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-463-add_remote_devinput-0.1.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/Lircmap.xml xbmc-10.1-Dharma.patch/system/Lircmap.xml ---- xbmc-10.1-Dharma/system/Lircmap.xml 2011-06-18 01:43:43.132101246 +0200 -+++ xbmc-10.1-Dharma.patch/system/Lircmap.xml 2011-06-18 01:44:53.777025290 +0200 -@@ -365,7 +365,6 @@ - - - cx23885_remote -- devinput - KEY_LEFT - KEY_RIGHT - KEY_UP -@@ -452,4 +451,59 @@ - yellow - blue - -+ -+ -+ KEY_LEFT -+ KEY_RIGHT -+ KEY_UP -+ KEY_DOWN -+ -+ KEY_ENTER -+ KEY_DELETE -+ KEY_PROG1 -+ KEY_EXIT -+ KEY_RECORD -+ KEY_PLAY -+ KEY_PAUSE -+ KEY_STOP -+ KEY_FASTFORWARD -+ KEY_REWIND -+ KEY_VOLUMEUP -+ KEY_VOLUMEDOWN -+ KEY_CHANNELUP -+ KEY_CHANNELDOWN -+ KEY_NEXT -+ KEY_PREVIOUS -+ KEY_EPG -+ KEY_SUBTITLE -+ KEY_LANGUAGE -+ KEY_INFO -+ KEY_ZOOM -+ KEY_MUTE -+ KEY_POWER -+ KEY_EJECT -+ KEY_DVD -+ KEY_MENU -+ KEY_VIDEO -+ KEY_AUDIO -+ KEY_CAMERA -+ KEY_TUNER -+ KEY_TEXT -+ KEY_NUMERIC_1 -+ KEY_NUMERIC_2 -+ KEY_NUMERIC_3 -+ KEY_NUMERIC_4 -+ KEY_NUMERIC_5 -+ KEY_NUMERIC_6 -+ KEY_NUMERIC_7 -+ KEY_NUMERIC_8 -+ KEY_NUMERIC_9 -+ KEY_NUMERIC_0 -+ KEY_NUMERIC_STAR -+ KEY_NUMERIC_POUND -+ KEY_RED -+ KEY_GREEN -+ KEY_YELLOW -+ KEY_BLUE -+ - diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch deleted file mode 100644 index 56c56016b59..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur xbmc-10.1-Dharma/system/keymaps/remote.xml xbmc-10.1-Dharma.patch/system/keymaps/remote.xml ---- xbmc-10.1-Dharma/system/keymaps/remote.xml 2011-03-08 02:49:23.000000000 +0100 -+++ xbmc-10.1-Dharma.patch/system/keymaps/remote.xml 2011-06-18 01:48:26.887811969 +0200 -@@ -63,6 +63,7 @@ - VolumeDown - Mute - XBMC.ShutDown() -+ XBMC.EjectTray() - XBMC.ActivateWindow(MyVideos) - XBMC.ActivateWindow(MyMusic) - XBMC.ActivateWindow(MyPictures) diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-981-toggleButtonState.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-981-toggleButtonState.patch deleted file mode 100644 index 17a606f1b15..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-981-toggleButtonState.patch +++ /dev/null @@ -1,304 +0,0 @@ -diff -Naur xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h ---- xbmc-f3b0020/xbmc/guilib/GUIToggleButtonControl.h 2011-12-10 22:16:22.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/guilib/GUIToggleButtonControl.h 2011-12-17 18:43:42.183704449 +0100 -@@ -57,6 +57,7 @@ - virtual CStdString GetDescription() const; - void SetToggleSelect(const CStdString &toggleSelect); - void SetAltClickActions(const CGUIAction &clickActions); -+ bool IsSelected() const { return m_bSelected; }; - - protected: - virtual bool UpdateColors(); -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/control.h 2011-12-17 18:43:42.216705084 +0100 -@@ -135,6 +135,11 @@ - - typedef struct { - PyObject_HEAD_XBMC_CONTROL -+ bool bIsSelected; -+ } ControlToggle; -+ -+ typedef struct { -+ PyObject_HEAD_XBMC_CONTROL - std::string strFont; - color_t textColor; - std::vector vecLabels; -@@ -263,7 +268,8 @@ - extern PyTypeObject ControlRadioButton_Type; - extern PyTypeObject ControlSlider_Type; - extern PyTypeObject ControlEdit_Type; -- -+ extern PyTypeObject ControlToggle_Type; -+ - CGUIControl* ControlLabel_Create(ControlLabel* pControl); - CGUIControl* ControlFadeLabel_Create(ControlFadeLabel* pControl); - CGUIControl* ControlTextBox_Create(ControlTextBox* pControl); -@@ -276,6 +282,7 @@ - CGUIControl* ControlRadioButton_Create(ControlRadioButton* pControl); - CGUIControl* ControlSlider_Create(ControlSlider* pControl); - CGUIControl* ControlEdit_Create(ControlEdit* pControl); -+ CGUIControl* ControlToggle_Create(ControlToggle* pControl); - - void initControl_Type(); - void initControlSpin_Type(); -@@ -291,6 +298,7 @@ - void initControlRadioButton_Type(); - void initControlSlider_Type(); - void initControlEdit_Type(); -+ void initControlToggle_Type(); - } - - #ifdef __cplusplus -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/controltogglebutton.cpp 2011-12-17 18:43:42.217705104 +0100 -@@ -0,0 +1,181 @@ -+/* -+ * Copyright (C) 2005-2011 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 -+ * -+ */ -+ -+#include -+ -+#include "guilib/GUIToggleButtonControl.h" -+#include "guilib/GUIFontManager.h" -+#include "control.h" -+#include "pyutil.h" -+ -+using namespace std; -+ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+namespace PYXBMC -+{ -+ PyObject* ControlToggle_New( -+ PyTypeObject *type, -+ PyObject *args, -+ PyObject *kwds ) -+ { -+ static const char *keywords[] = { -+ "x", "y", "width", "height", "label", -+ "focusTexture", "noFocusTexture", -+ "textOffsetX", "textOffsetY", "alignment", -+ "font", "textColor", "disabledColor", "angle", "shadowColor", "focusedColor", NULL }; -+ ControlToggle *self; -+ char* cFont = NULL; -+ char* cTextureFocus = NULL; -+ char* cTextureNoFocus = NULL; -+ char* cTextColor = NULL; -+ char* cDisabledColor = NULL; -+ char* cShadowColor = NULL; -+ char* cFocusedColor = NULL; -+ -+ PyObject* pObjectText; -+ -+ self = (ControlToggle*)type->tp_alloc(type, 0); -+ if (!self) return NULL; -+ new(&self->bIsSelected) bool(); -+ -+ if (!PyArg_ParseTupleAndKeywords( -+ args, -+ kwds, -+ (char*)"llllO|sslllssslss", -+ (char**)keywords, -+ &self->dwPosX, -+ &self->dwPosY, -+ &self->dwWidth, -+ &self->dwHeight, -+ &pObjectText, -+ &cTextureFocus, -+ &cTextureNoFocus, -+ &cFont, -+ &cTextColor, -+ &cDisabledColor, -+ &cShadowColor, -+ &cFocusedColor)) -+ { -+ Py_DECREF( self ); -+ return NULL; -+ } -+ -+ -+ cTextureFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturefocus", (char*)"button-focus.png"); -+ cTextureNoFocus : -+ PyXBMCGetDefaultImage((char*)"button", (char*)"texturenofocus", (char*)"button-nofocus.jpg"); -+ -+ return (PyObject*)self; -+ } -+ -+ void ControlToggle_Dealloc(ControlToggle* self) -+ { -+ self->ob_type->tp_free((PyObject*)self); -+ } -+ -+ -+ // isSelected() Method -+ PyDoc_STRVAR(isSelected__doc__, -+ "isSelected() -- Returns the toggle buttons's selected status.\n" -+ "\n" -+ "example:\n" -+ " - is = self.togglebutton.isSelected()\n"); -+ -+ PyObject* ControlToggle_IsSelected(ControlToggle *self, PyObject *args) -+ { -+ bool isSelected = false; -+ -+ PyXBMCGUILock(); -+ if (self->pGUIControl) -+ isSelected = ((CGUIToggleButtonControl*)self->pGUIControl)->IsSelected(); -+ PyXBMCGUIUnlock(); -+ -+ return Py_BuildValue((char*)"b", isSelected); -+ } -+ -+ -+ PyMethodDef ControlToggle_methods[] = { -+ {(char*)"isSelected", (PyCFunction)ControlToggle_IsSelected, METH_VARARGS, isSelected__doc__}, -+ {NULL, NULL, 0, NULL} -+ }; -+ -+ // ControlRadioButton class -+ PyDoc_STRVAR(ControlToggle__doc__, -+ "ControlRadioButton class.\n" -+ "\n" -+ "ControlRadioButton(x, y, width, height, label[, focusTexture, noFocusTexture, textOffsetX, textOffsetY,\n" -+ " alignment, font, textColor, disabledColor, angle, shadowColor, focusedColor,\n" -+ " radioFocusTexture, noRadioFocusTexture])\n" -+ "\n" -+ "x : integer - x coordinate of control.\n" -+ "y : integer - y coordinate of control.\n" -+ "width : integer - width of control.\n" -+ "height : integer - height of control.\n" -+ "label : string or unicode - text string.\n" -+ "focusTexture : [opt] string - filename for focus texture.\n" -+ "noFocusTexture : [opt] string - filename for no focus texture.\n" -+ "textOffsetX : [opt] integer - x offset of label.\n" -+ "textOffsetY : [opt] integer - y offset of label.\n" -+ "alignment : [opt] integer - alignment of label - *Note, see xbfont.h\n" -+ "font : [opt] string - font used for label text. (e.g. 'font13')\n" -+ "textColor : [opt] hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')\n" -+ "disabledColor : [opt] hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')\n" -+ "angle : [opt] integer - angle of control. (+ rotates CCW, - rotates CW)\n" -+ "shadowColor : [opt] hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')\n" -+ "focusedColor : [opt] hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')\n" -+ "radioFocusTexture : [opt] string - filename for radio focus texture.\n" -+ "noRadioFocusTexture : [opt] string - filename for radio no focus texture.\n" -+ "\n" -+ "*Note, You can use the above as keywords for arguments and skip certain optional arguments.\n" -+ " Once you use a keyword, all following arguments require the keyword.\n" -+ " After you create the control, you need to add it to the window with addControl().\n" -+ "\n" -+ "example:\n" -+ " - self.radiobutton = xbmcgui.ControlToggleButton(100, 250, 200, 50, 'Status', font='font14')\n"); -+ -+ // Restore code and data sections to normal. -+ -+ PyTypeObject ControlToggle_Type; -+ -+ void initControlToggle_Type() -+ { -+ PyXBMCInitializeTypeObject(&ControlToggle_Type); -+ -+ ControlToggle_Type.tp_name = (char*)"xbmcgui.ControlToggleButton"; -+ ControlToggle_Type.tp_basicsize = sizeof(ControlToggle); -+ ControlToggle_Type.tp_dealloc = (destructor)ControlToggle_Dealloc; -+ ControlToggle_Type.tp_compare = 0; -+ ControlToggle_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; -+ ControlToggle_Type.tp_doc = ControlToggle__doc__; -+ ControlToggle_Type.tp_methods = ControlToggle_methods; -+ ControlToggle_Type.tp_base = &Control_Type; -+ ControlToggle_Type.tp_new = ControlToggle_New; -+ } -+} -+ -+#ifdef __cplusplus -+} -+#endif -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/Makefile.in 2011-12-17 18:44:47.447960296 +0100 -@@ -13,6 +13,7 @@ - controlslider.cpp \ - controlspin.cpp \ - controltextbox.cpp \ -+ controltogglebutton.cpp \ - dialog.cpp \ - GUIPythonWindow.cpp \ - GUIPythonWindowDialog.cpp \ -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2011-12-17 18:43:42.218705123 +0100 -@@ -277,6 +277,12 @@ - if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); - ((ControlButton*)pControl)->align = li.align; - break; -+ case CGUIControl::GUICONTROL_TOGGLEBUTTON: -+ pControl = (Control*)ControlToggle_Type.tp_alloc(&ControlToggle_Type, 0); -+ new(&((ControlToggle*)pControl)->bIsSelected) bool(); -+ -+ break; -+ - default: - break; - } -diff -Naur xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp ---- xbmc-f3b0020/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-10 22:16:21.000000000 +0100 -+++ xbmc-f3b0020.patch/xbmc/interfaces/python/xbmcmodule/xbmcguimodule.cpp 2011-12-17 18:43:42.219705142 +0100 -@@ -138,6 +138,7 @@ - initAction_Type(); - initControlRadioButton_Type(); - initControlEdit_Type(); -+ initControlToggle_Type(); - - if (PyType_Ready(&Window_Type) < 0 || - PyType_Ready(&WindowDialog_Type) < 0 || -@@ -160,7 +161,8 @@ - PyType_Ready(&ControlSlider_Type) < 0 || - PyType_Ready(&ControlRadioButton_Type) < 0 || - PyType_Ready(&ControlEdit_Type) < 0 || -- PyType_Ready(&Action_Type) < 0) -+ PyType_Ready(&Action_Type) < 0 || -+ PyType_Ready(&ControlToggle_Type) < 0) - return; - - } -@@ -200,6 +202,7 @@ - Py_INCREF(&Action_Type); - Py_INCREF(&ControlRadioButton_Type); - Py_INCREF(&ControlEdit_Type); -+ Py_INCREF(&ControlToggle_Type); - - pXbmcGuiModule = Py_InitModule3((char*)"xbmcgui", xbmcGuiMethods, xbmcgui_module_documentation); - -@@ -227,7 +230,8 @@ - PyModule_AddObject(pXbmcGuiModule, (char*)"Action", (PyObject *)&Action_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlRadioButton", (PyObject*)&ControlRadioButton_Type); - PyModule_AddObject(pXbmcGuiModule, (char*)"ControlEdit", (PyObject*)&ControlEdit_Type); -- -+ PyModule_AddObject(pXbmcGuiModule, (char*)"ControlToggle", (PyObject*)&ControlToggle_Type); -+ - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__author__", (char*)PY_XBMC_AUTHOR); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__date__", (char*)"14 July 2006"); - PyModule_AddStringConstant(pXbmcGuiModule, (char*)"__version__", (char*)"1.2"); -diff -Naur xbmc-f3b0020/XBMC.xcodeproj/project.pbxproj xbmc-f3b0020.patch/XBMC.xcodeproj/project.pbxproj diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-999-crosscompile.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-999-crosscompile.patch deleted file mode 100644 index 9c73a9644e2..00000000000 --- a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-pvr-8f0c91b-999-crosscompile.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/Makefile.include.in b/Makefile.include.in -index b70245d..0537b86 100644 ---- a/Makefile.include.in -+++ b/Makefile.include.in -@@ -1,4 +1,4 @@ --AR=ar -+AR=@AR@ - ARFLAGS=crus - RM=rm -rf - SHELL=@SHELL@ -diff --git a/configure.in b/configure.in -index 7348529..baea8e0 100755 ---- a/configure.in -+++ b/configure.in -@@ -22,7 +22,7 @@ AC_DEFUN([XB_FIND_SONAME], - AC_MSG_CHECKING([for lib$2 soname]) - $1_FILENAME=$($CC -nostdlib -o /dev/null $LDFLAGS -l$2 -Wl,-M 2>/dev/null | grep "^LOAD.*$2" | awk '{V=2; print $V}') - if [[ ! -z $$1_FILENAME ]]; then -- $1_SONAME=$(objdump -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') -+ $1_SONAME=$($OBJDUMP -p $$1_FILENAME | grep "SONAME.*$2" | awk '{V=2; print $V}') - fi - else - AC_MSG_CHECKING([for lib$2 dylib]) From c1dd041327673016740768309e3511be389b8bc8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 4 Sep 2012 23:25:53 +0200 Subject: [PATCH 22/32] xbmc: add backports for VDPAU and XVBA Signed-off-by: Stephan Raue --- ...kport_vdpau_and_xvba_patches-b38863d.patch | 1420 +++++++++++++++++ 1 file changed, 1420 insertions(+) create mode 100644 packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch diff --git a/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch new file mode 100644 index 00000000000..eca975c0297 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/xbmc-11.0.2-902.21-backport_vdpau_and_xvba_patches-b38863d.patch @@ -0,0 +1,1420 @@ +From 634226f3c604c38d6dd245800f05673583ba2dca Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Thu, 30 Aug 2012 12:38:39 +0200 +Subject: [PATCH 01/10] backport vdpau changes + +--- + .../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 4 +- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 59 +++----------------- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h | 10 ---- + xbmc/settings/GUISettings.cpp | 2 +- + xbmc/settings/GUIWindowSettingsCategory.cpp | 4 +- + 5 files changed, 13 insertions(+), 66 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +index 3416506..01a8c78 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +@@ -132,8 +132,7 @@ struct DVDVideoUserData + #define DVP_FLAG_NOSKIP 0x00000010 // indicate this picture should never be dropped + #define DVP_FLAG_DROPPED 0x00000020 // indicate that this picture has been dropped in decoder stage, will have no data + #define DVP_FLAG_DROPDEINT 0x00000040 // indicate that this picture was requested to have been dropped in deint stage +- +-#define DVP_FLAG_SKIP_PROC 0x00000100 ++#define DVP_FLAG_NO_POSTPROC 0x00000100 + #define DVP_FLAG_DRAIN 0x00000200 + + // DVP_FLAG 0x00000100 - 0x00000f00 is in use by libmpeg2! +@@ -155,7 +154,6 @@ struct DVDVideoUserData + #define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again + #define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped + #define VC_HURRY 0x00000040 +-#define VC_SKIPPROC 0x00000080 + + class CDVDVideoCodec + { +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index aed9d63..16edf55 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -95,10 +95,8 @@ + m_vdpauConfig.videoSurfaces = &m_videoSurfaces; + m_vdpauConfig.videoSurfaceSec = &m_videoSurfaceSec; + +- m_picAge.b_age = m_picAge.ip_age[0] = m_picAge.ip_age[1] = 256*256*256*64; + m_vdpauConfigured = false; + m_DisplayState = VDPAU_OPEN; +- m_speed = DVD_PLAYSPEED_NORMAL; + } + + bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat, unsigned int surfaces) +@@ -252,13 +250,6 @@ long CDecoder::ReleasePicReference() + + void CDecoder::SetWidthHeight(int width, int height) + { +- int vdpauMaxHeight = g_advancedSettings.m_videoVDPAUmaxHeight; +- if (vdpauMaxHeight > 0 && height > vdpauMaxHeight) +- { +- width = MathUtils::round_int((double)width * vdpauMaxHeight / height); +- height = vdpauMaxHeight; +- } +- + m_vdpauConfig.upscale = g_advancedSettings.m_videoVDPAUScaling; + + //pick the smallest dimensions, so we downscale with vdpau and upscale with opengl when appropriate +@@ -282,7 +273,7 @@ void CDecoder::SetWidthHeight(int width, int height) + m_vdpauConfig.outWidth = width; + m_vdpauConfig.outHeight = height; + } +- CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i vdpauMaxHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight, vdpauMaxHeight); ++ CLog::Log(LOGDEBUG, "CVDPAU::SetWidthHeight Setting OutWidth: %i OutHeight: %i", m_vdpauConfig.outWidth, m_vdpauConfig.outHeight); + } + + void CDecoder::OnLostDevice() +@@ -710,7 +701,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + //CLog::Log(LOGNOTICE,"%s",__FUNCTION__); + CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; + CDecoder* vdp = (CDecoder*)ctx->GetHardware(); +- struct PictureAge* pA = &vdp->m_picAge; + + // while we are waiting to recover we can't do anything + CSingleLock lock(vdp->m_DecoderSection); +@@ -777,18 +767,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + + pic->linesize[0] = pic->linesize[1] = pic->linesize[2] = 0; + +- if(pic->reference) +- { +- pA->ip_age[0]= pA->ip_age[1]+1; +- pA->ip_age[1]= 1; +- pA->b_age++; +- } +- else +- { +- pA->ip_age[0]++; +- pA->ip_age[1]++; +- pA->b_age = 1; +- } + pic->type= FF_BUFFER_TYPE_USER; + + render->state |= FF_VDPAU_STATE_USED_FOR_REFERENCE; +@@ -937,11 +915,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bo + m_bufferStats.IncDecoded(); + m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); + +- m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); +- if (m_codecControl & DVP_FLAG_SKIP_PROC) +- { +- m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); +- } ++ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_NO_POSTPROC); + } + + int retval = 0; +@@ -1017,7 +991,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame, bool bSoftDrain, bo + uint64_t diff = CurrentHostCounter() - startTime; + if (retval & VC_PICTURE) + { +- m_bufferStats.SetParams(diff, m_speed); ++ m_bufferStats.SetParams(diff, m_codecControl); + } + if (diff*1000/CurrentHostFrequency() > 50) + CLog::Log(LOGDEBUG,"CVDPAU::Decode long wait: %d", (int)((diff*1000)/CurrentHostFrequency())); +@@ -1079,11 +1053,6 @@ bool CDecoder::CanSkipDeint() + return m_bufferStats.CanSkipDeint(); + } + +-void CDecoder::SetSpeed(int speed) +-{ +- m_speed = speed; +-} +- + void CDecoder::ReturnRenderPicture(CVdpauRenderPicture *renderPic) + { + m_vdpauOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); +@@ -1150,7 +1119,6 @@ void CVdpauRenderPicture::ReturnUnused() + if (vdpau) + vdpau->ReturnRenderPicture(this); + } +- + //----------------------------------------------------------------------------- + // Mixer + //----------------------------------------------------------------------------- +@@ -1847,7 +1815,7 @@ void CMixer::SetDeinterlacing() + { + if (method == VS_INTERLACEMETHOD_AUTO) + { +- VdpBool enabled[] = {1,1,0}; ++ VdpBool enabled[] = {1,0,0}; + if (g_advancedSettings.m_videoVDPAUtelecine) + enabled[2] = 1; + vdp_st = m_config.vdpProcs.vdp_video_mixer_set_feature_enables(m_videoMixer, ARSIZE(feature), feature, enabled); +@@ -2127,10 +2095,10 @@ void CMixer::InitCycle() + { + CheckFeatures(); + uint64_t latency; +- int speed; +- m_config.stats->GetParams(latency, speed); ++ int flags; ++ m_config.stats->GetParams(latency, flags); + latency = (latency*1000)/CurrentHostFrequency(); +- if (speed != DVD_PLAYSPEED_NORMAL) ++ if (flags & DVP_FLAG_NO_POSTPROC) + SetPostProcFeatures(false); + else + SetPostProcFeatures(true); +@@ -2248,14 +2216,6 @@ void CMixer::ProcessPicture() + if (m_processPicture.DVDPic.format == DVDVideoPicture::FMT_VDPAU_420) + return; + +- int cmd = 0; +- m_config.stats->GetCmd(cmd); +- if (cmd & DVP_FLAG_SKIP_PROC) +- { +- m_processPicture.DVDPic.iFlags |= DVP_FLAG_DROPPED; +- return; +- } +- + VdpStatus vdp_st; + + if (m_mixerstep == 1) +@@ -3222,7 +3182,7 @@ bool COutput::GLInit() + glVDPAUGetSurfaceivNV = NULL; + #endif + +- m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinteroprgb"); ++ m_config.usePixmaps = !g_guiSettings.GetBool("videoplayer.usevdpauinterop"); + + #ifdef GL_NV_vdpau_interop + if (glewIsSupported("GL_NV_vdpau_interop")) +@@ -3254,7 +3214,7 @@ bool COutput::GLInit() + #endif + { + m_config.usePixmaps = true; +- g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); ++ g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); + g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + if (!glXBindTexImageEXT) +@@ -3538,5 +3498,4 @@ bool COutput::DestroyGlxContext() + return true; + } + +- + #endif +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +index e08687c..17f1f6e 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.h +@@ -508,12 +508,6 @@ class CDecoder + + public: + +- struct PictureAge +- { +- int b_age; +- int ip_age[2]; +- }; +- + struct Desc + { + const char *name; +@@ -532,7 +526,6 @@ class CDecoder + virtual void Close(); + virtual long Release(); + virtual bool CanSkipDeint(); +- virtual void SetSpeed(int speed); + + virtual int Check(AVCodecContext* avctx); + virtual const std::string Name() { return "vdpau"; } +@@ -591,16 +584,13 @@ class CDecoder + CVdpauConfig m_vdpauConfig; + std::vector m_videoSurfaces; + CCriticalSection m_videoSurfaceSec; +- PictureAge m_picAge; + + COutput m_vdpauOutput; + CVdpauBufferStats m_bufferStats; + CEvent m_inMsgEvent; + CVdpauRenderPicture *m_presentPicture; + +- int m_speed; + int m_codecControl; + }; + + } +- +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 4e8aabb..2d79423 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -597,7 +597,7 @@ void CGUISettings::Initialize() + + #ifdef HAVE_LIBVDPAU + AddBool(vp, "videoplayer.usevdpau", 13425, true); +- AddBool(vp, "videoplayer.usevdpauinteroprgb", 13433, true); ++ AddBool(vp, "videoplayer.usevdpauinterop", 13433, true); + AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); + #endif + #ifdef HAVE_LIBVA +diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp +index a69f130..40becc0 100644 +--- a/xbmc/settings/GUIWindowSettingsCategory.cpp ++++ b/xbmc/settings/GUIWindowSettingsCategory.cpp +@@ -577,7 +577,7 @@ void CGUIWindowSettingsCategory::UpdateSettings() + g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + } +- else if (strSetting.Equals("videoplayer.usevdpauinteroprgb")) ++ else if (strSetting.Equals("videoplayer.usevdpauinterop")) + { + bool hasInterop = false; + #ifdef GL_NV_vdpau_interop +@@ -591,7 +591,7 @@ void CGUIWindowSettingsCategory::UpdateSettings() + else + { + pControl->SetEnabled(false); +- g_guiSettings.SetBool("videoplayer.usevdpauinteroprgb",false); ++ g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); + } + } + else +-- +1.7.10 + + +From d0c23ddfad95612c47bcf9ce430b00a414b42912 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Thu, 30 Aug 2012 14:10:35 +0200 +Subject: [PATCH 02/10] backport some player and renderer changes + +--- + xbmc/cores/VideoRenderers/BaseRenderer.h | 3 + + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 31 +++---- + xbmc/cores/VideoRenderers/LinuxRendererGL.h | 2 + + xbmc/cores/VideoRenderers/RenderManager.cpp | 90 ++++++++------------ + xbmc/cores/VideoRenderers/RenderManager.h | 14 +-- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 12 +-- + .../DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 6 +- + xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 65 +++----------- + 8 files changed, 71 insertions(+), 152 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h +index af51852..0c2de2c 100644 +--- a/xbmc/cores/VideoRenderers/BaseRenderer.h ++++ b/xbmc/cores/VideoRenderers/BaseRenderer.h +@@ -67,6 +67,9 @@ class CBaseRenderer + virtual void Flush() {}; + + virtual unsigned int GetProcessorSize() { return 0; } ++ virtual unsigned int GetMaxProcessorSize() { return 0; } ++ virtual void SetProcessorSize(int numBuffers) { } ++ virtual void ReleaseBuffer(int idx) { } + + protected: + void ChooseBestResolution(float fps); +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +index 186ef2c..b0ad6e4 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +@@ -77,7 +77,6 @@ + using namespace Shaders; + + static const GLubyte stipple_weave[] = { +- 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, +@@ -110,6 +109,7 @@ + 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, ++ 0x00, 0x00, 0x00, 0x00, + }; + + CLinuxRendererGL::YUVBUFFER::YUVBUFFER() +@@ -249,11 +249,6 @@ bool CLinuxRendererGL::ValidateRenderTarget() + + // function pointer for texture might change in + // call to LoadShaders +- for (int i = 0 ; i < m_NumYV12Buffers ; i++) +- (this->*m_textureDelete)(i); +- +- // function pointer for texture might change in +- // call to LoadShaders + glFinish(); + for (int i = 0 ; i < m_NumYV12Buffers ; i++) + (this->*m_textureDelete)(i); +@@ -633,8 +628,6 @@ void CLinuxRendererGL::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + index = m_iYV12RenderBuffer; + } + } +- else +- m_iLastRenderBuffer = index; + + if (clear) + { +@@ -750,6 +743,8 @@ void CLinuxRendererGL::FlipPage(int source) + { + UnBindPbo(m_buffers[m_iYV12RenderBuffer]); + ++ m_iLastRenderBuffer = m_iYV12RenderBuffer; ++ + if( source >= 0 && source < m_NumYV12Buffers ) + m_iYV12RenderBuffer = source; + else +@@ -1147,7 +1142,10 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) + m_currentField = FIELD_FULL; + + // call texture load function ++ m_skipRender = false; + (this->*m_textureUpload)(renderBuffer); ++ if (m_skipRender) ++ return; + + if (m_renderMethod & RENDER_GLSL) + { +@@ -2332,16 +2330,13 @@ void CLinuxRendererGL::UploadVDPAUTexture(int index) + YUVFIELDS &fields = m_buffers[index].fields; + YUVPLANE &plane = fields[0][0]; + +- if (!vdpau) ++ if (!vdpau || !vdpau->valid) + { +- fields[0][1].id = plane.id; + m_eventTexturesDone[index]->Set(); +- CLog::Log(LOGWARNING,"--------- no vdpau texture, index: %d", index); ++ m_skipRender = true; + return; + } + +-// CLog::Log(LOGNOTICE,"-------- rendered output surf: %d", vdpau->sourceIdx); +-// CLog::Log(LOGNOTICE,"-------- pts: %f", vdpau->DVDPic.pts); + fields[0][1].id = vdpau->texture[0]; + + m_eventTexturesDone[index]->Set(); +@@ -2411,13 +2406,10 @@ void CLinuxRendererGL::UploadVDPAUTexture420(int index) + YUVFIELDS &fields = m_buffers[index].fields; + YUVPLANE &plane = fields[0][0]; + +- if (!vdpau) ++ if (!vdpau || !vdpau->valid) + { +- fields[1][0].id = plane.id; +- fields[1][1].id = plane.id; +- fields[2][0].id = plane.id; +- fields[2][1].id = plane.id; + m_eventTexturesDone[index]->Set(); ++ m_skipRender = true; + return; + } + +@@ -2479,7 +2471,6 @@ void CLinuxRendererGL::UploadVDPAUTexture420(int index) + #endif + } + +- + void CLinuxRendererGL::DeleteVAAPITexture(int index) + { + #ifdef HAVE_LIBVA +@@ -2610,7 +2601,7 @@ void CLinuxRendererGL::UploadVAAPITexture(int index) + || status == VA_STATUS_ERROR_INVALID_DISPLAY) + { + va.display->lost(true); +- for(int i = 0; i < NUM_BUFFERS; i++) ++ for(int i = 0; i < m_NumYV12Buffers; i++) + { + m_buffers[i].vaapi.display.reset(); + m_buffers[i].vaapi.surface.reset(); +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +index 9dfe679..4a8da39 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +@@ -145,6 +145,7 @@ class CLinuxRendererGL : public CBaseRenderer + virtual void Flush(); + virtual void ReleaseBuffer(int idx); + virtual void SetProcessorSize(int numBuffers) { m_NumYV12Buffers = numBuffers; } ++ virtual unsigned int GetMaxProcessorSize() { return NUM_BUFFERS; } + virtual unsigned int GetProcessorSize() { return m_NumYV12Buffers; } + + #ifdef HAVE_LIBVDPAU +@@ -328,6 +329,7 @@ class CLinuxRendererGL : public CBaseRenderer + bool m_nonLinStretch; + bool m_nonLinStretchGui; + float m_pixelRatio; ++ bool m_skipRender; + }; + + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index c94c699..95372e0 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -235,6 +235,13 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + return false; + } + ++ // check if decoder supports buffering ++ m_bCodecSupportsBuffering = false; ++ if (format == DVDVideoPicture::FMT_VDPAU ++ || format == DVDVideoPicture::FMT_VDPAU_420 ++ || format == DVDVideoPicture::FMT_XVBA) ++ m_bCodecSupportsBuffering = true; ++ + bool result = m_pRenderer->Configure(width, height, d_width, d_height, fps, flags, format); + if(result) + { +@@ -249,7 +256,7 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + m_bReconfigured = true; + m_presentstep = PRESENT_IDLE; + m_presentevent.Set(); +-// ResetRenderBuffer(); ++ ResetRenderBuffer(); + } + + return result; +@@ -294,8 +301,6 @@ void CXBMCRenderManager::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + } + } + +-// CLog::Log(LOGNOTICE,"------ current: %d", m_iCurrentRenderBuffer); +- + if (g_advancedSettings.m_videoDisableBackgroundDeinterlace) + { + CSharedLock lock(m_sharedSection); +@@ -334,17 +339,10 @@ unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) + + UpdateDisplayLatency(); + +- m_swapCount = 1; +-// std::string Vendor = g_Windowing.GetRenderVendor(); +-// std::transform(Vendor.begin(), Vendor.end(), Vendor.begin(), ::tolower); +-// if (Vendor.compare(0, 3, "ati") == 0) +-// { +-// m_swapCount = 2; +-// } +- ResetRenderBuffer(); + m_bUseBuffering = false; +- m_overlays.SetNumBuffers(m_iNumRenderBuffers); +- m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); ++ m_bCodecSupportsBuffering = true; ++ ResetRenderBuffer(); ++ + return m_pRenderer->PreInit(); + } + +@@ -680,8 +678,6 @@ void CXBMCRenderManager::Present() + WaitPresentTime(m_presenttime); + + m_presentevent.Set(); +- +- m_rendertime = CurrentHostCounter(); + } + + /* simple present method */ +@@ -915,9 +911,9 @@ bool CXBMCRenderManager::HasFreeBuffer() + return true; + } + +- int outputPlusSwap = (m_iOutputRenderBuffer + m_swapCount) % m_iNumRenderBuffers; ++ int outputPlus1 = (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers; + if ((m_iOutputRenderBuffer == m_iDisplayedRenderBuffer && !m_bAllRenderBuffersDisplayed) +- || outputPlusSwap == m_iCurrentRenderBuffer) ++ || outputPlus1 == m_iCurrentRenderBuffer) + return false; + else + return true; +@@ -925,15 +921,23 @@ bool CXBMCRenderManager::HasFreeBuffer() + + void CXBMCRenderManager::ResetRenderBuffer() + { +- m_iNumRenderBuffers = 5; ++ m_iNumRenderBuffers = m_pRenderer->GetMaxProcessorSize(); ++ m_iNumRenderBuffers = std::min(5, m_iNumRenderBuffers); ++ m_iNumRenderBuffers = std::max(2, m_iNumRenderBuffers); ++ ++ if (!m_bCodecSupportsBuffering) ++ m_iNumRenderBuffers = 2; ++ ++ CLog::Log(LOGNOTICE,"CXBMCRenderManager::ResetRenderBuffer - using %d render buffers", m_iNumRenderBuffers); ++ m_overlays.SetNumBuffers(m_iNumRenderBuffers); ++ m_pRenderer->SetProcessorSize(m_iNumRenderBuffers); ++ + m_iCurrentRenderBuffer = 0; +- m_iFlipRequestRenderBuffer = 0; + m_iOutputRenderBuffer = 0; + m_iDisplayedRenderBuffer = 0; + m_bAllRenderBuffersDisplayed = true; + m_sleeptime = 1.0; + m_presentPts = DVD_NOPTS_VALUE; +-// m_bUseBuffering = true; + m_speed = 0; + } + +@@ -943,8 +947,8 @@ void CXBMCRenderManager::PrepareNextRender() + if (idx < 0) + { + if (m_speed >= DVD_PLAYSPEED_NORMAL && g_graphicsContext.IsFullScreenVideo()) +- CLog::Log(LOGNOTICE,"----------- no buffer, out: %d, current: %d, display: %d", +- m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); ++ CLog::Log(LOGDEBUG,"%s no buffer, out: %d, current: %d, display: %d", ++ __FUNCTION__, m_iOutputRenderBuffer, m_iCurrentRenderBuffer, m_iDisplayedRenderBuffer); + return; + } + +@@ -962,16 +966,6 @@ void CXBMCRenderManager::PrepareNextRender() + + m_sleeptime = presenttime - clocktime; + +-// double interval; +-// if (g_VideoReferenceClock.GetRefreshRate(&interval) > 0) +-// { +-// if (m_swaptime > interval * 0.7) +-// { +-// presenttime += interval; +-// CLog::Log(LOGDEBUG,"------------ very long swaptime"); +-// } +-// } +- + if (g_graphicsContext.IsFullScreenVideo() || presenttime <= clocktime+0.01) + { + m_presentPts = m_renderBuffers[idx].pts; +@@ -986,6 +980,10 @@ void CXBMCRenderManager::PrepareNextRender() + void CXBMCRenderManager::EnableBuffering(bool enable) + { + CRetakeLock lock(m_sharedSection); ++ ++ if (m_iNumRenderBuffers < 3) ++ return; ++ + m_bUseBuffering = enable; + if (!m_bUseBuffering) + m_iOutputRenderBuffer = m_iCurrentRenderBuffer; +@@ -1005,28 +1003,11 @@ void CXBMCRenderManager::NotifyDisplayFlip() + if (!m_pRenderer) + return; + +-// if (g_graphicsContext.IsFullScreenVideo()) +-// { +-// uint64_t diff = CurrentHostCounter() - m_rendertime; +-// m_swaptime = ((double)(diff))/CurrentHostFrequency(); +-// int waittime = (int)((diff*1000LL)/CurrentHostFrequency()); +-// if (waittime > 15) +-// { +-// CLog::Log(LOGNOTICE,"------------------ wait swap buffers: %f, sleep: %f", m_swaptime, m_sleeptime); +-// } +-// } ++ if (m_iNumRenderBuffers < 3) ++ return; + + int last = m_iDisplayedRenderBuffer; +- m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - m_swapCount) % m_iNumRenderBuffers; +- m_iFlipRequestRenderBuffer = m_iCurrentRenderBuffer; +- +-// // we have caught up with output so all buffers are re-usable +-// if (last != m_iDisplayedRenderBuffer +-// && m_iDisplayedRenderBuffer == m_iOutputRenderBuffer) +-// { +-// CLog::Log(LOGNOTICE,"-------------- all displayed"); +-// m_bAllRenderBuffersDisplayed = true; +-// } ++ m_iDisplayedRenderBuffer = (m_iCurrentRenderBuffer + m_iNumRenderBuffers - 1) % m_iNumRenderBuffers; + + if (last != m_iDisplayedRenderBuffer + && m_iDisplayedRenderBuffer != m_iCurrentRenderBuffer) +@@ -1044,7 +1025,10 @@ bool CXBMCRenderManager::GetStats(double &sleeptime, double &pts, int &bufferLev + CSharedLock lock(m_sharedSection); + sleeptime = m_sleeptime; + pts = m_presentPts; +- bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; ++ if (m_iNumRenderBuffers < 3) ++ bufferLevel = -1; ++ else ++ bufferLevel = (m_iOutputRenderBuffer - m_iCurrentRenderBuffer + m_iNumRenderBuffers) % m_iNumRenderBuffers; + return true; + } + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h +index 24f9798..f1fde10 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.h ++++ b/xbmc/cores/VideoRenderers/RenderManager.h +@@ -43,7 +43,7 @@ + + namespace DXVA { class CProcessor; } + namespace VAAPI { class CSurfaceHolder; } +-namespace VDPAU { struct CVdpauRenderPicture; } ++namespace VDPAU { class CVdpauRenderPicture; } + struct DVDVideoPicture; + + #define ERRORBUFFSIZE 30 +@@ -242,23 +242,17 @@ class CXBMCRenderManager + // displayed or even rendered). + // Current: is the current buffer being or having been submitted for render to back buffer. + // Cannot go past "Output" buffer (else it would be rendering old output). +- // FlipRequest: is the render buffer that has last been submitted for render AND importantly has had +- // swap-buffer flip subsequently invoked (thus flip to front buffer is requested for vblank +- // subsequent to render completion). + // Displayed: is the buffer that is now considered to be safely copied from back buffer to front buffer + // (we assume that after two swap-buffer flips for the same "Current" render buffer that that + // buffer will be safe, but otherwise we consider that only the previous-to-"Current" is guaranteed). +- // Last: is the last buffer successfully submitted for render to back buffer (purpose: to rollback to in +- // unexpected case where a texture render fails). + + int m_iCurrentRenderBuffer; + int m_iNumRenderBuffers; +-// int m_iLastRenderBuffer; +- int m_iFlipRequestRenderBuffer; + int m_iOutputRenderBuffer; + int m_iDisplayedRenderBuffer; + bool m_bAllRenderBuffersDisplayed; + bool m_bUseBuffering; ++ bool m_bCodecSupportsBuffering; + int m_speed; + CEvent m_flipEvent; + +@@ -284,9 +278,7 @@ class CXBMCRenderManager + CEvent m_presentevent; + CEvent m_flushEvent; + CDVDClock *m_pClock; +- uint64_t m_rendertime; +- double m_swaptime; +- unsigned int m_swapCount; ++ + + OVERLAY::CRenderer m_overlays; + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index ce39866..3c2213e 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +@@ -660,7 +660,7 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(DVDVideoPicture* pDvdVideoPicture) + m_skippedDeint = 0; + + m_requestSkipDeint = false; +- pDvdVideoPicture->iFlags |= m_codecControlState; ++ pDvdVideoPicture->iFlags |= m_codecControlFlags; + + if(!m_started) + pDvdVideoPicture->iFlags |= DVP_FLAG_DROPPED; +@@ -882,13 +882,7 @@ unsigned CDVDVideoCodecFFmpeg::GetConvergeCount() + return 0; + } + +-void CDVDVideoCodecFFmpeg::SetSpeed(int speed) ++void CDVDVideoCodecFFmpeg::SetCodecControl(int flags) + { +- if (m_pHardware) +- m_pHardware->SetSpeed(speed); +-} +- +-void CDVDVideoCodecFFmpeg::SetCodecControl(int state) +-{ +- m_codecControlState = state; ++ m_codecControlFlags = flags; + } +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +index 9bd201a..6ea777d 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h +@@ -45,7 +45,6 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + virtual int Check (AVCodecContext* avctx) = 0; + virtual void Reset () {} + virtual bool CanSkipDeint() {return false; } +- virtual void SetSpeed(int speed) {} + virtual const std::string Name() = 0; + virtual CCriticalSection* Section() { return NULL; } + }; +@@ -63,8 +62,7 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + virtual const char* GetName() { return m_name.c_str(); }; // m_name is never changed after open + virtual unsigned GetConvergeCount(); + virtual bool GetPts(double &pts, int &skippedDeint, int &interlaced) {pts=m_decoderPts; skippedDeint=m_skippedDeint; if (m_pFrame) interlaced = m_pFrame->interlaced_frame; return true;} +- virtual void SetSpeed(int speed); +- virtual void SetCodecControl(int state); ++ virtual void SetCodecControl(int flags); + + bool IsHardwareAllowed() { return !m_bSoftware; } + IHardwareDecoder * GetHardware() { return m_pHardware; }; +@@ -125,6 +123,6 @@ class CDVDVideoCodecFFmpeg : public CDVDVideoCodec + double m_decoderPts, m_decoderInterval; + int m_skippedDeint; + bool m_requestSkipDeint; +- int m_codecControlState; ++ int m_codecControlFlags; + std::vector m_formats; + }; +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index 28dfea0..93e375b 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -453,9 +453,6 @@ void CDVDPlayerVideo::Process() + if(m_speed == DVD_PLAYSPEED_PAUSE) + m_iNrOfPicturesNotToSkip = 0; + m_droppingStats.Reset(); +-// g_renderManager.EnableBuffering(m_speed == DVD_PLAYSPEED_NORMAL); +- if (m_pVideoCodec) +- m_pVideoCodec->SetSpeed(m_speed); + } + else if (pMsg->IsType(CDVDMsg::PLAYER_STARTED)) + { +@@ -502,10 +499,9 @@ void CDVDPlayerVideo::Process() + } + int codecControl = 0; + if (iDropDirective & EOS_BUFFER_LEVEL) +- { +- if (iDropDirective & EOS_BUFFER_LEVEL) +- codecControl |= DVP_FLAG_DRAIN; +- } ++ codecControl |= DVP_FLAG_DRAIN; ++ if (m_speed > DVD_PLAYSPEED_NORMAL) ++ codecControl |= DVP_FLAG_NO_POSTPROC; + m_pVideoCodec->SetCodecControl(codecControl); + if (iDropDirective & EOS_DROPPED) + { +@@ -567,15 +563,6 @@ void CDVDPlayerVideo::Process() + } + + m_videoStats.AddSampleBytes(pPacket->iSize); +- // assume decoder dropped a picture if it didn't give us any +- // picture from a demux packet, this should be reasonable +- // for libavformat as a demuxer as it normally packetizes +- // pictures when they come from demuxer +-// if(bRequestDrop && !bPacketDrop && (iDecoderState & VC_BUFFER) && !(iDecoderState & VC_PICTURE)) +-// { +-// m_iDroppedFrames++; +-// iDropped++; +-// } + + bRequestDrop = false; + +@@ -636,7 +623,7 @@ void CDVDPlayerVideo::Process() + m_iNrOfPicturesNotToSkip--; + } + +- // validate picture timing, ++ // validate picture timing, + // if both dts/pts invalid, use pts calulated from picture.iDuration + // if pts invalid use dts, else use picture.pts as passed + if (picture.dts == DVD_NOPTS_VALUE && picture.pts == DVD_NOPTS_VALUE) +@@ -1213,39 +1200,6 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + m_FlipTimeStamp += max(0.0, iSleepTime); + m_FlipTimeStamp += iFrameDuration; + +-// if (iSleepTime <= 0 && m_speed) +-// m_iLateFrames++; +-// else +-// m_iLateFrames = 0; +-// +-// // ask decoder to drop frames next round, as we are very late +-// if(m_iLateFrames > 10) +-// { +-// if (!(pPicture->iFlags & DVP_FLAG_NOSKIP)) +-// { +-// //if we're calculating the framerate, +-// //don't drop frames until we've calculated a stable framerate +-// if (m_bAllowDrop || m_speed != DVD_PLAYSPEED_NORMAL) +-// { +-// result |= EOS_VERYLATE; +-// m_pullupCorrection.Flush(); //dropped frames mess up the pattern, so just flush it +-// } +-// +-// //if we requested 5 drops in a row and we're still late, drop on output +-// //this keeps a/v sync if the decoder can't drop, or we're still calculating the framerate +-// if (m_iDroppedRequest > 5) +-// { +-// m_iDroppedRequest--; //decrease so we only drop half the frames +-// return result | EOS_DROPPED; +-// } +-// m_iDroppedRequest++; +-// } +-// } +-// else +-// { +-// m_iDroppedRequest = 0; +-// } +- + if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) + || (pPicture->iFlags & DVP_FLAG_DROPPED)) + { +@@ -1648,15 +1602,18 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + // get decoder stats + if (!m_pVideoCodec->GetPts(iDecoderPts, iSkippedDeint, interlaced)) + iDecoderPts = pts; ++ if (iDecoderPts == DVD_NOPTS_VALUE) ++ iDecoderPts = pts; + + // get render stats + g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); + +- if (iBufferLevel < 2) ++ if (iBufferLevel < 0) ++ result |= EOS_BUFFER_LEVEL; ++ else if (iBufferLevel < 2) + { + result |= EOS_BUFFER_LEVEL; +- if (iBufferLevel < 1) +- CLog::Log(LOGDEBUG,"--------------------- hurry: %d", iBufferLevel); ++ CLog::Log(LOGDEBUG,"CDVDPlayerVideo::CalcDropRequirement - hurry: %d", iBufferLevel); + } + + bNewFrame = iDecoderPts != m_droppingStats.m_lastDecoderPts; +@@ -1666,7 +1623,6 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + else + iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; + +- // add any gains regardless of being late + if (m_droppingStats.m_lastDecoderPts > 0 + && bNewFrame + && m_bAllowDrop +@@ -1734,7 +1690,6 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + { + m_droppingStats.m_dropRequests--; //decrease so we only drop half the frames + m_droppingStats.m_requestOutputDrop = true; +- CLog::Log(LOGNOTICE,"-------- drop output"); + } + else if (bNewFrame) + m_droppingStats.m_dropRequests++; +-- +1.7.10 + + +From f5a828fa3fb1f5cfd127cb1bab7bad9f11d70515 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:11:32 +0200 +Subject: [PATCH 03/10] backport some xvba changes + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp | 61 +++++++++++++++---------- + xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h | 3 -- + 2 files changed, 37 insertions(+), 27 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +index fa96284..127c958 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +@@ -21,6 +21,7 @@ + + #include "system.h" + #ifdef HAVE_LIBXVBA ++ + #include + #include + #include "XVBA.h" +@@ -460,7 +461,6 @@ bool CDecoder::Open(AVCodecContext* avctx, const enum PixelFormat fmt, unsigned + m_xvbaBufferPool.data_buffer = 0; + m_xvbaBufferPool.iq_matrix_buffer = 0; + m_xvbaBufferPool.picture_descriptor_buffer = 0; +- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; + m_presentPicture = 0; + m_xvbaConfig.numRenderBuffers = surfaces; + m_decoderThread = CThread::GetCurrentThreadId(); +@@ -573,8 +573,6 @@ bool CDecoder::Supports(EINTERLACEMETHOD method) + + void CDecoder::ResetState() + { +- picAge.b_age = picAge.ip_age[0] = picAge.ip_age[1] = 256*256*256*64; +- + m_displayState = XVBA_OPEN; + } + +@@ -730,6 +728,40 @@ bool CDecoder::CreateSession(AVCodecContext* avctx) + + void CDecoder::DestroySession() + { ++ // wait for unfinished decoding jobs ++ XbmcThreads::EndTime timer; ++ if (m_xvbaConfig.xvbaSession) ++ { ++ for (unsigned int i = 0; i < m_videoSurfaces.size(); ++i) ++ { ++ xvba_render_state *render = m_videoSurfaces[i]; ++ if (render->surface) ++ { ++ XVBA_Surface_Sync_Input syncInput; ++ XVBA_Surface_Sync_Output syncOutput; ++ syncInput.size = sizeof(syncInput); ++ syncInput.session = m_xvbaConfig.xvbaSession; ++ syncInput.surface = render->surface; ++ syncInput.query_status = XVBA_GET_SURFACE_STATUS; ++ syncOutput.size = sizeof(syncOutput); ++ timer.Set(1000); ++ while(!timer.IsTimePast()) ++ { ++ if (Success != g_XVBA_vtable.SyncSurface(&syncInput, &syncOutput)) ++ { ++ CLog::Log(LOGERROR,"XVBA::DestroySession - failed sync surface"); ++ break; ++ } ++ if (!(syncOutput.status_flags & XVBA_STILL_PENDING)) ++ break; ++ Sleep(10); ++ } ++ if (timer.IsTimePast()) ++ CLog::Log(LOGERROR,"XVBA::DestroySession - unfinished decoding job"); ++ } ++ } ++ } ++ + m_xvbaOutput.Dispose(); + + XVBA_Destroy_Decode_Buffers_Input bufInput; +@@ -1052,7 +1084,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + { + CDVDVideoCodecFFmpeg* ctx = (CDVDVideoCodecFFmpeg*)avctx->opaque; + CDecoder* xvba = (CDecoder*)ctx->GetHardware(); +- struct pictureAge* pA = &xvba->picAge; + + pic->data[0] = + pic->data[1] = +@@ -1133,20 +1164,6 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) + + pic->data[0] = (uint8_t*)render; + +- if(pic->reference) +- { +- pic->age = pA->ip_age[0]; +- pA->ip_age[0]= pA->ip_age[1]+1; +- pA->ip_age[1]= 1; +- pA->b_age++; +- } +- else +- { +- pic->age = pA->b_age; +- pA->ip_age[0]++; +- pA->ip_age[1]++; +- pA->b_age = 1; +- } + pic->type= FF_BUFFER_TYPE_USER; + + render->state |= FF_XVBA_STATE_USED_FOR_REFERENCE; +@@ -1198,11 +1215,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) + m_bufferStats.IncDecoded(); + m_xvbaOutput.m_dataPort.SendOutMessage(COutputDataProtocol::NEWFRAME, &pic, sizeof(pic)); + +- m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_SKIP_PROC); +- if (m_codecControl & DVP_FLAG_SKIP_PROC) +- { +- m_bufferStats.SetCmd(DVP_FLAG_SKIP_PROC); +- } ++ m_codecControl = pic.DVDPic.iFlags & (DVP_FLAG_DRAIN | DVP_FLAG_NO_POSTPROC); + } + + int retval = 0; +@@ -2328,7 +2341,7 @@ bool COutput::CreateGlxContext() + XFree(visuals); + + m_pixmap = XCreatePixmap(m_Display, +- DefaultRootWindow(m_Display), ++ m_Window, + 192, + 108, + visInfo.depth); +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +index 0abf972..24331e9 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +@@ -33,7 +33,6 @@ + #include "libavcodec/xvba.h" + #include "utils/ActorProtocol.h" + #include "settings/VideoSettings.h" +-#include + #include + #include + #include +@@ -372,8 +371,6 @@ class CDecoder : public CDVDVideoCodecFFmpeg::IHardwareDecoder, + }; + XVBABufferPool m_xvbaBufferPool; + +- pictureAge picAge; +- + COutput m_xvbaOutput; + CXvbaBufferStats m_bufferStats; + CEvent m_inMsgEvent; +-- +1.7.10 + + +From d608d480e4159b71e0dfd18f20ba27ecc226fa97 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:12:16 +0200 +Subject: [PATCH 04/10] player and renderer, squash me later + +--- + xbmc/cores/VideoRenderers/RenderManager.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index 95372e0..ac31c32 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -237,9 +237,9 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + + // check if decoder supports buffering + m_bCodecSupportsBuffering = false; +- if (format == DVDVideoPicture::FMT_VDPAU +- || format == DVDVideoPicture::FMT_VDPAU_420 +- || format == DVDVideoPicture::FMT_XVBA) ++ if ((flags & DVDVideoPicture::FMT_VDPAU) ++ || (flags & DVDVideoPicture::FMT_VDPAU_420) ++ || (flags & DVDVideoPicture::FMT_XVBA)) + m_bCodecSupportsBuffering = true; + + bool result = m_pRenderer->Configure(width, height, d_width, d_height, fps, flags, format); +-- +1.7.10 + + +From ca91233b8590a6061fe9b24c00ff62ecb96bc333 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 31 Aug 2012 15:12:45 +0200 +Subject: [PATCH 05/10] ati, fix segfault on exit + +--- + xbmc/video/VideoReferenceClock.cpp | 12 ++++++++++++ + xbmc/video/VideoReferenceClock.h | 1 + + 2 files changed, 13 insertions(+) + +diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp +index 24c035b..d0f1ed7 100644 +--- a/xbmc/video/VideoReferenceClock.cpp ++++ b/xbmc/video/VideoReferenceClock.cpp +@@ -123,6 +123,18 @@ + #endif + } + ++CVideoReferenceClock::~CVideoReferenceClock() ++{ ++#if defined(HAS_GLX) ++ // some ATI voodoo, if we don't close the display, we crash on exit ++ if (m_Dpy) ++ { ++ XCloseDisplay(m_Dpy); ++ m_Dpy = NULL; ++ } ++#endif ++} ++ + void CVideoReferenceClock::Process() + { + bool SetupSuccess = false; +diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/video/VideoReferenceClock.h +index 966af37..742dc79 100644 +--- a/xbmc/video/VideoReferenceClock.h ++++ b/xbmc/video/VideoReferenceClock.h +@@ -59,6 +59,7 @@ class CVideoReferenceClock : public CThread + { + public: + CVideoReferenceClock(); ++ virtual ~CVideoReferenceClock(); + + int64_t GetTime(bool interpolated = true); + int64_t GetFrequency(); +-- +1.7.10 + + +From 5b5ce20c6902643e4f858a3ca45cefc3e4de05af Mon Sep 17 00:00:00 2001 +From: Joakim Plate +Date: Sat, 14 Jul 2012 21:00:13 +0200 +Subject: [PATCH 06/10] X11: re-evaluate vsync method after having modified + window + +It could have moved between outputs on different hardware +--- + xbmc/rendering/gl/RenderSystemGL.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/xbmc/rendering/gl/RenderSystemGL.cpp b/xbmc/rendering/gl/RenderSystemGL.cpp +index be7dfea..bd8e91b 100644 +--- a/xbmc/rendering/gl/RenderSystemGL.cpp ++++ b/xbmc/rendering/gl/RenderSystemGL.cpp +@@ -174,6 +174,7 @@ bool CRenderSystemGL::ResetRenderSystem(int width, int height, bool fullScreen, + { + m_width = width; + m_height = height; ++ m_bVsyncInit = false; + + glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); + +-- +1.7.10 + + +From c0409779940d74993669788ce0b01d257508a581 Mon Sep 17 00:00:00 2001 +From: Joakim Plate +Date: Sun, 8 Jul 2012 01:06:05 +0200 +Subject: [PATCH 07/10] [tinyxml] invalid reading of xml from FILE pointers + +buf is not a null terminated string, so don't rely on it +--- + xbmc/utils/XBMCTinyXML.cpp | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/xbmc/utils/XBMCTinyXML.cpp b/xbmc/utils/XBMCTinyXML.cpp +index 82e2451..707653c 100644 +--- a/xbmc/utils/XBMCTinyXML.cpp ++++ b/xbmc/utils/XBMCTinyXML.cpp +@@ -91,12 +91,9 @@ bool CXBMCTinyXML::LoadFile(FILE *f, TiXmlEncoding encoding) + { + CStdString data(""); + char buf[BUFFER_SIZE]; +- int result, count = 0; ++ int result; + while ((result = fread(buf, 1, BUFFER_SIZE, f)) > 0) +- { +- data.reserve(BUFFER_SIZE * (++count)); +- data.append(buf); +- } ++ data.append(buf, result); + return Parse(data, NULL, encoding) != NULL; + } + +-- +1.7.10 + + +From aa661e7bd39591141fbab27a4d427db622fa3dbb Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 2 Sep 2012 10:33:08 +0200 +Subject: [PATCH 08/10] dvdplayer audio: improve a/v when using skip/dupe + method, duration of packets may be too long for + proper sync + +--- + xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +index 9f2128c..0e4adaa 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +@@ -719,7 +719,7 @@ void CDVDPlayerAudio::HandleSyncError(double duration) + + //check if measured error for 1 second + now = CurrentHostCounter(); +- if ((now - m_errortime) >= m_freq) ++ if ((now - m_errortime) >= m_freq * 2) + { + m_errortime = now; + m_error = m_errorbuff / m_errorcount; +@@ -759,9 +759,21 @@ void CDVDPlayerAudio::HandleSyncError(double duration) + { + //check how many packets to skip/duplicate + m_skipdupcount = (int)(m_error / duration); +- //if less than one frame off, see if it's more than two thirds of a frame, so we can get better in sync +- if (m_skipdupcount == 0 && fabs(m_error) > duration / 3 * 2) +- m_skipdupcount = (int)(m_error / (duration / 3 * 2)); ++ ++ if (m_skipdupcount == 0) ++ { ++ double delay; ++ if (m_error < 0) ++ { ++ m_skipdupcount -= 1; ++ delay = ((double)DVD_TIME_TO_MSEC(duration + m_error)) / 1000; ++ } ++ else ++ { ++ delay = ((double)DVD_TIME_TO_MSEC(m_error)) / 1000; ++ } ++ m_dvdAudio.AddSilence(delay); ++ } + + if (m_skipdupcount > 0) + CLog::Log(LOGDEBUG, "CDVDPlayerAudio:: Duplicating %i packet(s) of %.2f ms duration", +-- +1.7.10 + + +From 68b93215319f4ad4d0ee72797f82214ff8490379 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 2 Sep 2012 16:05:21 +0200 +Subject: [PATCH 09/10] video player: present correct pts to user for a/v sync + +--- + xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 57 ++++++++++++++++++++++--------- + xbmc/cores/dvdplayer/DVDPlayerVideo.h | 2 +- + 2 files changed, 42 insertions(+), 17 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index 93e375b..7e39690 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -1183,22 +1183,22 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + iSleepTime = iFrameSleep; + else + iSleepTime = iFrameSleep + (iClockSleep - iFrameSleep) / m_autosync; +- +-#ifdef PROFILE /* during profiling, try to play as fast as possible */ +- iSleepTime = 0; +-#endif +- +- // present the current pts of this frame to user, and include the actual +- // presentation delay, to allow him to adjust for it +- if( m_stalled ) +- m_iCurrentPts = DVD_NOPTS_VALUE; +- else +- m_iCurrentPts = pts - max(0.0, iSleepTime); +- +- // timestamp when we think next picture should be displayed based on current duration +- m_FlipTimeStamp = iCurrentClock; +- m_FlipTimeStamp += max(0.0, iSleepTime); +- m_FlipTimeStamp += iFrameDuration; ++// ++//#ifdef PROFILE /* during profiling, try to play as fast as possible */ ++// iSleepTime = 0; ++//#endif ++// ++// // present the current pts of this frame to user, and include the actual ++// // presentation delay, to allow him to adjust for it ++// if( m_stalled ) ++// m_iCurrentPts = DVD_NOPTS_VALUE; ++// else ++// m_iCurrentPts = pts - max(0.0, iSleepTime); ++// ++// // timestamp when we think next picture should be displayed based on current duration ++// m_FlipTimeStamp = iCurrentClock; ++// m_FlipTimeStamp += max(0.0, iSleepTime); ++// m_FlipTimeStamp += iFrameDuration; + + if ((m_droppingStats.m_requestOutputDrop && !(pPicture->iFlags & DVP_FLAG_NOSKIP)) + || (pPicture->iFlags & DVP_FLAG_DROPPED)) +@@ -1505,6 +1505,22 @@ void CDVDPlayerVideo::ResetFrameRateCalc() + g_advancedSettings.m_videoFpsDetect == 0; + } + ++double CDVDPlayerVideo::GetCurrentPts() ++{ ++ double iSleepTime, iRenderPts; ++ int iBufferLevel; ++ ++ // get render stats ++ g_renderManager.GetStats(iSleepTime, iRenderPts, iBufferLevel); ++ ++ if( m_stalled ) ++ iRenderPts = DVD_NOPTS_VALUE; ++ else ++ iRenderPts = iRenderPts - max(0.0, iSleepTime); ++ ++ return iRenderPts; ++} ++ + #define MAXFRAMERATEDIFF 0.01 + #define MAXFRAMESERR 1000 + +@@ -1623,6 +1639,15 @@ int CDVDPlayerVideo::CalcDropRequirement(double pts) + else + iInterval = 1/m_fFrameRate*(double)DVD_TIME_BASE; + ++ ++ m_FlipTimeStamp = m_pClock->GetAbsoluteClock() + max(0.0, iSleepTime) + iInterval; ++ ++ if( m_stalled ) ++ m_iCurrentPts = DVD_NOPTS_VALUE; ++ else ++ m_iCurrentPts = iRenderPts - max(0.0, iSleepTime); ++ ++ + if (m_droppingStats.m_lastDecoderPts > 0 + && bNewFrame + && m_bAllowDrop +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.h b/xbmc/cores/dvdplayer/DVDPlayerVideo.h +index a0322dc..6fff15c 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.h ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.h +@@ -106,7 +106,7 @@ class CDVDPlayerVideo : public CThread + + bool InitializedOutputDevice(); + +- double GetCurrentPts() { return m_iCurrentPts; } ++ double GetCurrentPts(); + int GetPullupCorrection() { return m_pullupCorrection.GetPatternLength(); } + + double GetOutputDelay(); /* returns the expected delay, from that a packet is put in queue */ +-- +1.7.10 + + +From b38863d14fb42fe86d0e53d9d34d84e1b9eb6907 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Tue, 4 Sep 2012 08:55:36 +0200 +Subject: [PATCH 10/10] vdpau: disable interop yuv and studio level + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 10 +++++----- + xbmc/settings/GUISettings.cpp | 4 ++-- + 2 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +index 16edf55..04ad61d 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +@@ -366,7 +366,7 @@ bool CDecoder::Supports(EINTERLACEMETHOD method) + || method == VS_INTERLACEMETHOD_AUTO) + return true; + +- if (g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) ++ if (0) //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv")) + { + if (method == VS_INTERLACEMETHOD_RENDER_BOB) + return true; +@@ -1697,7 +1697,7 @@ void CMixer::SetColor() + //vdp_st = vdp_generate_csc_matrix(&m_Procamp, VDP_COLOR_STANDARD_ITUR_BT_601, &m_CSCMatrix); + + VdpVideoMixerAttribute attributes[] = { VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX }; +- if (g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) ++ if (0) //g_guiSettings.GetBool("videoplayer.vdpaustudiolevel")) + { + float studioCSC[3][4]; + GenerateStudioCSCMatrix(colorStandard, studioCSC); +@@ -1846,7 +1846,7 @@ void CMixer::SetDeinterlacing() + + SetDeintSkipChroma(); + +- m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); ++ m_config.useInteropYuv = false; //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); + } + + void CMixer::SetDeintSkipChroma() +@@ -2038,7 +2038,7 @@ void CMixer::Init() + m_vdpError = false; + + m_config.upscale = g_advancedSettings.m_videoVDPAUScaling; +- m_config.useInteropYuv = g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); ++ m_config.useInteropYuv = false; //g_guiSettings.GetBool("videoplayer.usevdpauinteropyuv"); + + CreateVdpauMixer(); + } +@@ -3215,7 +3215,7 @@ bool COutput::GLInit() + { + m_config.usePixmaps = true; + g_guiSettings.SetBool("videoplayer.usevdpauinterop",false); +- g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); ++// g_guiSettings.SetBool("videoplayer.usevdpauinteropyuv",false); + } + if (!glXBindTexImageEXT) + glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 2d79423..e29c8c1 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -598,7 +598,7 @@ void CGUISettings::Initialize() + #ifdef HAVE_LIBVDPAU + AddBool(vp, "videoplayer.usevdpau", 13425, true); + AddBool(vp, "videoplayer.usevdpauinterop", 13433, true); +- AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); ++// AddBool(vp, "videoplayer.usevdpauinteropyuv", 13434, true); + #endif + #ifdef HAVE_LIBVA + AddBool(vp, "videoplayer.usevaapi", 13426, true); +@@ -672,7 +672,7 @@ void CGUISettings::Initialize() + AddSeparator(vp, "videoplayer.sep1.5"); + #ifdef HAVE_LIBVDPAU + AddBool(NULL, "videoplayer.vdpauUpscalingLevel", 13121, false); +- AddBool(vp, "videoplayer.vdpaustudiolevel", 13122, false); ++// AddBool(vp, "videoplayer.vdpaustudiolevel", 13122, false); + #endif + #endif + AddSeparator(vp, "videoplayer.sep5"); +-- +1.7.10 + From 04087ed83c7386585ec2702e042806058bb32636 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 4 Sep 2012 23:29:22 +0200 Subject: [PATCH 23/32] xbmc-rpi-pvr: merge with package 'xbmc-rpi' Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-rpi/install | 4 +--- packages/mediacenter/xbmc-rpi/meta | 9 ++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/mediacenter/xbmc-rpi/install b/packages/mediacenter/xbmc-rpi/install index e492a76b97e..d17d97fccb5 100755 --- a/packages/mediacenter/xbmc-rpi/install +++ b/packages/mediacenter/xbmc-rpi/install @@ -29,9 +29,7 @@ mkdir -p $INSTALL/usr/bin cp $PKG_DIR/scripts/gputemp $INSTALL/usr/bin cp $PKG_DIR/scripts/wait_on_xbmc_exit $INSTALL/usr/bin cp $PKG_BUILD/tools/EventClients/Clients/XBMC\ Send/xbmc-send.py $INSTALL/usr/bin/xbmc-send - if [ "$PVR" = yes ]; then - cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin - fi + cp $PKG_DIR/scripts/setwakeup.sh $INSTALL/usr/bin mkdir -p $INSTALL/usr/lib/xbmc cp $PKG_BUILD/xbmc.bin $INSTALL/usr/lib/xbmc diff --git a/packages/mediacenter/xbmc-rpi/meta b/packages/mediacenter/xbmc-rpi/meta index 41fd39d83b8..5eded968e3d 100644 --- a/packages/mediacenter/xbmc-rpi/meta +++ b/packages/mediacenter/xbmc-rpi/meta @@ -42,6 +42,10 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS Imaging" PKG_DEPENDS="$PKG_DEPENDS simplejson" +# various PVR clients + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" + if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS libX11 libXext" @@ -169,8 +173,3 @@ fi if [ "$XVBA" = yes ]; then PKG_BUILD_DEPENDS="$PKG_BUILD_DEPENDS xf86-video-fglrx" fi - -if [ "$PVR" = yes ]; then - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" -fi From debed63cff2951690191542e6daf04b3afdf0eaa Mon Sep 17 00:00:00 2001 From: Chris Swan Date: Tue, 4 Sep 2012 23:11:33 +0100 Subject: [PATCH 24/32] /dev/loop0 support added Allows writing to an image file that can subsequently be copied onto an SD card --- .../bcm2835-bootloader/files/create_sdcard | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index 957bf6cbe5e..3ea03b69b95 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -22,6 +22,10 @@ # usage: sudo ./create_sdcard # example: sudo ./create_sdcard /dev/sdb +# loop example: sudo ./create_sdcard /dev/loop0 ~/vSD.img + +# create an empty image file for use with loop device like this: +# dd if=/dev/zero of=~/vSD.img bs=1M count=910 if [ "$(id -u)" != "0" ]; then clear @@ -38,6 +42,7 @@ if [ -z "$1" ]; then echo "# please execute with your drive as option #" echo "# example: sudo ./create_sdcard /dev/sdb #" echo "# or: sudo ./create_sdcard /dev/mmcblk0 #" + echo "# or: sudo ./create_sdcard /dev/loop0 ~/vSD.img #" echo "#########################################################" exit 1 fi @@ -46,6 +51,11 @@ DISK="$1" if [ "$DISK" = "/dev/mmcblk0" ]; then PART1="${DISK}p1" PART2="${DISK}p2" +elif [ "$DISK" = "/dev/loop0" ]; then + PART1="${DISK}p1" + PART2="${DISK}p2" + IMGFILE="$2" + losetup $DISK $IMGFILE else PART1="${DISK}1" PART2="${DISK}2" @@ -199,6 +209,12 @@ echo "#########################################################" echo "creating filesystem on $PART2..." mkfs.ext4 "$PART2" -L Storage +# remount loopback device + if [ "$DISK" = "/dev/loop0" ]; then + losetup -d $DISK + losetup $DISK $IMGFILE -o 1048576 --sizelimit 131071488 + PART1=$DISK + fi # mount partition echo "mounting partition $PART1 ..." @@ -239,4 +255,9 @@ echo "#########################################################" echo "cleaning tempdir..." rmdir $MOUNTPOINT +# unmount loopback device + if [ "$DISK" = "/dev/loop0" ]; then + losetup -d $DISK + fi + echo "...installation finished" From a92c2e155337eacc521f12cd28563cccf0fe85ec Mon Sep 17 00:00:00 2001 From: Chris Swan Date: Wed, 5 Sep 2012 00:35:37 +0200 Subject: [PATCH 25/32] echo block enhanced with .img file instructions --- packages/tools/bcm2835-bootloader/files/create_sdcard | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index 3ea03b69b95..ac8219b9f32 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -43,6 +43,8 @@ if [ -z "$1" ]; then echo "# example: sudo ./create_sdcard /dev/sdb #" echo "# or: sudo ./create_sdcard /dev/mmcblk0 #" echo "# or: sudo ./create_sdcard /dev/loop0 ~/vSD.img #" + echo "# to create an image file for /dev/loop0 option: #" + echo "# sudo dd if=/dev/zero of=~/vSD.img bs=1M count=910 #" echo "#########################################################" exit 1 fi From 4b3717515c5e935eb441ceafe345f6f2afcfa1d5 Mon Sep 17 00:00:00 2001 From: Chris Swan Date: Wed, 5 Sep 2012 01:03:50 +0200 Subject: [PATCH 26/32] forcing vfat as needed for /dev/loop0 --- packages/tools/bcm2835-bootloader/files/create_sdcard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index ac8219b9f32..18e8aca4c02 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -223,12 +223,12 @@ echo "#########################################################" if [ -d /dev/shm ]; then rm -rf /dev/shm/openelec_install mkdir -p /dev/shm/openelec_install - mount "$PART1" /dev/shm/openelec_install + mount -t vfat "$PART1" /dev/shm/openelec_install MOUNTPOINT=/dev/shm/openelec_install else rm -rf /tmp/openelec_install mkdir -p /tmp/openelec_install - mount "$PART1" /tmp/openelec_install + mount -t vfat "$PART1" /tmp/openelec_install MOUNTPOINT=/tmp/openelec_install fi From 15bf3b423b25704acc0f6d7421ca24040414df0b Mon Sep 17 00:00:00 2001 From: Chris Swan Date: Wed, 5 Sep 2012 01:19:04 +0200 Subject: [PATCH 27/32] -I option used on mkfs.vfat for /dev/loop0 support --- packages/tools/bcm2835-bootloader/files/create_sdcard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index 18e8aca4c02..b6f8a7d6601 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -206,7 +206,7 @@ echo "#########################################################" # create filesystem echo "creating filesystem on $PART1..." - mkfs.vfat "$PART1" -n System + mkfs.vfat "$PART1" -I -n System echo "creating filesystem on $PART2..." mkfs.ext4 "$PART2" -L Storage From 2dd0307b9723a0ebcc5559f76458f98673e8d98e Mon Sep 17 00:00:00 2001 From: Chris Swan Date: Wed, 5 Sep 2012 01:23:19 +0200 Subject: [PATCH 28/32] additional sync before losetup -d seems to be required by some disk subsystems, otherwise losetup -d fails due to device or resource busy --- packages/tools/bcm2835-bootloader/files/create_sdcard | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tools/bcm2835-bootloader/files/create_sdcard b/packages/tools/bcm2835-bootloader/files/create_sdcard index b6f8a7d6601..81a72ac9ae7 100755 --- a/packages/tools/bcm2835-bootloader/files/create_sdcard +++ b/packages/tools/bcm2835-bootloader/files/create_sdcard @@ -213,6 +213,7 @@ echo "#########################################################" # remount loopback device if [ "$DISK" = "/dev/loop0" ]; then + sync losetup -d $DISK losetup $DISK $IMGFILE -o 1048576 --sizelimit 131071488 PART1=$DISK From 2ddc417f4d1a978e13c5f308938bd06d612b3de6 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 5 Sep 2012 22:03:33 +0200 Subject: [PATCH 29/32] xbmc-frodo: update to xbmc-frodo-5ea1d22 Signed-off-by: Stephan Raue --- .../xbmc-frodo-theme-Confluence/meta | 2 +- packages/mediacenter/xbmc-frodo/meta | 8 +- ...-texturepacker-hostflags-and-rework.patch} | 0 ...a1d22-402-enable_yasm_in_ffmpeg-0.1.patch} | 0 ...ONOPTIMIZE_with_external_Python-0.1.patch} | 0 ...xbmc-frodo-5ea1d22-999-crosscompile.patch} | 0 ...-add_support_to_specify_GIT_REV-0.1.patch} | 0 ...o-5ea1d22-303-fix_libdvd_xFLAGS-0.1.patch} | 0 ...rodo-5ea1d22-311-fix_rsxs_build-0.1.patch} | 0 ...1-texturepacker-hostflags-and-rework.patch | 188 ++++++++++++++++++ ...HONOPTIMIZE_with_external_Python-0.1.patch | 19 ++ ...-5ea1d22-452-change_lcd_content-0.1.patch} | 0 ...22-453-add_openelec.tv_RSS_news-0.1.patch} | 0 ...o-5ea1d22-454-disable_backslash-0.1.patch} | 0 ...ea1d22-457-fix_connection_check-0.1.patch} | 0 ...5ea1d22-463-add_remote_devinput-0.1.patch} | 0 ...4-add_eject_keymapping_for_lirc-0.1.patch} | 0 ...frodo-5ea1d22-981-toggleButtonState.patch} | 0 tools/mkpkg/mkpkg_xbmc-frodo-pvr | 78 -------- 19 files changed, 213 insertions(+), 82 deletions(-) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch => bk/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch => bk/xbmc-frodo-5ea1d22-402-enable_yasm_in_ffmpeg-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch => bk/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-999-crosscompile.patch => bk/xbmc-frodo-5ea1d22-999-crosscompile.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch => xbmc-frodo-5ea1d22-001-add_support_to_specify_GIT_REV-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch => xbmc-frodo-5ea1d22-303-fix_libdvd_xFLAGS-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch => xbmc-frodo-5ea1d22-311-fix_rsxs_build-0.1.patch} (100%) create mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch create mode 100644 packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch => xbmc-frodo-5ea1d22-452-change_lcd_content-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch => xbmc-frodo-5ea1d22-453-add_openelec.tv_RSS_news-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch => xbmc-frodo-5ea1d22-454-disable_backslash-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch => xbmc-frodo-5ea1d22-457-fix_connection_check-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch => xbmc-frodo-5ea1d22-463-add_remote_devinput-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch => xbmc-frodo-5ea1d22-464-add_eject_keymapping_for_lirc-0.1.patch} (100%) rename packages/mediacenter/xbmc-frodo/patches/{xbmc-frodo-8f0c91b-981-toggleButtonState.patch => xbmc-frodo-5ea1d22-981-toggleButtonState.patch} (100%) delete mode 100755 tools/mkpkg/mkpkg_xbmc-frodo-pvr diff --git a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta index 97355bda77d..a4d63972ad3 100644 --- a/packages/mediacenter/xbmc-frodo-theme-Confluence/meta +++ b/packages/mediacenter/xbmc-frodo-theme-Confluence/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo-theme-Confluence" -PKG_VERSION="8f0c91b" +PKG_VERSION="5ea1d22" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-frodo/meta b/packages/mediacenter/xbmc-frodo/meta index b793564755f..9e3e1000e21 100644 --- a/packages/mediacenter/xbmc-frodo/meta +++ b/packages/mediacenter/xbmc-frodo/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc-frodo" -PKG_VERSION="8f0c91b" +PKG_VERSION="5ea1d22" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" @@ -43,8 +43,10 @@ PKG_AUTORECONF="no" PKG_DEPENDS="$PKG_DEPENDS simplejson" # various PVR clients - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-njoy" - PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr xbmc-addon-vuplus" + PKG_DEPENDS="$PKG_DEPENDS xbmc-pvr-addons" +# PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-njoy" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-vuplus" + PKG_DEPENDS="$PKG_DEPENDS xbmc-addon-xvdr" if [ "$DISPLAYSERVER" = "xorg-server" ]; then # for libX11 support diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-321-texturepacker-hostflags-and-rework.patch rename to packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-402-enable_yasm_in_ffmpeg-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-402-enable_yasm_in_ffmpeg-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-402-enable_yasm_in_ffmpeg-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-999-crosscompile.patch b/packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-999-crosscompile.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-999-crosscompile.patch rename to packages/mediacenter/xbmc-frodo/patches/bk/xbmc-frodo-5ea1d22-999-crosscompile.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-001-add_support_to_specify_GIT_REV-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-001-add_support_to_specify_GIT_REV-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-001-add_support_to_specify_GIT_REV-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-303-fix_libdvd_xFLAGS-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-303-fix_libdvd_xFLAGS-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-303-fix_libdvd_xFLAGS-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-311-fix_rsxs_build-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-311-fix_rsxs_build-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-311-fix_rsxs_build-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch new file mode 100644 index 00000000000..db7d6f6c610 --- /dev/null +++ b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-321-texturepacker-hostflags-and-rework.patch @@ -0,0 +1,188 @@ +diff -Naur xbmc-frodo-5ea1d22/configure.in xbmc-frodo-5ea1d22.patch/configure.in +--- xbmc-frodo-5ea1d22/configure.in 2012-09-05 13:27:56.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/configure.in 2012-09-05 17:55:46.727316107 +0200 +@@ -437,6 +437,12 @@ + [use_texturepacker=$enableval], + [use_texturepacker=auto]) + ++AC_ARG_WITH([texturepacker-root], ++ [AS_HELP_STRING([--with-texturepacker-root], ++ [root dir to search for librarys and includes if building native TexturePacker (default is \$prefix)])], ++ [use_texturepacker_root=$withval], ++ [use_texturepacker_root=$prefix]) ++ + AC_ARG_WITH([lirc-device], + [AS_HELP_STRING([--with-lirc-device=file], + [specify the default LIRC device (default is /dev/lircd)])], +@@ -570,8 +576,7 @@ + use_cpu=cortex-a8 + check_sdl_arch=[`file /opt/local/lib/libSDL_image.dylib | awk '{V=7; print $V}'`] + if test "x$check_sdl_arch" = "xi386"; then +- use_texturepacker_native=yes +- USE_TEXTUREPACKER_NATIVE_ROOT="/opt/local" ++ use_texturepacker_root="/opt/local" + else + use_texturepacker=no + fi +@@ -587,8 +592,6 @@ + *86*-apple-darwin*) + use_joystick=no + use_vtbdecoder=no +- use_texturepacker_native=yes +- USE_TEXTUREPACKER_NATIVE_ROOT="$prefix" + ARCH="x86-osx" + AC_SUBST(ARCH_DEFINES, "-DTARGET_POSIX -DTARGET_DARWIN -DTARGET_DARWIN_OSX -D_LINUX") + ;; +@@ -1938,13 +1941,13 @@ + + USE_TEXTUREPACKER_NATIVE=0 + if test "x$use_texturepacker" != "xno"; then +- final_message="$final_message\n TexturePacker:Yes" + USE_TEXTUREPACKER=1 +- if test "x$use_texturepacker_native" = "xyes"; then ++ if test "x$cross_compiling" = "xyes"; then + USE_TEXTUREPACKER_NATIVE=1 +- if [[ ! -d "$USE_TEXTUREPACKER_NATIVE_ROOT" ]]; then +- USE_TEXTUREPACKER_NATIVE_ROOT= +- fi ++ USE_TEXTUREPACKER_NATIVE_ROOT="$use_texturepacker_root" ++ final_message="$final_message\n TexturePacker:Native ($USE_TEXTUREPACKER_NATIVE_ROOT)" ++ else ++ final_message="$final_message\n TexturePacker:Yes" + fi + else + final_message="$final_message\n TexturePacker:No" +diff -Naur xbmc-frodo-5ea1d22/lib/libsquish/Makefile.in xbmc-frodo-5ea1d22.patch/lib/libsquish/Makefile.in +--- xbmc-frodo-5ea1d22/lib/libsquish/Makefile.in 2012-09-05 13:28:31.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/lib/libsquish/Makefile.in 2012-09-05 17:56:05.017178267 +0200 +@@ -11,26 +11,25 @@ + singlecolourfit.cpp \ + squish.cpp + +-CXXFLAGS+=-I. +- +-LIB=libsquish.a +- +-ifeq (@USE_TEXTUREPACKER_NATIVE@,1) +-NATIVE_LIB=libsquish-native.so +-CLEAN_FILES+=$(NATIVE_LIB) ++LIB = libsquish.a ++NATIVE_LIB = libsquish-native.so ++CLEAN_FILES += $(NATIVE_LIB) ++ ++HOST_CXX ?= g++ ++CXXFLAGS += -I. ++HOST_CXXFLAGS += -I. + + ifeq ($(findstring Darwin,$(shell uname -s)),Darwin) +-NATIVE_ARCH=@DARWIN_NATIVE_ARCH@ ++ HOST_CXXFLAGS += @DARWIN_NATIVE_ARCH@ + endif + +-all: $(LIB) $(NATIVE_LIB) ++$(LIB): $(SRCS) + # TexturePacker links to libsquish and needs to run on build system, so make a native flavor. + $(NATIVE_LIB): $(SRCS) + ifeq ($(findstring Darwin,$(shell uname -s)),Darwin) +- g++ $(NATIVE_ARCH) -I. $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ ++ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -dynamiclib -install_name `pwd`/libsquish-native.so -o $@ + else +- g++ -I. $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ +-endif ++ $(HOST_CXX) $(HOST_CXXFLAGS) $(SRCS) -shared -fPIC -Wl,-soname,`pwd`/libsquish-native.so -o $@ + endif + + include ../../Makefile.include +diff -Naur xbmc-frodo-5ea1d22/tools/TexturePacker/Makefile.in xbmc-frodo-5ea1d22.patch/tools/TexturePacker/Makefile.in +--- xbmc-frodo-5ea1d22/tools/TexturePacker/Makefile.in 2012-09-05 13:28:16.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/tools/TexturePacker/Makefile.in 2012-09-05 17:55:49.927291649 +0200 +@@ -1,56 +1,54 @@ +-DEFINES += -D_LINUX -DUSE_LZO_PACKING ++DEFINES += -D_LINUX -DUSE_LZO_PACKING + ifneq ($(or $(findstring powerpc,@ARCH@),$(findstring ppc, @ARCH@)),) +-DEFINES += -DHOST_BIGENDIAN ++DEFINES += -DHOST_BIGENDIAN + endif + +-CXXFLAGS+= \ ++SRCS = \ ++ md5.cpp \ ++ SDL_anigif.cpp \ ++ XBTFWriter.cpp \ ++ XBMCTex.cpp \ ++ @abs_top_srcdir@/xbmc/guilib/XBTF.cpp ++ ++TARGET = TexturePacker ++CLEAN_FILES = $(TARGET) ++ ++all: $(TARGET) ++ ++HOST_CXX ?= g++ ++HOST_ROOT_PATH = @USE_TEXTUREPACKER_NATIVE_ROOT@ ++ ++LIBS += -lSDL_image -lSDL -llzo2 ++LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish ++HOST_LIBS += -L$(HOST_ROOT_PATH)/lib -lSDL_image -lSDL -llzo2 ++HOST_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native ++ ++CXXFLAGS += \ + -I. \ + -I@abs_top_srcdir@/lib \ + -I@abs_top_srcdir@/xbmc \ + -I@abs_top_srcdir@/xbmc/linux + +-RPATH=-Wl,-rpath=$(NATIVE_ROOT_PATH)/lib ++HOST_CXXFLAGS += \ ++ -I. \ ++ -I@abs_top_srcdir@/lib \ ++ -I@abs_top_srcdir@/xbmc \ ++ -I@abs_top_srcdir@/xbmc/linux \ ++ -I$(HOST_ROOT_PATH)/include ++ ++RPATH=-Wl,-rpath=$(HOST_ROOT_PATH)/lib + +-ifeq (@USE_TEXTUREPACKER_NATIVE@,1) +-NATIVE_ROOT_PATH=@USE_TEXTUREPACKER_NATIVE_ROOT@ +-ifdef NATIVE_ROOT_PATH + ifeq ($(findstring Darwin,$(shell uname -s)),Darwin) + DEFINES += -DTARGET_DARWIN + NATIVE_ARCH=@DARWIN_NATIVE_ARCH@ + RPATH= + endif +-NATIVE_CXXFLAGS+= -I. \ +- -I$(NATIVE_ROOT_PATH)/include \ +- -I@abs_top_srcdir@/lib \ +- -I@abs_top_srcdir@/xbmc \ +- -I@abs_top_srcdir@/xbmc/linux +-NATIVE_LIBS += -L$(NATIVE_ROOT_PATH)/lib +-endif +-NATIVE_LIBS += -lSDL_image -lSDL -llzo2 +-NATIVE_LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish-native +-else +-LIBS += -L@abs_top_srcdir@/lib/libsquish -lsquish +-endif +- +-LIBS += -lSDL_image -lSDL -llzo2 +- +-SRCS = \ +- md5.cpp \ +- SDL_anigif.cpp \ +- XBTFWriter.cpp \ +- XBMCTex.cpp \ +- @abs_top_srcdir@/xbmc/guilib/XBTF.cpp +- +- +-TARGET = TexturePacker +-CLEAN_FILES=$(TARGET) +- +-all: $(TARGET) + + ifeq (@USE_TEXTUREPACKER_NATIVE@,1) + # TexturePacker run native on build system, build it with native tools + $(TARGET): $(SRCS) +- g++ $(DEFINES) $(NATIVE_ARCH) $(NATIVE_CXXFLAGS) $(SRCS) $(NATIVE_LIBS) $(RPATH) -o $(TARGET) ++ make -C @abs_top_srcdir@/lib/libsquish libsquish-native.so ++ $(HOST_CXX) $(DEFINES) $(NATIVE_ARCH) $(HOST_CXXFLAGS) $(SRCS) $(HOST_LIBS) $(RPATH) -o $(TARGET) + clean: + rm -f $(TARGET) + else diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch new file mode 100644 index 00000000000..c320f3cacc4 --- /dev/null +++ b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-408-enable_PYTHONOPTIMIZE_with_external_Python-0.1.patch @@ -0,0 +1,19 @@ +diff -Naur xbmc-frodo-5ea1d22/xbmc/interfaces/python/XBPython.cpp xbmc-frodo-5ea1d22.patch/xbmc/interfaces/python/XBPython.cpp +--- xbmc-frodo-5ea1d22/xbmc/interfaces/python/XBPython.cpp 2012-09-05 13:28:20.000000000 +0200 ++++ xbmc-frodo-5ea1d22.patch/xbmc/interfaces/python/XBPython.cpp 2012-09-05 15:50:42.642317031 +0200 +@@ -525,11 +525,10 @@ + // at http://docs.python.org/using/cmdline.html#environment-variables + + #if !defined(_WIN32) && !defined(TARGET_ANDROID) +- /* PYTHONOPTIMIZE is set off intentionally when using external Python. +- Reason for this is because we cannot be sure what version of Python +- was used to compile the various Python object files (i.e. .pyo, +- .pyc, etc.). */ +- // check if we are running as real xbmc.app or just binary ++ // Required for python to find optimized code (pyo) files ++ setenv("PYTHONOPTIMIZE", "1", 1); ++ ++ // check if we are running as real xbmc.app or just binary + if (!CUtil::GetFrameworksPath(true).IsEmpty()) + { + // using external python, it's build looking for xxx/lib/python2.6 diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-452-change_lcd_content-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-452-change_lcd_content-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-452-change_lcd_content-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-453-add_openelec.tv_RSS_news-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-453-add_openelec.tv_RSS_news-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-453-add_openelec.tv_RSS_news-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-454-disable_backslash-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-454-disable_backslash-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-454-disable_backslash-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-457-fix_connection_check-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-457-fix_connection_check-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-457-fix_connection_check-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-463-add_remote_devinput-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-463-add_remote_devinput-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-463-add_remote_devinput-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-464-add_eject_keymapping_for_lirc-0.1.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-464-add_eject_keymapping_for_lirc-0.1.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-464-add_eject_keymapping_for_lirc-0.1.patch diff --git a/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-981-toggleButtonState.patch b/packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-981-toggleButtonState.patch similarity index 100% rename from packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-8f0c91b-981-toggleButtonState.patch rename to packages/mediacenter/xbmc-frodo/patches/xbmc-frodo-5ea1d22-981-toggleButtonState.patch diff --git a/tools/mkpkg/mkpkg_xbmc-frodo-pvr b/tools/mkpkg/mkpkg_xbmc-frodo-pvr deleted file mode 100755 index 8d937339126..00000000000 --- a/tools/mkpkg/mkpkg_xbmc-frodo-pvr +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh -################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) -# -# 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 OpenELEC.tv; see the file COPYING. If not, write to -# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. -# http://www.gnu.org/copyleft/gpl.html -################################################################################ - -PKG_NAME="xbmc-frodo" -PKG_VERSION="pvr" -GIT_REPO="-b master git://github.com/opdenkamp/xbmc.git" -DEST_DIR="$PKG_NAME-pvr" - -echo "getting sources..." - if [ ! -d $DEST_DIR-latest ]; then - git clone $GIT_REPO $DEST_DIR-latest - fi - - cd $DEST_DIR-latest - git pull - -echo "getting version..." - GIT_REV=`git log -n1 --format=%h` - echo $GIT_REV - cd .. - PKG_VERSION="$PKG_VERSION-$GIT_REV" - -echo "copying sources..." - rm -rf $PKG_NAME-$PKG_VERSION - cp -R $DEST_DIR-latest $PKG_NAME-$PKG_VERSION - echo "$GIT_REV" > $PKG_NAME-$PKG_VERSION/git.version - -echo "cleaning sources..." - rm -rf $PKG_NAME-$PKG_VERSION/.git - -echo "seperating theme..." - rm -rf $PKG_NAME-theme-Confluence-$PKG_VERSION - mv $PKG_NAME-$PKG_VERSION/addons/skin.confluence $PKG_NAME-theme-Confluence-$PKG_VERSION - -echo "cleaning sources..." - rm -rf $PKG_NAME-$PKG_VERSION/visualisations - rm -rf $PKG_NAME-$PKG_VERSION/lib/libSDL-* - rm -rf $PKG_NAME-$PKG_VERSION/lib/libcurl-* - rm -rf $PKG_NAME-$PKG_VERSION/project - - for i in "Changelog" "Fake\ Episode\ Maker" "MingwBuildEnvironment" \ - "PackageMaker" "Translator" "XBMCLive" "XprPack" \ - "HardwareConfigure" "Mach5" "osx" "UpdateThumbs.py" "XBMCTex"; do - rm -rf $PKG_NAME-$PKG_VERSION/tools/$i - done - - for i in dll a lib so bat; do - find $PKG_NAME-$PKG_VERSION -name *.$i -exec rm -rf {} ";" - done - - # bundled win32 binaries - rm -r $PKG_NAME-$PKG_VERSION/xbmc/visualizations/XBMCProjectM/win32 - -echo "packing sources..." - tar cvJf $PKG_NAME-$PKG_VERSION.tar.xz $PKG_NAME-$PKG_VERSION - tar cvJf $PKG_NAME-theme-Confluence-$PKG_VERSION.tar.xz $PKG_NAME-theme-Confluence-$PKG_VERSION - -echo "remove temporary sourcedir..." - rm -rf $PKG_NAME-$PKG_VERSION - rm -rf $PKG_NAME-theme-Confluence-$PKG_VERSION From 8af34b0135c4e7a90aed9d16f99ec6e6d2bd130c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 5 Sep 2012 22:04:37 +0200 Subject: [PATCH 30/32] new package: add package 'xbmc-pvr-addons' Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-pvr-addons/build | 33 ++++++++++++++ packages/mediacenter/xbmc-pvr-addons/install | 32 ++++++++++++++ packages/mediacenter/xbmc-pvr-addons/meta | 35 +++++++++++++++ ...mc-pvr-addons-94c9f6f-crosscompiling.patch | 20 +++++++++ tools/mkpkg/mkpkg_xbmc-pvr-addons | 43 +++++++++++++++++++ 5 files changed, 163 insertions(+) create mode 100755 packages/mediacenter/xbmc-pvr-addons/build create mode 100755 packages/mediacenter/xbmc-pvr-addons/install create mode 100644 packages/mediacenter/xbmc-pvr-addons/meta create mode 100644 packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch create mode 100755 tools/mkpkg/mkpkg_xbmc-pvr-addons diff --git a/packages/mediacenter/xbmc-pvr-addons/build b/packages/mediacenter/xbmc-pvr-addons/build new file mode 100755 index 00000000000..511952d6151 --- /dev/null +++ b/packages/mediacenter/xbmc-pvr-addons/build @@ -0,0 +1,33 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. config/options $1 + +cd $PKG_BUILD + +./configure --host=$TARGET_NAME \ + --build=$HOST_NAME \ + --prefix=/usr/share/xbmc \ + --disable-static \ + --enable-shared + +make diff --git a/packages/mediacenter/xbmc-pvr-addons/install b/packages/mediacenter/xbmc-pvr-addons/install new file mode 100755 index 00000000000..dac787ca1c3 --- /dev/null +++ b/packages/mediacenter/xbmc-pvr-addons/install @@ -0,0 +1,32 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. config/options $1 + +for addon in `find $PKG_BUILD/addons/ -type d -name "pvr.*"`; do + ADDON=`basename $addon` + mkdir -p $INSTALL/usr/share/xbmc/addons/$ADDON + cp -PRf $PKG_BUILD/addons/$ADDON/addon/* $INSTALL/usr/share/xbmc/addons/$ADDON + + mkdir -p $INSTALL/usr/lib/xbmc/addons/$ADDON + cp -Pf $PKG_BUILD/addons/$ADDON/*.pvr $INSTALL/usr/lib/xbmc/addons/$ADDON +done diff --git a/packages/mediacenter/xbmc-pvr-addons/meta b/packages/mediacenter/xbmc-pvr-addons/meta new file mode 100644 index 00000000000..1ca7bde4af8 --- /dev/null +++ b/packages/mediacenter/xbmc-pvr-addons/meta @@ -0,0 +1,35 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="xbmc-pvr-addons" +PKG_VERSION="94c9f6f" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="https://github.com/opdenkamp/xbmc-pvr-addons" +PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_DEPENDS="curl" +PKG_BUILD_DEPENDS="toolchain curl" +PKG_PRIORITY="optional" +PKG_SECTION="mediacenter" +PKG_SHORTDESC="Various PVR addons for XBMC" +PKG_LONGDESC="This addons allows XBMC PVR to connect to various TV/PVR backends and tuners." +PKG_IS_ADDON="no" +PKG_AUTORECONF="yes" diff --git a/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch b/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch new file mode 100644 index 00000000000..923c5230f81 --- /dev/null +++ b/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch @@ -0,0 +1,20 @@ +diff -Naur xbmc-pvr-addons-94c9f6f/configure.ac xbmc-pvr-addons-94c9f6f.patch/configure.ac +--- xbmc-pvr-addons-94c9f6f/configure.ac 2012-09-05 20:43:31.000000000 +0200 ++++ xbmc-pvr-addons-94c9f6f.patch/configure.ac 2012-09-05 21:24:01.619154672 +0200 +@@ -75,10 +75,12 @@ + use_libcurl="no" + PKG_CHECK_MODULES([CURL],[libcurl],use_libcurl="yes",AC_MSG_WARN("CURL was not found, N7 add-on will not be available")) + +-### Check for Intree building +-checkpath=".." +-AC_CHECK_FILE([$checkpath/xbmc/xbmc.h], [AM_CONDITIONAL(IS_INTREE_BUILD, true) intree=true], [AM_CONDITIONAL(IS_INTREE_BUILD, false) intree=false]) +-echo "Intree build: $intree" ++# ### Check for Intree building ++# checkpath=".." ++# AC_CHECK_FILE([$checkpath/xbmc/xbmc.h], [AM_CONDITIONAL(IS_INTREE_BUILD, true) intree=true], [AM_CONDITIONAL(IS_INTREE_BUILD, false) intree=false]) ++# echo "Intree build: $intree" ++ ++AM_CONDITIONAL(IS_INTREE_BUILD, false) + + HOST_CXXFLAGS="-Wall -Wextra -Wno-missing-field-initializers -Woverloaded-virtual -Wno-parentheses -fPIC $HOST_CXXFLAGS" + diff --git a/tools/mkpkg/mkpkg_xbmc-pvr-addons b/tools/mkpkg/mkpkg_xbmc-pvr-addons new file mode 100755 index 00000000000..1ae56728dd0 --- /dev/null +++ b/tools/mkpkg/mkpkg_xbmc-pvr-addons @@ -0,0 +1,43 @@ +#!/bin/sh +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# +# 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +echo "getting sources..." + if [ ! -d xbmc-pvr-addons.git ]; then + git clone git://github.com/opdenkamp/xbmc-pvr-addons.git xbmc-pvr-addons.git + fi + + cd xbmc-pvr-addons.git + git pull + GIT_REV=`git log -n1 --format=%h` + cd .. + +echo "copying sources..." + rm -rf xbmc-pvr-addons-$GIT_REV + cp -R xbmc-pvr-addons.git xbmc-pvr-addons-$GIT_REV + +echo "cleaning sources..." + rm -rf xbmc-pvr-addons-$GIT_REV/.git + +echo "packing sources..." + tar cvJf xbmc-pvr-addons-$GIT_REV.tar.xz xbmc-pvr-addons-$GIT_REV + +echo "remove temporary sourcedir..." + rm -rf xbmc-pvr-addons-$GIT_REV From 76528604a66533f02fb3e4fae403ca2d09ccb610 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Thu, 6 Sep 2012 01:25:44 +0200 Subject: [PATCH 31/32] xbmc-pvr-addons: update to xbmc-pvr-addons-35821fa Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-pvr-addons/meta | 2 +- ...mc-pvr-addons-94c9f6f-crosscompiling.patch | 20 ------------------- 2 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch diff --git a/packages/mediacenter/xbmc-pvr-addons/meta b/packages/mediacenter/xbmc-pvr-addons/meta index 1ca7bde4af8..7f3df0eb853 100644 --- a/packages/mediacenter/xbmc-pvr-addons/meta +++ b/packages/mediacenter/xbmc-pvr-addons/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="xbmc-pvr-addons" -PKG_VERSION="94c9f6f" +PKG_VERSION="35821fa" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch b/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch deleted file mode 100644 index 923c5230f81..00000000000 --- a/packages/mediacenter/xbmc-pvr-addons/patches/xbmc-pvr-addons-94c9f6f-crosscompiling.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -Naur xbmc-pvr-addons-94c9f6f/configure.ac xbmc-pvr-addons-94c9f6f.patch/configure.ac ---- xbmc-pvr-addons-94c9f6f/configure.ac 2012-09-05 20:43:31.000000000 +0200 -+++ xbmc-pvr-addons-94c9f6f.patch/configure.ac 2012-09-05 21:24:01.619154672 +0200 -@@ -75,10 +75,12 @@ - use_libcurl="no" - PKG_CHECK_MODULES([CURL],[libcurl],use_libcurl="yes",AC_MSG_WARN("CURL was not found, N7 add-on will not be available")) - --### Check for Intree building --checkpath=".." --AC_CHECK_FILE([$checkpath/xbmc/xbmc.h], [AM_CONDITIONAL(IS_INTREE_BUILD, true) intree=true], [AM_CONDITIONAL(IS_INTREE_BUILD, false) intree=false]) --echo "Intree build: $intree" -+# ### Check for Intree building -+# checkpath=".." -+# AC_CHECK_FILE([$checkpath/xbmc/xbmc.h], [AM_CONDITIONAL(IS_INTREE_BUILD, true) intree=true], [AM_CONDITIONAL(IS_INTREE_BUILD, false) intree=false]) -+# echo "Intree build: $intree" -+ -+AM_CONDITIONAL(IS_INTREE_BUILD, false) - - HOST_CXXFLAGS="-Wall -Wextra -Wno-missing-field-initializers -Woverloaded-virtual -Wno-parentheses -fPIC $HOST_CXXFLAGS" - From fd95497c135dfcd52adbc14608503e72c5d475f9 Mon Sep 17 00:00:00 2001 From: vpeter4 Date: Thu, 6 Sep 2012 13:36:28 +0200 Subject: [PATCH 32/32] hdhomerun: bump addon version for new kernel --- packages/addons/driver/hdhomerun/changelog.txt | 3 +++ packages/addons/driver/hdhomerun/meta | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/addons/driver/hdhomerun/changelog.txt b/packages/addons/driver/hdhomerun/changelog.txt index 47d1ad81011..fc64fd9c6da 100644 --- a/packages/addons/driver/hdhomerun/changelog.txt +++ b/packages/addons/driver/hdhomerun/changelog.txt @@ -1,3 +1,6 @@ +2.1.3 +- bump addon version for new kernel + 2.1.2 - dvbhdhomerun upgraded to 0.0.10 diff --git a/packages/addons/driver/hdhomerun/meta b/packages/addons/driver/hdhomerun/meta index bc9d4b032c7..0574213db78 100644 --- a/packages/addons/driver/hdhomerun/meta +++ b/packages/addons/driver/hdhomerun/meta @@ -20,7 +20,7 @@ PKG_NAME="hdhomerun" PKG_VERSION="2.0" -PKG_REV="2" +PKG_REV="3" PKG_ARCH="any" PKG_LICENSE="GPL" PKG_SITE="http://www.silicondust.com/products/hdhomerun/dvbt/"