[vlc-commits] [Git][videolan/vlc][master] opengl: sw_interop: fix RGB32 mask handling
Steve Lhomme (@robUx4)
gitlab at videolan.org
Wed Sep 13 08:24:56 UTC 2023
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
3b4d89ac by Francois Cartegnie at 2023-09-13T07:57:38+00:00
opengl: sw_interop: fix RGB32 mask handling
- - - - -
1 changed file:
- modules/video_output/opengl/interop_sw.c
Changes:
=====================================
modules/video_output/opengl/interop_sw.c
=====================================
@@ -602,17 +602,31 @@ interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
static int
interop_rgb_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
- vlc_fourcc_t chroma)
+ vlc_fourcc_t chroma, bool fallback_masks)
{
switch (chroma)
{
case VLC_CODEC_RGB24:
+ if(!interop->fmt_in.i_rmask && !fallback_masks)
+ return VLC_EGENERIC;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
- { 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE
+ { 1, 1 }, { 1, 1 }, GL_RGB,
+#ifdef GL_BGR
+ interop->fmt_in.i_rmask == 0x0000ff ? GL_BGR :
+#endif
+ GL_RGB,
+ GL_UNSIGNED_BYTE
};
break;
case VLC_CODEC_RGB32:
+ if(!interop->fmt_in.i_rmask && !fallback_masks)
+ return VLC_EGENERIC;
+ if(interop->fmt_in.i_rmask == 0x0000ff00)
+ return interop_rgb_base_init(interop, tex_target, VLC_CODEC_BGRA, fallback_masks);
+ else
+ return interop_rgb_base_init(interop, tex_target, VLC_CODEC_RGBA, fallback_masks);
+
case VLC_CODEC_RGBA:
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
@@ -646,7 +660,8 @@ interop_xyz12_init(struct vlc_gl_interop *interop)
static int
opengl_interop_init(struct vlc_gl_interop *interop, GLenum tex_target,
- vlc_fourcc_t chroma, video_color_space_t yuv_space)
+ vlc_fourcc_t chroma, video_color_space_t yuv_space,
+ bool fallback_masks)
{
bool is_yuv = vlc_fourcc_IsYUV(chroma);
const vlc_chroma_description_t *desc =
@@ -656,6 +671,8 @@ opengl_interop_init(struct vlc_gl_interop *interop, GLenum tex_target,
assert(!interop->fmt_out.p_palette);
interop->fmt_out.i_chroma = chroma;
+ if(fallback_masks && !is_yuv)
+ video_format_FixRgb(&interop->fmt_out);
interop->fmt_out.space = yuv_space;
interop->tex_target = tex_target;
@@ -668,7 +685,7 @@ opengl_interop_init(struct vlc_gl_interop *interop, GLenum tex_target,
if (is_yuv)
return interop_yuv_base_init(interop, tex_target, chroma, desc);
- return interop_rgb_base_init(interop, tex_target, chroma);
+ return interop_rgb_base_init(interop, tex_target, chroma, fallback_masks);
}
static void
@@ -743,14 +760,14 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
/* Check whether the given chroma is translatable to OpenGL. */
vlc_fourcc_t i_chroma = interop->fmt_in.i_chroma;
- int ret = opengl_interop_init(interop, GL_TEXTURE_2D, i_chroma, space);
+ int ret = opengl_interop_init(interop, GL_TEXTURE_2D, i_chroma, space, false);
if (ret == VLC_SUCCESS)
goto interop_init;
if (!is_yup)
{
i_chroma = VLC_CODEC_RGBA;
- ret = opengl_interop_init(interop, GL_TEXTURE_2D, i_chroma, space);
+ ret = opengl_interop_init(interop, GL_TEXTURE_2D, i_chroma, space, false);
if (ret == VLC_SUCCESS)
goto interop_init;
}
@@ -761,7 +778,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
/* Check whether any fallback for the chroma is translatable to OpenGL. */
while (*list)
{
- ret = opengl_interop_init(interop, GL_TEXTURE_2D, *list, space);
+ ret = opengl_interop_init(interop, GL_TEXTURE_2D, *list, space, true);
if (ret == VLC_SUCCESS)
{
i_chroma = *list;
@@ -776,17 +793,38 @@ interop_init:
/* We found a chroma with matching parameters for OpenGL. The interop can
* be created. */
- if (i_chroma == VLC_CODEC_RGB32)
+ interop->fmt_in.i_chroma = i_chroma;
+
+ switch(i_chroma)
{
-#if defined(WORDS_BIGENDIAN)
- interop->fmt_out.i_rmask = 0xff000000;
- interop->fmt_out.i_gmask = 0x00ff0000;
- interop->fmt_out.i_bmask = 0x0000ff00;
-#else
- interop->fmt_out.i_rmask = 0x000000ff;
- interop->fmt_out.i_gmask = 0x0000ff00;
- interop->fmt_out.i_bmask = 0x00ff0000;
+ case VLC_CODEC_RGB32:
+ /* Ensure we only request and forward RGBX or BGRX in memory order */
+ if(interop->fmt_in.i_rmask != 0xff000000 && // RGBX
+ interop->fmt_in.i_rmask != 0x0000ff00) // BGRX
+ {
+ interop->fmt_in.i_rmask = 0xff000000;
+ interop->fmt_in.i_gmask = 0x00ff0000;
+ interop->fmt_in.i_bmask = 0x0000ff00;
+ }
+ break;
+ case VLC_CODEC_RGB24:
+ /* Ensure we only request and forward RGB or BGR in memory order */
+ if(interop->fmt_in.i_rmask != 0xff0000
+#ifdef GL_BGR
+ && interop->fmt_in.i_rmask != 0x0000ff
#endif
+ )
+ {
+ interop->fmt_in.i_rmask = 0xff0000;
+ interop->fmt_in.i_gmask = 0x00ff00;
+ interop->fmt_in.i_bmask = 0x0000ff;
+ }
+ break;
+ default:
+ interop->fmt_in.i_rmask = 0;
+ interop->fmt_in.i_gmask = 0;
+ interop->fmt_in.i_bmask = 0;
+ break;
}
static const struct vlc_gl_interop_ops ops = {
@@ -795,7 +833,6 @@ interop_init:
.close = opengl_interop_generic_deinit,
};
interop->ops = &ops;
- interop->fmt_in.i_chroma = i_chroma;
if (allow_dr && priv->has_unpack_subimage)
{
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/3b4d89ac00f15681cb49368f051f666c6cdd0296
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/3b4d89ac00f15681cb49368f051f666c6cdd0296
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list