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