All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] [dunfell]gstreamer1.0-plugins-good: backported Extended controls support for H264 encoder.
@ 2021-11-11  7:45 sidraya.bj
  2021-11-11 18:39 ` Denys Dmytriyenko
  0 siblings, 1 reply; 3+ messages in thread
From: sidraya.bj @ 2021-11-11  7:45 UTC (permalink / raw)
  To: meta-arago
  Cc: denis, yogeshs, praneeth, d-huang, prashanth.ka, praveen.ap,
	Sidraya Jayagond

From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>

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

Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
---
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

 ...-1.16.3-v4l2h264enc-Add-Extended-con.patch | 237 ++++++++++++++++++
 .../gstreamer1.0-plugins-good_1.16.%.bbappend |   1 +
 2 files changed, 238 insertions(+)
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch

diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
new file mode 100644
index 00000000..9358bd87
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
@@ -0,0 +1,237 @@
+From 72ce7eb2c17f3dd6b4653985f5660692b88ac54f Mon Sep 17 00:00:00 2001
+From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
+Date: Tue, 2 Nov 2021 19:12:48 +0530
+Subject: [PATCH] [gst-plugins-good 1.16.3]v4l2h264enc:Add Extended controls
+ support for H264 encoder
+
+Add extended controls such as video bitrate,
+gopsize and iperiod for H264 encoder.
+
+Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
+---
+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
+
+ 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
+--
+2.17.1
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
index e2ddbc27..0c6dc81b 100644
--- a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
@@ -8,6 +8,7 @@ SRC_URI += " \
     file://0001-v4l2object-Update-formats-table-to-include-YUV422-mu.patch \
     file://0001-v4l2src-Check-for-drm-memory-support-in-try_import.patch \
     file://0001-qmlglsink-fix-build-on-EGL-platform-without-X11-head.patch \
+    file://0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch \
 "
 
 PR_append = ".arago3"
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] [dunfell]gstreamer1.0-plugins-good: backported Extended controls support for H264 encoder.
  2021-11-11  7:45 [PATCH] [dunfell]gstreamer1.0-plugins-good: backported Extended controls support for H264 encoder sidraya.bj
@ 2021-11-11 18:39 ` Denys Dmytriyenko
  2021-11-11 20:02   ` praneeth
  0 siblings, 1 reply; 3+ messages in thread
From: Denys Dmytriyenko @ 2021-11-11 18:39 UTC (permalink / raw)
  To: sidraya.bj
  Cc: meta-arago, yogeshs, praneeth, d-huang, prashanth.ka, praveen.ap

On Thu, Nov 11, 2021 at 01:15:51PM +0530, sidraya.bj@pathpartnertech.com wrote:
> From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
> 
> Add patch of extended controls such as video bitrate,
> gopsize and iperiod for H264 encoder.
> 
> Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
> ---
> 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
> 
>  ...-1.16.3-v4l2h264enc-Add-Extended-con.patch | 237 ++++++++++++++++++
>  .../gstreamer1.0-plugins-good_1.16.%.bbappend |   1 +
>  2 files changed, 238 insertions(+)
>  create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
> 
> diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
> new file mode 100644
> index 00000000..9358bd87
> --- /dev/null
> +++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
> @@ -0,0 +1,237 @@
> +From 72ce7eb2c17f3dd6b4653985f5660692b88ac54f Mon Sep 17 00:00:00 2001
> +From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
> +Date: Tue, 2 Nov 2021 19:12:48 +0530
> +Subject: [PATCH] [gst-plugins-good 1.16.3]v4l2h264enc:Add Extended controls
> + support for H264 encoder
> +
> +Add extended controls such as video bitrate,
> +gopsize and iperiod for H264 encoder.
> +
> +Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>

Thanks!
This patch is missing Upstream-Status: here.


> +---
> +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
> +
> + 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
> +--
> +2.17.1
> diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
> index e2ddbc27..0c6dc81b 100644
> --- a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
> +++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
> @@ -8,6 +8,7 @@ SRC_URI += " \
>      file://0001-v4l2object-Update-formats-table-to-include-YUV422-mu.patch \
>      file://0001-v4l2src-Check-for-drm-memory-support-in-try_import.patch \
>      file://0001-qmlglsink-fix-build-on-EGL-platform-without-X11-head.patch \
> +    file://0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch \
>  "
>  
>  PR_append = ".arago3"
> -- 
> 2.17.1
> 

-- 
Regards,
Denys Dmytriyenko <denis@denix.org>
PGP: 0x420902729A92C964 - https://denix.org/0x420902729A92C964
Fingerprint: 25FC E4A5 8A72 2F69 1186  6D76 4209 0272 9A92 C964

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] [dunfell]gstreamer1.0-plugins-good: backported Extended controls support for H264 encoder.
  2021-11-11 18:39 ` Denys Dmytriyenko
