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).
This commit is contained in:
Evgeny Pavlov 2024-02-04 00:31:00 +01:00 committed by GitHub
parent d2e50c8c38
commit b79ba49252
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

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