Unified · Split
| @@ -46,6 +46,7 @@ · 45 unmodified lines | ||
| 46 | 46 | #include "libavutil/imgutils.h" |
| 47 | 47 | #include "libavutil/intreadwrite.h" |
| 48 | 48 | #include "libavutil/libm.h" |
| 49 | +#include "libavutil/mastering_display_metadata.h" | |
| 49 | 50 | #include "libavutil/mathematics.h" |
| 50 | 51 | #include "libavutil/mem.h" |
| 51 | 52 | #include "libavutil/opt.h" |
| @@ -2655,6 +2656,7 @@ SwsFormat ff_fmt_from_frame(const AVFrame *frame, int field) · 2603 unmodified lines | ||
| 2655 | 2656 | { |
| 2656 | 2657 | const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); |
| 2657 | 2658 | const AVColorPrimariesDesc *primaries; |
| 2659 | + AVFrameSideData *sd; | |
| 2658 | 2660 | |
| 2659 | 2661 | SwsFormat fmt = { |
| 2660 | 2662 | .width = frame->width, |
| @@ -2727,6 +2729,29 @@ SwsFormat ff_fmt_from_frame(const AVFrame *frame, int field) · 66 unmodified lines | ||
| 2727 | 2729 | if (primaries) |
| 2728 | 2730 | fmt.color.gamut = primaries->prim; |
| 2729 | 2731 | |
| 2732 | + if ((sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA))) { | |
| 2733 | + const AVMasteringDisplayMetadata *mdm = (const AVMasteringDisplayMetadata *) sd->data; | |
| 2734 | + if (mdm->has_luminance) { | |
| 2735 | + fmt.color.min_luma = mdm->min_luminance; | |
| 2736 | + fmt.color.max_luma = mdm->max_luminance; | |
| 2737 | + } | |
| 2738 | + | |
| 2739 | + if (mdm->has_primaries) { | |
| 2740 | + /* Ignore mastering display white point as it has no bearance on | |
| 2741 | + * the underlying content */ | |
| 2742 | + fmt.color.gamut.r.x = mdm->display_primaries[0][0]; | |
| 2743 | + fmt.color.gamut.r.y = mdm->display_primaries[0][1]; | |
| 2744 | + fmt.color.gamut.g.x = mdm->display_primaries[1][0]; | |
| 2745 | + fmt.color.gamut.g.y = mdm->display_primaries[1][1]; | |
| 2746 | + fmt.color.gamut.b.x = mdm->display_primaries[2][0]; | |
| 2747 | + fmt.color.gamut.b.y = mdm->display_primaries[2][1]; | |
| 2748 | + } | |
| 2749 | + } | |
| 2750 | + | |
| 2751 | + /* PQ is always scaled down to absolute zero, so ignore mastering metadata */ | |
| 2752 | + if (fmt.color.trc == AVCOL_TRC_SMPTE2084) | |
| 2753 | + fmt.color.min_luma = av_make_q(0, 1); | |
| 2754 | + | |
| 2730 | 2755 | return fmt; |
| 2731 | 2756 | } |
| 2732 | 2757 | |