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; + } } } From patchwork Mon Nov 16 11:24:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 10425 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 E37DFBE081 for ; Mon, 16 Nov 2020 11:25:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id A44F5632C2; Mon, 16 Nov 2020 12:25:07 +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="qrt/7Ahe"; dkim-atps=neutral Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B7DD2632C1 for ; Mon, 16 Nov 2020 12:25:05 +0100 (CET) Received: by mail-wr1-x42d.google.com with SMTP id r17so18312921wrw.1 for ; Mon, 16 Nov 2020 03:25:05 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=MFxOD1RHH9DUpvo3uH9tZAAzL14TCR0C3W6cmDAUVGs=; b=qrt/7AheKGFipt9uBWzxfatoUHYzht2arTdqFqakCsOy47U7bzqygbx15aRf7AFeFE 6Wr2pVsEnk8PjSZpG0qliHYcT3UpQGnFiBL+YmqjJXV8C2ECjn10LyP+9Is16VZn37Rw OIskDjwT5S+q0zVklIh7afqDl7ziZ9vYrKdr088ZkdW/1GUqWeFrk9fqOTbFf6U5IZCH dfupd2pxOVUGEMXD09jIYgK8GGvA9NHQtK8ou30DmaA01rAi5fqzfcCr7iuYMiSDwCBl LLufikPheXnbMuoU+RLJuQrMHMbZLu2Ahii8RjBxxIAeoQ5543upwX1jp9B6025iCf6O Wrmw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=MFxOD1RHH9DUpvo3uH9tZAAzL14TCR0C3W6cmDAUVGs=; b=A3QsqV/l0qVALmqvoJ05LYeY5gNOTuwjsQiH70visfDsdF+CZXJRWI2TomqRsAptAB K4AxQPWg0bV0U9EuyLwBo1R5GR/qvKPHOI3gkuAGeBjihdgB390cvHSF3ceSn9d422vv PsycBaBZ57ueK8k9l4lJuwjol1D5nkzHTgN0AZvooLcDSuay5ixo/2wyp/5Jkf1veZWj 0IsAs6mpnJlUTcCQFZI9L7PXc0Fwh2bpKaYNBAe/P2IZojbVt9SOVMu8ppizjnFpwSkR qh4jinfNkKfam4QUtiIg0t/8qvlytn4OYFCD/vWTexG/QRsSo/1NIEfE46/KQJ40iVcA FaqA== X-Gm-Message-State: AOAM531Ackhg9NgPyw8qYcLLfr0XaWCcJxsOfgrdNeE5FRPAz303kRF8 cfRtaeM7jJotjvyfkpPDfZN6uKjO/6ANmA== X-Google-Smtp-Source: ABdhPJxqO7MTYuxyRWNRSYNoGg0HH6/k5ELbkPBIwoPEDdXfWh+bOcOZYaWVo0OZYFrCLvPtpehFFA== X-Received: by 2002:adf:f146:: with SMTP id y6mr18829515wro.298.1605525905058; Mon, 16 Nov 2020 03:25:05 -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.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Nov 2020 03:25:04 -0800 (PST) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Mon, 16 Nov 2020 11:24:58 +0000 Message-Id: <20201116112458.148477-2-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201116112458.148477-1-naush@raspberrypi.com> References: <20201116112458.148477-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/2] ipa: raspberrypi: Use MappedFrameBuffer for the IPA 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" Instead of directly mmaping/unmapping buffers passed to the IPA, use a MappedFrameBuffer. The latter is a cleaner interface, and avoid code duplication. Signed-off-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/ipa/raspberrypi/raspberrypi.cpp | 41 +++++++++++------------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 1c255aa2..6bb45b75 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -24,6 +24,7 @@ #include +#include "libcamera/internal/buffer.h" #include "libcamera/internal/camera_sensor.h" #include "libcamera/internal/log.h" #include "libcamera/internal/utils.h" @@ -110,8 +111,7 @@ private: void applyLS(const struct AlscStatus *lsStatus, ControlList &ctrls); void resampleTable(uint16_t dest[], double const src[12][16], int destW, int destH); - std::map buffers_; - std::map buffersMemory_; + std::map buffers_; ControlInfoMap unicamCtrls_; ControlInfoMap ispCtrls_; @@ -319,31 +319,18 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo, void IPARPi::mapBuffers(const std::vector &buffers) { for (const IPABuffer &buffer : buffers) { - auto elem = buffers_.emplace(std::piecewise_construct, - std::forward_as_tuple(buffer.id), - std::forward_as_tuple(buffer.planes)); - const FrameBuffer &fb = elem.first->second; - - buffersMemory_[buffer.id] = mmap(nullptr, fb.planes()[0].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - fb.planes()[0].fd.fd(), 0); - - if (buffersMemory_[buffer.id] == MAP_FAILED) { - int ret = -errno; - LOG(IPARPI, Fatal) << "Failed to mmap buffer: " << strerror(-ret); - } + const FrameBuffer fb = FrameBuffer(buffer.planes); + buffers_.emplace(buffer.id, MappedFrameBuffer(&fb, PROT_READ | PROT_WRITE)); } } void IPARPi::unmapBuffers(const std::vector &ids) { for (unsigned int id : ids) { - const auto fb = buffers_.find(id); - if (fb == buffers_.end()) + auto it = buffers_.find(id); + if (it == buffers_.end()) continue; - munmap(buffersMemory_[id], fb->second.planes()[0].length); - buffersMemory_.erase(id); buffers_.erase(id); } } @@ -785,15 +772,16 @@ void IPARPi::prepareISP(unsigned int bufferId) bool IPARPi::parseEmbeddedData(unsigned int bufferId, struct DeviceStatus &deviceStatus) { - auto it = buffersMemory_.find(bufferId); - if (it == buffersMemory_.end()) { + auto it = buffers_.find(bufferId); + if (it == buffers_.end()) { LOG(IPARPI, Error) << "Could not find embedded buffer!"; return false; } - int size = buffers_.find(bufferId)->second.planes()[0].length; + int size = buffers_.find(bufferId)->second.maps()[0].size(); + void *ptr = buffers_.find(bufferId)->second.maps()[0].data(); helper_->Parser().SetBufferSize(size); - RPiController::MdParser::Status status = helper_->Parser().Parse(it->second); + RPiController::MdParser::Status status = helper_->Parser().Parse(ptr); if (status != RPiController::MdParser::Status::OK) { LOG(IPARPI, Error) << "Embedded Buffer parsing failed, error " << status; } else { @@ -820,13 +808,14 @@ bool IPARPi::parseEmbeddedData(unsigned int bufferId, struct DeviceStatus &devic void IPARPi::processStats(unsigned int bufferId) { - auto it = buffersMemory_.find(bufferId); - if (it == buffersMemory_.end()) { + auto it = buffers_.find(bufferId); + if (it == buffers_.end()) { LOG(IPARPI, Error) << "Could not find stats buffer!"; return; } - bcm2835_isp_stats *stats = static_cast(it->second); + void *ptr = buffers_.find(bufferId)->second.maps()[0].data(); + bcm2835_isp_stats *stats = static_cast(ptr); RPiController::StatisticsPtr statistics = std::make_shared(*stats); controller_.Process(statistics, &rpiMetadata_);