linuxOS_AP06/buildroot/package/gstreamer1/gst1-plugins-good/0012-v4l2-Support-configuring-buffer-sharing.patch
2025-06-03 12:28:32 +08:00

118 lines
4.1 KiB
Diff

From 447ea64dbd759495ba84b2fc0d54859f3e5a8fa5 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
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 <jeffy.chen@rock-chips.com>
---
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