[FFmpeg-trac] #7978(undetermined:reopened): inaccurate conversion from YCbCr Narrow range to RGB Full range

FFmpeg trac at avcodec.org
Wed Mar 8 16:27:44 EET 2023

#7978: inaccurate conversion from YCbCr Narrow range to RGB Full range
             Reporter:  cepesh       |                    Owner:  (none)
                 Type:  defect       |                   Status:  reopened
             Priority:  normal       |                Component:
                                     |  undetermined
              Version:  unspecified  |               Resolution:
             Keywords:               |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
Comment (by François-Xavier Thomas):

 I've hit the same issue in https://stackoverflow.com/questions/75260266,
 and found this ticket while trying to answer it, and I was wondering is
 there were anybody currently working on updating this inside ffmpeg? Is
 there any way I can help?

 > I suppose the idea that 10 bit value in png 16 bit per component will be
 just multiply with 64 is wrong.

 At least in my mind, all standards I know of assume 255 (8-bit) = 1023
 (10-bit) = 65535 (16-bit) = 100% = 1.0 (float)...

 For 10-bit signals the multiplication factor should therefore be slightly
 different (65535/1023 = 64.0616...). In binary math I think the closest is
 `(v << 6) + (v >> 4)` with `v` a 10-bit integer).

 (Using a factor of 64 is indeed a common misconception: the roundoff error
 is at most 1 if the final output is downconverted to a smaller integer
 type, so it's not easily visible, especially combined with lossy encoding
 and chroma subsampling.)

 > Now, as described in ITU docs it is normal to use 1020 instead of 1023
 since that is what naïve implementation will give.

 Could you clarify which ITU recommendation (and which version) you were
 referring to, if you still have it?

 At least in the case of ITU-R BT.2020-2, I believe this is an incorrect
 interpretation ; this recommendation only provides specifications for
 narrow-range signals, for which Y'=940 corresponds to 100% signal, and the
 maximum value of 1019 is still valid but maps to a signal that is much
 greater than 100%. It does not cover full-range conversions like what PNG
 images are supposed to contain.

 ITU-R BT.2100 does add an explicit definition for full-range signals,
 where 100% = 1023 (in 10-bit), which seem to correspond to the usual
 assumption that 100% = maximum of the data type.
Ticket URL: <https://trac.ffmpeg.org/ticket/7978#comment:10>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list