|
@@ -26,9 +26,14 @@
|
|
|
#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
|
|
#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
|
|
|
#define debug(format, ...) do_log(LOG_DEBUG, 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 av1_encoder {
|
|
|
struct ffmpeg_video_encoder ffve;
|
|
struct ffmpeg_video_encoder ffve;
|
|
|
- bool svtav1;
|
|
|
|
|
|
|
+ enum av1_encoder_type type;
|
|
|
|
|
|
|
|
DARRAY(uint8_t) header;
|
|
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;
|
|
enc->ffve.context->thread_count = 0;
|
|
|
|
|
|
|
|
av1_video_info(enc, &info);
|
|
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",
|
|
av_opt_set(enc->ffve.context->priv_data, "usage", "realtime",
|
|
|
0);
|
|
0);
|
|
|
#if 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);
|
|
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) {
|
|
if (astrcmpi(rc, "cqp") == 0) {
|
|
|
bitrate = 0;
|
|
bitrate = 0;
|
|
|
av_opt_set_int(enc->ffve.context->priv_data, "crf", cqp, 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)
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100)
|
|
|
av_dict_set_int(&svtav1_opts, "rc", 0, 0);
|
|
av_dict_set_int(&svtav1_opts, "rc", 0, 0);
|
|
|
av_opt_set_int(enc->ffve.context->priv_data, "qp", cqp,
|
|
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;
|
|
enc->ffve.context->rc_min_rate = rate;
|
|
|
cqp = 0;
|
|
cqp = 0;
|
|
|
|
|
|
|
|
- if (enc->svtav1) {
|
|
|
|
|
|
|
+ if (enc->type == AV1_ENCODER_TYPE_SVT) {
|
|
|
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 37, 100)
|
|
#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, "rc", 2, 0);
|
|
|
av_dict_set_int(&svtav1_opts, "pred-struct", 1, 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",
|
|
av_opt_set_dict_val(enc->ffve.context->priv_data, "svtav1_opts",
|
|
|
svtav1_opts, 0);
|
|
svtav1_opts, 0);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
const char *ffmpeg_opts = obs_data_get_string(settings, "ffmpeg_opts");
|
|
const char *ffmpeg_opts = obs_data_get_string(settings, "ffmpeg_opts");
|
|
|
ffmpeg_video_encoder_update(&enc->ffve, bitrate, keyint_sec, voi, &info,
|
|
ffmpeg_video_encoder_update(&enc->ffve, bitrate, keyint_sec, voi, &info,
|
|
|
ffmpeg_opts);
|
|
ffmpeg_opts);
|
|
@@ -180,7 +187,7 @@ static void on_first_packet(void *data, AVPacket *pkt, struct darray *da)
|
|
|
{
|
|
{
|
|
|
struct av1_encoder *enc = data;
|
|
struct av1_encoder *enc = data;
|
|
|
|
|
|
|
|
- if (enc->svtav1) {
|
|
|
|
|
|
|
+ if (enc->type == AV1_ENCODER_TYPE_SVT) {
|
|
|
da_copy_array(enc->header, enc->ffve.context->extradata,
|
|
da_copy_array(enc->header, enc->ffve.context->extradata,
|
|
|
enc->ffve.context->extradata_size);
|
|
enc->ffve.context->extradata_size);
|
|
|
} else {
|
|
} 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));
|
|
struct av1_encoder *enc = bzalloc(sizeof(*enc));
|
|
|
|
|
|
|
|
if (strcmp(enc_lib, "libsvtav1") == 0)
|
|
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,
|
|
if (!ffmpeg_video_encoder_init(&enc->ffve, enc, encoder, enc_lib, NULL,
|
|
|
enc_name, NULL, on_first_packet))
|
|
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;
|
|
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_properties_t *props = obs_properties_create();
|
|
|
obs_property_t *p;
|
|
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"),
|
|
p = obs_properties_add_list(props, "preset", obs_module_text("Preset"),
|
|
|
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
|
|
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, "Very likely too slow (6)", 6);
|
|
|
obs_property_list_add_int(p, "Probably too slow (7)", 7);
|
|
obs_property_list_add_int(p, "Probably too slow (7)", 7);
|
|
|
obs_property_list_add_int(p, "Seems okay (8)", 8);
|
|
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(
|
|
obs_property_list_add_int(
|
|
|
p, "Whoa, although quality might be not so great (12)",
|
|
p, "Whoa, although quality might be not so great (12)",
|
|
|
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, "Probably too slow (7)", 7);
|
|
|
obs_property_list_add_int(p, "Okay (8)", 8);
|
|
obs_property_list_add_int(p, "Okay (8)", 8);
|
|
|
obs_property_list_add_int(p, "Fast (9)", 9);
|
|
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)
|
|
obs_properties_t *aom_av1_properties(void *unused)
|
|
|
{
|
|
{
|
|
|
UNUSED_PARAMETER(unused);
|
|
UNUSED_PARAMETER(unused);
|
|
|
- return av1_properties(false);
|
|
|
|
|
|
|
+ return av1_properties(AV1_ENCODER_TYPE_AOM);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
obs_properties_t *svt_av1_properties(void *unused)
|
|
obs_properties_t *svt_av1_properties(void *unused)
|
|
|
{
|
|
{
|
|
|
UNUSED_PARAMETER(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)
|
|
static bool av1_extra_data(void *data, uint8_t **extra_data, size_t *size)
|