Browse Source

obs-ffmpeg: Fix HDR metadata not being written when using FFmpeg 6.1+

derrod 1 year ago
parent
commit
5f2bb795f0

+ 5 - 5
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c

@@ -491,6 +491,11 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
 #endif
 	ffm->video_stream->avg_frame_rate = av_inv_q(context->time_base);
 
+	if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
+		context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+
+	avcodec_parameters_from_context(ffm->video_stream->codecpar, context);
+
 	const int max_luminance = ffm->params.max_luminance;
 	if (max_luminance > 0) {
 		size_t content_size;
@@ -538,11 +543,6 @@ static void create_video_stream(struct ffmpeg_mux *ffm)
 #endif
 	}
 
-	if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
-		context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
-
-	avcodec_parameters_from_context(ffm->video_stream->codecpar, context);
-
 	ffm->video_ctx = context;
 }
 

+ 32 - 30
plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c

@@ -156,6 +156,38 @@ static bool create_video_stream(struct ffmpeg_output *stream,
 	}
 	if (!new_stream(data, &data->video, name))
 		return false;
+
+	context = avcodec_alloc_context3(NULL);
+	context->codec_type = codec->type;
+	context->codec_id = codec->id;
+	context->bit_rate = (int64_t)data->config.video_bitrate * 1000;
+	context->width = data->config.scale_width;
+	context->height = data->config.scale_height;
+	context->coded_width = data->config.scale_width;
+	context->coded_height = data->config.scale_height;
+	context->time_base = (AVRational){ovi.fps_den, ovi.fps_num};
+	context->gop_size = data->config.gop_size;
+	context->pix_fmt = data->config.format;
+	context->color_range = data->config.color_range;
+	context->color_primaries = data->config.color_primaries;
+	context->color_trc = data->config.color_trc;
+	context->colorspace = data->config.colorspace;
+	context->chroma_sample_location = determine_chroma_location(
+		data->config.format, data->config.colorspace);
+	context->thread_count = 0;
+
+	data->video->time_base = context->time_base;
+#if LIBAVFORMAT_VERSION_MAJOR < 59
+	data->video->codec->time_base = context->time_base;
+#endif
+	data->video->avg_frame_rate = av_inv_q(context->time_base);
+
+	data->video_ctx = context;
+	data->config.width = data->config.scale_width;
+	data->config.height = data->config.scale_height;
+
+	avcodec_parameters_from_context(data->video->codecpar, context);
+
 	const bool pq = data->config.color_trc == AVCOL_TRC_SMPTE2084;
 	const bool hlg = data->config.color_trc == AVCOL_TRC_ARIB_STD_B67;
 	if (pq || hlg) {
@@ -207,36 +239,6 @@ static bool create_video_stream(struct ffmpeg_output *stream,
 			(uint8_t *)mastering, sizeof(*mastering), 0);
 #endif
 	}
-	context = avcodec_alloc_context3(NULL);
-	context->codec_type = codec->type;
-	context->codec_id = codec->id;
-	context->bit_rate = (int64_t)data->config.video_bitrate * 1000;
-	context->width = data->config.scale_width;
-	context->height = data->config.scale_height;
-	context->coded_width = data->config.scale_width;
-	context->coded_height = data->config.scale_height;
-	context->time_base = (AVRational){ovi.fps_den, ovi.fps_num};
-	context->gop_size = data->config.gop_size;
-	context->pix_fmt = data->config.format;
-	context->color_range = data->config.color_range;
-	context->color_primaries = data->config.color_primaries;
-	context->color_trc = data->config.color_trc;
-	context->colorspace = data->config.colorspace;
-	context->chroma_sample_location = determine_chroma_location(
-		data->config.format, data->config.colorspace);
-	context->thread_count = 0;
-
-	data->video->time_base = context->time_base;
-#if LIBAVFORMAT_VERSION_MAJOR < 59
-	data->video->codec->time_base = context->time_base;
-#endif
-	data->video->avg_frame_rate = av_inv_q(context->time_base);
-
-	data->video_ctx = context;
-	data->config.width = data->config.scale_width;
-	data->config.height = data->config.scale_height;
-
-	avcodec_parameters_from_context(data->video->codecpar, context);
 
 	return true;
 }

