From patchwork Mon Nov 16 11:24:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 10424 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id BE2B7BE081 for ; Mon, 16 Nov 2020 11:25:06 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4D9C4632C1; Mon, 16 Nov 2020 12:25:06 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="XWz70blK"; dkim-atps=neutral Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A9545631B5 for ; Mon, 16 Nov 2020 12:25:04 +0100 (CET) Received: by mail-wr1-x42a.google.com with SMTP id k2so18323375wrx.2 for ; Mon, 16 Nov 2020 03:25:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UJdolys+WSJVKPXmuVms/SsEXhD62UGdUH3Pqy0i8ag=; b=XWz70blKISlj0SLcfMBw3pEcIYxSUbyUcqhZ7Cch3pPQj2OyGVAAkFKx6yT3daYW9d 09744Z4vhEJNjiqhwzbaIJqJQ+nBCYWdZrKjXrzaJsI1wBI+VVfrJ3gr1+7nEX2/PZsO 9Xf7EkhPp6TwOXOGfG/oZeG+1ChLxzAW8J7jcGdH8MknU/a+kUAEHaiub8gwMcj2BqdG HeFCSufL4tR8/d1ZEnX9stNrbap5041YW2a0g2mF7uDvmN8ZbgXVK7YjWx9RLYIHo4fW eLs/eIF4hBCyQfkmviBbDzBT9pqjNyoyOS7TY1Pxm6gBO9B6j1F6Yikwd5IMlR0N5hQU KghA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=UJdolys+WSJVKPXmuVms/SsEXhD62UGdUH3Pqy0i8ag=; b=tKjKispq+8bWfbruWOYMVixthz9qpLLnn260bORKIs9zkq71WzD/OUQ8yex9Zou5/B jokfMa+hcXIj/Nv+UlbaVfoA88n3edIRi0Mpmjvb873wHy/lwVKuNUdSo/+YmUJcT++t 7nggpfr1j262drXPqlQQqJEcPkGamfYbcDoShcE6yJpUFwXOXyiY0nSWOC3mS/ggTMqy 7Y247Iukj7bpwY7Bkm9dxeDdnGU1iyMOvbQP6Q8+tyUsSLIkHZFqbyn3YjOFGT8PL4oF oaNs90zzfLwet+7CUCohpmnfArrrhFTWcKfgQmt8BvIGLijp4fCOwBFw+nR7K/1vYBv/ IP0w== X-Gm-Message-State: AOAM533CDEQE/hugZnHrM7TX/ZWdCm5a8CIJhKHZyJSw7G4p08ZGPyRl UtGqyYP/Enqzkk6cUBTsVqwk0w1YAnBX1g== X-Google-Smtp-Source: ABdhPJwog2QVd061mTPiNTVNqZh3UoGMQL0OFM8ie11ye6Mzda6Ww6q8KRHgHbAZOZbiWhOBe7xUaQ== X-Received: by 2002:a5d:5308:: with SMTP id e8mr18625209wrv.299.1605525904010; Mon, 16 Nov 2020 03:25:04 -0800 (PST) Received: from naushir-VirtualBox.patuck.local ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id d8sm18828152wmb.11.2020.11.16.03.25.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Nov 2020 03:25:02 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Mon, 16 Nov 2020 11:24:57 +0000 Message-Id: <20201116112458.148477-1-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 1/2] pipeline: raspberrypi: Use MappedFrameBuffer for embedded data buffers X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Use a MappedFrameBuffer to mmap embedded data buffers for the pipeline handler to use in the cases where the sensor does not fill it in. This avoids the need to mmap and unmap on every frame. Signed-off-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- .../pipeline/raspberrypi/raspberrypi.cpp | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index dd62dfc7..faa06c00 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -24,6 +24,7 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/buffer.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/ipa_manager.h" @@ -165,6 +166,12 @@ public: /* Stores the ids of the buffers mapped in the IPA. */ std::unordered_set ipaBuffers_; + /* + * Map of (internal) mmaped embedded data buffers, to avoid having to + * map/unmap on every frame. + */ + std::map mappedEmbeddedBuffers_; + /* DMAHEAP allocation helper. */ RPi::DmaHeap dmaHeap_; FileDescriptor lsTable_; @@ -1040,6 +1047,13 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera) return ret; } + if (!data->sensorMetadata_) { + for (auto const &it : data->unicam_[Unicam::Embedded].getBuffers()) { + data->mappedEmbeddedBuffers_.emplace(it.first, + MappedFrameBuffer(it.second, PROT_READ | PROT_WRITE)); + } + } + /* * Pass the stats and embedded data buffers to the IPA. No other * buffers need to be passed. @@ -1078,6 +1092,7 @@ void PipelineHandlerRPi::freeBuffers(Camera *camera) std::vector ipaBuffers(data->ipaBuffers_.begin(), data->ipaBuffers_.end()); data->ipa_->unmapBuffers(ipaBuffers); data->ipaBuffers_.clear(); + data->mappedEmbeddedBuffers_.clear(); for (auto const stream : data->streams_) stream->releaseBuffers(); @@ -1310,14 +1325,16 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer) * metadata buffer. */ if (!sensorMetadata_) { - const FrameBuffer &fb = buffer->planes(); - uint32_t *mem = static_cast(::mmap(nullptr, fb.planes()[0].length, - PROT_READ | PROT_WRITE, - MAP_SHARED, - fb.planes()[0].fd.fd(), 0)); - mem[0] = ctrl[V4L2_CID_EXPOSURE]; - mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN]; - munmap(mem, fb.planes()[0].length); + unsigned int bufferId = unicam_[Unicam::Embedded].getBufferId(buffer); + auto it = mappedEmbeddedBuffers_.find(bufferId); + if (it != mappedEmbeddedBuffers_.end()) { + uint32_t *mem = reinterpret_cast(it->second.maps()[0].data()); + mem[0] = ctrl[V4L2_CID_EXPOSURE]; + mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN]; + } else { + LOG(RPI, Warning) << "Failed to find embedded buffer " + << bufferId; + } } }