diff --git a/packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-4bf8428afb48c6495f8bc1a1f55f82aa5f722021.patch b/packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-46bda285a6b3a8cebdb5760780101fe71d74a766.patch similarity index 84% rename from packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-4bf8428afb48c6495f8bc1a1f55f82aa5f722021.patch rename to packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-46bda285a6b3a8cebdb5760780101fe71d74a766.patch index 78d6f4042d..a508485aff 100644 --- a/packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-4bf8428afb48c6495f8bc1a1f55f82aa5f722021.patch +++ b/packages/mediacenter/xbmc-pvr/patches/xbmc-pvr-c50f565-902.01-xvba_support-46bda285a6b3a8cebdb5760780101fe71d74a766.patch @@ -1,7 +1,8 @@ -diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in ---- xbmc-1fef727/configure.in 2012-02-07 12:47:09.000000000 +0100 -+++ xbmc-1fef727.patch/configure.in 2012-02-07 14:30:17.968097582 +0100 -@@ -98,6 +98,8 @@ +diff --git a/configure.in b/configure.in +index e1cc9d2..d0d3beb 100755 +--- a/configure.in ++++ b/configure.in +@@ -98,6 +98,8 @@ vaapi_not_found="== Could not find libva. VAAPI support disabled. ==" vaapi_disabled="== VAAPI support manually disabled. ==" crystalhd_not_found="== Could not find libcrystalhd. CrystalHD support disabled. ==" crystalhd_disabled="== CrystalHD support manually disabled. ==" @@ -10,7 +11,7 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in vdadecoder_enabled="== VDADecoder support enabled. ==" vdadecoder_disabled="== VDADecoder support manually disabled. ==" vtbdecoder_enabled="== VTBDecoder support enabled. ==" -@@ -204,6 +206,12 @@ +@@ -204,6 +206,12 @@ AC_ARG_ENABLE([crystalhd], [enable CrystalHD decoding (default is auto)])], [use_crystalhd=$enableval], [use_crystalhd=auto]) @@ -23,7 +24,7 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in AC_ARG_ENABLE([vdadecoder], [AS_HELP_STRING([--enable-vdadecoder], -@@ -1382,6 +1390,38 @@ +@@ -1382,6 +1390,38 @@ else USE_CRYSTALHD=0 fi @@ -62,7 +63,7 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in # VDADecoder if test "x$use_vdadecoder" != "xno"; then if test "$host_vendor" = "apple" ; then -@@ -1578,6 +1618,12 @@ +@@ -1578,6 +1618,12 @@ else final_message="$final_message\n CrystalHD:\tNo" fi @@ -75,7 +76,7 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in if test "x$use_vdadecoder" != "xno"; then final_message="$final_message\n VDADecoder:\tYes" else -@@ -1943,6 +1989,7 @@ +@@ -1952,6 +1998,7 @@ AC_SUBST(USE_OPENGLES) AC_SUBST(USE_VDPAU) AC_SUBST(USE_VAAPI) AC_SUBST(USE_CRYSTALHD) @@ -83,7 +84,7 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in AC_SUBST(USE_LIBSMBCLIENT) AC_SUBST(USE_LIBNFS) AC_SUBST(USE_LIBAFPCLIENT) -@@ -2085,6 +2132,7 @@ +@@ -2094,6 +2141,7 @@ XB_CONFIG_MODULE([lib/ffmpeg], [ --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` \ @@ -91,10 +92,11 @@ diff -Naur xbmc-1fef727/configure.in xbmc-1fef727.patch/configure.in --enable-protocol=http \ --enable-pthreads \ --enable-runtime-cpudetect \ -diff -Naur xbmc-1fef727/language/English/strings.xml xbmc-1fef727.patch/language/English/strings.xml ---- xbmc-1fef727/language/English/strings.xml 2012-02-07 12:47:05.000000000 +0100 -+++ xbmc-1fef727.patch/language/English/strings.xml 2012-02-07 14:30:17.970097621 +0100 -@@ -1230,6 +1230,8 @@ +diff --git a/language/English/strings.xml b/language/English/strings.xml +index 0cf25b6..c48c056 100644 +--- a/language/English/strings.xml ++++ b/language/English/strings.xml +@@ -1234,6 +1234,8 @@ Allow hardware acceleration (OpenMax) Pixel Shaders Allow hardware acceleration (VideoToolbox) @@ -103,10 +105,53 @@ diff -Naur xbmc-1fef727/language/English/strings.xml xbmc-1fef727.patch/language A/V sync method Audio clock -diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/configure ---- xbmc-1fef727/lib/ffmpeg/configure 2012-02-07 12:46:58.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/configure 2012-02-07 14:30:17.994098094 +0100 -@@ -111,6 +111,7 @@ +diff --git a/lib/UnrarXLib/extract.cpp b/lib/UnrarXLib/extract.cpp +index b4a8091..da60857 100644 +--- a/lib/UnrarXLib/extract.cpp ++++ b/lib/UnrarXLib/extract.cpp +@@ -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 --git a/lib/UnrarXLib/unpack.cpp b/lib/UnrarXLib/unpack.cpp +index 265b54f..bc2f220 100644 +--- a/lib/UnrarXLib/unpack.cpp ++++ b/lib/UnrarXLib/unpack.cpp +@@ -8,11 +8,6 @@ + #include "unpack20.cpp" + #endif + +-#ifdef _LINUX +-#include "XSyncUtils.h" +-#include "XEventUtils.h" +-#endif +- + Unpack::Unpack(ComprDataIO *DataIO) + { + UnpIO=DataIO; +diff --git a/lib/UnrarXLib/unpack15.cpp b/lib/UnrarXLib/unpack15.cpp +index e1b5f10..725e2be 100644 +--- a/lib/UnrarXLib/unpack15.cpp ++++ b/lib/UnrarXLib/unpack15.cpp +@@ -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 --git a/lib/ffmpeg/configure b/lib/ffmpeg/configure +index fec801c..fc73296 100755 +--- a/lib/ffmpeg/configure ++++ b/lib/ffmpeg/configure +@@ -111,6 +111,7 @@ Configuration options: --disable-vaapi disable VAAPI code --disable-vdpau disable VDPAU code --disable-dxva2 disable DXVA2 code @@ -114,7 +159,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary) --enable-hardcoded-tables use hardcoded tables instead of runtime generation --enable-memalign-hack emulate memalign, interferes with memory debuggers -@@ -932,6 +933,7 @@ +@@ -932,6 +933,7 @@ CONFIG_LIST=" swscale_alpha vaapi vdpau @@ -122,7 +167,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi version3 x11grab zlib -@@ -1240,6 +1242,7 @@ +@@ -1240,6 +1242,7 @@ h264_decoder_select="golomb h264dsp h264pred" h264_dxva2_hwaccel_deps="dxva2api_h" h264_dxva2_hwaccel_select="dxva2 h264_decoder" h264_vaapi_hwaccel_select="vaapi" @@ -130,7 +175,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi h264_vdpau_decoder_select="vdpau h264_decoder" imc_decoder_select="fft mdct" jpegls_decoder_select="golomb" -@@ -1263,6 +1266,7 @@ +@@ -1263,6 +1266,7 @@ mpeg2_dxva2_hwaccel_deps="dxva2api_h" mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder" mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder" mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder" @@ -138,7 +183,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi mpeg4_vdpau_decoder_deps="vdpau_vdpau_h vdpau_vdpau_x11_h vdpau_mpeg4_support" mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder" mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h" -@@ -1306,6 +1310,7 @@ +@@ -1306,6 +1310,7 @@ vc1_decoder_select="h263_decoder" vc1_dxva2_hwaccel_deps="dxva2api_h DXVA_PictureParameters_wDecodedPictureIndex" vc1_dxva2_hwaccel_select="dxva2 vc1_decoder" vc1_vaapi_hwaccel_select="vaapi vc1_decoder" @@ -146,7 +191,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi vc1_vdpau_decoder_select="vdpau vc1_decoder" vorbis_decoder_select="mdct" vorbis_encoder_select="mdct" -@@ -1327,12 +1332,14 @@ +@@ -1327,12 +1332,14 @@ wmv3_decoder_select="vc1_decoder" wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel" wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel" wmv3_vdpau_decoder_select="vc1_vdpau_decoder" @@ -161,7 +206,7 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h" # parsers -@@ -2762,6 +2769,7 @@ +@@ -2762,6 +2769,7 @@ check_header sys/select.h check_header termios.h check_header vdpau/vdpau.h check_header vdpau/vdpau_x11.h @@ -169,10 +214,64 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/configure xbmc-1fef727.patch/lib/ffmpeg/confi check_cpp_condition vdpau/vdpau.h "defined(VDP_DECODER_PROFILE_MPEG4_PART2_SP)" && enable vdpau_mpeg4_support check_header X11/extensions/XvMClib.h -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/allcodecs.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/allcodecs.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/allcodecs.c 2012-02-07 12:47:01.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/allcodecs.c 2012-02-07 14:30:17.996098134 +0100 -@@ -57,13 +57,17 @@ +diff --git a/lib/ffmpeg/libavcodec/Makefile b/lib/ffmpeg/libavcodec/Makefile +index 6a0a05b..65cca69 100644 +--- a/lib/ffmpeg/libavcodec/Makefile ++++ b/lib/ffmpeg/libavcodec/Makefile +@@ -3,7 +3,7 @@ include $(SUBDIR)../config.mak + NAME = avcodec + FFLIBS = avcore avutil + +-HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h ++HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h xvba.h + + OBJS = allcodecs.o \ + audioconvert.o \ +@@ -43,6 +43,7 @@ RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o + OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes) + OBJS-$(CONFIG_VAAPI) += vaapi.o + OBJS-$(CONFIG_VDPAU) += vdpau.o ++OBJS-$(CONFIG_XVBA) += xvba.o + + # decoders/encoders/hardware accelerators + OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o +@@ -169,6 +170,7 @@ OBJS-$(CONFIG_H264_DECODER) += h264.o \ + mpegvideo.o error_resilience.o + OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o + OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o ++OBJS-$(CONFIG_H264_XVBA_HWACCEL) += xvba_h264.o + OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o + OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o + OBJS-$(CONFIG_IDCIN_DECODER) += idcinvideo.o +@@ -246,6 +248,7 @@ OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ + mpegvideo.o error_resilience.o + OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o + OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o ++OBJS-$(CONFIG_MPEG2_XVBA_HWACCEL) += xvba_mpeg2.o + OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12.o mpeg12data.o \ + mpegvideo.o error_resilience.o + OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ +@@ -379,6 +382,7 @@ OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1.o vc1data.o vc1dsp.o \ + intrax8.o intrax8dsp.o + OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o + OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o ++OBJS-$(CONFIG_VC1_XVBA_HWACCEL) += xvba_vc1.o + OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o + OBJS-$(CONFIG_VCR1_ENCODER) += vcr1.o + OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdav.o +@@ -647,6 +651,7 @@ SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h + SKIPHEADERS-$(CONFIG_LIBDIRAC) += libdirac.h + SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h + SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h ++SKIPHEADERS-$(CONFIG_XVBA) += xvba_internal.h + SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h + SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h + SKIPHEADERS += mpegaudio3.h +diff --git a/lib/ffmpeg/libavcodec/allcodecs.c b/lib/ffmpeg/libavcodec/allcodecs.c +index 04c5c6a..38b8791 100644 +--- a/lib/ffmpeg/libavcodec/allcodecs.c ++++ b/lib/ffmpeg/libavcodec/allcodecs.c +@@ -57,13 +57,17 @@ void avcodec_register_all(void) REGISTER_HWACCEL (H263_VAAPI, h263_vaapi); REGISTER_HWACCEL (H264_DXVA2, h264_dxva2); REGISTER_HWACCEL (H264_VAAPI, h264_vaapi); @@ -190,10 +289,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/allcodecs.c xbmc-1fef727.patch/lib /* video codecs */ REGISTER_ENCODER (A64MULTI, a64multi); -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/h264.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/h264.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/h264.c 2012-02-07 12:47:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/h264.c 2012-02-07 14:30:17.998098174 +0100 -@@ -55,6 +55,7 @@ +diff --git a/lib/ffmpeg/libavcodec/h264.c b/lib/ffmpeg/libavcodec/h264.c +index 0e002ce..d054b20 100644 +--- a/lib/ffmpeg/libavcodec/h264.c ++++ b/lib/ffmpeg/libavcodec/h264.c +@@ -55,6 +55,7 @@ static const uint8_t div6[52]={ static const enum PixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = { PIX_FMT_DXVA2_VLD, PIX_FMT_VAAPI_VLD, @@ -201,62 +301,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/h264.c xbmc-1fef727.patch/lib/ffmp PIX_FMT_YUVJ420P, PIX_FMT_NONE }; -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/Makefile xbmc-1fef727.patch/lib/ffmpeg/libavcodec/Makefile ---- xbmc-1fef727/lib/ffmpeg/libavcodec/Makefile 2012-02-07 12:46:59.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/Makefile 2012-02-07 14:30:17.996098134 +0100 -@@ -3,7 +3,7 @@ - NAME = avcodec - FFLIBS = avcore avutil - --HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h -+HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h xvba.h - - OBJS = allcodecs.o \ - audioconvert.o \ -@@ -43,6 +43,7 @@ - OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes) - OBJS-$(CONFIG_VAAPI) += vaapi.o - OBJS-$(CONFIG_VDPAU) += vdpau.o -+OBJS-$(CONFIG_XVBA) += xvba.o - - # decoders/encoders/hardware accelerators - OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o -@@ -169,6 +170,7 @@ - mpegvideo.o error_resilience.o - OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o - OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o -+OBJS-$(CONFIG_H264_XVBA_HWACCEL) += xvba_h264.o - OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o - OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o - OBJS-$(CONFIG_IDCIN_DECODER) += idcinvideo.o -@@ -246,6 +248,7 @@ - mpegvideo.o error_resilience.o - OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o - OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o -+OBJS-$(CONFIG_MPEG2_XVBA_HWACCEL) += xvba_mpeg2.o - OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12.o mpeg12data.o \ - mpegvideo.o error_resilience.o - OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpegvideo_enc.o \ -@@ -379,6 +382,7 @@ - intrax8.o intrax8dsp.o - OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o - OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o -+OBJS-$(CONFIG_VC1_XVBA_HWACCEL) += xvba_vc1.o - OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o - OBJS-$(CONFIG_VCR1_ENCODER) += vcr1.o - OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdav.o -@@ -647,6 +651,7 @@ - SKIPHEADERS-$(CONFIG_LIBDIRAC) += libdirac.h - SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h - SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h -+SKIPHEADERS-$(CONFIG_XVBA) += xvba_internal.h - SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h - SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h - SKIPHEADERS += mpegaudio3.h -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/mpegvideo.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/mpegvideo.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/mpegvideo.c 2012-02-07 12:46:59.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/mpegvideo.c 2012-02-07 14:30:18.000098213 +0100 -@@ -117,6 +117,7 @@ +diff --git a/lib/ffmpeg/libavcodec/mpegvideo.c b/lib/ffmpeg/libavcodec/mpegvideo.c +index 31642e6..56113c7 100644 +--- a/lib/ffmpeg/libavcodec/mpegvideo.c ++++ b/lib/ffmpeg/libavcodec/mpegvideo.c +@@ -117,6 +117,7 @@ const enum PixelFormat ff_pixfmt_list_420[] = { const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = { PIX_FMT_DXVA2_VLD, PIX_FMT_VAAPI_VLD, @@ -264,9 +313,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/mpegvideo.c xbmc-1fef727.patch/lib PIX_FMT_YUV420P, PIX_FMT_NONE }; -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.c 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba.c 2012-02-07 14:30:18.001098232 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba.c b/lib/ffmpeg/libavcodec/xvba.c +new file mode 100644 +index 0000000..48fd905 +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba.c @@ -0,0 +1,65 @@ +/* + * HW decode acceleration for MPEG-2, H.264 and VC-1 @@ -333,9 +384,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.c xbmc-1fef727.patch/lib/ffmp + render->num_slices++; +} + -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.h xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba.h ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba.h 2012-02-07 14:30:18.001098232 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba.h b/lib/ffmpeg/libavcodec/xvba.h +new file mode 100644 +index 0000000..a62d649 +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba.h @@ -0,0 +1,65 @@ +/* + * HW decode acceleration for MPEG-2, H.264 and VC-1 @@ -402,9 +455,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba.h xbmc-1fef727.patch/lib/ffmp +}; + +#endif /* AVCODEC_XVBA_H */ -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_h264.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_h264.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_h264.c 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_h264.c 2012-02-07 14:30:18.002098252 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba_h264.c b/lib/ffmpeg/libavcodec/xvba_h264.c +new file mode 100644 +index 0000000..0d98dea +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba_h264.c @@ -0,0 +1,180 @@ +/* + * H.264 HW decode acceleration through XVBA @@ -586,9 +641,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_h264.c xbmc-1fef727.patch/lib + .decode_slice = decode_slice, + .priv_data_size = 0, +}; -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_internal.h xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_internal.h ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_internal.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_internal.h 2012-02-07 14:30:18.002098252 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba_internal.h b/lib/ffmpeg/libavcodec/xvba_internal.h +new file mode 100644 +index 0000000..9653f85 +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba_internal.h @@ -0,0 +1,24 @@ +/* + * HW decode acceleration for MPEG-2, H.264 and VC-1 @@ -614,9 +671,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_internal.h xbmc-1fef727.patch + +int ff_xvba_translate_profile(int profile); +void ff_xvba_add_slice_data(struct xvba_render_state *render, const uint8_t *buffer, uint32_t size); -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_mpeg2.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_mpeg2.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_mpeg2.c 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_mpeg2.c 2012-02-07 14:30:18.003098272 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba_mpeg2.c b/lib/ffmpeg/libavcodec/xvba_mpeg2.c +new file mode 100644 +index 0000000..552ef95 +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba_mpeg2.c @@ -0,0 +1,52 @@ +/* + * MPEG-2 HW decode acceleration through XVBA @@ -670,9 +729,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_mpeg2.c xbmc-1fef727.patch/li + .decode_slice = decode_slice, + .priv_data_size = 0, +}; -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_vc1.c xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_vc1.c ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_vc1.c 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvba_vc1.c 2012-02-07 14:30:18.003098272 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvba_vc1.c b/lib/ffmpeg/libavcodec/xvba_vc1.c +new file mode 100644 +index 0000000..e7b9211 +--- /dev/null ++++ b/lib/ffmpeg/libavcodec/xvba_vc1.c @@ -0,0 +1,194 @@ +/* + * VC-1 HW decode acceleration through XVBA @@ -868,9 +929,10 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvba_vc1.c xbmc-1fef727.patch/lib/ + .decode_slice = decode_slice, + .priv_data_size = 0, +}; -diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvmc_internal.h xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvmc_internal.h ---- xbmc-1fef727/lib/ffmpeg/libavcodec/xvmc_internal.h 2012-02-07 12:47:01.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavcodec/xvmc_internal.h 2012-02-07 14:30:18.004098292 +0100 +diff --git a/lib/ffmpeg/libavcodec/xvmc_internal.h b/lib/ffmpeg/libavcodec/xvmc_internal.h +index 9bb8909..a64d6ee 100644 +--- a/lib/ffmpeg/libavcodec/xvmc_internal.h ++++ b/lib/ffmpeg/libavcodec/xvmc_internal.h @@ -1,5 +1,7 @@ /* - * XVideo Motion Compensation internal functions @@ -880,10 +942,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavcodec/xvmc_internal.h xbmc-1fef727.patch * * This file is part of FFmpeg. * -diff -Naur xbmc-1fef727/lib/ffmpeg/libavutil/pixdesc.c xbmc-1fef727.patch/lib/ffmpeg/libavutil/pixdesc.c ---- xbmc-1fef727/lib/ffmpeg/libavutil/pixdesc.c 2012-02-07 12:46:58.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavutil/pixdesc.c 2012-02-07 14:30:18.005098312 +0100 -@@ -717,6 +717,12 @@ +diff --git a/lib/ffmpeg/libavutil/pixdesc.c b/lib/ffmpeg/libavutil/pixdesc.c +index 83aa8b0..fcc20d0 100644 +--- a/lib/ffmpeg/libavutil/pixdesc.c ++++ b/lib/ffmpeg/libavutil/pixdesc.c +@@ -717,6 +717,12 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = { .log2_chroma_h = 1, .flags = PIX_FMT_HWACCEL, }, @@ -896,10 +959,11 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavutil/pixdesc.c xbmc-1fef727.patch/lib/ff [PIX_FMT_YUV420P16LE] = { .name = "yuv420p16le", .nb_components= 3, -diff -Naur xbmc-1fef727/lib/ffmpeg/libavutil/pixfmt.h xbmc-1fef727.patch/lib/ffmpeg/libavutil/pixfmt.h ---- xbmc-1fef727/lib/ffmpeg/libavutil/pixfmt.h 2012-02-07 12:46:58.000000000 +0100 -+++ xbmc-1fef727.patch/lib/ffmpeg/libavutil/pixfmt.h 2012-02-07 14:30:18.005098312 +0100 -@@ -127,6 +127,7 @@ +diff --git a/lib/ffmpeg/libavutil/pixfmt.h b/lib/ffmpeg/libavutil/pixfmt.h +index 8ec91c8..4803dd7 100644 +--- a/lib/ffmpeg/libavutil/pixfmt.h ++++ b/lib/ffmpeg/libavutil/pixfmt.h +@@ -127,6 +127,7 @@ enum PixelFormat { PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer @@ -907,49 +971,13 @@ diff -Naur xbmc-1fef727/lib/ffmpeg/libavutil/pixfmt.h xbmc-1fef727.patch/lib/ffm PIX_FMT_RGB444BE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), big-endian, most significant bits to 0 PIX_FMT_RGB444LE, ///< packed RGB 4:4:4, 16bpp, (msb)4A 4R 4G 4B(lsb), little-endian, most significant bits to 0 -diff -Naur xbmc-1fef727/lib/UnrarXLib/extract.cpp xbmc-1fef727.patch/lib/UnrarXLib/extract.cpp ---- xbmc-1fef727/lib/UnrarXLib/extract.cpp 2012-02-07 12:46:53.000000000 +0100 -+++ xbmc-1fef727.patch/lib/UnrarXLib/extract.cpp 2012-02-07 14:30:17.982097858 +0100 -@@ -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-1fef727/lib/UnrarXLib/unpack15.cpp xbmc-1fef727.patch/lib/UnrarXLib/unpack15.cpp ---- xbmc-1fef727/lib/UnrarXLib/unpack15.cpp 2012-02-07 12:46:53.000000000 +0100 -+++ xbmc-1fef727.patch/lib/UnrarXLib/unpack15.cpp 2012-02-07 14:30:17.992098054 +0100 -@@ -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-1fef727/lib/UnrarXLib/unpack.cpp xbmc-1fef727.patch/lib/UnrarXLib/unpack.cpp ---- xbmc-1fef727/lib/UnrarXLib/unpack.cpp 2012-02-07 12:46:53.000000000 +0100 -+++ xbmc-1fef727.patch/lib/UnrarXLib/unpack.cpp 2012-02-07 14:30:17.991098035 +0100 -@@ -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-1fef727/xbmc/ApplicationMessenger.cpp xbmc-1fef727.patch/xbmc/ApplicationMessenger.cpp ---- xbmc-1fef727/xbmc/ApplicationMessenger.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/ApplicationMessenger.cpp 2012-02-07 14:30:18.007098350 +0100 -@@ -73,7 +73,7 @@ +diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp +index 3dc3d47..7ff943e 100644 +diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp +index 14c1802..8173e99 100644 +--- a/xbmc/ApplicationMessenger.cpp ++++ b/xbmc/ApplicationMessenger.cpp +@@ -75,7 +75,7 @@ using namespace std; @@ -958,9 +986,10 @@ diff -Naur xbmc-1fef727/xbmc/ApplicationMessenger.cpp xbmc-1fef727.patch/xbmc/Ap { m_msg.dwMessage = msg.dwMessage; m_msg.dwParam1 = msg.dwParam1; -diff -Naur xbmc-1fef727/xbmc/cdrip/CDDAReader.cpp xbmc-1fef727.patch/xbmc/cdrip/CDDAReader.cpp ---- xbmc-1fef727/xbmc/cdrip/CDDAReader.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cdrip/CDDAReader.cpp 2012-02-07 14:30:18.007098350 +0100 +diff --git a/xbmc/cdrip/CDDAReader.cpp b/xbmc/cdrip/CDDAReader.cpp +index 16fa7b6..6c242d8 100644 +--- a/xbmc/cdrip/CDDAReader.cpp ++++ b/xbmc/cdrip/CDDAReader.cpp @@ -29,7 +29,7 @@ #define SECTOR_COUNT 52 @@ -970,10 +999,11 @@ diff -Naur xbmc-1fef727/xbmc/cdrip/CDDAReader.cpp xbmc-1fef727.patch/xbmc/cdrip/ { m_sRipBuffer[0].pbtStream = NULL; m_sRipBuffer[1].pbtStream = NULL; -diff -Naur xbmc-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.cpp xbmc-1fef727.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp ---- xbmc-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/DllLoader/exports/emu_kernel32.cpp 2012-02-07 14:30:18.008098370 +0100 -@@ -240,15 +240,6 @@ +diff --git a/xbmc/cores/DllLoader/exports/emu_kernel32.cpp b/xbmc/cores/DllLoader/exports/emu_kernel32.cpp +index 13a23e2..493d64d 100644 +--- a/xbmc/cores/DllLoader/exports/emu_kernel32.cpp ++++ b/xbmc/cores/DllLoader/exports/emu_kernel32.cpp +@@ -240,15 +240,6 @@ extern "C" DWORD WINAPI dllGetCurrentProcessId(void) #endif } @@ -989,10 +1019,11 @@ diff -Naur xbmc-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.cpp xbmc-1fef7 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-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.h xbmc-1fef727.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h ---- xbmc-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/DllLoader/exports/emu_kernel32.h 2012-02-07 14:30:18.009098390 +0100 -@@ -686,7 +686,6 @@ +diff --git a/xbmc/cores/DllLoader/exports/emu_kernel32.h b/xbmc/cores/DllLoader/exports/emu_kernel32.h +index 2e637a7..9cc2f0b 100644 +--- a/xbmc/cores/DllLoader/exports/emu_kernel32.h ++++ b/xbmc/cores/DllLoader/exports/emu_kernel32.h +@@ -686,7 +686,6 @@ extern "C" BOOL WINAPI dllGetProcessAffinityMask(HANDLE hProcess, LPDWORD lpProc extern "C" HGLOBAL WINAPI dllLoadResource(HMODULE module, HRSRC res); extern "C" HRSRC WINAPI dllFindResourceA(HMODULE module, LPCTSTR name, LPCTSTR type); @@ -1000,9 +1031,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/DllLoader/exports/emu_kernel32.h xbmc-1fef727 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-1fef727/xbmc/cores/DummyVideoPlayer.cpp xbmc-1fef727.patch/xbmc/cores/DummyVideoPlayer.cpp ---- xbmc-1fef727/xbmc/cores/DummyVideoPlayer.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/DummyVideoPlayer.cpp 2012-02-07 14:30:18.009098390 +0100 +diff --git a/xbmc/cores/DummyVideoPlayer.cpp b/xbmc/cores/DummyVideoPlayer.cpp +index f0b4aeb..47d25e4 100644 +--- a/xbmc/cores/DummyVideoPlayer.cpp ++++ b/xbmc/cores/DummyVideoPlayer.cpp @@ -33,7 +33,7 @@ CDummyVideoPlayer::CDummyVideoPlayer(IPlayerCallback& callback) @@ -1012,10 +1044,868 @@ diff -Naur xbmc-1fef727/xbmc/cores/DummyVideoPlayer.cpp xbmc-1fef727.patch/xbmc/ { m_paused = false; m_clock = 0; -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp 2012-02-07 14:30:18.016098528 +0100 -@@ -323,7 +323,7 @@ +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +index 8172750..d6f91da 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +@@ -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,10 @@ CLinuxRendererGL::YUVBUFFER::YUVBUFFER() + #ifdef HAVE_LIBVDPAU + vdpau = NULL; + #endif ++#ifdef HAVE_LIBXVBA ++ xvba = NULL; ++ xvba_tmp = NULL; ++#endif + } + + CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() +@@ -160,6 +167,7 @@ CLinuxRendererGL::CLinuxRendererGL() + m_rgbPbo = 0; + + m_dllSwScale = new DllSwScale; ++ m_bValidated = false; + } + + CLinuxRendererGL::~CLinuxRendererGL() +@@ -224,7 +232,7 @@ bool CLinuxRendererGL::ValidateRenderer() + + void CLinuxRendererGL::ManageTextures() + { +- m_NumYV12Buffers = 2; ++ m_NumYV12Buffers = 3; + //m_iYV12RenderBuffer = 0; + return; + } +@@ -569,6 +577,11 @@ void CLinuxRendererGL::Flush() + m_bValidated = false; + } + ++unsigned int CLinuxRendererGL::GetProcessorSize() ++{ ++ return m_NumYV12Buffers; ++} ++ + void CLinuxRendererGL::Update(bool bPauseDrawing) + { + if (!m_bConfigured) return; +@@ -730,14 +743,15 @@ unsigned int CLinuxRendererGL::PreInit() + { + CSingleLock lock(g_graphicsContext); + m_bConfigured = false; +- m_bValidated = false; +- UnInit(); ++ if (m_bValidated) ++ UnInit(); ++ + m_resolution = g_guiSettings.m_LookAndFeelResolution; + if ( m_resolution == RES_WINDOW ) + m_resolution = RES_DESKTOP; + + m_iYV12RenderBuffer = 0; +- m_NumYV12Buffers = 2; ++ m_NumYV12Buffers = 3; + + // setup the background colour + m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff; +@@ -817,7 +831,7 @@ void CLinuxRendererGL::UpdateVideoFilter() + 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 +912,11 @@ void CLinuxRendererGL::LoadShaders(int field) + 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"); +@@ -1032,6 +1051,18 @@ void CLinuxRendererGL::LoadShaders(int field) + 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 if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA_YV12) ++ { ++ m_textureUpload = &CLinuxRendererGL::UploadXVBAyv12Texture; ++ m_textureCreate = &CLinuxRendererGL::CreateXVBAyv12Texture; ++ m_textureDelete = &CLinuxRendererGL::DeleteXVBAyv12Texture; ++ } + else + { + // setup default YV12 texture handlers +@@ -1125,6 +1156,13 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer) + RenderVDPAU(renderBuffer, m_currentField); + } + #endif ++#ifdef HAVE_LIBXVBA ++ else if (m_renderMethod & RENDER_XVBA) ++ { ++ UpdateVideoFilter(); ++ RenderXVBA(renderBuffer, m_currentField); ++ } ++#endif + #ifdef HAVE_LIBVA + else if (m_renderMethod & RENDER_VAAPI) + { +@@ -1598,6 +1636,77 @@ void CLinuxRendererGL::RenderVAAPI(int index, int field) + #endif + } + ++void CLinuxRendererGL::RenderXVBA(int index, int field) ++{ ++#ifdef HAVE_LIBXVBA ++ YUVPLANE &plane = m_buffers[index].fields[field][0]; ++ ++ 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]; +@@ -2352,6 +2461,424 @@ void CLinuxRendererGL::UploadVAAPITexture(int index) + #endif + } + ++void CLinuxRendererGL::DeleteXVBATexture(int index) ++{ ++#ifdef HAVE_LIBXVBA ++ YUVPLANE &plane = m_buffers[index].fields[0][1]; ++ ++ if (m_buffers[index].xvba) ++ m_buffers[index].xvba->FinishGL(); ++ ++ SAFE_RELEASE(m_buffers[index].xvba); ++ SAFE_RELEASE(m_buffers[index].xvba_tmp); ++ ++ if(plane.id && glIsTexture(plane.id)) ++ glDeleteTextures(1, &plane.id); ++ plane.id = 0; ++ m_buffers[index].fields[0][0].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]; ++ YUVPLANE &planeFallback = fields[0][1]; ++ ++ DeleteXVBATexture(index); ++ ++ memset(&im , 0, sizeof(im)); ++ memset(&fields, 0, sizeof(fields)); ++ im.height = m_sourceHeight; ++ im.width = m_sourceWidth; ++ ++ for(int f = 0;fSet(); ++#endif ++ return true; ++} ++ ++void CLinuxRendererGL::UploadXVBATexture(int index) ++{ ++#ifdef HAVE_LIBXVBA ++ XVBA::CDecoder *xvba = m_buffers[index].xvba; ++ ++ if (m_buffers[index].xvba_tmp) ++ { ++ SAFE_RELEASE(m_buffers[index].xvba); ++ xvba = m_buffers[index].xvba = m_buffers[index].xvba_tmp; ++ m_buffers[index].xvba_tmp = NULL; ++ } ++ ++ YUVFIELDS &fields = m_buffers[index].fields; ++ YUVPLANE &planeFallback = fields[0][1]; ++ YUVPLANE &plane = fields[m_currentField][0]; ++ ++ if (!xvba) ++ { ++ fields[0][0].id = planeFallback.id; ++ fields[1][0].id = planeFallback.id; ++ fields[2][0].id = planeFallback.id; ++ m_eventTexturesDone[index]->Set(); ++ return; ++ } ++ ++ XVBA_SURFACE_FLAG field; ++ if (m_currentField == FIELD_TOP) ++ field = XVBA_TOP_FIELD; ++ else if (m_currentField == FIELD_BOT) ++ field = XVBA_BOTTOM_FIELD; ++ else ++ field = XVBA_FRAME; ++ ++ glEnable(m_textureTarget); ++ if (xvba->UploadTexture(index, field, m_textureTarget) == 1) ++ plane.id = xvba->GetTexture(index, field); ++ ++ // crop texture ++ CRect crop = xvba->GetCropRect(); ++ plane.rect = m_sourceRect; ++ plane.rect.x1 += crop.x1; ++ plane.rect.x2 -= m_sourceWidth - crop.x2; ++ plane.rect.y1 += crop.y1; ++ plane.rect.y2 -= m_sourceHeight - crop.y2; ++ plane.rect.y1 /= plane.pixpertex_y; ++ plane.rect.y2 /= plane.pixpertex_y; ++ plane.rect.x1 /= plane.pixpertex_x; ++ plane.rect.x2 /= plane.pixpertex_x; ++ if (m_textureTarget == GL_TEXTURE_2D) ++ { ++ plane.rect.y1 /= plane.texheight; ++ plane.rect.y2 /= plane.texheight; ++ plane.rect.x1 /= plane.texwidth; ++ plane.rect.x2 /= plane.texwidth; ++ } ++ ++ glDisable(m_textureTarget); ++ ++ m_eventTexturesDone[index]->Set(); ++#endif ++} ++ ++//******************************************************************************************************** ++// XVBA YV12 Texture creation, deletion, copying + clearing ++//******************************************************************************************************** ++void CLinuxRendererGL::DeleteXVBAyv12Texture(int index) ++{ ++#ifdef HAVE_LIBXVBA ++ YV12Image &im = m_buffers[index].image; ++ YUVFIELDS &fields = m_buffers[index].fields; ++ GLuint *pbo = m_buffers[index].pbo; ++ ++ if (m_buffers[index].xvba) ++ m_buffers[index].xvba->FinishGL(); ++ ++ SAFE_RELEASE(m_buffers[index].xvba); ++ SAFE_RELEASE(m_buffers[index].xvba_tmp); ++ ++ if( fields[FIELD_FULL][0].id == 0 ) return; ++ ++ /* finish up all textures, and delete them */ ++ g_graphicsContext.BeginPaint(); //FIXME ++ for(int f = 0;f> im.cshift_x; ++ im.stride[2] = im.width >> im.cshift_x; ++ ++ im.planesize[0] = im.stride[0] * im.height; ++ im.planesize[1] = im.stride[1] * ( im.height >> im.cshift_y ); ++ im.planesize[2] = im.stride[2] * ( im.height >> im.cshift_y ); ++ ++ im.plane[1] = im.plane[2] = 0; ++ pbo[1] = pbo[2] = 0; ++ ++ bool pboSetup = false; ++ if (m_pboUsed) ++ { ++ pboSetup = true; ++ ++ glGenBuffersARB(1, pbo); ++ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo[0]); ++ glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, im.planesize[0] + im.planesize[0]/2 + PBO_OFFSET, 0, GL_STREAM_DRAW_ARB); ++ void* pboPtr = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB); ++ if (pboPtr) ++ { ++ im.plane[0] = (BYTE*) pboPtr + PBO_OFFSET; ++ memset(im.plane[0], 0, im.planesize[0]); ++ } ++ else ++ { ++ CLog::Log(LOGWARNING,"GL: failed to set up pixel buffer object"); ++ pboSetup = false; ++ } ++ ++ if (!pboSetup) ++ { ++ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo[0]); ++ glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); ++ glDeleteBuffersARB(1, pbo); ++ memset(m_buffers[index].pbo, 0, sizeof(m_buffers[index].pbo)); ++ } ++ ++ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); ++ } ++ ++ if (!pboSetup) ++ { ++ im.plane[0] = new BYTE[im.planesize[0]+im.planesize[0]/2]; ++ } ++ ++ glEnable(m_textureTarget); ++ for(int f = 0;f> fieldshift; ++ ++ if (m_renderMethod & RENDER_SW) ++ { ++ planes[1].texwidth = 0; ++ planes[1].texheight = 0; ++ planes[2].texwidth = 0; ++ planes[2].texheight = 0; ++ } ++ else ++ { ++ planes[1].texwidth = planes[0].texwidth >> im.cshift_x; ++ planes[1].texheight = planes[0].texheight >> im.cshift_y; ++ planes[2].texwidth = planes[0].texwidth >> im.cshift_x; ++ planes[2].texheight = planes[0].texheight >> im.cshift_y; ++ } ++ ++ for (int p = 0; p < 3; p++) ++ { ++ planes[p].pixpertex_x = 1; ++ planes[p].pixpertex_y = 1; ++ } ++ ++ if(m_renderMethod & RENDER_POT) ++ { ++ for(int p = 0; p < 3; p++) ++ { ++ planes[p].texwidth = NP2(planes[p].texwidth); ++ planes[p].texheight = NP2(planes[p].texheight); ++ } ++ } ++ ++ for(int p = 0; p < 3; p++) ++ { ++ YUVPLANE &plane = planes[p]; ++ if (plane.texwidth * plane.texheight == 0) ++ continue; ++ ++ glBindTexture(m_textureTarget, plane.id); ++ if (m_renderMethod & RENDER_SW) ++ { ++ glTexImage2D(m_textureTarget, 0, GL_RGBA, plane.texwidth, plane.texheight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); ++ } ++ else ++ { ++ GLint format; ++ if (p == 2) //V plane needs an alpha texture ++ format = GL_ALPHA; ++ else ++ format = GL_LUMINANCE; ++ ++ glTexImage2D(m_textureTarget, 0, format, plane.texwidth, plane.texheight, 0, format, GL_UNSIGNED_BYTE, NULL); ++ } ++ ++ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); ++ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ++ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); ++ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ++ VerifyGLState(); ++ } ++ } ++ glDisable(m_textureTarget); ++ m_eventTexturesDone[index]->Set(); ++#endif ++ return true; ++} ++ ++void CLinuxRendererGL::UploadXVBAyv12Texture(int source) ++{ ++#ifdef HAVE_LIBXVBA ++ YUVBUFFER& buf = m_buffers[source]; ++ YV12Image* im = &buf.image; ++ YUVFIELDS& fields = buf.fields; ++ XVBA::CDecoder *xvba = m_buffers[source].xvba; ++ ++ if (m_buffers[source].xvba_tmp) ++ { ++ SAFE_RELEASE(m_buffers[source].xvba); ++ xvba = m_buffers[source].xvba = m_buffers[source].xvba_tmp; ++ m_buffers[source].xvba_tmp = NULL; ++ } ++ ++ if (!(im->flags&IMAGE_FLAG_READY) || !xvba) ++ { ++ m_eventTexturesDone[source]->Set(); ++ return; ++ } ++ ++ bool deinterlacing; ++ if (m_currentField == FIELD_FULL) ++ deinterlacing = false; ++ else ++ deinterlacing = true; ++ ++ glEnable(m_textureTarget); ++ VerifyGLState(); ++ ++ glPixelStorei(GL_UNPACK_ALIGNMENT,1); ++ ++ if (deinterlacing) ++ { ++ // Load Even Y Field ++ LoadPlane( fields[FIELD_TOP][0] , GL_LUMINANCE, buf.flipindex ++ , im->width, im->height >> 1 ++ , im->stride[0]*2, im->plane[0] ); ++ ++ //load Odd Y Field ++ LoadPlane( fields[FIELD_BOT][0], GL_LUMINANCE, buf.flipindex ++ , im->width, im->height >> 1 ++ , im->stride[0]*2, im->plane[0] + im->stride[0], &buf.pbo[0] ) ; ++ ++ // Load Even U & V Fields ++ LoadPlane( fields[FIELD_TOP][1], GL_LUMINANCE, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) ++ , im->stride[1]*2, im->plane[0] + im->planesize[0] + im->planesize[1], &buf.pbo[0] ); ++ ++ LoadPlane( fields[FIELD_TOP][2], GL_ALPHA, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) ++ , im->stride[2]*2, im->plane[0] + im->planesize[0], &buf.pbo[0] ); ++ ++ // Load Odd U & V Fields ++ LoadPlane( fields[FIELD_BOT][1], GL_LUMINANCE, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) ++ , im->stride[1]*2, im->plane[0] + im->stride[1] + im->planesize[0] + im->planesize[1], &buf.pbo[0] ); ++ ++ LoadPlane( fields[FIELD_BOT][2], GL_ALPHA, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) ++ , im->stride[2]*2, im->plane[0] + im->stride[2] + im->planesize[0], &buf.pbo[0] ); ++ } ++ else ++ { ++ //Load Y plane ++ LoadPlane( fields[FIELD_FULL][0], GL_LUMINANCE, buf.flipindex ++ , im->width, im->height ++ , im->stride[0], im->plane[0], &buf.pbo[0] ); ++ ++ //load U plane ++ LoadPlane( fields[FIELD_FULL][1], GL_LUMINANCE, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> im->cshift_y ++ , im->stride[1], im->plane[0] + im->planesize[0] + im->planesize[1] , &buf.pbo[0] ); ++ ++ //load V plane ++ LoadPlane( fields[FIELD_FULL][2], GL_ALPHA, buf.flipindex ++ , im->width >> im->cshift_x, im->height >> im->cshift_y ++ , im->stride[2], im->plane[0] + im->planesize[0], &buf.pbo[0] ); ++ } ++ ++ m_eventTexturesDone[source]->Set(); ++ ++ VerifyGLState(); ++ ++ // crop texture ++ CRect crop = xvba->GetCropRect(); ++ m_sourceRect.x1 += crop.x1; ++ m_sourceRect.x2 -= m_sourceWidth - crop.x2; ++ m_sourceRect.y1 += crop.y1; ++ m_sourceRect.y2 -= m_sourceHeight - crop.y2; ++ CalculateTextureSourceRects(source, 3); ++ ++ glDisable(m_textureTarget); ++#endif ++} ++ + void CLinuxRendererGL::UploadYUV422PackedTexture(int source) + { + YUVBUFFER& buf = m_buffers[source]; +@@ -2935,6 +3462,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) + 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 +3478,9 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) + 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 +3504,8 @@ bool CLinuxRendererGL::Supports(ERENDERFEATURE feature) + 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; + } + +@@ -3034,10 +3568,22 @@ bool CLinuxRendererGL::Supports(EINTERLACEMETHOD method) + return false; + #endif + +- if(method == VS_INTERLACEMETHOD_DEINTERLACE +- || method == VS_INTERLACEMETHOD_DEINTERLACE_HALF +- || method == VS_INTERLACEMETHOD_SW_BLEND) +- return true; ++ if (CONF_FLAGS_FORMAT_MASK(m_iFlags) != CONF_FLAGS_FORMAT_XVBA) ++ { ++ if(method == VS_INTERLACEMETHOD_DEINTERLACE ++ || method == VS_INTERLACEMETHOD_DEINTERLACE_HALF ++ || method == VS_INTERLACEMETHOD_SW_BLEND) ++ return true; ++ } ++ ++ if(m_renderMethod & RENDER_XVBA) ++ { ++ if (method == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED ++ || method == VS_INTERLACEMETHOD_RENDER_BOB) ++ return true; ++ else ++ return false; ++ } + + if((method == VS_INTERLACEMETHOD_RENDER_BLEND + || method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED +@@ -3069,7 +3615,7 @@ bool CLinuxRendererGL::Supports(ESCALINGMETHOD method) + || 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 +@@ -3128,7 +3674,7 @@ void CLinuxRendererGL::UnBindPbo(YUVBUFFER& buff) + pbo = true; + + glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]); +- glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.image.planesize[plane] + PBO_OFFSET, NULL, GL_STREAM_DRAW_ARB); ++ glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.image.planesize[plane] + buff.image.planesize[plane]/2 + PBO_OFFSET, NULL, GL_STREAM_DRAW_ARB); + buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET; + } + if(pbo) +@@ -3152,4 +3698,13 @@ void CLinuxRendererGL::AddProcessor(VAAPI::CHolder& holder) + } + #endif + ++#ifdef HAVE_LIBXVBA ++void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba) ++{ ++ YUVBUFFER &buf = m_buffers[NextYV12Texture()]; ++ SAFE_RELEASE(buf.xvba_tmp); ++ buf.xvba_tmp = (XVBA::CDecoder*)xvba->Acquire(); ++} ++#endif ++ + #endif +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +index 38c84aa..ae0b81b 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.h ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.h +@@ -40,6 +40,7 @@ class CBaseTexture; + namespace Shaders { class BaseYUV2RGBShader; } + namespace Shaders { class BaseVideoFilterShader; } + namespace VAAPI { struct CHolder; } ++namespace XVBA { class CDecoder; } + + #define NUM_BUFFERS 3 + +@@ -94,6 +95,7 @@ enum RenderMethod + RENDER_VDPAU=0x08, + RENDER_POT=0x10, + RENDER_VAAPI=0x20, ++ RENDER_XVBA=0x40, + }; + + enum RenderQuality +@@ -141,6 +143,7 @@ public: + virtual void UnInit(); + virtual void Reset(); /* resets renderer after seek for example */ + virtual void Flush(); ++ virtual unsigned int GetProcessorSize(); + + #ifdef HAVE_LIBVDPAU + virtual void AddProcessor(CVDPAU* vdpau); +@@ -148,6 +151,9 @@ public: + #ifdef HAVE_LIBVA + virtual void AddProcessor(VAAPI::CHolder& holder); + #endif ++#ifdef HAVE_LIBXVBA ++ virtual void AddProcessor(XVBA::CDecoder* xvba); ++#endif + + virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255); + +@@ -194,6 +200,14 @@ protected: + void DeleteVAAPITexture(int index); + bool CreateVAAPITexture(int index); + ++ void UploadXVBATexture(int index); ++ void DeleteXVBATexture(int index); ++ bool CreateXVBATexture(int index); ++ ++ void UploadXVBAyv12Texture(int index); ++ void DeleteXVBAyv12Texture(int index); ++ bool CreateXVBAyv12Texture(int index); ++ + void UploadYUV422PackedTexture(int index); + void DeleteYUV422PackedTexture(int index); + bool CreateYUV422PackedTexture(int index); +@@ -211,6 +225,7 @@ protected: + void RenderSoftware(int renderBuffer, int field); // single pass s/w yuv2rgb renderer + void RenderVDPAU(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; + +@@ -270,6 +285,10 @@ protected: + #ifdef HAVE_LIBVA + VAAPI::CHolder& vaapi; + #endif ++#ifdef HAVE_LIBXVBA ++ XVBA::CDecoder* xvba; ++ XVBA::CDecoder* xvba_tmp; ++#endif + }; + + typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; +diff --git a/xbmc/cores/VideoRenderers/RenderFlags.h b/xbmc/cores/VideoRenderers/RenderFlags.h +index f663380..cbe82c5 100644 +--- a/xbmc/cores/VideoRenderers/RenderFlags.h ++++ b/xbmc/cores/VideoRenderers/RenderFlags.h +@@ -79,5 +79,7 @@ + #define CONF_FLAGS_FORMAT_VAAPI 0x030000 + #define CONF_FLAGS_FORMAT_OMXEGL 0x040000 + #define CONF_FLAGS_FORMAT_CVBREF 0x080000 ++#define CONF_FLAGS_FORMAT_XVBA 0x011000 ++#define CONF_FLAGS_FORMAT_XVBA_YV12 0x012000 + #define CONF_FLAGS_FORMAT_BYPASS 0x100000 + #endif +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index b917860..10d116d 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -53,6 +53,10 @@ + #include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" + #include "../dvdplayer/DVDCodecs/DVDCodecUtils.h" + ++#ifdef HAVE_LIBXVBA ++ #include "../dvdplayer/DVDCodecs/Video/XVBA.h" ++#endif ++ + #define MAXPRESENTDELAY 0.500 + + /* at any point we want an exclusive lock on rendermanager */ +@@ -791,6 +795,25 @@ int CXBMCRenderManager::AddVideoPicture(DVDVideoPicture& pic) + else if(pic.format == DVDVideoPicture::FMT_VAAPI) + m_pRenderer->AddProcessor(*pic.vaapi); + #endif ++#ifdef HAVE_LIBXVBA ++ else if(pic.format == DVDVideoPicture::FMT_XVBA) ++ { ++ if (pic.xvba) ++ { ++ m_pRenderer->AddProcessor(pic.xvba); ++ pic.xvba->Present(index); ++ } ++ } ++ else if(pic.format == DVDVideoPicture::FMT_XVBA_YV12) ++ { ++ if (pic.xvba) ++ { ++ m_pRenderer->AddProcessor(pic.xvba); ++ pic.xvba->Present(index); ++ pic.xvba->CopyYV12(index, image.plane[0]); ++ } ++ } ++#endif + m_pRenderer->ReleaseImage(index, false); + + return index; +diff --git a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp +index fa9f68a..68f4008 100644 +--- a/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp ++++ b/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp +@@ -186,6 +186,8 @@ BaseYUV2RGBGLSLShader::BaseYUV2RGBGLSLShader(bool rect, unsigned flags, bool str + m_defines += "#define XBMC_YUY2\n"; + else if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_UYVY) + m_defines += "#define XBMC_UYVY\n"; ++ if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_XVBA_YV12) ++ m_defines += "#define XBMC_YV12\n"; + + VertexShader()->LoadSource("yuv2rgb_vertex.glsl", m_defines); + #elif HAS_GLES == 2 +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp +index ae107a6..1b8cd96 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp +@@ -323,7 +323,7 @@ CPictureBuffer::~CPictureBuffer() #pragma mark - #endif CMPCOutputThread::CMPCOutputThread(void *device, DllLibCrystalHD *dll, bool has_bcm70015) : @@ -1024,9 +1914,41 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp xbmc- m_dll(dll), m_device(device), m_has_bcm70015(has_bcm70015), -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp 2012-02-07 14:30:18.018098568 +0100 +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +index e4bd9c9..edc2fe1 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h +@@ -34,6 +34,7 @@ + + namespace DXVA { class CSurfaceContext; } + namespace VAAPI { struct CHolder; } ++namespace XVBA { class CDecoder; } + class CVDPAU; + class COpenMax; + class COpenMaxVideo; +@@ -64,6 +65,9 @@ struct DVDVideoPicture + struct { + VAAPI::CHolder* vaapi; + }; ++ struct { ++ XVBA::CDecoder* xvba; ++ }; + + struct { + COpenMax *openMax; +@@ -109,6 +113,8 @@ struct DVDVideoPicture + FMT_VAAPI, + FMT_OMXEGL, + FMT_CVBREF, ++ FMT_XVBA, ++ FMT_XVBA_YV12, + } format; + }; + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index b4e1451..374907f 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -56,6 +56,9 @@ #ifdef HAVE_LIBVA #include "VAAPI.h" @@ -1037,7 +1959,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg using namespace boost; -@@ -100,6 +103,22 @@ +@@ -100,6 +103,22 @@ enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx dec->Release(); } #endif @@ -1060,40 +1982,11 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg #ifdef HAVE_LIBVA // mpeg4 vaapi decoding is disabled if(*cur == PIX_FMT_VAAPI_VLD && g_guiSettings.GetBool("videoplayer.usevaapi") -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h 2012-02-07 14:30:18.017098548 +0100 -@@ -34,6 +34,7 @@ - - namespace DXVA { class CSurfaceContext; } - namespace VAAPI { struct CHolder; } -+namespace XVBA { class CDecoder; } - class CVDPAU; - class COpenMax; - class COpenMaxVideo; -@@ -64,6 +65,9 @@ - struct { - VAAPI::CHolder* vaapi; - }; -+ struct { -+ XVBA::CDecoder* xvba; -+ }; - - struct { - COpenMax *openMax; -@@ -109,6 +113,8 @@ - FMT_VAAPI, - FMT_OMXEGL, - FMT_CVBREF, -+ FMT_XVBA, -+ FMT_XVBA_YV12, - } format; - }; - -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in 2012-02-07 14:30:18.018098568 +0100 -@@ -17,6 +17,10 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in b/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in +index 1dce256..8b7d5fb 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in +@@ -17,6 +17,10 @@ SRCS+= CrystalHD.cpp \ DVDVideoCodecCrystalHD.cpp \ endif @@ -1104,10 +1997,12 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/Makefile.in xbmc-1f ifeq (@USE_VDA@,1) SRCS+= DVDVideoCodecVDA.cpp \ -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp 2012-02-07 14:30:18.021098627 +0100 -@@ -0,0 +1,1401 @@ +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +new file mode 100644 +index 0000000..1f4c4c8 +--- /dev/null ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp +@@ -0,0 +1,1419 @@ +/* + * Copyright (C) 2005-2011 Team XBMC + * http://www.xbmc.org @@ -1192,11 +2087,12 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 +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_dlHandle = 0; + m_xvbaContext = 0; + m_refCount = 0; +} @@ -1219,11 +2115,11 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + CLog::Log(LOGNOTICE, "XVBA::Close - closing decoder context"); + + DestroyContext(); -+ if (m_dlHandle) -+ { -+ dlclose(m_dlHandle); -+ m_dlHandle = 0; -+ } ++// if (m_dlHandle) ++// { ++// dlclose(m_dlHandle); ++// m_dlHandle = 0; ++// } +} + +bool CXVBAContext::EnsureContext(CXVBAContext **ctx) @@ -2070,6 +2966,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + } + usleep(100); + } ++ render->state |= 4; +} + +int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic) @@ -2176,6 +3073,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + pic->type= FF_BUFFER_TYPE_USER; + + render->state |= FF_XVBA_STATE_USED_FOR_REFERENCE; ++ render->state &= ~4; + pic->reordered_opaque= avctx->reordered_opaque; + + return 0; @@ -2203,6 +3101,11 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + CLog::Log(LOGWARNING, "XVBA::Decode - ignoring invalid buffer"); + return VC_BUFFER; + } ++ if (!(render->state & 4)) ++ { ++ CLog::Log(LOGDEBUG, "XVBA::Decode - ffmpeg failed"); ++ return VC_BUFFER; ++ } + + render->state |= FF_XVBA_STATE_USED_FOR_RENDER; + @@ -2333,7 +3236,17 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + + if (!m_flipBuffer[index].outPic) + { -+ CLog::Log(LOGWARNING, "XVBA::Present: present picture is NULL"); ++ CLog::Log(LOGWARNING, "XVBA::CopyYV12: current picture is NULL"); ++ return; ++ } ++ if (!m_flipBuffer[index].outPic->render) ++ { ++ CLog::Log(LOGWARNING, "XVBA::CopyYV12: current render is NULL"); ++ return; ++ } ++ if (!m_flipBuffer[index].outPic->render->surface) ++ { ++ CLog::Log(LOGWARNING, "XVBA::CopyYV12: current surface is NULL"); + return; + } + @@ -2354,7 +3267,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + { CSingleLock lock(m_apiSec); + if (Success != g_XVBA_vtable.GetSurface(&input)) + { -+ CLog::Log(LOGERROR,"(XVBA::CopyYV12) failed to get surface"); ++ CLog::Log(LOGERROR,"XVBA::CopyYV12: failed to get surface"); + } + } +} @@ -2490,12 +3403,6 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + + for (unsigned int j=0; j<3; ++j) + { -+ if (glIsTexture(m_flipBuffer[i].glTexture[j])) -+ { -+ glDeleteTextures(1, &m_flipBuffer[i].glTexture[j]); -+ m_flipBuffer[i].glTexture[j] = 0; -+ CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed texture, index: %d, field %d", i, j); -+ } + if (m_flipBuffer[i].glSurface[j] && m_xvbaSession) + { + { CSingleLock lock(m_apiSec); @@ -2504,14 +3411,22 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.cpp xbmc-1fef7 + m_flipBuffer[i].glSurface[j] = 0; + CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed shared surface"); + } ++ if (glIsTexture(m_flipBuffer[i].glTexture[j])) ++ { ++ glDeleteTextures(1, &m_flipBuffer[i].glTexture[j]); ++ m_flipBuffer[i].glTexture[j] = 0; ++ CLog::Log(LOGDEBUG, "XVBA::FinishGL - destroyed texture, index: %d, field %d", i, j); ++ } + } + } +} + +#endif -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h 2012-02-07 14:30:18.021098627 +0100 +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h +new file mode 100644 +index 0000000..07ef811 +--- /dev/null ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2005-2011 Team XBMC @@ -2582,7 +3497,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h xbmc-1fef727 + static CCriticalSection m_section; + static Display *m_display; + int m_refCount; -+ void *m_dlHandle; ++ static void *m_dlHandle; + void *m_xvbaContext; +}; + @@ -2674,9 +3589,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDCodecs/Video/XVBA.h xbmc-1fef727 +}; + +} -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp 2012-02-07 14:30:18.023098666 +0100 +diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +index 55138fa..423d9f8 100644 +--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ++++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -19,7 +19,6 @@ * */ @@ -2685,7 +3601,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc #include "system.h" #ifndef __STDC_CONSTANT_MACROS #define __STDC_CONSTANT_MACROS -@@ -43,6 +42,7 @@ +@@ -44,6 +43,7 @@ #include "filesystem/Directory.h" #include "utils/log.h" #include "threads/Thread.h" @@ -2693,7 +3609,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc #include "utils/TimeUtils.h" void CDemuxStreamAudioFFmpeg::GetStreamInfo(std::string& strInfo) -@@ -153,16 +153,12 @@ +@@ -154,16 +154,12 @@ static void ff_flush_avutil_log_buffers(void) ++it; } @@ -2713,7 +3629,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc return 1; return 0; } -@@ -234,7 +230,7 @@ +@@ -235,7 +231,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) std::string strFile; m_iCurrentPts = DVD_NOPTS_VALUE; m_speed = DVD_PLAYSPEED_NORMAL; @@ -2722,7 +3638,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc m_program = UINT_MAX; if (!pInput) return false; -@@ -506,7 +502,7 @@ +@@ -507,7 +503,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) void CDVDDemuxFFmpeg::Dispose() { @@ -2731,7 +3647,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc if (m_pFormatContext) { -@@ -555,7 +551,7 @@ +@@ -556,7 +552,7 @@ void CDVDDemuxFFmpeg::Reset() void CDVDDemuxFFmpeg::Flush() { @@ -2740,7 +3656,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc // naughty usage of an internal ffmpeg function if (m_pFormatContext) -@@ -571,7 +567,7 @@ +@@ -572,7 +568,7 @@ void CDVDDemuxFFmpeg::Abort() void CDVDDemuxFFmpeg::SetSpeed(int iSpeed) { @@ -2749,7 +3665,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc if(!m_pFormatContext) return; -@@ -633,7 +629,7 @@ +@@ -634,7 +630,7 @@ double CDVDDemuxFFmpeg::ConvertTimestamp(int64_t pts, int den, int num) DemuxPacket* CDVDDemuxFFmpeg::Read() { @@ -2758,7 +3674,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc AVPacket pkt; DemuxPacket* pPacket = NULL; -@@ -832,7 +828,7 @@ +@@ -833,7 +829,7 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) { @@ -2767,7 +3683,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc if(time < 0) time = 0; -@@ -892,7 +888,7 @@ +@@ -893,7 +889,7 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) bool CDVDDemuxFFmpeg::SeekByte(__int64 pos) { @@ -2776,9 +3692,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp xbmc CSingleLock lock(m_critSection); int ret = m_dllAvFormat.av_seek_frame(m_pFormatContext, -1, pos, AVSEEK_FLAG_BYTE); -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp 2012-02-07 14:30:18.024098686 +0100 +diff --git a/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp b/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp +index 23c5e3e..129674a 100644 +--- a/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp ++++ b/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp @@ -21,6 +21,7 @@ #include "DVDPerformanceCounter.h" @@ -2787,7 +3704,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp xbmc-1fef #include "dvd_config.h" -@@ -68,22 +69,16 @@ +@@ -68,22 +69,16 @@ HRESULT __stdcall DVDPerformanceCounterVideoQueue(PLARGE_INTEGER numerator, PLAR inline __int64 get_thread_cpu_usage(ProcessPerformance* p) { @@ -2813,9 +3730,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.cpp xbmc-1fef __int64 threadTime = (p->timer_thread.QuadPart - old_time_thread.QuadPart); __int64 systemTime = (p->timer_system.QuadPart - old_time_system.QuadPart); -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPerformanceCounter.h 2012-02-07 14:30:18.025098706 +0100 +diff --git a/xbmc/cores/dvdplayer/DVDPerformanceCounter.h b/xbmc/cores/dvdplayer/DVDPerformanceCounter.h +index 2f0b5ac..e97a14c 100644 +--- a/xbmc/cores/dvdplayer/DVDPerformanceCounter.h ++++ b/xbmc/cores/dvdplayer/DVDPerformanceCounter.h @@ -24,7 +24,7 @@ #define FILETIME_TO_ULARGE_INTEGER(ularge, filetime) { ularge.u.HighPart = filetime.dwHighDateTime; ularge.u.LowPart = filetime.dwLowDateTime; } @@ -2825,7 +3743,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-1fef72 #include "threads/SingleLock.h" class CDVDMessageQueue; -@@ -33,7 +33,7 @@ +@@ -33,7 +33,7 @@ typedef struct stProcessPerformance { ULARGE_INTEGER timer_thread; ULARGE_INTEGER timer_system; @@ -2834,7 +3752,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-1fef72 } ProcessPerformance; class CDVDPerformanceCounter -@@ -45,20 +45,20 @@ +@@ -45,20 +45,20 @@ public: bool Initialize(); void DeInitialize(); @@ -2865,22 +3783,11 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPerformanceCounter.h xbmc-1fef72 CDVDMessageQueue* m_pAudioQueue; CDVDMessageQueue* m_pVideoQueue; -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp 2012-02-07 14:30:18.029098786 +0100 -@@ -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-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayer.cpp 2012-02-07 14:30:18.028098766 +0100 -@@ -341,7 +341,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp +index 6c9a3ea..2d1338e 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp +@@ -348,7 +348,7 @@ bool CDVDPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options) // if playing a file close it first // this has to be changed so we won't have to close it. @@ -2889,7 +3796,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-1fef727.patch/xb CloseFile(); m_bAbortRequest = false; -@@ -432,9 +432,8 @@ +@@ -440,9 +440,8 @@ void CDVDPlayer::OnStartup() m_messenger.Init(); @@ -2900,7 +3807,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-1fef727.patch/xb } bool CDVDPlayer::OpenInputStream() -@@ -2707,7 +2706,7 @@ +@@ -2897,7 +2896,7 @@ bool CDVDPlayer::OpenAudioStream(int iStream, int source) m_dvdPlayerAudio.SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); /* audio normally won't consume full cpu, so let it have prio */ @@ -2909,7 +3816,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-1fef727.patch/xb return true; } -@@ -2769,11 +2768,11 @@ +@@ -2962,11 +2961,11 @@ bool CDVDPlayer::OpenVideoStream(int iStream, int source) // 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. @@ -2923,10 +3830,24 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayer.cpp xbmc-1fef727.patch/xb #endif return true; -diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ---- xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp 2012-02-07 14:30:18.030098805 +0100 -@@ -189,7 +189,7 @@ +diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +index 41fbaaf..9f2128c 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +@@ -518,7 +518,7 @@ void CDVDPlayerAudio::OnStartup() + m_decode.msg = NULL; + m_decode.Release(); + +- g_dvdPerformanceCounter.EnableAudioDecodePerformance(ThreadHandle()); ++ g_dvdPerformanceCounter.EnableAudioDecodePerformance(this); + + #ifdef _WIN32 + CoInitializeEx(NULL, COINIT_MULTITHREADED); +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index e28faaf..0b02b49 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -189,7 +189,7 @@ bool CDVDPlayerVideo::OpenStream( CDVDStreamInfo &hint ) return false; } @@ -2935,7 +3856,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-1fef727.pat { g_VideoReferenceClock.Create(); //we have to wait for the clock to start otherwise alsa can cause trouble -@@ -288,7 +288,7 @@ +@@ -291,7 +291,7 @@ void CDVDPlayerVideo::OnStartup() m_iCurrentPts = DVD_NOPTS_VALUE; m_FlipTimeStamp = m_pClock->GetAbsoluteClock(); @@ -2944,7 +3865,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-1fef727.pat } void CDVDPlayerVideo::Process() -@@ -1049,6 +1049,14 @@ +@@ -1052,6 +1052,14 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) flags |= CONF_FLAGS_FORMAT_CVBREF; formatstr = "BGRA"; break; @@ -2959,9 +3880,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp xbmc-1fef727.pat } if(m_bAllowFullscreen) -diff -Naur xbmc-1fef727/xbmc/cores/paplayer/PAPlayer.cpp xbmc-1fef727.patch/xbmc/cores/paplayer/PAPlayer.cpp ---- xbmc-1fef727/xbmc/cores/paplayer/PAPlayer.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/paplayer/PAPlayer.cpp 2012-02-07 14:30:18.031098824 +0100 +diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp +index 43b57d3..13f5238 100644 +--- a/xbmc/cores/paplayer/PAPlayer.cpp ++++ b/xbmc/cores/paplayer/PAPlayer.cpp @@ -52,7 +52,7 @@ // Supporting all open audio codec standards. // First one being nullsoft's nsv audio decoder format @@ -2971,7 +3893,7 @@ diff -Naur xbmc-1fef727/xbmc/cores/paplayer/PAPlayer.cpp xbmc-1fef727.patch/xbmc { m_bIsPlaying = false; m_bPaused = false; -@@ -168,7 +168,7 @@ +@@ -168,7 +168,7 @@ bool PAPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options) *m_currentFile = file; @@ -2980,861 +3902,10 @@ diff -Naur xbmc-1fef727/xbmc/cores/paplayer/PAPlayer.cpp xbmc-1fef727.patch/xbmc Create(); m_startEvent.Set(); -diff -Naur xbmc-1fef727/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp xbmc-1fef727.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ---- xbmc-1fef727/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp 2012-02-07 14:30:18.012098450 +0100 -@@ -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,10 @@ - #ifdef HAVE_LIBVDPAU - vdpau = NULL; - #endif -+#ifdef HAVE_LIBXVBA -+ xvba = NULL; -+ xvba_tmp = NULL; -+#endif - } - - CLinuxRendererGL::YUVBUFFER::~YUVBUFFER() -@@ -160,6 +167,7 @@ - m_rgbPbo = 0; - - m_dllSwScale = new DllSwScale; -+ m_bValidated = false; - } - - CLinuxRendererGL::~CLinuxRendererGL() -@@ -224,7 +232,7 @@ - - void CLinuxRendererGL::ManageTextures() - { -- m_NumYV12Buffers = 2; -+ m_NumYV12Buffers = 3; - //m_iYV12RenderBuffer = 0; - return; - } -@@ -569,6 +577,11 @@ - m_bValidated = false; - } - -+unsigned int CLinuxRendererGL::GetProcessorSize() -+{ -+ return m_NumYV12Buffers; -+} -+ - void CLinuxRendererGL::Update(bool bPauseDrawing) - { - if (!m_bConfigured) return; -@@ -730,14 +743,15 @@ - { - CSingleLock lock(g_graphicsContext); - m_bConfigured = false; -- m_bValidated = false; -- UnInit(); -+ if (m_bValidated) -+ UnInit(); -+ - m_resolution = g_guiSettings.m_LookAndFeelResolution; - if ( m_resolution == RES_WINDOW ) - m_resolution = RES_DESKTOP; - - m_iYV12RenderBuffer = 0; -- m_NumYV12Buffers = 2; -+ m_NumYV12Buffers = 3; - - // setup the background colour - m_clearColour = (float)(g_advancedSettings.m_videoBlackBarColour & 0xff) / 0xff; -@@ -817,7 +831,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 +912,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"); -@@ -1032,6 +1051,18 @@ - 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 if (CONF_FLAGS_FORMAT_MASK(m_iFlags) == CONF_FLAGS_FORMAT_XVBA_YV12) -+ { -+ m_textureUpload = &CLinuxRendererGL::UploadXVBAyv12Texture; -+ m_textureCreate = &CLinuxRendererGL::CreateXVBAyv12Texture; -+ m_textureDelete = &CLinuxRendererGL::DeleteXVBAyv12Texture; -+ } - else - { - // setup default YV12 texture handlers -@@ -1125,6 +1156,13 @@ - RenderVDPAU(renderBuffer, m_currentField); - } - #endif -+#ifdef HAVE_LIBXVBA -+ else if (m_renderMethod & RENDER_XVBA) -+ { -+ UpdateVideoFilter(); -+ RenderXVBA(renderBuffer, m_currentField); -+ } -+#endif - #ifdef HAVE_LIBVA - else if (m_renderMethod & RENDER_VAAPI) - { -@@ -1598,6 +1636,77 @@ - #endif - } - -+void CLinuxRendererGL::RenderXVBA(int index, int field) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[field][0]; -+ -+ 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]; -@@ -2352,6 +2461,424 @@ - #endif - } - -+void CLinuxRendererGL::DeleteXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVPLANE &plane = m_buffers[index].fields[0][1]; -+ -+ if (m_buffers[index].xvba) -+ m_buffers[index].xvba->FinishGL(); -+ -+ SAFE_RELEASE(m_buffers[index].xvba); -+ SAFE_RELEASE(m_buffers[index].xvba_tmp); -+ -+ if(plane.id && glIsTexture(plane.id)) -+ glDeleteTextures(1, &plane.id); -+ plane.id = 0; -+ m_buffers[index].fields[0][0].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]; -+ YUVPLANE &planeFallback = fields[0][1]; -+ -+ DeleteXVBATexture(index); -+ -+ memset(&im , 0, sizeof(im)); -+ memset(&fields, 0, sizeof(fields)); -+ im.height = m_sourceHeight; -+ im.width = m_sourceWidth; -+ -+ for(int f = 0;fSet(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadXVBATexture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ XVBA::CDecoder *xvba = m_buffers[index].xvba; -+ -+ if (m_buffers[index].xvba_tmp) -+ { -+ SAFE_RELEASE(m_buffers[index].xvba); -+ xvba = m_buffers[index].xvba = m_buffers[index].xvba_tmp; -+ m_buffers[index].xvba_tmp = NULL; -+ } -+ -+ YUVFIELDS &fields = m_buffers[index].fields; -+ YUVPLANE &planeFallback = fields[0][1]; -+ YUVPLANE &plane = fields[m_currentField][0]; -+ -+ if (!xvba) -+ { -+ fields[0][0].id = planeFallback.id; -+ fields[1][0].id = planeFallback.id; -+ fields[2][0].id = planeFallback.id; -+ m_eventTexturesDone[index]->Set(); -+ return; -+ } -+ -+ XVBA_SURFACE_FLAG field; -+ if (m_currentField == FIELD_TOP) -+ field = XVBA_TOP_FIELD; -+ else if (m_currentField == FIELD_BOT) -+ field = XVBA_BOTTOM_FIELD; -+ else -+ field = XVBA_FRAME; -+ -+ glEnable(m_textureTarget); -+ if (xvba->UploadTexture(index, field, m_textureTarget) == 1) -+ plane.id = xvba->GetTexture(index, field); -+ -+ // crop texture -+ CRect crop = xvba->GetCropRect(); -+ plane.rect = m_sourceRect; -+ plane.rect.x1 += crop.x1; -+ plane.rect.x2 -= m_sourceWidth - crop.x2; -+ plane.rect.y1 += crop.y1; -+ plane.rect.y2 -= m_sourceHeight - crop.y2; -+ plane.rect.y1 /= plane.pixpertex_y; -+ plane.rect.y2 /= plane.pixpertex_y; -+ plane.rect.x1 /= plane.pixpertex_x; -+ plane.rect.x2 /= plane.pixpertex_x; -+ if (m_textureTarget == GL_TEXTURE_2D) -+ { -+ plane.rect.y1 /= plane.texheight; -+ plane.rect.y2 /= plane.texheight; -+ plane.rect.x1 /= plane.texwidth; -+ plane.rect.x2 /= plane.texwidth; -+ } -+ -+ glDisable(m_textureTarget); -+ -+ m_eventTexturesDone[index]->Set(); -+#endif -+} -+ -+//******************************************************************************************************** -+// XVBA YV12 Texture creation, deletion, copying + clearing -+//******************************************************************************************************** -+void CLinuxRendererGL::DeleteXVBAyv12Texture(int index) -+{ -+#ifdef HAVE_LIBXVBA -+ YV12Image &im = m_buffers[index].image; -+ YUVFIELDS &fields = m_buffers[index].fields; -+ GLuint *pbo = m_buffers[index].pbo; -+ -+ if (m_buffers[index].xvba) -+ m_buffers[index].xvba->FinishGL(); -+ -+ SAFE_RELEASE(m_buffers[index].xvba); -+ SAFE_RELEASE(m_buffers[index].xvba_tmp); -+ -+ if( fields[FIELD_FULL][0].id == 0 ) return; -+ -+ /* finish up all textures, and delete them */ -+ g_graphicsContext.BeginPaint(); //FIXME -+ for(int f = 0;f> im.cshift_x; -+ im.stride[2] = im.width >> im.cshift_x; -+ -+ im.planesize[0] = im.stride[0] * im.height; -+ im.planesize[1] = im.stride[1] * ( im.height >> im.cshift_y ); -+ im.planesize[2] = im.stride[2] * ( im.height >> im.cshift_y ); -+ -+ im.plane[1] = im.plane[2] = 0; -+ pbo[1] = pbo[2] = 0; -+ -+ bool pboSetup = false; -+ if (m_pboUsed) -+ { -+ pboSetup = true; -+ -+ glGenBuffersARB(1, pbo); -+ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo[0]); -+ glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, im.planesize[0] + im.planesize[0]/2 + PBO_OFFSET, 0, GL_STREAM_DRAW_ARB); -+ void* pboPtr = glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB); -+ if (pboPtr) -+ { -+ im.plane[0] = (BYTE*) pboPtr + PBO_OFFSET; -+ memset(im.plane[0], 0, im.planesize[0]); -+ } -+ else -+ { -+ CLog::Log(LOGWARNING,"GL: failed to set up pixel buffer object"); -+ pboSetup = false; -+ } -+ -+ if (!pboSetup) -+ { -+ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo[0]); -+ glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); -+ glDeleteBuffersARB(1, pbo); -+ memset(m_buffers[index].pbo, 0, sizeof(m_buffers[index].pbo)); -+ } -+ -+ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); -+ } -+ -+ if (!pboSetup) -+ { -+ im.plane[0] = new BYTE[im.planesize[0]+im.planesize[0]/2]; -+ } -+ -+ glEnable(m_textureTarget); -+ for(int f = 0;f> fieldshift; -+ -+ if (m_renderMethod & RENDER_SW) -+ { -+ planes[1].texwidth = 0; -+ planes[1].texheight = 0; -+ planes[2].texwidth = 0; -+ planes[2].texheight = 0; -+ } -+ else -+ { -+ planes[1].texwidth = planes[0].texwidth >> im.cshift_x; -+ planes[1].texheight = planes[0].texheight >> im.cshift_y; -+ planes[2].texwidth = planes[0].texwidth >> im.cshift_x; -+ planes[2].texheight = planes[0].texheight >> im.cshift_y; -+ } -+ -+ for (int p = 0; p < 3; p++) -+ { -+ planes[p].pixpertex_x = 1; -+ planes[p].pixpertex_y = 1; -+ } -+ -+ if(m_renderMethod & RENDER_POT) -+ { -+ for(int p = 0; p < 3; p++) -+ { -+ planes[p].texwidth = NP2(planes[p].texwidth); -+ planes[p].texheight = NP2(planes[p].texheight); -+ } -+ } -+ -+ for(int p = 0; p < 3; p++) -+ { -+ YUVPLANE &plane = planes[p]; -+ if (plane.texwidth * plane.texheight == 0) -+ continue; -+ -+ glBindTexture(m_textureTarget, plane.id); -+ if (m_renderMethod & RENDER_SW) -+ { -+ glTexImage2D(m_textureTarget, 0, GL_RGBA, plane.texwidth, plane.texheight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); -+ } -+ else -+ { -+ GLint format; -+ if (p == 2) //V plane needs an alpha texture -+ format = GL_ALPHA; -+ else -+ format = GL_LUMINANCE; -+ -+ glTexImage2D(m_textureTarget, 0, format, plane.texwidth, plane.texheight, 0, format, GL_UNSIGNED_BYTE, NULL); -+ } -+ -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ glTexParameteri(m_textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ VerifyGLState(); -+ } -+ } -+ glDisable(m_textureTarget); -+ m_eventTexturesDone[index]->Set(); -+#endif -+ return true; -+} -+ -+void CLinuxRendererGL::UploadXVBAyv12Texture(int source) -+{ -+#ifdef HAVE_LIBXVBA -+ YUVBUFFER& buf = m_buffers[source]; -+ YV12Image* im = &buf.image; -+ YUVFIELDS& fields = buf.fields; -+ XVBA::CDecoder *xvba = m_buffers[source].xvba; -+ -+ if (m_buffers[source].xvba_tmp) -+ { -+ SAFE_RELEASE(m_buffers[source].xvba); -+ xvba = m_buffers[source].xvba = m_buffers[source].xvba_tmp; -+ m_buffers[source].xvba_tmp = NULL; -+ } -+ -+ if (!(im->flags&IMAGE_FLAG_READY) || !xvba) -+ { -+ m_eventTexturesDone[source]->Set(); -+ return; -+ } -+ -+ bool deinterlacing; -+ if (m_currentField == FIELD_FULL) -+ deinterlacing = false; -+ else -+ deinterlacing = true; -+ -+ glEnable(m_textureTarget); -+ VerifyGLState(); -+ -+ glPixelStorei(GL_UNPACK_ALIGNMENT,1); -+ -+ if (deinterlacing) -+ { -+ // Load Even Y Field -+ LoadPlane( fields[FIELD_TOP][0] , GL_LUMINANCE, buf.flipindex -+ , im->width, im->height >> 1 -+ , im->stride[0]*2, im->plane[0] ); -+ -+ //load Odd Y Field -+ LoadPlane( fields[FIELD_BOT][0], GL_LUMINANCE, buf.flipindex -+ , im->width, im->height >> 1 -+ , im->stride[0]*2, im->plane[0] + im->stride[0], &buf.pbo[0] ) ; -+ -+ // Load Even U & V Fields -+ LoadPlane( fields[FIELD_TOP][1], GL_LUMINANCE, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) -+ , im->stride[1]*2, im->plane[0] + im->planesize[0] + im->planesize[1], &buf.pbo[0] ); -+ -+ LoadPlane( fields[FIELD_TOP][2], GL_ALPHA, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) -+ , im->stride[2]*2, im->plane[0] + im->planesize[0], &buf.pbo[0] ); -+ -+ // Load Odd U & V Fields -+ LoadPlane( fields[FIELD_BOT][1], GL_LUMINANCE, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) -+ , im->stride[1]*2, im->plane[0] + im->stride[1] + im->planesize[0] + im->planesize[1], &buf.pbo[0] ); -+ -+ LoadPlane( fields[FIELD_BOT][2], GL_ALPHA, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> (im->cshift_y + 1) -+ , im->stride[2]*2, im->plane[0] + im->stride[2] + im->planesize[0], &buf.pbo[0] ); -+ } -+ else -+ { -+ //Load Y plane -+ LoadPlane( fields[FIELD_FULL][0], GL_LUMINANCE, buf.flipindex -+ , im->width, im->height -+ , im->stride[0], im->plane[0], &buf.pbo[0] ); -+ -+ //load U plane -+ LoadPlane( fields[FIELD_FULL][1], GL_LUMINANCE, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> im->cshift_y -+ , im->stride[1], im->plane[0] + im->planesize[0] + im->planesize[1] , &buf.pbo[0] ); -+ -+ //load V plane -+ LoadPlane( fields[FIELD_FULL][2], GL_ALPHA, buf.flipindex -+ , im->width >> im->cshift_x, im->height >> im->cshift_y -+ , im->stride[2], im->plane[0] + im->planesize[0], &buf.pbo[0] ); -+ } -+ -+ m_eventTexturesDone[source]->Set(); -+ -+ VerifyGLState(); -+ -+ // crop texture -+ CRect crop = xvba->GetCropRect(); -+ m_sourceRect.x1 += crop.x1; -+ m_sourceRect.x2 -= m_sourceWidth - crop.x2; -+ m_sourceRect.y1 += crop.y1; -+ m_sourceRect.y2 -= m_sourceHeight - crop.y2; -+ CalculateTextureSourceRects(source, 3); -+ -+ glDisable(m_textureTarget); -+#endif -+} -+ - void CLinuxRendererGL::UploadYUV422PackedTexture(int source) - { - YUVBUFFER& buf = m_buffers[source]; -@@ -2935,6 +3462,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 +3478,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 +3504,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; - } - -@@ -3034,10 +3568,22 @@ - return false; - #endif - -- if(method == VS_INTERLACEMETHOD_DEINTERLACE -- || method == VS_INTERLACEMETHOD_DEINTERLACE_HALF -- || method == VS_INTERLACEMETHOD_SW_BLEND) -- return true; -+ if (CONF_FLAGS_FORMAT_MASK(m_iFlags) != CONF_FLAGS_FORMAT_XVBA) -+ { -+ if(method == VS_INTERLACEMETHOD_DEINTERLACE -+ || method == VS_INTERLACEMETHOD_DEINTERLACE_HALF -+ || method == VS_INTERLACEMETHOD_SW_BLEND) -+ return true; -+ } -+ -+ if(m_renderMethod & RENDER_XVBA) -+ { -+ if (method == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED -+ || method == VS_INTERLACEMETHOD_RENDER_BOB) -+ return true; -+ else -+ return false; -+ } - - if((method == VS_INTERLACEMETHOD_RENDER_BLEND - || method == VS_INTERLACEMETHOD_RENDER_WEAVE_INVERTED -@@ -3069,7 +3615,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 -@@ -3128,7 +3674,7 @@ - pbo = true; - - glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.pbo[plane]); -- glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.image.planesize[plane] + PBO_OFFSET, NULL, GL_STREAM_DRAW_ARB); -+ glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, buff.image.planesize[plane] + buff.image.planesize[plane]/2 + PBO_OFFSET, NULL, GL_STREAM_DRAW_ARB); - buff.image.plane[plane] = (BYTE*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB) + PBO_OFFSET; - } - if(pbo) -@@ -3152,4 +3698,13 @@ - } - #endif - -+#ifdef HAVE_LIBXVBA -+void CLinuxRendererGL::AddProcessor(XVBA::CDecoder* xvba) -+{ -+ YUVBUFFER &buf = m_buffers[NextYV12Texture()]; -+ SAFE_RELEASE(buf.xvba_tmp); -+ buf.xvba_tmp = (XVBA::CDecoder*)xvba->Acquire(); -+} -+#endif -+ - #endif -diff -Naur xbmc-1fef727/xbmc/cores/VideoRenderers/LinuxRendererGL.h xbmc-1fef727.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h ---- xbmc-1fef727/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/VideoRenderers/LinuxRendererGL.h 2012-02-07 14:30:18.013098470 +0100 -@@ -40,6 +40,7 @@ - namespace Shaders { class BaseYUV2RGBShader; } - namespace Shaders { class BaseVideoFilterShader; } - namespace VAAPI { struct CHolder; } -+namespace XVBA { class CDecoder; } - - #define NUM_BUFFERS 3 - -@@ -94,6 +95,7 @@ - RENDER_VDPAU=0x08, - RENDER_POT=0x10, - RENDER_VAAPI=0x20, -+ RENDER_XVBA=0x40, - }; - - enum RenderQuality -@@ -141,6 +143,7 @@ - virtual void UnInit(); - virtual void Reset(); /* resets renderer after seek for example */ - virtual void Flush(); -+ virtual unsigned int GetProcessorSize(); - - #ifdef HAVE_LIBVDPAU - virtual void AddProcessor(CVDPAU* vdpau); -@@ -148,6 +151,9 @@ - #ifdef HAVE_LIBVA - virtual void AddProcessor(VAAPI::CHolder& holder); - #endif -+#ifdef HAVE_LIBXVBA -+ virtual void AddProcessor(XVBA::CDecoder* xvba); -+#endif - - virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255); - -@@ -194,6 +200,14 @@ - void DeleteVAAPITexture(int index); - bool CreateVAAPITexture(int index); - -+ void UploadXVBATexture(int index); -+ void DeleteXVBATexture(int index); -+ bool CreateXVBATexture(int index); -+ -+ void UploadXVBAyv12Texture(int index); -+ void DeleteXVBAyv12Texture(int index); -+ bool CreateXVBAyv12Texture(int index); -+ - void UploadYUV422PackedTexture(int index); - void DeleteYUV422PackedTexture(int index); - bool CreateYUV422PackedTexture(int index); -@@ -211,6 +225,7 @@ - void RenderSoftware(int renderBuffer, int field); // single pass s/w yuv2rgb renderer - void RenderVDPAU(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; - -@@ -270,6 +285,10 @@ - #ifdef HAVE_LIBVA - VAAPI::CHolder& vaapi; - #endif -+#ifdef HAVE_LIBXVBA -+ XVBA::CDecoder* xvba; -+ XVBA::CDecoder* xvba_tmp; -+#endif - }; - - typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS]; -diff -Naur xbmc-1fef727/xbmc/cores/VideoRenderers/RenderFlags.h xbmc-1fef727.patch/xbmc/cores/VideoRenderers/RenderFlags.h ---- xbmc-1fef727/xbmc/cores/VideoRenderers/RenderFlags.h 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/VideoRenderers/RenderFlags.h 2012-02-07 14:30:18.013098470 +0100 -@@ -79,5 +79,7 @@ - #define CONF_FLAGS_FORMAT_VAAPI 0x030000 - #define CONF_FLAGS_FORMAT_OMXEGL 0x040000 - #define CONF_FLAGS_FORMAT_CVBREF 0x080000 -+#define CONF_FLAGS_FORMAT_XVBA 0x011000 -+#define CONF_FLAGS_FORMAT_XVBA_YV12 0x012000 - #define CONF_FLAGS_FORMAT_BYPASS 0x100000 - #endif -diff -Naur xbmc-1fef727/xbmc/cores/VideoRenderers/RenderManager.cpp xbmc-1fef727.patch/xbmc/cores/VideoRenderers/RenderManager.cpp ---- xbmc-1fef727/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/VideoRenderers/RenderManager.cpp 2012-02-07 14:30:18.014098490 +0100 -@@ -53,6 +53,10 @@ - #include "../dvdplayer/DVDCodecs/Video/DVDVideoCodec.h" - #include "../dvdplayer/DVDCodecs/DVDCodecUtils.h" - -+#ifdef HAVE_LIBXVBA -+ #include "../dvdplayer/DVDCodecs/Video/XVBA.h" -+#endif -+ - #define MAXPRESENTDELAY 0.500 - - /* at any point we want an exclusive lock on rendermanager */ -@@ -777,6 +781,25 @@ - else if(pic.format == DVDVideoPicture::FMT_VAAPI) - m_pRenderer->AddProcessor(*pic.vaapi); - #endif -+#ifdef HAVE_LIBXVBA -+ else if(pic.format == DVDVideoPicture::FMT_XVBA) -+ { -+ if (pic.xvba) -+ { -+ m_pRenderer->AddProcessor(pic.xvba); -+ pic.xvba->Present(index); -+ } -+ } -+ else if(pic.format == DVDVideoPicture::FMT_XVBA_YV12) -+ { -+ if (pic.xvba) -+ { -+ m_pRenderer->AddProcessor(pic.xvba); -+ pic.xvba->Present(index); -+ pic.xvba->CopyYV12(index, image.plane[0]); -+ } -+ } -+#endif - m_pRenderer->ReleaseImage(index, false); - - return index; -diff -Naur xbmc-1fef727/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp xbmc-1fef727.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp ---- xbmc-1fef727/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-02-07 12:46:52.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/cores/VideoRenderers/VideoShaders/YUV2RGBShader.cpp 2012-02-07 14:30:18.015098509 +0100 -@@ -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"; -+ if (CONF_FLAGS_FORMAT_MASK(flags) == CONF_FLAGS_FORMAT_XVBA_YV12) -+ m_defines += "#define XBMC_YV12\n"; - - VertexShader()->LoadSource("yuv2rgb_vertex.glsl", m_defines); - #elif HAS_GLES == 2 -diff -Naur xbmc-1fef727/xbmc/dialogs/GUIDialogCache.cpp xbmc-1fef727.patch/xbmc/dialogs/GUIDialogCache.cpp ---- xbmc-1fef727/xbmc/dialogs/GUIDialogCache.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/dialogs/GUIDialogCache.cpp 2012-02-07 14:30:18.032098844 +0100 +diff --git a/xbmc/dialogs/GUIDialogCache.cpp b/xbmc/dialogs/GUIDialogCache.cpp +index 1114cc6..85548e4 100644 +--- a/xbmc/dialogs/GUIDialogCache.cpp ++++ b/xbmc/dialogs/GUIDialogCache.cpp @@ -29,7 +29,7 @@ #include "threads/SingleLock.h" #include "utils/TimeUtils.h" @@ -3844,10 +3915,11 @@ diff -Naur xbmc-1fef727/xbmc/dialogs/GUIDialogCache.cpp xbmc-1fef727.patch/xbmc/ { m_pDlg = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); -diff -Naur xbmc-1fef727/xbmc/filesystem/FileCache.cpp xbmc-1fef727.patch/xbmc/filesystem/FileCache.cpp ---- xbmc-1fef727/xbmc/filesystem/FileCache.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/FileCache.cpp 2012-02-07 14:30:18.032098844 +0100 -@@ -79,7 +79,7 @@ +diff --git a/xbmc/filesystem/FileCache.cpp b/xbmc/filesystem/FileCache.cpp +index c6af9d0..63937ef 100644 +--- a/xbmc/filesystem/FileCache.cpp ++++ b/xbmc/filesystem/FileCache.cpp +@@ -79,7 +79,7 @@ private: }; @@ -3856,7 +3928,7 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/FileCache.cpp xbmc-1fef727.patch/xbmc/fi { m_bDeleteCache = true; m_nSeekResult = 0; -@@ -95,7 +95,7 @@ +@@ -95,7 +95,7 @@ CFileCache::CFileCache() m_cacheFull = false; } @@ -3865,9 +3937,10 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/FileCache.cpp xbmc-1fef727.patch/xbmc/fi { m_pCache = pCache; m_bDeleteCache = bDeleteCache; -diff -Naur xbmc-1fef727/xbmc/filesystem/FilePipe.cpp xbmc-1fef727.patch/xbmc/filesystem/FilePipe.cpp ---- xbmc-1fef727/xbmc/filesystem/FilePipe.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/FilePipe.cpp 2012-02-07 14:30:18.033098864 +0100 +diff --git a/xbmc/filesystem/FilePipe.cpp b/xbmc/filesystem/FilePipe.cpp +index 1a55336..c61175e 100644 +--- a/xbmc/filesystem/FilePipe.cpp ++++ b/xbmc/filesystem/FilePipe.cpp @@ -24,6 +24,8 @@ #include "PipesManager.h" #include "utils/StringUtils.h" @@ -3877,10 +3950,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/FilePipe.cpp xbmc-1fef727.patch/xbmc/fil using namespace XFILE; CFilePipe::CFilePipe() : m_pos(0), m_length(-1), m_pipe(NULL) -diff -Naur xbmc-1fef727/xbmc/filesystem/FileRar.cpp xbmc-1fef727.patch/xbmc/filesystem/FileRar.cpp ---- xbmc-1fef727/xbmc/filesystem/FileRar.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/FileRar.cpp 2012-02-07 14:30:18.033098864 +0100 -@@ -43,7 +43,7 @@ +diff --git a/xbmc/filesystem/FileRar.cpp b/xbmc/filesystem/FileRar.cpp +index 9c87a35..202b3ee 100644 +--- a/xbmc/filesystem/FileRar.cpp ++++ b/xbmc/filesystem/FileRar.cpp +@@ -43,7 +43,7 @@ using namespace std; #define SEEKTIMOUT 30000 #ifdef HAS_FILESYSTEM_RAR @@ -3889,10 +3963,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/FileRar.cpp xbmc-1fef727.patch/xbmc/file { m_pArc = NULL; m_pCmd = NULL; -diff -Naur xbmc-1fef727/xbmc/filesystem/HTSPDirectory.cpp xbmc-1fef727.patch/xbmc/filesystem/HTSPDirectory.cpp ---- xbmc-1fef727/xbmc/filesystem/HTSPDirectory.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/HTSPDirectory.cpp 2012-02-07 14:30:18.034098884 +0100 -@@ -76,7 +76,7 @@ +diff --git a/xbmc/filesystem/HTSPDirectory.cpp b/xbmc/filesystem/HTSPDirectory.cpp +index 83a1fca..152754d 100644 +--- a/xbmc/filesystem/HTSPDirectory.cpp ++++ b/xbmc/filesystem/HTSPDirectory.cpp +@@ -76,7 +76,7 @@ static SSessions g_sessions; static CCriticalSection g_section; @@ -3901,10 +3976,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/HTSPDirectory.cpp xbmc-1fef727.patch/xbm { } -diff -Naur xbmc-1fef727/xbmc/filesystem/LastFMDirectory.cpp xbmc-1fef727.patch/xbmc/filesystem/LastFMDirectory.cpp ---- xbmc-1fef727/xbmc/filesystem/LastFMDirectory.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/LastFMDirectory.cpp 2012-02-07 14:30:18.035098904 +0100 -@@ -69,7 +69,7 @@ +diff --git a/xbmc/filesystem/LastFMDirectory.cpp b/xbmc/filesystem/LastFMDirectory.cpp +index af5621c..a4b23fc 100644 +--- a/xbmc/filesystem/LastFMDirectory.cpp ++++ b/xbmc/filesystem/LastFMDirectory.cpp +@@ -69,7 +69,7 @@ bool CLastFMDirectory::RetrieveList(CStdString url) m_dlgProgress->Progress(); } @@ -3913,10 +3989,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/LastFMDirectory.cpp xbmc-1fef727.patch/x m_strSource = url; m_strDestination = "special://temp/lastfm.xml"; thread.Create(); -diff -Naur xbmc-1fef727/xbmc/filesystem/MythSession.cpp xbmc-1fef727.patch/xbmc/filesystem/MythSession.cpp ---- xbmc-1fef727/xbmc/filesystem/MythSession.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/MythSession.cpp 2012-02-07 14:30:18.035098904 +0100 -@@ -359,7 +359,7 @@ +diff --git a/xbmc/filesystem/MythSession.cpp b/xbmc/filesystem/MythSession.cpp +index 45de2cc..304ecdd 100644 +--- a/xbmc/filesystem/MythSession.cpp ++++ b/xbmc/filesystem/MythSession.cpp +@@ -359,7 +359,7 @@ void CMythSession::SetSeasonAndEpisode(const cmyth_proginfo_t &program, int *sea return; } @@ -3925,9 +4002,10 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/MythSession.cpp xbmc-1fef727.patch/xbmc/ { m_control = NULL; m_event = NULL; -diff -Naur xbmc-1fef727/xbmc/filesystem/PipesManager.cpp xbmc-1fef727.patch/xbmc/filesystem/PipesManager.cpp ---- xbmc-1fef727/xbmc/filesystem/PipesManager.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/PipesManager.cpp 2012-02-07 14:30:18.036098923 +0100 +diff --git a/xbmc/filesystem/PipesManager.cpp b/xbmc/filesystem/PipesManager.cpp +index 73f4aa2..80a1044 100644 +--- a/xbmc/filesystem/PipesManager.cpp ++++ b/xbmc/filesystem/PipesManager.cpp @@ -23,6 +23,8 @@ #include "threads/SingleLock.h" #include "Application.h" @@ -3937,10 +4015,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/PipesManager.cpp xbmc-1fef727.patch/xbmc #ifndef min #define min(a,b) ((a) < (b) ? (a) : (b)) #endif -diff -Naur xbmc-1fef727/xbmc/filesystem/RarManager.h xbmc-1fef727.patch/xbmc/filesystem/RarManager.h ---- xbmc-1fef727/xbmc/filesystem/RarManager.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/RarManager.h 2012-02-07 14:30:18.037098942 +0100 -@@ -71,7 +71,7 @@ +diff --git a/xbmc/filesystem/RarManager.h b/xbmc/filesystem/RarManager.h +index dd4b2f0..6f93f79 100644 +--- a/xbmc/filesystem/RarManager.h ++++ b/xbmc/filesystem/RarManager.h +@@ -71,7 +71,7 @@ public: CRarManager(); ~CRarManager(); bool CacheRarredFile(CStdString& strPathInCache, const CStdString& strRarPath, @@ -3949,10 +4028,11 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/RarManager.h xbmc-1fef727.patch/xbmc/fil const CStdString& strDir =RAR_DEFAULT_CACHE, const int64_t iSize=-1); bool GetPathInCache(CStdString& strPathInCache, const CStdString& strRarPath, const CStdString& strPathInRar = ""); -diff -Naur xbmc-1fef727/xbmc/filesystem/SAPDirectory.cpp xbmc-1fef727.patch/xbmc/filesystem/SAPDirectory.cpp ---- xbmc-1fef727/xbmc/filesystem/SAPDirectory.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/filesystem/SAPDirectory.cpp 2012-02-07 14:30:18.037098942 +0100 -@@ -272,7 +272,7 @@ +diff --git a/xbmc/filesystem/SAPDirectory.cpp b/xbmc/filesystem/SAPDirectory.cpp +index d8931b8..b997c12 100644 +--- a/xbmc/filesystem/SAPDirectory.cpp ++++ b/xbmc/filesystem/SAPDirectory.cpp +@@ -272,7 +272,7 @@ namespace SDP using namespace SDP; @@ -3961,7 +4041,7 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/SAPDirectory.cpp xbmc-1fef727.patch/xbmc { m_socket = INVALID_SOCKET; } -@@ -486,7 +486,7 @@ +@@ -486,7 +486,7 @@ namespace XFILE CSingleLock lock(g_sapsessions.m_section); @@ -3970,10 +4050,42 @@ diff -Naur xbmc-1fef727/xbmc/filesystem/SAPDirectory.cpp xbmc-1fef727.patch/xbmc g_sapsessions.Create(); // check if we can find this session in our cache -diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp ---- xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp 2012-02-07 14:30:18.039098982 +0100 -@@ -181,9 +181,9 @@ +diff --git a/xbmc/interfaces/python/XBPython.cpp b/xbmc/interfaces/python/XBPython.cpp +index 9f43894..8cb3e61 100644 +--- a/xbmc/interfaces/python/XBPython.cpp ++++ b/xbmc/interfaces/python/XBPython.cpp +@@ -676,11 +676,11 @@ void XBPython::PulseGlobalEvent() + 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 --git a/xbmc/interfaces/python/XBPython.h b/xbmc/interfaces/python/XBPython.h +index 7737744..8877b54 100644 +--- a/xbmc/interfaces/python/XBPython.h ++++ b/xbmc/interfaces/python/XBPython.h +@@ -61,7 +61,7 @@ public: + void Process(); + + void PulseGlobalEvent(); +- void WaitForEvent(CEvent& hEvent, unsigned int timeout); ++ void WaitForEvent(CEvent& hEvent); + + int ScriptsSize(); + int GetPythonScriptId(int scriptPosition); +diff --git a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp +index 4ec7e23..d44fc23 100644 +--- a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp ++++ b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp +@@ -181,9 +181,9 @@ void CGUIPythonWindow::SetCallbackWindow(void *state, void *object) m_threadState = state; } @@ -3985,10 +4097,11 @@ diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.cpp xb m_actionEvent.Reset(); } -diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h ---- xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h 2012-02-07 14:30:18.040099002 +0100 -@@ -51,7 +51,7 @@ +diff --git a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h +index c776187..09c0d42 100644 +--- a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h ++++ b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h +@@ -51,7 +51,7 @@ public: virtual bool OnAction(const CAction &action); virtual bool OnBack(int actionID); void SetCallbackWindow(void* state, void *object); @@ -3997,10 +4110,11 @@ diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindow.h xbmc void PulseActionEvent(); void SetDestroyAfterDeinit(bool destroy = true); protected: -diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp ---- xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp 2012-02-07 14:30:18.041099022 +0100 -@@ -279,9 +279,9 @@ +diff --git a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp +index 2db79f1..9644351 100644 +--- a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp ++++ b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp +@@ -279,9 +279,9 @@ void CGUIPythonWindowXML::ClearList() UpdateButtons(); } @@ -4012,10 +4126,11 @@ diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.cpp m_actionEvent.Reset(); } -diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h ---- xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h 2012-02-07 14:30:18.041099022 +0100 -@@ -40,7 +40,7 @@ +diff --git a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h +index 27bc3a2..340be8b 100644 +--- a/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h ++++ b/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h +@@ -40,7 +40,7 @@ public: virtual void AllocResources(bool forceLoad = false); virtual void FreeResources(bool forceUnLoad = false); void Process(unsigned int currentTime, CDirtyRegionList ®ions); @@ -4024,10 +4139,11 @@ diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/GUIPythonWindowXML.h x void PulseActionEvent(); void AddItem(CFileItemPtr fileItem,int itemPosition); void RemoveItem(int itemPosition); -diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/window.cpp ---- xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/xbmcmodule/window.cpp 2012-02-07 14:30:18.042099042 +0100 -@@ -540,11 +540,11 @@ +diff --git a/xbmc/interfaces/python/xbmcmodule/window.cpp b/xbmc/interfaces/python/xbmcmodule/window.cpp +index 9b9184a..1b72644 100644 +--- a/xbmc/interfaces/python/xbmcmodule/window.cpp ++++ b/xbmc/interfaces/python/xbmcmodule/window.cpp +@@ -540,11 +540,11 @@ namespace PYXBMC CPyThreadState pyState; if (WindowXML_Check(self)) @@ -4042,39 +4158,11 @@ diff -Naur xbmc-1fef727/xbmc/interfaces/python/xbmcmodule/window.cpp xbmc-1fef72 } } Py_INCREF(Py_None); -diff -Naur xbmc-1fef727/xbmc/interfaces/python/XBPython.cpp xbmc-1fef727.patch/xbmc/interfaces/python/XBPython.cpp ---- xbmc-1fef727/xbmc/interfaces/python/XBPython.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/XBPython.cpp 2012-02-07 14:30:18.038098962 +0100 -@@ -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-1fef727/xbmc/interfaces/python/XBPython.h xbmc-1fef727.patch/xbmc/interfaces/python/XBPython.h ---- xbmc-1fef727/xbmc/interfaces/python/XBPython.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/interfaces/python/XBPython.h 2012-02-07 14:30:18.039098982 +0100 -@@ -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-1fef727/xbmc/linux/Makefile.in xbmc-1fef727.patch/xbmc/linux/Makefile.in ---- xbmc-1fef727/xbmc/linux/Makefile.in 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/Makefile.in 2012-02-07 14:30:18.043099062 +0100 -@@ -10,14 +10,11 @@ +diff --git a/xbmc/linux/Makefile.in b/xbmc/linux/Makefile.in +index c3a5877..43f552b 100644 +--- a/xbmc/linux/Makefile.in ++++ b/xbmc/linux/Makefile.in +@@ -10,14 +10,11 @@ SRCS=ConvUtils.cpp \ LinuxResourceCounter.cpp \ LinuxTimezone.cpp \ PosixMountProvider.cpp \ @@ -4089,9 +4177,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/Makefile.in xbmc-1fef727.patch/xbmc/linux/Mak LIB=linux.a -diff -Naur xbmc-1fef727/xbmc/linux/PlatformDefs.h xbmc-1fef727.patch/xbmc/linux/PlatformDefs.h ---- xbmc-1fef727/xbmc/linux/PlatformDefs.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/PlatformDefs.h 2012-02-07 14:30:18.044099082 +0100 +diff --git a/xbmc/linux/PlatformDefs.h b/xbmc/linux/PlatformDefs.h +index 33d1c96..55d20c5 100644 +--- a/xbmc/linux/PlatformDefs.h ++++ b/xbmc/linux/PlatformDefs.h @@ -182,8 +182,6 @@ #define EXCEPTION_EXECUTE_HANDLER ... //NOTE: dont try to define __except because it breaks g++ (already uses it). @@ -4101,9 +4190,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/PlatformDefs.h xbmc-1fef727.patch/xbmc/linux/ struct CXHandle; // forward declaration typedef CXHandle* HANDLE; -diff -Naur xbmc-1fef727/xbmc/linux/PlatformInclude.h xbmc-1fef727.patch/xbmc/linux/PlatformInclude.h ---- xbmc-1fef727/xbmc/linux/PlatformInclude.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/PlatformInclude.h 2012-02-07 14:30:18.044099082 +0100 +diff --git a/xbmc/linux/PlatformInclude.h b/xbmc/linux/PlatformInclude.h +index 1f7e7e9..4e44ed8 100644 +--- a/xbmc/linux/PlatformInclude.h ++++ b/xbmc/linux/PlatformInclude.h @@ -25,10 +25,7 @@ #include "PlatformDefs.h" #include "XHandlePublic.h" @@ -4115,9 +4205,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/PlatformInclude.h xbmc-1fef727.patch/xbmc/lin #include "XMemUtils.h" #include "ConvUtils.h" -diff -Naur xbmc-1fef727/xbmc/linux/XEventUtils.cpp xbmc-1fef727.patch/xbmc/linux/XEventUtils.cpp ---- xbmc-1fef727/xbmc/linux/XEventUtils.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XEventUtils.cpp 1970-01-01 01:00:00.000000000 +0100 +diff --git a/xbmc/linux/XEventUtils.cpp b/xbmc/linux/XEventUtils.cpp +deleted file mode 100644 +index 639b7b9..0000000 +--- a/xbmc/linux/XEventUtils.cpp ++++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2005-2008 Team XBMC @@ -4263,9 +4355,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/XEventUtils.cpp xbmc-1fef727.patch/xbmc/linux - return true; -} - -diff -Naur xbmc-1fef727/xbmc/linux/XEventUtils.h xbmc-1fef727.patch/xbmc/linux/XEventUtils.h ---- xbmc-1fef727/xbmc/linux/XEventUtils.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XEventUtils.h 1970-01-01 01:00:00.000000000 +0100 +diff --git a/xbmc/linux/XEventUtils.h b/xbmc/linux/XEventUtils.h +deleted file mode 100644 +index a77f843..0000000 +--- a/xbmc/linux/XEventUtils.h ++++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __X_EVENT_UTIL_H__ -#define __X_EVENT_UTIL_H__ @@ -4305,9 +4399,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/XEventUtils.h xbmc-1fef727.patch/xbmc/linux/X - -#endif - -diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHandle.cpp ---- xbmc-1fef727/xbmc/linux/XHandle.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XHandle.cpp 2012-02-07 14:30:18.051099219 +0100 +diff --git a/xbmc/linux/XHandle.cpp b/xbmc/linux/XHandle.cpp +index 61520b2..52f540a 100644 +--- a/xbmc/linux/XHandle.cpp ++++ b/xbmc/linux/XHandle.cpp @@ -20,12 +20,15 @@ */ @@ -4325,7 +4420,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHa CXHandle::CXHandle() { Init(); -@@ -47,11 +50,6 @@ +@@ -47,11 +50,6 @@ CXHandle::CXHandle(const CXHandle &src) Init(); @@ -4337,7 +4432,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHa if (src.m_hMutex) m_hMutex = new CCriticalSection(); -@@ -80,7 +78,7 @@ +@@ -80,7 +78,7 @@ CXHandle::~CXHandle() CLog::Log(LOGERROR,"%s, destroying handle with ref count %d", __FUNCTION__, m_nRefCount); assert(false); } @@ -4346,7 +4441,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHa if (m_hMutex) { delete m_hMutex; } -@@ -93,10 +91,6 @@ +@@ -93,10 +91,6 @@ CXHandle::~CXHandle() delete m_hCond; } @@ -4357,7 +4452,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHa if ( fd != 0 ) { close(fd); } -@@ -107,11 +101,9 @@ +@@ -107,11 +101,9 @@ void CXHandle::Init() { fd=0; m_hMutex=NULL; @@ -4369,9 +4464,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.cpp xbmc-1fef727.patch/xbmc/linux/XHa m_bManualEvent=FALSE; m_bEventSet=FALSE; m_nFindFileIterator=0 ; -diff -Naur xbmc-1fef727/xbmc/linux/XHandle.h xbmc-1fef727.patch/xbmc/linux/XHandle.h ---- xbmc-1fef727/xbmc/linux/XHandle.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XHandle.h 2012-02-07 14:30:18.051099219 +0100 +diff --git a/xbmc/linux/XHandle.h b/xbmc/linux/XHandle.h +index 0e119bc..dd7f37d 100644 +--- a/xbmc/linux/XHandle.h ++++ b/xbmc/linux/XHandle.h @@ -25,7 +25,6 @@ #ifndef _WIN32 @@ -4389,7 +4485,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.h xbmc-1fef727.patch/xbmc/linux/XHand CXHandle(); CXHandle(HandleType nType); -@@ -47,8 +46,6 @@ +@@ -47,8 +46,6 @@ public: inline HandleType GetType() { return m_type; } void ChangeType(HandleType newType); @@ -4398,7 +4494,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.h xbmc-1fef727.patch/xbmc/linux/XHand XbmcThreads::ConditionVariable *m_hCond; std::list m_hParents; -@@ -62,7 +59,6 @@ +@@ -62,7 +59,6 @@ public: // simulate mutex and critical section CCriticalSection *m_hMutex; int RecursionCount; // for mutex - for compatibility with WIN32 critical section @@ -4406,9 +4502,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/XHandle.h xbmc-1fef727.patch/xbmc/linux/XHand int fd; bool m_bManualEvent; time_t m_tmCreation; -diff -Naur xbmc-1fef727/xbmc/linux/XMemUtils.cpp xbmc-1fef727.patch/xbmc/linux/XMemUtils.cpp ---- xbmc-1fef727/xbmc/linux/XMemUtils.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XMemUtils.cpp 2012-02-07 14:30:18.052099238 +0100 +diff --git a/xbmc/linux/XMemUtils.cpp b/xbmc/linux/XMemUtils.cpp +index 906fe4e..c0006fe 100644 +--- a/xbmc/linux/XMemUtils.cpp ++++ b/xbmc/linux/XMemUtils.cpp @@ -25,6 +25,10 @@ #include "XMemUtils.h" @@ -4420,7 +4517,7 @@ diff -Naur xbmc-1fef727/xbmc/linux/XMemUtils.cpp xbmc-1fef727.patch/xbmc/linux/X #undef ALIGN #define ALIGN(value, alignment) (((value)+(alignment-1))&~(alignment-1)) -@@ -49,4 +53,130 @@ +@@ -49,4 +53,130 @@ void _aligned_free(void *p) { free(pFull); } @@ -4551,9 +4648,10 @@ diff -Naur xbmc-1fef727/xbmc/linux/XMemUtils.cpp xbmc-1fef727.patch/xbmc/linux/X + +#endif -diff -Naur xbmc-1fef727/xbmc/linux/XMemUtils.h xbmc-1fef727.patch/xbmc/linux/XMemUtils.h ---- xbmc-1fef727/xbmc/linux/XMemUtils.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XMemUtils.h 2012-02-07 14:30:18.053099258 +0100 +diff --git a/xbmc/linux/XMemUtils.h b/xbmc/linux/XMemUtils.h +index d6d314a..83fc95d 100644 +--- a/xbmc/linux/XMemUtils.h ++++ b/xbmc/linux/XMemUtils.h @@ -22,10 +22,14 @@ * */ @@ -4569,9 +4667,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/XMemUtils.h xbmc-1fef727.patch/xbmc/linux/XMe + #endif -diff -Naur xbmc-1fef727/xbmc/linux/XSyncUtils.cpp xbmc-1fef727.patch/xbmc/linux/XSyncUtils.cpp ---- xbmc-1fef727/xbmc/linux/XSyncUtils.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XSyncUtils.cpp 1970-01-01 01:00:00.000000000 +0100 +diff --git a/xbmc/linux/XSyncUtils.cpp b/xbmc/linux/XSyncUtils.cpp +deleted file mode 100644 +index 19c4b5a..0000000 +--- a/xbmc/linux/XSyncUtils.cpp ++++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2005-2008 Team XBMC @@ -4742,9 +4842,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/XSyncUtils.cpp xbmc-1fef727.patch/xbmc/linux/ -} - -#endif -diff -Naur xbmc-1fef727/xbmc/linux/XSyncUtils.h xbmc-1fef727.patch/xbmc/linux/XSyncUtils.h ---- xbmc-1fef727/xbmc/linux/XSyncUtils.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XSyncUtils.h 1970-01-01 01:00:00.000000000 +0100 +diff --git a/xbmc/linux/XSyncUtils.h b/xbmc/linux/XSyncUtils.h +deleted file mode 100644 +index f3ad36f..0000000 +--- a/xbmc/linux/XSyncUtils.h ++++ /dev/null @@ -1,44 +0,0 @@ -#ifndef __X_SYNC_UTILS_ -#define __X_SYNC_UTILS_ @@ -4790,9 +4892,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/XSyncUtils.h xbmc-1fef727.patch/xbmc/linux/XS - -#endif - -diff -Naur xbmc-1fef727/xbmc/linux/XThreadUtils.cpp xbmc-1fef727.patch/xbmc/linux/XThreadUtils.cpp ---- xbmc-1fef727/xbmc/linux/XThreadUtils.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/linux/XThreadUtils.cpp 1970-01-01 01:00:00.000000000 +0100 +diff --git a/xbmc/linux/XThreadUtils.cpp b/xbmc/linux/XThreadUtils.cpp +deleted file mode 100644 +index 9d68481..0000000 +--- a/xbmc/linux/XThreadUtils.cpp ++++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 2005-2009 Team XBMC @@ -5004,43 +5108,11 @@ diff -Naur xbmc-1fef727/xbmc/linux/XThreadUtils.cpp xbmc-1fef727.patch/xbmc/linu - -#endif - -diff -Naur xbmc-1fef727/xbmc/music/infoscanner/MusicInfoScanner.cpp xbmc-1fef727.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp ---- xbmc-1fef727/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/music/infoscanner/MusicInfoScanner.cpp 2012-02-07 14:30:18.056099318 +0100 -@@ -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-1fef727/xbmc/music/infoscanner/MusicInfoScraper.cpp xbmc-1fef727.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp ---- xbmc-1fef727/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/music/infoscanner/MusicInfoScraper.cpp 2012-02-07 14:30:18.057099338 +0100 -@@ -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-1fef727/xbmc/music/LastFmManager.cpp xbmc-1fef727.patch/xbmc/music/LastFmManager.cpp ---- xbmc-1fef727/xbmc/music/LastFmManager.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/music/LastFmManager.cpp 2012-02-07 14:30:18.055099298 +0100 -@@ -70,7 +70,7 @@ +diff --git a/xbmc/music/LastFmManager.cpp b/xbmc/music/LastFmManager.cpp +index 700f28a..b97fdf2 100644 +--- a/xbmc/music/LastFmManager.cpp ++++ b/xbmc/music/LastFmManager.cpp +@@ -70,7 +70,7 @@ using namespace XFILE; CLastFmManager* CLastFmManager::m_pInstance=NULL; @@ -5049,7 +5121,7 @@ diff -Naur xbmc-1fef727/xbmc/music/LastFmManager.cpp xbmc-1fef727.patch/xbmc/mus { m_RadioTrackQueue = new CPlayList; } -@@ -534,7 +534,7 @@ +@@ -534,7 +534,7 @@ void CLastFmManager::Update() if (iNrCachedTracks == 0) { //get more tracks @@ -5058,7 +5130,7 @@ diff -Naur xbmc-1fef727/xbmc/music/LastFmManager.cpp xbmc-1fef727.patch/xbmc/mus { m_hWorkerEvent.Set(); } -@@ -633,7 +633,7 @@ +@@ -633,7 +633,7 @@ void CLastFmManager::StopRadio(bool bKillSession /*= true*/) { m_RadioSession = ""; } @@ -5067,10 +5139,46 @@ diff -Naur xbmc-1fef727/xbmc/music/LastFmManager.cpp xbmc-1fef727.patch/xbmc/mus { m_bStop = true; m_hWorkerEvent.Set(); -diff -Naur xbmc-1fef727/xbmc/network/AirPlayServer.cpp xbmc-1fef727.patch/xbmc/network/AirPlayServer.cpp ---- xbmc-1fef727/xbmc/network/AirPlayServer.cpp 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/AirPlayServer.cpp 2012-02-07 14:30:18.058099358 +0100 -@@ -183,7 +183,7 @@ +diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp +index 3400f27..445edaf 100644 +--- a/xbmc/music/infoscanner/MusicInfoScanner.cpp ++++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp +@@ -57,7 +57,7 @@ using namespace MUSIC_INFO; + using namespace XFILE; + using namespace MUSIC_GRABBER; + +-CMusicInfoScanner::CMusicInfoScanner() ++CMusicInfoScanner::CMusicInfoScanner() : CThread("CMusicInfoScanner") + { + m_bRunning = false; + m_pObserver = NULL; +@@ -99,7 +99,7 @@ void CMusicInfoScanner::Process() + + // 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 --git a/xbmc/music/infoscanner/MusicInfoScraper.cpp b/xbmc/music/infoscanner/MusicInfoScraper.cpp +index 09aeb14..aad726c 100644 +--- a/xbmc/music/infoscanner/MusicInfoScraper.cpp ++++ b/xbmc/music/infoscanner/MusicInfoScraper.cpp +@@ -28,7 +28,7 @@ using namespace MUSIC_GRABBER; + 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 --git a/xbmc/network/AirPlayServer.cpp b/xbmc/network/AirPlayServer.cpp +index 7388997..1ba7871 100644 +--- a/xbmc/network/AirPlayServer.cpp ++++ b/xbmc/network/AirPlayServer.cpp +@@ -184,7 +184,7 @@ void CAirPlayServer::StopServer(bool bWait) } } @@ -5079,10 +5187,11 @@ diff -Naur xbmc-1fef727/xbmc/network/AirPlayServer.cpp xbmc-1fef727.patch/xbmc/n { m_port = port; m_nonlocal = nonlocal; -diff -Naur xbmc-1fef727/xbmc/network/AirTunesServer.cpp xbmc-1fef727.patch/xbmc/network/AirTunesServer.cpp ---- xbmc-1fef727/xbmc/network/AirTunesServer.cpp 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/AirTunesServer.cpp 2012-02-07 14:30:18.058099358 +0100 -@@ -295,7 +295,7 @@ +diff --git a/xbmc/network/AirTunesServer.cpp b/xbmc/network/AirTunesServer.cpp +index f092bb4..8cafa8e 100644 +--- a/xbmc/network/AirTunesServer.cpp ++++ b/xbmc/network/AirTunesServer.cpp +@@ -292,7 +292,7 @@ void CAirTunesServer::StopServer(bool bWait) } } @@ -5091,30 +5200,10 @@ diff -Naur xbmc-1fef727/xbmc/network/AirTunesServer.cpp xbmc-1fef727.patch/xbmc/ { m_port = port; m_pLibShairport = new DllLibShairport(); -diff -Naur xbmc-1fef727/xbmc/network/libscrobbler/scrobbler.cpp xbmc-1fef727.patch/xbmc/network/libscrobbler/scrobbler.cpp ---- xbmc-1fef727/xbmc/network/libscrobbler/scrobbler.cpp 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/libscrobbler/scrobbler.cpp 2012-02-07 14:30:18.061099416 +0100 -@@ -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-1fef727/xbmc/network/Network.h xbmc-1fef727.patch/xbmc/network/Network.h ---- xbmc-1fef727/xbmc/network/Network.h 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/Network.h 2012-02-07 14:30:18.059099378 +0100 +diff --git a/xbmc/network/Network.h b/xbmc/network/Network.h +index cb0ea52..e514e05 100644 +--- a/xbmc/network/Network.h ++++ b/xbmc/network/Network.h @@ -24,6 +24,7 @@ #include @@ -5123,10 +5212,11 @@ diff -Naur xbmc-1fef727/xbmc/network/Network.h xbmc-1fef727.patch/xbmc/network/N 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-1fef727/xbmc/network/TCPServer.cpp xbmc-1fef727.patch/xbmc/network/TCPServer.cpp ---- xbmc-1fef727/xbmc/network/TCPServer.cpp 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/TCPServer.cpp 2012-02-07 14:30:18.059099378 +0100 -@@ -85,7 +85,7 @@ +diff --git a/xbmc/network/TCPServer.cpp b/xbmc/network/TCPServer.cpp +index 4b0d9ad..fd46236 100644 +--- a/xbmc/network/TCPServer.cpp ++++ b/xbmc/network/TCPServer.cpp +@@ -85,7 +85,7 @@ void CTCPServer::StopServer(bool bWait) } } @@ -5135,9 +5225,10 @@ diff -Naur xbmc-1fef727/xbmc/network/TCPServer.cpp xbmc-1fef727.patch/xbmc/netwo { m_port = port; m_nonlocal = nonlocal; -diff -Naur xbmc-1fef727/xbmc/network/UdpClient.cpp xbmc-1fef727.patch/xbmc/network/UdpClient.cpp ---- xbmc-1fef727/xbmc/network/UdpClient.cpp 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/UdpClient.cpp 2012-02-07 14:30:18.060099397 +0100 +diff --git a/xbmc/network/UdpClient.cpp b/xbmc/network/UdpClient.cpp +index 8e1ef2e..8f49ce8 100644 +--- a/xbmc/network/UdpClient.cpp ++++ b/xbmc/network/UdpClient.cpp @@ -35,7 +35,7 @@ #define UDPCLIENT_DEBUG_LEVEL LOGDEBUG @@ -5147,9 +5238,10 @@ diff -Naur xbmc-1fef727/xbmc/network/UdpClient.cpp xbmc-1fef727.patch/xbmc/netwo {} CUdpClient::~CUdpClient(void) -diff -Naur xbmc-1fef727/xbmc/network/UdpClient.h xbmc-1fef727.patch/xbmc/network/UdpClient.h ---- xbmc-1fef727/xbmc/network/UdpClient.h 2012-02-07 12:46:47.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/network/UdpClient.h 2012-02-07 14:30:18.060099397 +0100 +diff --git a/xbmc/network/UdpClient.h b/xbmc/network/UdpClient.h +index 97acb28..a1aa597 100644 +--- a/xbmc/network/UdpClient.h ++++ b/xbmc/network/UdpClient.h @@ -25,6 +25,7 @@ #include "threads/CriticalSection.h" #include @@ -5158,9 +5250,32 @@ diff -Naur xbmc-1fef727/xbmc/network/UdpClient.h xbmc-1fef727.patch/xbmc/network class CUdpClient : CThread { -diff -Naur xbmc-1fef727/xbmc/peripherals/Peripherals.cpp xbmc-1fef727.patch/xbmc/peripherals/Peripherals.cpp ---- xbmc-1fef727/xbmc/peripherals/Peripherals.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/peripherals/Peripherals.cpp 2012-02-07 14:30:18.062099436 +0100 +diff --git a/xbmc/network/libscrobbler/scrobbler.cpp b/xbmc/network/libscrobbler/scrobbler.cpp +index cb08d1b..cf5f927 100644 +--- a/xbmc/network/libscrobbler/scrobbler.cpp ++++ b/xbmc/network/libscrobbler/scrobbler.cpp +@@ -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 @@ void CScrobbler::Init() + ResetState(); + LoadCredentials(); + LoadJournal(); +- if (!ThreadHandle()) ++ if (!IsRunning()) + Create(); + } + +diff --git a/xbmc/peripherals/Peripherals.cpp b/xbmc/peripherals/Peripherals.cpp +index 3868cc7..ffd78d2 100644 +--- a/xbmc/peripherals/Peripherals.cpp ++++ b/xbmc/peripherals/Peripherals.cpp @@ -19,6 +19,7 @@ * */ @@ -5169,10 +5284,11 @@ diff -Naur xbmc-1fef727/xbmc/peripherals/Peripherals.cpp xbmc-1fef727.patch/xbmc #include "Peripherals.h" #include "bus/PeripheralBus.h" #include "devices/PeripheralBluetooth.h" -diff -Naur xbmc-1fef727/xbmc/pictures/GUIWindowSlideShow.cpp xbmc-1fef727.patch/xbmc/pictures/GUIWindowSlideShow.cpp ---- xbmc-1fef727/xbmc/pictures/GUIWindowSlideShow.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/pictures/GUIWindowSlideShow.cpp 2012-02-07 14:30:18.063099456 +0100 -@@ -67,7 +67,7 @@ +diff --git a/xbmc/pictures/GUIWindowSlideShow.cpp b/xbmc/pictures/GUIWindowSlideShow.cpp +index a762031..beb7d28 100644 +--- a/xbmc/pictures/GUIWindowSlideShow.cpp ++++ b/xbmc/pictures/GUIWindowSlideShow.cpp +@@ -67,7 +67,7 @@ using namespace XFILE; static float zoomamount[10] = { 1.0f, 1.2f, 1.5f, 2.0f, 2.8f, 4.0f, 6.0f, 9.0f, 13.5f, 20.0f }; @@ -5181,10 +5297,11 @@ diff -Naur xbmc-1fef727/xbmc/pictures/GUIWindowSlideShow.cpp xbmc-1fef727.patch/ { m_pCallback = NULL; m_isLoading = false; -diff -Naur xbmc-1fef727/xbmc/rendering/dx/RenderSystemDX.cpp xbmc-1fef727.patch/xbmc/rendering/dx/RenderSystemDX.cpp ---- xbmc-1fef727/xbmc/rendering/dx/RenderSystemDX.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/rendering/dx/RenderSystemDX.cpp 2012-02-07 14:30:18.064099476 +0100 -@@ -569,7 +569,7 @@ +diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp +index 938cb36..ed92a41 100644 +--- a/xbmc/rendering/dx/RenderSystemDX.cpp ++++ b/xbmc/rendering/dx/RenderSystemDX.cpp +@@ -569,7 +569,7 @@ bool CRenderSystemDX::PresentRenderImpl(const CDirtyRegionList &dirty) //CVideoReferenceClock polls GetRasterStatus too, //polling it from two threads at the same time is bad @@ -5193,10 +5310,11 @@ diff -Naur xbmc-1fef727/xbmc/rendering/dx/RenderSystemDX.cpp xbmc-1fef727.patch/ { //save current thread priority and set thread priority to THREAD_PRIORITY_TIME_CRITICAL int priority = GetThreadPriority(GetCurrentThread()); -diff -Naur xbmc-1fef727/xbmc/settings/GUISettings.cpp xbmc-1fef727.patch/xbmc/settings/GUISettings.cpp ---- xbmc-1fef727/xbmc/settings/GUISettings.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/settings/GUISettings.cpp 2012-02-07 14:30:18.065099496 +0100 -@@ -587,6 +587,10 @@ +diff --git a/xbmc/settings/GUISettings.cpp b/xbmc/settings/GUISettings.cpp +index 231c715..083947d 100644 +--- a/xbmc/settings/GUISettings.cpp ++++ b/xbmc/settings/GUISettings.cpp +@@ -592,6 +592,10 @@ void CGUISettings::Initialize() #ifdef HAVE_LIBVA AddBool(vp, "videoplayer.usevaapi", 13426, true); #endif @@ -5207,10 +5325,11 @@ diff -Naur xbmc-1fef727/xbmc/settings/GUISettings.cpp xbmc-1fef727.patch/xbmc/se #ifdef HAS_DX AddBool(g_sysinfo.IsVistaOrHigher() ? vp: NULL, "videoplayer.usedxva2", 13427, g_sysinfo.IsVistaOrHigher() ? true : false); #endif -diff -Naur xbmc-1fef727/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-1fef727.patch/xbmc/settings/GUIWindowSettingsCategory.cpp ---- xbmc-1fef727/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/settings/GUIWindowSettingsCategory.cpp 2012-02-07 14:30:18.067099534 +0100 -@@ -921,6 +921,15 @@ +diff --git a/xbmc/settings/GUIWindowSettingsCategory.cpp b/xbmc/settings/GUIWindowSettingsCategory.cpp +index dc26188..1a259a6 100644 +--- a/xbmc/settings/GUIWindowSettingsCategory.cpp ++++ b/xbmc/settings/GUIWindowSettingsCategory.cpp +@@ -936,6 +936,15 @@ void CGUIWindowSettingsCategory::UpdateSettings() pControl->SetEnabled(enabled); } } @@ -5226,9 +5345,799 @@ diff -Naur xbmc-1fef727/xbmc/settings/GUIWindowSettingsCategory.cpp xbmc-1fef727 else if (strSetting.Equals("weather.addonsettings")) { AddonPtr addon; -diff -Naur xbmc-1fef727/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp xbmc-1fef727.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp ---- xbmc-1fef727/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp 2012-02-07 14:30:18.070099594 +0100 +diff --git a/xbmc/threads/Thread.cpp b/xbmc/threads/Thread.cpp +index bd213e2..3e228df 100644 +--- a/xbmc/threads/Thread.cpp ++++ b/xbmc/threads/Thread.cpp +@@ -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 @@ CThread::CThread(const char* ThreadName) : m_StopEvent(true,true) + 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(IRunnable* pRunnable, const char* ThreadName) : m_StopEvent(tru + + 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 +- +- +- 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; +- } +- } ++ pThread->m_StartEvent.Set(); + +- 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->OnStartup(); ++ pThread->Process(); ++ pThread->OnExit(); + +- 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 during termination ++ CSingleLock lock(pThread->m_CriticalSection); ++ ++ pThread->m_ThreadId = 0; ++ pThread->m_TermEvent.Set(); ++ pThread->TermHandler(); + +- if ( pThread->IsAutoDelete() ) ++ lock.Leave(); ++ ++ 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 @@ void CThread::StopThread(bool bWait /*= true*/) + { + 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 @@ void CThread::Process() + 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() +-{ +-#ifdef _LINUX +- return pthread_self(); +-#else +- return ::GetCurrentThreadId(); +-#endif +-} +- +-bool CThread::IsCurrentThread(const ThreadIdentifier tid) ++CThread* CThread::GetCurrentThread() + { +-#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 @@ void CThread::Sleep(unsigned int milliseconds) + if(milliseconds > 10 && IsCurrentThread()) + m_StopEvent.WaitMSec(milliseconds); + else +- ::Sleep(milliseconds); ++ XbmcThreads::ThreadSleep(milliseconds); + } + + +diff --git a/xbmc/threads/Thread.h b/xbmc/threads/Thread.h +index 768d6f8..bebd9ee 100644 +--- a/xbmc/threads/Thread.h ++++ b/xbmc/threads/Thread.h +@@ -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 @@ public: + 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 @@ protected: + 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 @@ protected: + } + + 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 --git a/xbmc/threads/ThreadImpl.h b/xbmc/threads/ThreadImpl.h +new file mode 100644 +index 0000000..ad10e3b +--- /dev/null ++++ b/xbmc/threads/ThreadImpl.h +@@ -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 --git a/xbmc/threads/platform/ThreadImpl.cpp b/xbmc/threads/platform/ThreadImpl.cpp +new file mode 100644 +index 0000000..7f0213b +--- /dev/null ++++ b/xbmc/threads/platform/ThreadImpl.cpp +@@ -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 --git a/xbmc/threads/platform/ThreadImpl.h b/xbmc/threads/platform/ThreadImpl.h +new file mode 100644 +index 0000000..f37709e +--- /dev/null ++++ b/xbmc/threads/platform/ThreadImpl.h +@@ -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 --git a/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp b/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp +new file mode 100644 +index 0000000..7612fe7 +--- /dev/null ++++ b/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2005-2011 Team XBMC @@ -5277,9 +6186,11 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/darwin/ThreadSchedImpl.cpp xbmc-1f + policy = SCHED_RR; + result = pthread_setschedparam(ThreadId(), policy, ¶m ); +} -diff -Naur xbmc-1fef727/xbmc/threads/platform/linux/ThreadSchedImpl.cpp xbmc-1fef727.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp ---- xbmc-1fef727/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/linux/ThreadSchedImpl.cpp 2012-02-07 14:30:18.071099614 +0100 +diff --git a/xbmc/threads/platform/linux/ThreadSchedImpl.cpp b/xbmc/threads/platform/linux/ThreadSchedImpl.cpp +new file mode 100644 +index 0000000..034a100 +--- /dev/null ++++ b/xbmc/threads/platform/linux/ThreadSchedImpl.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2005-2011 Team XBMC @@ -5311,9 +6222,11 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/linux/ThreadSchedImpl.cpp xbmc-1fe +{ + return false; +} -diff -Naur xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.cpp xbmc-1fef727.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp ---- xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/pthreads/ThreadImpl.cpp 2012-02-07 14:30:18.072099634 +0100 +diff --git a/xbmc/threads/platform/pthreads/ThreadImpl.cpp b/xbmc/threads/platform/pthreads/ThreadImpl.cpp +new file mode 100644 +index 0000000..58b602c +--- /dev/null ++++ b/xbmc/threads/platform/pthreads/ThreadImpl.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2005-2011 Team XBMC @@ -5535,9 +6448,11 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.cpp xbmc-1fef7 + return time; +} + -diff -Naur xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-1fef727.patch/xbmc/threads/platform/pthreads/ThreadImpl.h ---- xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/pthreads/ThreadImpl.h 2012-02-07 14:30:18.072099634 +0100 +diff --git a/xbmc/threads/platform/pthreads/ThreadImpl.h b/xbmc/threads/platform/pthreads/ThreadImpl.h +new file mode 100644 +index 0000000..3f4dd39 +--- /dev/null ++++ b/xbmc/threads/platform/pthreads/ThreadImpl.h @@ -0,0 +1,39 @@ +/* +* Copyright (C) 2005-2011 Team XBMC @@ -5578,79 +6493,11 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/pthreads/ThreadImpl.h xbmc-1fef727 + inline static void ThreadSleep(unsigned int millis) { usleep(millis*1000); } +} + -diff -Naur xbmc-1fef727/xbmc/threads/platform/ThreadImpl.cpp xbmc-1fef727.patch/xbmc/threads/platform/ThreadImpl.cpp ---- xbmc-1fef727/xbmc/threads/platform/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/ThreadImpl.cpp 2012-02-07 14:30:18.070099594 +0100 -@@ -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-1fef727/xbmc/threads/platform/ThreadImpl.h xbmc-1fef727.patch/xbmc/threads/platform/ThreadImpl.h ---- xbmc-1fef727/xbmc/threads/platform/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/ThreadImpl.h 2012-02-07 14:30:18.070099594 +0100 -@@ -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-1fef727/xbmc/threads/platform/win/ThreadImpl.cpp xbmc-1fef727.patch/xbmc/threads/platform/win/ThreadImpl.cpp ---- xbmc-1fef727/xbmc/threads/platform/win/ThreadImpl.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/win/ThreadImpl.cpp 2012-02-07 14:30:18.072099634 +0100 +diff --git a/xbmc/threads/platform/win/ThreadImpl.cpp b/xbmc/threads/platform/win/ThreadImpl.cpp +new file mode 100644 +index 0000000..6650ee6 +--- /dev/null ++++ b/xbmc/threads/platform/win/ThreadImpl.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2005-2011 Team XBMC @@ -5859,9 +6706,11 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/win/ThreadImpl.cpp xbmc-1fef727.pa + return time; +} + -diff -Naur xbmc-1fef727/xbmc/threads/platform/win/ThreadImpl.h xbmc-1fef727.patch/xbmc/threads/platform/win/ThreadImpl.h ---- xbmc-1fef727/xbmc/threads/platform/win/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/platform/win/ThreadImpl.h 2012-02-07 14:30:18.073099654 +0100 +diff --git a/xbmc/threads/platform/win/ThreadImpl.h b/xbmc/threads/platform/win/ThreadImpl.h +new file mode 100644 +index 0000000..ea9a0db +--- /dev/null ++++ b/xbmc/threads/platform/win/ThreadImpl.h @@ -0,0 +1,40 @@ +/* +* Copyright (C) 2005-2011 Team XBMC @@ -5903,717 +6752,10 @@ diff -Naur xbmc-1fef727/xbmc/threads/platform/win/ThreadImpl.h xbmc-1fef727.patc + inline static void ThreadSleep(unsigned int millis) { Sleep(millis); } +} + -diff -Naur xbmc-1fef727/xbmc/threads/Thread.cpp xbmc-1fef727.patch/xbmc/threads/Thread.cpp ---- xbmc-1fef727/xbmc/threads/Thread.cpp 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/Thread.cpp 2012-02-07 14:30:18.068099554 +0100 -@@ -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-1fef727/xbmc/threads/Thread.h xbmc-1fef727.patch/xbmc/threads/Thread.h ---- xbmc-1fef727/xbmc/threads/Thread.h 2012-02-07 12:46:50.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/Thread.h 2012-02-07 14:30:18.069099574 +0100 -@@ -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-1fef727/xbmc/threads/ThreadImpl.h xbmc-1fef727.patch/xbmc/threads/ThreadImpl.h ---- xbmc-1fef727/xbmc/threads/ThreadImpl.h 1970-01-01 01:00:00.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/threads/ThreadImpl.h 2012-02-07 14:30:18.069099574 +0100 -@@ -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-1fef727/xbmc/utils/AlarmClock.cpp xbmc-1fef727.patch/xbmc/utils/AlarmClock.cpp ---- xbmc-1fef727/xbmc/utils/AlarmClock.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/AlarmClock.cpp 2012-02-07 14:30:18.073099654 +0100 +diff --git a/xbmc/utils/AlarmClock.cpp b/xbmc/utils/AlarmClock.cpp +index 09c9619..6ca327f 100644 +--- a/xbmc/utils/AlarmClock.cpp ++++ b/xbmc/utils/AlarmClock.cpp @@ -28,7 +28,7 @@ using namespace std; @@ -6623,9 +6765,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/AlarmClock.cpp xbmc-1fef727.patch/xbmc/utils/ { } -diff -Naur xbmc-1fef727/xbmc/utils/AsyncFileCopy.cpp xbmc-1fef727.patch/xbmc/utils/AsyncFileCopy.cpp ---- xbmc-1fef727/xbmc/utils/AsyncFileCopy.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/AsyncFileCopy.cpp 2012-02-07 14:30:18.074099674 +0100 +diff --git a/xbmc/utils/AsyncFileCopy.cpp b/xbmc/utils/AsyncFileCopy.cpp +index e9b7bc0..44e7043 100644 +--- a/xbmc/utils/AsyncFileCopy.cpp ++++ b/xbmc/utils/AsyncFileCopy.cpp @@ -26,7 +26,7 @@ #include "log.h" #include "utils/TimeUtils.h" @@ -6635,10 +6778,11 @@ diff -Naur xbmc-1fef727/xbmc/utils/AsyncFileCopy.cpp xbmc-1fef727.patch/xbmc/uti { m_cancelled = false; m_succeeded = false; -diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueue.cpp xbmc-1fef727.patch/xbmc/utils/DownloadQueue.cpp ---- xbmc-1fef727/xbmc/utils/DownloadQueue.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/DownloadQueue.cpp 2012-02-07 14:30:18.074099674 +0100 -@@ -32,7 +32,7 @@ +diff --git a/xbmc/utils/DownloadQueue.cpp b/xbmc/utils/DownloadQueue.cpp +index 4101090..0210241 100644 +--- a/xbmc/utils/DownloadQueue.cpp ++++ b/xbmc/utils/DownloadQueue.cpp +@@ -32,7 +32,7 @@ using namespace XFILE; WORD CDownloadQueue::m_wNextQueueId = 0; @@ -6647,9 +6791,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueue.cpp xbmc-1fef727.patch/xbmc/uti { m_bStop = false; m_wQueueId = m_wNextQueueId++; -diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueue.h xbmc-1fef727.patch/xbmc/utils/DownloadQueue.h ---- xbmc-1fef727/xbmc/utils/DownloadQueue.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/DownloadQueue.h 2012-02-07 14:30:18.075099693 +0100 +diff --git a/xbmc/utils/DownloadQueue.h b/xbmc/utils/DownloadQueue.h +index c314792..543a825 100644 +--- a/xbmc/utils/DownloadQueue.h ++++ b/xbmc/utils/DownloadQueue.h @@ -26,6 +26,8 @@ #include "threads/CriticalSection.h" #include "StdString.h" @@ -6659,9 +6804,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueue.h xbmc-1fef727.patch/xbmc/utils struct TICKET { TICKET(WORD aQueueId, DWORD aItemId) -diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueueManager.h xbmc-1fef727.patch/xbmc/utils/DownloadQueueManager.h ---- xbmc-1fef727/xbmc/utils/DownloadQueueManager.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/DownloadQueueManager.h 2012-02-07 14:30:18.075099693 +0100 +diff --git a/xbmc/utils/DownloadQueueManager.h b/xbmc/utils/DownloadQueueManager.h +index 3fb0d9f..9bda3ea 100644 +--- a/xbmc/utils/DownloadQueueManager.h ++++ b/xbmc/utils/DownloadQueueManager.h @@ -22,6 +22,7 @@ */ @@ -6670,9 +6816,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/DownloadQueueManager.h xbmc-1fef727.patch/xbm #define MAX_DOWNLOAD_QUEUES 3 -diff -Naur xbmc-1fef727/xbmc/utils/JobManager.cpp xbmc-1fef727.patch/xbmc/utils/JobManager.cpp ---- xbmc-1fef727/xbmc/utils/JobManager.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/JobManager.cpp 2012-02-07 14:30:18.076099712 +0100 +diff --git a/xbmc/utils/JobManager.cpp b/xbmc/utils/JobManager.cpp +index dd7b28d..07c9502 100644 +--- a/xbmc/utils/JobManager.cpp ++++ b/xbmc/utils/JobManager.cpp @@ -23,6 +23,9 @@ #include #include "threads/SingleLock.h" @@ -6683,10 +6830,11 @@ diff -Naur xbmc-1fef727/xbmc/utils/JobManager.cpp xbmc-1fef727.patch/xbmc/utils/ using namespace std; bool CJob::ShouldCancel(unsigned int progress, unsigned int total) const -diff -Naur xbmc-1fef727/xbmc/utils/LCD.h xbmc-1fef727.patch/xbmc/utils/LCD.h ---- xbmc-1fef727/xbmc/utils/LCD.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/LCD.h 2012-02-07 14:30:18.076099712 +0100 -@@ -68,8 +68,9 @@ +diff --git a/xbmc/utils/LCD.h b/xbmc/utils/LCD.h +index b60bcf2..888e5ac 100644 +--- a/xbmc/utils/LCD.h ++++ b/xbmc/utils/LCD.h +@@ -68,8 +68,9 @@ public: void LoadSkin(const CStdString &xmlFile); void Reset(); void Render(LCD_MODE mode); @@ -6698,10 +6846,11 @@ diff -Naur xbmc-1fef727/xbmc/utils/LCD.h xbmc-1fef727.patch/xbmc/utils/LCD.h protected: virtual void Process() = 0; void StringToLCDCharSet(CStdString& strText); -diff -Naur xbmc-1fef727/xbmc/utils/RssReader.cpp xbmc-1fef727.patch/xbmc/utils/RssReader.cpp ---- xbmc-1fef727/xbmc/utils/RssReader.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/RssReader.cpp 2012-02-07 14:30:18.077099732 +0100 -@@ -44,7 +44,7 @@ +diff --git a/xbmc/utils/RssReader.cpp b/xbmc/utils/RssReader.cpp +index 18fcdb4..fff6f5e 100644 +--- a/xbmc/utils/RssReader.cpp ++++ b/xbmc/utils/RssReader.cpp +@@ -44,7 +44,7 @@ using namespace XFILE; // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -6710,9 +6859,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/RssReader.cpp xbmc-1fef727.patch/xbmc/utils/R { m_pObserver = NULL; m_spacesBetweenFeeds = 0; -diff -Naur xbmc-1fef727/xbmc/utils/RssReader.h xbmc-1fef727.patch/xbmc/utils/RssReader.h ---- xbmc-1fef727/xbmc/utils/RssReader.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/RssReader.h 2012-02-07 14:30:18.077099732 +0100 +diff --git a/xbmc/utils/RssReader.h b/xbmc/utils/RssReader.h +index f94e2be..d202b37 100644 +--- a/xbmc/utils/RssReader.h ++++ b/xbmc/utils/RssReader.h @@ -39,6 +39,9 @@ #include "tinyXML/tinyxml.h" @@ -6723,9 +6873,10 @@ diff -Naur xbmc-1fef727/xbmc/utils/RssReader.h xbmc-1fef727.patch/xbmc/utils/Rss #define RSS_COLOR_BODY 0 #define RSS_COLOR_HEADLINE 1 #define RSS_COLOR_CHANNEL 2 -diff -Naur xbmc-1fef727/xbmc/utils/Splash.cpp xbmc-1fef727.patch/xbmc/utils/Splash.cpp ---- xbmc-1fef727/xbmc/utils/Splash.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/Splash.cpp 2012-02-07 14:30:18.078099752 +0100 +diff --git a/xbmc/utils/Splash.cpp b/xbmc/utils/Splash.cpp +index 58093b0..a53c90e 100644 +--- a/xbmc/utils/Splash.cpp ++++ b/xbmc/utils/Splash.cpp @@ -31,7 +31,7 @@ using namespace XFILE; @@ -6735,17 +6886,18 @@ diff -Naur xbmc-1fef727/xbmc/utils/Splash.cpp xbmc-1fef727.patch/xbmc/utils/Spla { m_ImageName = imageName; fade = 0.5; -@@ -139,5 +139,5 @@ +@@ -139,5 +139,5 @@ void CSplash::Stop() bool CSplash::IsRunning() { - return (m_ThreadHandle != NULL); + return (IsRunning()); } -diff -Naur xbmc-1fef727/xbmc/utils/TuxBoxUtil.cpp xbmc-1fef727.patch/xbmc/utils/TuxBoxUtil.cpp ---- xbmc-1fef727/xbmc/utils/TuxBoxUtil.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/utils/TuxBoxUtil.cpp 2012-02-07 14:30:18.079099772 +0100 -@@ -48,7 +48,7 @@ +diff --git a/xbmc/utils/TuxBoxUtil.cpp b/xbmc/utils/TuxBoxUtil.cpp +index c15b634..ab5a5ce 100644 +--- a/xbmc/utils/TuxBoxUtil.cpp ++++ b/xbmc/utils/TuxBoxUtil.cpp +@@ -48,7 +48,7 @@ using namespace std; CTuxBoxUtil g_tuxbox; CTuxBoxService g_tuxboxService; @@ -6754,10 +6906,11 @@ diff -Naur xbmc-1fef727/xbmc/utils/TuxBoxUtil.cpp xbmc-1fef727.patch/xbmc/utils/ { } CTuxBoxService::~CTuxBoxService() -diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp xbmc-1fef727.patch/xbmc/video/VideoInfoDownloader.cpp ---- xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/video/VideoInfoDownloader.cpp 2012-02-07 14:30:18.079099772 +0100 -@@ -116,7 +116,7 @@ +diff --git a/xbmc/video/VideoInfoDownloader.cpp b/xbmc/video/VideoInfoDownloader.cpp +index 3185d2b..5a46034 100644 +--- a/xbmc/video/VideoInfoDownloader.cpp ++++ b/xbmc/video/VideoInfoDownloader.cpp +@@ -116,7 +116,7 @@ int CVideoInfoDownloader::FindMovie(const CStdString &strMovie, m_state = FIND_MOVIE; m_strMovie = strMovie; m_found = 0; @@ -6766,7 +6919,7 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp xbmc-1fef727.patch/xb StopThread(); Create(); while (m_state != DO_NOTHING) -@@ -160,7 +160,7 @@ +@@ -160,7 +160,7 @@ bool CVideoInfoDownloader::GetDetails(const CScraperUrl &url, { // threaded version m_state = GET_DETAILS; m_found = 0; @@ -6775,7 +6928,7 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp xbmc-1fef727.patch/xb StopThread(); Create(); while (!m_found) -@@ -195,7 +195,7 @@ +@@ -195,7 +195,7 @@ bool CVideoInfoDownloader::GetEpisodeDetails(const CScraperUrl &url, { // threaded version m_state = GET_EPISODE_DETAILS; m_found = 0; @@ -6784,7 +6937,7 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp xbmc-1fef727.patch/xb StopThread(); Create(); while (!m_found) -@@ -230,7 +230,7 @@ +@@ -230,7 +230,7 @@ bool CVideoInfoDownloader::GetEpisodeList(const CScraperUrl& url, { // threaded version m_state = GET_EPISODE_LIST; m_found = 0; @@ -6793,10 +6946,11 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.cpp xbmc-1fef727.patch/xb StopThread(); Create(); while (!m_found) -diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.h xbmc-1fef727.patch/xbmc/video/VideoInfoDownloader.h ---- xbmc-1fef727/xbmc/video/VideoInfoDownloader.h 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/video/VideoInfoDownloader.h 2012-02-07 14:30:18.080099792 +0100 -@@ -42,7 +42,7 @@ +diff --git a/xbmc/video/VideoInfoDownloader.h b/xbmc/video/VideoInfoDownloader.h +index b91477d..8a05568 100644 +--- a/xbmc/video/VideoInfoDownloader.h ++++ b/xbmc/video/VideoInfoDownloader.h +@@ -42,7 +42,7 @@ typedef std::vector MOVIELIST; class CVideoInfoDownloader : public CThread { public: @@ -6805,10 +6959,11 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoDownloader.h xbmc-1fef727.patch/xbmc virtual ~CVideoInfoDownloader() {} // threaded lookup functions -diff -Naur xbmc-1fef727/xbmc/video/VideoInfoScanner.cpp xbmc-1fef727.patch/xbmc/video/VideoInfoScanner.cpp ---- xbmc-1fef727/xbmc/video/VideoInfoScanner.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/video/VideoInfoScanner.cpp 2012-02-07 14:30:18.081099811 +0100 -@@ -54,7 +54,7 @@ +diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp +index 1b680f3..f2f50e8 100644 +--- a/xbmc/video/VideoInfoScanner.cpp ++++ b/xbmc/video/VideoInfoScanner.cpp +@@ -54,7 +54,7 @@ using namespace ADDON; namespace VIDEO { @@ -6817,10 +6972,11 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoInfoScanner.cpp xbmc-1fef727.patch/xbmc/ { m_bRunning = false; m_pObserver = NULL; -diff -Naur xbmc-1fef727/xbmc/video/VideoReferenceClock.cpp xbmc-1fef727.patch/xbmc/video/VideoReferenceClock.cpp ---- xbmc-1fef727/xbmc/video/VideoReferenceClock.cpp 2012-02-07 12:46:48.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/video/VideoReferenceClock.cpp 2012-02-07 14:30:18.082099830 +0100 -@@ -107,7 +107,7 @@ +diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp +index ea72ee8..1c00b6b 100644 +--- a/xbmc/video/VideoReferenceClock.cpp ++++ b/xbmc/video/VideoReferenceClock.cpp +@@ -107,7 +107,7 @@ using namespace std; #endif @@ -6829,7 +6985,7 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoReferenceClock.cpp xbmc-1fef727.patch/xb { m_SystemFrequency = CurrentHostFrequency(); m_ClockSpeed = 1.0; -@@ -161,6 +161,8 @@ +@@ -161,6 +161,8 @@ void CVideoReferenceClock::Process() m_RefreshChanged = 0; m_Started.Set(); @@ -6838,10 +6994,11 @@ diff -Naur xbmc-1fef727/xbmc/video/VideoReferenceClock.cpp xbmc-1fef727.patch/xb if (SetupSuccess) { m_UseVblank = true; //tell other threads we're using vblank as clock -diff -Naur xbmc-1fef727/xbmc/win32/PlatformDefs.h xbmc-1fef727.patch/xbmc/win32/PlatformDefs.h ---- xbmc-1fef727/xbmc/win32/PlatformDefs.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/win32/PlatformDefs.h 2012-02-07 14:30:18.082099830 +0100 -@@ -33,7 +33,6 @@ +diff --git a/xbmc/win32/PlatformDefs.h b/xbmc/win32/PlatformDefs.h +index 57cab8f..74e3d53 100644 +--- a/xbmc/win32/PlatformDefs.h ++++ b/xbmc/win32/PlatformDefs.h +@@ -33,7 +33,6 @@ typedef __int64 off64_t; typedef __int64 fpos64_t; typedef __int64 __off64_t; typedef long __off_t; @@ -6849,10 +7006,11 @@ diff -Naur xbmc-1fef727/xbmc/win32/PlatformDefs.h xbmc-1fef727.patch/xbmc/win32/ #define ssize_t int -diff -Naur xbmc-1fef727/xbmc/win32/WindowHelper.cpp xbmc-1fef727.patch/xbmc/win32/WindowHelper.cpp ---- xbmc-1fef727/xbmc/win32/WindowHelper.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/win32/WindowHelper.cpp 2012-02-07 14:30:18.083099850 +0100 -@@ -28,7 +28,7 @@ +diff --git a/xbmc/win32/WindowHelper.cpp b/xbmc/win32/WindowHelper.cpp +index 56856ac..8aa7da9 100644 +--- a/xbmc/win32/WindowHelper.cpp ++++ b/xbmc/win32/WindowHelper.cpp +@@ -28,7 +28,7 @@ using namespace std; CWHelper g_windowHelper; @@ -6861,9 +7019,10 @@ diff -Naur xbmc-1fef727/xbmc/win32/WindowHelper.cpp xbmc-1fef727.patch/xbmc/win3 { m_hwnd = NULL; m_hProcess = NULL; -diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/xbmc/windowing/X11/WinSystemX11.cpp ---- xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/windowing/X11/WinSystemX11.cpp 2012-02-07 14:30:43.758606503 +0100 +diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp +index 201b0ad..c686e6e 100644 +--- a/xbmc/windowing/X11/WinSystemX11.cpp ++++ b/xbmc/windowing/X11/WinSystemX11.cpp @@ -35,6 +35,8 @@ #include #include "cores/VideoRenderers/RenderManager.h" @@ -6873,7 +7032,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/x #if defined(HAS_XRANDR) #include -@@ -52,6 +54,7 @@ +@@ -52,6 +54,7 @@ CWinSystemX11::CWinSystemX11() : CWinSystemBase() m_wmWindow = 0; m_bWasFullScreenBeforeMinimize = false; m_dpyLostTime = 0; @@ -6881,7 +7040,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/x XSetErrorHandler(XErrorHandler); } -@@ -178,6 +181,45 @@ +@@ -178,6 +181,45 @@ bool CWinSystemX11::ResizeWindow(int newWidth, int newHeight, int newLeft, int n return false; } @@ -6927,7 +7086,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/x bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool blankOtherDisplays) { m_nWidth = res.iWidth; -@@ -193,13 +235,32 @@ +@@ -193,13 +235,32 @@ bool CWinSystemX11::SetFullScreen(bool fullScreen, RESOLUTION_INFO& res, bool bl mode.hz = res.fRefreshRate; mode.id = res.strId; @@ -6963,7 +7122,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/x #endif int options = SDL_OPENGL; -@@ -493,6 +554,7 @@ +@@ -493,6 +554,7 @@ void CWinSystemX11::CheckDisplayEvents() if (bGotEvent || bTimeout) { CLog::Log(LOGDEBUG, "%s - notify display reset event", __FUNCTION__); @@ -6971,9 +7130,10 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.cpp xbmc-1fef727.patch/x CSingleLock lock(m_resourceSection); -diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.h xbmc-1fef727.patch/xbmc/windowing/X11/WinSystemX11.h ---- xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.h 2012-02-07 12:46:51.000000000 +0100 -+++ xbmc-1fef727.patch/xbmc/windowing/X11/WinSystemX11.h 2012-02-07 14:30:18.085099890 +0100 +diff --git a/xbmc/windowing/X11/WinSystemX11.h b/xbmc/windowing/X11/WinSystemX11.h +index a77c4d5..dcc63ff 100644 +--- a/xbmc/windowing/X11/WinSystemX11.h ++++ b/xbmc/windowing/X11/WinSystemX11.h @@ -27,6 +27,7 @@ #include "utils/Stopwatch.h" #include @@ -6982,7 +7142,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.h xbmc-1fef727.patch/xbm class IDispResource; -@@ -60,6 +61,7 @@ +@@ -60,6 +61,7 @@ public: // Local to WinSystemX11 only Display* GetDisplay() { return m_dpy; } GLXWindow GetWindow() { return m_glWindow; } @@ -6990,7 +7150,7 @@ diff -Naur xbmc-1fef727/xbmc/windowing/X11/WinSystemX11.h xbmc-1fef727.patch/xbm protected: bool RefreshGlxContext(); -@@ -76,6 +78,9 @@ +@@ -76,6 +78,9 @@ protected: CCriticalSection m_resourceSection; std::vector m_resources; uint64_t m_dpyLostTime;