From 447ea64dbd759495ba84b2fc0d54859f3e5a8fa5 Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Mon, 27 Jun 2022 17:48:30 +0800 Subject: [PATCH 12/12] v4l2: Support configuring buffer sharing Tested with: export GST_DEBUG=v4l2bufferpool:5 gst-launch-1.0 v4l2src buffer-sharing=true ! waylandsink gst-launch-1.0 v4l2src buffer-sharing=false ! waylandsink Signed-off-by: Jeffy Chen --- sys/v4l2/gstv4l2object.c | 21 +++++++++++++++++++++ sys/v4l2/gstv4l2object.h | 5 ++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 5940100..922e367 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -59,6 +59,7 @@ GST_DEBUG_CATEGORY_EXTERN (v4l2_debug); #define GST_V4L2_DEFAULT_HEIGHT 240 static guint DEFAULT_PROP_MIN_BUFFERS = 0; +static gboolean DEFAULT_PROP_BUFFER_SHARING = TRUE; enum { @@ -319,6 +320,9 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, if (buf) DEFAULT_PROP_MIN_BUFFERS = atoi (buf); + if ((buf = g_getenv ("GST_V4L2_BUF_SHARING"))) + DEFAULT_PROP_BUFFER_SHARING = buf[0] == '1'; + g_object_class_install_property (gobject_class, PROP_DEVICE, g_param_spec_string ("device", "Device", "Device location", default_device, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -444,6 +448,12 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class, 0, VIDEO_MAX_FRAME, DEFAULT_PROP_MIN_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_BUFFER_SHARING, + g_param_spec_boolean ("buffer-sharing", "Buffer sharing", + "Enabled buffer sharing", + DEFAULT_PROP_BUFFER_SHARING, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_type_mark_as_plugin_api (GST_TYPE_V4L2_DEVICE_FLAGS, 0); gst_type_mark_as_plugin_api (GST_TYPE_V4L2_TV_NORM, 0); gst_type_mark_as_plugin_api (GST_TYPE_V4L2_IO_MODE, 0); @@ -565,6 +575,7 @@ gst_v4l2_object_new (GstElement * element, } v4l2object->min_buffers = DEFAULT_PROP_MIN_BUFFERS; + v4l2object->buffer_sharing = DEFAULT_PROP_BUFFER_SHARING; return v4l2object; } @@ -741,6 +752,9 @@ gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object, case PROP_MIN_BUFFERS: v4l2object->min_buffers = g_value_get_uint (value); break; + case PROP_BUFFER_SHARING: + v4l2object->buffer_sharing = g_value_get_boolean (value); + break; default: return FALSE; break; @@ -841,6 +855,9 @@ gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object, case PROP_MIN_BUFFERS: g_value_set_uint (value, v4l2object->min_buffers); break; + case PROP_BUFFER_SHARING: + g_value_set_boolean (value, v4l2object->buffer_sharing); + break; default: return FALSE; break; @@ -5153,7 +5170,11 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query) gst_v4l2_object_match_buffer_layout_from_struct (obj, params, caps, size); } +#if 0 can_share_own_pool = (has_video_meta || !obj->need_video_meta); +#else + can_share_own_pool = obj->buffer_sharing; +#endif gst_v4l2_get_driver_min_buffers (obj); /* We can't share our own pool, if it exceed V4L2 capacity */ diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h index b8751f6..19942d8 100644 --- a/sys/v4l2/gstv4l2object.h +++ b/sys/v4l2/gstv4l2object.h @@ -226,6 +226,8 @@ struct _GstV4l2Object { * on slow USB firmwares. When this is set, gst_v4l2_set_format() will modify * the caps to reflect what was negotiated during fixation */ gboolean skip_try_fmt_probes; + + gboolean buffer_sharing; }; struct _GstV4l2ObjectClassHelper { @@ -251,7 +253,8 @@ GType gst_v4l2_object_get_type (void); PROP_EXTRA_CONTROLS, \ PROP_PIXEL_ASPECT_RATIO, \ PROP_FORCE_ASPECT_RATIO, \ - PROP_MIN_BUFFERS + PROP_MIN_BUFFERS, \ + PROP_BUFFER_SHARING /* create/destroy */ GstV4l2Object* gst_v4l2_object_new (GstElement * element, -- 2.20.1