[Android] use android_window vout starting gingerbread
Thomas Guillem
git at videolan.org
Sat Nov 15 12:42:01 CET 2014
vlc-ports/android | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Nov 14 17:10:27 2014 +0100| [309e575750ba50dfe83661c4609aeeb24b776121] | committer: Jean-Baptiste Kempf
use android_window vout starting gingerbread
This vout always use subtitle surface.
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc-ports/android.git/?a=commit;h=309e575750ba50dfe83661c4609aeeb24b776121
---
libvlc/jni/libvlcjni.c | 8 +++++---
libvlc/src/org/videolan/libvlc/LibVLC.java | 10 ++++++++++
vlc-android/res/layout-land/player_remote_control.xml | 3 +--
vlc-android/res/layout/player.xml | 5 ++---
vlc-android/res/layout/player_remote.xml | 5 ++---
vlc-android/res/layout/player_remote_control.xml | 5 ++---
.../org/videolan/vlc/gui/video/VideoPlayerActivity.java | 12 ++++--------
7 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/libvlc/jni/libvlcjni.c b/libvlc/jni/libvlcjni.c
index 1ab151c..6b28667 100644
--- a/libvlc/jni/libvlcjni.c
+++ b/libvlc/jni/libvlcjni.c
@@ -42,6 +42,7 @@
#define VOUT_ANDROID_SURFACE 0
#define VOUT_OPENGLES2 1
+#define VOUT_ANDROID_WINDOW 2
#define LOG_TAG "VLC/JNI/main"
#include "log.h"
@@ -258,7 +259,7 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
bool use_opensles = (*env)->CallIntMethod(env, thiz, methodId) == AOUT_OPENSLES;
methodId = (*env)->GetMethodID(env, cls, "getVout", "()I");
- bool use_opengles2 = (*env)->CallIntMethod(env, thiz, methodId) == VOUT_OPENGLES2;
+ int vout = (*env)->CallIntMethod(env, thiz, methodId);
methodId = (*env)->GetMethodID(env, cls, "timeStretchingEnabled", "()Z");
bool enable_time_stretch = (*env)->CallBooleanMethod(env, thiz, methodId);
@@ -300,7 +301,7 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
bool direct_rendering = (*env)->CallBooleanMethod(env, thiz, methodId);
/* With the MediaCodec opaque mode we cannot use the OpenGL ES vout. */
if (direct_rendering)
- use_opengles2 = false;
+ vout = VOUT_ANDROID_WINDOW;
methodId = (*env)->GetMethodID(env, cls, "getCachePath", "()Ljava/lang/String;");
jstring cachePath = (*env)->CallObjectMethod(env, thiz, methodId);
@@ -334,7 +335,8 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
use_opensles ? "--aout=opensles" : "--aout=android_audiotrack",
/* Android video API is a mess */
- use_opengles2 ? "--vout=gles2" : "--vout=androidsurface",
+ vout == VOUT_ANDROID_WINDOW ? "--vout=androidwindow" :
+ (vout == VOUT_OPENGLES2 ? "--vout=gles2" : "--vout=androidsurface"),
"--androidsurface-chroma", chromastr != NULL && chromastr[0] != 0 ? chromastr : "RV32",
/* XXX: we can't recover from direct rendering failure */
direct_rendering ? "" : "--no-mediacodec-dr",
diff --git a/libvlc/src/org/videolan/libvlc/LibVLC.java b/libvlc/src/org/videolan/libvlc/LibVLC.java
index 1e31ca1..ce9a568 100644
--- a/libvlc/src/org/videolan/libvlc/LibVLC.java
+++ b/libvlc/src/org/videolan/libvlc/LibVLC.java
@@ -37,6 +37,7 @@ public class LibVLC {
public static final int VOUT_ANDROID_SURFACE = 0;
public static final int VOUT_OPEGLES2 = 1;
+ public static final int VOUT_ANDROID_WINDOW = 2;
public static final int HW_ACCELERATION_AUTOMATIC = -1;
public static final int HW_ACCELERATION_DISABLED = 0;
@@ -56,6 +57,7 @@ public class LibVLC {
public static final int INPUT_NAV_RIGHT = 4;
private static final String DEFAULT_CODEC_LIST = "mediacodec,iomx,all";
+ private static final boolean HAS_WINDOW_VOUT = LibVlcUtil.isGingerbreadOrLater();
private static LibVLC sInstance;
@@ -343,6 +345,8 @@ public class LibVLC {
}
public boolean isDirectRendering() {
+ if (!HAS_WINDOW_VOUT)
+ return false;
if (devHardwareDecoder != DEV_HW_DECODER_AUTOMATIC) {
return (this.devHardwareDecoder == DEV_HW_DECODER_OMX_DR ||
this.devHardwareDecoder == DEV_HW_DECODER_MEDIACODEC_DR);
@@ -407,6 +411,12 @@ public class LibVLC {
this.vout = VOUT_ANDROID_SURFACE;
else
this.vout = vout;
+ if (this.vout == VOUT_ANDROID_SURFACE && HAS_WINDOW_VOUT)
+ this.vout = VOUT_ANDROID_WINDOW;
+ }
+
+ public boolean useCompatSurface() {
+ return this.vout != VOUT_ANDROID_WINDOW;
}
public boolean timeStretchingEnabled() {
diff --git a/vlc-android/res/layout-land/player_remote_control.xml b/vlc-android/res/layout-land/player_remote_control.xml
index 91a762c..bc527b8 100644
--- a/vlc-android/res/layout-land/player_remote_control.xml
+++ b/vlc-android/res/layout-land/player_remote_control.xml
@@ -28,8 +28,7 @@
<SurfaceView
android:id="@+id/subtitles_surface"
android:layout_width="1dp"
- android:layout_height="1dp"
- android:visibility="invisible" />
+ android:layout_height="1dp" />
</FrameLayout>
</FrameLayout>
diff --git a/vlc-android/res/layout/player.xml b/vlc-android/res/layout/player.xml
index 0c279d3..6442575 100644
--- a/vlc-android/res/layout/player.xml
+++ b/vlc-android/res/layout/player.xml
@@ -26,8 +26,7 @@
<SurfaceView
android:id="@+id/subtitles_surface"
android:layout_width="1dp"
- android:layout_height="1dp"
- android:visibility="invisible" />
+ android:layout_height="1dp" />
</FrameLayout>
</FrameLayout>
@@ -205,4 +204,4 @@
</RelativeLayout>
</RelativeLayout>
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/vlc-android/res/layout/player_remote.xml b/vlc-android/res/layout/player_remote.xml
index 3ae2744..545594e 100644
--- a/vlc-android/res/layout/player_remote.xml
+++ b/vlc-android/res/layout/player_remote.xml
@@ -28,8 +28,7 @@
<SurfaceView
android:id="@+id/remote_subtitles_surface"
android:layout_width="1dp"
- android:layout_height="1dp"
- android:visibility="invisible" />
+ android:layout_height="1dp" />
</FrameLayout>
</FrameLayout>
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/vlc-android/res/layout/player_remote_control.xml b/vlc-android/res/layout/player_remote_control.xml
index 95d0570..28ce4e4 100644
--- a/vlc-android/res/layout/player_remote_control.xml
+++ b/vlc-android/res/layout/player_remote_control.xml
@@ -28,8 +28,7 @@
<SurfaceView
android:id="@+id/subtitles_surface"
android:layout_width="1dp"
- android:layout_height="1dp"
- android:visibility="invisible" />
+ android:layout_height="1dp" />
</FrameLayout>
</FrameLayout>
@@ -232,4 +231,4 @@
</RelativeLayout>
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
index eb7448e..d485298 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
@@ -393,6 +393,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
mSubtitlesSurfaceView.setZOrderMediaOverlay(true);
mSubtitlesSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
+ if (mLibVLC.useCompatSurface())
+ mSubtitlesSurfaceView.setVisibility(View.GONE);
if (mPresentation == null) {
mSurfaceHolder.addCallback(mSurfaceCallback);
mSubtitlesSurfaceHolder.addCallback(mSubtitlesSurfaceCallback);
@@ -430,9 +432,6 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
"Hardware acceleration mode: "
+ Integer.toString(mLibVLC.getHardwareAcceleration()));
- /* Only show the subtitles surface when using "Full Acceleration" mode */
- if (mLibVLC.isDirectRendering())
- mSubtitlesSurfaceView.setVisibility(View.VISIBLE);
// Signal to LibVLC that the videoPlayerActivity was created, thus the
// SurfaceView is now available for MediaCodec direct rendering.
mLibVLC.eventVideoPlayerActivityCreated(true);
@@ -1206,7 +1205,6 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
mDisabledHardwareAcceleration = true;
mPreviousHardwareAccelerationMode = mLibVLC.getHardwareAcceleration();
mLibVLC.setHardwareAcceleration(LibVLC.HW_ACCELERATION_DISABLED);
- mSubtitlesSurfaceView.setVisibility(View.INVISIBLE);
loadMedia();
}
})
@@ -2533,10 +2531,8 @@ public class VideoPlayerActivity extends Activity implements IVideoPlayer {
mSubtitlesSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);
mSubtitlesSurfaceHolder.addCallback(activity.mSubtitlesSurfaceCallback);
- /* Only show the subtitles surface when using "Full Acceleration" mode */
- if (mLibVLC != null && mLibVLC.isDirectRendering())
- mSubtitlesSurfaceView.setVisibility(View.VISIBLE);
-
+ if (mLibVLC.useCompatSurface())
+ mSubtitlesSurfaceView.setVisibility(View.GONE);
Log.i(TAG, "Secondary display created");
}
}
More information about the Android
mailing list