@ 2021-11-11 20:02   ` praneeth
  0 siblings, 0 replies; 3+ messages in thread
From: praneeth @ 2021-11-11 20:02 UTC (permalink / raw)
  To: Denys Dmytriyenko, sidraya.bj
  Cc: meta-arago, yogeshs, d-huang, prashanth.ka, praveen.ap



On 11/11/2021 12:39 PM, Denys Dmytriyenko wrote:
> On Thu, Nov 11, 2021 at 01:15:51PM +0530, sidraya.bj@pathpartnertech.com wrote:
>> From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
>>
>> Add patch of extended controls such as video bitrate,
>> gopsize and iperiod for H264 encoder.
>>
>> Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
>> ---
>> 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
>>
>>   ...-1.16.3-v4l2h264enc-Add-Extended-con.patch | 237 ++++++++++++++++++
>>   .../gstreamer1.0-plugins-good_1.16.%.bbappend |   1 +
>>   2 files changed, 238 insertions(+)
>>   create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
>>
>> diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
>> new file mode 100644
>> index 00000000..9358bd87
>> --- /dev/null
>> +++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch
>> @@ -0,0 +1,237 @@
>> +From 72ce7eb2c17f3dd6b4653985f5660692b88ac54f Mon Sep 17 00:00:00 2001
>> +From: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
>> +Date: Tue, 2 Nov 2021 19:12:48 +0530
>> +Subject: [PATCH] [gst-plugins-good 1.16.3]v4l2h264enc:Add Extended controls
>> + support for H264 encoder
>> +
>> +Add extended controls such as video bitrate,
>> +gopsize and iperiod for H264 encoder.
>> +
>> +Signed-off-by: Sidraya Jayagond <sidraya.bj@pathpartnertech.com>
> 
> Thanks!
> This patch is missing Upstream-Status: here.
> 

Will send a V2 with Upstream-Status description.

> 
>> +---
>> +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
>> +
>> + 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
>> +--
>> +2.17.1
>> diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
>> index e2ddbc27..0c6dc81b 100644
>> --- a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
>> +++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.16.%.bbappend
>> @@ -8,6 +8,7 @@ SRC_URI += " \
>>       file://0001-v4l2object-Update-formats-table-to-include-YUV422-mu.patch \
>>       file://0001-v4l2src-Check-for-drm-memory-support-in-try_import.patch \
>>       file://0001-qmlglsink-fix-build-on-EGL-platform-without-X11-head.patch \
>> +    file://0001-gst-plugins-good-1.16.3-v4l2h264enc-Add-Extended-con.patch \
>>   "
>>   
>>   PR_append = ".arago3"
>> -- 
>> 2.17.1
>>
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-11-11 20:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-11  7:45 [PATCH] [dunfell]gstreamer1.0-plugins-good: backported Extended controls support for H264 encoder sidraya.bj
2021-11-11 18:39 ` Denys Dmytriyenko
2021-11-11 20:02   ` praneeth

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.