obs-ffmpeg: Use top-left chroma location for HDR

As specified in the HEVC spec. VLC now reports top-left instead of left.
master
jpark37 2022-07-30 21:35:17 -07:00 committed by Jim
parent 3a43fc4a07
commit a4083c56b5
5 changed files with 28 additions and 1 deletions

View File

@ -454,6 +454,10 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
context->color_trc = ffm->params.color_trc;
context->colorspace = ffm->params.colorspace;
context->color_range = ffm->params.color_range;
context->chroma_sample_location =
(ffm->params.colorspace == AVCOL_SPC_BT2020_NCL)
? AVCHROMA_LOC_TOPLEFT
: AVCHROMA_LOC_LEFT;
context->extradata = extradata;
context->extradata_size = ffm->video_header.size;
context->time_base =

View File

@ -781,11 +781,17 @@ static bool init_encoder_hevc(struct nvenc_data *enc, obs_data_t *settings,
vui_params->colourPrimaries = 9;
vui_params->transferCharacteristics = 16;
vui_params->colourMatrix = 9;
vui_params->chromaSampleLocationFlag = 1;
vui_params->chromaSampleLocationTop = 2;
vui_params->chromaSampleLocationBot = 2;
break;
case VIDEO_CS_2100_HLG:
vui_params->colourPrimaries = 9;
vui_params->transferCharacteristics = 18;
vui_params->colourMatrix = 9;
vui_params->chromaSampleLocationFlag = 1;
vui_params->chromaSampleLocationTop = 2;
vui_params->chromaSampleLocationBot = 2;
}
enc->bframes = bf;

View File

@ -193,6 +193,10 @@ static bool create_video_stream(struct ffmpeg_output *stream,
context->color_primaries = data->config.color_primaries;
context->color_trc = data->config.color_trc;
context->colorspace = data->config.colorspace;
context->chroma_sample_location =
(data->config.colorspace == AVCOL_SPC_BT2020_NCL)
? AVCHROMA_LOC_TOPLEFT
: AVCHROMA_LOC_LEFT;
context->thread_count = 0;
data->video->time_base = context->time_base;

View File

@ -152,6 +152,10 @@ static bool open_video_codec(struct ffmpeg_data *data)
data->vframe->color_primaries = data->config.color_primaries;
data->vframe->color_trc = data->config.color_trc;
data->vframe->colorspace = data->config.colorspace;
data->vframe->chroma_location =
(data->config.colorspace == AVCOL_SPC_BT2020_NCL)
? AVCHROMA_LOC_TOPLEFT
: AVCHROMA_LOC_LEFT;
ret = av_frame_get_buffer(data->vframe, base_get_alignment());
if (ret < 0) {
@ -258,6 +262,10 @@ static bool create_video_stream(struct ffmpeg_data *data)
context->color_primaries = data->config.color_primaries;
context->color_trc = data->config.color_trc;
context->colorspace = data->config.colorspace;
context->chroma_sample_location =
(data->config.colorspace == AVCOL_SPC_BT2020_NCL)
? AVCHROMA_LOC_TOPLEFT
: AVCHROMA_LOC_LEFT;
context->thread_count = 0;
data->video->time_base = context->time_base;

View File

@ -45,8 +45,11 @@ bool ffmpeg_video_encoder_init_codec(struct ffmpeg_video_encoder *enc)
enc->vframe->format = enc->context->pix_fmt;
enc->vframe->width = enc->context->width;
enc->vframe->height = enc->context->height;
enc->vframe->colorspace = enc->context->colorspace;
enc->vframe->color_range = enc->context->color_range;
enc->vframe->color_primaries = enc->context->color_primaries;
enc->vframe->color_trc = enc->context->color_trc;
enc->vframe->colorspace = enc->context->colorspace;
enc->vframe->chroma_location = enc->context->chroma_sample_location;
ret = av_frame_get_buffer(enc->vframe, base_get_alignment());
if (ret < 0) {
@ -96,11 +99,13 @@ void ffmpeg_video_encoder_update(struct ffmpeg_video_encoder *enc, int bitrate,
enc->context->color_primaries = AVCOL_PRI_BT2020;
enc->context->color_trc = AVCOL_TRC_SMPTE2084;
enc->context->colorspace = AVCOL_SPC_BT2020_NCL;
enc->context->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
break;
case VIDEO_CS_2100_HLG:
enc->context->color_primaries = AVCOL_PRI_BT2020;
enc->context->color_trc = AVCOL_TRC_ARIB_STD_B67;
enc->context->colorspace = AVCOL_SPC_BT2020_NCL;
enc->context->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
}
if (keyint_sec)