[vlc-devel] [PATCH v2 14/21] opengl: pass interop to "glconv" modules

Romain Vimont rom1v at videolabs.io
Tue Jan 7 12:41:50 CET 2020


Pass an interop instead of a tex converter to "glconv" modules.
---
 modules/video_output/opengl/converter.h       |  2 -
 .../video_output/opengl/converter_android.c   | 16 ++---
 modules/video_output/opengl/converter_cvpx.c  | 59 ++++++++++---------
 modules/video_output/opengl/converter_vaapi.c | 25 ++++----
 modules/video_output/opengl/converter_vdpau.c | 23 ++++----
 modules/video_output/opengl/interop.h         |  2 +
 modules/video_output/opengl/vout_helper.c     | 10 ++--
 7 files changed, 68 insertions(+), 69 deletions(-)

diff --git a/modules/video_output/opengl/converter.h b/modules/video_output/opengl/converter.h
index d835b6a184..18751d8d52 100644
--- a/modules/video_output/opengl/converter.h
+++ b/modules/video_output/opengl/converter.h
@@ -43,8 +43,6 @@ struct opengl_tex_converter_t
 {
     struct vlc_object_t obj;
 
-    module_t *p_module;
-
     /* Pointer to object gl, set by the caller */
     vlc_gl_t *gl;
 
diff --git a/modules/video_output/opengl/converter_android.c b/modules/video_output/opengl/converter_android.c
index d0722e486c..488b18f36d 100644
--- a/modules/video_output/opengl/converter_android.c
+++ b/modules/video_output/opengl/converter_android.c
@@ -93,8 +93,8 @@ tc_get_transform_matrix(const struct vlc_gl_interop *interop)
 static void
 Close(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *)obj;
-    struct priv *priv = tc->interop->priv;
+    struct vlc_gl_interop *interop = (void *)obj;
+    struct priv *priv = interop->priv;
 
     if (priv->stex_attached)
         SurfaceTexture_detachFromGLContext(priv->awh);
@@ -105,8 +105,7 @@ Close(vlc_object_t *obj)
 static int
 Open(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *) obj;
-    struct vlc_gl_interop *interop = &tc->interop;
+    struct vlc_gl_interop *interop = (void *) obj;
 
     if (interop->fmt.i_chroma != VLC_CODEC_ANDROID_OPAQUE
      || !interop->gl->surface->handle.anativewindow
@@ -167,10 +166,11 @@ Open(vlc_object_t *obj)
             break;
     }
 
-    tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_EXTERNAL_OES,
-                                              VLC_CODEC_RGB32,
-                                              COLOR_SPACE_UNDEF);
-    if (!tc->fshader)
+    int ret = opengl_interop_init(interop, GL_TEXTURE_EXTERNAL_OES,
+                                  VLC_CODEC_RGB32,
+                                  COLOR_SPACE_UNDEF);
+
+    if (ret != VLC_SUCCESS)
     {
         free(priv);
         return VLC_EGENERIC;
diff --git a/modules/video_output/opengl/converter_cvpx.c b/modules/video_output/opengl/converter_cvpx.c
index 68047d2eae..6cab856d40 100644
--- a/modules/video_output/opengl/converter_cvpx.c
+++ b/modules/video_output/opengl/converter_cvpx.c
@@ -143,8 +143,7 @@ tc_cvpx_update(const struct vlc_gl_interop *interop, GLuint *textures,
 static void
 Close(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *)obj;
-    struct vlc_gl_interop *interop = tc->interop;
+    struct vlc_gl_interop *interop = (void *) obj;
     struct priv *priv = interop->priv;
 
 #if TARGET_OS_IPHONE
@@ -164,8 +163,7 @@ Close(vlc_object_t *obj)
 static int
 Open(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *) obj;
-    struct vlc_gl_interop *interop = tc->interop;
+    struct vlc_gl_interop *interop = (void *) obj;
 
     if (interop->fmt.i_chroma != VLC_CODEC_CVPX_UYVY
      && interop->fmt.i_chroma != VLC_CODEC_CVPX_NV12
@@ -212,7 +210,7 @@ Open(vlc_object_t *obj)
     }
 #endif
 
-    GLuint fragment_shader;
+    int ret;
     switch (interop->fmt.i_chroma)
     {
         case VLC_CODEC_CVPX_UYVY:
@@ -222,9 +220,11 @@ Open(vlc_object_t *obj)
              * and red color channels, respectively. cf. APPLE_rgb_422 khronos
              * extenstion. */
 
-            fragment_shader =
-                opengl_fragment_shader_init(tc, tex_target, VLC_CODEC_VYUY,
-                                            interop->fmt.space);
+            ret = opengl_interop_init(interop, tex_target, VLC_CODEC_VYUY,
+                                      interop->fmt.space);
+            if (ret != VLC_SUCCESS)
+                goto error;
+
             interop->texs[0].internal = GL_RGB;
             interop->texs[0].format = GL_RGB_422_APPLE;
             interop->texs[0].type = GL_UNSIGNED_SHORT_8_8_APPLE;
@@ -232,27 +232,34 @@ Open(vlc_object_t *obj)
             break;
         case VLC_CODEC_CVPX_NV12:
         {
-            fragment_shader =
-                opengl_fragment_shader_init(tc, tex_target, VLC_CODEC_NV12,
-                                            interop->fmt.space);
+            ret = opengl_interop_init(interop, tex_target, VLC_CODEC_NV12,
+                                      interop->fmt.space);
+            if (ret != VLC_SUCCESS)
+                goto error;
             break;
         }
         case VLC_CODEC_CVPX_P010:
         {
-            fragment_shader =
-                opengl_fragment_shader_init(tc, tex_target, VLC_CODEC_P010,
-                                            interop->fmt.space);
+            ret = opengl_interop_init(interop, tex_target, VLC_CODEC_P010,
+                                      interop->fmt.space);
+            if (ret != VLC_SUCCESS)
+                goto error;
+
             break;
         }
         case VLC_CODEC_CVPX_I420:
-            fragment_shader =
-                opengl_fragment_shader_init(tc, tex_target, VLC_CODEC_I420,
-                                            interop->fmt.space);
+            ret = opengl_interop_init(interop, tex_target, VLC_CODEC_I420,
+                                      interop->fmt.space);
+            if (ret != VLC_SUCCESS)
+                goto error;
+
             break;
         case VLC_CODEC_CVPX_BGRA:
-            fragment_shader =
-                opengl_fragment_shader_init(tc, tex_target, VLC_CODEC_RGB32,
-                                            COLOR_SPACE_UNDEF);
+            ret = opengl_interop_init(interop, tex_target, VLC_CODEC_RGB32,
+                                      COLOR_SPACE_UNDEF);
+            if (ret != VLC_SUCCESS)
+                goto error;
+
             interop->texs[0].internal = GL_RGBA;
             interop->texs[0].format = GL_BGRA;
 #if TARGET_OS_IPHONE
@@ -265,12 +272,6 @@ Open(vlc_object_t *obj)
             vlc_assert_unreachable();
     }
 
-    if (fragment_shader == 0)
-    {
-        free(priv);
-        return VLC_EGENERIC;
-    }
-
 #if TARGET_OS_IPHONE
     interop->handle_texs_gen = true;
 #endif
@@ -280,9 +281,11 @@ Open(vlc_object_t *obj)
     };
     interop->ops = &ops;
 
-    tc->fshader           = fragment_shader;
-
     return VLC_SUCCESS;
+
+error:
+    free(priv);
+    return VLC_EGENERIC;
 }
 
 vlc_module_begin ()
diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c
index 46c652fbf6..a19be79ff3 100644
--- a/modules/video_output/opengl/converter_vaapi.c
+++ b/modules/video_output/opengl/converter_vaapi.c
@@ -288,11 +288,11 @@ error:
 static void
 Close(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *)obj;
-    struct priv *priv = tc->interop->priv;
+    struct vlc_gl_interop *interop = (void *)obj;
+    struct priv *priv = interop->priv;
 
     if (priv->last.pic != NULL)
-        vaegl_release_last_pic(tc->interop, priv);
+        vaegl_release_last_pic(interop, priv);
 
     free(priv);
 }
@@ -355,17 +355,16 @@ tc_va_check_derive_image(const struct vlc_gl_interop *interop)
 static int
 Open(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *) obj;
-    struct vlc_gl_interop *interop = tc->interop;
+    struct vlc_gl_interop *interop = (void *) obj;
 
     if (interop->vctx == NULL)
         return VLC_EGENERIC;
     vlc_decoder_device *dec_device = vlc_video_context_HoldDevice(interop->vctx);
     if (dec_device->type != VLC_DECODER_DEVICE_VAAPI
      || !vlc_vaapi_IsChromaOpaque(interop->fmt.i_chroma)
-     || tc->gl->ext != VLC_GL_EXT_EGL
-     || tc->gl->egl.createImageKHR == NULL
-     || tc->gl->egl.destroyImageKHR == NULL)
+     || interop->gl->ext != VLC_GL_EXT_EGL
+     || interop->gl->egl.createImageKHR == NULL
+     || interop->gl->egl.destroyImageKHR == NULL)
     {
         vlc_decoder_device_Release(dec_device);
         return VLC_EGENERIC;
@@ -377,7 +376,7 @@ Open(vlc_object_t *obj)
         return VLC_EGENERIC;
     }
 
