[vlc-devel] [PATCH 02/17] android: utils: add releaseTexImage
Alexandre Janniaux
ajanni at videolabs.io
Wed Jan 13 11:07:15 UTC 2021
Add support for releaseTexImage in SurfaceTexture, which is needed in
custom SurfaceTexture-based buffer producer to use the less number of
buffer possible. This is especially important on old and low-memory
devices which cannot create a ton of SurfaceTexture objects.
Use the JNI variant for the NDK implementation since the function
doesn't even exists in the NDK.
---
modules/video_output/android/utils.c | 31 ++++++++++++++++++++++++++++
modules/video_output/android/utils.h | 6 ++++++
2 files changed, 37 insertions(+)
diff --git a/modules/video_output/android/utils.c b/modules/video_output/android/utils.c
index 6e8a6f22b0..82210bf84e 100644
--- a/modules/video_output/android/utils.c
+++ b/modules/video_output/android/utils.c
@@ -130,6 +130,7 @@ static struct
jmethodID init_iz;
jmethodID init_z;
jmethodID updateTexImage;
+ jmethodID releaseTexImage;
jmethodID getTransformMatrix;
jmethodID detachFromGLContext;
jmethodID attachToGLContext;
@@ -458,11 +459,15 @@ static void NDKSurfaceTexture_destroy(
free(handle);
}
+static void
+JNISurfaceTexture_releaseTexImage(struct vlc_asurfacetexture *surface);
+
static const struct vlc_asurfacetexture_operations NDKSurfaceAPI =
{
.attach_to_gl_context = NDKSurfaceTexture_attachToGLContext,
.update_tex_image = NDKSurfaceTexture_updateTexImage,
.detach_from_gl_context = NDKSurfaceTexture_detachFromGLContext,
+ .release_tex_image = JNISurfaceTexture_releaseTexImage,
.destroy = NDKSurfaceTexture_destroy,
};
@@ -540,6 +545,22 @@ JNISurfaceTexture_updateTexImage(
return VLC_SUCCESS;
}
+static void
+JNISurfaceTexture_releaseTexImage(
+ struct vlc_asurfacetexture *surface)
+{
+ struct vlc_asurfacetexture_priv *handle =
+ container_of(surface, struct vlc_asurfacetexture_priv, surface);
+
+ AWindowHandler *p_awh = handle->awh;
+ JNIEnv *p_env = android_getEnvCommon(NULL, handle->awh->p_jvm, "SurfaceTexture");
+ if (!p_env)
+ return;
+
+ (*p_env)->CallVoidMethod(p_env, handle->jtexture,
+ jfields.SurfaceTexture.releaseTexImage);
+}
+
static void JNISurfaceTexture_destroy(
struct vlc_asurfacetexture *surface)
{
@@ -563,6 +584,7 @@ static const struct vlc_asurfacetexture_operations JNISurfaceAPI =
.attach_to_gl_context = JNISurfaceTexture_attachToGLContext,
.update_tex_image = JNISurfaceTexture_updateTexImage,
.detach_from_gl_context = JNISurfaceTexture_detachFromGLContext,
+ .release_tex_image = JNISurfaceTexture_releaseTexImage,
.destroy = JNISurfaceTexture_destroy,
};
@@ -726,6 +748,9 @@ InitJNIFields(JNIEnv *env, vlc_object_t *p_obj, jobject *jobj)
GET_METHOD(SurfaceTexture, getTransformMatrix,
"getTransformMatrix", "([F)V", true);
+ GET_METHOD(SurfaceTexture, releaseTexImage,
+ "releaseTexImage", "()V", false);
+
GET_METHOD(SurfaceTexture, attachToGLContext,
"attachToGLContext", "(I)V", true);
@@ -1270,3 +1295,9 @@ SurfaceTexture_updateTexImage(struct vlc_asurfacetexture *st, const float **pp_t
{
return st->ops->update_tex_image(st, pp_transform_mtx);
}
+
+void
+SurfaceTexture_releaseTexImage(struct vlc_asurfacetexture *st)
+{
+ return st->ops->release_tex_image(st);
+}
diff --git a/modules/video_output/android/utils.h b/modules/video_output/android/utils.h
index 69c5eaaceb..a7fc84d7a8 100644
--- a/modules/video_output/android/utils.h
+++ b/modules/video_output/android/utils.h
@@ -104,6 +104,9 @@ struct vlc_asurfacetexture_operations
struct vlc_asurfacetexture *surface,
const float **pp_transform_mtx);
+ void (*release_tex_image)(
+ struct vlc_asurfacetexture *st);
+
void (*destroy)(
struct vlc_asurfacetexture *surface);
};
@@ -219,3 +222,6 @@ vlc_asurfacetexture_Delete(struct vlc_asurfacetexture *st)
*/
int
SurfaceTexture_updateTexImage(struct vlc_asurfacetexture *st, const float **pp_transform_mtx);
+
+void
+SurfaceTexture_releaseTexImage(struct vlc_asurfacetexture *st);
--
2.30.0
More information about the vlc-devel
mailing list