From d5e2a0df6c558828870005ffd0a66d534681c661 Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Mon, 4 Nov 2024 19:59:14 +0900 Subject: [PATCH] libcamera: update buffers datas information according to plane info --- spa/plugins/libcamera/libcamera-utils.cpp | 29 ++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/spa/plugins/libcamera/libcamera-utils.cpp b/spa/plugins/libcamera/libcamera-utils.cpp index d7b467898..7f8f186bc 100644 --- a/spa/plugins/libcamera/libcamera-utils.cpp +++ b/spa/plugins/libcamera/libcamera-utils.cpp @@ -822,11 +822,34 @@ mmap_init(struct impl *impl, struct port *port, d[j].type = port->memtype; d[j].flags = SPA_DATA_FLAG_READABLE; d[j].mapoffset = 0; - d[j].maxsize = port->streamConfig.frameSize; - d[j].chunk->offset = 0; - d[j].chunk->size = port->streamConfig.frameSize; d[j].chunk->stride = port->streamConfig.stride; d[j].chunk->flags = 0; + /* Update parameters according to the plane information */ + unsigned int numPlanes = bufs[i]->planes().size(); + if (buffers[i]->n_datas < numPlanes) { + if (j < buffers[i]->n_datas - 1) { + d[j].maxsize = bufs[i]->planes()[j].length; + d[j].chunk->offset = bufs[i]->planes()[j].offset; + d[j].chunk->size = bufs[i]->planes()[j].length; + } else { + d[j].chunk->offset = bufs[i]->planes()[j].offset; + for (uint8_t k = j; k < numPlanes; k++) { + d[j].maxsize += bufs[i]->planes()[k].length; + d[j].chunk->size += bufs[i]->planes()[k].length; + } + } + } else if (buffers[i]->n_datas == numPlanes) { + d[j].maxsize = bufs[i]->planes()[j].length; + d[j].chunk->offset = bufs[i]->planes()[j].offset; + d[j].chunk->size = bufs[i]->planes()[j].length; + } else { + spa_log_warn(impl->log, "buffer index: i: %d, data member " + "numbers: %d is greater than plane number: %d", + i, buffers[i]->n_datas, numPlanes); + d[j].maxsize = port->streamConfig.frameSize; + d[j].chunk->offset = 0; + d[j].chunk->size = port->streamConfig.frameSize; + } if (port->memtype == SPA_DATA_DmaBuf || port->memtype == SPA_DATA_MemFd) {