meta-digi/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0058-v4l2codecs-h264enc-add...

155 lines
5.1 KiB
Diff

From 928f0ed7c027046999f09834fbf2baa139c10d1c Mon Sep 17 00:00:00 2001
From: Denis Shimizu <denis.shimizu@collabora.com>
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