From 80f6cff742d43eeaddadfee7ba98cadb2c98a1e7 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Thu, 28 Apr 2022 21:28:21 -0700 Subject: [PATCH] obs-ffmpeg: Add content light levels for HDR YouTube wants it, and more metadata can only improve compatibility. --- plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c | 15 ++++++++++++--- plugins/obs-ffmpeg/obs-ffmpeg-output.c | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c index fbebd5a85..5f569d6a9 100644 --- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c @@ -420,7 +420,17 @@ static void create_video_stream(struct ffmpeg_mux *ffm) #endif ffm->video_stream->avg_frame_rate = av_inv_q(context->time_base); - if (ffm->params.max_luminance > 0) { + const int max_luminance = ffm->params.max_luminance; + if (max_luminance > 0) { + size_t content_size; + AVContentLightMetadata *const content = + av_content_light_metadata_alloc(&content_size); + content->MaxCLL = max_luminance; + content->MaxFALL = max_luminance; + av_stream_add_side_data(ffm->video_stream, + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)content, content_size); + AVMasteringDisplayMetadata *const mastering = av_mastering_display_metadata_alloc(); mastering->display_primaries[0][0] = av_make_q(17, 25); @@ -432,8 +442,7 @@ static void create_video_stream(struct ffmpeg_mux *ffm) mastering->white_point[0] = av_make_q(3127, 10000); mastering->white_point[1] = av_make_q(329, 1000); mastering->min_luminance = av_make_q(0, 1); - mastering->max_luminance = - av_make_q(ffm->params.max_luminance, 1); + mastering->max_luminance = av_make_q(max_luminance, 1); mastering->has_primaries = 1; mastering->has_luminance = 1; av_stream_add_side_data(ffm->video_stream, diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c index a1b6e4198..e0cc169d5 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c @@ -225,6 +225,18 @@ static bool create_video_stream(struct ffmpeg_data *data) if ((data->config.color_trc == AVCOL_TRC_SMPTE2084) || (data->config.color_trc == AVCOL_TRC_ARIB_STD_B67)) { + const int hdr_nominal_peak_level = + (int)obs_get_video_hdr_nominal_peak_level(); + + size_t content_size; + AVContentLightMetadata *const content = + av_content_light_metadata_alloc(&content_size); + content->MaxCLL = hdr_nominal_peak_level; + content->MaxFALL = hdr_nominal_peak_level; + av_stream_add_side_data(data->video, + AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)content, content_size); + AVMasteringDisplayMetadata *const mastering = av_mastering_display_metadata_alloc(); mastering->display_primaries[0][0] = av_make_q(17, 25); @@ -236,8 +248,7 @@ static bool create_video_stream(struct ffmpeg_data *data) mastering->white_point[0] = av_make_q(3127, 10000); mastering->white_point[1] = av_make_q(329, 1000); mastering->min_luminance = av_make_q(0, 1); - mastering->max_luminance = av_make_q( - (int)obs_get_video_hdr_nominal_peak_level(), 1); + mastering->max_luminance = av_make_q(hdr_nominal_peak_level, 1); mastering->has_primaries = 1; mastering->has_luminance = 1; av_stream_add_side_data(data->video,