Show a cover letter.

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

{
    "id": 13195,
    "url": "https://patchwork.libcamera.org/api/1.1/covers/13195/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/13195/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20210804124314.8044-1-laurent.pinchart@ideasonboard.com>",
    "date": "2021-08-04T12:43:06",
    "name": "[libcamera-devel,v3,0/8] libcamera: Add DRM/KMS viewfinder display to cam",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/1.1/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/cover/13195/mbox/",
    "series": [
        {
            "id": 2303,
            "url": "https://patchwork.libcamera.org/api/1.1/series/2303/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2303",
            "date": "2021-08-04T12:43:06",
            "name": "libcamera: Add DRM/KMS viewfinder display to cam",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/2303/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/13195/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 ED252C3235\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  4 Aug 2021 12:43:32 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 331B46882A;\n\tWed,  4 Aug 2021 14:43:32 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 034AE6026E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Aug 2021 14:43:30 +0200 (CEST)",
            "from pendragon.lan (62-78-145-57.bb.dnainternet.fi [62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8139724F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Aug 2021 14:43:29 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"pp5v4thU\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1628081009;\n\tbh=L9yLxay/WS0zp5KfqpJQXy1h95X5lnQTkgnxIs6dbmA=;\n\th=From:To:Subject:Date:From;\n\tb=pp5v4thUX3J5GJPPL247ig8qdgw5l1pVcTLbk2hnIEl+XYkmGtHk0rTk230UCR3Jn\n\tEiPL4CR7UcQnDbC4h/t6pJOyGduT8AF5RyNu2R0KHWBtMpaENSRa9UOVGyYmZ8Bs01\n\tTLRTno6sMorL6q9LER+iBCr8pHM+53fRpf2VKgUM=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed,  4 Aug 2021 15:43:06 +0300",
        "Message-Id": "<20210804124314.8044-1-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.31.1",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v3 0/8] libcamera: Add DRM/KMS viewfinder\n\tdisplay to cam",
        "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": "Hello,\n\nThis patch series extends the cam application to implement live\nviewfinder display using a DRM/KMS device. Supported display features\nare currently fairly limited (scaling and overlays are not supported for\ninstance), but should nonetheless be a good first step.\n\nPatches 1/8 extends to EventLoop class to support file descriptor\nevents, needed by KMS. Patches 2/8 to 4/8 then refactor the cam\napplication and the BufferWriter class to introduce an abstract\nFrameSink class. Patch 5/8 adds a set of classes to wrap the DRM/KMS API\n(using libdrm). Patches 6/8 and 7/8 add a DRM/KMS frame sink\nimplementation, and patch 8/8 wires it up in the cam application.\n\nI've kept patch 7/8 separate from 6/8 to outline in the history that\nit's one of multiple options, and make it easier to switch to a\ndifferent implementation later if needed. Enabling the display is a\ncostly operation, so doing it at start() time would be best. However, we\nwould need a frame buffer to be displayed at that point, and none is\navailable yet from the camera. Patch 7/8 thus delays enabling the\ndisplay to the first frame. The operation isn't too costly from a\nuserspace point of view as the atomic request is committed\nasynchronously (although it still requires two ioctl calls, one to\ncreate the mode blob - but this could be moved to start() - and one to\ncommit the request). Another option would be to allocate an extra dumb\nbuffer and fill it with static data for the first frame.\n\nI've tested this with the simple pipeline handler on an R-Car H3\nSalvator-XS board, running\n\ncam -c 'platform/vimc.0 Sensor B' \\\n        -s pixelformat=BGR888,width=1440,height=900 -C -D HDMI-A-1\n\nwith vimc as a source. As the R-Car DU requires DMA contiguous memory by\ndefault (IOMMU support is enabled), a patch is required to use the vb2\ndma-contig allocator in vimc. It can be found at [1].\n\nThe size of the stream has to match the size of the display, as scaling\nisn't supported yet. As vimc requires the output size to be a multiple\nof 3, this restricts the possible resolutions (we should *really* fix\nthis in the vimc driver).\n\nCompared to v2, review comments have been taken into account. Please see\nchangelogs in individual patches for details.\n\nCompared to v1, the frame sink implementation is now based on requests\ninstead of buffers, which should address Niklas' concerns.\n\n[1] https://lore.kernel.org/linux-media/20210730001939.30769-1-laurent.pinchart+renesas@ideasonboard.com/T/#u\n\nLaurent Pinchart (8):\n  cam: event_loop: Add support for file descriptor events\n  cam: Add FrameSink base class\n  cam: Turn BufferWriter into a FrameSink\n  cam: Rename BufferWriter to FileSink\n  cam: Add DRM helper classes\n  cam: Add KMS sink class\n  cam: kms_sink: Enable display on first frame\n  cam: Add support for viewfinder through DRM/KMS\n\n src/cam/buffer_writer.h                      |  31 -\n src/cam/camera_session.cpp                   |  94 ++-\n src/cam/camera_session.h                     |   6 +-\n src/cam/drm.cpp                              | 663 +++++++++++++++++++\n src/cam/drm.h                                | 331 +++++++++\n src/cam/event_loop.cpp                       |  44 ++\n src/cam/event_loop.h                         |  20 +\n src/cam/{buffer_writer.cpp => file_sink.cpp} |  49 +-\n src/cam/file_sink.h                          |  38 ++\n src/cam/frame_sink.cpp                       |  67 ++\n src/cam/frame_sink.h                         |  34 +\n src/cam/kms_sink.cpp                         | 297 +++++++++\n src/cam/kms_sink.h                           |  74 +++\n src/cam/main.cpp                             |   6 +\n src/cam/main.h                               |   1 +\n src/cam/meson.build                          |  17 +-\n 16 files changed, 1718 insertions(+), 54 deletions(-)\n delete mode 100644 src/cam/buffer_writer.h\n create mode 100644 src/cam/drm.cpp\n create mode 100644 src/cam/drm.h\n rename src/cam/{buffer_writer.cpp => file_sink.cpp} (67%)\n create mode 100644 src/cam/file_sink.h\n create mode 100644 src/cam/frame_sink.cpp\n create mode 100644 src/cam/frame_sink.h\n create mode 100644 src/cam/kms_sink.cpp\n create mode 100644 src/cam/kms_sink.h"
}