From patchwork Fri Jul 14 14:15:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 18824 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 1F57EBDC71 for ; Fri, 14 Jul 2023 14:16:09 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 09D66628C4; Fri, 14 Jul 2023 16:16:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1689344168; bh=Q9IWFqB6mXxY5M7epcsmJeDXvpQKthD6mOLYgResINc=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=pP+pI85Q5wyW6WXz0oU9kDJPTwiHJo4wU1aZgV+74++O5GGodOc9U4zfVMUV13VYL wCKg39YDeNEDCmZYRAe86ThdwFZtgxvz3wFl//8A6A2NgpBv4BSsp5zO4DqJxXPoGS mbPhnA5/QhG4Dn1+e7GPYVZHnZfSyJfXMowT/TqTUUTmZUQnGnKsSJr+/BynUxJiFT qEL6q/olMPpHq1IhbvvqLUo3+xy+FdImz1Lr3ax7/eASlMy6+0bBdPCsb7Jx1/M/wN c8Dcq1SvNNzpbn8ZWN4jO+8afZNKj2+TeUtJILRu+OKDNMg0Y4bAXqGmWCXYveAjnG S3TF4yt2MZQhw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 84319628C0 for ; Fri, 14 Jul 2023 16:16:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="s1Kc/QDh"; dkim-atps=neutral Received: from uno.localdomain (mob-5-90-9-92.net.vodafone.it [5.90.9.92]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1D72657E; Fri, 14 Jul 2023 16:15:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1689344115; bh=Q9IWFqB6mXxY5M7epcsmJeDXvpQKthD6mOLYgResINc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s1Kc/QDh1TPOfoglBigLyQ2rReV8AxbcCEWmGbj79LM6Nfkts8t/zW2kYuBPrHaQ8 WXtIoqTzhOwef4+9WiSlqyZRiOba0ugwVmqfTFLpxlFAYKoag8A+YY7FdfJF0GMsDy 2QI+CjEyoHKoTS2jngJwK0W+3yRu/DnPtUXv+7ko= To: libcamera-devel@lists.libcamera.org Date: Fri, 14 Jul 2023 16:15:42 +0200 Message-Id: <20230714141549.11085-3-jacopo.mondi@ideasonboard.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230714141549.11085-1-jacopo.mondi@ideasonboard.com> References: <20230714141549.11085-1-jacopo.mondi@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/9] libcamera: camera: Introduce CameraConfiguration::orientation 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: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Introduce CameraConfiguration::Orientation in the CameraConfiguration class. The Orienation enumeration describes the possible 2D transformations that can be applied to an image using two basic plane transformations. The enumeration values follow the ones defined by the EXIF specification at revision 2.32, Tag 274 'orientation'. The newly introduced filed is meant to replace CameraConfiguration::transform which is not removed yet not to break compilation. Signed-off-by: Jacopo Mondi Reviewed-by: David Plowman --- include/libcamera/camera.h | 17 +++++++++ src/libcamera/camera.cpp | 76 +++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 004bc89455f5..8132ef2506a4 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -39,6 +40,18 @@ public: Invalid, }; + enum Orientation { + /* EXIF tag 274 starts from '1' */ + rotate0 = 1, + rotate0Flip, + rotate180, + rotate180Flip, + rotate90Flip, + rotate270, + rotate270Flip, + rotate90, + }; + using iterator = std::vector::iterator; using const_iterator = std::vector::const_iterator; @@ -67,6 +80,7 @@ public: std::size_t size() const; Transform transform; + Orientation orientation; protected: CameraConfiguration(); @@ -83,6 +97,9 @@ protected: std::vector config_; }; +std::ostream &operator<<(std::ostream &out, + const CameraConfiguration::Orientation &orientation); + class Camera final : public Object, public std::enable_shared_from_this, public Extensible { diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 0eecee766f00..78aa11e72dd4 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -145,6 +145,44 @@ LOG_DECLARE_CATEGORY(Camera) * The configuration is invalid and can't be adjusted automatically */ +/** + * \enum CameraConfiguration::Orientation + * \brief The image orientation in a memory buffer + * + * The Orientation enumeration describes the orientation of the images + * produced by the camera pipeline as they get received by the application + * inside memory buffers. + * + * All the possible 2D planes transformation of an image are expressed as the + * combination of two basic operations: + * + * 'a': rotate the image 90 degrees clockwise + * 'b': flip the image horizontally (mirroring) + * + * plus an identity operator 'e'. + * + * The composition of operations 'a' and 'b' according to the canonical function + * composition notion 'b * a' (where 'a' is applied first, then 'b' is applied + * next) gives origin to a symmetric group of order 8, or dihedral group. + * + * See https://en.wikipedia.org/wiki/Dihedral_group#/media/File:Dih4_cycle_graph.svg + * as an example of the 2D plane transformation and how they originate from + * the composition of the 'a' and 'b' operations. + * + * The image orientation expressed using the Orientation enumeration can be + * then inferred by applying a multiple of a 90 degrees rotation from the origin + * and the applying any horizontal mirroring to a base image assume to be + * naturally oriented (no rotation and no mirroring applied). + * + * The enumeration numerical values follow the ones defined by the EXIF + * Specification version 2.32, Tag 274 "Orientation", while the names of the + * enumerated values report the rotation and mirroring operations performed. + * + * In example Orientation::rotate90Flip describes the image transformation + * obtained by rotating 90 degrees clockwise first and the applying an + * horizontal mirroring. + */ + /** * \typedef CameraConfiguration::iterator * \brief Iterator for the stream configurations in the camera configuration @@ -160,7 +198,7 @@ LOG_DECLARE_CATEGORY(Camera) * \brief Create an empty camera configuration */ CameraConfiguration::CameraConfiguration() - : transform(Transform::Identity), config_({}) + : transform(Transform::Identity), orientation(rotate0), config_({}) { } @@ -317,6 +355,27 @@ std::size_t CameraConfiguration::size() const return config_.size(); } +/** + * \brief Prints human-friendly names for Orientation items + * \param[in] out The output stream + * \param[in] orientation The Orientation item + * \return The output stream \a out + */ +std::ostream &operator<<(std::ostream &out, + const CameraConfiguration::Orientation &orientation) +{ + constexpr std::array orientationNames = { + "", /* Orientation starts counting from 1. */ + "rotate0", "rotate0Flip", + "rotate180", "rotate180Flip", + "rotate90Flip", "rotate270", + "rotate270Flip", "rotate90", + }; + + out << orientationNames[orientation]; + return out; +} + /** * \enum CameraConfiguration::ColorSpaceFlag * \brief Specify the behaviour of validateColorSpaces @@ -404,6 +463,21 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF * may adjust this field at its discretion if the selection is not supported. */ +/** + * \var CameraConfiguration::orientation + * \brief The desired orientation of the images produced by the camera + * + * The orientation field is a user-specified 2D plane transformation that + * specifies how the application wants the camera images to be rotated in + * the memory buffers. + * + * If the application requested orientation cannot be obtained the validate() + * function will Adjust this field to the actual orientation of the images + * as produced by the camera pipeline. + * + * By default the orientation filed is set to Orientation::rotate0. + */ + /** * \var CameraConfiguration::config_ * \brief The vector of stream configurations