gstreamer: Clean up property handling

Use more correct types, defaults and clean up property names a bit.
This now matches the configuration provided by ffmpeg.
This commit is contained in:
Sebastian Dröge 2023-01-31 15:25:06 +02:00
parent 78ee7e82d9
commit 7b1b33aff2

View File

@ -27,6 +27,40 @@
GST_DEBUG_CATEGORY_STATIC(gst_svtav1enc_debug_category); GST_DEBUG_CATEGORY_STATIC(gst_svtav1enc_debug_category);
#define GST_CAT_DEFAULT gst_svtav1enc_debug_category #define GST_CAT_DEFAULT gst_svtav1enc_debug_category
#define GST_SVTAV1ENC_TYPE_INTRA_REFRESH_TYPE (gst_svtav1enc_intra_refresh_type_get_type())
static GType gst_svtav1enc_intra_refresh_type_get_type(void) {
static GType intra_refresh_type = 0;
static const GEnumValue intra_refresh[] = {
{SVT_AV1_FWDKF_REFRESH, "Open GOP", "CRA"},
{SVT_AV1_KF_REFRESH, "Closed GOP", "IDR"},
{0, NULL, NULL},
};
if (!intra_refresh_type) {
intra_refresh_type = g_enum_register_static("GstSvtAv1EncIntraRefreshType", intra_refresh);
}
return intra_refresh_type;
}
#define GST_SVTAV1ENC_TYPE_RATE_CONTROL_MODE (gst_svtav1enc_rate_control_mode_get_type())
static GType gst_svtav1enc_rate_control_mode_get_type(void) {
static GType rate_control_mode_type = 0;
static const GEnumValue rate_control_mode[] = {
{SVT_AV1_RC_MODE_CQP_OR_CRF,
"Constant quantization parameter/constant rate factor",
"cqp-or-crf"},
{SVT_AV1_RC_MODE_VBR, "Variable bitrate", "vbr"},
{SVT_AV1_RC_MODE_CBR, "Constant bitrate", "cbr"},
{0, NULL, NULL},
};
if (!rate_control_mode_type) {
rate_control_mode_type = g_enum_register_static("GstSvtAv1EncRateControlMode",
rate_control_mode);
}
return rate_control_mode_type;
}
/* prototypes */ /* prototypes */
static void gst_svtav1enc_set_property(GObject *object, guint property_id, const GValue *value, static void gst_svtav1enc_set_property(GObject *object, guint property_id, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
@ -56,44 +90,34 @@ static gboolean gst_svtav1enc_flush(GstVideoEncoder *encoder);
enum { enum {
PROP_0, PROP_0,
PROP_ENCMODE, PROP_PRESET,
PROP_B_PYRAMID, PROP_RATE_CONTROL_MODE,
PROP_P_FRAMES, PROP_TARGET_BITRATE,
PROP_PRED_STRUCTURE, PROP_MAX_BITRATE,
PROP_GOP_SIZE, PROP_MAX_QP_ALLOWED,
PROP_INTRA_REFRESH, PROP_MIN_QP_ALLOWED,
PROP_QP, PROP_QP,
PROP_QP_MAX, PROP_MAXIMUM_BUFFER_SIZE,
PROP_QP_MIN, PROP_ADAPTIVE_QUANTIZATION,
PROP_DEBLOCKING, PROP_INTRA_PERIOD_LENGTH,
PROP_RC_MODE, PROP_INTRA_REFRESH_TYPE,
PROP_BITRATE, PROP_LOGICAL_PROCESSORS,
PROP_LOOKAHEAD, PROP_TARGET_SOCKET
PROP_SCD,
PROP_CORES,
PROP_SOCKET
}; };
#define PROP_RC_MODE_CQP 0 #define PROP_PRESET_DEFAULT 8
#define PROP_RC_MODE_VBR 1 #define PROP_RATE_CONTROL_MODE_DEFAULT SVT_AV1_RC_MODE_CQP_OR_CRF
#define PROP_TARGET_BITRATE_DEFAULT 2000
#define PROP_ENCMODE_DEFAULT 8 #define PROP_MAX_BITRATE_DEFAULT 0
#define PROP_HIERARCHICAL_LEVEL_DEFAULT 4 #define PROP_QP_MAX_QP_ALLOWED_DEFAULT 63
#define PROP_P_FRAMES_DEFAULT 0 #define PROP_QP_MIN_QP_ALLOWED_DEFAULT 0
#define PROP_PRED_STRUCTURE_DEFAULT 2
#define PROP_GOP_SIZE_DEFAULT -1
#define PROP_INTRA_REFRESH_DEFAULT 1
#define PROP_QP_DEFAULT 50 #define PROP_QP_DEFAULT 50
#define PROP_DEBLOCKING_DEFAULT TRUE #define PROP_MAXIMUM_BUFFER_SIZE_DEFAULT 1000
#define PROP_RC_MODE_DEFAULT PROP_RC_MODE_CQP #define PROP_ADAPTIVE_QUANTIZATION_DEFAULT 2
#define PROP_BITRATE_DEFAULT 7000000 #define PROP_INTRA_PERIOD_LENGTH_DEFAULT -2
#define PROP_QP_MAX_DEFAULT 63 #define PROP_INTRA_REFRESH_TYPE_DEFAULT 1
#define PROP_QP_MIN_DEFAULT 0 #define PROP_LOGICAL_PROCESSORS_DEFAULT 0
#define PROP_LOOKAHEAD_DEFAULT (unsigned int)-1 #define PROP_TARGET_SOCKET_DEFAULT -1
#define PROP_SCD_DEFAULT FALSE
#define PROP_AUD_DEFAULT FALSE
#define PROP_CORES_DEFAULT 0
#define PROP_SOCKET_DEFAULT -1
/* pad templates */ /* pad templates */
static GstStaticPadTemplate gst_svtav1enc_sink_pad_template = GST_STATIC_PAD_TEMPLATE( static GstStaticPadTemplate gst_svtav1enc_sink_pad_template = GST_STATIC_PAD_TEMPLATE(
@ -153,61 +177,72 @@ static void gst_svtav1enc_class_init(GstSvtAv1EncClass *klass) {
g_object_class_install_property( g_object_class_install_property(
gobject_class, gobject_class,
PROP_ENCMODE, PROP_PRESET,
g_param_spec_uint("speed", g_param_spec_uint("preset",
"speed (Encoder Mode)", "Preset",
"Quality vs density tradeoff point" "Quality vs density tradeoff point"
" that the encoding is to be performed at" " that the encoding is to be performed at"
" (0 is the highest quality, 12 is the highest speed) ", " (0 is the highest quality, 13 is the highest speed) ",
0, 0,
12, 13,
PROP_ENCMODE_DEFAULT, PROP_PRESET_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class, g_object_class_install_property(gobject_class,
PROP_B_PYRAMID, PROP_RATE_CONTROL_MODE,
g_param_spec_uint("hierarchical-level", g_param_spec_enum("rate-control-mode",
"Hierarchical levels", "Rate-control mode",
"3 : 4 - Level Hierarchy," "Rate Control Mode",
"4 : 5 - Level Hierarchy", GST_SVTAV1ENC_TYPE_RATE_CONTROL_MODE,
3, PROP_RATE_CONTROL_MODE_DEFAULT,
4,
PROP_HIERARCHICAL_LEVEL_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
//g_object_class_install_property (gobject_class, PROP_P_FRAMES,
// g_param_spec_boolean ("p-frames", "P Frames",
// "Use P-frames in the base layer",
// PROP_P_FRAMES_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
//g_object_class_install_property (gobject_class, PROP_PRED_STRUCTURE,
// g_param_spec_uint ("pred-struct", "Prediction Structure",
// "0 : Low Delay P, 1 : Low Delay B"
// ", 2 : Random Access",
// 0, 2, PROP_PRED_STRUCTURE_DEFAULT,
// G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property( g_object_class_install_property(
gobject_class, gobject_class,
PROP_GOP_SIZE, PROP_TARGET_BITRATE,
g_param_spec_int("gop-size", g_param_spec_uint("target-bitrate",
"GOP size", "Target bitrate",
"Period of Intra Frames insertion (-1 is auto)", "Target bitrate in kbits/sec. Only used when in CBR and VBR mode",
-1, 0,
251, 100000,
PROP_GOP_SIZE_DEFAULT, PROP_TARGET_BITRATE_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class, g_object_class_install_property(
PROP_INTRA_REFRESH, gobject_class,
g_param_spec_int("intra-refresh", PROP_MAX_BITRATE,
"Intra refresh type", g_param_spec_uint("max-bitrate",
"CRA (open GOP)" "Maximum bitrate",
"or IDR frames (closed GOP)", "Maximum bitrate in kbits/sec. Only used when in CBQ mode",
1, 0,
2, 100000,
PROP_INTRA_REFRESH_DEFAULT, PROP_MAX_BITRATE_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_PLAYING));
g_object_class_install_property(
gobject_class,
PROP_MAX_QP_ALLOWED,
g_param_spec_uint("max-qp-allowed",
"Max Quantization parameter",
"Maximum QP value allowed for rate control use"
" Only used in VBR mode.",
0,
63,
PROP_MAX_QP_ALLOWED,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
gobject_class,
PROP_MIN_QP_ALLOWED,
g_param_spec_uint("min-qp-allowed",
"Min Quantization parameter",
"Minimum QP value allowed for rate control use"
" Only used in VBR mode.",
0,
63,
PROP_MIN_QP_ALLOWED,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class, g_object_class_install_property(gobject_class,
PROP_QP, PROP_QP,
g_param_spec_uint("qp", g_param_spec_uint("qp",
@ -218,99 +253,69 @@ static void gst_svtav1enc_class_init(GstSvtAv1EncClass *klass) {
PROP_QP_DEFAULT, PROP_QP_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class,
PROP_MAXIMUM_BUFFER_SIZE,
g_param_spec_uint("maximum-buffer-size",
"Maximum Buffer Size",
"Maximum buffer size in milliseconds."
" Only used in CBR mode.",
20,
10000,
PROP_MAXIMUM_BUFFER_SIZE_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property( g_object_class_install_property(
gobject_class, gobject_class,
PROP_DEBLOCKING, PROP_ADAPTIVE_QUANTIZATION,
g_param_spec_boolean("deblocking", g_param_spec_uint("adaptive-quantization",
"Deblock Filter", "Adaptive Quantization",
"Enable Deblocking Loop Filtering", "Adaptive quantization within a frame using segmentation.",
PROP_DEBLOCKING_DEFAULT, 0,
2,
PROP_ADAPTIVE_QUANTIZATION_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
gobject_class,
PROP_INTRA_PERIOD_LENGTH,
g_param_spec_int("intra-period-length",
"Intra Period Length",
"Period of Intra Frames insertion (-2 is auto, -1 no updates)",
-2,
G_MAXINT,
PROP_INTRA_PERIOD_LENGTH_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class, g_object_class_install_property(gobject_class,
PROP_RC_MODE, PROP_INTRA_REFRESH_TYPE,
g_param_spec_uint("rc", g_param_spec_enum("intra-refresh-type",
"Rate-control mode", "Intra refresh type",
"0 : CQP, 1 : VBR", "CRA (open GOP)"
0, "or IDR frames (closed GOP)",
1, GST_SVTAV1ENC_TYPE_INTRA_REFRESH_TYPE,
PROP_RC_MODE_DEFAULT, PROP_INTRA_REFRESH_TYPE_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* TODO: add GST_PARAM_MUTABLE_PLAYING property and handle it? */
g_object_class_install_property( g_object_class_install_property(
gobject_class, gobject_class,
PROP_BITRATE, PROP_LOGICAL_PROCESSORS,
g_param_spec_uint("bitrate", g_param_spec_uint("logical-processors",
"Target bitrate", "Logical Processors",
"Target bitrate in bits/sec. Only used when in VBR mode", "Number of logical CPU cores to be used. 0: auto",
1, 0,
G_MAXUINT, G_MAXUINT,
PROP_BITRATE_DEFAULT, PROP_LOGICAL_PROCESSORS_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property( g_object_class_install_property(
gobject_class, gobject_class,
PROP_QP_MAX, PROP_TARGET_SOCKET,
g_param_spec_uint("max-qp", g_param_spec_int("target-socket",
"Max Quantization parameter",
"Maximum QP value allowed for rate control use"
" Only used in VBR mode.",
0,
63,
PROP_QP_MAX_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
gobject_class,
PROP_QP_MIN,
g_param_spec_uint("min-qp",
"Min Quantization parameter",
"Minimum QP value allowed for rate control use"
" Only used in VBR mode.",
0,
63,
PROP_QP_MIN_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
gobject_class,
PROP_LOOKAHEAD,
g_param_spec_int("lookahead",
"Look Ahead Distance",
"Number of frames to look ahead. -1 lets the encoder pick a value",
-1,
250,
PROP_LOOKAHEAD_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
gobject_class,
PROP_SCD,
g_param_spec_boolean("scd",
"Scene Change Detection",
"Enable Scene Change Detection algorithm",
PROP_SCD_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class,
PROP_CORES,
g_param_spec_uint("cores",
"Number of logical cores",
"Number of logical cores to be used. 0: auto",
0,
UINT_MAX,
PROP_CORES_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property(gobject_class,
PROP_SOCKET,
g_param_spec_int("socket",
"Target socket", "Target socket",
"Target socket to run on. -1: all available", "Target CPU socket to run on. -1: all available",
-1, -1,
15, 15,
PROP_SOCKET_DEFAULT, PROP_TARGET_SOCKET_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
} }
@ -332,36 +337,39 @@ static void gst_svtav1enc_set_property(GObject *object, guint property_id, const
GST_LOG_OBJECT(svtav1enc, "setting property %u", property_id); GST_LOG_OBJECT(svtav1enc, "setting property %u", property_id);
switch (property_id) { switch (property_id) {
case PROP_ENCMODE: svtav1enc->svt_config->enc_mode = g_value_get_uint(value); break; case PROP_PRESET: svtav1enc->svt_config->enc_mode = g_value_get_uint(value); break;
case PROP_GOP_SIZE: case PROP_RATE_CONTROL_MODE:
svtav1enc->svt_config->intra_period_length = g_value_get_int(value) - 1; svtav1enc->svt_config->rate_control_mode = g_value_get_enum(value);
break; break;
case PROP_INTRA_REFRESH: case PROP_TARGET_BITRATE:
svtav1enc->svt_config->intra_refresh_type = g_value_get_int(value);
break;
case PROP_B_PYRAMID:
svtav1enc->svt_config->hierarchical_levels = g_value_get_uint(value);
break;
case PROP_PRED_STRUCTURE:
svtav1enc->svt_config->pred_structure = g_value_get_uint(value);
break;
case PROP_QP: svtav1enc->svt_config->qp = g_value_get_uint(value); break;
case PROP_DEBLOCKING:
svtav1enc->svt_config->enable_dlf_flag = g_value_get_boolean(value);
break;
case PROP_RC_MODE: svtav1enc->svt_config->rate_control_mode = g_value_get_uint(value); break;
case PROP_BITRATE:
svtav1enc->svt_config->target_bit_rate = g_value_get_uint(value) * 1000; svtav1enc->svt_config->target_bit_rate = g_value_get_uint(value) * 1000;
break; break;
case PROP_QP_MAX: svtav1enc->svt_config->max_qp_allowed = g_value_get_uint(value); break; case PROP_MAX_BITRATE:
case PROP_QP_MIN: svtav1enc->svt_config->min_qp_allowed = g_value_get_uint(value); break; svtav1enc->svt_config->max_bit_rate = g_value_get_uint(value) * 1000;
case PROP_SCD:
svtav1enc->svt_config->scene_change_detection = g_value_get_boolean(value);
break; break;
case PROP_CORES: svtav1enc->svt_config->logical_processors = g_value_get_uint(value); break; case PROP_MAX_QP_ALLOWED:
case PROP_SOCKET: svtav1enc->svt_config->target_socket = g_value_get_int(value); break; svtav1enc->svt_config->max_qp_allowed = g_value_get_uint(value);
case PROP_LOOKAHEAD: svtav1enc->svt_config->look_ahead_distance = g_value_get_int(value); break; break;
case PROP_MIN_QP_ALLOWED:
svtav1enc->svt_config->min_qp_allowed = g_value_get_uint(value);
break;
case PROP_QP: svtav1enc->svt_config->qp = g_value_get_uint(value); break;
case PROP_MAXIMUM_BUFFER_SIZE:
svtav1enc->svt_config->maximum_buffer_size_ms = g_value_get_uint(value);
break;
case PROP_ADAPTIVE_QUANTIZATION:
svtav1enc->svt_config->enable_adaptive_quantization = g_value_get_uint(value);
break;
case PROP_INTRA_PERIOD_LENGTH:
svtav1enc->svt_config->intra_period_length = g_value_get_int(value) - 1;
break;
case PROP_INTRA_REFRESH_TYPE:
svtav1enc->svt_config->intra_refresh_type = g_value_get_enum(value);
break;
case PROP_LOGICAL_PROCESSORS:
svtav1enc->svt_config->logical_processors = g_value_get_uint(value);
break;
case PROP_TARGET_SOCKET: svtav1enc->svt_config->target_socket = g_value_get_int(value); break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break;
} }
} }
@ -373,32 +381,35 @@ static void gst_svtav1enc_get_property(GObject *object, guint property_id, GValu
GST_LOG_OBJECT(svtav1enc, "getting property %u", property_id); GST_LOG_OBJECT(svtav1enc, "getting property %u", property_id);
switch (property_id) { switch (property_id) {
case PROP_ENCMODE: g_value_set_uint(value, svtav1enc->svt_config->enc_mode); break; case PROP_PRESET: g_value_set_uint(value, svtav1enc->svt_config->enc_mode); break;
case PROP_B_PYRAMID: g_value_set_uint(value, svtav1enc->svt_config->hierarchical_levels); break; case PROP_RATE_CONTROL_MODE:
g_value_set_enum(value, svtav1enc->svt_config->rate_control_mode);
case PROP_PRED_STRUCTURE: g_value_set_uint(value, svtav1enc->svt_config->pred_structure); break;
case PROP_GOP_SIZE:
g_value_set_int(value, svtav1enc->svt_config->intra_period_length + 1);
break; break;
case PROP_INTRA_REFRESH: case PROP_TARGET_BITRATE:
g_value_set_int(value, svtav1enc->svt_config->intra_refresh_type);
break;
case PROP_QP: g_value_set_uint(value, svtav1enc->svt_config->qp); break;
case PROP_DEBLOCKING:
g_value_set_boolean(value, svtav1enc->svt_config->enable_dlf_flag == 1);
break;
case PROP_RC_MODE: g_value_set_uint(value, svtav1enc->svt_config->rate_control_mode); break;
case PROP_BITRATE:
g_value_set_uint(value, svtav1enc->svt_config->target_bit_rate / 1000); g_value_set_uint(value, svtav1enc->svt_config->target_bit_rate / 1000);
break; break;
case PROP_QP_MAX: g_value_set_uint(value, svtav1enc->svt_config->max_qp_allowed); break; case PROP_MAX_BITRATE:
case PROP_QP_MIN: g_value_set_uint(value, svtav1enc->svt_config->min_qp_allowed); break; g_value_set_uint(value, svtav1enc->svt_config->max_bit_rate / 1000);
case PROP_SCD:
g_value_set_boolean(value, svtav1enc->svt_config->scene_change_detection == 1);
break; break;
case PROP_CORES: g_value_set_uint(value, svtav1enc->svt_config->logical_processors); break; case PROP_MAX_QP_ALLOWED: g_value_set_uint(value, svtav1enc->svt_config->max_qp_allowed); break;
case PROP_SOCKET: g_value_set_int(value, svtav1enc->svt_config->target_socket); break; case PROP_MIN_QP_ALLOWED: g_value_set_uint(value, svtav1enc->svt_config->min_qp_allowed); break;
case PROP_LOOKAHEAD: g_value_set_int(value, svtav1enc->svt_config->look_ahead_distance); break; case PROP_QP: g_value_set_uint(value, svtav1enc->svt_config->qp); break;
case PROP_MAXIMUM_BUFFER_SIZE:
g_value_set_uint(value, svtav1enc->svt_config->maximum_buffer_size_ms);
break;
case PROP_ADAPTIVE_QUANTIZATION:
g_value_set_uint(value, svtav1enc->svt_config->enable_adaptive_quantization);
break;
case PROP_INTRA_PERIOD_LENGTH:
g_value_set_int(value, svtav1enc->svt_config->intra_period_length + 1);
break;
case PROP_INTRA_REFRESH_TYPE:
g_value_set_enum(value, svtav1enc->svt_config->intra_refresh_type);
break;
case PROP_LOGICAL_PROCESSORS:
g_value_set_uint(value, svtav1enc->svt_config->logical_processors);
break;
case PROP_TARGET_SOCKET: g_value_set_int(value, svtav1enc->svt_config->target_socket); break;
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break;
} }
} }