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