-    const char *eglexts = tc->gl->egl.queryString(tc->gl, EGL_EXTENSIONS);
+    const char *eglexts = interop->gl->egl.queryString(interop->gl, EGL_EXTENSIONS);
     if (eglexts == NULL || !vlc_gl_StrHasToken(eglexts, "EGL_EXT_image_dma_buf_import"))
     {
         vlc_decoder_device_Release(dec_device);
@@ -409,7 +408,7 @@ Open(vlc_object_t *obj)
         goto error;
 
     priv->glEGLImageTargetTexture2DOES =
-        vlc_gl_GetProcAddress(tc->gl, "glEGLImageTargetTexture2DOES");
+        vlc_gl_GetProcAddress(interop->gl, "glEGLImageTargetTexture2DOES");
     if (priv->glEGLImageTargetTexture2DOES == NULL)
         goto error;
 
@@ -422,9 +421,9 @@ Open(vlc_object_t *obj)
     if (tc_va_check_derive_image(interop))
         goto error;
 
-    tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_2D, vlc_sw_chroma,
-                                              interop->fmt.space);
-    if (tc->fshader == 0)
+    int ret = opengl_interop_init(interop, GL_TEXTURE_2D, vlc_sw_chroma,
+                                  interop->fmt.space);
+    if (ret != VLC_SUCCESS)
         goto error;
 
     static const struct vlc_gl_interop_ops ops = {
diff --git a/modules/video_output/opengl/converter_vdpau.c b/modules/video_output/opengl/converter_vdpau.c
index f499332414..be72632768 100644
--- a/modules/video_output/opengl/converter_vdpau.c
+++ b/modules/video_output/opengl/converter_vdpau.c
@@ -116,9 +116,9 @@ tc_vdpau_gl_update(const struct vlc_gl_interop *interop, GLuint textures[],
 static void
 Close(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *)obj;
-    _glVDPAUFiniNV(); assert(tc->vt->GetError() == GL_NO_ERROR);
-    converter_sys_t *sys = tc->interop->priv;
+    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;
     vlc_decoder_device_Release(dec_device);
 }
@@ -126,9 +126,7 @@ Close(vlc_object_t *obj)
 static int
 Open(vlc_object_t *obj)
 {
-    opengl_tex_converter_t *tc = (void *) obj;
-    struct vlc_gl_interop *interop = tc->interop;
-
+    struct vlc_gl_interop *interop = (void *) obj;
     if (interop->vctx == NULL)
         return VLC_EGENERIC;
     vlc_decoder_device *dec_device = vlc_video_context_HoldDevice(interop->vctx);
@@ -137,13 +135,13 @@ Open(vlc_object_t *obj)
       && interop->fmt.i_chroma != VLC_CODEC_VDPAU_VIDEO_422
       && interop->fmt.i_chroma != VLC_CODEC_VDPAU_VIDEO_444)
      || !vlc_gl_StrHasToken(interop->glexts, "GL_NV_vdpau_interop")
-     || tc->gl->surface->type != VOUT_WINDOW_TYPE_XID)
+     || interop->gl->surface->type != VOUT_WINDOW_TYPE_XID)
     {
         vlc_decoder_device_Release(dec_device);
         return VLC_EGENERIC;
     }
 
