From 5daca13530a33164a0d84a905499fe4786bf88eb Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 8 Oct 2024 15:14:13 +0200 Subject: [PATCH] GL: compute coeffs dynamically --- src/color.c | 6 ++++++ src/color.h | 4 +++- src/video_display/gl.cpp | 8 ++++++-- src/video_display/opengl_conversions.cpp | 11 ++++++----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/color.c b/src/color.c index 1836ee96e..16f2d1873 100644 --- a/src/color.c +++ b/src/color.c @@ -150,3 +150,9 @@ get_default_cs() return get_commandline_param("color-601") != NULL ? CS_601_LIM : CS_709_LIM; } + +struct color_coeffs +compute_color_coeffs(double kr, double kb, int ycbcr_bit_depth) +{ + return (struct color_coeffs) COEFFS(ycbcr_bit_depth, kr, kb); +} diff --git a/src/color.h b/src/color.h index 53eb1812a..e1813bbc8 100644 --- a/src/color.h +++ b/src/color.h @@ -176,7 +176,9 @@ struct color_coeffs { }; const struct color_coeffs *get_color_coeffs(enum colorspace cs, int ycbcr_bit_depth); -enum colorspace get_default_cs(void); +struct color_coeffs compute_color_coeffs(double kr, double kb, + int ycbcr_bit_depth); +enum colorspace get_default_cs(void); #ifdef __cplusplus } // extern "C" diff --git a/src/video_display/gl.cpp b/src/video_display/gl.cpp index 9d017c343..54fc7f5ac 100644 --- a/src/video_display/gl.cpp +++ b/src/video_display/gl.cpp @@ -1533,8 +1533,12 @@ static GLuint gl_substitute_compile_link(const char *vprogram, const char *fprog double kr = cs_coeffs[2 * index]; double kb = cs_coeffs[2 * index + 1]; const char *placeholders[] = { "Y_SCALED_PLACEHOLDER", "R_CR_PLACEHOLDER", "G_CB_PLACEHOLDER", "G_CR_PLACEHOLDER", "B_CB_PLACEHOLDER" }; - double values[] = { Y_LIMIT_INV(8), R_CR(8,kr,kb), G_CB(8,kr,kb), G_CR(8,kr,kb), B_CB(8,kr,kb)}; - + const struct color_coeffs cfs = compute_color_coeffs(kr, kb, 8); + const double values[] = { (double) cfs.y_scale / (1 << COMP_BASE), + (double) cfs.r_cr / (1 << COMP_BASE), + (double) cfs.g_cb / (1 << COMP_BASE), + (double) cfs.g_cr / (1 << COMP_BASE), + (double) cfs.b_cb / (1 << COMP_BASE) }; for (size_t i = 0; i < sizeof placeholders / sizeof placeholders[0]; ++i) { char *tok = fp; while ((tok = strstr(fp, placeholders[i])) != nullptr) { diff --git a/src/video_display/opengl_conversions.cpp b/src/video_display/opengl_conversions.cpp index 9d6b81bb6..77ba77e6c 100644 --- a/src/video_display/opengl_conversions.cpp +++ b/src/video_display/opengl_conversions.cpp @@ -112,15 +112,16 @@ static void load_yuv_coefficients(GlProgram& program){ glUseProgram(program.get()); GLuint loc = glGetUniformLocation(program.get(), "luma_scale"); - glUniform1f(loc, Y_LIMIT_INV(8)); + const struct color_coeffs cfs = compute_color_coeffs(kr, kb, 8); + glUniform1f(loc, (double) cfs.y_scale / (1 << COMP_BASE)); loc = glGetUniformLocation(program.get(), "r_cr"); - glUniform1f(loc, R_CR(8, kr, kb)); + glUniform1f(loc, (double) cfs.r_cr / (1 << COMP_BASE)); loc = glGetUniformLocation(program.get(), "g_cr"); - glUniform1f(loc, G_CR(8, kr, kb)); + glUniform1f(loc, (double) cfs.g_cb / (1 << COMP_BASE)); loc = glGetUniformLocation(program.get(), "g_cb"); - glUniform1f(loc, G_CB(8, kr, kb)); + glUniform1f(loc, (double) cfs.g_cr / (1 << COMP_BASE)); loc = glGetUniformLocation(program.get(), "b_cb"); - glUniform1f(loc, B_CB(8, kr, kb)); + glUniform1f(loc, (double) cfs.b_cb / (1 << COMP_BASE)); } class Rendering_convertor : public Frame_convertor{