+ 35 - 35
plugins/obs-ffmpeg/obs-ffmpeg-output.c

@@ -200,6 +200,41 @@ static bool create_video_stream(struct ffmpeg_data *data)
 			data->config.video_encoder))
 		return false;
 
+	closest_format = data->config.format;
+	if (data->vcodec->pix_fmts) {
+		const int has_alpha = closest_format == AV_PIX_FMT_BGRA;
+		closest_format = avcodec_find_best_pix_fmt_of_list(
+			data->vcodec->pix_fmts, closest_format, has_alpha,
+			NULL);
+	}
+
+	context = avcodec_alloc_context3(data->vcodec);
+	context->bit_rate = (int64_t)data->config.video_bitrate * 1000;
+	context->width = data->config.scale_width;
+	context->height = data->config.scale_height;
+	context->time_base = (AVRational){ovi.fps_den, ovi.fps_num};
+	context->framerate = (AVRational){ovi.fps_num, ovi.fps_den};
+	context->gop_size = data->config.gop_size;
+	context->pix_fmt = closest_format;
+	context->color_range = data->config.color_range;
+	context->color_primaries = data->config.color_primaries;
+	context->color_trc = data->config.color_trc;
+	context->colorspace = data->config.colorspace;
+	context->chroma_sample_location = determine_chroma_location(
+		closest_format, data->config.colorspace);
+	context->thread_count = 0;
+
+	data->video->time_base = context->time_base;
+	data->video->avg_frame_rate = (AVRational){ovi.fps_num, ovi.fps_den};
+
+	if (data->output->oformat->flags & AVFMT_GLOBALHEADER)
+		context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
+
+	data->video_ctx = context;
+
+	if (!open_video_codec(data))
+		return false;
+
 	const enum AVColorTransferCharacteristic trc = data->config.color_trc;
 	const bool pq = trc == AVCOL_TRC_SMPTE2084;
 	const bool hlg = trc == AVCOL_TRC_ARIB_STD_B67;
@@ -253,41 +288,6 @@ static bool create_video_stream(struct ffmpeg_data *data)
 #endif
 	}
 
-	closest_format = data->config.format;
-	if (data->vcodec->pix_fmts) {
-		const int has_alpha = closest_format == AV_PIX_FMT_BGRA;
-		closest_format = avcodec_find_best_pix_fmt_of_list(
-			data->vcodec->pix_fmts, closest_format, has_alpha,
-			NULL);
-	}
-
-	context = avcodec_alloc_context3(data->vcodec);
-	context->bit_rate = (int64_t)data->config.video_bitrate * 1000;
-	context->width = data->config.scale_width;
-	context->height = data->config.scale_height;
-	context->time_base = (AVRational){ovi.fps_den, ovi.fps_num};
-	context->framerate = (AVRational){ovi.fps_num, ovi.fps_den};
-	context->gop_size = data->config.gop_size;
-	context->pix_fmt = closest_format;
-	context->color_range = data->config.color_range;
-	context->color_primaries = data->config.color_primaries;
-	context->color_trc = data->config.color_trc;
-	context->colorspace = data->config.colorspace;
-	context->chroma_sample_location = determine_chroma_location(
-		closest_format, data->config.colorspace);
-	context->thread_count = 0;
-
-	data->video->time_base = context->time_base;
-	data->video->avg_frame_rate = (AVRational){ovi.fps_num, ovi.fps_den};
-
-	if (data->output->oformat->flags & AVFMT_GLOBALHEADER)
-		context->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
-
-	data->video_ctx = context;
-
-	if (!open_video_codec(data))
-		return false;
-
 	if (context->pix_fmt != data->config.format ||
 	    data->config.width != data->config.scale_width ||
 	    data->config.height != data->config.scale_height) {