diff --git a/subprojects/gst-plugins-ugly/docs/gst_plugins_cache.json b/subprojects/gst-plugins-ugly/docs/gst_plugins_cache.json index 303ca025b4..d4f25b0c60 100644 --- a/subprojects/gst-plugins-ugly/docs/gst_plugins_cache.json +++ b/subprojects/gst-plugins-ugly/docs/gst_plugins_cache.json @@ -1014,6 +1014,18 @@ "type": "gchararray", "writable": true }, + "nal-hrd": { + "blurb": "Signal Hypothetical Reference Decoder information", + "conditionally-available": false, + "construct": false, + "construct-only": false, + "controllable": false, + "default": "none (0)", + "mutable": "null", + "readable": true, + "type": "GstX264EncNalHrd", + "writable": true + }, "noise-reduction": { "blurb": "Noise reduction strength", "conditionally-available": false, @@ -1399,6 +1411,26 @@ } ] }, + "GstX264EncNalHrd": { + "kind": "enum", + "values": [ + { + "desc": "None", + "name": "none", + "value": "0" + }, + { + "desc": "Variable bitrate", + "name": "vbr", + "value": "1" + }, + { + "desc": "Constant bitrate", + "name": "cbr", + "value": "2" + } + ] + }, "GstX264EncPass": { "kind": "enum", "values": [ diff --git a/subprojects/gst-plugins-ugly/docs/meson.build b/subprojects/gst-plugins-ugly/docs/meson.build index af312e55ab..1d726ea81d 100644 --- a/subprojects/gst-plugins-ugly/docs/meson.build +++ b/subprojects/gst-plugins-ugly/docs/meson.build @@ -114,9 +114,9 @@ gst_plugins_doc = run_command( '--index', cdir / 'index.md', '--gst_index', cdir / 'index.md', '--gst_c_sources', - root_rel / 'sys/*/*.[ch]', - root_rel / 'ext/*/*.[ch]', - root_rel / 'gst/*/*.[ch]', + cdir / root_rel / 'sys/*/*.[ch]', + cdir / root_rel / 'ext/*/*.[ch]', + cdir / root_rel / 'gst/*/*.[ch]', '--gst_c_source_filters', excludes, '--gst_cache_file', plugins_cache, check: true, diff --git a/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c b/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c index 78dfc3c08e..37291ca4b0 100644 --- a/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c +++ b/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.c @@ -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,25 @@ gst_x264_enc_pass_get_type (void) return pass_type; } +#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 +1230,25 @@ 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. + * + * Required for Blu-ray streams, television broadcast and a + * few other specialist areas. + * + * It can be used for instance to force true CBR, and will cause + * the encoder to output NULL padding packets. + * + * Since: 1.26 + */ + 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 +1283,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 +1381,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 +1957,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 +3032,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 +3179,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; diff --git a/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.h b/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.h index 7b1911a55b..b9c9f8201d 100644 --- a/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.h +++ b/subprojects/gst-plugins-ugly/ext/x264/gstx264enc.h @@ -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; @@ -136,6 +137,24 @@ struct _GstX264EncClass GstVideoEncoderClass parent_class; }; +/** + * GstX264EncNalHrd: + * @GST_X264_ENC_NAL_HRD_NONE: Specify no HRD information + * @GST_X264_ENC_NAL_HRD_VBR: Specify HRD information + * @GST_X264_ENC_NAL_HRD_CBR: Specify HRD information and pack the bitstream + * + * Signal HRD information. Required for Blu-ray streams, + * television broadcast and a few other specialist areas. + * + * Since: 1.26 + */ +typedef enum +{ + GST_X264_ENC_NAL_HRD_NONE = 0, + GST_X264_ENC_NAL_HRD_VBR = 1, + GST_X264_ENC_NAL_HRD_CBR = 2, +} GstX264EncNalHrd; + GType gst_x264_enc_get_type (void); GST_ELEMENT_REGISTER_DECLARE (x264enc);