[vlc-devel] [PATCH] opengl: Addition of XYZ to RGB conversion in GLSL

Jean-Baptiste Kempf jb at videolan.org
Mon Jun 24 19:28:14 CEST 2013


This gives:
../../../modules/video_output/opengl.c:548:37: erreur: ‘GL_RGB16_SNORM’ 
undeclared (first use in this function)

for me.

Le 21/06/2013 14:55, Nicolas Bertrand a écrit :
> ---
>   modules/video_output/opengl.c |   75 ++++++++++++++++++++++++++++++++++++-----
>   1 file changed, 67 insertions(+), 8 deletions(-)
>
> diff --git a/modules/video_output/opengl.c b/modules/video_output/opengl.c
> index c9d9df2..67fe4f2 100644
> --- a/modules/video_output/opengl.c
> +++ b/modules/video_output/opengl.c
> @@ -340,6 +340,46 @@ static void BuildRGBAFragmentShader(vout_display_opengl_t *vgl,
>       vgl->ShaderSource(*shader, 1, &code, NULL);
>       vgl->CompileShader(*shader);
>   }
> +
> +static void BuildXYZFragmentShader(vout_display_opengl_t *vgl,
> +                                   GLint *shader)
> +{
> +    /* Shader for XYZ to RGB correction
> +     * 3 steps :
> +     *  - XYZ gamma correction
> +     *  - XYZ to RGB matrix conversion
> +     *  - reverse RGB gamma correction
> +     */
> +      const char *code =
> +        "#version " GLSL_VERSION "\n"
> +        PRECISION
> +        "uniform sampler2D Texture0;"
> +        "uniform vec4 xyz_gamma = vec4(2.6);"
> +        "uniform vec4 rgb_gamma = vec4(1.0/2.2);"
> +        // WARN: matrix Is filled column by column (not row !)
> +        "uniform mat4 matrix_xyz_rgb = mat4("
> +        "    3.240454 , -0.9692660, 0.0556434, 0.0,"
> +        "   -1.5371385,  1.8760108, -0.2040259, 0.0,"
> +        "    -0.4985314, 0.0415560, 1.0572252,  0.0,"
> +        "    0.0,      0.0,         0.0,        1.0 "
> +        " );"
> +
> +        "varying vec4 TexCoord0;"
> +        "void main()"
> +        "{ "
> +        " vec4 v_in, v_out;"
> +        " v_in  = texture2D(Texture0, TexCoord0.st);"
> +        " v_in = pow(v_in, xyz_gamma);"
> +        " v_out = matrix_xyz_rgb * v_in ;"
> +        " v_out = pow(v_out, rgb_gamma) ;"
> +        " v_out = clamp(v_out, 0.0, 1.0) ;"
> +        " gl_FragColor = v_out;"
> +        "}";
> +    *shader = vgl->CreateShader(GL_FRAGMENT_SHADER);
> +    vgl->ShaderSource(*shader, 1, &code, NULL);
> +    vgl->CompileShader(*shader);
> +}
> +
>   #endif
>
>   vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
> @@ -465,6 +505,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>       vgl->tex_type     = GL_UNSIGNED_BYTE;
>       /* Use YUV if possible and needed */
>       bool need_fs_yuv = false;
> +    bool need_fs_xyz = false;
>       bool need_fs_rgba = USE_OPENGL_ES == 2;
>       float yuv_range_correction = 1.0;
>
> @@ -498,6 +539,15 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>           }
>       }
>
> +    if (fmt->i_chroma == VLC_CODEC_XYZ12) {
> +        const vlc_chroma_description_t *dsc = vlc_fourcc_GetChromaDescription(fmt->i_chroma);
> +                need_fs_xyz       = true;
> +                vgl->fmt          = *fmt;
> +                vgl->fmt.i_chroma = VLC_CODEC_XYZ12;
> +                vgl->tex_format   = GL_RGB;
> +                vgl->tex_internal = GL_RGB16_SNORM;
> +                vgl->tex_type     = GL_UNSIGNED_SHORT;
> +    }
>       vgl->chroma = vlc_fourcc_GetChromaDescription(vgl->fmt.i_chroma);
>       vgl->use_multitexture = vgl->chroma->plane_count > 1;
>
> @@ -521,10 +571,14 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
>       vgl->shader[1] =
>       vgl->shader[2] = -1;
>       vgl->local_count = 0;
> -    if (supports_shaders && (need_fs_yuv || need_fs_rgba)) {
> +    if (supports_shaders && (need_fs_yuv || need_fs_xyz|| need_fs_rgba)) {
>   #ifdef SUPPORTS_SHADERS
> -        BuildYUVFragmentShader(vgl, &vgl->shader[0], &vgl->local_count,
> -                               vgl->local_value, fmt, yuv_range_correction);
> +        if (need_fs_xyz)
> +            BuildXYZFragmentShader(vgl, &vgl->shader[0]);
> +        else
> +            BuildYUVFragmentShader(vgl, &vgl->shader[0], &vgl->local_count,
> +                                vgl->local_value, fmt, yuv_range_correction);
> +
>           BuildRGBAFragmentShader(vgl, &vgl->shader[1]);
>           BuildVertexShader(vgl, &vgl->shader[2]);
>
> @@ -923,10 +977,15 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
>   {
>       vgl->UseProgram(vgl->program[program]);
>       if (program == 0) {
> -        vgl->Uniform4fv(vgl->GetUniformLocation(vgl->program[0], "Coefficient"), 4, vgl->local_value);
> -        vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture0"), 0);
> -        vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture1"), 1);
> -        vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture2"), 2);
> +        if (vgl->chroma->plane_count == 3) {
> +            vgl->Uniform4fv(vgl->GetUniformLocation(vgl->program[0], "Coefficient"), 4, vgl->local_value);
> +            vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture0"), 0);
> +            vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture1"), 1);
> +            vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture2"), 2);
> +        }
> +        else if (vgl->chroma->plane_count == 1) {
> +            vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[0], "Texture0"), 0);
> +        }
>       } else {
>           vgl->Uniform1i(vgl->GetUniformLocation(vgl->program[1], "Texture0"), 0);
>           vgl->Uniform4f(vgl->GetUniformLocation(vgl->program[1], "FillColor"), 1.0f, 1.0f, 1.0f, 1.0f);
> @@ -1001,7 +1060,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
>       }
>
>   #ifdef SUPPORTS_SHADERS
> -    if (vgl->program[0] && vgl->chroma->plane_count == 3)
> +    if (vgl->program[0] && (vgl->chroma->plane_count == 3 || vgl->chroma->plane_count == 1))
>           DrawWithShaders(vgl, left, top, right, bottom, 0);
>       else if (vgl->program[1] && vgl->chroma->plane_count == 1)
>           DrawWithShaders(vgl, left, top, right, bottom, 1);
>


-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device



More information about the vlc-devel mailing list