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