X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=ycbcr.cpp;h=dc223e7441c845cf7c1449e439862c5732efc71f;hp=08c8cd25d4603c43b092abe078b6d98815a466e9;hb=5f81c29e307735bbadb3c0cb06500af627b2e57a;hpb=54c233d62900640a60a25db95123a5fc37b95d66 diff --git a/ycbcr.cpp b/ycbcr.cpp index 08c8cd2..dc223e7 100644 --- a/ycbcr.cpp +++ b/ycbcr.cpp @@ -48,7 +48,12 @@ namespace movit { float compute_chroma_offset(float pos, unsigned subsampling_factor, unsigned resolution) { float local_chroma_pos = (0.5 + pos * (subsampling_factor - 1)) / subsampling_factor; - return (0.5 - local_chroma_pos) / resolution; + if (fabs(local_chroma_pos - 0.5) < 1e-10) { + // x + (-0) can be optimized away freely, as opposed to x + 0. + return -0.0; + } else { + return (0.5 - local_chroma_pos) / resolution; + } } // Given , compute the values needed to turn Y'CbCr into R'G'B'; @@ -85,6 +90,7 @@ void compute_ycbcr_matrix(YCbCrFormat ycbcr_format, float* offset, Matrix3d* ycb } if (ycbcr_format.full_range) { + // TODO: Use num_levels. offset[0] = 0.0 / 255.0; offset[1] = 128.0 / 255.0; offset[2] = 128.0 / 255.0; @@ -94,6 +100,7 @@ void compute_ycbcr_matrix(YCbCrFormat ycbcr_format, float* offset, Matrix3d* ycb scale[2] = 1.0; } else { // Rec. 601, page 4; Rec. 709, page 19; Rec. 2020, page 4. + // TODO: Use num_levels. offset[0] = 16.0 / 255.0; offset[1] = 128.0 / 255.0; offset[2] = 128.0 / 255.0;