On 11/9/2021 5:15 PM, Denys Dmytriyenko wrote:
On Tue, Nov 09, 2021 at 05:10:25PM -0600, Bajjuri, Praneeth wrote:


On 11/9/2021 6:43 AM, [email protected] wrote:
From: Sidraya Jayagond <[email protected]>


Looks like you are subscribed now , The patch is not seen in the
mailing list though. Please resubmit.


Add extended controls such as video bitrate,
gopsize and iperiod for H264 encoder.

If this for dunfell branch only? If so please mention clearly in the
subject

It is not specifically for dunfell - it is not even an OE/Yocto patch. It is a
patch against gst-plugins-good version 1.16.3, which is clearly mentioned, per
earlier request.


How about the recipe update at
meta-arago-extras/recipes-multimedia/gstreamer/ ? Is there anything
need to be done here?


Sidraya,

Please resubmit to mailing list with recipe update included as well.



If this work is based on the original author as seen here:
https://git.yoctoproject.org/cgit/cgit.cgi/meta-arago/commit/?h=dunfell&id=a5fef8b361f06ebe18871bde853c854614d900c1

Please add/retain authorship accordingly and add Signed-off-by

Signed-off-by: Sidraya Jayagond <[email protected]>


---
Raised merge-request to upstream and still discussion is in progress.

Working on to add following controls to complete the upstream of the patch.
1. GOP clousre.
2. Add and expose controls of VBR and CBR.

Currently backported this patch to 1.16.3 version, As it requires
to be in dunfell baseline for TI SDK.

Following is the link of merge-request for reference.
https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1010

Are you planning to address the review comments anytime soon? The
upstream thread is untouched since 4 months so just checking.


  sys/v4l2/gstv4l2h264enc.c | 136 +++++++++++++++++++++++++++++++++++++-
  sys/v4l2/gstv4l2h264enc.h |   4 ++
  2 files changed, 138 insertions(+), 2 deletions(-)

