Browse Source

Add patches against libvlc

Felix Paul Kühne 12 years ago
parent
commit
a2937ec21a

+ 69 - 0
patches/0001-arm_neon-added-function-macro-to-handle-the-undersco.patch

@@ -0,0 +1,69 @@
+From d93255b9e7c661f953e446dfb1f4f63aeb48d192 Mon Sep 17 00:00:00 2001
+From: David Geldreich <david.geldreich@free.fr>
+Date: Fri, 20 Apr 2012 16:41:19 +0200
+Subject: [PATCH 01/10] arm_neon: added function macro to handle the
+ underscore prefix for the iOS ARM ABI
+
+---
+ modules/arm_neon/asm.S | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 49 insertions(+)
+ create mode 100644 modules/arm_neon/asm.S
+
+diff --git a/modules/arm_neon/asm.S b/modules/arm_neon/asm.S
+new file mode 100644
+index 0000000..d853255
+--- /dev/null
++++ b/modules/arm_neon/asm.S
+@@ -0,0 +1,49 @@
++@*****************************************************************************
++@ asm.S : defines and macros
++@*****************************************************************************
++@ Copyright (C) 2012 David Geldreich <david.geldreich at free.fr>
++@
++@ 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 of the License, 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 this program; if not, write to the Free Software Foundation,
++@ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
++@****************************************************************************/
++
++#ifdef __APPLE__
++#   define EXTERN_ASM _
++#else
++#   define EXTERN_ASM
++#endif
++
++#ifdef __ELF__
++#   define ELF
++#else
++#   define ELF @
++#endif
++
++.macro  function name, export=0
++    .macro endfunc
++ELF     .size   \name, . - \name
++        .endfunc
++        .purgem endfunc
++    .endm
++        .text
++        .align          2
++    .if \export
++        .global EXTERN_ASM\name
++EXTERN_ASM\name:
++    .endif
++ELF     .type   \name, %function
++        .func   \name
++\name:
++.endm
++
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 208 - 0
patches/0002-arm_neon-use-a-macro-to-fix-compilation-for-iOS.patch

@@ -0,0 +1,208 @@
+From f14f3ae2e751adf56485a18ef9953c9936af6991 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Fri, 10 Aug 2012 16:01:49 +0200
+Subject: [PATCH 02/10] arm_neon: use a macro to fix compilation for iOS
+
+---
+ modules/arm_neon/amplify.S              |  9 +++---
+ modules/arm_neon/simple_channel_mixer.S | 57 +++++++++++++++------------------
+ 2 files changed, 31 insertions(+), 35 deletions(-)
+
+diff --git a/modules/arm_neon/amplify.S b/modules/arm_neon/amplify.S
+index 5938118..578f972 100644
+--- a/modules/arm_neon/amplify.S
++++ b/modules/arm_neon/amplify.S
+@@ -18,6 +18,8 @@
+  @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+  @****************************************************************************/
+ 
++#include "asm.S"
++
+ 	.syntax	unified
+ 	.arm
+ 	.fpu	neon
+@@ -26,10 +28,8 @@
+ #define	DST	r0
+ #define	SRC	r1
+ #define	SIZE	r2
+-	.align 2
+-	.global amplify_float_arm_neon
+-	.type	amplify_float_arm_neon, %function
+-amplify_float_arm_neon:
++
++function amplify_float_arm_neon, export=1
+ 	cmp		SIZE,	#0
+ 	bxeq		lr
+ #ifdef __ARM_PCS
+@@ -79,3 +79,4 @@ amplify_float_arm_neon:
+ 4:	vst1.f32	{d20-d21},	[DST,:128]!
+ 5:	vst1.f32	{d16-d17},	[DST,:128]!
+ 	bx		lr
++endfunc
+diff --git a/modules/arm_neon/simple_channel_mixer.S b/modules/arm_neon/simple_channel_mixer.S
+index dcc51ed..4722be4 100644
+--- a/modules/arm_neon/simple_channel_mixer.S
++++ b/modules/arm_neon/simple_channel_mixer.S
+@@ -19,6 +19,8 @@
+  @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+  @****************************************************************************/
+ 
++#include "asm.S"
++
+ 	.fpu neon
+ 	.text
+ 	.align 2
+@@ -34,9 +36,8 @@ coeff_7to2:
+ 	.float 0.5
+ 	.float 0.25
+ 	.float 0.25
+-	.global convert_7to2_neon_asm
+-	.type	convert_7to2_neon_asm, %function
+-convert_7to2_neon_asm:
++
++function convert_7to2_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_7to2
+@@ -63,16 +64,15 @@ convert_7to2_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_5to2:
+ 	.float 0.5
+ 	.float 0.5
+ 	.float 0.33
+ 	.float 0.33
+-	.global convert_5to2_neon_asm
+-	.type	convert_5to2_neon_asm, %function
+-convert_5to2_neon_asm:
++
++function convert_5to2_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_5to2
+@@ -95,14 +95,13 @@ convert_5to2_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_4to2:
+ 	.float 0.5
+ 	.float 0.5
+-	.global convert_4to2_neon_asm
+-	.type	convert_4to2_neon_asm, %function
+-convert_4to2_neon_asm:
++
++function convert_4to2_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_4to2
+@@ -119,14 +118,13 @@ convert_4to2_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_3to2:
+ 	.float 0.5
+ 	.float 0.5
+-	.global convert_3to2_neon_asm
+-	.type	convert_3to2_neon_asm, %function
+-convert_3to2_neon_asm:
++
++function convert_3to2_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_3to2
+@@ -147,16 +145,15 @@ convert_3to2_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_7to1:
+ 	.float 0.25
+ 	.float 0.25
+ 	.float 0.125
+ 	.float 0.125
+-	.global convert_7to1_neon_asm
+-	.type	convert_7to1_neon_asm, %function
+-convert_7to1_neon_asm:
++
++function convert_7to1_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_7to1
+@@ -181,16 +178,15 @@ convert_7to1_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_5to1:
+ 	.float 0.25
+ 	.float 0.25
+ 	.float 0.16666667
+ 	.float 0.16666667
+-	.global convert_5to1_neon_asm
+-	.type	convert_5to1_neon_asm, %function
+-convert_5to1_neon_asm:
++
++function convert_5to1_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_5to1
+@@ -212,16 +208,15 @@ convert_5to1_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_7to4:
+ 	.float 0.5
+ 	.float 0.5
+ 	.float 0.16666667
+ 	.float 0.16666667
+-	.global convert_7to4_neon_asm
+-	.type	convert_7to4_neon_asm, %function
+-convert_7to4_neon_asm:
++
++function convert_7to4_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_7to4
+@@ -247,14 +242,13 @@ convert_7to4_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
+-
++endfunc
+ 
+ coeff_5to4:
+ 	.float 0.5
+ 	.float 0.5
+-	.global convert_5to4_neon_asm
+-	.type	convert_5to4_neon_asm, %function
+-convert_5to4_neon_asm:
++
++function convert_5to4_neon_asm, export=1
+ 	push {r4,lr}
+ 
+ 	adr COEFF, coeff_5to4
+@@ -277,3 +271,4 @@ convert_5to4_neon_asm:
+ 	bne 0b
+ 
+ 	pop {r4,pc}
++endfunc
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 86 - 0
patches/0003-deinterlace-merge-use-a-macro-to-fix-compilation-for.patch

