]> git.sesse.net Git - ffmpeg/commitdiff
libavfilter/vf_colorspace.c: fix demarcation point of gamma linearize function
authorYonglin Luo <vincenluo@tencent.com>
Wed, 3 Jul 2019 02:05:36 +0000 (10:05 +0800)
committerVittorio Giovara <vittorio.giovara@gmail.com>
Wed, 3 Jul 2019 17:57:11 +0000 (13:57 -0400)
The linearize function (usually refered to EOTF) is the inverse of
delinearize function (usually referred to OETF). Demarcation point of
EOTF should be beta*delta, but the actual value used now in the source
code is beta.

For ITU Rec.709, they are 0.081 (0.018*4.5) and 0.018 respectively
(beta = 0.018 and delta = 4.5), and they correspond to pixel value 5
and 21 for an 8-bit image. Linearized result of pixel within that range
(5-21) will be different, but this commit will make linearize function
of the filter more accurate in the mathematical sense.

Signed-off-by: Yonglin Luo <vincenluo@tencent.com>
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
libavfilter/vf_colorspace.c

index 2120199beed8652ff181588d2b8a618528c49d18..df6efffb3dcbdac166aadd9c426e0592fcc8f03b 100644 (file)
@@ -260,9 +260,9 @@ static int fill_gamma_table(ColorSpaceContext *s)
         s->delin_lut[n] = av_clip_int16(lrint(d * 28672.0));
 
         // linearize
-        if (v <= -in_beta) {
+        if (v <= -in_beta * in_delta) {
             l = -pow((1.0 - in_alpha - v) * in_ialpha, in_igamma);
-        } else if (v < in_beta) {
+        } else if (v < in_beta * in_delta) {
             l = v * in_idelta;
         } else {
             l = pow((v + in_alpha - 1.0) * in_ialpha, in_igamma);