From patchwork Mon Nov 16 14:37:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 10427 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 8834ABE082 for ; Mon, 16 Nov 2020 14:38:08 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 07614632C4; Mon, 16 Nov 2020 15:38:08 +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="TN7wr1Da"; dkim-atps=neutral Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DE652631B5 for ; Mon, 16 Nov 2020 15:38:06 +0100 (CET) Received: by mail-wr1-x42b.google.com with SMTP id j7so18932889wrp.3 for ; Mon, 16 Nov 2020 06:38:06 -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=TParc3S4s8nqUndm88K8cu4/b3BgYUNUUCOTsxzyBco=; b=TN7wr1DaB4/CCl5y0m6CvW+Y8CrXAcUrTyKKrTeIhRZT3nHn4CBEqX6Pj158P9I2Nw cqhJ0JGyOEXqEziTujlBoVcs9hyJHchjIrLrwomGm689AV/TlzzwA4OJkMvMDG7IH/jZ RQcGcALmM4STgz7pbRxd5b6VGusEhNu8jICQ/CLlmrM6vLInicUjOx4R4l5ogCeB5ll2 yd61vwUx2kGSv8rrl65S/l9J/RddNaB9tVbqTTOs0t0owQ0tqPzrfOi6g3mYeI4CKIi4 xH146IvgQB3dwDRLyLlCf36oEd3g/LwL/VewKRoNDM42SqXSLepru+HkeNflvQ2es5/W hkeg== 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=TParc3S4s8nqUndm88K8cu4/b3BgYUNUUCOTsxzyBco=; b=Xhr1MUc4elsry74grtJKpB61M57Ag8pCp207s6ziUTxx4Lokl1LsTUyirvppAVYjqs 5en3liayGlk45ssYGg7E+vxwdKjtgR6ZlULQaqkW8OM7mq9tfStsVbmYesiWUZ6/ZL31 KwzQEDPtUC09VkFquQ9pLArFUNT1NvOpMTOScrdPuq6DVBY6DB3m/+dM7qYuuRgvnAp+ 6u+ftf+2rNnDArBbl30h5+i1gtiIFF5GCiU/AJOkOAy+vffKzZzMeN/Lz1Qw/f+E4NDR S1imnZMqDHkuSj/ZmK/bqPARS9sBgjKmUhQifk2qmCqliYaqUIf/QzFA6oUW8RcVE1zv /Vpw== X-Gm-Message-State: AOAM533UGsA1dBLGYR6h9oH4lyilDSzAr36XNUSb2u0e3Sc17XibZkZG U/9H6vjxEGkYmUaEMrEFpWncHAQ60ykajw== X-Google-Smtp-Source: ABdhPJwc2a/jncu+AIejsnSbiMWje6ok/xQpYZaSjbD8wkgG17lqjCsmj3fSSNs4PtXe6nX03viznA== X-Received: by 2002:adf:fb06:: with SMTP id c6mr20639406wrr.117.1605537486040; Mon, 16 Nov 2020 06:38:06 -0800 (PST) Received: from naushir-VirtualBox.patuck.local ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id j4sm22820810wrn.83.2020.11.16.06.38.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Nov 2020 06:38:05 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Mon, 16 Nov 2020 14:37:56 +0000 Message-Id: <20201116143757.155890-1-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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..9fe5eb05 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()) { + MappedFrameBuffer fb(it.second, PROT_READ | PROT_WRITE); + data->mappedEmbeddedBuffers_.emplace(it.first, std::move(fb)); + } + } + /* * 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; + } } }