Commit c45ece97 authored by Thomas Guillem's avatar Thomas Guillem

opengl: converters: change chroma directly in fmt

parent b4125496
......@@ -193,8 +193,7 @@ tc_anop_release(const opengl_tex_converter_t *tc)
}
GLuint
opengl_tex_converter_anop_init(const video_format_t *fmt,
opengl_tex_converter_t *tc)
opengl_tex_converter_anop_init(video_format_t *fmt, opengl_tex_converter_t *tc)
{
if (fmt->i_chroma != VLC_CODEC_ANDROID_OPAQUE
|| !tc->gl->surface->handle.anativewindow)
......@@ -219,7 +218,6 @@ opengl_tex_converter_anop_init(const video_format_t *fmt,
tc->tex_count = 1;
tc->texs[0] = (struct opengl_tex_cfg) { { 1, 1 }, { 1, 1 } };
tc->chroma = VLC_CODEC_ANDROID_OPAQUE;
tc->tex_target = GL_TEXTURE_EXTERNAL_OES;
/* The transform Matrix (uSTMatrix) given by the SurfaceTexture is not
......
......@@ -229,8 +229,7 @@ tc_cvpx_release(const opengl_tex_converter_t *tc)
}
GLuint
opengl_tex_converter_cvpx_init(const video_format_t *fmt,
opengl_tex_converter_t *tc)
opengl_tex_converter_cvpx_init(video_format_t *fmt, opengl_tex_converter_t *tc)
{
if (fmt->i_chroma != VLC_CODEC_CVPX_UYVY
&& fmt->i_chroma != VLC_CODEC_CVPX_NV12
......@@ -308,7 +307,6 @@ opengl_tex_converter_cvpx_init(const video_format_t *fmt,
}
tc->priv = priv;
tc->chroma = fmt->i_chroma;
tc->pf_get_pool = tc_cvpx_get_pool;
tc->pf_update = tc_cvpx_update;
tc->pf_release = tc_cvpx_release;
......
......@@ -264,7 +264,6 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
tc->yuv_coefficients[i*4+j] = j < 3 ? correction * matrix[j*4+i] : 0.f;
}
tc->chroma = chroma;
tc->yuv_color = true;
*swap_uv = chroma == VLC_CODEC_YV12 || chroma == VLC_CODEC_YV9 ||
......@@ -273,15 +272,14 @@ tc_yuv_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
}
static int
tc_rgba_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
vlc_fourcc_t chroma)
tc_rgb_base_init(opengl_tex_converter_t *tc, GLenum tex_target,
vlc_fourcc_t chroma)
{
(void) tex_target;
if (chroma != VLC_CODEC_RGBA && chroma != VLC_CODEC_RGB32)
if (chroma != VLC_CODEC_RGB32)
return VLC_EGENERIC;
tc->chroma = VLC_CODEC_RGBA;
tc->tex_count = 1;
tc->texs[0] = (struct opengl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
......@@ -361,7 +359,7 @@ opengl_fragment_shader_init(opengl_tex_converter_t *tc, GLenum tex_target,
ret = tc_yuv_base_init(tc, tex_target, chroma, yuv_space,
&yuv_swap_uv, swizzle_per_tex);
else
ret = tc_rgba_base_init(tc, tex_target, chroma);
ret = tc_rgb_base_init(tc, tex_target, chroma);
if (ret != VLC_SUCCESS)
return 0;
......@@ -993,7 +991,6 @@ tc_xyz12_prepare_shader(const opengl_tex_converter_t *tc,
static GLuint
xyz12_shader_init(opengl_tex_converter_t *tc)
{
tc->chroma = VLC_CODEC_XYZ12;
tc->tex_count = 1;
tc->tex_target = GL_TEXTURE_2D;
tc->texs[0] = (struct opengl_tex_cfg) {
......@@ -1044,8 +1041,7 @@ xyz12_shader_init(opengl_tex_converter_t *tc)
}
static GLuint
generic_init(const video_format_t *fmt, opengl_tex_converter_t *tc,
bool allow_dr)
generic_init(video_format_t *fmt, opengl_tex_converter_t *tc, bool allow_dr)
{
const vlc_chroma_description_t *desc =
vlc_fourcc_GetChromaDescription(fmt->i_chroma);
......@@ -1077,10 +1073,29 @@ generic_init(const video_format_t *fmt, opengl_tex_converter_t *tc,
}
const vlc_fourcc_t *list = get_fallback(fmt->i_chroma);
while (*list && fragment_shader == 0)
while (*list)
{
fragment_shader =
opengl_fragment_shader_init(tc, GL_TEXTURE_2D, *list, space);
if (fragment_shader != 0)
{
fmt->i_chroma = *list;
if (fmt->i_chroma == VLC_CODEC_RGB32)
{
#if defined(WORDS_BIGENDIAN)
fmt->i_rmask = 0xff000000;
fmt->i_gmask = 0x00ff0000;
fmt->i_bmask = 0x0000ff00;
#else
fmt->i_rmask = 0x000000ff;
fmt->i_gmask = 0x0000ff00;
fmt->i_bmask = 0x00ff0000;
#endif
video_format_FixRgb(fmt);
}
break;
}
list++;
}
}
......@@ -1151,11 +1166,13 @@ GLuint
opengl_tex_converter_subpictures_init(const video_format_t *fmt,
opengl_tex_converter_t *tc)
{
return generic_init(fmt, tc, false);
video_format_t sub_fmt = *fmt;
sub_fmt.i_chroma = VLC_CODEC_RGB32;
return generic_init(&sub_fmt, tc, false);
}
GLuint
opengl_tex_converter_generic_init(const video_format_t *fmt,
opengl_tex_converter_generic_init(video_format_t *fmt,
opengl_tex_converter_t *tc)
{
return generic_init(fmt, tc, true);
......
......@@ -159,11 +159,12 @@ typedef struct opengl_tex_converter_t opengl_tex_converter_t;
* The implementation should initialize every members of the struct in regards
* of the video format.
*
* \param fmt video format
* \param fmt video format, fmt->i_chroma can be modified in order to match a
* shader
* \param fc OpenGL tex converter that needs to be filled on success
* \return VLC_SUCCESS or a VLC error
*/
typedef GLuint (*opengl_tex_converter_init_cb)(const video_format_t *fmt,
typedef GLuint (*opengl_tex_converter_init_cb)(video_format_t *fmt,
opengl_tex_converter_t *fc);
/*
......@@ -180,9 +181,6 @@ struct opengl_tex_converter_t
/* Set it to request a special orientation (by default = fmt.orientation) */
video_orientation_t orientation;
/* Video chroma used by this configuration, cannot be 0 */
vlc_fourcc_t chroma;
/* Number of textures, cannot be 0 */
unsigned tex_count;
......@@ -330,18 +328,18 @@ opengl_tex_converter_subpictures_init(const video_format_t *,
opengl_tex_converter_t *);
GLuint
opengl_tex_converter_generic_init(const video_format_t *,
opengl_tex_converter_generic_init(video_format_t *,
opengl_tex_converter_t *);
#ifdef __ANDROID__
GLuint
opengl_tex_converter_anop_init(const video_format_t *,
opengl_tex_converter_anop_init(video_format_t *,
opengl_tex_converter_t *);
#endif
#ifdef VLCGL_CONV_CVPX
GLuint
opengl_tex_converter_cvpx_init(const video_format_t *fmt,
opengl_tex_converter_cvpx_init(video_format_t *fmt,
opengl_tex_converter_t *tc);
#endif
......
......@@ -479,8 +479,7 @@ opengl_link_program(struct prgm *prgm, GLuint fragment_shader)
int charsWritten;
tc->api->GetProgramInfoLog(prgm->id, infoLength, &charsWritten,
infolog);
msg_Err(tc->gl, "shader program %4.4s: %s",
(const char *) &tc->chroma, infolog);
msg_Err(tc->gl, "shader program: %s", infolog);
free(infolog);
}
......@@ -489,8 +488,7 @@ opengl_link_program(struct prgm *prgm, GLuint fragment_shader)
tc->api->GetProgramiv(prgm->id, GL_LINK_STATUS, &link_status);
if (link_status == GL_FALSE)
{
msg_Err(tc->gl, "Unable to use program %4.4s\n",
(const char *) &tc->chroma);
msg_Err(tc->gl, "Unable to use program");
goto error;
}
}
......@@ -531,8 +529,7 @@ opengl_link_program(struct prgm *prgm, GLuint fragment_shader)
assert(ret == VLC_SUCCESS);
if (ret != VLC_SUCCESS)
{
msg_Err(tc->gl, "Unable to get locations from %4.4s tex_conv\n",
(const char *) &tc->chroma);
msg_Err(tc->gl, "Unable to get locations from tex_conv");
goto error;
}
......@@ -651,19 +648,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
HasExtension(extensions, "GL_APPLE_texture_2D_limited_npot");
#endif
/* Initialize with default chroma */
vgl->fmt = *fmt;
vgl->fmt.i_chroma = VLC_CODEC_RGB32;
# if defined(WORDS_BIGENDIAN)
vgl->fmt.i_rmask = 0xff000000;
vgl->fmt.i_gmask = 0x00ff0000;
vgl->fmt.i_bmask = 0x0000ff00;
# else
vgl->fmt.i_rmask = 0x000000ff;
vgl->fmt.i_gmask = 0x0000ff00;
vgl->fmt.i_bmask = 0x00ff0000;
# endif
vgl->prgm = &vgl->prgms[0];
vgl->sub_prgm = &vgl->prgms[1];
......@@ -675,7 +659,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
};
/* RGBA is needed for subpictures or for non YUV pictures */
GLuint fshader = opengl_tex_converter_subpictures_init(&vgl->fmt,
GLuint fshader = opengl_tex_converter_subpictures_init(fmt,
&vgl->sub_prgm->tc);
int ret = opengl_link_program(vgl->sub_prgm, fshader);
if (ret != VLC_SUCCESS)
......@@ -698,12 +682,12 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
ret = opengl_link_program(vgl->prgm, fshader);
if (ret == VLC_SUCCESS)
{
assert(vgl->prgm->tc.chroma != 0 && vgl->prgm->tc.tex_target != 0 &&
assert(vgl->prgm->tc.tex_target != 0 &&
vgl->prgm->tc.tex_count > 0 && vgl->prgm->tc.pf_update != NULL &&
vgl->prgm->tc.pf_fetch_locations != NULL &&
vgl->prgm->tc.pf_prepare_shader != NULL);
vgl->fmt = *fmt;
vgl->fmt.i_chroma = vgl->prgm->tc.chroma;
break;
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment