Only look for HDR_MDVC on key frame on the output.
Showing the changes to libavcodec (1 of 1 file). Show all
Unified · Split
| @@ -23,6 +23,7 @@ · 22 unmodified lines | ||
| 23 | 23 | |
| 24 | 24 | #include "libavutil/pixdesc.h" |
| 25 | 25 | #include "libavutil/opt.h" |
| 26 | +#include "libavutil/mastering_display_metadata.h" | |
| 26 | 27 | |
| 27 | 28 | #include "cbs_av1.h" |
| 28 | 29 | #include "put_bits.h" |
| @@ -663,6 +664,51 @@ static int vaapi_encode_av1_init_picture_params(AVCodecContext *avctx, · 634 unmodified lines | ||
| 663 | 664 | |
| 664 | 665 | priv->nb_mh = 0; |
| 665 | 666 | |
| 667 | + if (pic->type == PICTURE_TYPE_IDR) { | |
| 668 | + AVFrameSideData *sd = | |
| 669 | + av_frame_get_side_data(pic->input_image, | |
| 670 | + AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); | |
| 671 | + if (sd) { | |
| 672 | + AVMasteringDisplayMetadata *mdm = | |
| 673 | + (AVMasteringDisplayMetadata *)sd->data; | |
| 674 | + if (mdm->has_primaries && mdm->has_luminance) { | |
| 675 | + AV1RawOBU *obu = &priv->mh[priv->nb_mh++]; | |
| 676 | + AV1RawMetadata *md = &obu->obu.metadata; | |
| 677 | + AV1RawMetadataHDRMDCV *mdcv = &md->metadata.hdr_mdcv; | |
| 678 | + const int chroma_den = 1 << 16; | |
| 679 | + const int max_luma_den = 1 << 8; | |
| 680 | + const int min_luma_den = 1 << 14; | |
| 681 | + | |
| 682 | + memset(obu, 0, sizeof(*obu)); | |
| 683 | + obu->header.obu_type = AV1_OBU_METADATA; | |
| 684 | + md->metadata_type = AV1_METADATA_TYPE_HDR_MDCV; | |
| 685 | + | |
| 686 | + for (i = 0; i < 3; i++) { | |
| 687 | + mdcv->primary_chromaticity_x[i] = | |
| 688 | + av_rescale(mdm->display_primaries[i][0].num, chroma_den, | |
| 689 | + mdm->display_primaries[i][0].den); | |
| 690 | + mdcv->primary_chromaticity_y[i] = | |
| 691 | + av_rescale(mdm->display_primaries[i][1].num, chroma_den, | |
| 692 | + mdm->display_primaries[i][1].den); | |
| 693 | + } | |
| 694 | + | |
| 695 | + mdcv->white_point_chromaticity_x = | |
| 696 | + av_rescale(mdm->white_point[0].num, chroma_den, | |
| 697 | + mdm->white_point[0].den); | |
| 698 | + mdcv->white_point_chromaticity_y = | |
| 699 | + av_rescale(mdm->white_point[1].num, chroma_den, | |
| 700 | + mdm->white_point[1].den); | |
| 701 | + | |
| 702 | + mdcv->luminance_max = | |
| 703 | + av_rescale(mdm->max_luminance.num, max_luma_den, | |
| 704 | + mdm->max_luminance.den); | |
| 705 | + mdcv->luminance_min = | |
| 706 | + av_rescale(mdm->min_luminance.num, min_luma_den, | |
| 707 | + mdm->min_luminance.den); | |
| 708 | + } | |
| 709 | + } | |
| 710 | + } | |
| 711 | + | |
| 666 | 712 | end: |
| 667 | 713 | ff_cbs_fragment_reset(obu); |
| 668 | 714 | return ret; |