X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=gamma_compression_effect.cpp;h=83489be5dbf669bcf692e3e497394b58ee22655b;hp=3d4fd12d39af9e869b064c2603b73796026fb5e8;hb=eff011224abc5dc81f801f3ea44572287a55bcac;hpb=85f9719bf3519b1f1942738d11601584f5d38725 diff --git a/gamma_compression_effect.cpp b/gamma_compression_effect.cpp index 3d4fd12..83489be 100644 --- a/gamma_compression_effect.cpp +++ b/gamma_compression_effect.cpp @@ -1,17 +1,20 @@ -#include -#include #include -#include "gamma_compression_effect.h" #include "effect_util.h" +#include "gamma_compression_effect.h" #include "util.h" using namespace std; +namespace movit { + GammaCompressionEffect::GammaCompressionEffect() : destination_curve(GAMMA_LINEAR) { register_int("destination_curve", (int *)&destination_curve); + register_uniform_float("linear_scale", &uniform_linear_scale); + register_uniform_float_array("c", uniform_c, 5); + register_uniform_float("beta", &uniform_beta); } string GammaCompressionEffect::output_fragment_shader() @@ -73,25 +76,25 @@ void GammaCompressionEffect::set_gl_state(GLuint glsl_program_num, const string // β = 0.0031308, ɣ = 1/2.4. // maxerror = 0.000785 = 0.200 * 255 // error at 1.0 = 0.000078 = 0.020 * 255 - set_uniform_float(glsl_program_num, prefix, "linear_scale", 12.92); - set_uniform_float(glsl_program_num, prefix, "c0", -0.03679675939); - set_uniform_float(glsl_program_num, prefix, "c1", 1.443803073); - set_uniform_float(glsl_program_num, prefix, "c2", -0.9239780987); - set_uniform_float(glsl_program_num, prefix, "c3", 0.8060491596); - set_uniform_float(glsl_program_num, prefix, "c4", -0.2891558568); - set_uniform_float(glsl_program_num, prefix, "beta", 0.0031308); + uniform_linear_scale = 12.92; + uniform_c[0] = -0.03679675939; + uniform_c[1] = 1.443803073; + uniform_c[2] = -0.9239780987; + uniform_c[3] = 0.8060491596; + uniform_c[4] = -0.2891558568; + uniform_beta = 0.0031308; } if (destination_curve == GAMMA_REC_709) { // Also includes Rec. 601, and 10-bit Rec. 2020. // Rec. 2020, page 3; ɑ = 1.099, β = 0.018, ɣ = 0.45. // maxerror = 0.000131 = 0.033 * 255 = 0.134 * 1023 // error at 1.0 = 0.000013 = 0.003 * 255 = 0.013 * 1023 - set_uniform_float(glsl_program_num, prefix, "linear_scale", 4.5); - set_uniform_float(glsl_program_num, prefix, "c0", -0.08541688528); - set_uniform_float(glsl_program_num, prefix, "c1", 1.292793370); - set_uniform_float(glsl_program_num, prefix, "c2", -0.4070417645); - set_uniform_float(glsl_program_num, prefix, "c3", 0.2923891828); - set_uniform_float(glsl_program_num, prefix, "c4", -0.09273699351); - set_uniform_float(glsl_program_num, prefix, "beta", 0.018); + uniform_linear_scale = 4.5; + uniform_c[0] = -0.08541688528; + uniform_c[1] = 1.292793370; + uniform_c[2] = -0.4070417645; + uniform_c[3] = 0.2923891828; + uniform_c[4] = -0.09273699351; + uniform_beta = 0.018; } if (destination_curve == GAMMA_REC_2020_12_BIT) { // Rec. 2020, page 3; ɑ = 1.0993, β = 0.0181, ɣ = 0.45. @@ -103,12 +106,14 @@ void GammaCompressionEffect::set_gl_state(GLuint glsl_program_num, const string // bit. (Removing the constraint for x=1 will only take this down // from 0.553 to 0.501; adding a fifth order can get it down to // 0.167, although this assumes working in fp64 and not fp32.) - set_uniform_float(glsl_program_num, prefix, "linear_scale", 4.5); - set_uniform_float(glsl_program_num, prefix, "c0", -0.08569685663); - set_uniform_float(glsl_program_num, prefix, "c1", 1.293000900); - set_uniform_float(glsl_program_num, prefix, "c2", -0.4067291321); - set_uniform_float(glsl_program_num, prefix, "c3", 0.2919741179); - set_uniform_float(glsl_program_num, prefix, "c4", -0.09256205770); - set_uniform_float(glsl_program_num, prefix, "beta", 0.0181); + uniform_linear_scale = 4.5; + uniform_c[0] = -0.08569685663; + uniform_c[1] = 1.293000900; + uniform_c[2] = -0.4067291321; + uniform_c[3] = 0.2919741179; + uniform_c[4] = -0.09256205770; + uniform_beta = 0.0181; } } + +} // namespace movit