[Android] [RFC PATCH 1/2] LibVLC: factorize getMediaOptions
Thomas Guillem
thomas.guillem at gmail.com
Tue Oct 7 15:30:59 CEST 2014
Use the same function from C and Java to get the media options.
---
vlc-android/jni/libvlcjni.c | 51 ++++++++++------------
vlc-android/src/org/videolan/libvlc/LibVLC.java | 26 +++++++++++
vlc-android/src/org/videolan/libvlc/MediaList.java | 25 ++---------
3 files changed, 51 insertions(+), 51 deletions(-)
diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index df49f6e..1e2d7d6 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -56,6 +56,18 @@
#define NO_IOMX_DR ""
#endif
+static void add_media_options(libvlc_media_t *p_md, JNIEnv *env, jobjectArray mediaOptions)
+{
+ int stringCount = (*env)->GetArrayLength(env, mediaOptions);
+ for(int i = 0; i < stringCount; i++)
+ {
+ jstring option = (jstring)(*env)->GetObjectArrayElement(env, mediaOptions, i);
+ const char* p_st = (*env)->GetStringUTFChars(env, option, 0);
+ libvlc_media_add_option(p_md, p_st); // option
+ (*env)->ReleaseStringUTFChars(env, option, p_st);
+ }
+}
+
libvlc_media_t *new_media(jlong instance, JNIEnv *env, jobject thiz, jstring fileLocation, bool noOmx, bool noVideo)
{
libvlc_instance_t *libvlc = (libvlc_instance_t*)(intptr_t)instance;
@@ -66,26 +78,16 @@ libvlc_media_t *new_media(jlong instance, JNIEnv *env, jobject thiz, jstring fil
if (!p_md)
return NULL;
- if (!noOmx) {
- jclass cls = (*env)->GetObjectClass(env, thiz);
- jmethodID methodId = (*env)->GetMethodID(env, cls, "getHardwareAcceleration", "()I");
- int hardwareAcceleration = (*env)->CallIntMethod(env, thiz, methodId);
- if (hardwareAcceleration == HW_ACCELERATION_DECODING || hardwareAcceleration == HW_ACCELERATION_FULL) {
- /*
- * Set higher caching values if using iomx decoding, since some omx
- * decoders have a very high latency, and if the preroll data isn't
- * enough to make the decoder output a frame, the playback timing gets
- * started too soon, and every decoded frame appears to be too late.
- * On Nexus One, the decoder latency seems to be 25 input packets
- * for 320x170 H.264, a few packets less on higher resolutions.
- * On Nexus S, the decoder latency seems to be about 7 packets.
- */
- libvlc_media_add_option(p_md, ":file-caching=1500");
- libvlc_media_add_option(p_md, ":network-caching=1500");
- libvlc_media_add_option(p_md, ":codec=mediacodec,iomx,all");
+ jclass cls = (*env)->GetObjectClass(env, thiz);
+ jmethodID methodId = (*env)->GetMethodID(env, cls, "getMediaOptions", "(ZZ)[Ljava/lang/String;");
+ if (methodId != NULL)
+ {
+ jobjectArray mediaOptions = (*env)->CallObjectMethod(env, thiz, methodId, noOmx, noVideo);
+ if (mediaOptions != NULL)
+ {
+ add_media_options(p_md, env, mediaOptions);
+ (*env)->DeleteLocalRef(env, mediaOptions);
}
- if (noVideo)
- libvlc_media_add_option(p_md, ":no-video");
}
return p_md;
}
@@ -417,16 +419,7 @@ void Java_org_videolan_libvlc_LibVLC_playMRL(JNIEnv *env, jobject thiz, jlong in
libvlc_media_t* p_md = libvlc_media_new_location((libvlc_instance_t*)(intptr_t)instance, p_mrl);
/* media options */
if (mediaOptions != NULL)
- {
- int stringCount = (*env)->GetArrayLength(env, mediaOptions);
- for(int i = 0; i < stringCount; i++)
- {
- jstring option = (jstring)(*env)->GetObjectArrayElement(env, mediaOptions, i);
- const char* p_st = (*env)->GetStringUTFChars(env, option, 0);
- libvlc_media_add_option(p_md, p_st); // option
- (*env)->ReleaseStringUTFChars(env, option, p_st);
- }
- }
+ add_media_options(p_md, env, mediaOptions);
(*env)->ReleaseStringUTFChars(env, mrl, p_mrl);
diff --git a/vlc-android/src/org/videolan/libvlc/LibVLC.java b/vlc-android/src/org/videolan/libvlc/LibVLC.java
index 8023e53..6d9d3e9 100644
--- a/vlc-android/src/org/videolan/libvlc/LibVLC.java
+++ b/vlc-android/src/org/videolan/libvlc/LibVLC.java
@@ -256,6 +256,32 @@ public class LibVLC {
this.hardwareAcceleration = hardwareAcceleration;
}
+ public String[] getMediaOptions(boolean noHardwareAcceleration, boolean noVideo) {
+ if (!noHardwareAcceleration)
+ noHardwareAcceleration = getHardwareAcceleration() == HW_ACCELERATION_DISABLED;
+
+ ArrayList<String> options = new ArrayList<String>();
+
+ if (!noHardwareAcceleration) {
+ /*
+ * Set higher caching values if using iomx decoding, since some omx
+ * decoders have a very high latency, and if the preroll data isn't
+ * enough to make the decoder output a frame, the playback timing gets
+ * started too soon, and every decoded frame appears to be too late.
+ * On Nexus One, the decoder latency seems to be 25 input packets
+ * for 320x170 H.264, a few packets less on higher resolutions.
+ * On Nexus S, the decoder latency seems to be about 7 packets.
+ */
+ options.add(":file-caching=1500");
+ options.add(":network-caching=1500");
+ options.add(":codec=mediacodec,iomx,all");
+ }
+ if (noVideo)
+ options.add(":no-video");
+
+ return options.toArray(new String[options.size()]);
+ }
+
public String getSubtitlesEncoding() {
return subtitlesEncoding;
}
diff --git a/vlc-android/src/org/videolan/libvlc/MediaList.java b/vlc-android/src/org/videolan/libvlc/MediaList.java
index 85b2d2a..666568e 100644
--- a/vlc-android/src/org/videolan/libvlc/MediaList.java
+++ b/vlc-android/src/org/videolan/libvlc/MediaList.java
@@ -198,34 +198,15 @@ public class MediaList {
}
public String[] getMediaOptions(int position) {
- boolean noHardwareAcceleration = mLibVLC.getHardwareAcceleration() == 0;
+ boolean noHardwareAcceleration = false;
boolean noVideo = false;
if (isValid(position))
{
- if (!noHardwareAcceleration)
- noHardwareAcceleration = mInternalList.get(position).noHardwareAcceleration;
+ noHardwareAcceleration = mInternalList.get(position).noHardwareAcceleration;
noVideo = mInternalList.get(position).noVideo;
}
- ArrayList<String> options = new ArrayList<String>();
-
- if (!noHardwareAcceleration) {
- /*
- * Set higher caching values if using iomx decoding, since some omx
- * decoders have a very high latency, and if the preroll data isn't
- * enough to make the decoder output a frame, the playback timing gets
- * started too soon, and every decoded frame appears to be too late.
- * On Nexus One, the decoder latency seems to be 25 input packets
- * for 320x170 H.264, a few packets less on higher resolutions.
- * On Nexus S, the decoder latency seems to be about 7 packets.
- */
- options.add(":file-caching=1500");
- options.add(":network-caching=1500");
- options.add(":codec=mediacodec,iomx,all");
- }
- if (noVideo)
- options.add(":no-video");
- return options.toArray(new String[options.size()]);
+ return mLibVLC.getMediaOptions(noHardwareAcceleration, noVideo);
}
public EventHandler getEventHandler() {
--
2.1.0
More information about the Android
mailing list