From 4b60569c4a78987c28b12d7353a687bafee1568e Mon Sep 17 00:00:00 2001 From: Huang-Huang Bao Date: Fri, 3 Feb 2023 19:45:50 +0800 Subject: [PATCH] gst: correct buffer & meta offset calculation The offset in GstVideoMeta point to location of merge-mapped buffer memories (see "gst_buffer_find_memory()") instead of raw memory location for each plane, make adjustment to comply this rule. Also some cleanups. Fixes 023577e3912b5193ea969d54bef7ec7743fce939 --- src/gst/gstpipewiresink.c | 7 +++++-- src/gst/gstpipewiresrc.c | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/gst/gstpipewiresink.c b/src/gst/gstpipewiresink.c index ff235cbd7..cbfbd1de0 100644 --- a/src/gst/gstpipewiresink.c +++ b/src/gst/gstpipewiresink.c @@ -508,13 +508,16 @@ do_send_buffer (GstPipeWireSink *pwsink, GstBuffer *buffer) GstVideoMeta *meta = gst_buffer_get_video_meta (buffer); if (meta) { if (meta->n_planes == b->n_datas) { + gsize video_size = 0; for (i = 0; i < meta->n_planes; i++) { struct spa_data *d = &b->datas[i]; - d->chunk->offset = meta->offset[i]; + d->chunk->offset += meta->offset[i] - video_size; d->chunk->stride = meta->stride[i]; + + video_size += d->chunk->size; } } else { - GST_ERROR ("plane num not matching, meta:%d buffer:%d", meta->n_planes, b->n_datas); + GST_ERROR ("plane num not matching, meta:%u buffer:%u", meta->n_planes, b->n_datas); } } diff --git a/src/gst/gstpipewiresrc.c b/src/gst/gstpipewiresrc.c index 5c3043634..9c5cf1f76 100644 --- a/src/gst/gstpipewiresrc.c +++ b/src/gst/gstpipewiresrc.c @@ -616,6 +616,7 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc) } if (pwsrc->is_video) { + gsize video_size = 0; GstVideoInfo *info = &pwsrc->video_info; GstVideoMeta *meta = gst_buffer_add_video_meta_full (buf, GST_VIDEO_FRAME_FLAG_NONE, GST_VIDEO_INFO_FORMAT (info), @@ -625,11 +626,13 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc) info->offset, info->stride); - meta->n_planes = b->buffer->n_datas; - for (i = 0; i < b->buffer->n_datas; i++) { + meta->n_planes = MIN(meta->n_planes, b->buffer->n_datas); + for (i = 0; i < meta->n_planes; i++) { struct spa_data *d = &b->buffer->datas[i]; - meta->offset[i] = d->chunk->offset; + meta->offset[i] = video_size; meta->stride[i] = d->chunk->stride; + + video_size += d->chunk->size; } }