Patch Detail
Show a patch.
GET /api/patches/17888/?format=api
{ "id": 17888, "url": "https://patchwork.libcamera.org/api/patches/17888/?format=api", "web_url": "https://patchwork.libcamera.org/patch/17888/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20221124121220.47000-3-jacopo@jmondi.org>", "date": "2022-11-24T12:12:13", "name": "[libcamera-devel,2/9] libcamera: camera_sensor: Do not clear camera flips when listing formats", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "d26a71a20e64b161c078b7b9c9f93670179f7674", "submitter": { "id": 3, "url": "https://patchwork.libcamera.org/api/people/3/?format=api", "name": "Jacopo Mondi", "email": "jacopo@jmondi.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/17888/mbox/", "series": [ { "id": 3638, "url": "https://patchwork.libcamera.org/api/series/3638/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3638", "date": "2022-11-24T12:12:11", "name": "libcamera: camera_sensor: Centralize flips handling", "version": 1, "mbox": "https://patchwork.libcamera.org/series/3638/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/17888/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/17888/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 D9A76BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 24 Nov 2022 12:12:31 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D5EF963323;\n\tThu, 24 Nov 2022 13:12:30 +0100 (CET)", "from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net\n\t[217.70.183.194])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 92F6063319\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 24 Nov 2022 13:12:28 +0100 (CET)", "(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id A49DD40002;\n\tThu, 24 Nov 2022 12:12:27 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1669291950;\n\tbh=rkqY+rdxPsZzbM+wm8W6vy87mJYXqpr2dW4Y5OAN7AM=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=wSV4ZrawThIRzxSy5UEyglwKGhHnhyb972nuiUtD2jCozPbcqqcN/CWqsOB97vJMy\n\tNr4gZ6iy/JYHI+zyCxIen1OSCO3oqLzaQlJw4K8dM18W3MwYjdkSnNWbgp6a6ntzj1\n\tD0n8Zn+ZOXLlFRqDOaP0uQKPdIeBaAEBzjoVwl8xmqIvY7xD1/Uny2N88yvfrP0/VR\n\tQXaDcLiC2Z2a2XpJJ7vavwuTpJvPxRaJqrR4nIaC2dCTjWBLG+qQ76yCKZFoFq24++\n\tetQ/oufCqygJd+FgpUSLf213VsB6HziBOU3KEd5uQt+uS9Zy1bWn7Yaq1V+Zs7xHoz\n\t0lw7pP/BZaTbA==", "To": "libcamera-devel@lists.libcamera.org", "Date": "Thu, 24 Nov 2022 13:12:13 +0100", "Message-Id": "<20221124121220.47000-3-jacopo@jmondi.org>", "X-Mailer": "git-send-email 2.38.1", "In-Reply-To": "<20221124121220.47000-1-jacopo@jmondi.org>", "References": "<20221124121220.47000-1-jacopo@jmondi.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 2/9] libcamera: camera_sensor: Do not\n\tclear camera flips when listing formats", "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>", "From": "Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>", "Reply-To": "Jacopo Mondi <jacopo@jmondi.org>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "From: David Plowman <david.plowman@raspberrypi.com>\n\nPreviously the code used to clear the camnera's h and v flip bits when\nenumerating the supported formats so as to obtain any Bayer formats in\nthe sensor's native (untransformed) orientation. However this fails\nwhen the camera is already in use elsewhere.\n\nInstead, we query the current state of the flip bits and transform the\nformats - which we obtain in their flipped orientation - back into\ntheir native orientation to be stored.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n src/libcamera/camera_sensor.cpp | 49 ++++++++++++++++++++++++++-------\n 1 file changed, 39 insertions(+), 10 deletions(-)", "diff": "diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp\nindex 572a313a8f99..cbac9e7801ae 100644\n--- a/src/libcamera/camera_sensor.cpp\n+++ b/src/libcamera/camera_sensor.cpp\n@@ -19,6 +19,8 @@\n \n #include <libcamera/base/utils.h>\n \n+#include <libcamera/transform.h>\n+\n #include \"libcamera/internal/bayer_format.h\"\n #include \"libcamera/internal/camera_lens.h\"\n #include \"libcamera/internal/camera_sensor_properties.h\"\n@@ -108,18 +110,45 @@ int CameraSensor::init()\n \t\treturn ret;\n \n \t/*\n-\t * Clear any flips to be sure we get the \"native\" Bayer order. This is\n-\t * harmless for sensors where the flips don't affect the Bayer order.\n+\t * We want to get the native mbus codes for the sensor, without any flips.\n+\t * We can't clear any flips here, so we have to read the current values\n+\t * (if the flip controls exist), decide whether they actually modify any\n+\t * output Bayer pattern, and finally undo their effect on the formats.\n+\t *\n+\t * First, check if the flip controls exist and if so read them.\n \t */\n-\tControlList ctrls(subdev_->controls());\n-\tif (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end())\n-\t\tctrls.set(V4L2_CID_HFLIP, 0);\n-\tif (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end())\n-\t\tctrls.set(V4L2_CID_VFLIP, 0);\n-\tsubdev_->setControls(&ctrls);\n+\tstd::vector<uint32_t> flipCtrlIds;\n+\tconst struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP);\n+\tconst struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP);\n+\tif (hflipInfo)\n+\t\tflipCtrlIds.push_back(V4L2_CID_HFLIP);\n+\tif (vflipInfo)\n+\t\tflipCtrlIds.push_back(V4L2_CID_VFLIP);\n+\tControlList flipCtrls = subdev_->getControls(flipCtrlIds);\n+\n+\t/* Now construct a transform that would undo any flips. */\n+\tTransform transform = Transform::Identity;\n+\tif (hflipInfo && flipCtrls.get(V4L2_CID_HFLIP).get<int>() &&\n+\t (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT))\n+\t\ttransform |= Transform::HFlip;\n+\tif (vflipInfo && flipCtrls.get(V4L2_CID_VFLIP).get<int>() &&\n+\t (vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT))\n+\t\ttransform |= Transform::VFlip;\n+\n+\t/* Finally get the formats, and apply the transform to the mbus codes. */\n+\tauto formats = subdev_->formats(pad_);\n+\tfor (const auto &format : formats) {\n+\t\tunsigned int mbusCode = format.first;\n+\t\tBayerFormat bayerFormat = BayerFormat::fromMbusCode(mbusCode);\n+\n+\t\tif (bayerFormat.isValid())\n+\t\t\tmbusCode = bayerFormat.transform(transform).toMbusCode();\n+\n+\t\tif (mbusCode)\n+\t\t\tformats_[mbusCode] = std::move(format.second);\n+\t}\n \n \t/* Enumerate, sort and cache media bus codes and sizes. */\n-\tformats_ = subdev_->formats(pad_);\n \tif (formats_.empty()) {\n \t\tLOG(CameraSensor, Error) << \"No image format found\";\n \t\treturn -EINVAL;\n@@ -189,7 +218,7 @@ int CameraSensor::init()\n \t * \\todo The control API ought to have a flag to specify if a control\n \t * is read-only which could be used below.\n \t */\n-\tconst ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK);\n+\tconst ControlInfo hblank = subdev_->controls().at(V4L2_CID_HBLANK);\n \tconst int32_t hblankMin = hblank.min().get<int32_t>();\n \tconst int32_t hblankMax = hblank.max().get<int32_t>();\n \n", "prefixes": [ "libcamera-devel", "2/9" ] }