diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-av1.c b/plugins/obs-ffmpeg/obs-ffmpeg-av1.c index 7e1b28c88..de7e23727 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-av1.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-av1.c @@ -26,9 +26,14 @@ #define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__) #define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__) +enum av1_encoder_type { + AV1_ENCODER_TYPE_AOM, + AV1_ENCODER_TYPE_SVT, +}; + struct av1_encoder { struct ffmpeg_video_encoder ffve; - bool svtav1; + enum av1_encoder_type type; DARRAY(uint8_t) header; }; @@ -79,9 +84,18 @@ static bool av1_update(struct av1_encoder *enc, obs_data_t *settings) enc->ffve.context->thread_count = 0; av1_video_info(enc, &info); - av_opt_set_int(enc->ffve.context->priv_data, - enc->svtav1 ? "preset" : "cpu-used", preset, 0); - if (!enc->svtav1) { + + if (enc->type == AV1_ENCODER_TYPE_SVT) { + av_opt_set_int(enc->ffve.context->priv_data, "preset", preset, + 0); +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100) + av_dict_set_int(&svtav1_opts, "rc", 1, 0); +#else + av_opt_set(enc->ffve.context->priv_data, "rc", "vbr", 0); +#endif + } else if (enc->type == AV1_ENCODER_TYPE_AOM) { + av_opt_set_int(enc->ffve.context->priv_data, "cpu-used", preset, + 0); av_opt_set(enc->ffve.context->priv_data, "usage", "realtime", 0); #if 0 @@ -95,19 +109,11 @@ static bool av1_update(struct av1_encoder *enc, obs_data_t *settings) av_opt_set_int(enc->ffve.context->priv_data, "row-mt", 1, 0); } - if (enc->svtav1) { -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100) - av_dict_set_int(&svtav1_opts, "rc", 1, 0); -#else - av_opt_set(enc->ffve.context->priv_data, "rc", "vbr", 0); -#endif - } - if (astrcmpi(rc, "cqp") == 0) { bitrate = 0; av_opt_set_int(enc->ffve.context->priv_data, "crf", cqp, 0); - if (enc->svtav1) { + if (enc->type == AV1_ENCODER_TYPE_SVT) { #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100) av_dict_set_int(&svtav1_opts, "rc", 0, 0); av_opt_set_int(enc->ffve.context->priv_data, "qp", cqp, @@ -125,7 +131,7 @@ static bool av1_update(struct av1_encoder *enc, obs_data_t *settings) enc->ffve.context->rc_min_rate = rate; cqp = 0; - if (enc->svtav1) { + if (enc->type == AV1_ENCODER_TYPE_SVT) { #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100) av_dict_set_int(&svtav1_opts, "rc", 2, 0); av_dict_set_int(&svtav1_opts, "pred-struct", 1, 0); @@ -141,10 +147,11 @@ static bool av1_update(struct av1_encoder *enc, obs_data_t *settings) } } - if (enc->svtav1) { + if (enc->type == AV1_ENCODER_TYPE_SVT) { av_opt_set_dict_val(enc->ffve.context->priv_data, "svtav1_opts", svtav1_opts, 0); } + const char *ffmpeg_opts = obs_data_get_string(settings, "ffmpeg_opts"); ffmpeg_video_encoder_update(&enc->ffve, bitrate, keyint_sec, voi, &info, ffmpeg_opts); @@ -180,7 +187,7 @@ static void on_first_packet(void *data, AVPacket *pkt, struct darray *da) { struct av1_encoder *enc = data; - if (enc->svtav1) { + if (enc->type == AV1_ENCODER_TYPE_SVT) { da_copy_array(enc->header, enc->ffve.context->extradata, enc->ffve.context->extradata_size); } else { @@ -222,7 +229,9 @@ static void *av1_create_internal(obs_data_t *settings, obs_encoder_t *encoder, struct av1_encoder *enc = bzalloc(sizeof(*enc)); if (strcmp(enc_lib, "libsvtav1") == 0) - enc->svtav1 = true; + enc->type = AV1_ENCODER_TYPE_SVT; + else if (strcmp(enc_lib, "libaom-av1") == 0) + enc->type = AV1_ENCODER_TYPE_AOM; if (!ffmpeg_video_encoder_init(&enc->ffve, enc, encoder, enc_lib, NULL, enc_name, NULL, on_first_packet)) @@ -280,7 +289,7 @@ static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p, return true; } -obs_properties_t *av1_properties(bool svtav1) +obs_properties_t *av1_properties(enum av1_encoder_type type) { obs_properties_t *props = obs_properties_create(); obs_property_t *p; @@ -310,7 +319,7 @@ obs_properties_t *av1_properties(bool svtav1) p = obs_properties_add_list(props, "preset", obs_module_text("Preset"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); - if (svtav1) { + if (type == AV1_ENCODER_TYPE_SVT) { obs_property_list_add_int(p, "Very likely too slow (6)", 6); obs_property_list_add_int(p, "Probably too slow (7)", 7); obs_property_list_add_int(p, "Seems okay (8)", 8); @@ -320,7 +329,7 @@ obs_properties_t *av1_properties(bool svtav1) obs_property_list_add_int( p, "Whoa, although quality might be not so great (12)", 12); - } else { + } else if (type == AV1_ENCODER_TYPE_AOM) { obs_property_list_add_int(p, "Probably too slow (7)", 7); obs_property_list_add_int(p, "Okay (8)", 8); obs_property_list_add_int(p, "Fast (9)", 9); @@ -337,13 +346,13 @@ obs_properties_t *av1_properties(bool svtav1) obs_properties_t *aom_av1_properties(void *unused) { UNUSED_PARAMETER(unused); - return av1_properties(false); + return av1_properties(AV1_ENCODER_TYPE_AOM); } obs_properties_t *svt_av1_properties(void *unused) { UNUSED_PARAMETER(unused); - return av1_properties(true); + return av1_properties(AV1_ENCODER_TYPE_SVT); } static bool av1_extra_data(void *data, uint8_t **extra_data, size_t *size)