+// Note: This file does not have its own unit test; it is tested mainly
+// through YCbCrInput's unit tests.
+
#include <Eigen/Core>
#include <Eigen/LU>
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 <ycbcr_format>, compute the values needed to turn Y'CbCr into R'G'B';
}
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;
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;