1From 423ddda18526fe3ad8b84992429ff5225dd993ad Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Mon, 27 Jun 2022 17:48:30 +0800 4Subject: [PATCH 12/12] v4l2: Support disabling buffer sharing 5 6Tested with: 7export GST_DEBUG=v4l2bufferpool:5 8gst-launch-1.0 v4l2src no-buffer-sharing=true ! waylandsink 9 10Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 11--- 12 sys/v4l2/gstv4l2object.c | 20 ++++++++++++++++++++ 13 sys/v4l2/gstv4l2object.h | 5 ++++- 14 2 files changed, 24 insertions(+), 1 deletion(-) 15 16diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c 17index 4c8791a..4b9402f 100644 18--- a/sys/v4l2/gstv4l2object.c 19+++ b/sys/v4l2/gstv4l2object.c 20@@ -59,6 +59,7 @@ GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); 21 #define GST_V4L2_DEFAULT_HEIGHT 240 22 23 static guint DEFAULT_PROP_MIN_BUFFERS = 0; 24+static gboolean DEFAULT_PROP_NO_BUFFER_SHARING = FALSE; 25 26 enum 27 { 28@@ -319,6 +320,9 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, 29 if (buf) 30 DEFAULT_PROP_MIN_BUFFERS = atoi (buf); 31 32+ if ((buf = g_getenv ("GST_V4L2_NO_BUF_SHARING"))) 33+ DEFAULT_PROP_NO_BUFFER_SHARING = buf[0] == '1'; 34+ 35 g_object_class_install_property (gobject_class, PROP_DEVICE, 36 g_param_spec_string ("device", "Device", "Device location", 37 default_device, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); 38@@ -444,6 +448,12 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, 39 0, VIDEO_MAX_FRAME, DEFAULT_PROP_MIN_BUFFERS, 40 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); 41 42+ g_object_class_install_property (gobject_class, PROP_NO_BUFFER_SHARING, 43+ g_param_spec_boolean ("no-buffer-sharing", "No buffer sharing", 44+ "When enabled, disable buffer sharing", 45+ DEFAULT_PROP_NO_BUFFER_SHARING, 46+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); 47+ 48 gst_type_mark_as_plugin_api (GST_TYPE_V4L2_DEVICE_FLAGS, 0); 49 gst_type_mark_as_plugin_api (GST_TYPE_V4L2_TV_NORM, 0); 50 gst_type_mark_as_plugin_api (GST_TYPE_V4L2_IO_MODE, 0); 51@@ -562,6 +572,7 @@ gst_v4l2_object_new (GstElement * element, 52 } 53 54 v4l2object->min_buffers = DEFAULT_PROP_MIN_BUFFERS; 55+ v4l2object->no_buffer_sharing = DEFAULT_PROP_NO_BUFFER_SHARING; 56 57 return v4l2object; 58 } 59@@ -733,6 +744,9 @@ gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object, 60 case PROP_MIN_BUFFERS: 61 v4l2object->min_buffers = g_value_get_uint (value); 62 break; 63+ case PROP_NO_BUFFER_SHARING: 64+ v4l2object->no_buffer_sharing = g_value_get_boolean (value); 65+ break; 66 default: 67 return FALSE; 68 break; 69@@ -833,6 +847,9 @@ gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object, 70 case PROP_MIN_BUFFERS: 71 g_value_set_uint (value, v4l2object->min_buffers); 72 break; 73+ case PROP_NO_BUFFER_SHARING: 74+ g_value_set_boolean (value, v4l2object->no_buffer_sharing); 75+ break; 76 default: 77 return FALSE; 78 break; 79@@ -5100,6 +5117,9 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query) 80 if (min + obj->min_buffers + 1 > VIDEO_MAX_FRAME) 81 can_share_own_pool = FALSE; 82 83+ if (obj->no_buffer_sharing) 84+ can_share_own_pool = FALSE; 85+ 86 /* select a pool */ 87 switch (obj->mode) { 88 case GST_V4L2_IO_RW: 89diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h 90index 276d58f..fbe12b4 100644 91--- a/sys/v4l2/gstv4l2object.h 92+++ b/sys/v4l2/gstv4l2object.h 93@@ -222,6 +222,8 @@ struct _GstV4l2Object { 94 * on slow USB firmwares. When this is set, gst_v4l2_set_format() will modify 95 * the caps to reflect what was negotiated during fixation */ 96 gboolean skip_try_fmt_probes; 97+ 98+ gboolean no_buffer_sharing; 99 }; 100 101 struct _GstV4l2ObjectClassHelper { 102@@ -247,7 +249,8 @@ GType gst_v4l2_object_get_type (void); 103 PROP_EXTRA_CONTROLS, \ 104 PROP_PIXEL_ASPECT_RATIO, \ 105 PROP_FORCE_ASPECT_RATIO, \ 106- PROP_MIN_BUFFERS 107+ PROP_MIN_BUFFERS, \ 108+ PROP_NO_BUFFER_SHARING 109 110 /* create/destroy */ 111 GstV4l2Object* gst_v4l2_object_new (GstElement * element, 112-- 1132.20.1 114 115