obs-ffmpeg: Set P3-D65 metadata for HDR

Want to avoid receiver gamut remapping from Rec. 2100 to P3.

Fix min luminance appearing as NaN by switching from 0/0 to 0/1.

Also set max luminance for HLG because why not.
This commit is contained in:
jpark37 2022-04-17 12:16:23 -07:00 committed by Jim
parent 3eb85c548f
commit 2e8ea0acdc
3 changed files with 24 additions and 2 deletions

View File

@ -423,8 +423,18 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
if (ffm->params.max_luminance > 0) {
AVMasteringDisplayMetadata *const mastering =
av_mastering_display_metadata_alloc();
mastering->display_primaries[0][0] = av_make_q(17, 25);
mastering->display_primaries[0][1] = av_make_q(8, 25);
mastering->display_primaries[1][0] = av_make_q(53, 200);
mastering->display_primaries[1][1] = av_make_q(69, 100);
mastering->display_primaries[2][0] = av_make_q(3, 20);
mastering->display_primaries[2][1] = av_make_q(3, 50);
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->has_primaries = 1;
mastering->has_luminance = 1;
av_stream_add_side_data(ffm->video_stream,
AV_PKT_DATA_MASTERING_DISPLAY_METADATA,

View File

@ -163,7 +163,8 @@ static void add_video_encoder_params(struct ffmpeg_muxer *stream,
: AVCOL_RANGE_MPEG;
const int max_luminance =
(trc == AVCOL_TRC_SMPTE2084)
((trc == AVCOL_TRC_SMPTE2084) ||
(trc == AVCOL_TRC_ARIB_STD_B67))
? (int)obs_get_video_hdr_nominal_peak_level()
: 0;

View File

@ -223,11 +223,22 @@ static bool create_video_stream(struct ffmpeg_data *data)
data->config.video_encoder))
return false;
if (data->config.color_trc == AVCOL_TRC_SMPTE2084) {
if ((data->config.color_trc == AVCOL_TRC_SMPTE2084) ||
(data->config.color_trc == AVCOL_TRC_ARIB_STD_B67)) {
AVMasteringDisplayMetadata *const mastering =
av_mastering_display_metadata_alloc();
mastering->display_primaries[0][0] = av_make_q(17, 25);
mastering->display_primaries[0][1] = av_make_q(8, 25);
mastering->display_primaries[1][0] = av_make_q(53, 200);
mastering->display_primaries[1][1] = av_make_q(69, 100);
mastering->display_primaries[2][0] = av_make_q(3, 20);
mastering->display_primaries[2][1] = av_make_q(3, 50);
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->has_primaries = 1;
mastering->has_luminance = 1;
av_stream_add_side_data(data->video,
AV_PKT_DATA_MASTERING_DISPLAY_METADATA,