[FFmpeg-devel] [RFC] Bug in colorspace.c

Hendrik Leppkes h.leppkes at gmail.com
Wed Jun 29 07:34:09 EEST 2022


On Tue, Jun 28, 2022 at 11:38 PM Soft Works <softworkz at hotmail.com> wrote:
>
> Hi,
>
> in colorspace.c, there are two functions with contradicting behavior
> regarding reading/writing the max_luminance value from/to
> AVMasteringDisplayMetadata. The code seems to be unchanged since
> 3 years:
>
>
> 1. ff_determine_signal_peak()
>
>     sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
>     if (!peak && sd) {
>         AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;
>         if (metadata->has_luminance)
>             peak = av_q2d(metadata->max_luminance) / REFERENCE_WHITE;
>     }
>
>
> 2. ff_update_hdr_metadata()
>
>     sd = av_frame_get_side_data(in, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
>     if (sd) {
>         AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;
>         if (metadata->has_luminance)
>             metadata->max_luminance = av_d2q(peak * REFERENCE_WHITE, 10000);
>     }
>
>
> The latter function writes the value as an AVRational with a denominator of
> 10000, but the former function doesn't multiply the value by 10000.
>

These two calls round-trip just fine. The 10000 is not a forced
denominator, divisor, or multiplier, it is the maximum denominator it
is allowed to use to convert the floating point value to a rational.
av_d2q will ensure the value is properly scaled.

- Hendrik


More information about the ffmpeg-devel mailing list