From 928f0ed7c027046999f09834fbf2baa139c10d1c Mon Sep 17 00:00:00 2001 From: Denis Shimizu Date: Wed, 8 Nov 2023 06:58:33 -0300 Subject: [PATCH 58/68] v4l2codecs: h264enc: add CABAC enable/disable control Add option to enable/disable CABAC. It will change the encoder parameters and PPS related flag. Upstream-Status: Pending --- gst-libs/gst/codecs/gsth264encoder.c | 47 ++++++++++++++++++++++++++++ sys/v4l2codecs/gstv4l2codech264enc.c | 14 ++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/gst-libs/gst/codecs/gsth264encoder.c b/gst-libs/gst/codecs/gsth264encoder.c index 5769446..4c35956 100644 --- a/gst-libs/gst/codecs/gsth264encoder.c +++ b/gst-libs/gst/codecs/gsth264encoder.c @@ -38,6 +38,8 @@ GST_DEBUG_CATEGORY (gst_h264_encoder_debug); #define H264_DEFAULT_BITRATE 100000 +#define H264ENC_DEFAULT_CABAC_IDC 0 + enum { PROP_0, @@ -45,6 +47,8 @@ enum PROP_MAX_QUALITY, PROP_MIN_QUALITY, PROP_BITRATE, + PROP_CABAC, + PROP_CABAC_INIT_IDC, }; struct _GstH264EncoderPrivate @@ -59,6 +63,8 @@ struct _GstH264EncoderPrivate gint current_quality; guint64 used_bytes; guint64 nb_frames; + gboolean cabac; + guint cabac_init_idc; }; #define parent_class gst_h264_encoder_parent_class @@ -247,6 +253,16 @@ gst_h264_encoder_get_property (GObject * object, guint property_id, g_value_set_uint64 (value, priv->targeted_bitrate); GST_OBJECT_UNLOCK (self); break; + case PROP_CABAC: + GST_OBJECT_LOCK (self); + g_value_set_boolean (value, priv->cabac); + GST_OBJECT_UNLOCK (self); + break; + case PROP_CABAC_INIT_IDC: + GST_OBJECT_LOCK (self); + g_value_set_uint (value, priv->cabac_init_idc); + GST_OBJECT_UNLOCK (self); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -281,6 +297,16 @@ gst_h264_encoder_set_property (GObject * object, guint property_id, priv->targeted_bitrate = g_value_get_uint64 (value); GST_OBJECT_UNLOCK (self); break; + case PROP_CABAC: + GST_OBJECT_LOCK (self); + priv->cabac = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (self); + break; + case PROP_CABAC_INIT_IDC: + GST_OBJECT_LOCK (self); + priv->cabac_init_idc = g_value_get_uint (value); + GST_OBJECT_UNLOCK (self); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -350,4 +376,25 @@ gst_h264_encoder_class_init (GstH264EncoderClass * klass) "Set bitrate target", 0, UINT_MAX, H264_DEFAULT_BITRATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); + + /** + * GstH264Encoder:cabac: + * + * + * Since: 1.2x + */ + g_object_class_install_property (object_class, PROP_CABAC, + g_param_spec_boolean ("cabac", "CABAC", "Enable use of CABAC over CAVLC", + FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstH264Encoder:cabac-init-idc: + * + * + * Since: 1.2x + */ + g_object_class_install_property (object_class, PROP_CABAC_INIT_IDC, + g_param_spec_uint ("cabac-init-idc", "Initial CABAC table ID", + "Set initial CABAC table idc value", 0, 2, H264ENC_DEFAULT_CABAC_IDC, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); } diff --git a/sys/v4l2codecs/gstv4l2codech264enc.c b/sys/v4l2codecs/gstv4l2codech264enc.c index 505d4e9..4591af3 100644 --- a/sys/v4l2codecs/gstv4l2codech264enc.c +++ b/sys/v4l2codecs/gstv4l2codech264enc.c @@ -88,6 +88,8 @@ struct _GstV4l2CodecH264Enc gint height_in_macroblocks; guint qp_max, qp_min; guint64 targeted_bitrate; + gboolean cabac; + guint cabac_init_idc; GstV4l2CodecAllocator *sink_allocator; GstV4l2CodecAllocator *src_allocator; @@ -568,6 +570,7 @@ gst_v4l2_codec_h264_enc_init_sps_pps (GstV4l2CodecH264Enc * self, self->pps.pic_init_qp_minus26 = -13; self->pps.second_chroma_qp_index_offset = self->pps.chroma_qp_index_offset; self->pps.deblocking_filter_control_present_flag = 1; + self->pps.entropy_coding_mode_flag = self->cabac; } static gboolean @@ -638,6 +641,9 @@ gst_v4l2_codec_h264_enc_set_format (GstVideoEncoder * encoder, gst_v4l2_codec_h264_enc_get_qp_range (self->encoder, &self->qp_min, &self->qp_max); + g_object_get (self, "cabac", &self->cabac, "cabac-init-idc", + &self->cabac_init_idc, NULL); + gst_v4l2_codec_h264_enc_init_sps_pps (self, state); return TRUE; @@ -837,8 +843,14 @@ gst_v4l2_codec_h264_enc_fill_encode_params (GstH264Encoder * encoder, break; } + if (self->cabac) { + self->encode_params.flags |= V4L2_H264_ENCODE_FLAG_ENTROPY_CABAC; + } else { + self->encode_params.flags &= ~V4L2_H264_ENCODE_FLAG_ENTROPY_CABAC; + } + self->encode_params.pic_parameter_set_id = 0; - self->encode_params.cabac_init_idc = 0; + self->encode_params.cabac_init_idc = self->cabac_init_idc; self->encode_params.pic_init_qp_minus26 = self->pps.pic_init_qp_minus26; self->encode_params.chroma_qp_index_offset = self->pps.chroma_qp_index_offset; -- 2.25.1