@@ -0,0 +1,86 @@
+From 84731850fde69dba7626c5e833cec838b7407677 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Fri, 10 Aug 2012 16:02:07 +0200
+Subject: [PATCH 03/10] deinterlace/merge: use a macro to fix compilation for
+ iOS
+
+---
+ modules/video_filter/deinterlace/merge_arm.S | 26 ++++++++++----------------
+ 1 file changed, 10 insertions(+), 16 deletions(-)
+
+diff --git a/modules/video_filter/deinterlace/merge_arm.S b/modules/video_filter/deinterlace/merge_arm.S
+index dd77902..03e5042 100644
+--- a/modules/video_filter/deinterlace/merge_arm.S
++++ b/modules/video_filter/deinterlace/merge_arm.S
+@@ -18,6 +18,8 @@
+  @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+  @****************************************************************************/
+ 
++#include "../../arm_neon/asm.S"
++
+ 	.syntax	unified
+ 	.arm
+ 	.arch	armv6
+@@ -29,11 +31,8 @@
+ #define	SRC2	r2
+ #define	SIZE	r3
+ 
+-	.align 2
+-	.global merge8_arm_neon
+-	.type	merge8_arm_neon, %function
+ 	@ NOTE: Offset and pitch must be multiple of 16-bytes in VLC.
+-merge8_arm_neon:
++function merge8_arm_neon, export=1
+ 	cmp		SIZE,	#64
+ 	blo		2f
+ 1:
+@@ -70,11 +69,9 @@ merge8_arm_neon:
+ 	vhadd.u8	q0,	q0,	q8
+ 	vst1.u8		{q0},		[DEST,:128]!
+ 	bx		lr
++endfunc
+ 
+-	.align 2
+-	.global merge16_arm_neon
+-	.type	merge16_arm_neon, %function
+-merge16_arm_neon:
++function merge16_arm_neon, export=1
+ 	cmp		SIZE,	#64
+ 	blo		2f
+ 1:
+@@ -111,11 +108,9 @@ merge16_arm_neon:
+ 	vhadd.u16	q0,	q0,	q8
+ 	vst1.u16	{q0},		[DEST,:128]!
+ 	bx		lr
++endfunc
+ 
+-	.align 2
+-	.global merge8_armv6
+-	.type	merge8_armv6, %function
+-merge8_armv6:
++function merge8_armv6, export=1
+ 	push		{r4-r9,lr}
+ 1:
+ 	pld		[SRC1, #64]
+@@ -133,11 +128,9 @@ merge8_armv6:
+ 	stm		DEST!,	{r6-r7}
+ 	popeq		{r4-r9,pc}
+ 	b		1b
++endfunc
+ 
+-	.align 2
+-	.global merge16_armv6
+-	.type	merge16_armv6, %function
+-merge16_armv6:
++function merge16_armv6, export=1
+ 	push		{r4-r9,lr}
+ 1:
+ 	pld		[SRC1, #64]
+@@ -155,3 +148,4 @@ merge16_armv6:
+ 	stm		DEST!,	{r6-r7}
+ 	popeq		{r4-r9,pc}
+ 	b		1b
++endfunc
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 24 - 0
patches/0004-deinterlace-added-a-hack-to-work-around-a-libtool-bu.patch

@@ -0,0 +1,24 @@
+From b75f05262d588dd6d7c9a43cfa7f6cc910ebc062 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Fri, 10 Aug 2012 16:02:33 +0200
+Subject: [PATCH 04/10] deinterlace: added a hack to work-around a libtool bug
+
+---
+ modules/video_filter/Modules.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/modules/video_filter/Modules.am b/modules/video_filter/Modules.am
+index 7e500f1..d44908e 100644
+--- a/modules/video_filter/Modules.am
++++ b/modules/video_filter/Modules.am
+@@ -1,3 +1,7 @@
++# When using a specific AS tool instead of gcc libtool goes mad
++# without this. (This is the case with iOS).
++LIBTOOL=@LIBTOOL@ --tag=CC
++
+ SOURCES_mosaic = mosaic.c mosaic.h
+ SOURCES_transform = transform.c
+ SOURCES_invert = invert.c
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 51 - 0
patches/0005-contrib-ebml-mkv-compile-with-hidden-symbols-on-iOS.patch

@@ -0,0 +1,51 @@
+From d2660459eea1c67a1aa243c7ff86bcc887b9ff34 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Sat, 11 Aug 2012 13:29:25 +0200
+Subject: [PATCH 05/10] contrib/ebml+mkv: compile with hidden symbols on iOS
+
+---
+ contrib/src/ebml/rules.mak     | 6 ++++--
+ contrib/src/matroska/rules.mak | 6 +++++-
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/contrib/src/ebml/rules.mak b/contrib/src/ebml/rules.mak
+index 3708b33..f4f01c7 100644
+--- a/contrib/src/ebml/rules.mak
++++ b/contrib/src/ebml/rules.mak
+@@ -16,8 +16,10 @@ libebml: libebml-$(EBML_VERSION).tar.bz2 .sum-ebml
+ 	$(MOVE)
+ 
+ # libebml requires exceptions
+-EBML_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fexceptions" \
+-					CPPFLAGS=""
++EBML_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fexceptions" CPPFLAGS=""
++ifdef HAVE_IOS
++EBML_EXTRA_FLAGS += " -fvisibility=hidden"
++endif
+ 
+ .ebml: libebml
+ ifdef HAVE_WIN32
+diff --git a/contrib/src/matroska/rules.mak b/contrib/src/matroska/rules.mak
+index 62ecf0d..cfd6a2e 100644
+--- a/contrib/src/matroska/rules.mak
++++ b/contrib/src/matroska/rules.mak
+@@ -18,11 +18,15 @@ libmatroska: libmatroska-$(MATROSKA_VERSION).tar.bz2 .sum-matroska
+ 	$(APPLY) $(SRC)/matroska/no-ansi.patch
+ 	$(MOVE)
+ 
++ifdef HAVE_IOS
++MATROSKA_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fvisibility=hidden"
++endif
++
+ .matroska: libmatroska
+ ifdef HAVE_WIN32
+ 	cd $< && $(MAKE) -C make/mingw32 prefix="$(PREFIX)" $(HOSTVARS) SHARED=no EBML_DLL=no libmatroska.a
+ else
+-	cd $< && $(MAKE) -C make/linux prefix="$(PREFIX)" $(HOSTVARS) staticlib
++	cd $< && $(MAKE) -C make/linux prefix="$(PREFIX)" $(HOSTVARS) $(MATROSKA_EXTRA_FLAGS) staticlib
+ endif
+ 	cd $< && $(MAKE) -C make/linux install_staticlib install_headers prefix="$(PREFIX)" $(HOSTVARS)
+ 	$(RANLIB) "$(PREFIX)/lib/libmatroska.a"
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 29 - 0
patches/0006-contrib-ebml-fix-CXXFLAG-visibility-hack.patch

@@ -0,0 +1,29 @@
+From 4dc4c72304446e736a0e209f2fcc180331bb724a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Thu, 13 Sep 2012 01:36:39 +0200
+Subject: [PATCH 06/10] contrib/ebml: fix CXXFLAG visibility hack
+
+---
+ contrib/src/ebml/rules.mak | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/contrib/src/ebml/rules.mak b/contrib/src/ebml/rules.mak
+index f4f01c7..862553c 100644
+--- a/contrib/src/ebml/rules.mak
++++ b/contrib/src/ebml/rules.mak
+@@ -16,9 +16,10 @@ libebml: libebml-$(EBML_VERSION).tar.bz2 .sum-ebml
+ 	$(MOVE)
+ 
+ # libebml requires exceptions
+-EBML_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fexceptions" CPPFLAGS=""
+ ifdef HAVE_IOS
+-EBML_EXTRA_FLAGS += " -fvisibility=hidden"
++EBML_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fexceptions -fvisibility=hidden" CPPFLAGS=""
++else
++EBML_EXTRA_FLAGS = CXXFLAGS="${CXXFLAGS} -fexceptions" CPPFLAGS=""
+ endif
+ 
+ .ebml: libebml
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 48 - 0
patches/0007-vout_ios-respond-to-HUD-visiblity-changes-by-adaptin.patch

@@ -0,0 +1,48 @@
+From 55bf6943338a9d6c9e7bf9e381ee18eea3b8566a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Wed, 26 Sep 2012 19:23:24 +0200
+Subject: [PATCH 07/10] vout_ios: respond to HUD visiblity changes by adapting
+ the layout accordingly
+
+---
+ modules/video_output/ios.m | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
+index b513911..53c8216 100644
+--- a/modules/video_output/ios.m
++++ b/modules/video_output/ios.m
+@@ -344,12 +344,15 @@ static void OpenglSwap(vlc_gl_t *gl)
+         _framebufferDirty = NO;
+ 
+         [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
++
++        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleHUDmode:) name:@"VLCHUDModeChanged" object:nil];
+     }
+     return self;
+ }
+ 
+ - (void) dealloc
+ {
++    [[NSNotificationCenter defaultCenter] removeObserver:self];
+     [_context release];
+     [super dealloc];
+ }
+@@ -365,6 +368,14 @@ static void OpenglSwap(vlc_gl_t *gl)
+     }
+ }
+ 
++/**
++ * gets called when the status bar resizes
++ */
++- (void)toggleHUDmode:(NSNotification *)aNotification
++{
++    [self layoutSubviews];
++}
++
+ 
+ /**
+  * Method called by UIKit when we have been resized
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 36 - 0
patches/0008-posix-thread-add-a-hack-to-work-around-crashes-when-.patch

@@ -0,0 +1,36 @@
+From 5fd96f258ad64fb72618207acc231c458865f7cc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Thu, 18 Oct 2012 18:38:17 +0200
+Subject: [PATCH 08/10] posix/thread: add a hack to work-around crashes when
+ using the buggy iOS 6 runtime
+
+---
+ src/posix/thread.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/src/posix/thread.c b/src/posix/thread.c
+index 514f592..6a95bb0 100644
+--- a/src/posix/thread.c
++++ b/src/posix/thread.c
+@@ -355,6 +355,18 @@ void vlc_cond_init_daytime (vlc_cond_t *p_condvar)
+ void vlc_cond_destroy (vlc_cond_t *p_condvar)
+ {
+     int val = pthread_cond_destroy( p_condvar );
++
++#ifdef __APPLE__
++    if (val != 0) {
++        printf("pthread_cond_destroy returned %i\n", val);
++
++        if (val == EBUSY) {
++            printf("this is a EBUSY!\n");
++            return;
++        }
++    }
++#endif
++
+     VLC_THREAD_ASSERT ("destroying condition");
+ }
+ 
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 573 - 0
patches/0009-new-OpenGL-ES2-video-output-module-for-iOS.patch

@@ -0,0 +1,574 @@
+From 57c4882b2ea519e1857a69c382ed892b904b7d03 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Mon, 18 Feb 2013 20:18:01 -0800
+Subject: [PATCH 09/10] new OpenGL ES2 video output module for iOS
+
+partially derived from the Mac vout code
+---
+ configure.ac                    |  12 +
+ extras/package/ios/build.sh     |   1 +
+ modules/video_output/Modules.am |   1 +
+ modules/video_output/ios2.m     | 504 ++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 518 insertions(+)
+ create mode 100644 modules/video_output/ios2.m
+
+diff --git a/configure.ac b/configure.ac
+index c9666e5..b36390e 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -3171,6 +3171,18 @@ then
+ fi
+ 
+ dnl
++dnl  iOS ES2 vout module
++dnl
++AC_ARG_ENABLE(ios-vout2,
++  [  --enable-ios-vout2    iOS video output module (default disabled)])
++if test "${enable_ios_vout2}" = "yes"
++then
++  VLC_ADD_PLUGIN([vout_ios2])
++  VLC_ADD_LIBS([vout_ios2], [-Wl,-framework,OpenGLES,-framework,QuartzCore,-framework,UIKit])
++fi
++
++
++dnl
+ dnl  Windows DirectX module
+ dnl
+ 
+diff --git a/extras/package/ios/build.sh b/extras/package/ios/build.sh
+index 3b26155..d666ec6 100755
+--- a/extras/package/ios/build.sh
++++ b/extras/package/ios/build.sh
+@@ -264,6 +264,7 @@ ${VLCROOT}/configure \
+     --disable-macosx-vlc-app \
+     --enable-audioqueue \
+     --enable-ios-vout \
++    --enable-ios-vout2 \
+     --disable-shared \
+     --disable-macosx-quartztext \
+     --enable-avcodec \
+diff --git a/modules/video_output/Modules.am b/modules/video_output/Modules.am
+index aa05454..40be7e7 100644
+--- a/modules/video_output/Modules.am
++++ b/modules/video_output/Modules.am
+@@ -8,6 +8,7 @@ SOURCES_vmem = vmem.c
+ SOURCES_yuv = yuv.c
+ SOURCES_vout_macosx = macosx.m opengl.h opengl.c
+ SOURCES_vout_ios = ios.m opengl.h opengl.c
++SOURCES_vout_ios2 = ios2.m opengl.h opengl.c
+ SOURCES_android_surface = androidsurface.c
+ 
+ if HAVE_DECKLINK
+diff --git a/modules/video_output/ios2.m b/modules/video_output/ios2.m
+new file mode 100644
+index 0000000..9238055
+--- /dev/null
++++ b/modules/video_output/ios2.m
+@@ -0,0 +1,504 @@
++/*****************************************************************************
++ * ios2.m: iOS OpenGL ES 2 provider
++ *****************************************************************************
++ * Copyright (C) 2001-2013 VLC authors and VideoLAN
++ * $Id$
++ *
++ * Authors: Derk-Jan Hartman <hartman at videolan dot org>
++ *          Eric Petit <titer@m0k.org>
++ *          Benjamin Pracht <bigben at videolan dot org>
++ *          Damien Fouilleul <damienf at videolan dot org>
++ *          Pierre d'Herbemont <pdherbemont at videolan dot org>
++ *          Felix Paul Kühne <fkuehne at videolan dot org>
++ *          David Fuhrmann <david dot fuhrmann at googlemail dot com>
++ *          Rémi Denis-Courmont
++ *          Juho Vähä-Herttua <juhovh at iki dot fi>
++ *          Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Lesser General Public License as published by
++ * the Free Software Foundation; either version 2.1 of the License, or
++ * (at your option) any later version.
++ *
++ * 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 Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
++ *****************************************************************************/
++
++/*****************************************************************************
++ * Preamble
++ *****************************************************************************/
++
++#import <UIKit/UIKit.h>
++#import <OpenGLES/EAGL.h>
++#import <OpenGLES/ES2/gl.h>
++#import <QuartzCore/QuartzCore.h>
++#import <dlfcn.h>
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <vlc_common.h>
++#include <vlc_plugin.h>
++#include <vlc_vout_display.h>
++#include <vlc_opengl.h>
++#include <vlc_dialog.h>
++#include "opengl.h"
++
++/**
++ * Forward declarations
++ */
++static int Open (vlc_object_t *);
++static void Close (vlc_object_t *);
++
++static picture_pool_t* PicturePool(vout_display_t *vd, unsigned requested_count);
++static void PictureRender(vout_display_t* vd, picture_t *pic, subpicture_t *subpicture);
++static void PictureDisplay(vout_display_t* vd, picture_t *pic, subpicture_t *subpicture);
++static int Control(vout_display_t* vd, int query, va_list ap);
++
++static void *OurGetProcAddress(vlc_gl_t *, const char *);
++
++static int OpenglESClean(vlc_gl_t* gl);
++static void OpenglESSwap(vlc_gl_t* gl);
++
++/**
++ * Module declaration
++ */
++vlc_module_begin ()
++    set_shortname ("iOS vout")
++    set_description (N_("iOS OpenGL video output"))
++    set_category (CAT_VIDEO)
++    set_subcategory (SUBCAT_VIDEO_VOUT)
++    set_capability ("vout display", 300)
++    set_callbacks (Open, Close)
++
++    add_shortcut ("vout_ios2")
++vlc_module_end ()
++
++@interface VLCOpenGLES2VideoView : UIView
++{
++    vout_display_t *_voutDisplay;
++    EAGLContext *_eaglContext;
++    GLuint _renderBuffer;
++    GLuint _frameBuffer;
++
++    BOOL _bufferNeedReset;
++}
++@property (readwrite) vout_display_t* voutDisplay;
++@property (readonly) EAGLContext* eaglContext;
++
++- (void)createBuffers;
++- (void)destroyBuffers;
++- (void)resetBuffers;
++
++@end
++
++
++struct vout_display_sys_t
++{
++    VLCOpenGLES2VideoView *glESView;
++    UIView* viewContainer;
++
++    vlc_gl_t gl;
++    vout_display_opengl_t *vgl;
++
++    picture_pool_t *picturePool;
++    picture_t *current;
++    bool has_first_frame;
++
++    vout_display_place_t place;
++};
++
++
++static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
++{
++    VLC_UNUSED(gl);
++
++    return dlsym(RTLD_DEFAULT, name);
++}
++
++static int Open(vlc_object_t *this)
++{
++    vout_display_t *vd = (vout_display_t *)this;
++    vout_display_sys_t *sys = calloc (1, sizeof(*sys));
++    NSAutoreleasePool *autoreleasePool = nil;
++
++    if (!sys)
++        return VLC_ENOMEM;
++
++    vd->sys = sys;
++    sys->picturePool = NULL;
++    sys->gl.sys = NULL;
++
++    autoreleasePool = [[NSAutoreleasePool alloc] init];
++
++    /* get the object we will draw into */
++    UIView* viewContainer = var_CreateGetAddress (vd, "drawable-nsobject");
++    if (!viewContainer || ![viewContainer isKindOfClass:[UIView class]])
++        goto bailout;
++
++    vout_display_DeleteWindow (vd, NULL);
++
++    /* This will be released in Close(), on
++     * main thread, after we are done using it. */
++    sys->viewContainer = [viewContainer retain];
++
++    /* setup the actual OpenGL ES view */
++    sys->glESView = [[VLCOpenGLES2VideoView alloc] initWithFrame:[viewContainer bounds]];
++
++    if (!sys->glESView)
++        goto bailout;
++
++    [sys->glESView setVoutDisplay:vd];
++
++    [sys->viewContainer performSelectorOnMainThread:@selector(addSubview:) withObject:sys->glESView waitUntilDone:YES];
++
++    /* Initialize common OpenGL video display */
++    sys->gl.lock = OpenglESClean;
++    sys->gl.unlock = nil;
++    sys->gl.swap = OpenglESSwap;
++    sys->gl.getProcAddress = OurGetProcAddress;
++    sys->gl.sys = sys;
++    const vlc_fourcc_t *subpicture_chromas;
++    video_format_t fmt = vd->fmt;
++
++    sys->vgl = vout_display_opengl_New (&vd->fmt, &subpicture_chromas, &sys->gl);
++    if (!sys->vgl) {
++        sys->gl.sys = NULL;
++        goto bailout;
++    }
++
++    /* */
++    vout_display_info_t info = vd->info;
++    info.has_pictures_invalid = false;
++    info.has_event_thread = true;
++    info.subpicture_chromas = subpicture_chromas;
++
++    /* Setup vout_display_t once everything is fine */
++    vd->info = info;
++
++    vd->pool = PicturePool;
++    vd->prepare = PictureRender;
++    vd->display = PictureDisplay;
++    vd->control = Control;
++
++    /* */
++    [sys->glESView performSelectorOnMainThread:@selector(reshape) withObject:nil waitUntilDone:YES];
++
++    [autoreleasePool release];
++    return VLC_SUCCESS;
++
++bailout:
++    [autoreleasePool release];
++    Close(this);
++    return VLC_EGENERIC;
++}
++
++void Close (vlc_object_t *this)
++{
++    vout_display_t *vd = (vout_display_t *)this;
++    vout_display_sys_t *sys = vd->sys;
++
++    [sys->glESView setVoutDisplay:nil];
++
++    var_Destroy (vd, "drawable-nsobject");
++    [sys->viewContainer performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
++    [sys->glESView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO];
++
++    if (sys->gl.sys != NULL) {
++        msg_Dbg(this, "deleting display");
++        vout_display_opengl_Delete(sys->vgl);
++    }
++
++    [sys->glESView release];
++
++    free(sys);
++}
++
++/*****************************************************************************
++ * vout display callbacks
++ *****************************************************************************/
++
++static int Control(vout_display_t *vd, int query, va_list ap)
++{
++    vout_display_sys_t *sys = vd->sys;
++
++    switch (query)
++    {
++        case VOUT_DISPLAY_CHANGE_FULLSCREEN:
++        case VOUT_DISPLAY_CHANGE_WINDOW_STATE:
++        case VOUT_DISPLAY_HIDE_MOUSE:
++            return VLC_SUCCESS;
++        case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
++        case VOUT_DISPLAY_CHANGE_ZOOM:
++        case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
++        case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
++        case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
++        {
++            if (!vd->sys)
++                return VLC_EGENERIC;
++
++            NSAutoreleasePool * autoreleasePool = [[NSAutoreleasePool alloc] init];
++
++            const vout_display_cfg_t *cfg;
++            const video_format_t *source;
++            bool is_forced = false;
++
++            if (query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT || query == VOUT_DISPLAY_CHANGE_SOURCE_CROP) {
++                source = (const video_format_t *)va_arg(ap, const video_format_t *);
++                cfg = vd->cfg;
++            } else {
++                source = &vd->source;
++                cfg = (const vout_display_cfg_t*)va_arg(ap, const vout_display_cfg_t *);
++                if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
++                    is_forced = (bool)va_arg(ap, int);
++            }
++
++            if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE && is_forced
++                && (cfg->display.width != vd->cfg->display.width
++                    || cfg->display.height != vd->cfg->display.height))
++                return VLC_EGENERIC;
++
++            /* we always use our current frame here, because we have some size constraints
++             in the ui vout provider */
++            vout_display_cfg_t cfg_tmp = *cfg;
++            CGRect bounds;
++            bounds = [sys->glESView bounds];
++
++            /* on HiDPI displays, the point bounds don't equal the actual pixel based bounds */
++            CGFloat scaleFactor = sys->glESView.contentScaleFactor;
++            cfg_tmp.display.width = bounds.size.width * scaleFactor;
++            cfg_tmp.display.height = bounds.size.height * scaleFactor;
++
++            vout_display_place_t place;
++            vout_display_PlacePicture(&place, source, &cfg_tmp, false);
++            @synchronized (sys->glESView) {
++                sys->place = place;
++            }
++
++            /* For resize, we call glViewport in reshape and not here.
++             This has the positive side effect that we avoid erratic sizing as we animate every resize. */
++            if (query != VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
++                // x / y are top left corner, but we need the lower left one
++                glViewport(place.x, cfg_tmp.display.height - (place.y + place.height), place.width, place.height);
++
++            [autoreleasePool release];
++            return VLC_SUCCESS;
++        }
++
++        case VOUT_DISPLAY_GET_OPENGL:
++        {
++            vlc_gl_t **gl = va_arg(ap, vlc_gl_t **);
++            *gl = &sys->gl;
++            return VLC_SUCCESS;
++        }
++
++        case VOUT_DISPLAY_RESET_PICTURES:
++            assert (0);
++        default:
++            msg_Err(vd, "Unknown request %i in iOS ES 2 vout display", query);
++            return VLC_EGENERIC;
++    }
++}
++
++static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
++{
++    sys->has_first_frame = true;
++
++    vout_display_sys_t *sys = vd->sys;
++    vout_display_opengl_Display(sys->vgl, &vd->source);
++
++    picture_Release(pic);
++
++    if (subpicture)
++        subpicture_Delete(subpicture);
++}
++
++static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
++{
++
++    vout_display_sys_t *sys = vd->sys;
++
++    vout_display_opengl_Prepare(sys->vgl, pic, subpicture);
++}
++
++static picture_pool_t *PicturePool(vout_display_t *vd, unsigned requested_count)
++{
++    vout_display_sys_t *sys = vd->sys;
++
++    if (!sys->picturePool)
++        sys->picturePool = vout_display_opengl_GetPool(sys->vgl, requested_count);
++    assert(sys->picturePool);
++    return sys->picturePool;
++}
++
++/*****************************************************************************
++ * vout opengl callbacks
++ *****************************************************************************/
++static int OpenglESClean(vlc_gl_t *gl)
++{
++    vout_display_sys_t *sys = (vout_display_sys_t *)gl->sys;
++    [sys->glESView resetBuffers];
++    return 0;
++}
++
++static void OpenglESSwap(vlc_gl_t *gl)
++{
++    vout_display_sys_t *sys = (vout_display_sys_t *)gl->sys;
++    [[sys->glESView eaglContext] presentRenderbuffer:GL_RENDERBUFFER];
++}
++
++/*****************************************************************************
++ * Our UIView object
++ *****************************************************************************/
++@implementation VLCOpenGLES2VideoView
++@synthesize voutDisplay = _voutDisplay, eaglContext = _eaglContext;
++
++{
++    return [CAEAGLLayer class];
++}
++
++- (id)initWithFrame:(CGRect)frame
++{
++    self = [super initWithFrame:frame]; // perform selector on main thread?
++
++    if (!self)
++        return nil;
++
++    CAEAGLLayer * layer = (CAEAGLLayer *)self.layer;
++    layer.drawableProperties = [NSDictionary dictionaryWithObject:kEAGLColorFormatRGBA8 forKey: kEAGLDrawablePropertyColorFormat];
++    layer.opaque = YES;
++
++    _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
++    if (!_eaglContext)
++        return nil;
++    [EAGLContext setCurrentContext:_eaglContext];
++
++    [self performSelectorOnMainThread:@selector(createBuffers) withObject:nil waitUntilDone:YES];
++    [self performSelectorOnMainThread:@selector(reshape) withObject:nil waitUntilDone:NO];
++    [self setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
++
++    return self;
++}
++
++- (void)dealloc
++{
++    [_eaglContext release];
++    [super dealloc];
++}
++
++/* we don't get the correct scale factor if we don't overwrite this method */
++- (void)drawRect:(CGRect) rect
++{
++    [super drawRect:rect];
++}
++
++- (void)createBuffers
++{
++    /* make sure the current context is us */
++    [EAGLContext setCurrentContext:_eaglContext];
++
++    /* create render buffer */
++    glGenRenderbuffers(1, &_renderBuffer);
++    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);
++
++    /* create frame buffer */
++    glGenFramebuffers(1, &_frameBuffer);
++    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
++
++    /* allocate storage for the pixels we are going to to draw to */
++    [_eaglContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(id<EAGLDrawable>)self.layer];
++
++    /* bind render buffer to frame buffer */
++    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);
++
++    /* make sure that our shape is ok */
++    [self performSelectorOnMainThread:@selector(reshape) withObject:nil waitUntilDone:NO];
++}
++
++- (void)destroyBuffers
++{
++    /* re-set current context */
++    [EAGLContext setCurrentContext:_eaglContext];
++
++    /* clear frame buffer */
++    glDeleteFramebuffers(1, &_frameBuffer);
++    _frameBuffer = 0;
++
++    /* clear render buffer */
++    glDeleteRenderbuffers(1, &_renderBuffer);
++    _renderBuffer = 0;
++}
++
++- (void)resetBuffers
++{
++    if (_bufferNeedReset) {
++        NSLog(@"actually resetting buffers");
++        [self destroyBuffers];
++        [self createBuffers];
++        _bufferNeedReset = NO;
++    }
++}
++
++- (void)layoutSubviews
++{
++    NSLog(@"layoutSubviews");
++    /* this method is called as soon as we are resized.
++     * so set a variable to re-create our buffers on the next clean event */
++    _bufferNeedReset = YES;
++}
++
++/**
++ * Method called by Cocoa when the view is resized.
++ */
++- (void)reshape
++{
++    assert([[NSThread currentThread] isMainThread]);
++
++    CGRect bounds;
++    bounds = [self bounds];
++
++    vout_display_place_t place;
++
++    @synchronized(self) {
++        if (_voutDisplay) {
++            vout_display_cfg_t cfg_tmp = *(_voutDisplay->cfg);
++            CGFloat scaleFactor = self.contentScaleFactor;
++
++            cfg_tmp.display.width  = bounds.size.width * scaleFactor;
++            cfg_tmp.display.height = bounds.size.height * scaleFactor;
++
++            vout_display_PlacePicture(&place, &_voutDisplay->source, &cfg_tmp, false);
++            _voutDisplay->sys->place = place;
++            vout_display_SendEventDisplaySize(_voutDisplay, bounds.size.width * scaleFactor, bounds.size.height * scaleFactor, _voutDisplay->cfg->is_fullscreen);
++        }
++    }
++
++    // x / y are top left corner, but we need the lower left one
++    glViewport(place.x, place.y, place.width, place.height);
++}
++
++- (void)updateConstraints
++{
++    [self reshape];
++    [super updateConstraints];
++}
++
++- (BOOL)isOpaque
++{
++    return YES;
++}
++
++- (BOOL)acceptsFirstResponder
++{
++    return YES;
++}
++
++@end
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 68 - 0
patches/0010-extras-.-ios-compilation-fix.patch

