[vlc-devel] [PATCH v2 21/21] opengl: move interop-specific code to interop.c

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


Move functions related to interops from fragment_shader.c to interop.c.
---
 modules/video_output/Makefile.am              |   2 +-
 .../video_output/opengl/fragment_shaders.c    | 212 ---------------
 modules/video_output/opengl/interop.c         | 241 ++++++++++++++++++
 3 files changed, 242 insertions(+), 213 deletions(-)
 create mode 100644 modules/video_output/opengl/interop.c

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 19518616c1..6bccecf006 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -7,7 +7,7 @@ OPENGL_COMMONSOURCES = video_output/opengl/vout_helper.c \
 	video_output/opengl/gl_common.h video_output/opengl/interop.h \
 	video_output/opengl/vout_helper.h video_output/opengl/converter.h \
 	video_output/opengl/internal.h video_output/opengl/fragment_shaders.c \
-	video_output/opengl/interop_sw.c
+	video_output/opengl/interop.c video_output/opengl/interop_sw.c
 if HAVE_LIBPLACEBO
 OPENGL_COMMONSOURCES += video_output/placebo_utils.c video_output/placebo_utils.h
 endif
diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
index d11b7dfaf8..873b9c614c 100644
--- a/modules/video_output/opengl/fragment_shaders.c
+++ b/modules/video_output/opengl/fragment_shaders.c
@@ -37,150 +37,6 @@
 #include "internal.h"
 #include "vout_helper.h"
 