diff --git a/sys/v4l2/gstv4l2h264enc.c b/sys/v4l2/gstv4l2h264enc.c
index ee160b3a0..61ed9a813 100644
--- a/sys/v4l2/gstv4l2h264enc.c
+++ b/sys/v4l2/gstv4l2h264enc.c
@@ -47,6 +47,9 @@ enum
  {
    PROP_0,
    V4L2_STD_OBJECT_PROPS,
+  PROP_BITRATE,
+  PROP_GOPSIZE,
+  PROP_I_PERIOD,
  /* TODO add H264 controls
   * PROP_I_FRAME_QP,
   * PROP_P_FRAME_QP,
@@ -74,18 +77,54 @@ enum
  #define gst_v4l2_h264_enc_parent_class parent_class
  G_DEFINE_TYPE (GstV4l2H264Enc, gst_v4l2_h264_enc, GST_TYPE_V4L2_VIDEO_ENC);
+#define DEFAULT_PROP_BITRATE   (500 * 1000)
+#define DEFAULT_PROP_GOPSIZE   (1800)
+#define DEFAULT_PROP_I_PERIOD  (30)
+
  static void
  gst_v4l2_h264_enc_set_property (GObject * object,
      guint prop_id, const GValue * value, GParamSpec * pspec)
  {
-  /* TODO */
+
+  GstV4l2H264Enc *self = GST_V4L2_H264_ENC (object);
+
+  switch (prop_id) {
+    case PROP_BITRATE:
+      self->bitrate = g_value_get_uint (value);
+      break;
+    case PROP_GOPSIZE:
+      self->gopsize = g_value_get_uint (value);
+      break;
+    case PROP_I_PERIOD:
+      self->iperiod = g_value_get_uint (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
  }
  static void
  gst_v4l2_h264_enc_get_property (GObject * object,
      guint prop_id, GValue * value, GParamSpec * pspec)
  {
-  /* TODO */
+
+  GstV4l2H264Enc *self = GST_V4L2_H264_ENC (object);
+
+  switch (prop_id) {
+    case PROP_BITRATE:
+      g_value_set_uint (value, self->bitrate);
+      break;
+    case PROP_GOPSIZE:
+      g_value_set_uint (value, self->gopsize);
+      break;
+    case PROP_I_PERIOD:
+      g_value_set_uint (value, self->iperiod);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
  }
  static gint
@@ -270,6 +309,81 @@ v4l2_level_to_string (gint v4l2_level)
  static void
  gst_v4l2_h264_enc_init (GstV4l2H264Enc * self)
  {
+  /* Initializing H264 encoder extended controls parameter
+   * with default values */
+  self->bitrate = DEFAULT_PROP_BITRATE;
+  self->gopsize = DEFAULT_PROP_GOPSIZE;
+  self->iperiod = DEFAULT_PROP_I_PERIOD;
+}
+
+static void
+gst_v4l2_h264_enc_get_ctrls (GstV4l2Object * v4l2object)
+{
+  struct v4l2_ext_controls ctrls;
+  struct v4l2_ext_control controls[3];
+  guint i;
+
+  memset (&ctrls, 0, sizeof (ctrls));
+  memset (controls, 0, sizeof (controls));
+
+  ctrls.which = V4L2_CTRL_WHICH_CUR_VAL;
+  ctrls.count = 3;
+  ctrls.controls = controls;
+
+  controls[0].id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
+  controls[1].id = V4L2_CID_MPEG_VIDEO_BITRATE;
+  controls[2].id = V4L2_CID_MPEG_VIDEO_H264_I_PERIOD;
+
+  if (v4l2object->ioctl (v4l2object->video_fd, VIDIOC_G_EXT_CTRLS, &ctrls)) {
+    GST_DEBUG_OBJECT (v4l2object, "Failed to get extended "
+        "controls for H264 encoder");
+    return;
+  } else {
+    GST_LOG_OBJECT (v4l2object, "Extended controls "
+        "for H264 encoder bitrate=[%d] gopsize=[%d] iperiod=[%d]",
+        controls[0].value, controls[1].value, controls[2].value);
+  }
+}
+
+static void
+gst_v4l2_h264_enc_set_ctrls (GstV4l2Object * v4l2object, guint bitrate,
+    guint gop_size, guint i_period)
+{
+  struct v4l2_ext_controls ctrls;
+  struct v4l2_ext_control controls[3];
+  guint i;
+
+  memset (&ctrls, 0, sizeof (ctrls));
+  memset (controls, 0, sizeof (controls));
+
+  ctrls.which = V4L2_CTRL_WHICH_CUR_VAL;
+  ctrls.count = 3;
+  ctrls.controls = controls;
+
+  controls[0].id = V4L2_CID_MPEG_VIDEO_GOP_SIZE;
+  controls[0].value = gop_size;
+  controls[1].id = V4L2_CID_MPEG_VIDEO_BITRATE;
+  controls[1].value = bitrate;
+  controls[2].id = V4L2_CID_MPEG_VIDEO_H264_I_PERIOD;
+  controls[2].value = i_period;
+
+  if (v4l2object->ioctl (v4l2object->video_fd, VIDIOC_S_EXT_CTRLS, &ctrls)) {
+    GST_DEBUG_OBJECT (v4l2object, "Failed to set extended "
+        "controls for encoder");
+    return;
+  }
+}
+
+static gboolean
+gst_v4l2_h264_enc_start (GstV4l2VideoEnc * v4l2enc)
+{
+  GstV4l2H264Enc *self = GST_V4L2_H264_ENC (v4l2enc);
+
+  gst_v4l2_h264_enc_set_ctrls (v4l2enc->v4l2output, self->bitrate,
+      self->gopsize, self->iperiod);
+  gst_v4l2_h264_enc_get_ctrls (v4l2enc->v4l2output);
+
+  return GST_VIDEO_ENCODER_CLASS (parent_class)->start (v4l2enc);
  }
  static void
@@ -278,12 +392,14 @@ gst_v4l2_h264_enc_class_init (GstV4l2H264EncClass * klass)
    GstElementClass *element_class;
    GObjectClass *gobject_class;
    GstV4l2VideoEncClass *baseclass;
+  GstVideoEncoderClass *video_encoder_class;
    parent_class = g_type_class_peek_parent (klass);
    element_class = (GstElementClass *) klass;
    gobject_class = (GObjectClass *) klass;
    baseclass = (GstV4l2VideoEncClass *) (klass);
+  video_encoder_class = (GstVideoEncoderClass *) klass;
    GST_DEBUG_CATEGORY_INIT (gst_v4l2_h264_enc_debug, "v4l2h264enc", 0,
        "V4L2 H.264 Encoder");
@@ -297,8 +413,24 @@ gst_v4l2_h264_enc_class_init (GstV4l2H264EncClass * klass)
        GST_DEBUG_FUNCPTR (gst_v4l2_h264_enc_set_property);
    gobject_class->get_property =
        GST_DEBUG_FUNCPTR (gst_v4l2_h264_enc_get_property);
+  video_encoder_class->start = GST_DEBUG_FUNCPTR (gst_v4l2_h264_enc_start);
    baseclass->codec_name = "H264";
+  g_object_class_install_property (gobject_class, PROP_BITRATE,
+      g_param_spec_uint ("bitrate", "Bitrate", "Bitrate in bit/sec",
+          50 * 1000, 100 * 1000 * 1000, DEFAULT_PROP_BITRATE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_GOPSIZE,
+      g_param_spec_uint ("gop-size", "Gop size", "Size of a group of "
+          "picture starting with an IDR frame",
+          1, 7200, DEFAULT_PROP_GOPSIZE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_I_PERIOD,
+      g_param_spec_uint ("i-period", "I period", "I Frame Period",
+          1, 600, DEFAULT_PROP_I_PERIOD,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
    baseclass->profile_cid = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
    baseclass->profile_to_string = v4l2_profile_to_string;
    baseclass->profile_from_string = v4l2_profile_from_string;
diff --git a/sys/v4l2/gstv4l2h264enc.h b/sys/v4l2/gstv4l2h264enc.h
index 3bfa34346..9f8f7e120 100644
--- a/sys/v4l2/gstv4l2h264enc.h
+++ b/sys/v4l2/gstv4l2h264enc.h
@@ -42,6 +42,10 @@ typedef struct _GstV4l2H264EncClass GstV4l2H264EncClass;
  struct _GstV4l2H264Enc
  {
    GstV4l2VideoEnc parent;
+  /*H264 Extended Controls */
+  guint bitrate;
+  guint gopsize;
+  guint iperiod;
  };
  struct _GstV4l2H264EncClass




-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#13365): 
https://lists.yoctoproject.org/g/meta-arago/message/13365
Mute This Topic: https://lists.yoctoproject.org/mt/86944799/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/meta-arago/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to