1From 7debb47e84900b1d56e629b295f16e5030fd2b3a 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 fd1909d01..c210b357a 100644
17--- a/sys/v4l2/gstv4l2object.c
18+++ b/sys/v4l2/gstv4l2object.c
19@@ -56,6 +56,8 @@ GST_DEBUG_CATEGORY_EXTERN (v4l2_debug);
20
21 #define ENCODED_BUFFER_SIZE             (2 * 1024 * 1024)
22
23+static guint DEFAULT_PROP_MIN_BUFFERS = 0;
24+
25 enum
26 {
27   PROP_0,
28@@ -307,6 +309,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@@ -426,6 +433,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@@ -543,6 +556,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@@ -713,6 +728,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@@ -810,6 +828,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@@ -822,6 +843,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 e5ed0acab..cac92f18c 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