1*4882a593SmuzhiyunFrom 27c5416b50ff2a62ca38c82bb45196e1e8ad1035 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Thu, 23 Jun 2022 16:04:18 +0800
4*4882a593SmuzhiyunSubject: [PATCH 11/12] v4l2: Support setting v4l2 min buffers
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunTested with:
7*4882a593Smuzhiyungst-launch-1.0 v4l2src min-buffers=32 ! waylandsink ts-offset=1000000000
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
10*4882a593Smuzhiyun---
11*4882a593Smuzhiyun sys/v4l2/gstv4l2object.c | 24 ++++++++++++++++++++++++
12*4882a593Smuzhiyun sys/v4l2/gstv4l2object.h |  3 ++-
13*4882a593Smuzhiyun 2 files changed, 26 insertions(+), 1 deletion(-)
14*4882a593Smuzhiyun
15*4882a593Smuzhiyundiff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
16*4882a593Smuzhiyunindex 09fabf0..4c8791a 100644
17*4882a593Smuzhiyun--- a/sys/v4l2/gstv4l2object.c
18*4882a593Smuzhiyun+++ b/sys/v4l2/gstv4l2object.c
19*4882a593Smuzhiyun@@ -58,6 +58,8 @@ GST_DEBUG_CATEGORY_EXTERN (v4l2_debug);
20*4882a593Smuzhiyun #define GST_V4L2_DEFAULT_WIDTH          320
21*4882a593Smuzhiyun #define GST_V4L2_DEFAULT_HEIGHT         240
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun+static guint DEFAULT_PROP_MIN_BUFFERS = 0;
24*4882a593Smuzhiyun+
25*4882a593Smuzhiyun enum
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun   PROP_0,
28*4882a593Smuzhiyun@@ -312,6 +314,11 @@ void
29*4882a593Smuzhiyun gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class,
30*4882a593Smuzhiyun     const char *default_device)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun+  const gchar *buf = g_getenv ("GST_V4L2_MIN_BUFS");
33*4882a593Smuzhiyun+
34*4882a593Smuzhiyun+  if (buf)
35*4882a593Smuzhiyun+    DEFAULT_PROP_MIN_BUFFERS = atoi (buf);
36*4882a593Smuzhiyun+
37*4882a593Smuzhiyun   g_object_class_install_property (gobject_class, PROP_DEVICE,
38*4882a593Smuzhiyun       g_param_spec_string ("device", "Device", "Device location",
39*4882a593Smuzhiyun           default_device, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
40*4882a593Smuzhiyun@@ -431,6 +438,12 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class,
41*4882a593Smuzhiyun           "When enabled, the pixel aspect ratio will be enforced", TRUE,
42*4882a593Smuzhiyun           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun+  g_object_class_install_property (gobject_class, PROP_MIN_BUFFERS,
45*4882a593Smuzhiyun+      g_param_spec_uint ("min-buffers", "Min buffers",
46*4882a593Smuzhiyun+          "Override the driver's min buffers (0 means auto)",
47*4882a593Smuzhiyun+          0, VIDEO_MAX_FRAME, DEFAULT_PROP_MIN_BUFFERS,
48*4882a593Smuzhiyun+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
49*4882a593Smuzhiyun+
50*4882a593Smuzhiyun   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_DEVICE_FLAGS, 0);
51*4882a593Smuzhiyun   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_TV_NORM, 0);
52*4882a593Smuzhiyun   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_IO_MODE, 0);
53*4882a593Smuzhiyun@@ -548,6 +561,8 @@ gst_v4l2_object_new (GstElement * element,
54*4882a593Smuzhiyun     v4l2object->munmap = munmap;
55*4882a593Smuzhiyun   }
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun+  v4l2object->min_buffers = DEFAULT_PROP_MIN_BUFFERS;
58*4882a593Smuzhiyun+
59*4882a593Smuzhiyun   return v4l2object;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun@@ -715,6 +730,9 @@ gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object,
63*4882a593Smuzhiyun     case PROP_FORCE_ASPECT_RATIO:
64*4882a593Smuzhiyun       v4l2object->keep_aspect = g_value_get_boolean (value);
65*4882a593Smuzhiyun       break;
66*4882a593Smuzhiyun+    case PROP_MIN_BUFFERS:
67*4882a593Smuzhiyun+      v4l2object->min_buffers = g_value_get_uint (value);
68*4882a593Smuzhiyun+      break;
69*4882a593Smuzhiyun     default:
70*4882a593Smuzhiyun       return FALSE;
71*4882a593Smuzhiyun       break;
72*4882a593Smuzhiyun@@ -812,6 +830,9 @@ gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object,
73*4882a593Smuzhiyun     case PROP_FORCE_ASPECT_RATIO:
74*4882a593Smuzhiyun       g_value_set_boolean (value, v4l2object->keep_aspect);
75*4882a593Smuzhiyun       break;
76*4882a593Smuzhiyun+    case PROP_MIN_BUFFERS:
77*4882a593Smuzhiyun+      g_value_set_uint (value, v4l2object->min_buffers);
78*4882a593Smuzhiyun+      break;
79*4882a593Smuzhiyun     default:
80*4882a593Smuzhiyun       return FALSE;
81*4882a593Smuzhiyun       break;
82*4882a593Smuzhiyun@@ -824,6 +845,9 @@ gst_v4l2_get_driver_min_buffers (GstV4l2Object * v4l2object)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun   struct v4l2_control control = { 0, };
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun+  if (v4l2object->min_buffers)
87*4882a593Smuzhiyun+    return;
88*4882a593Smuzhiyun+
89*4882a593Smuzhiyun   g_return_if_fail (GST_V4L2_IS_OPEN (v4l2object));
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun   if (V4L2_TYPE_IS_OUTPUT (v4l2object->type))
92*4882a593Smuzhiyundiff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h
93*4882a593Smuzhiyunindex 3a5c961..276d58f 100644
94*4882a593Smuzhiyun--- a/sys/v4l2/gstv4l2object.h
95*4882a593Smuzhiyun+++ b/sys/v4l2/gstv4l2object.h
96*4882a593Smuzhiyun@@ -246,7 +246,8 @@ GType gst_v4l2_object_get_type (void);
97*4882a593Smuzhiyun     PROP_CAPTURE_IO_MODE,     \
98*4882a593Smuzhiyun     PROP_EXTRA_CONTROLS,      \
99*4882a593Smuzhiyun     PROP_PIXEL_ASPECT_RATIO,  \
100*4882a593Smuzhiyun-    PROP_FORCE_ASPECT_RATIO
101*4882a593Smuzhiyun+    PROP_FORCE_ASPECT_RATIO,  \
102*4882a593Smuzhiyun+    PROP_MIN_BUFFERS
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun /* create/destroy */
105*4882a593Smuzhiyun GstV4l2Object*  gst_v4l2_object_new       (GstElement * element,
106*4882a593Smuzhiyun--
107*4882a593Smuzhiyun2.20.1
108*4882a593Smuzhiyun
109