X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=ycbcr_conversion_effect.cpp;h=64d23cd3d675ab26758bce38f804ce775d44cada;hp=fd2cd07fe389bef86bcb2347a6447af81cfebf77;hb=90ac46cdc5845432df13385f946c63b5496c685e;hpb=25162b5457057af3ebcc1649571eeeb923e90098 diff --git a/ycbcr_conversion_effect.cpp b/ycbcr_conversion_effect.cpp index fd2cd07..64d23cd 100644 --- a/ycbcr_conversion_effect.cpp +++ b/ycbcr_conversion_effect.cpp @@ -15,8 +15,8 @@ using namespace Eigen; namespace movit { -YCbCrConversionEffect::YCbCrConversionEffect(const YCbCrFormat &ycbcr_format) - : ycbcr_format(ycbcr_format) +YCbCrConversionEffect::YCbCrConversionEffect(const YCbCrFormat &ycbcr_format, GLenum type) + : ycbcr_format(ycbcr_format), type(type) { register_uniform_mat3("ycbcr_matrix", &uniform_ycbcr_matrix); register_uniform_vec3("offset", uniform_offset); @@ -37,7 +37,8 @@ void YCbCrConversionEffect::set_gl_state(GLuint glsl_program_num, const string & Effect::set_gl_state(glsl_program_num, prefix, sampler_num); Matrix3d ycbcr_to_rgb; - compute_ycbcr_matrix(ycbcr_format, uniform_offset, &ycbcr_to_rgb); + double scale_factor; + compute_ycbcr_matrix(ycbcr_format, uniform_offset, &ycbcr_to_rgb, type, &scale_factor); uniform_ycbcr_matrix = ycbcr_to_rgb.inverse(); @@ -47,7 +48,7 @@ void YCbCrConversionEffect::set_gl_state(GLuint glsl_program_num, const string & } else { uniform_clamp_range = true; - if (ycbcr_format.num_levels == 256) { // 8-bit. + if (ycbcr_format.num_levels == 0 || ycbcr_format.num_levels == 256) { // 8-bit. // These limits come from BT.601 page 8, or BT.709, page 5. uniform_ycbcr_min[0] = 16.0 / 255.0; uniform_ycbcr_min[1] = 16.0 / 255.0; @@ -74,6 +75,9 @@ void YCbCrConversionEffect::set_gl_state(GLuint glsl_program_num, const string & } else { assert(false); } + uniform_ycbcr_min[0] /= scale_factor; + uniform_ycbcr_min[1] /= scale_factor; + uniform_ycbcr_min[2] /= scale_factor; } }