diff -Nru pipewire-0.3.48/debian/changelog pipewire-0.3.48/debian/changelog --- pipewire-0.3.48/debian/changelog 2022-11-09 19:12:45.000000000 +0800 +++ pipewire-0.3.48/debian/changelog 2022-12-30 14:05:51.000000000 +0800 @@ -1,3 +1,13 @@ +pipewire (0.3.48-1ubuntu4) UNRELEASED; urgency=medium + + * d/p/0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch + - Fixed Screencast only records few seconds issue (LP: #1995358) + * d/p/0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch + d/p/0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch + - Camera output freeze when using pipewiresrc (LP: #1985057) + + -- Bin Li Fri, 30 Dec 2022 14:05:51 +0800 + pipewire (0.3.48-1ubuntu3) jammy; urgency=medium * Revert the previous change to resolve a regression with screencasting. diff -Nru pipewire-0.3.48/debian/ld.so.conf.d/pipewire-jack-x86_64-linux-gnu.conf pipewire-0.3.48/debian/ld.so.conf.d/pipewire-jack-x86_64-linux-gnu.conf --- pipewire-0.3.48/debian/ld.so.conf.d/pipewire-jack-x86_64-linux-gnu.conf 1970-01-01 08:00:00.000000000 +0800 +++ pipewire-0.3.48/debian/ld.so.conf.d/pipewire-jack-x86_64-linux-gnu.conf 2022-12-30 14:05:51.000000000 +0800 @@ -0,0 +1 @@ +/usr/lib/x86_64-linux-gnu/pipewire-0.3/jack/ diff -Nru pipewire-0.3.48/debian/patches/0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch pipewire-0.3.48/debian/patches/0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch --- pipewire-0.3.48/debian/patches/0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch 1970-01-01 08:00:00.000000000 +0800 +++ pipewire-0.3.48/debian/patches/0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch 2022-12-30 14:05:51.000000000 +0800 @@ -0,0 +1,20 @@ +From 7cc509b117a6db66c395fb56ac4f17fb8cbd0c92 Mon Sep 17 00:00:00 2001 +From: James Hilliard +Date: Mon, 30 May 2022 04:41:04 -0600 +Subject: [PATCH] buffers: ensure buffer size does not exceed maxsize + +Signed-off-by: James Hilliard +--- + src/gst/gstpipewiresrc.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/src/gst/gstpipewiresrc.c ++++ b/src/gst/gstpipewiresrc.c +@@ -515,6 +515,7 @@ + mem->offset = SPA_MIN(d->chunk->offset, d->maxsize); + mem->size = SPA_MIN(d->chunk->size, d->maxsize - mem->offset); + mem->offset += data->offset; ++ spa_assert_se(mem->size <= mem->maxsize); + if (d->chunk->flags & SPA_CHUNK_FLAG_CORRUPTED) + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_CORRUPTED); + } diff -Nru pipewire-0.3.48/debian/patches/0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch pipewire-0.3.48/debian/patches/0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch --- pipewire-0.3.48/debian/patches/0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch 1970-01-01 08:00:00.000000000 +0800 +++ pipewire-0.3.48/debian/patches/0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch 2022-12-30 14:05:51.000000000 +0800 @@ -0,0 +1,106 @@ +From a1f33a99df5756c3dedd68f5ba2690819098d14f Mon Sep 17 00:00:00 2001 +From: James Hilliard +Date: Wed, 1 Jun 2022 04:03:37 -0600 +Subject: [PATCH] gst: dequeue a shared buffer instead of original pool buffer + +This seems to prevent the pool buffer from getting corrupted. + +Signed-off-by: James Hilliard +--- + src/gst/gstpipewirepool.c | 7 ++----- + src/gst/gstpipewirepool.h | 1 - + src/gst/gstpipewiresink.c | 2 +- + src/gst/gstpipewiresrc.c | 24 +++++++++++++----------- + 4 files changed, 16 insertions(+), 18 deletions(-) + +--- a/src/gst/gstpipewirepool.c ++++ b/src/gst/gstpipewirepool.c +@@ -92,21 +92,18 @@ + gmem = gst_fd_allocator_alloc (pool->fd_allocator, d->fd, + d->mapoffset + d->maxsize, GST_FD_MEMORY_FLAG_DONT_CLOSE); + gst_memory_resize (gmem, d->mapoffset, d->maxsize); +- data->offset = d->mapoffset; + } + else if(d->type == SPA_DATA_DmaBuf) { + gmem = gst_fd_allocator_alloc (pool->dmabuf_allocator, d->fd, + d->mapoffset + d->maxsize, GST_FD_MEMORY_FLAG_DONT_CLOSE); + gst_memory_resize (gmem, d->mapoffset, d->maxsize); +- data->offset = d->mapoffset; + } + else if (d->type == SPA_DATA_MemPtr) { +- gmem = gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, d->data, d->maxsize, 0, ++ gmem = gst_memory_new_wrapped (0, d->data, d->maxsize, 0, + d->maxsize, NULL, NULL); +- data->offset = 0; + } + if (gmem) +- gst_buffer_append_memory (buf, gmem); ++ gst_buffer_insert_memory (buf, i, gmem); + } + + data->pool = gst_object_ref (pool); +--- a/src/gst/gstpipewirepool.h ++++ b/src/gst/gstpipewirepool.h +@@ -53,7 +53,6 @@ + void *owner; + struct spa_meta_header *header; + guint flags; +- goffset offset; + struct pw_buffer *b; + GstBuffer *buf; + gboolean queued; +--- a/src/gst/gstpipewiresink.c ++++ b/src/gst/gstpipewiresink.c +@@ -445,7 +445,7 @@ + for (i = 0; i < b->n_datas; i++) { + struct spa_data *d = &b->datas[i]; + GstMemory *mem = gst_buffer_peek_memory (buffer, i); +- d->chunk->offset = mem->offset - data->offset; ++ d->chunk->offset = mem->offset; + d->chunk->size = mem->size; + } + +--- a/src/gst/gstpipewiresrc.c ++++ b/src/gst/gstpipewiresrc.c +@@ -476,14 +476,13 @@ + return NULL; + + data = b->user_data; +- buf = data->buf; + +- GST_LOG_OBJECT (pwsrc, "got new buffer %p", buf); ++ GST_LOG_OBJECT (pwsrc, "got new buffer %p", data->buf); + +- if (!data->queued) { +- GST_WARNING_OBJECT (pwsrc, "buffer %p was not recycled", buf); +- gst_buffer_ref (buf); +- } ++ buf = gst_buffer_new (); ++ ++ if (!data->queued) ++ GST_WARNING_OBJECT (pwsrc, "buffer %p was not recycled", data->buf); + data->queued = FALSE; + GST_BUFFER_PTS (buf) = GST_CLOCK_TIME_NONE; + GST_BUFFER_DTS (buf) = GST_CLOCK_TIME_NONE; +@@ -509,13 +508,16 @@ + meta->height = crop->region.size.height; + } + } ++ gst_buffer_add_parent_buffer_meta (buf, data->buf); ++ gst_buffer_unref (data->buf); + for (i = 0; i < b->buffer->n_datas; i++) { + struct spa_data *d = &b->buffer->datas[i]; +- GstMemory *mem = gst_buffer_peek_memory (buf, i); +- mem->offset = SPA_MIN(d->chunk->offset, d->maxsize); +- mem->size = SPA_MIN(d->chunk->size, d->maxsize - mem->offset); +- mem->offset += data->offset; +- spa_assert_se(mem->size <= mem->maxsize); ++ GstMemory *pmem = gst_buffer_peek_memory (data->buf, i); ++ if (pmem) { ++ GstMemory *mem = gst_memory_share (pmem, d->chunk->offset, d->chunk->size); ++ gst_buffer_insert_memory (buf, i, mem); ++ spa_assert_se(mem->size <= mem->maxsize); ++ } + if (d->chunk->flags & SPA_CHUNK_FLAG_CORRUPTED) + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_CORRUPTED); + } diff -Nru pipewire-0.3.48/debian/patches/0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch pipewire-0.3.48/debian/patches/0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch --- pipewire-0.3.48/debian/patches/0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch 1970-01-01 08:00:00.000000000 +0800 +++ pipewire-0.3.48/debian/patches/0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch 2022-12-30 14:05:51.000000000 +0800 @@ -0,0 +1,66 @@ +From 1ea1d525c1ac946a915599c6bee813e88e8cee12 Mon Sep 17 00:00:00 2001 +From: James Hilliard +Date: Sat, 20 Aug 2022 00:19:42 -0600 +Subject: [PATCH] gst: copy buffer memory in dequeue_buffer using + gst_memory_copy + +When always-copy is enabled we should copy buffer memory instead of +sharing buffer memory and using gst_buffer_copy_deep. + +This should ensure we recycle the parent buffer as soon as the memory +is copied. + +Signed-off-by: James Hilliard +--- + src/gst/gstpipewiresrc.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c +index 54b0c957c..4e8e8bd4e 100644 +--- a/src/gst/gstpipewiresrc.c ++++ b/src/gst/gstpipewiresrc.c +@@ -568,19 +568,23 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc) + meta->height = crop->region.size.height; + } + } +- gst_buffer_add_parent_buffer_meta (buf, data->buf); +- gst_buffer_unref (data->buf); + for (i = 0; i < b->buffer->n_datas; i++) { + struct spa_data *d = &b->buffer->datas[i]; + GstMemory *pmem = gst_buffer_peek_memory (data->buf, i); + if (pmem) { +- GstMemory *mem = gst_memory_share (pmem, d->chunk->offset, d->chunk->size); ++ GstMemory *mem; ++ if (!pwsrc->always_copy) ++ mem = gst_memory_share (pmem, d->chunk->offset, d->chunk->size); ++ else ++ mem = gst_memory_copy (pmem, d->chunk->offset, d->chunk->size); + gst_buffer_insert_memory (buf, i, mem); +- spa_assert_se(mem->size <= mem->maxsize); + } + if (d->chunk->flags & SPA_CHUNK_FLAG_CORRUPTED) + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_CORRUPTED); + } ++ if (!pwsrc->always_copy) ++ gst_buffer_add_parent_buffer_meta (buf, data->buf); ++ gst_buffer_unref (data->buf); + return buf; + } + +@@ -1091,12 +1095,7 @@ gst_pipewire_src_create (GstPushSrc * psrc, GstBuffer ** buffer) + } + pw_thread_loop_unlock (pwsrc->core->loop); + +- if (pwsrc->always_copy) { +- *buffer = gst_buffer_copy_deep (buf); +- gst_buffer_unref (buf); +- } +- else +- *buffer = buf; ++ *buffer = buf; + + if (pwsrc->is_live) + base_time = GST_ELEMENT_CAST (psrc)->base_time; +-- +2.34.1 + diff -Nru pipewire-0.3.48/debian/patches/series pipewire-0.3.48/debian/patches/series --- pipewire-0.3.48/debian/patches/series 2022-11-09 19:12:45.000000000 +0800 +++ pipewire-0.3.48/debian/patches/series 2022-12-30 14:05:51.000000000 +0800 @@ -1,2 +1,5 @@ Don-t-automatically-start-pipewire-for-root-logins.patch Don-t-build_same_binary_twice.patch +0001-buffers-ensure-buffer-size-does-not-exceed-maxsize.patch +0002-gst-dequeue-a-shared-buffer-instead-of-original-pool.patch +0003-gst-copy-buffer-memory-in-dequeue_buffer-using-gst_m.patch