Răsfoiți Sursa

obs-ffmpeg: Add content light levels for HDR

YouTube wants it, and more metadata can only improve compatibility.
jpark37 3 ani în urmă
părinte
comite
80f6cff742

+ 12 - 3
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,

+ 13 - 2
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,