-    converter_sys_t *sys = vlc_obj_malloc(VLC_OBJECT(tc), sizeof(*sys));
+    converter_sys_t *sys = vlc_obj_malloc(VLC_OBJECT(interop), sizeof(*sys));
     if (unlikely(sys == NULL))
     {
         vlc_decoder_device_Release(dec_device);
@@ -168,7 +166,7 @@ Open(vlc_object_t *obj)
     }
 
 #define SAFE_GPA(fct) \
-    _##fct = vlc_gl_GetProcAddress(tc->gl, #fct); \
+    _##fct = vlc_gl_GetProcAddress(interop->gl, #fct); \
     if (!_##fct) \
     { \
         vlc_decoder_device_Release(dec_device); \
@@ -187,10 +185,9 @@ Open(vlc_object_t *obj)
 
     INTEROP_CALL(glVDPAUInitNV, (void *)(uintptr_t)device, vdp_gpa);
 
-    tc->fshader = opengl_fragment_shader_init(tc, GL_TEXTURE_2D,
-                                              VLC_CODEC_RGB32,
-                                              COLOR_SPACE_UNDEF);
-    if (!tc->fshader)
+    int ret = opengl_interop_init(interop, GL_TEXTURE_2D, VLC_CODEC_RGB32,
+                                  COLOR_SPACE_UNDEF);
+    if (ret != VLC_SUCCESS)
     {
         Close(obj);
         return VLC_EGENERIC;
diff --git a/modules/video_output/opengl/interop.h b/modules/video_output/opengl/interop.h
index 35db79f59a..48ad1e5053 100644
--- a/modules/video_output/opengl/interop.h
+++ b/modules/video_output/opengl/interop.h
@@ -110,6 +110,8 @@ struct vlc_gl_interop_ops {
 
 struct vlc_gl_interop {
     vlc_object_t obj;
+    module_t *module;
+
     vlc_gl_t *gl;
     const opengl_vtable_t *vt;
     GLenum tex_target;
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index ad9585d13a..8813556fc6 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -507,11 +507,11 @@ opengl_deinit_program(vout_display_opengl_t *vgl, struct prgm *prgm)
 {
     opengl_tex_converter_t *tc = prgm->tc;
     struct vlc_gl_interop *interop = tc->interop;
-    if (tc->p_module != NULL)
-        module_unneed(tc, tc->p_module);
+    if (interop->module != NULL)
+        module_unneed(interop, interop->module);
     else if (interop->priv != NULL)
         opengl_interop_generic_deinit(interop);
-    vlc_object_delete(tc->interop);
+    vlc_object_delete(interop);
     if (prgm->id != 0)
         vgl->vt.DeleteProgram(prgm->id);
 
@@ -613,10 +613,10 @@ opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
         {
             /* Opaque chroma: load a module to handle it */
             interop->vctx = context;
-            tc->p_module = module_need_var(tc, "glconv", "glconv");
+            interop->module = module_need_var(interop, "glconv", "glconv");
         }
 
-        if (tc->p_module != NULL)
+        if (interop->module != NULL)
             ret = VLC_SUCCESS;
         else
         {
-- 
2.25.0.rc0



More information about the vlc-devel mailing list