diff -Nru pipewire-0.3.48/debian/changelog pipewire-0.3.48/debian/changelog --- pipewire-0.3.48/debian/changelog 2022-03-05 19:31:25.000000000 +0800 +++ pipewire-0.3.48/debian/changelog 2022-08-15 13:52:20.000000000 +0800 @@ -1,3 +1,11 @@ +pipewire (0.3.48-1ubuntu2) jammy; urgency=medium + + * 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) + + -- Kai-Chuan Hsieh Mon, 15 Aug 2022 13:52:20 +0800 + pipewire (0.3.48-1ubuntu1) jammy; urgency=medium * debian/control, debian/rules: 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-08-15 13:51:28.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-08-15 13:51:39.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/series pipewire-0.3.48/debian/patches/series --- pipewire-0.3.48/debian/patches/series 2022-03-03 22:43:37.000000000 +0800 +++ pipewire-0.3.48/debian/patches/series 2022-08-15 13:51:33.000000000 +0800 @@ -1,2 +1,4 @@ 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