[vlc-devel] [PATCH v2 05/29] opengl: add interop close() callback

Romain Vimont rom1v at videolabs.io
Thu Feb 6 14:17:34 CET 2020


Use a callback to close an interop instead of relying on closing the
module.

This allows to properly close interop_sw, which is not a module.
---
 modules/video_output/opengl/interop.h         | 10 +++++++++
 modules/video_output/opengl/interop_android.c |  6 ++---
 modules/video_output/opengl/interop_cvpx.c    |  6 ++---
 modules/video_output/opengl/interop_sw.c      | 22 ++++++++++---------
 modules/video_output/opengl/interop_vaapi.c   |  6 ++---
 modules/video_output/opengl/interop_vdpau.c   |  8 +++----
 modules/video_output/opengl/vout_helper.c     |  4 ++--
 7 files changed, 37 insertions(+), 25 deletions(-)

diff --git a/modules/video_output/opengl/interop.h b/modules/video_output/opengl/interop.h
index 2a366ed91d..322e7242ee 100644
--- a/modules/video_output/opengl/interop.h
+++ b/modules/video_output/opengl/interop.h
@@ -92,6 +92,16 @@ struct vlc_gl_interop_ops {
      */
     const float *
     (*get_transform_matrix)(const struct vlc_gl_interop *interop);
+
+    /**
+     * Called before the interop is destroyed
+     *
+     * This function pointer can be NULL.
+     *
+     * \param interop the OpenGL interop
+     */
+    void
+    (*close)(struct vlc_gl_interop *interop);
 };
 
 struct vlc_gl_interop {
diff --git a/modules/video_output/opengl/interop_android.c b/modules/video_output/opengl/interop_android.c
index 47b4bab328..f62043944a 100644
--- a/modules/video_output/opengl/interop_android.c
+++ b/modules/video_output/opengl/interop_android.c
@@ -93,9 +93,8 @@ tc_get_transform_matrix(const struct vlc_gl_interop *interop)
 }
 
 static void
-Close(vlc_object_t *obj)
+Close(struct vlc_gl_interop *interop)
 {
-    struct vlc_gl_interop *interop = (void *)obj;
     struct priv *priv = interop->priv;
 
     if (priv->stex_attached)
@@ -134,6 +133,7 @@ Open(vlc_object_t *obj)
         .allocate_textures = tc_anop_allocate_textures,
         .update_textures = tc_anop_update,
         .get_transform_matrix = tc_get_transform_matrix,
+        .close = Close,
     };
     interop->ops = &ops;
 
@@ -184,7 +184,7 @@ Open(vlc_object_t *obj)
 vlc_module_begin ()
     set_description("Android OpenGL SurfaceTexture converter")
     set_capability("glinterop", 1)
-    set_callbacks(Open, Close)
+    set_callback(Open)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VOUT)
 vlc_module_end ()
diff --git a/modules/video_output/opengl/interop_cvpx.c b/modules/video_output/opengl/interop_cvpx.c
index 00171398e3..7c57455d78 100644
--- a/modules/video_output/opengl/interop_cvpx.c
+++ b/modules/video_output/opengl/interop_cvpx.c
@@ -143,9 +143,8 @@ tc_cvpx_update(const struct vlc_gl_interop *interop, GLuint *textures,
 #endif
 
 static void
-Close(vlc_object_t *obj)
+Close(struct vlc_gl_interop *interop)
 {
-    struct vlc_gl_interop *interop = (void *) obj;
     struct priv *priv = interop->priv;
 
 #if TARGET_OS_IPHONE
@@ -280,6 +279,7 @@ Open(vlc_object_t *obj)
     interop->priv = priv;
     static const struct vlc_gl_interop_ops ops = {
         .update_textures = tc_cvpx_update,
+        .close = Close,
     };
     interop->ops = &ops;
 
@@ -293,7 +293,7 @@ error:
 vlc_module_begin ()
     set_description("Apple OpenGL CVPX converter")
     set_capability("glinterop", 1)
-    set_callbacks(Open, Close)
+    set_callback(Open)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VOUT)
 vlc_module_end ()
diff --git a/modules/video_output/opengl/interop_sw.c b/modules/video_output/opengl/interop_sw.c
index 11c0946c5d..481ebd027e 100644
--- a/modules/video_output/opengl/interop_sw.c
+++ b/modules/video_output/opengl/interop_sw.c
@@ -284,6 +284,16 @@ tc_common_update(const struct vlc_gl_interop *interop, GLuint *textures,
     return ret;
 }
 
+void
+opengl_interop_generic_deinit(struct vlc_gl_interop *interop)
+{
+    struct priv *priv = interop->priv;
+    for (size_t i = 0; i < PBO_DISPLAY_COUNT && priv->pbo.display_pics[i]; ++i)
+        picture_Release(priv->pbo.display_pics[i]);
+    free(priv->texture_temp_buf);
+    free(priv);
+}
+
 int
 opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
 {
@@ -347,6 +357,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
     static const struct vlc_gl_interop_ops ops = {
         .allocate_textures = tc_common_allocate_textures,
         .update_textures = tc_common_update,
+        .close = opengl_interop_generic_deinit,
     };
     interop->ops = &ops;
 
@@ -371,6 +382,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
             static const struct vlc_gl_interop_ops pbo_ops = {
                 .allocate_textures = tc_common_allocate_textures,
                 .update_textures = tc_pbo_update,
+                .close = opengl_interop_generic_deinit,
             };
             interop->ops = &pbo_ops;
             msg_Dbg(interop->gl, "PBO support enabled");
@@ -379,13 +391,3 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
 
     return VLC_SUCCESS;
 }
-
-void
-opengl_interop_generic_deinit(struct vlc_gl_interop *interop)
-{
-    struct priv *priv = interop->priv;
-    for (size_t i = 0; i < PBO_DISPLAY_COUNT && priv->pbo.display_pics[i]; ++i)
-        picture_Release(priv->pbo.display_pics[i]);
-    free(priv->texture_temp_buf);
-    free(priv);
-}
diff --git a/modules/video_output/opengl/interop_vaapi.c b/modules/video_output/opengl/interop_vaapi.c
index 7dcbd52124..b11251135f 100644
--- a/modules/video_output/opengl/interop_vaapi.c
+++ b/modules/video_output/opengl/interop_vaapi.c
@@ -227,9 +227,8 @@ error:
 }
 
 static void
