pipewire: backport pipewiresink patches to fix stuttering and other issues 38/26338/3
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Mon, 10 May 2021 16:07:57 +0000 (19:07 +0300)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Mon, 10 May 2021 20:38:12 +0000 (20:38 +0000)
Bug-AGL: SPEC-3900
Change-Id: Ib93772c58b4177b8e72713e4d395c9244732e907
Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/26338
Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
Tested-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-pipewiresink-use-all-the-available-dest-memory-when-.patch [new file with mode: 0644]
meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewiresink-release-manually-acquired-buffers-back-.patch [new file with mode: 0644]
meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.27.bbappend

diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-pipewiresink-use-all-the-available-dest-memory-when-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-pipewiresink-use-all-the-available-dest-memory-when-.patch
new file mode 100644 (file)
index 0000000..a3bde14
--- /dev/null
@@ -0,0 +1,33 @@
+From b86e5cabfae3ab354f350f8f7589b21a153a8a5d Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Mon, 10 May 2021 17:12:12 +0300
+Subject: pipewiresink: use all the available dest memory when copying buffer
+
+When pipewiresink needs to copy data, it has to resize the destination
+buffer (to a smaller size) in order to send the correct data size to
+pipewire. When this dest buffer is reused later, it will still have
+this smaller size as its total size and the copy may discard data
+from upstream if the new upstream buffer is bigger than the last one
+that was copied on the same dest buffer.
+
+Upstream-Status: Backport [from master/0.3.28]
+---
+ src/gst/gstpipewiresink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/gst/gstpipewiresink.c b/src/gst/gstpipewiresink.c
+index 966b12c7..031b3ae0 100644
+--- a/src/gst/gstpipewiresink.c
++++ b/src/gst/gstpipewiresink.c
+@@ -616,7 +616,7 @@ gst_pipewire_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+       goto done;
+     gst_buffer_map (b, &info, GST_MAP_WRITE);
+-    gst_buffer_extract (buffer, 0, info.data, info.size);
++    gst_buffer_extract (buffer, 0, info.data, info.maxsize);
+     gst_buffer_unmap (b, &info);
+     gst_buffer_resize (b, 0, gst_buffer_get_size (buffer));
+     buffer = b;
+-- 
+2.30.2
+
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewiresink-release-manually-acquired-buffers-back-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0002-pipewiresink-release-manually-acquired-buffers-back-.patch
new file mode 100644 (file)
index 0000000..aeafae6
--- /dev/null
@@ -0,0 +1,52 @@
+From 8911e22793ed3713ceb78be5414eeb03ebde962e Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Mon, 10 May 2021 17:25:57 +0300
+Subject: pipewiresink: release manually acquired buffers back to the pool
+
+When we manually acquire buffers from the pool, we never release them.
+But because gst_buffer_pool_acquire_buffer() adds a reference to the pool,
+this leaks the pool eventually.
+
+To fix this, just unref the buffer after it has been sent. This releases
+it back to the pool and unrefs the pool.
+
+This has no significant effect to the stream, since the underlying
+pw buffers are actually pooled in the pw_stream. It just prevents leaking.
+
+Upstream-Status: Backport [from master/0.3.28]
+---
+ src/gst/gstpipewiresink.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/gst/gstpipewiresink.c b/src/gst/gstpipewiresink.c
+index 031b3ae0..2f79a4f7 100644
+--- a/src/gst/gstpipewiresink.c
++++ b/src/gst/gstpipewiresink.c
+@@ -578,6 +578,7 @@ gst_pipewire_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+   GstPipeWireSink *pwsink;
+   GstFlowReturn res = GST_FLOW_OK;
+   const char *error = NULL;
++  gboolean unref_buffer = FALSE;
+   pwsink = GST_PIPEWIRE_SINK (bsink);
+@@ -620,6 +621,7 @@ gst_pipewire_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+     gst_buffer_unmap (b, &info);
+     gst_buffer_resize (b, 0, gst_buffer_get_size (buffer));
+     buffer = b;
++    unref_buffer = TRUE;
+     pw_thread_loop_lock (pwsink->core->loop);
+     if (pw_stream_get_state (pwsink->stream, &error) != PW_STREAM_STATE_STREAMING)
+@@ -628,6 +630,8 @@ gst_pipewire_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+   GST_DEBUG ("push buffer");
+   do_send_buffer (pwsink, buffer);
++  if (unref_buffer)
++    gst_buffer_unref (buffer);
+ done_unlock:
+   pw_thread_loop_unlock (pwsink->core->loop);
+-- 
+2.30.2
+
index cc2308e..22700ae 100644 (file)
@@ -5,3 +5,8 @@ PACKAGECONFIG = "\
     ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} \
     gstreamer v4l2 \
 "
+
+SRC_URI += "\
+    file://0001-pipewiresink-use-all-the-available-dest-memory-when-.patch \
+    file://0002-pipewiresink-release-manually-acquired-buffers-back-.patch \
+"