{"id":13471,"url":"https://patchwork.libcamera.org/api/1.1/patches/13471/?format=json","web_url":"https://patchwork.libcamera.org/patch/13471/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20210824195636.1110845-9-nfraprado@collabora.com>","date":"2021-08-24T19:56:27","name":"[libcamera-devel,v8,08/17] v4l2: Allocate buffers based on requested count and MinimumRequests","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"9d36066adbb04c58cf6d0e2a5c6ca34818b1fba2","submitter":{"id":84,"url":"https://patchwork.libcamera.org/api/1.1/people/84/?format=json","name":"Nícolas F. R. A. Prado","email":"nfraprado@collabora.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/13471/mbox/","series":[{"id":2389,"url":"https://patchwork.libcamera.org/api/1.1/series/2389/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=2389","date":"2021-08-24T19:56:19","name":"lc-compliance: Add test to queue more requests than hardware depth","version":8,"mbox":"https://patchwork.libcamera.org/series/2389/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/13471/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/13471/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 0457CC3248\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 24 Aug 2021 19:57:51 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2BD37688E5;\n\tTue, 24 Aug 2021 21:57:34 +0200 (CEST)","from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7BE3E68892\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 24 Aug 2021 21:57:32 +0200 (CEST)","from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nfraprado) with ESMTPSA id 1C7461F43389"],"From":"=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4gUHJhZG8=?= <nfraprado@collabora.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Tue, 24 Aug 2021 16:56:27 -0300","Message-Id":"<20210824195636.1110845-9-nfraprado@collabora.com>","X-Mailer":"git-send-email 2.33.0","In-Reply-To":"<20210824195636.1110845-1-nfraprado@collabora.com>","References":"<20210824195636.1110845-1-nfraprado@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v8 08/17] v4l2: Allocate buffers based on\n\trequested count and MinimumRequests","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"kernel@collabora.com, =?utf-8?q?Andr=C3=A9_Almeida?=\n\t<andrealmeid@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Currently the number of buffers allocated is based on bufferCount, which\nis hardcoded to 1. Instead allocate buffers based on the requested count\nand on the MinimumRequests property for the camera, which is accessed\nthrough a newly added getter.\n\nThis allows the removal of bufferCount.\n\nWhile at it, fix a typo: s/interval/internal/.\n\nSigned-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n\n---\n\nChanges in v8:\n- New\n- Fixed typo: s/interval/internal/\n\n src/v4l2/v4l2_camera.cpp       | 20 +++++++++++++-------\n src/v4l2/v4l2_camera.h         |  5 +++--\n src/v4l2/v4l2_camera_proxy.cpp | 11 +++++------\n 3 files changed, 21 insertions(+), 15 deletions(-)","diff":"diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp\nindex d01eacfa2b84..4db171a3c0d0 100644\n--- a/src/v4l2/v4l2_camera.cpp\n+++ b/src/v4l2/v4l2_camera.cpp\n@@ -12,6 +12,8 @@\n \n #include <libcamera/base/log.h>\n \n+#include <libcamera/property_ids.h>\n+\n using namespace libcamera;\n \n LOG_DECLARE_CATEGORY(V4L2Compat)\n@@ -107,15 +109,13 @@ void V4L2Camera::requestComplete(Request *request)\n }\n \n int V4L2Camera::configure(StreamConfiguration *streamConfigOut,\n-\t\t\t  const Size &size, const PixelFormat &pixelformat,\n-\t\t\t  unsigned int bufferCount)\n+\t\t\t  const Size &size, const PixelFormat &pixelformat)\n {\n \tStreamConfiguration &streamConfig = config_->at(0);\n \tstreamConfig.size.width = size.width;\n \tstreamConfig.size.height = size.height;\n \tstreamConfig.pixelFormat = pixelformat;\n-\tstreamConfig.bufferCount = bufferCount;\n-\t/* \\todo memoryType (interval vs external) */\n+\t/* \\todo memoryType (internal vs external) */\n \n \tCameraConfiguration::Status validation = config_->validate();\n \tif (validation == CameraConfiguration::Invalid) {\n@@ -146,7 +146,6 @@ int V4L2Camera::validateConfiguration(const PixelFormat &pixelFormat,\n \tStreamConfiguration &cfg = config->at(0);\n \tcfg.size = size;\n \tcfg.pixelFormat = pixelFormat;\n-\tcfg.bufferCount = 1;\n \n \tCameraConfiguration::Status validation = config->validate();\n \tif (validation == CameraConfiguration::Invalid)\n@@ -165,7 +164,9 @@ int V4L2Camera::allocBuffers(unsigned int count)\n \tif (ret < 0)\n \t\treturn ret;\n \n-\tfor (unsigned int i = 0; i < count; i++) {\n+\tunsigned int allocatedCount = ret;\n+\n+\tfor (unsigned int i = 0; i < allocatedCount; i++) {\n \t\tstd::unique_ptr<Request> request = camera_->createRequest(i);\n \t\tif (!request) {\n \t\t\trequestPool_.clear();\n@@ -174,7 +175,7 @@ int V4L2Camera::allocBuffers(unsigned int count)\n \t\trequestPool_.push_back(std::move(request));\n \t}\n \n-\treturn ret;\n+\treturn allocatedCount;\n }\n \n void V4L2Camera::freeBuffers()\n@@ -299,3 +300,8 @@ bool V4L2Camera::isRunning()\n {\n \treturn isRunning_;\n }\n+\n+unsigned int V4L2Camera::minimumRequests()\n+{\n+\treturn camera_->properties().get(properties::MinimumRequests);\n+}\ndiff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h\nindex a095f4e27524..c0a122906f35 100644\n--- a/src/v4l2/v4l2_camera.h\n+++ b/src/v4l2/v4l2_camera.h\n@@ -45,8 +45,7 @@ public:\n \tstd::vector<Buffer> completedBuffers();\n \n \tint configure(StreamConfiguration *streamConfigOut,\n-\t\t      const Size &size, const PixelFormat &pixelformat,\n-\t\t      unsigned int bufferCount);\n+\t\t      const Size &size, const PixelFormat &pixelformat);\n \tint validateConfiguration(const PixelFormat &pixelformat,\n \t\t\t\t  const Size &size,\n \t\t\t\t  StreamConfiguration *streamConfigOut);\n@@ -65,6 +64,8 @@ public:\n \n \tbool isRunning();\n \n+\tunsigned int minimumRequests();\n+\n private:\n \tvoid requestComplete(Request *request);\n \ndiff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\nindex 7682c4bddf90..424262dd205c 100644\n--- a/src/v4l2/v4l2_camera_proxy.cpp\n+++ b/src/v4l2/v4l2_camera_proxy.cpp\n@@ -349,8 +349,7 @@ int V4L2CameraProxy::vidioc_s_fmt(V4L2CameraFile *file, struct v4l2_format *arg)\n \tSize size(arg->fmt.pix.width, arg->fmt.pix.height);\n \tV4L2PixelFormat v4l2Format = V4L2PixelFormat(arg->fmt.pix.pixelformat);\n \tret = vcam_->configure(&streamConfig_, size,\n-\t\t\t       PixelFormatInfo::info(v4l2Format).format,\n-\t\t\t       bufferCount_);\n+\t\t\t       PixelFormatInfo::info(v4l2Format).format);\n \tif (ret < 0)\n \t\treturn -EINVAL;\n \n@@ -491,15 +490,13 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf\n \tSize size(v4l2PixFormat_.width, v4l2PixFormat_.height);\n \tV4L2PixelFormat v4l2Format = V4L2PixelFormat(v4l2PixFormat_.pixelformat);\n \tint ret = vcam_->configure(&streamConfig_, size,\n-\t\t\t\t   PixelFormatInfo::info(v4l2Format).format,\n-\t\t\t\t   arg->count);\n+\t\t\t\t   PixelFormatInfo::info(v4l2Format).format);\n \tif (ret < 0)\n \t\treturn -EINVAL;\n \n \tsetFmtFromConfig(streamConfig_);\n \n-\targ->count = streamConfig_.bufferCount;\n-\tbufferCount_ = arg->count;\n+\targ->count = std::max(arg->count, vcam_->minimumRequests());\n \n \tret = vcam_->allocBuffers(arg->count);\n \tif (ret < 0) {\n@@ -507,6 +504,8 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf\n \t\treturn ret;\n \t}\n \n+\tbufferCount_ = arg->count = ret;\n+\n \tbuffers_.resize(arg->count);\n \tfor (unsigned int i = 0; i < arg->count; i++) {\n \t\tstruct v4l2_buffer buf = {};\n","prefixes":["libcamera-devel","v8","08/17"]}