X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=ycbcr_conversion_effect.cpp;h=6d3e909c819f73fa339b2e1f16bbac3a3406d44a;hp=8d11acfd4abc08f214c5a1e93f90f02887169d69;hb=490f53088d8cc2bf9590f0822cbd7e8bc73be55a;hpb=e8499e3e9892a74c7882af4be14ccdc1e3d92c2b diff --git a/ycbcr_conversion_effect.cpp b/ycbcr_conversion_effect.cpp index 8d11acf..6d3e909 100644 --- a/ycbcr_conversion_effect.cpp +++ b/ycbcr_conversion_effect.cpp @@ -47,14 +47,33 @@ void YCbCrConversionEffect::set_gl_state(GLuint glsl_program_num, const string & } else { uniform_clamp_range = true; - // These limits come from BT.601 page 8, or BT.701, page 5. - // TODO: Use num_levels. Currently we support 8-bit levels only. - uniform_ycbcr_min[0] = 16.0 / 255.0; - uniform_ycbcr_min[1] = 16.0 / 255.0; - uniform_ycbcr_min[2] = 16.0 / 255.0; - uniform_ycbcr_max[0] = 235.0 / 255.0; - uniform_ycbcr_max[1] = 240.0 / 255.0; - uniform_ycbcr_max[2] = 240.0 / 255.0; + 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; + uniform_ycbcr_min[2] = 16.0 / 255.0; + uniform_ycbcr_max[0] = 235.0 / 255.0; + uniform_ycbcr_max[1] = 240.0 / 255.0; + uniform_ycbcr_max[2] = 240.0 / 255.0; + } else if (ycbcr_format.num_levels == 1024) { // 10-bit. + // BT.709, page 5, or BT.2020, page 6. + uniform_ycbcr_min[0] = 64.0 / 1023.0; + uniform_ycbcr_min[1] = 64.0 / 1023.0; + uniform_ycbcr_min[2] = 64.0 / 1023.0; + uniform_ycbcr_max[0] = 940.0 / 1023.0; + uniform_ycbcr_max[1] = 960.0 / 1023.0; + uniform_ycbcr_max[2] = 960.0 / 1023.0; + } else if (ycbcr_format.num_levels == 4096) { // 12-bit. + // BT.2020, page 6. + uniform_ycbcr_min[0] = 256.0 / 4095.0; + uniform_ycbcr_min[1] = 256.0 / 4095.0; + uniform_ycbcr_min[2] = 256.0 / 4095.0; + uniform_ycbcr_max[0] = 3760.0 / 4095.0; + uniform_ycbcr_max[1] = 3840.0 / 4095.0; + uniform_ycbcr_max[2] = 3840.0 / 4095.0; + } else { + assert(false); + } } }