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