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