155 lines
5.1 KiB
Diff
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
|
|
|