From patchwork Mon Jun 28 17:27:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hirokazu Honda X-Patchwork-Id: 12732 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 08A4AC3220 for ; Mon, 28 Jun 2021 17:28:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id BBCA0684D6; Mon, 28 Jun 2021 19:28:05 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="KV63tbcT"; dkim-atps=neutral Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 09D236028C for ; Mon, 28 Jun 2021 19:28:04 +0200 (CEST) Received: by mail-pj1-x102e.google.com with SMTP id p4-20020a17090a9304b029016f3020d867so508734pjo.3 for ; Mon, 28 Jun 2021 10:28:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1oIGze6zan6MqI7rIizV5leq038W9m+8OGcqWq3kOx4=; b=KV63tbcTcL64yNYim6+wzWiSOs1c/xike2o4nI7MOmByoZWsqQhxLAQ0Qoa3s5PxAC JCCioUTw/R0RH3LnHH9JvpBDpZaxhAvjP2A7WR88ojV5M6wE/SsfkEPy321k6OQd2svh +xr0NzUi2EpK6Y3I6dg7ZNyTKQFe2dddfXmp0= 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=1oIGze6zan6MqI7rIizV5leq038W9m+8OGcqWq3kOx4=; b=njqwq48Vy2yxJR20B7y03mR+0Y3JW6/lAmz5IDkKncNDbyKn5j/n/ztuxNY0yPEAUr KK82WdFSX/SPrfnN6D3u4o09N1bKicZ+4WXG3VcOwD3lBAeYKZbJ9Ok6Tr0yn/2clag7 dkWExPsiqccib3vo9NTE3jIUL4nZc0cRYHVmoK5QXJs4n+6IDfMu+Ze5k19LcAEva1HM AA3fvi98aanIdOWk8hzkY8TtLjMNtX0qCwk9lwC8IzxGRlUwdaTKydu/UAOVrtA7nhye 0rMuMCUPlpCKWKwx1Fl3aZ2Wsy5WFsfH4ISl1Pl9fvA2Z+e82RcjOokz+D4FlH+Ejfzh 6yZQ== X-Gm-Message-State: AOAM532o596e3A5gmzD05zfJjOcbGI6UR/EJ/somuT4X6/rYmqPF5OfL ItZQFhhCesIXSPVGU1uCvDWJAgI1dKnEzA== X-Google-Smtp-Source: ABdhPJxVJzqq0LgQkVqNtmma4jruDU6ASirv69SayFZmUnwIFztKx5v4FGB41Z7XKBrhAbQ+QcE+ng== X-Received: by 2002:a17:90a:3d47:: with SMTP id o7mr39259093pjf.68.1624901282260; Mon, 28 Jun 2021 10:28:02 -0700 (PDT) Received: from hiroh2.tok.corp.google.com ([2401:fa00:8f:203:a147:1cb:e226:4ed9]) by smtp.gmail.com with ESMTPSA id d1sm4682358pju.16.2021.06.28.10.28.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 10:28:01 -0700 (PDT) From: Hirokazu Honda To: libcamera-devel@lists.libcamera.org Date: Tue, 29 Jun 2021 02:27:54 +0900 Message-Id: <20210628172755.3201441-1-hiroh@chromium.org> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 1/2] libcamera: camera_sensor: Reverse the key and value of test pattern mode map 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" The key and value of the test pattern mode are originally the index of v4l2 control and the corresponding test pattern mode control value. This key and value are useful in the initialization for reporting available test pattern modes. However, the map of the reversed key and value is much more useful in applying a requested test pattern mode. Reverses the key and value of the map as the initialization is one time but the test pattern mode request will be multiple times. Signed-off-by: Hirokazu Honda Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/libcamera/camera_sensor.cpp | 15 ++++++++++-- src/libcamera/camera_sensor_properties.cpp | 28 +++++++++++----------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index 94dcf4f9..ee53adf3 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -320,11 +320,22 @@ void CameraSensor::initTestPatternModes( return; } + /* + * Create a map that associates the V4L2 control index to the test + * pattern mode by reversing the testPatternModes map provided by the + * camera sensor properties. This makes it easier to verify if the + * control index is supported in the below for loop that creates the + * list of supported test patterns. + */ + std::map indexToTestPatternMode; + for (const auto& it : testPatternModes) + indexToTestPatternMode[it.second] = it.first; + for (const ControlValue &value : v4l2TestPattern->second.values()) { const int32_t index = value.get(); - const auto it = testPatternModes.find(index); - if (it == testPatternModes.end()) { + const auto it = indexToTestPatternMode.find(index); + if (it == indexToTestPatternMode.end()) { LOG(CameraSensor, Debug) << "Test pattern mode " << index << " ignored"; continue; diff --git a/src/libcamera/camera_sensor_properties.cpp b/src/libcamera/camera_sensor_properties.cpp index 7d8ba9e9..a4b6565c 100644 --- a/src/libcamera/camera_sensor_properties.cpp +++ b/src/libcamera/camera_sensor_properties.cpp @@ -38,9 +38,9 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties) * \brief The physical size of a pixel, including pixel edges, in nanometers. * * \var CameraSensorProperties::testPatternModes - * \brief Map that associates the indexes of the sensor test pattern modes as - * returned by V4L2_CID_TEST_PATTERN with the corresponding TestPattern - * control value + * \brief Map that associates the TestPattern control value with the indexes of + * the corresponding sensor test pattern modes as returned by + * V4L2_CID_TEST_PATTERN. */ /** @@ -55,11 +55,11 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen { "imx219", { .unitCellSize = { 1120, 1120 }, .testPatternModes = { - { 0, controls::draft::TestPatternModeOff }, - { 1, controls::draft::TestPatternModeColorBars }, - { 2, controls::draft::TestPatternModeSolidColor }, - { 3, controls::draft::TestPatternModeColorBarsFadeToGray }, - { 4, controls::draft::TestPatternModePn9 }, + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeColorBars, 1 }, + { controls::draft::TestPatternModeSolidColor, 2 }, + { controls::draft::TestPatternModeColorBarsFadeToGray, 3 }, + { controls::draft::TestPatternModePn9, 4 }, }, } }, { "imx258", { @@ -75,15 +75,15 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen { "ov5670", { .unitCellSize = { 1120, 1120 }, .testPatternModes = { - { 0, controls::draft::TestPatternModeOff }, - { 1, controls::draft::TestPatternModeColorBars }, + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeColorBars, 1 }, }, } }, { "ov13858", { .unitCellSize = { 1120, 1120 }, .testPatternModes = { - { 0, controls::draft::TestPatternModeOff }, - { 1, controls::draft::TestPatternModeColorBars }, + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeColorBars, 1 }, }, } }, { "ov5647", { @@ -93,8 +93,8 @@ const CameraSensorProperties *CameraSensorProperties::get(const std::string &sen { "ov5693", { .unitCellSize = { 1400, 1400 }, .testPatternModes = { - { 0, controls::draft::TestPatternModeOff }, - { 2, controls::draft::TestPatternModeColorBars }, + { controls::draft::TestPatternModeOff, 0 }, + { controls::draft::TestPatternModeColorBars, 2 }, /* * No corresponding test pattern mode for * 1: "Random data" and 3: "Colour Bars with From patchwork Mon Jun 28 17:27:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hirokazu Honda X-Patchwork-Id: 12733 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 350D4C3220 for ; Mon, 28 Jun 2021 17:28:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E972C684D8; Mon, 28 Jun 2021 19:28:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="aUtZLc7S"; dkim-atps=neutral Received: from mail-pj1-x1034.google.com (mail-pj1-x1034.google.com [IPv6:2607:f8b0:4864:20::1034]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AF6EA684D4 for ; Mon, 28 Jun 2021 19:28:05 +0200 (CEST) Received: by mail-pj1-x1034.google.com with SMTP id x21-20020a17090aa395b029016e25313bfcso510772pjp.2 for ; Mon, 28 Jun 2021 10:28:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ar9/+S5S66A5XGDuDYAJXnxakDrp0s2FQsZbl04X+dk=; b=aUtZLc7S7RiO4l79oIc9iORY2sLyMSYppe89jgnnGVOEsMScQ+pAsrOX2UiTYzhLHX AD3uuWVrTd1b1M3VFiI/SdGvKnn6+LTIbD/W6BnVx5LTftK/puPxeqF91IwEAjjiFZaG RQVFdBNVqaFLeo5l3X86FwF1c1Ib1rIPPekqc= 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=ar9/+S5S66A5XGDuDYAJXnxakDrp0s2FQsZbl04X+dk=; b=Nx2yldOw6Pl30zt4L3yUzDvP7wwEtqyghHfHuNDpUVbNqasK4jXEWuZKaEhI2fFo1+ rqpo6DGVCtjpNrSl0VAg/T96aSiUOmaoLEkNMxg1oFMkdUYoou+FqrDmjFHOWD8j23Kx cDsbvf97nAOU8fN/S1rl/IzGLONfBBsQGpP6q1O3B9m78452YyDw00OpZgGO+ydMGAOJ kULMtzJHfOlS7+h+VUpbQ23c/1IN8THXtinYdJSQDgOM6Xwqf7URhiCRrO4KRYrfNNqc UmTy9a2MEk23cAT/FjCRBjt3X0ZKW3L8lYvn35S9f4nH7uglQMBS5GRmQYX/45XzkiFB 9/Sg== X-Gm-Message-State: AOAM532eR3KZ8NcdKFe5Me85+JaVSwcm5oPRDn47+MWWAMFNC4lmmI5b INfLJ7U8K0fIQjrgcMLRjLVlhb29gUfZ9w== X-Google-Smtp-Source: ABdhPJxZC0AR61RlscaJFHE1hT9J3oT3iNghdNKjgzlKIC8cNrl6Q7xvajo28HyuHJu5IOsKYR6YNg== X-Received: by 2002:a17:90a:17ad:: with SMTP id q42mr39528265pja.181.1624901284034; Mon, 28 Jun 2021 10:28:04 -0700 (PDT) Received: from hiroh2.tok.corp.google.com ([2401:fa00:8f:203:a147:1cb:e226:4ed9]) by smtp.gmail.com with ESMTPSA id d1sm4682358pju.16.2021.06.28.10.28.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jun 2021 10:28:03 -0700 (PDT) From: Hirokazu Honda To: libcamera-devel@lists.libcamera.org Date: Tue, 29 Jun 2021 02:27:55 +0900 Message-Id: <20210628172755.3201441-2-hiroh@chromium.org> X-Mailer: git-send-email 2.32.0.93.g670b81a890-goog In-Reply-To: <20210628172755.3201441-1-hiroh@chromium.org> References: <20210628172755.3201441-1-hiroh@chromium.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/2] libcamera: camera_sensor: Enable to set a test pattern mode 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" Provides a function to set the camera sensor a test pattern mode. Signed-off-by: Hirokazu Honda --- include/libcamera/internal/camera_sensor.h | 5 +++ src/libcamera/camera_sensor.cpp | 46 +++++++++++++++++++--- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index db12b07e..0c3222ac 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -24,6 +24,7 @@ namespace libcamera { class BayerFormat; +struct CameraSensorProperties; class MediaEntity; class CameraSensor : protected Loggable @@ -44,6 +45,7 @@ public: { return testPatternModes_; } + int setTestPatternMode(int32_t testPatternMode); V4L2SubdeviceFormat getFormat(const std::vector &mbusCodes, const Size &size) const; @@ -78,6 +80,8 @@ private: std::unique_ptr subdev_; unsigned int pad_; + const CameraSensorProperties *props_; + std::string model_; std::string id_; @@ -85,6 +89,7 @@ private: std::vector mbusCodes_; std::vector sizes_; std::vector testPatternModes_; + int32_t testPatternMode_; Size pixelArraySize_; Rectangle activeArea_; diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index ee53adf3..a9cc95c7 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -54,8 +54,8 @@ LOG_DEFINE_CATEGORY(CameraSensor) * Once constructed the instance must be initialized with init(). */ CameraSensor::CameraSensor(const MediaEntity *entity) - : entity_(entity), pad_(UINT_MAX), bayerFormat_(nullptr), - properties_(properties::properties) + : entity_(entity), pad_(UINT_MAX), testPatternMode_(-1), + bayerFormat_(nullptr), properties_(properties::properties) { } @@ -300,14 +300,14 @@ void CameraSensor::initVimcDefaultProperties() void CameraSensor::initStaticProperties() { - const CameraSensorProperties *props = CameraSensorProperties::get(model_); - if (!props) + props_ = CameraSensorProperties::get(model_); + if (!props_) return; /* Register the properties retrieved from the sensor database. */ - properties_.set(properties::UnitCellSize, props->unitCellSize); + properties_.set(properties::UnitCellSize, props_->unitCellSize); - initTestPatternModes(props->testPatternModes); + initTestPatternModes(props_->testPatternModes); } void CameraSensor::initTestPatternModes( @@ -515,6 +515,40 @@ Size CameraSensor::resolution() const * \return The list of test pattern modes */ +/** + * \brief Set the camera sensor a specified controls::TestPatternMode + * \param[in] testPatternMode test pattern mode control value to set the camera + * sensor + * + * \return 0 on success or a negative error code otherwise + */ +int CameraSensor::setTestPatternMode(int32_t testPatternMode) +{ + if (testPatternMode_ == testPatternMode) + return 0; + + if (!props_) + return -EINVAL; + + auto it = props_->testPatternModes.find(testPatternMode); + if (it == props_->testPatternModes.end()) { + LOG(CameraSensor, Error) << "Unsupported test pattern mode: " + << testPatternMode; + return -EINVAL; + } + + ControlList ctrls{ controls() }; + ctrls.set(V4L2_CID_TEST_PATTERN, it->second); + + int ret = setControls(&ctrls); + if (ret) + return ret; + + testPatternMode_ = testPatternMode; + + return 0; +} + /** * \brief Retrieve the best sensor format for a desired output * \param[in] mbusCodes The list of acceptable media bus codes