فهرست منبع

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

As specified in the HEVC spec. VLC now reports top-left instead of left.
jpark37 3 سال پیش
والد
کامیت
a4083c56b5

+ 4 - 0
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c

@@ -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 =

+ 6 - 0
plugins/obs-ffmpeg/jim-nvenc.c

@@ -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;

+ 4 - 0
plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c

@@ -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;

+ 8 - 0
plugins/obs-ffmpeg/obs-ffmpeg-output.c

@@ -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;

+ 6 - 1
plugins/obs-ffmpeg/obs-ffmpeg-video-encoders.c

@@ -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)