[FFmpeg-cvslog] avcodec/nvenc: factor out mastering display data into its own function
Timo Rothenpieler
git at videolan.org
Sun Mar 2 19:55:42 EET 2025
ffmpeg | branch: master | Timo Rothenpieler <timo at rothenpieler.org> | Sun Feb 23 01:36:59 2025 +0100| [5c5be37daff4f4ecbe0c20d6a9f0fdad6eadc9c8] | committer: Timo Rothenpieler
avcodec/nvenc: factor out mastering display data into its own function
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5c5be37daff4f4ecbe0c20d6a9f0fdad6eadc9c8
---
libavcodec/nvenc.c | 137 +++++++++++++++++++++++++++++------------------------
1 file changed, 76 insertions(+), 61 deletions(-)
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 7ae1e7c8d7..97d05ed63a 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -2960,6 +2960,78 @@ static void reconfig_encoder(AVCodecContext *avctx, const AVFrame *frame)
}
}
+#ifdef NVENC_HAVE_HEVC_AND_AV1_MASTERING_METADATA
+static int nvenc_set_mastering_display_data(AVCodecContext *avctx, const AVFrame *frame, NV_ENC_PIC_PARAMS *pic_params,
+ MASTERING_DISPLAY_INFO *mastering_disp_info, CONTENT_LIGHT_LEVEL *content_light_level)
+{
+ NvencContext *ctx = avctx->priv_data;
+
+ if (ctx->mdm || ctx->cll) {
+ const AVFrameSideData *sd_mdm = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ const AVFrameSideData *sd_cll = av_frame_get_side_data(frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ const int chroma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 16 : 50000;
+ const int max_luma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 8 : 10000;
+ const int min_luma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 14 : 10000;
+
+ if (!sd_mdm)
+ sd_mdm = av_frame_side_data_get(avctx->decoded_side_data,
+ avctx->nb_decoded_side_data,
+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+ if (!sd_cll)
+ sd_cll = av_frame_side_data_get(avctx->decoded_side_data,
+ avctx->nb_decoded_side_data,
+ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+
+ if (sd_mdm) {
+ const AVMasteringDisplayMetadata *mdm = (AVMasteringDisplayMetadata *)sd_mdm->data;
+
+ mastering_disp_info->r.x = av_rescale(mdm->display_primaries[0][0].num, chroma_den,
+ mdm->display_primaries[0][0].den);
+ mastering_disp_info->r.y = av_rescale(mdm->display_primaries[0][1].num, chroma_den,
+ mdm->display_primaries[0][1].den);
+ mastering_disp_info->g.x = av_rescale(mdm->display_primaries[1][0].num, chroma_den,
+ mdm->display_primaries[1][0].den);
+ mastering_disp_info->g.y = av_rescale(mdm->display_primaries[1][1].num, chroma_den,
+ mdm->display_primaries[1][1].den);
+ mastering_disp_info->b.x = av_rescale(mdm->display_primaries[2][0].num, chroma_den,
+ mdm->display_primaries[2][0].den);
+ mastering_disp_info->b.y = av_rescale(mdm->display_primaries[2][1].num, chroma_den,
+ mdm->display_primaries[2][1].den);
+ mastering_disp_info->whitePoint.x = av_rescale(mdm->white_point[0].num, chroma_den,
+ mdm->white_point[0].den);
+ mastering_disp_info->whitePoint.y = av_rescale(mdm->white_point[1].num, chroma_den,
+ mdm->white_point[1].den);
+ mastering_disp_info->maxLuma = av_rescale(mdm->max_luminance.num, max_luma_den,
+ mdm->max_luminance.den);
+ mastering_disp_info->minLuma = av_rescale(mdm->min_luminance.num, min_luma_den,
+ mdm->min_luminance.den);
+
+ if (avctx->codec->id == AV_CODEC_ID_HEVC)
+ pic_params->codecPicParams.hevcPicParams.pMasteringDisplay = mastering_disp_info;
+ else if (avctx->codec->id == AV_CODEC_ID_AV1)
+ pic_params->codecPicParams.av1PicParams.pMasteringDisplay = mastering_disp_info;
+ else
+ return AVERROR_BUG;
+ }
+ if (sd_cll) {
+ const AVContentLightMetadata *cll = (AVContentLightMetadata *)sd_cll->data;
+
+ content_light_level->maxContentLightLevel = cll->MaxCLL;
+ content_light_level->maxPicAverageLightLevel = cll->MaxFALL;
+
+ if (avctx->codec->id == AV_CODEC_ID_HEVC)
+ pic_params->codecPicParams.hevcPicParams.pMaxCll = content_light_level;
+ else if (avctx->codec->id == AV_CODEC_ID_AV1)
+ pic_params->codecPicParams.av1PicParams.pMaxCll = content_light_level;
+ else
+ return AVERROR_BUG;
+ }
+ }
+
+ return 0;
+}
+#endif
+
static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
{
NVENCSTATUS nv_status;
@@ -3036,68 +3108,11 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame)
}
#ifdef NVENC_HAVE_HEVC_AND_AV1_MASTERING_METADATA
- if (ctx->mdm || ctx->cll) {
- const AVFrameSideData *sd_mdm = av_frame_get_side_data(frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
- const AVFrameSideData *sd_cll = av_frame_get_side_data(frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
- const int chroma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 16 : 50000;
- const int max_luma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 8 : 10000;
- const int min_luma_den = (avctx->codec->id == AV_CODEC_ID_AV1) ? 1 << 14 : 10000;
-
- if (!sd_mdm)
- sd_mdm = av_frame_side_data_get(avctx->decoded_side_data,
- avctx->nb_decoded_side_data,
- AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
- if (!sd_cll)
- sd_cll = av_frame_side_data_get(avctx->decoded_side_data,
- avctx->nb_decoded_side_data,
- AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
-
- if (sd_mdm) {
- const AVMasteringDisplayMetadata *mdm = (AVMasteringDisplayMetadata *)sd_mdm->data;
-
- mastering_disp_info.r.x = av_rescale(mdm->display_primaries[0][0].num, chroma_den,
- mdm->display_primaries[0][0].den);
- mastering_disp_info.r.y = av_rescale(mdm->display_primaries[0][1].num, chroma_den,
- mdm->display_primaries[0][1].den);
- mastering_disp_info.g.x = av_rescale(mdm->display_primaries[1][0].num, chroma_den,
- mdm->display_primaries[1][0].den);
- mastering_disp_info.g.y = av_rescale(mdm->display_primaries[1][1].num, chroma_den,
- mdm->display_primaries[1][1].den);
- mastering_disp_info.b.x = av_rescale(mdm->display_primaries[2][0].num, chroma_den,
- mdm->display_primaries[2][0].den);
- mastering_disp_info.b.y = av_rescale(mdm->display_primaries[2][1].num, chroma_den,
- mdm->display_primaries[2][1].den);
- mastering_disp_info.whitePoint.x = av_rescale(mdm->white_point[0].num, chroma_den,
- mdm->white_point[0].den);
- mastering_disp_info.whitePoint.y = av_rescale(mdm->white_point[1].num, chroma_den,
- mdm->white_point[1].den);
- mastering_disp_info.maxLuma = av_rescale(mdm->max_luminance.num, max_luma_den,
- mdm->max_luminance.den);
- mastering_disp_info.minLuma = av_rescale(mdm->min_luminance.num, min_luma_den,
- mdm->min_luminance.den);
-
- if (avctx->codec->id == AV_CODEC_ID_HEVC)
- pic_params.codecPicParams.hevcPicParams.pMasteringDisplay = &mastering_disp_info;
- else if (avctx->codec->id == AV_CODEC_ID_AV1)
- pic_params.codecPicParams.av1PicParams.pMasteringDisplay = &mastering_disp_info;
- else
- return AVERROR_BUG;
- }
- if (sd_cll) {
- const AVContentLightMetadata *cll = (AVContentLightMetadata *)sd_cll->data;
-
- content_light_level.maxContentLightLevel = cll->MaxCLL;
- content_light_level.maxPicAverageLightLevel = cll->MaxFALL;
-
- if (avctx->codec->id == AV_CODEC_ID_HEVC)
- pic_params.codecPicParams.hevcPicParams.pMaxCll = &content_light_level;
- else if (avctx->codec->id == AV_CODEC_ID_AV1)
- pic_params.codecPicParams.av1PicParams.pMaxCll = &content_light_level;
- else
- return AVERROR_BUG;
- }
- }
+ res = nvenc_set_mastering_display_data(avctx, frame, &pic_params, &mastering_disp_info, &content_light_level);
+ if (res < 0)
+ return res;
#endif
+
res = nvenc_store_frame_data(avctx, &pic_params, frame);
if (res < 0)
return res;
More information about the ffmpeg-cvslog
mailing list