diff --git a/src/gst/gstpipewirepool.c b/src/gst/gstpipewirepool.c index 4fbc9bcac..7f86f5223 100644 --- a/src/gst/gstpipewirepool.c +++ b/src/gst/gstpipewirepool.c @@ -92,21 +92,18 @@ void gst_pipewire_pool_wrap_buffer (GstPipeWirePool *pool, struct pw_buffer *b) 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); diff --git a/src/gst/gstpipewirepool.h b/src/gst/gstpipewirepool.h index 47c4dc3fa..b7b7ca8a7 100644 --- a/src/gst/gstpipewirepool.h +++ b/src/gst/gstpipewirepool.h @@ -53,7 +53,6 @@ struct _GstPipeWirePoolData { void *owner; struct spa_meta_header *header; guint flags; - goffset offset; struct pw_buffer *b; GstBuffer *buf; gboolean queued; diff --git a/src/gst/gstpipewiresink.c b/src/gst/gstpipewiresink.c index 4ead563d7..295d9c09d 100644 --- a/src/gst/gstpipewiresink.c +++ b/src/gst/gstpipewiresink.c @@ -466,7 +466,7 @@ do_send_buffer (GstPipeWireSink *pwsink, GstBuffer *buffer) 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; } diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index b8174f532..64ad289df 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -497,14 +497,13 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc) 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; @@ -530,13 +529,16 @@ 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 *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); }