[vlc-devel] [PATCH 06/17] interop_android: use releaseTexImage
Alexandre Janniaux
ajanni at videolabs.io
Wed Jan 13 11:07:19 UTC 2021
Handle first attachment correctly if a texture is exposed in the
context, and then handle each new texture with the correct detach
and attach lifecycle. SurfaceTexture_detachFromGLContext deletes
the OpenGL texture names so in addition, we need to regenerate it
to be compliant.
---
modules/video_output/opengl/interop_android.c | 47 +++++++++++++++++--
1 file changed, 42 insertions(+), 5 deletions(-)
diff --git a/modules/video_output/opengl/interop_android.c b/modules/video_output/opengl/interop_android.c
index cc82455e47..a838416b36 100644
--- a/modules/video_output/opengl/interop_android.c
+++ b/modules/video_output/opengl/interop_android.c
@@ -37,6 +37,7 @@ struct priv
android_video_context_t *avctx;
const float *transform_mtx;
bool stex_attached;
+ struct vlc_asurfacetexture *previous_texture;
};
static int
@@ -47,12 +48,16 @@ tc_anop_allocate_textures(const struct vlc_gl_interop *interop, GLuint *textures
struct priv *priv = interop->priv;
assert(textures[0] != 0);
- if (SurfaceTexture_attachToGLContext(priv->avctx->texture, textures[0]) != 0)
+ if (priv->avctx->texture)
{
- msg_Err(interop->gl, "SurfaceTexture_attachToGLContext failed");
- return VLC_EGENERIC;
+ if (SurfaceTexture_attachToGLContext(priv->avctx->texture, textures[0]) != 0)
+ {
+ msg_Err(interop->gl, "SurfaceTexture_attachToGLContext failed");
+ return VLC_EGENERIC;
+ }
+ priv->stex_attached = true;
+ priv->previous_texture = priv->avctx->texture;
}
- priv->stex_attached = true;
return VLC_SUCCESS;
}
@@ -70,10 +75,41 @@ tc_anop_update(const struct vlc_gl_interop *interop, GLuint *textures,
struct priv *priv = interop->priv;
+ assert(priv->avctx);
+ assert(priv->avctx->get_texture);
+ assert(pic->context);
+ struct vlc_android_surfacetexture *texture =
+ priv->avctx->get_texture(pic->context);
+
+ assert(texture);
+
+ struct vlc_asurfacetexture *previous_texture = priv->previous_texture;
+
+ if (previous_texture != texture)
+ {
+ if (priv->previous_texture != NULL)
+ {
+ SurfaceTexture_detachFromGLContext(priv->previous_texture);
+ /* SurfaceTexture_detachFromGLContext will destroy the previous
+ * texture name, so we need to regenerate it. */
+ interop->api->vt.GenTextures(1, &textures[0]);
+ }
+
+ if (SurfaceTexture_attachToGLContext(texture, textures[0]) != 0)
+ return VLC_EGENERIC;
+
+ priv->stex_attached = true;
+ priv->previous_texture = texture;
+ }
+
if (!priv->avctx->render(pic->context))
return VLC_SUCCESS; /* already rendered */
- if (SurfaceTexture_updateTexImage(priv->avctx->texture, &priv->transform_mtx)
+ /* Release previous image */
+ if (previous_texture && previous_texture != texture)
+ SurfaceTexture_releaseTexImage(previous_texture);
+
+ if (SurfaceTexture_updateTexImage(texture, &priv->transform_mtx)
!= VLC_SUCCESS)
{
priv->transform_mtx = NULL;
@@ -135,6 +171,7 @@ Open(vlc_object_t *obj)
struct priv *priv = interop->priv;
priv->avctx = avctx;
priv->transform_mtx = NULL;
+ priv->previous_texture = NULL;
priv->stex_attached = false;
static const struct vlc_gl_interop_ops ops = {
--
2.30.0
More information about the vlc-devel
mailing list