-static int GetTexFormatSize(const opengl_vtable_t *vt, int target,
-                            int tex_format, int tex_internal, int tex_type)
-{
-    if (!vt->GetTexLevelParameteriv)
-        return -1;
-
-    GLint tex_param_size;
-    int mul = 1;
-    switch (tex_format)
-    {
-        case GL_BGRA:
-            mul = 4;
-            /* fall through */
-        case GL_RED:
-        case GL_RG:
-            tex_param_size = GL_TEXTURE_RED_SIZE;
-            break;
-        case GL_LUMINANCE:
-            tex_param_size = GL_TEXTURE_LUMINANCE_SIZE;
-            break;
-        default:
-            return -1;
-    }
-    GLuint texture;
-
-    vt->GenTextures(1, &texture);
-    vt->BindTexture(target, texture);
-    vt->TexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format, tex_type, NULL);
-    GLint size = 0;
-    vt->GetTexLevelParameteriv(target, 0, tex_param_size, &size);
-
-    vt->DeleteTextures(1, &texture);
-    return size > 0 ? size * mul : size;
-}
-
-static int
-interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
-                      vlc_fourcc_t chroma,
-                      const vlc_chroma_description_t *desc)
-{
-    (void) chroma;
-
-    GLint oneplane_texfmt, oneplane16_texfmt,
-          twoplanes_texfmt, twoplanes16_texfmt;
-
-    if (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_texture_rg"))
-    {
-        oneplane_texfmt = GL_RED;
-        oneplane16_texfmt = GL_R16;
-        twoplanes_texfmt = GL_RG;
-        twoplanes16_texfmt = GL_RG16;
-    }
-    else
-    {
-        oneplane_texfmt = GL_LUMINANCE;
-        oneplane16_texfmt = GL_LUMINANCE16;
-        twoplanes_texfmt = GL_LUMINANCE_ALPHA;
-        twoplanes16_texfmt = 0;
-    }
-
-    if (desc->pixel_size == 2)
-    {
-        if (GetTexFormatSize(interop->vt, tex_target, oneplane_texfmt,
-                             oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
-            return VLC_EGENERIC;
-    }
-
-    if (desc->plane_count == 3)
-    {
-        GLint internal = 0;
-        GLenum type = 0;
-
-        if (desc->pixel_size == 1)
-        {
-            internal = oneplane_texfmt;
-            type = GL_UNSIGNED_BYTE;
-        }
-        else if (desc->pixel_size == 2)
-        {
-            internal = oneplane16_texfmt;
-            type = GL_UNSIGNED_SHORT;
-        }
-        else
-            return VLC_EGENERIC;
-
-        assert(internal != 0 && type != 0);
-
-        interop->tex_count = 3;
-        for (unsigned i = 0; i < interop->tex_count; ++i )
-        {
-            interop->texs[i] = (struct vlc_gl_tex_cfg) {
-                { desc->p[i].w.num, desc->p[i].w.den },
-                { desc->p[i].h.num, desc->p[i].h.den },
-                internal, oneplane_texfmt, type
-            };
-        }
-    }
-    else if (desc->plane_count == 2)
-    {
-        interop->tex_count = 2;
-
-        if (desc->pixel_size == 1)
-        {
-            interop->texs[0] = (struct vlc_gl_tex_cfg) {
-                { 1, 1 }, { 1, 1 }, oneplane_texfmt, oneplane_texfmt,
-                GL_UNSIGNED_BYTE
-            };
-            interop->texs[1] = (struct vlc_gl_tex_cfg) {
-                { 1, 2 }, { 1, 2 }, twoplanes_texfmt, twoplanes_texfmt,
-                GL_UNSIGNED_BYTE
-            };
-        }
-        else if (desc->pixel_size == 2)
-        {
-            if (twoplanes16_texfmt == 0
-             || GetTexFormatSize(interop->vt, tex_target, twoplanes_texfmt,
-                                 twoplanes16_texfmt, GL_UNSIGNED_SHORT) != 16)
-                return VLC_EGENERIC;
-            interop->texs[0] = (struct vlc_gl_tex_cfg) {
-                { 1, 1 }, { 1, 1 }, oneplane16_texfmt, oneplane_texfmt,
-                GL_UNSIGNED_SHORT
-            };
-            interop->texs[1] = (struct vlc_gl_tex_cfg) {
-                { 1, 2 }, { 1, 2 }, twoplanes16_texfmt, twoplanes_texfmt,
-                GL_UNSIGNED_SHORT
-            };
-        }
-        else
-            return VLC_EGENERIC;
-    }
-    else if (desc->plane_count == 1)
-    {
-        /* Y1 U Y2 V fits in R G B A */
-        interop->tex_count = 1;
-        interop->texs[0] = (struct vlc_gl_tex_cfg) {
-            { 1, 2 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
-        };
-    }
-    else
-        return VLC_EGENERIC;
-
-    return VLC_SUCCESS;
-}
-
 static int
 tc_yuv_base_init(opengl_tex_converter_t *tc, vlc_fourcc_t chroma,
                  const vlc_chroma_description_t *desc,
@@ -245,36 +101,6 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, vlc_fourcc_t chroma,
     return VLC_SUCCESS;
 }
 
-static int
-interop_rgb_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
-                      vlc_fourcc_t chroma)
-{
-    (void) tex_target;
-
-    switch (chroma)
-    {
-        case VLC_CODEC_RGB32:
-        case VLC_CODEC_RGBA:
-            interop->texs[0] = (struct vlc_gl_tex_cfg) {
-                { 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
-            };
-            break;
-        case VLC_CODEC_BGRA: {
-            if (GetTexFormatSize(interop->vt, tex_target, GL_BGRA, GL_RGBA,
-                                 GL_UNSIGNED_BYTE) != 32)
-                return VLC_EGENERIC;
-            interop->texs[0] = (struct vlc_gl_tex_cfg) {
-                { 1, 1 }, { 1, 1 }, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE
-            };
-            break;
-        }
-        default:
-            return VLC_EGENERIC;
-    }
-    interop->tex_count = 1;
-    return VLC_SUCCESS;
-}
-
 static int
 tc_base_fetch_locations(opengl_tex_converter_t *tc, GLuint program)
 {
@@ -392,16 +218,6 @@ tc_xyz12_prepare_shader(const opengl_tex_converter_t *tc,
     tc->vt->Uniform1i(tc->uloc.Texture[0], 0);
 }
 
-static void
-interop_xyz12_init(struct vlc_gl_interop *interop)
-{
-    interop->tex_count = 1;
-    interop->tex_target = GL_TEXTURE_2D;
-    interop->texs[0] = (struct vlc_gl_tex_cfg) {
-        { 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
-    };
-}
-
 static GLuint
 xyz12_shader_init(opengl_tex_converter_t *tc)
 {
@@ -510,34 +326,6 @@ opengl_init_swizzle(const struct vlc_gl_interop *interop,
     return VLC_SUCCESS;
 }
 
-int
-opengl_interop_init_impl(struct vlc_gl_interop *interop, GLenum tex_target,
-                         vlc_fourcc_t chroma, video_color_space_t yuv_space)
-{
-    bool is_yuv = vlc_fourcc_IsYUV(chroma);
-    const vlc_chroma_description_t *desc =
-        vlc_fourcc_GetChromaDescription(chroma);
-    if (!desc)
-        return VLC_EGENERIC;
-
-    assert(!interop->fmt.p_palette);
-    interop->sw_fmt = interop->fmt;
-    interop->sw_fmt.i_chroma = chroma;
-    interop->sw_fmt.space = yuv_space;
-    interop->tex_target = tex_target;
-
-    if (chroma == VLC_CODEC_XYZ12)
-    {
-        interop_xyz12_init(interop);
-        return VLC_SUCCESS;
-    }
-
-    if (is_yuv)
-        return interop_yuv_base_init(interop, tex_target, chroma, desc);
-
-    return interop_rgb_base_init(interop, tex_target, chroma);
-}
-
 GLuint
 opengl_fragment_shader_init_impl(opengl_tex_converter_t *tc, GLenum tex_target,
                                  vlc_fourcc_t chroma, video_color_space_t yuv_space)
diff --git a/modules/video_output/opengl/interop.c b/modules/video_output/opengl/interop.c
new file mode 100644
index 0000000000..d65e55334c
--- /dev/null
+++ b/modules/video_output/opengl/interop.c
@@ -0,0 +1,241 @@
+/*****************************************************************************
+ * interop.h
+ *****************************************************************************
+ * Copyright (C) 2019 Videolabs
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+
+#include "interop.h"
+#include "internal.h"
+#include "vout_helper.h"
+
+static int GetTexFormatSize(const opengl_vtable_t *vt, int target,
+                            int tex_format, int tex_internal, int tex_type)
+{
+    if (!vt->GetTexLevelParameteriv)
+        return -1;
+
+    GLint tex_param_size;
+    int mul = 1;
+    switch (tex_format)
+    {
+        case GL_BGRA:
+            mul = 4;
+            /* fall through */
+        case GL_RED:
+        case GL_RG:
+            tex_param_size = GL_TEXTURE_RED_SIZE;
+            break;
+        case GL_LUMINANCE:
+            tex_param_size = GL_TEXTURE_LUMINANCE_SIZE;
+            break;
+        default:
+            return -1;
+    }
+    GLuint texture;
+
+    vt->GenTextures(1, &texture);
+    vt->BindTexture(target, texture);
+    vt->TexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format, tex_type, NULL);
+    GLint size = 0;
+    vt->GetTexLevelParameteriv(target, 0, tex_param_size, &size);
+
+    vt->DeleteTextures(1, &texture);
+    return size > 0 ? size * mul : size;
+}
+
+static int
+interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
+                      vlc_fourcc_t chroma,
+                      const vlc_chroma_description_t *desc)
+{
+    (void) chroma;
+
+    GLint oneplane_texfmt, oneplane16_texfmt,
+          twoplanes_texfmt, twoplanes16_texfmt;
+
+    if (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_texture_rg"))
+    {
+        oneplane_texfmt = GL_RED;
+        oneplane16_texfmt = GL_R16;
+        twoplanes_texfmt = GL_RG;
+        twoplanes16_texfmt = GL_RG16;
+    }
+    else
+    {
+        oneplane_texfmt = GL_LUMINANCE;
+        oneplane16_texfmt = GL_LUMINANCE16;
+        twoplanes_texfmt = GL_LUMINANCE_ALPHA;
+        twoplanes16_texfmt = 0;
+    }
+
+    if (desc->pixel_size == 2)
+    {
+        if (GetTexFormatSize(interop->vt, tex_target, oneplane_texfmt,
+                             oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
+            return VLC_EGENERIC;
+    }
+
+    if (desc->plane_count == 3)
+    {
+        GLint internal = 0;
+        GLenum type = 0;
+
+        if (desc->pixel_size == 1)
+        {
+            internal = oneplane_texfmt;
+            type = GL_UNSIGNED_BYTE;
+        }
+        else if (desc->pixel_size == 2)
+        {
+            internal = oneplane16_texfmt;
+            type = GL_UNSIGNED_SHORT;
+        }
+        else
+            return VLC_EGENERIC;
+
+        assert(internal != 0 && type != 0);
+
+        interop->tex_count = 3;
+        for (unsigned i = 0; i < interop->tex_count; ++i )
+        {
+            interop->texs[i] = (struct vlc_gl_tex_cfg) {
+                { desc->p[i].w.num, desc->p[i].w.den },
+                { desc->p[i].h.num, desc->p[i].h.den },
+                internal, oneplane_texfmt, type
+            };
+        }
+    }
+    else if (desc->plane_count == 2)
+    {
+        interop->tex_count = 2;
+
+        if (desc->pixel_size == 1)
+        {
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                { 1, 1 }, { 1, 1 }, oneplane_texfmt, oneplane_texfmt,
+                GL_UNSIGNED_BYTE
+            };
+            interop->texs[1] = (struct vlc_gl_tex_cfg) {
+                { 1, 2 }, { 1, 2 }, twoplanes_texfmt, twoplanes_texfmt,
+                GL_UNSIGNED_BYTE
+            };
+        }
+        else if (desc->pixel_size == 2)
+        {
+            if (twoplanes16_texfmt == 0
+             || GetTexFormatSize(interop->vt, tex_target, twoplanes_texfmt,
+                                 twoplanes16_texfmt, GL_UNSIGNED_SHORT) != 16)
+                return VLC_EGENERIC;
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                { 1, 1 }, { 1, 1 }, oneplane16_texfmt, oneplane_texfmt,
+                GL_UNSIGNED_SHORT
+            };
+            interop->texs[1] = (struct vlc_gl_tex_cfg) {
+                { 1, 2 }, { 1, 2 }, twoplanes16_texfmt, twoplanes_texfmt,
+                GL_UNSIGNED_SHORT
+            };
+        }
+        else
+            return VLC_EGENERIC;
+    }
+    else if (desc->plane_count == 1)
+    {
+        /* Y1 U Y2 V fits in R G B A */
+        interop->tex_count = 1;
+        interop->texs[0] = (struct vlc_gl_tex_cfg) {
+            { 1, 2 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
+        };
+    }
+    else
+        return VLC_EGENERIC;
+
+    return VLC_SUCCESS;
+}
+
+static int
+interop_rgb_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
+                      vlc_fourcc_t chroma)
+{
+    (void) tex_target;
+
+    switch (chroma)
+    {
+        case VLC_CODEC_RGB32:
+        case VLC_CODEC_RGBA:
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                { 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
+            };
+            break;
+        case VLC_CODEC_BGRA: {
+            if (GetTexFormatSize(interop->vt, tex_target, GL_BGRA, GL_RGBA,
+                                 GL_UNSIGNED_BYTE) != 32)
+                return VLC_EGENERIC;
+            interop->texs[0] = (struct vlc_gl_tex_cfg) {
+                { 1, 1 }, { 1, 1 }, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE
+            };
+            break;
+        }
+        default:
+            return VLC_EGENERIC;
+    }
+    interop->tex_count = 1;
+    return VLC_SUCCESS;
+}
+
+static void
+interop_xyz12_init(struct vlc_gl_interop *interop)
+{
+    interop->tex_count = 1;
+    interop->tex_target = GL_TEXTURE_2D;
+    interop->texs[0] = (struct vlc_gl_tex_cfg) {
+        { 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
+    };
+}
+
+int
+opengl_interop_init_impl(struct vlc_gl_interop *interop, GLenum tex_target,
+                         vlc_fourcc_t chroma, video_color_space_t yuv_space)
+{
+    bool is_yuv = vlc_fourcc_IsYUV(chroma);
+    const vlc_chroma_description_t *desc =
+        vlc_fourcc_GetChromaDescription(chroma);
+    if (!desc)
+        return VLC_EGENERIC;
+
+    assert(!interop->fmt.p_palette);
+    interop->sw_fmt = interop->fmt;
+    interop->sw_fmt.i_chroma = chroma;
+    interop->sw_fmt.space = yuv_space;
+    interop->tex_target = tex_target;
+
+    if (chroma == VLC_CODEC_XYZ12)
+    {
+        interop_xyz12_init(interop);
+        return VLC_SUCCESS;
+    }
+
+    if (is_yuv)
+        return interop_yuv_base_init(interop, tex_target, chroma, desc);
+
+    return interop_rgb_base_init(interop, tex_target, chroma);
+}
-- 
2.25.0.rc0



More information about the vlc-devel mailing list