[vlc-devel] [PATCH 1/3] Android utils, OpenGL: load ASurfaceTexture NDK API

Louis Regnier louis.videolabs at gmail.com
Thu Apr 9 16:49:28 CEST 2020


Hi, no it is not necessary, you are right, I will remove them !Thanks for
reporting this.


On Thu, Apr 9, 2020 at 11:21 AM Zhao Zhili <quinkblack at foxmail.com> wrote:

>
>
> > On Apr 6, 2020, at 5:51 PM, Louis Regnier <louis.videolabs at gmail.com>
> wrote:
> >
> > Implement a new Android NDK API library to manage surfacetexture
> natively.
> > If device is not recent enough to support this API it will fallback to
> the
> > previous JNI API.
> >
> > To avoid JNI, we need an access to the SurfaceTexture which is
> > initialized in the AWindow.java class in the Android bindings.
> >
> > Currently only a Surface (weak reference to the producer side)
> > is returned by the AWindow JNI API preventing using the NDK API
> > directly.
> >
> > First, add those new method bindings from the AWindow object.
> >
> > Then, if method exist, dynamically bind the NDK SurfaceTexture API
> > to a pointer structure to determine whether it is available.
> > Fallback to JNI behaviour if they are not available.
> >
> > refs videolan/vlc#20344
> > ---
> > modules/video_output/android/utils.c | 99 ++++++++++++++++++++++++----
> > modules/video_output/android/utils.h |  1 +
> > 2 files changed, 86 insertions(+), 14 deletions(-)
> >
> > diff --git a/modules/video_output/android/utils.c
> b/modules/video_output/android/utils.c
> > index 2010f13976..7158ec6658 100644
> > --- a/modules/video_output/android/utils.c
> > +++ b/modules/video_output/android/utils.c
> > @@ -25,11 +25,39 @@
> > #include <jni.h>
> > #include <pthread.h>
> > #include <assert.h>
> > +#include <android/surface_texture.h>
> > +#include <android/surface_texture_jni.h>
>
> Is it necessary to include these header files?
>
> >
> > typedef ANativeWindow* (*ptr_ANativeWindow_fromSurface)(JNIEnv*,
> jobject);
> > typedef ANativeWindow* (*ptr_ANativeWindow_fromSurfaceTexture)(JNIEnv*,
> jobject);
> > typedef void (*ptr_ANativeWindow_release)(ANativeWindow*);
> >
> > +typedef void (*ptr_ASurfaceTexture_getTransformMatrix)
> > +                                        (ASurfaceTexture *st, float
> mtx[16]);
> > +typedef ASurfaceTexture* (*ptr_ASurfaceTexture_fromSurfaceTexture)
> > +                                        (JNIEnv* env, jobject
> surfacetexture);
> > +typedef int (*ptr_ASurfaceTexture_updateTexImage)(ASurfaceTexture* st);
> > +typedef int (*ptr_ASurfaceTexture_detachFromGLContext)
> > +                                        (ASurfaceTexture *st);
> > +typedef int (*ptr_ASurfaceTexture_attachToGLContext)
> > +                                        (ASurfaceTexture *st, uint32_t
> texName);
> > +typedef void (*ptr_ASurfaceTexture_release)(ASurfaceTexture *st);
> > +
> > +struct ASurfaceTextureAPI
> > +{
> > +    float   transMat[16];
> > +
> > +    jobject surfacetexture;
> > +    ASurfaceTexture *p_ast;
> > +
> > +    ptr_ASurfaceTexture_updateTexImage pf_updateTexImage;
> > +    ptr_ASurfaceTexture_fromSurfaceTexture pf_astFromst;
> > +    ptr_ASurfaceTexture_attachToGLContext pf_attachToGL;
> > +    ptr_ASurfaceTexture_detachFromGLContext pf_detachFromGL;
> > +    ptr_ASurfaceTexture_getTransformMatrix pf_getTransMatrix;
> > +    ptr_ASurfaceTexture_release pf_releaseAst;
> > +};
> > +
> > struct AWindowHandler
> > {
> >     JavaVM *p_jvm;
> > @@ -46,6 +74,9 @@ struct AWindowHandler
> >     ptr_ANativeWindow_release pf_winRelease;
> >     native_window_api_t anw_api;
> >
> > +    struct SurfaceTextureHandler st;
> > +    struct ASurfaceTextureAPI ast_api;
> > +
> >     struct {
> >         awh_events_t cb;
> >     } event;
> > @@ -57,20 +88,6 @@ struct AWindowHandler
> >     } stex;
> > };
> >
> > -struct SurfaceTexture
> > -{
> > -    JavaVM *p_jvm;
> > -
> > -    void *p_anw_dl;
> > -    ptr_ANativeWindow_fromSurface pf_winFromSurface;
> > -    ptr_ANativeWindow_release pf_winRelease;
> > -
> > -    jobject thiz;
> > -    jobject jsurface;
> > -    ANativeWindow *p_anw;
> > -
> > -};
> > -
> > static struct
> > {
> >     struct {
> > @@ -86,6 +103,8 @@ static struct
> >         jmethodID detachFromGLContext;
> >         jmethodID waitAndUpdateTexImage;
> >         jmethodID getSurface;
> > +        jmethodID getSurfaceTexture;
> > +        jmethodID removeFrameAvailableListener;
> >     } SurfaceTexture;
> > } jfields;
> >
> > @@ -262,6 +281,53 @@ LoadNativeSurfaceAPI(AWindowHandler *p_awh)
> >     p_awh->anw_api.setBuffersGeometry = NULL;
> > }
> >
> > +/*
> > + * Android ASurfaceTexture Android NDK
> > + */
> > +
> > +static int
> > +ASurfaceTexture_attachToGLContext(AWindowHandler *p_awh, uint32_t
> texName);
> > +static int
> > +ASurfaceTexture_updateTexImage(AWindowHandler *p_awh, const float
> **pp_transform_mtx);
> > +static void
> > +ASurfaceTexture_detachFromGLContext(AWindowHandler *p_awh);
> > +static int
> > +JNISurfaceTexture_waitAndUpdateTexImage(AWindowHandler *p_awh,
> > +                                            const float
> **pp_transform_mtx);
> > +static void
> > +JNISurfaceTexture_detachFromGLContext(AWindowHandler *p_awh);
> > +static int
> > +JNISurfaceTexture_attachToGLContext(AWindowHandler *p_awh, uint32_t
> tex_name);
> > +
> > +static int
> > +LoadSurfaceTextureAPI(AWindowHandler *p_awh, void *p_library)
> > +{
> > +    if (jfields.SurfaceTexture.removeFrameAvailableListener
> > +            && jfields.SurfaceTexture.getSurfaceTexture)
> > +    {
> > +        p_awh->ast_api.pf_astFromst =
> (ptr_ASurfaceTexture_fromSurfaceTexture)
> > +            dlsym(p_library, "ASurfaceTexture_fromSurfaceTexture");
> > +        p_awh->ast_api.pf_updateTexImage =
> (ptr_ASurfaceTexture_updateTexImage)
> > +            dlsym(p_library, "ASurfaceTexture_updateTexImage");
> > +        p_awh->ast_api.pf_attachToGL =
> (ptr_ASurfaceTexture_attachToGLContext)
> > +            dlsym(p_library, "ASurfaceTexture_attachToGLContext");
> > +        p_awh->ast_api.pf_detachFromGL =
> (ptr_ASurfaceTexture_detachFromGLContext)
> > +            dlsym(p_library, "ASurfaceTexture_detachFromGLContext");
> > +        p_awh->ast_api.pf_getTransMatrix =
> (ptr_ASurfaceTexture_getTransformMatrix)
> > +            dlsym(p_library, "ASurfaceTexture_getTransformMatrix");
> > +        p_awh->ast_api.pf_releaseAst = (ptr_ASurfaceTexture_release)
> > +            dlsym(p_library, "ASurfaceTexture_release");
> > +
> > +        if (p_awh->ast_api.pf_astFromst &&
> p_awh->ast_api.pf_updateTexImage
> > +                && p_awh->ast_api.pf_attachToGL &&
> p_awh->ast_api.pf_detachFromGL
> > +                && p_awh->ast_api.pf_getTransMatrix &&
> p_awh->ast_api.pf_releaseAst)
> > +        {
> > +            return VLC_SUCCESS;
> > +        }
> > +    }
> > +    return VLC_EGENERIC;
> > +}
> > +
> > /*
> >  * Android NativeWindow (post android 2.3)
> >  */
> > @@ -286,6 +352,7 @@ LoadNativeWindowAPI(AWindowHandler *p_awh)
> >      && p_awh->anw_api.winLock && p_awh->anw_api.unlockAndPost
> >      && p_awh->anw_api.setBuffersGeometry)
> >     {
> > +        LoadSurfaceTextureAPI(p_awh, p_library);
> >         p_awh->p_anw_dl = p_library;
> >     }
> >     else
> > @@ -435,6 +502,10 @@ InitJNIFields(JNIEnv *env, vlc_object_t *p_obj,
> jobject *jobj)
> >                true);
> >     GET_METHOD(SurfaceTexture.getSurface,
> >                "SurfaceTexture_getSurface", "()Landroid/view/Surface;",
> true);
> > +    GET_METHOD(SurfaceTexture.getSurfaceTexture,
> > +               "SurfaceTexture_getSurfaceTexture",
> "()Landroid/graphics/SurfaceTexture;", true);
> > +    GET_METHOD(SurfaceTexture.removeFrameAvailableListener,
> > +               "SurfaceTexture_removeFrameAvailableListener", "()V",
> true);
> >
> >     if ((*env)->RegisterNatives(env, clazz, jni_callbacks, 2) < 0)
> >     {
> > diff --git a/modules/video_output/android/utils.h
> b/modules/video_output/android/utils.h
> > index 35ccc41906..28aed6c6a1 100644
> > --- a/modules/video_output/android/utils.h
> > +++ b/modules/video_output/android/utils.h
> > @@ -34,6 +34,7 @@
> > #include <vlc_common.h>
> >
> > typedef struct AWindowHandler AWindowHandler;
> > +typedef struct ASurfaceTexture ASurfaceTexture;
> >
> > enum AWindow_ID {
> >     AWindow_Video,
> > --
> > 2.26.0
> >
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200409/d53d262e/attachment.html>


More information about the vlc-devel mailing list