-#include <math.h>
-#include <string.h>
#include <assert.h>
-#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()
// β = 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.
// 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