[vlc-devel] [PATCH 04/14] android: utils: load SurfaceTexture constructors

Alexandre Janniaux ajanni at videolabs.io
Fri Jun 12 11:40:47 CEST 2020


init_z needs API 26 and is the most suitable since it allows creating
SurfaceTexture in a detached state, while init_iz needs API 19 and
cannot be created without an EGL context currently bounded.

init_i is the most compatible version (API 11) but won't allow
single-buffering.
---
 modules/video_output/android/utils.c | 65 ++++++++++++++++++----------
 1 file changed, 42 insertions(+), 23 deletions(-)

diff --git a/modules/video_output/android/utils.c b/modules/video_output/android/utils.c
index e4d407f560f..7818f1e5e7b 100644
--- a/modules/video_output/android/utils.c
+++ b/modules/video_output/android/utils.c
@@ -129,7 +129,9 @@ static struct
     } AWindow;
     struct {
           jclass clazz;
-          jmethodID constructor;
+          jmethodID init_i;
+          jmethodID init_iz;
+          jmethodID init_z;
     } SurfaceTexture;
 } jfields;
 
@@ -558,7 +560,7 @@ static const struct vlc_asurfacetexture_operations JNISurfaceAPI =
 
 
 static int
-LoadNDKSurfaceTextureAPI(AWindowHandler *p_awh, void *p_library, JNIEnv *p_env)
+LoadNDKSurfaceTextureAPI(AWindowHandler *p_awh, void *p_library)
 {
     p_awh->ndk_ast_api.pf_astFromst = (ptr_ASurfaceTexture_fromSurfaceTexture)
         dlsym(p_library, "ASurfaceTexture_fromSurfaceTexture");
@@ -592,25 +594,6 @@ LoadNDKSurfaceTextureAPI(AWindowHandler *p_awh, void *p_library, JNIEnv *p_env)
         dlsym(p_library, "ANativeWindow_toSurface");
     if (p_awh->ndk_ast_api.pf_anwToSurface == NULL) return VLC_EGENERIC;
 
-    jclass surfacetexture_class = (*p_env)->FindClass(p_env,
-                                            "android/graphics/SurfaceTexture");
-    if (!surfacetexture_class)
-        return VLC_EGENERIC;
-
-    jfields.SurfaceTexture.clazz = (*p_env)->NewGlobalRef(p_env,
-                                                         surfacetexture_class);
-    (*p_env)->DeleteLocalRef(p_env, surfacetexture_class);
-    if (!jfields.SurfaceTexture.clazz)
-        return VLC_EGENERIC;
-
-    jfields.SurfaceTexture.constructor = (*p_env)->GetMethodID(p_env,
-                               jfields.SurfaceTexture.clazz, "<init>", "(Z)V");
-    if (!jfields.SurfaceTexture.constructor)
-    {
-        (*p_env)->DeleteGlobalRef(p_env, jfields.SurfaceTexture.clazz);
-        return VLC_EGENERIC;
-    }
-
     return VLC_SUCCESS;
 }
 
@@ -638,7 +621,7 @@ LoadNativeWindowAPI(AWindowHandler *p_awh, JNIEnv *p_env)
      && p_awh->anw_api.winLock && p_awh->anw_api.unlockAndPost
      && p_awh->anw_api.setBuffersGeometry)
     {
-        p_awh->b_has_ndk_ast_api = !LoadNDKSurfaceTextureAPI(p_awh, p_library, p_env);
+        p_awh->b_has_ndk_ast_api = !LoadNDKSurfaceTextureAPI(p_awh, p_library);
         p_awh->p_anw_dl = p_library;
     }
     else
@@ -646,6 +629,38 @@ LoadNativeWindowAPI(AWindowHandler *p_awh, JNIEnv *p_env)
         dlclose(p_library);
         LoadNativeSurfaceAPI(p_awh);
     }
+    jfields.SurfaceTexture.clazz = NULL;
+
+    jclass surfacetexture_class = (*p_env)->FindClass(p_env,
+                                            "android/graphics/SurfaceTexture");
+    if (surfacetexture_class == NULL)
+        goto error;
+
+    jfields.SurfaceTexture.clazz = (*p_env)->NewGlobalRef(p_env,
+                                                         surfacetexture_class);
+    (*p_env)->DeleteLocalRef(p_env, surfacetexture_class);
+    if (jfields.SurfaceTexture.clazz == NULL)
+        goto error;
+
+    jfields.SurfaceTexture.init_i = (*p_env)->GetMethodID(p_env,
+                               jfields.SurfaceTexture.clazz, "<init>", "(I)V");
+    jfields.SurfaceTexture.init_iz = (*p_env)->GetMethodID(p_env,
+                               jfields.SurfaceTexture.clazz, "<init>", "(IZ)V");
+    jfields.SurfaceTexture.init_z = (*p_env)->GetMethodID(p_env,
+                               jfields.SurfaceTexture.clazz, "<init>", "(Z)V");
+
+    /* We cannot create any SurfaceTexture if we cannot load the SurfaceTexture
+     * methods. */
+    if (!jfields.SurfaceTexture.init_i &&
+        !jfields.SurfaceTexture.init_iz &&
+        !jfields.SurfaceTexture.init_z)
+        goto error;
+
+    return;
+
+error:
+    if (jfields.SurfaceTexture.clazz != NULL)
+        (*p_env)->DeleteGlobalRef(p_env, jfields.SurfaceTexture.clazz);
 }
 
 static void
@@ -878,8 +893,12 @@ AWindowHandler_getANativeWindowAPI(AWindowHandler *p_awh)
 static jobject InitNDKSurfaceTexture(AWindowHandler *p_awh, JNIEnv *p_env,
         enum AWindow_ID id)
 {
+    /* This API should be available if using NDK SurfaceTexture API */
+    if (!jfields.SurfaceTexture.init_z)
+        return NULL;
+
     jobject surfacetexture = (*p_env)->NewObject(p_env,
-      jfields.SurfaceTexture.clazz, jfields.SurfaceTexture.constructor, false);
+      jfields.SurfaceTexture.clazz, jfields.SurfaceTexture.init_z, false);
 
     if (surfacetexture == NULL)
         goto error;
-- 
2.27.0



More information about the vlc-devel mailing list