Merge branch 'gst-plugins-ugly-nal-hrd' into 'main'

x264enc: expose nal-hrd property

See merge request gstreamer/gstreamer!908
This commit is contained in:
Mathieu Duponchelle 2024-05-04 01:23:22 +00:00
commit 22efbfb47d
2 changed files with 52 additions and 0 deletions

View file

@ -422,6 +422,7 @@ enum
ARG_TUNE,
ARG_FRAME_PACKING,
ARG_INSERT_VUI,
ARG_NAL_HRD,
};
#define ARG_THREADS_DEFAULT 0 /* 0 means 'auto' which is 1.5x number of CPU cores */
@ -464,6 +465,7 @@ static GString *x264enc_defaults;
#define ARG_TUNE_DEFAULT 0 /* no tuning */
#define ARG_FRAME_PACKING_DEFAULT -1 /* automatic (none, or from input caps) */
#define ARG_INSERT_VUI_DEFAULT TRUE
#define ARG_NAL_HRD_DEFAULT 0
enum
{
@ -504,6 +506,32 @@ gst_x264_enc_pass_get_type (void)
return pass_type;
}
enum
{
GST_X264_ENC_NAL_HRD_NONE = 0,
GST_X264_ENC_NAL_HRD_VBR = 1,
GST_X264_ENC_NAL_HRD_CBR = 2,
};
#define GST_X264_ENC_NAL_HRD_TYPE (gst_x264_enc_nal_hrd_get_type())
static GType
gst_x264_enc_nal_hrd_get_type (void)
{
static GType nal_hrd_type = 0;
static const GEnumValue nal_hrd_types[] = {
{GST_X264_ENC_NAL_HRD_NONE, "None", "none"},
{GST_X264_ENC_NAL_HRD_VBR, "Variable bitrate", "vbr"},
{GST_X264_ENC_NAL_HRD_CBR, "Constant bitrate", "cbr"},
{0, NULL, NULL}
};
if (!nal_hrd_type) {
nal_hrd_type = g_enum_register_static ("GstX264EncNalHrd", nal_hrd_types);
}
return nal_hrd_type;
}
#define GST_X264_ENC_ME_TYPE (gst_x264_enc_me_get_type())
static GType
gst_x264_enc_me_get_type (void)
@ -1209,6 +1237,19 @@ gst_x264_enc_class_init (GstX264EncClass * klass)
g_string_append_printf (x264enc_defaults, ":interlaced=%d",
ARG_INTERLACED_DEFAULT);
/**
* x264enc:nal-hrd:
*
* Signal Hypothetical Reference Decoder information
*
* Since: 1.20
*/
g_object_class_install_property (gobject_class, ARG_NAL_HRD,
g_param_spec_enum ("nal-hrd", "NAL HRD",
"Signal Hypothetical Reference Decoder information",
GST_X264_ENC_NAL_HRD_TYPE, ARG_NAL_HRD_DEFAULT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* append deblock parameters */
g_string_append_printf (x264enc_defaults, ":deblock=0,0");
/* append weighted prediction parameter */
@ -1243,6 +1284,7 @@ gst_x264_enc_class_init (GstX264EncClass * klass)
gst_type_mark_as_plugin_api (GST_X264_ENC_PSY_TUNE_TYPE, 0);
gst_type_mark_as_plugin_api (GST_X264_ENC_SPEED_PRESET_TYPE, 0);
gst_type_mark_as_plugin_api (GST_X264_ENC_TUNE_TYPE, 0);
gst_type_mark_as_plugin_api (GST_X264_ENC_NAL_HRD_TYPE, 0);
}
/* *INDENT-OFF* */
@ -1340,6 +1382,7 @@ gst_x264_enc_init (GstX264Enc * encoder)
encoder->tune = ARG_TUNE_DEFAULT;
encoder->frame_packing = ARG_FRAME_PACKING_DEFAULT;
encoder->insert_vui = ARG_INSERT_VUI_DEFAULT;
encoder->nal_hrd = ARG_NAL_HRD_DEFAULT;
encoder->bitrate_manager =
gst_encoder_bitrate_profile_manager_new (ARG_BITRATE_DEFAULT);
@ -1915,6 +1958,8 @@ skip_vui_parameters:
GST_OBJECT_UNLOCK (encoder);
encoder->x264param.i_nal_hrd = encoder->nal_hrd;
encoder->x264enc = encoder->vtable->x264_encoder_open (&encoder->x264param);
if (!encoder->x264enc) {
GST_ELEMENT_ERROR (encoder, STREAM, ENCODE,
@ -2988,6 +3033,9 @@ gst_x264_enc_set_property (GObject * object, guint prop_id,
case ARG_INSERT_VUI:
encoder->insert_vui = g_value_get_boolean (value);
break;
case ARG_NAL_HRD:
encoder->nal_hrd = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -3132,6 +3180,9 @@ gst_x264_enc_get_property (GObject * object, guint prop_id,
case ARG_INSERT_VUI:
g_value_set_boolean (value, encoder->insert_vui);
break;
case ARG_NAL_HRD:
g_value_set_enum (value, encoder->nal_hrd);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;

View file

@ -113,6 +113,7 @@ struct _GstX264Enc
GString *option_string; /* used by set prop */
gint frame_packing;
gboolean insert_vui;
gint nal_hrd;
/* input description */
GstVideoCodecState *input_state;