From patchwork Mon Oct 26 09:53:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 10250 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 813CCBDB13 for ; Mon, 26 Oct 2020 09:54:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E31C561E30; Mon, 26 Oct 2020 10:54:00 +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="LaE0/2oo"; dkim-atps=neutral Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A3E146034D for ; Mon, 26 Oct 2020 10:53:59 +0100 (CET) Received: by mail-wm1-x32f.google.com with SMTP id c194so10953976wme.2 for ; Mon, 26 Oct 2020 02:53:59 -0700 (PDT) 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=CPeLxGSn9vdBOn7byMXWKovikSEmSr5cXSb8TH9kCYo=; b=LaE0/2ooCy9Pz7g7I3t3lw7nR3JZcgz7ZAzpm7XUyead/Zv6JLBCKN3ggKS26KRqTK fwmlERKzxGg1+KaHa8DVtD+GjbgDzOp//MPiKB1smdzg7U0/F0zTTCyvbVEmENwyFW8P F8HBJuE4wxuP+OoTzVsUcwtlvG0Fq4L8/zoTyunn3GIySh4dvFkWktF/oGKG6CLbEHDx gsWb/zU/kbQGqeJzrd53Huqn/XR6ki2sf0jBaS8rjYELhNBKAU5WFbnP5bKXpbEq9kGL 52mHkdNznLV3qmZroMLVM9fbfE8utjEvV1+Hy/HscZAbrRlSdNca6I9qR85mHsYtVVp6 dv7A== 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=CPeLxGSn9vdBOn7byMXWKovikSEmSr5cXSb8TH9kCYo=; b=o+bttx6CFaFbCdtHJa5n+AoqPpWkWg/hDbzTnGygEj+NY2xDLbYoR1czkqkuO5Zk/p N3NJxNqIcmVhqe5zfD+J9Z10DoW157JFIGoKzPq8/HsvXpcb7mTuvYezAKeFYXib5VRK nVnNvLDxIiWFHOo1Pr66oQdnRlpygWxW1ExAi4DoHmVouwCJOGAtEk1jPQFIsedvNzpI Fshhol/WyLtekgO+d1SdKESNKOj5P7NXCZB2QMKz2LnbMR8PUTjFomMhSvv6UtsadESJ jjrA7ZylnQpsGNcDFNLBjeUz76n+x0eYsUaYZMQ4gDoqCnR5s1T0cqKVt7XdJmvb5Cgu auTw== X-Gm-Message-State: AOAM530KpvHDFjz9aH8znVu9zeMM/NnbY4OZWbOtfpb0c3G3BWWiaD0R spp3HxE8HUDl1Z6nsgc9g/6iFjE5bmn4Yw== X-Google-Smtp-Source: ABdhPJyx2AD76Lry/k01jSqQXGVPW9b9xjpMAow49OhiIrbPKflZf/mfvGfc3rwYMlk5qVkVcMCGfA== X-Received: by 2002:a1c:9a46:: with SMTP id c67mr14545645wme.115.1603706038905; Mon, 26 Oct 2020 02:53:58 -0700 (PDT) Received: from naushir-VirtualBox.pitowers.org ([2a00:1098:3142:14:a00:27ff:fe4d:f6a2]) by smtp.gmail.com with ESMTPSA id l8sm22157508wrn.28.2020.10.26.02.53.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Oct 2020 02:53:58 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Mon, 26 Oct 2020 09:53:55 +0000 Message-Id: <20201026095356.442605-1-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 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 --- .../pipeline/raspberrypi/raspberrypi.cpp | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index dd62dfc7..8817915b 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,15 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera) return ret; } + if (!data->sensorMetadata_) { + for (auto const &it : data->unicam_[Unicam::Embedded].getBuffers()) { + data->mappedEmbeddedBuffers_.emplace(std::piecewise_construct, + std::forward_as_tuple(it.first), + std::forward_as_tuple( + 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 +1094,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 +1327,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; + } } }