-Close(vlc_object_t *obj)
+Close(struct vlc_gl_interop *interop)
 {
-    struct vlc_gl_interop *interop = (void *)obj;
     struct priv *priv = interop->priv;
 
     if (priv->last.pic != NULL)
@@ -412,6 +411,7 @@ Open(vlc_object_t *obj)
 
     static const struct vlc_gl_interop_ops ops = {
         .update_textures = tc_vaegl_update,
+        .close = Close,
     };
     interop->ops = &ops;
 
@@ -427,7 +427,7 @@ error:
 vlc_module_begin ()
     set_description("VA-API OpenGL surface converter")
     set_capability("glinterop", 1)
-    set_callbacks(Open, Close)
+    set_callback(Open)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VOUT)
     add_shortcut("vaapi")
diff --git a/modules/video_output/opengl/interop_vdpau.c b/modules/video_output/opengl/interop_vdpau.c
index dbffe81926..6625f995a3 100644
--- a/modules/video_output/opengl/interop_vdpau.c
+++ b/modules/video_output/opengl/interop_vdpau.c
@@ -105,9 +105,8 @@ tc_vdpau_gl_update(const struct vlc_gl_interop *interop, GLuint textures[],
 }
 
 static void
-Close(vlc_object_t *obj)
+Close(struct vlc_gl_interop *interop)
 {
-    struct vlc_gl_interop *interop = (void *)obj;
     _glVDPAUFiniNV(); assert(interop->vt->GetError() == GL_NO_ERROR);
     converter_sys_t *sys = interop->priv;
     vlc_decoder_device *dec_device = sys->dec_device;
@@ -180,12 +179,13 @@ Open(vlc_object_t *obj)
                                   COLOR_SPACE_UNDEF);
     if (ret != VLC_SUCCESS)
     {
-        Close(obj);
+        Close(interop);
         return VLC_EGENERIC;
     }
 
     static const struct vlc_gl_interop_ops ops = {
         .update_textures = tc_vdpau_gl_update,
+        .close = Close,
     };
     interop->ops = &ops;
     interop->priv = sys;
@@ -230,7 +230,7 @@ DecoderDeviceOpen(vlc_decoder_device *device, vout_window_t *window)
 vlc_module_begin ()
     set_description("VDPAU OpenGL surface converter")
     set_capability("glinterop", 2)
-    set_callbacks(Open, Close)
+    set_callback(Open)
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VOUT)
     add_shortcut("vdpau")
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 70fda639b4..de17819257 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -517,8 +517,8 @@ opengl_deinit_program(vout_display_opengl_t *vgl, struct prgm *prgm)
     struct vlc_gl_interop *interop = tc->interop;
     if (interop->module != NULL)
         module_unneed(interop, interop->module);
-    else if (interop->priv != NULL)
-        opengl_interop_generic_deinit(interop);
+    if (interop->ops && interop->ops->close)
+        interop->ops->close(interop);
     vlc_object_delete(interop);
     if (prgm->id != 0)
         vgl->vt.DeleteProgram(prgm->id);
-- 
2.25.0



More information about the vlc-devel mailing list