소스 검색

obs-ffmpeg: Fix wrong framerate in AMF VUI header

Frame rate should be defined before AMF encoder initialization,
because this information is used for setting vui_time_scale in SPS.
If frame rate isn't defined before initialization,
then AMF encoder set default frame rate into VUI header (30 fps).
Evgeny Pavlov 1 년 전
부모
커밋
b79ba49252
1개의 변경된 파일3개의 추가작업 그리고 6개의 파일을 삭제
  1. 3 6
      plugins/obs-ffmpeg/texture-amf.cpp

+ 3 - 6
plugins/obs-ffmpeg/texture-amf.cpp

@@ -1506,6 +1506,7 @@ static void amf_avc_create_internal(amf_base *enc, obs_data_t *settings)
 			 enc->amf_characteristic);
 	set_avc_property(enc, OUTPUT_COLOR_PRIMARIES, enc->amf_primaries);
 	set_avc_property(enc, FULL_RANGE_COLOR, enc->full_range);
+	set_avc_property(enc, FRAMERATE, enc->amf_frame_rate);
 
 	amf_avc_init(enc, settings);
 
@@ -1513,8 +1514,6 @@ static void amf_avc_create_internal(amf_base *enc, obs_data_t *settings)
 	if (res != AMF_OK)
 		throw amf_error("AMFComponent::Init failed", res);
 
-	set_avc_property(enc, FRAMERATE, enc->amf_frame_rate);
-
 	res = enc->amf_encoder->GetProperty(AMF_VIDEO_ENCODER_EXTRADATA, &p);
 	if (res == AMF_OK && p.type == AMF_VARIANT_INTERFACE)
 		enc->header = AMFBufferPtr(p.pInterface);
@@ -1853,6 +1852,7 @@ static void amf_hevc_create_internal(amf_base *enc, obs_data_t *settings)
 			  enc->amf_characteristic);
 	set_hevc_property(enc, OUTPUT_COLOR_PRIMARIES, enc->amf_primaries);
 	set_hevc_property(enc, NOMINAL_RANGE, enc->full_range);
+	set_hevc_property(enc, FRAMERATE, enc->amf_frame_rate);
 
 	if (is_hdr) {
 		const int hdr_nominal_peak_level =
@@ -1885,8 +1885,6 @@ static void amf_hevc_create_internal(amf_base *enc, obs_data_t *settings)
 	if (res != AMF_OK)
 		throw amf_error("AMFComponent::Init failed", res);
 
-	set_hevc_property(enc, FRAMERATE, enc->amf_frame_rate);
-
 	res = enc->amf_encoder->GetProperty(AMF_VIDEO_ENCODER_HEVC_EXTRADATA,
 					    &p);
 	if (res == AMF_OK && p.type == AMF_VARIANT_INTERFACE)
@@ -2197,6 +2195,7 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings)
 	set_av1_property(enc, OUTPUT_TRANSFER_CHARACTERISTIC,
 			 enc->amf_characteristic);
 	set_av1_property(enc, OUTPUT_COLOR_PRIMARIES, enc->amf_primaries);
+	set_av1_property(enc, FRAMERATE, enc->amf_frame_rate);
 
 	amf_av1_init(enc, settings);
 
@@ -2204,8 +2203,6 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings)
 	if (res != AMF_OK)
 		throw amf_error("AMFComponent::Init failed", res);
 
-	set_av1_property(enc, FRAMERATE, enc->amf_frame_rate);
-
 	AMFVariant p;
 	res = enc->amf_encoder->GetProperty(AMF_VIDEO_ENCODER_AV1_EXTRA_DATA,
 					    &p);