Show a cover letter.

GET /api/covers/19148/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 19148,
    "url": "https://patchwork.libcamera.org/api/covers/19148/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/19148/",
    "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": "<20231019140133.32090-1-jacopo.mondi@ideasonboard.com>",
    "date": "2023-10-19T14:01:21",
    "name": "[libcamera-devel,v6,0/12] libcamera: Replace CameraConfiguration::transform",
    "submitter": {
        "id": 143,
        "url": "https://patchwork.libcamera.org/api/people/143/?format=api",
        "name": "Jacopo Mondi",
        "email": "jacopo.mondi@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/cover/19148/mbox/",
    "series": [
        {
            "id": 4053,
            "url": "https://patchwork.libcamera.org/api/series/4053/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4053",
            "date": "2023-10-19T14:01:21",
            "name": "libcamera: Replace CameraConfiguration::transform",
            "version": 6,
            "mbox": "https://patchwork.libcamera.org/series/4053/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/19148/comments/",
    "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 62E26C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 19 Oct 2023 14:01:50 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1B61962980;\n\tThu, 19 Oct 2023 16:01:50 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 44DA461DD2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 19 Oct 2023 16:01:49 +0200 (CEST)",
            "from uno.LocalDomain (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2C96D276;\n\tThu, 19 Oct 2023 16:01:41 +0200 (CEST)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1697724110;\n\tbh=/N4YGMMYk5PaZEEC88n/qZxxMZSxwR7BqMVuTXGXPiE=;\n\th=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post:\n\tList-Help:List-Subscribe:From:Reply-To:Cc:From;\n\tb=O80Dazg30Ne6eP/TdhMBWnJm+tw5hD/FxSIJAtzOABDJZkDk+FBBxvy83fzxw1WCd\n\t8NvX+LguHtxmFujAM1+6iAlDEvmgHsJOmJhCyZJO6xd+5GhL4bn/H9on23sGjVK8Vs\n\tef08lxQYHzm5qfp/hhAkaa1L6DK8FfTN6icz3qQhalTRcVKsfkWiUYNnGImlW+ajWV\n\t68Aof4AuC/UYUmrXOWsMjMJ0+akO+bTEynPgJYz/MMjDpb8+r0rCna2EKFFWmwJvTB\n\t6oo08a1Bn2U2SXmh5JcEFnkTZ/7lXrbPm3kbYR63AzOO+PrOgrp/EwkoXTB+Ocl5l4\n\tm6bJAU2FKeWfg==",
            "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1697724101;\n\tbh=/N4YGMMYk5PaZEEC88n/qZxxMZSxwR7BqMVuTXGXPiE=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=vGTYMiZsGerY/r/OmP4MH7gzzCINeTG6F9jFeDo7PAUswex3m45sjO51YopJT0ebl\n\t4iABIm5BmHKVuo1zCbt8bM/Q4h+lxgMgOFAK5X37WtTkqfVwZvhCxQcV/hkcyaN92X\n\tIUuzAEsc3sQi7Vs4ISwGSZib7cH0IhBf6l1Oz0DY="
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"vGTYMiZs\"; dkim-atps=neutral",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Thu, 19 Oct 2023 16:01:21 +0200",
        "Message-ID": "<20231019140133.32090-1-jacopo.mondi@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.42.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v6 0/12] libcamera: Replace\n\tCameraConfiguration::transform",
        "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.mondi@ideasonboard.com>",
        "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "v5->v6:\n- Rename enum members\n- replace images with svg\n- fix documentation\n\nv4->v5:\n- Add support in Python layer\n- Rebased on master\n\nv3->v4:\n- Remove unrelated change in 8/10\n- Remove a double test case\n- Add David's tags\n\nv2->v3:\n- Move Orientation out of CameraConfiguration to a dedicated file\n- Change operator*(Transform, Transform)\n- Address David's comments in documentation and commit messages\n\nv1->v2:\n- Provide a better definitio of Orientation based on two basic operations\n- Provide functions to combine Orientation and Transpose\n- Provide tests\n- Do not adjust properties::Rotation anymore\n\nThis series proposes to replace the usage to Transform in the public API in\nfavour of a new Orientation type, defined based on the EXIF\nspecification, tag 274, 'orientation'. For reference this is the same as\nimplemented by gstreamer:\nhttps://gstreamer.freedesktop.org/documentation/gstreamer/gsttaglist.html?gi-language=c#GST_TAG_IMAGE_ORIENTATION\n\n(the names of the enum values are different as gstreamer expresses the\n\"correction\" while we express the actual orientation in memory buffers).\n\nThe newly introduced CameraConfiguration::orientation replaces the\nexisting CameraConfiguration::tranform, and it is meant for application to\nexpress how they would like the images to be oriented, not to tell libcamera\nwhat to do. As an example, passing in 'rotation0' means that the application\nexpects the images to be rotated upright, and doesn't tell libcamera not to\napply any rotation like passing in \"Transform::Identity\" did.\n\nThe value CameraConfiguration::orientation is set to after a validate() also\ndiffers in meaning, as instead of reporting \"what applications have to do\nto obtain what they originally asked for\" it simply reports the actual\norientation of the stream: this means that if libcamera cannot fully satisfy the\nuser request it will set ::orientation to report the native images rotation\nand the CameraConfiguration::status will be set to Adjusted.\n\nHandling of 90 and 270 degrees rotation has also changed: as the camera sensor\ncannot correct rotations that include a transposition, requests for a 90/270\ncorrections are ignored. This makes it clear and less confusing for applications\nthat they have to deal with correction fully by themselves. As an example, with\nthe current implementation if the application requires a Rot270 (HFlip +\nTranspose) libcamera will do the HFlip and leave transposition to the upper\nlayers. There is no clear advantage in doing so, and display compositors are\nbetter suited for handling transpositions and flipping in a single pass instead\nof having the library try to handle part of that.\n\nThis series clearly breaks the application API as it removes a member from\nCameraConfiguration, so it should be introduced probably only when a new release\nis cut.\n\nTested on RPi imx219 with the newly introduced cam option, flip, mirror and\nrotation work as expected.\n\n*** BLURB HERE ***\n\nJacopo Mondi (12):\n  libcamera: camera_sensor: Cache rotationTransform_\n  libcamera: camera: Introduce Orientation\n  Documentation: Add figures to document Orientation\n  libcamera: properties: Make 'Rotation' the mounting rotation\n  libcamera: transform: Add functions to convert Orientation\n  libcamera: transform: Invert operator*() operands\n  libcamera: transform: Add operations with Orientation\n  test: Add unit test for Transform and Orientation\n  py: libcamera: Define and use Orientation\n  libcamera: Use CameraConfiguration::orientation\n  apps: cam: Add option to set stream orientation\n  py: cam: Add option to set stream orientation\n\n Documentation/Doxyfile.in                     |   2 +\n Documentation/rotation/rotate0.svg            | 132 +++++++\n Documentation/rotation/rotate0Mirror.svg      | 135 +++++++\n Documentation/rotation/rotate180.svg          | 135 +++++++\n Documentation/rotation/rotate180Mirror.svg    | 135 +++++++\n Documentation/rotation/rotate270.svg          | 135 +++++++\n Documentation/rotation/rotate270Mirror.svg    | 135 +++++++\n Documentation/rotation/rotate90.svg           | 135 +++++++\n Documentation/rotation/rotate90Mirror.svg     | 135 +++++++\n include/libcamera/camera.h                    |   4 +-\n include/libcamera/internal/camera_sensor.h    |   5 +-\n include/libcamera/meson.build                 |   1 +\n include/libcamera/orientation.h               |  28 ++\n include/libcamera/transform.h                 |   7 +\n src/apps/cam/camera_session.cpp               |  18 +\n src/apps/cam/main.cpp                         |   5 +\n src/apps/cam/main.h                           |   1 +\n src/libcamera/camera.cpp                      |  20 +-\n src/libcamera/camera_sensor.cpp               | 131 ++++---\n src/libcamera/meson.build                     |   1 +\n src/libcamera/orientation.cpp                 |  79 +++++\n src/libcamera/pipeline/ipu3/ipu3.cpp          |   6 +-\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      |   8 +-\n .../pipeline/rpi/common/pipeline_base.cpp     |   9 +-\n src/libcamera/pipeline/simple/simple.cpp      |   6 +-\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |   4 +-\n src/libcamera/pipeline/vimc/vimc.cpp          |   4 +-\n src/libcamera/property_ids.yaml               |   8 +-\n src/libcamera/transform.cpp                   | 112 +++++-\n src/py/cam/cam.py                             |  21 ++\n src/py/libcamera/py_enums.cpp                 |  10 +\n src/py/libcamera/py_main.cpp                  |   2 +-\n test/meson.build                              |   1 +\n test/transform.cpp                            | 329 ++++++++++++++++++\n 34 files changed, 1787 insertions(+), 112 deletions(-)\n create mode 100644 Documentation/rotation/rotate0.svg\n create mode 100644 Documentation/rotation/rotate0Mirror.svg\n create mode 100644 Documentation/rotation/rotate180.svg\n create mode 100644 Documentation/rotation/rotate180Mirror.svg\n create mode 100644 Documentation/rotation/rotate270.svg\n create mode 100644 Documentation/rotation/rotate270Mirror.svg\n create mode 100644 Documentation/rotation/rotate90.svg\n create mode 100644 Documentation/rotation/rotate90Mirror.svg\n create mode 100644 include/libcamera/orientation.h\n create mode 100644 src/libcamera/orientation.cpp\n create mode 100644 test/transform.cpp\n\n--\n2.42.0"
}