mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-21 21:40:20 +00:00
GL: compute coeffs dynamically
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user