From patchwork Wed Jul 16 20:46:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Allen Ballway X-Patchwork-Id: 23832 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 9D5D0C3237 for ; Wed, 16 Jul 2025 21:03:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9CB5568F75; Wed, 16 Jul 2025 23:03:33 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.b="E1Ch5RcT"; dkim-atps=neutral Received: from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com [IPv6:2607:f8b0:4864:20::42a]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7116568F70 for ; Wed, 16 Jul 2025 22:46:33 +0200 (CEST) Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-748e63d4b05so242628b3a.2 for ; Wed, 16 Jul 2025 13:46:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1752698791; x=1753303591; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=R+0tIS4niq/b/UNCOC/4RrBFsISOXx3f38P7cGXLamY=; b=E1Ch5RcT+nAw74N5yhDyXebgIKIhnXhSlxJmd6g8b/Ko30UcWTULALIaCmwySCsi4Z A+tWeDohSP43zAzM75kkiJ9BeVRYLmnAStrAmqSmcrMAQjxlASPdN6c/DD6AYTT/1mi1 RMeuyVOfZTXD29b3NIU0Aefmbe+4H/RFb3rgQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752698791; x=1753303591; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=R+0tIS4niq/b/UNCOC/4RrBFsISOXx3f38P7cGXLamY=; b=Kkth8mRfbyewiI8W6aM+dzO7une2AKXTLhSPdzTGDhp9/svER7Hs7PpjEi5Ak6xHJT kCocsUULLt5hWIKAarJHGvtfhPtb8LIpd6z5l14M3mOPDlEbOsqPGAxvldV360nAdKb6 bbnKekncGUf7kgUK7HpVwku+DceIiyMAZcCziFBYzygQ7o6zT5EPQ0g5CgSRHJYMpJjG eN0gXf2Uq1kxlGsV3s5nlu5DCaMgzFjVtbE4R5FHxH3aQ7UAoofSgVx4FSBjZA/GWf3J BbcEAIFRouVyXXlJf1RlZ6AjIq7lgN04t88SwuWimvpTGYwJF3PDddj5KAPQC70jzdso EyiA== X-Gm-Message-State: AOJu0YzoigtkUE7zphPUHGi/Ooq6FlHjPhWCBNpPk2cD7YqL74dbgfMb FcSLwVCTVBtSu1Pg6X3yOwFl1qDeHx0GPc0oIbBUerF27V/KFi/7v6W8Uk1yj6VCZ9E+X+Mv6eX Z/VI= X-Gm-Gg: ASbGncs7OaiW1re55jJ9TiiZCgwHiXfRK9QfzZxSzm+0H8daJtSKaB76+EA/k/zdmdK Q5ed1Mh5ABZ+qE4gjNq6L3b6eF/t4lDjEuptxCx7YAugDF+wUjBalHSJZAboSQEE4wqcSEhk9w+ 8vGdQDm5LoxpbHNg8r17uc+JIB7+daEfgYdpKfohGSvCD1KAqJLxYZq/u9dk5X60U52sXI9L3iS J54DfwMw85oyo3wZTrMit6V+85DuGYlyIgxO8bNLzmSud/QtHYx3+3FLgz/5TuFH7V2jk4sWF0W Oyn2eV1s5jKmuq5EKUBzEVqZ67fFx3E7Q5g2P6CZmqEkeDQdJZCf2WF3X9e6VOJPgGE/TH2oZ4P SzFUBEu2hIyF5ES51hKO5S9Ce X-Google-Smtp-Source: AGHT+IHSfTJmdWVKXBPcZmVi/U9uILNdHbWrug9jK8YHttzJ3QHEZlIe685u+cgDmTYjLiQK1ng7zg== X-Received: by 2002:a05:6a00:2d08:b0:74c:efae:ffae with SMTP id d2e1a72fcca58-75722376ce1mr4371993b3a.5.1752698791546; Wed, 16 Jul 2025 13:46:31 -0700 (PDT) Received: from ballway23.lan ([136.27.48.153]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74eb9f8dbf1sm14207521b3a.152.2025.07.16.13.46.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Jul 2025 13:46:31 -0700 (PDT) From: Allen Ballway To: libcamera-devel@lists.libcamera.org Cc: hanlinchen@chromium.org, Allen Ballway Subject: [PATCH] libcamera: android: Add optional mirrored value for config Date: Wed, 16 Jul 2025 13:46:20 -0700 Message-ID: <20250716204625.3221592-1-ballway@chromium.org> X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog MIME-Version: 1.0 X-Mailman-Approved-At: Wed, 16 Jul 2025 23:03:32 +0200 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" Adds an optional `mirrored` value to the HAL config, which is used to modify the `orientation` of the camera config. No rotation is used, so it can only set the orientation to `Orientation::Rotate0Mirror`. This enables sensors which are incorrectly mirrored to be corrected. Signed-off-by: Allen Ballway --- src/android/camera_device.cpp | 6 ++++++ src/android/camera_device.h | 1 + src/android/camera_hal_config.cpp | 14 ++++++++++++++ src/android/camera_hal_config.h | 1 + 4 files changed, 22 insertions(+) -- 2.50.0.727.gbf7dc18ff4-goog diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 80ff248c2..b20e9f3db 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -377,6 +377,7 @@ int CameraDevice::initialize(const CameraConfigData *cameraConfigData) orientation_ = 0; } + mirrored_ = cameraConfigData && cameraConfigData->mirrored; return capabilities_.initialize(camera_, orientation_, facing_); } @@ -547,6 +548,11 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list) return -EINVAL; } + // Rotation is unsupported, so if mirrored just set orientation. + if (mirrored_) { + config->orientation = Orientation::Rotate0Mirror; + } + /* * Clear and remove any existing configuration from previous calls, and * ensure the required entries are available without further diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 194ca3030..d304a1285 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -126,6 +126,7 @@ private: int facing_; int orientation_; + int mirrored_; CameraMetadata lastSettings_; }; diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp index 7ef451ef8..a2beba5d3 100644 --- a/src/android/camera_hal_config.cpp +++ b/src/android/camera_hal_config.cpp @@ -33,6 +33,7 @@ private: int parseCameraConfigData(const std::string &cameraId, const YamlObject &); int parseLocation(const YamlObject &, CameraConfigData &cameraConfigData); int parseRotation(const YamlObject &, CameraConfigData &cameraConfigData); + int parseMirrored(const YamlObject &, CameraConfigData &cameraConfigData); std::map *cameras_; }; @@ -106,6 +107,9 @@ int CameraHalConfig::Private::parseCameraConfigData(const std::string &cameraId, if (parseRotation(cameraObject, cameraConfigData)) return -EINVAL; + /* Parse optional property "mirrored" */ + parseMirrored(cameraObject, cameraConfigData); + return 0; } @@ -145,6 +149,16 @@ int CameraHalConfig::Private::parseRotation(const YamlObject &cameraObject, return 0; } +int CameraHalConfig::Private::parseMirrored(const YamlObject &cameraObject, + CameraConfigData &cameraConfigData) +{ + if (!cameraObject.contains("mirrored")) + return -EINVAL; + + cameraConfigData.mirrored = cameraObject["mirrored"].get(false); + return 0; +} + CameraHalConfig::CameraHalConfig() : Extensible(std::make_unique()), exists_(false), valid_(false) { diff --git a/src/android/camera_hal_config.h b/src/android/camera_hal_config.h index a4bedb6e6..a96190470 100644 --- a/src/android/camera_hal_config.h +++ b/src/android/camera_hal_config.h @@ -15,6 +15,7 @@ struct CameraConfigData { int facing = -1; int rotation = -1; + bool mirrored = false; }; class CameraHalConfig final : public libcamera::Extensible