@@ -0,0 +1,68 @@
+From ddc3391e6423dbad343595f367ba0da6a5c641eb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Wed, 27 Feb 2013 20:58:35 +0100
+Subject: [PATCH 10/10] extras/.../ios: compilation fix
+
+---
+ configure.ac                | 7 +++----
+ extras/package/ios/build.sh | 2 +-
+ modules/access/Modules.am   | 2 +-
+ 3 files changed, 5 insertions(+), 6 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index b36390e..0b76b1e 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1885,13 +1885,12 @@ AC_ARG_ENABLE(screen,
+     [disable screen capture (default enabled)])])
+ if test "${enable_screen}" != "no"; then
+   if test "${SYS}" = "darwin"; then
+-    AC_CHECK_HEADERS(OpenGL/gl.h, [
+-      AC_CHECK_HEADERS(ApplicationServices/ApplicationServices.h, [
+-        VLC_ADD_PLUGIN([screen])
+-      ])
++    AC_CHECK_HEADERS(ApplicationServices/ApplicationServices.h, [
++      VLC_ADD_PLUGIN([screen])
+     ])
+   fi
+ fi
++AM_CONDITIONAL(HAVE_MAC_SCREEN, [test "${SYS}" = "darwin" -a "x${enable_screen}" != "xno"])
+ 
+ dnl
+ dnl  Real RTSP plugin
+diff --git a/extras/package/ios/build.sh b/extras/package/ios/build.sh
+index d666ec6..0d4d7c7 100755
+--- a/extras/package/ios/build.sh
++++ b/extras/package/ios/build.sh
+@@ -199,7 +199,6 @@ fi
+     --disable-caca \
+     --disable-gettext \
+     --disable-mpcdec \
+-    --disable-screen \
+     --disable-upnp \
+     --disable-gme \
+     --disable-tremor \
+@@ -320,6 +319,7 @@ ${VLCROOT}/configure \
+     --enable-speex \
+     --enable-theora \
+     --enable-flac \
++    --disable-screen \
+     --disable-freetype \
+     --disable-taglib \
+     --disable-mmx > ${out} # MMX and SSE support requires llvm which is broken on Simulator
+diff --git a/modules/access/Modules.am b/modules/access/Modules.am
+index d4bfa25..bc9cfae 100644
+--- a/modules/access/Modules.am
++++ b/modules/access/Modules.am
+@@ -180,7 +180,7 @@ libscreen_plugin_la_SOURCES += screen/win32.c
+ libscreen_plugin_la_LIBADD += -lgdi32
+ libvlc_LTLIBRARIES += libscreen_plugin.la
+ endif
+-if HAVE_DARWIN
++if HAVE_MAC_SCREEN
+ libscreen_plugin_la_SOURCES += screen/mac.c
+ libscreen_plugin_la_LDFLAGS = $(AM_LDFLAGS)
+ libscreen_plugin_la_LDFLAGS += "-Wl,-framework,OpenGL,-framework,ApplicationServices"
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 27 - 0
patches/0011-vout_ios2-compilation-fix.patch

@@ -0,0 +1,27 @@
+From 87a7999f1fa4583627721751433d85b045fd539a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Wed, 27 Feb 2013 21:17:03 +0100
+Subject: [PATCH 11/11] vout_ios2: compilation fix
+
+---
+ modules/video_output/ios2.m | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/modules/video_output/ios2.m b/modules/video_output/ios2.m
+index 9238055..a18f8f2 100644
+--- a/modules/video_output/ios2.m
++++ b/modules/video_output/ios2.m
+@@ -309,9 +309,8 @@ static int Control(vout_display_t *vd, int query, va_list ap)
+ 
+ static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
+ {
+-    sys->has_first_frame = true;
+-
+     vout_display_sys_t *sys = vd->sys;
++    sys->has_first_frame = true;
+     vout_display_opengl_Display(sys->vgl, &vd->source);
+ 
+     picture_Release(pic);
+-- 
+1.7.12.4 (Apple Git-37)
+

+ 27 - 0
patches/obslider/0001-fixed-logic-error.patch

@@ -0,0 +1,27 @@
+From bd47a2dcbdbe4402675b4250911417dd7860338b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
+Date: Fri, 19 Oct 2012 13:12:57 +0200
+Subject: [PATCH] fixed logic error
+
+---
+ OBSlider/OBSlider.m |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/OBSlider/OBSlider.m b/OBSlider/OBSlider.m
+index f4d1586..53d880a 100644
+--- a/OBSlider/OBSlider.m
++++ b/OBSlider/OBSlider.m
+@@ -127,8 +127,8 @@
+          
+         CGRect trackRect = [self trackRectForBounds:self.bounds];
+         realPositionValue = realPositionValue + (self.maximumValue - self.minimumValue) * (trackingOffset / trackRect.size.width);
+-        if ( (self.beganTrackingLocation.y < currentLocation.y) && (currentLocation.y < previousLocation.y) ||
+-             (self.beganTrackingLocation.y > currentLocation.y) && (currentLocation.y > previousLocation.y) )
++        if ( ((self.beganTrackingLocation.y < currentLocation.y) && (currentLocation.y < previousLocation.y)) ||
++             ((self.beganTrackingLocation.y > currentLocation.y) && (currentLocation.y > previousLocation.y)) )
+             {
+             // We are getting closer to the slider, go closer to the real location
+             self.value = self.value + self.scrubbingSpeed * (self.maximumValue - self.minimumValue) * (trackingOffset / trackRect.size.width) + (realPositionValue - self.value) / ( 1 + fabsf(currentLocation.y - self.beganTrackingLocation.y));
+-- 
+1.7.10.2 (Apple Git-33)
+