From patchwork Thu Nov 10 14:45:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 17767 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 B2AA5BE08B for ; Thu, 10 Nov 2022 14:46:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5E5C26308B; Thu, 10 Nov 2022 15:46:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1668091567; bh=7grIAjYXQ3Ea0xXqemCp3t/taCJfdbnjQ0iJFL17Fas=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=tUPFdeuCjYO+9Lzk2+Bem1adlel8899J+YXxNJzbZEHhWBqTCzbCo7EAadvt+PXze Cu62RKdYm1nRF5wxuENtil4gqw5VQ7vTKvcpXZANl3OTz2lUBK64Ci/2TxH4iF9hAj NaJagvVR0NRAjKfk+JIxuqlS4P3ybZlDDOt2Svp3TL5s2omrrcYKzUk6EjNPzjUDhk 39gRbw/gDHNReLjcL9BZcGPuLOiUwwtA/tPYFiWW5qNa6k7iodr71nN8bE75MIYu4H 47O0zzfvYMb5+yasQR4dbaKkNOx6aDQSg3e4/4jv8KlIGu05lK7J5D9Tt0Ql+d1Cei t6WpMUMZAsqeQ== Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 311D56308A for ; Thu, 10 Nov 2022 15:46:05 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="P8W9msFQ"; dkim-atps=neutral Received: by mail-wm1-x32c.google.com with SMTP id 187-20020a1c02c4000000b003cf9c3f3b80so3593223wmc.0 for ; Thu, 10 Nov 2022 06:46:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=c/XUPzGRn61e9q+kM7sM57KDqq6wnGYdRwWL5ZbwlIY=; b=P8W9msFQGrKSoiyGovEsGCFmfbnE/ntGB+H0J4SBjooOBV3qS1FYINY5Scz5R2fA3Q ly3Q/T1k2ldz1WjhO9X3QTsZf3B239cge1nQvPbOiccwwMJSguWrtLNH8XltFtW9rTh2 rEokQD3rq5gunaIZEonKDTpcmxMKBMK/m+beRMwejgx3F8Hdw+zvw8yQRQb0vQ02cEF5 4rt/tDmDNZ5R8GyMxSdBpxX0a1JmLcC19p0nqGAw6+oVljhGsy9ksGj5HIkuwhe6bCMK 37ppJbQZ1OHFNUqbTi2DNZAhGsPP5nBWoVXqdcacRMH9XSrK9Vxh2590JhJTXyJLVgd5 CudA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=c/XUPzGRn61e9q+kM7sM57KDqq6wnGYdRwWL5ZbwlIY=; b=dWz+HtOU/AaNDgcVLUK4J7/ira5EHBzamNAqPD0bvv0dakQGMNZlbhOJIlERUAodtc tx4cxjM4gmJFphqH13vY0zldu3fjlRJv7XYzRaKXUI0E6WXiICx0PRwJUZ0C9A/ewKHv h9HWuK4B0xPYTvE+Zq7rv2J3Hs/Uj6DWArJDRI9f4BkrCh23ZLKjBRDJbhnKPyaYGVpe Ph4DQtFwN2nGq9rgzA6w5N/bhYRUbgGH11LOqTBV8YRltxyO8A7SP6CdJljgHxMFr/kM QieAZFy2iiN0URpanuyjfqWdRUddD/QKd2GEuSN67pgwCpIslGXW59MT+NpQgaGKUN6t iRJA== X-Gm-Message-State: ACrzQf0RGVttUbHXtxzbipvL1XKLIXYl1cJPKxq0p+G2blwG/D3T29CQ qpRd+M1+R+CjDOgIfMCn1XW2Ux7tnxMjHQ== X-Google-Smtp-Source: AMsMyM52jYe7srS8FbqHHdc0I8/1eNJVDQuMSjhcPZ5iJ8tl+whpLiJLlDysPc0grjvtW0wuCkO9LQ== X-Received: by 2002:a1c:6a17:0:b0:3cf:9d32:db2e with SMTP id f23-20020a1c6a17000000b003cf9d32db2emr19514721wmc.62.1668091564034; Thu, 10 Nov 2022 06:46:04 -0800 (PST) Received: from pi4-davidp.pitowers.org ([2a00:1098:3142:14:e4a2:3070:eea4:e434]) by smtp.gmail.com with ESMTPSA id u24-20020a7bc058000000b003b476cabf1csm5249759wmc.26.2022.11.10.06.46.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Nov 2022 06:46:03 -0800 (PST) To: libcamera-devel@lists.libcamera.org Date: Thu, 10 Nov 2022 14:45:52 +0000 Message-Id: <20221110144556.7858-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221110144556.7858-1-david.plowman@raspberrypi.com> References: <20221110144556.7858-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/6] libcamera: camera_sensor: Do not clear camera flips when listing formats 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: , X-Patchwork-Original-From: David Plowman via libcamera-devel From: David Plowman Reply-To: David Plowman Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Previously the code used to clear the camnera's h and v flip bits when enumerating the supported formats so as to obtain any Bayer formats in the sensor's native (untransformed) orientation. However this fails when the camera is already in use elsewhere. Instead, we query the current state of the flip bits and transform the formats - which we obtain in their flipped orientation - back into their native orientation to be stored. Signed-off-by: David Plowman Reviewed-by: Jacopo Mondi --- src/libcamera/camera_sensor.cpp | 49 ++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index 572a313a..cbac9e78 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -19,6 +19,8 @@ #include +#include + #include "libcamera/internal/bayer_format.h" #include "libcamera/internal/camera_lens.h" #include "libcamera/internal/camera_sensor_properties.h" @@ -108,18 +110,45 @@ int CameraSensor::init() return ret; /* - * Clear any flips to be sure we get the "native" Bayer order. This is - * harmless for sensors where the flips don't affect the Bayer order. + * We want to get the native mbus codes for the sensor, without any flips. + * We can't clear any flips here, so we have to read the current values + * (if the flip controls exist), decide whether they actually modify any + * output Bayer pattern, and finally undo their effect on the formats. + * + * First, check if the flip controls exist and if so read them. */ - ControlList ctrls(subdev_->controls()); - if (subdev_->controls().find(V4L2_CID_HFLIP) != subdev_->controls().end()) - ctrls.set(V4L2_CID_HFLIP, 0); - if (subdev_->controls().find(V4L2_CID_VFLIP) != subdev_->controls().end()) - ctrls.set(V4L2_CID_VFLIP, 0); - subdev_->setControls(&ctrls); + std::vector flipCtrlIds; + const struct v4l2_query_ext_ctrl *hflipInfo = subdev_->controlInfo(V4L2_CID_HFLIP); + const struct v4l2_query_ext_ctrl *vflipInfo = subdev_->controlInfo(V4L2_CID_VFLIP); + if (hflipInfo) + flipCtrlIds.push_back(V4L2_CID_HFLIP); + if (vflipInfo) + flipCtrlIds.push_back(V4L2_CID_VFLIP); + ControlList flipCtrls = subdev_->getControls(flipCtrlIds); + + /* Now construct a transform that would undo any flips. */ + Transform transform = Transform::Identity; + if (hflipInfo && flipCtrls.get(V4L2_CID_HFLIP).get() && + (hflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)) + transform |= Transform::HFlip; + if (vflipInfo && flipCtrls.get(V4L2_CID_VFLIP).get() && + (vflipInfo->flags & V4L2_CTRL_FLAG_MODIFY_LAYOUT)) + transform |= Transform::VFlip; + + /* Finally get the formats, and apply the transform to the mbus codes. */ + auto formats = subdev_->formats(pad_); + for (const auto &format : formats) { + unsigned int mbusCode = format.first; + BayerFormat bayerFormat = BayerFormat::fromMbusCode(mbusCode); + + if (bayerFormat.isValid()) + mbusCode = bayerFormat.transform(transform).toMbusCode(); + + if (mbusCode) + formats_[mbusCode] = std::move(format.second); + } /* Enumerate, sort and cache media bus codes and sizes. */ - formats_ = subdev_->formats(pad_); if (formats_.empty()) { LOG(CameraSensor, Error) << "No image format found"; return -EINVAL; @@ -189,7 +218,7 @@ int CameraSensor::init() * \todo The control API ought to have a flag to specify if a control * is read-only which could be used below. */ - const ControlInfo hblank = ctrls.infoMap()->at(V4L2_CID_HBLANK); + const ControlInfo hblank = subdev_->controls().at(V4L2_CID_HBLANK); const int32_t hblankMin = hblank.min().get(); const int32_t hblankMax = hblank.max().get();