[vlc-devel] [PATCH 07/17] android: interop: use get_texture to get SurfaceTexture
Alexandre Janniaux
ajanni at videolabs.io
Wed Jan 13 11:07:20 UTC 2021
We don't need the older way of providing the texture, nor we need to
attach first.
---
modules/video_output/opengl/interop_android.c | 54 +++++++++----------
1 file changed, 26 insertions(+), 28 deletions(-)
diff --git a/modules/video_output/opengl/interop_android.c b/modules/video_output/opengl/interop_android.c
index a838416b36..fc9f0e4708 100644
--- a/modules/video_output/opengl/interop_android.c
+++ b/modules/video_output/opengl/interop_android.c
@@ -34,10 +34,10 @@
struct priv
{
- android_video_context_t *avctx;
const float *transform_mtx;
bool stex_attached;
struct vlc_asurfacetexture *previous_texture;
+ picture_t *current_picture;
};
static int
@@ -48,48 +48,43 @@ tc_anop_allocate_textures(const struct vlc_gl_interop *interop, GLuint *textures
struct priv *priv = interop->priv;
assert(textures[0] != 0);
- if (priv->avctx->texture)
- {
- 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;
- }
return VLC_SUCCESS;
}
static int
-tc_anop_update(const struct vlc_gl_interop *interop, GLuint *textures,
+tc_anop_update(struct vlc_gl_interop *interop, GLuint *textures,
const GLsizei *tex_width, const GLsizei *tex_height,
picture_t *pic, const size_t *plane_offset)
{
+ struct priv *priv = interop->priv;
+
(void) tex_width; (void) tex_height; (void) plane_offset;
assert(pic->context);
assert(textures[0] != 0);
+ if (priv->current_picture)
+ picture_Release(priv->current_picture);
+ priv->current_picture = picture_Hold(pic);
+
+ struct vlc_video_context *vctx = pic->context->vctx;
+ android_video_context_t *avctx =
+ vlc_video_context_GetPrivate(vctx, VLC_VIDEO_CONTEXT_AWINDOW);
+ if (avctx == NULL)
+ return VLC_EGENERIC;
+
if (plane_offset != NULL)
return VLC_EGENERIC;
- 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 *texture =
+ avctx->get_texture(pic->context);
struct vlc_asurfacetexture *previous_texture = priv->previous_texture;
if (previous_texture != texture)
{
- if (priv->previous_texture != NULL)
+ if (previous_texture != NULL)
{
- SurfaceTexture_detachFromGLContext(priv->previous_texture);
+ SurfaceTexture_detachFromGLContext(previous_texture);
/* SurfaceTexture_detachFromGLContext will destroy the previous
* texture name, so we need to regenerate it. */
interop->api->vt.GenTextures(1, &textures[0]);
@@ -102,7 +97,7 @@ tc_anop_update(const struct vlc_gl_interop *interop, GLuint *textures,
priv->previous_texture = texture;
}
- if (!priv->avctx->render(pic->context))
+ if (!avctx->render(pic->context))
return VLC_SUCCESS; /* already rendered */
/* Release previous image */
@@ -134,8 +129,11 @@ Close(struct vlc_gl_interop *interop)
{
struct priv *priv = interop->priv;
- if (priv->stex_attached)
- SurfaceTexture_detachFromGLContext(priv->avctx->texture);
+ if (priv->previous_texture)
+ SurfaceTexture_detachFromGLContext(priv->previous_texture);
+
+ if (priv->current_picture)
+ picture_Release(priv->current_picture);
free(priv);
}
@@ -161,7 +159,7 @@ Open(vlc_object_t *obj)
android_video_context_t *avctx =
vlc_video_context_GetPrivate(interop->vctx, VLC_VIDEO_CONTEXT_AWINDOW);
- if (avctx == NULL || avctx->texture == NULL)
+ if (avctx == NULL || (avctx->texture == NULL && avctx->get_texture == NULL))
return VLC_EGENERIC;
interop->priv = malloc(sizeof(struct priv));
@@ -169,8 +167,8 @@ Open(vlc_object_t *obj)
return VLC_ENOMEM;
struct priv *priv = interop->priv;
- priv->avctx = avctx;
priv->transform_mtx = NULL;
+ priv->current_picture = NULL;
priv->previous_texture = NULL;
priv->stex_attached = false;
--
2.30.0
More information about the vlc-devel
mailing list