Show a cover letter.

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

{
    "id": 22226,
    "url": "https://patchwork.libcamera.org/api/covers/22226/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/22226/",
    "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": "<20241206160747.97176-1-jacopo.mondi@ideasonboard.com>",
    "date": "2024-12-06T16:07:38",
    "name": "[0/8] libcamera: Support partial metadata completion",
    "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/22226/mbox/",
    "series": [
        {
            "id": 4858,
            "url": "https://patchwork.libcamera.org/api/series/4858/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4858",
            "date": "2024-12-06T16:07:38",
            "name": "libcamera: Support partial metadata completion",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/4858/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/22226/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 9C79BBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  6 Dec 2024 16:07:57 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6FF5167E21;\n\tFri,  6 Dec 2024 17:07:56 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C5EA8618B3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Dec 2024 17:07:54 +0100 (CET)",
            "from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 053CE641;\n\tFri,  6 Dec 2024 17:07:24 +0100 (CET)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"b0EFEzS7\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1733501245;\n\tbh=P6JaGOW/mirczEKkAgOcOKQMzd2RG3A1zeS7xB6PFbs=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=b0EFEzS7jWJ/kz0K8mgPZ0AZFsdeY7A1AVboPtHUxQnrqfy2IWHIUyCl6ZLiCjkUM\n\t1si0uCk23x6zWaPt7Yvq7PxbIbCkB4CV2VWg+QcwOZAV+XvCvZo+Ukk/RiVVf6260Q\n\tY3CnS9Hedi81UG1F0FAZiwey3HNI29SlkrP4+sCU=",
        "From": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tHarvey Yang <chenghaoyang@chromium.org>,\n\tHan-Lin Chen <hanlinchen@chromium.org>",
        "Subject": "[PATCH 0/8] libcamera: Support partial metadata completion",
        "Date": "Fri,  6 Dec 2024 17:07:38 +0100",
        "Message-ID": "<20241206160747.97176-1-jacopo.mondi@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "There has been quite some back and forth on how this should be done,\nspecifically how to have pipeline handlers behave uniformly and how to\nhave them use the same mechanism to signal metadata availability and store\nthe metadata in Request::metadata() for existing applications to access it.\n\nI took the shortest paths: all pipeline handlers now use early metadata\ncompletion, but the feature is totally opt-in for applications.\n\nThe basic idea is to restrict access to Request::metadata() to get a const\nreference. This way pipeline handlers and applications cannot modify the\nmetadata list directly.\n\nThen two new helpers have been added to PipelineHandler base for pipeline\nhandlers to add metadata results to Request::metadata(). These new\nfunctions trigger the Camera::metadataAvailable signal from the core.\n\nSo now all pipeline handlers:\n1) To store metadata have to use PipelineHandler::metadataAvailable() function\n2) The core triggers Camera::metadataAvailable on behalf of pipelines\n\nPerformances:\n\n- Controls are copied, this is bad as they can transport large quantity of data\n\n  To avoid sending large quantity of data over a signal, and have the same\n  data stored in Request::metadata, the new signal transports pointers to the\n  ControlId that have been updated. Application can access the actual values\n  from Request::metadata() using the ids.\n\n- Avoid intermediate copies when calling PipelineHandler::metadataAvailable()\n\n  Currently pipeline handlers either\n\n  - Merge ControlList in Request::metadata()\n  - Set single controls in Request::metadata()\n\n  Merging ControlList was already non-efficient, as control values have been\n  first copied to a list, then merged (copied) into Request::metadata. The\n  new PipelineHandler::metadataAvailable(Request *, const ControlList &)\n  doesn't introduce any additional copy.\n\n  When it comes to setting single controls, the easier way would have been to\n  use a ControlValue as in\n\n  PipelineHandler::metadataAvailable(Request *, ControlId *, ControlValue &)\n\n  However creating a ControlValue would first copy the control content in the\n  temporary object, and the copy it again when setting it in\n  Request::metadata(). To avoid double copies two templated functions have been\n  prepared and the function arguments are copied directly into\n  Request::metadata(). If I got this right the new\n\n   metadataAvailable(request, controls::SomeControl, { .... });\n\n  is not less efficient than\n\n   request->metadata().set(controls::SomeControl, { ..... });\n\nLast patch as DNI to show how the new signal can be used by applications.\n\nThanks\n  j\n\nJacopo Mondi (8):\n  libcamera: camera: Introduce metadataAvailable signal\n  guides: application: Document Camera::metadataAvailable\n  libcamera: pipeline_handler: Add metadataAvailable() function\n  guides: pipeline_handler: Document PipelineHandler::metadataAvailable\n  libcamera: request: Add function to reset metadata\n  libcamera: pipelines: Use the metadataAvailable() function\n  libcamera: request: Make access to metadata() const\n  [DNI] apps: cam: Use Camera::metadataAvailable signal\n\n .../guides/application-developer.rst          |  8 ++\n Documentation/guides/pipeline-handler.rst     | 26 +++++--\n include/libcamera/camera.h                    |  2 +\n include/libcamera/internal/pipeline_handler.h | 41 ++++++++++\n include/libcamera/internal/request.h          |  8 ++\n include/libcamera/request.h                   |  4 +-\n src/apps/cam/camera_session.cpp               | 17 +++++\n src/apps/cam/camera_session.h                 |  2 +\n src/libcamera/camera.cpp                      | 42 +++++++++++\n src/libcamera/pipeline/imx8-isi/imx8-isi.cpp  |  6 +-\n src/libcamera/pipeline/ipu3/ipu3.cpp          | 14 ++--\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  8 +-\n .../pipeline/rpi/common/pipeline_base.cpp     | 12 +--\n src/libcamera/pipeline/rpi/vc4/vc4.cpp        |  2 +-\n src/libcamera/pipeline/simple/simple.cpp      |  4 +-\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp  |  4 +-\n src/libcamera/pipeline/vimc/vimc.cpp          |  4 +-\n src/libcamera/pipeline/virtual/virtual.cpp    |  3 +-\n src/libcamera/pipeline_handler.cpp            | 74 +++++++++++++++++++\n 19 files changed, 243 insertions(+), 38 deletions(-)\n\n--\n2.47.1"
}