@@ -1157,7 +1157,7 @@ static obs_properties_t *amf_properties_internal(amf_codec_type codec)
1157
1157
#undef add_profile
1158
1158
}
1159
1159
1160
- if (amf_codec_type::AVC == codec) {
1160
+ if (amf_codec_type::AVC == codec || amf_codec_type::AV1 == codec ) {
1161
1161
obs_properties_add_int (props, " bf" , obs_module_text (" BFrames" ), 0 , 5 , 1 );
1162
1162
}
1163
1163
@@ -1970,6 +1970,15 @@ static bool amf_av1_init(void *data, obs_data_t *settings)
1970
1970
const char *preset = obs_data_get_string (settings, " preset" );
1971
1971
const char *profile = obs_data_get_string (settings, " profile" );
1972
1972
const char *rc_str = obs_data_get_string (settings, " rate_control" );
1973
+ int64_t bf = obs_data_get_int (settings, " bf" );
1974
+
1975
+ if (enc->bframes_supported ) {
1976
+ set_av1_property (enc, MAX_CONSECUTIVE_BPICTURES, bf);
1977
+ set_av1_property (enc, B_PIC_PATTERN, bf);
1978
+ } else if (bf != 0 ) {
1979
+ warn (" B-Frames set to %lld but b-frames are not supported by this device" , bf);
1980
+ bf = 0 ;
1981
+ }
1973
1982
1974
1983
int rc = get_av1_rate_control (rc_str);
1975
1984
set_av1_property (enc, RATE_CONTROL_METHOD, rc);
@@ -2003,10 +2012,11 @@ static bool amf_av1_init(void *data, obs_data_t *settings)
2003
2012
" \t keyint: %d\n "
2004
2013
" \t preset: %s\n "
2005
2014
" \t profile: %s\n "
2015
+ " \t b-frames: %d\n "
2006
2016
" \t width: %d\n "
2007
2017
" \t height: %d\n "
2008
2018
" \t params: %s" ,
2009
- rc_str, bitrate, qp, gop_size, preset, profile, enc->cx , enc->cy , ffmpeg_opts);
2019
+ rc_str, bitrate, qp, gop_size, preset, profile, bf, enc->cx , enc->cy , ffmpeg_opts);
2010
2020
2011
2021
return true ;
2012
2022
}
@@ -2021,6 +2031,7 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings)
2021
2031
AMFCapsPtr caps;
2022
2032
AMF_RESULT res = enc->amf_encoder ->GetCaps (&caps);
2023
2033
if (res == AMF_OK) {
2034
+ caps->GetProperty (AMF_VIDEO_ENCODER_AV1_CAP_BFRAMES, &enc->bframes_supported );
2024
2035
caps->GetProperty (AMF_VIDEO_ENCODER_AV1_CAP_MAX_THROUGHPUT, &enc->max_throughput );
2025
2036
caps->GetProperty (AMF_VIDEO_ENCODER_AV1_CAP_REQUESTED_THROUGHPUT, &enc->requested_throughput );
2026
2037
/* For some reason there's no specific CAP for AV1, but should always be supported */
@@ -2053,6 +2064,17 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings)
2053
2064
res = enc->amf_encoder ->GetProperty (AMF_VIDEO_ENCODER_AV1_EXTRA_DATA, &p);
2054
2065
if (res == AMF_OK && p.type == AMF_VARIANT_INTERFACE)
2055
2066
enc->header = AMFBufferPtr (p.pInterface );
2067
+
2068
+ if (enc->bframes_supported ) {
2069
+ amf_int64 b_frames = 0 ;
2070
+ amf_int64 b_max = 0 ;
2071
+
2072
+ if (get_av1_property (enc, B_PIC_PATTERN, &b_frames) &&
2073
+ get_av1_property (enc, MAX_CONSECUTIVE_BPICTURES, &b_max))
2074
+ enc->dts_offset = b_frames + 1 ;
2075
+ else
2076
+ enc->dts_offset = 0 ;
2077
+ }
2056
2078
}
2057
2079
2058
2080
static void *amf_av1_create_texencode (obs_data_t *settings, obs_encoder_t *encoder)
@@ -2127,6 +2149,7 @@ static void amf_av1_defaults(obs_data_t *settings)
2127
2149
obs_data_set_default_string (settings, " rate_control" , " CBR" );
2128
2150
obs_data_set_default_string (settings, " preset" , " quality" );
2129
2151
obs_data_set_default_string (settings, " profile" , " high" );
2152
+ obs_data_set_default_int (settings, " bf" , 2 );
2130
2153
}
2131
2154
2132
2155
static void register_av1 ()
0 commit comments