diff options
author | Niklas Haas <git@haasn.dev> | 2024-11-30 14:50:07 +0100 |
---|---|---|
committer | Niklas Haas <git@haasn.dev> | 2024-12-23 12:33:43 +0100 |
commit | 7432fa19cdd014bcc120eb8e403ceb301bb5d0d2 (patch) | |
tree | 25aa545db6ffd8079d70f498b8baf087ad9326d9 /libswscale/utils.c | |
parent | 5b21b7f52c7a306e4a087f4822089e29d3b8a709 (diff) | |
download | ffmpeg-7432fa19cdd014bcc120eb8e403ceb301bb5d0d2.tar.gz |
swscale/utils: read HDR mastering metadata from AVFrame
Diffstat (limited to 'libswscale/utils.c')
-rw-r--r-- | libswscale/utils.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/libswscale/utils.c b/libswscale/utils.c index bc2a7b602c..191cdf889c 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -46,6 +46,7 @@ #include "libavutil/imgutils.h" #include "libavutil/intreadwrite.h" #include "libavutil/libm.h" +#include "libavutil/mastering_display_metadata.h" #include "libavutil/mathematics.h" #include "libavutil/mem.h" #include "libavutil/opt.h" @@ -2655,6 +2656,7 @@ SwsFormat ff_fmt_from_frame(const AVFrame *frame, int field) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); const AVColorPrimariesDesc *primaries; + AVFrameSideData *sd; SwsFormat fmt = { .width = frame->width, @@ -2727,6 +2729,29 @@ SwsFormat ff_fmt_from_frame(const AVFrame *frame, int field) if (primaries) fmt.color.gamut = primaries->prim; + if ((sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA))) { + const AVMasteringDisplayMetadata *mdm = (const AVMasteringDisplayMetadata *) sd->data; + if (mdm->has_luminance) { + fmt.color.min_luma = mdm->min_luminance; + fmt.color.max_luma = mdm->max_luminance; + } + + if (mdm->has_primaries) { + /* Ignore mastering display white point as it has no bearance on + * the underlying content */ + fmt.color.gamut.r.x = mdm->display_primaries[0][0]; + fmt.color.gamut.r.y = mdm->display_primaries[0][1]; + fmt.color.gamut.g.x = mdm->display_primaries[1][0]; + fmt.color.gamut.g.y = mdm->display_primaries[1][1]; + fmt.color.gamut.b.x = mdm->display_primaries[2][0]; + fmt.color.gamut.b.y = mdm->display_primaries[2][1]; + } + } + + /* PQ is always scaled down to absolute zero, so ignore mastering metadata */ + if (fmt.color.trc == AVCOL_TRC_SMPTE2084) + fmt.color.min_luma = av_make_q(0, 1); + return fmt; } |