Show a cover letter.

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

{
    "id": 26049,
    "url": "https://patchwork.libcamera.org/api/covers/26049/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/26049/",
    "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": "<20260130080935.2569621-1-paul.elder@ideasonboard.com>",
    "date": "2026-01-30T08:09:31",
    "name": "[v2,0/4] Add Sync Layer",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/cover/26049/mbox/",
    "series": [
        {
            "id": 5759,
            "url": "https://patchwork.libcamera.org/api/series/5759/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5759",
            "date": "2026-01-30T08:09:31",
            "name": "Add Sync Layer",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/5759/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/26049/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 E1AE1C3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 30 Jan 2026 08:09:49 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3FBD261FC9;\n\tFri, 30 Jan 2026 09:09:49 +0100 (CET)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E1C361FA0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 30 Jan 2026 09:09:48 +0100 (CET)",
            "from neptunite.hamster-moth.ts.net (unknown\n\t[IPv6:2404:7a81:160:2100:ec11:5e0c:deb8:1e2d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D45B355C;\n\tFri, 30 Jan 2026 09:09:07 +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=\"Cr/Yc1KX\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1769760550;\n\tbh=ZWVV3TbQRtqx5IiHZ/snuWignbbkoqLQ+LoXWUonhYw=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=Cr/Yc1KXS7fArhHWWA2ctYTAcUpUCLuclE74k9pR/cCSE6KsEZxYCCzGcEvuO98Tu\n\tXKRKCreI7Cx2J8v5fBfGxUXOBW7FYb2FXdR2pRb/+qqFLL0AnYp2Vfj9vqb3hh9j78\n\tr28gvltb6wtcWfTAbbaiCv1i94XOoMUZuelrkUZM=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Paul Elder <paul.elder@ideasonboard.com>, david.plowman@raspberrypi.com, \n\tnaush@raspberrypi.com, kieran.bingham@ideasonboard.com,\n\tstefan.klug@ideasonboard.com",
        "Subject": "[PATCH v2 0/4] Add Sync Layer",
        "Date": "Fri, 30 Jan 2026 17:09:31 +0900",
        "Message-ID": "<20260130080935.2569621-1-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.47.2",
        "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": "This series depends on:\n- v6 of \"Add Layers support\" [0]\n(and optionally \"libcamera: layer_manager: Add support for global\nconfiguration\" [1])\n\nThere is a branch available at [2]. There is another version of the\nbranch available at [3], which is the same branch rebased on top of\nRaspberry Pi's next [4] branch with an additional patch [5] on top to\nmake Raspberry Pi use the Sync Layer instead of RPiSync.\n\nThis patch series adds a layer implementation of the Sync algorithm,\nwhere any number of cameras can synchronize the timing of their\ncaptures. This allows any camera to use the Sync algorithm, as long as\nit implements the SyncAdjustment control and SensorTimestamp.\n\nI tested this on a pi5 (with an imx219 and imx708) and a Debix SOM (with\nan imx335 and imx283) with the following capture scripts, running the\nclient first before running the server in separate terminals:\n\n$ cat cscript-sync-client.yaml \nframes:\n  - 1:\n      FrameDurationLimits: [33333, 33333]\n      SyncMode: 2\n\n$ cat cscript-sync-server.yaml \nframes:\n  - 1:\n      FrameDurationLimits: [33333, 33333]\n      SyncMode: 1\n\nThe below information is also available in the PR at [6] for ease of\naccess.\n\nI ran:\n\n- pi5 with pure rpi/next (RPiSync) [7]\n- pi5 with this branch (epaul/dev/sync on top of rpi/next) (SyncLayer) [8]\n- som with pure epaul/dev/sync (SyncLayer) [9]\n\nAnd I logged the correction time over a single run each of about 10\nminutes at 30fps (aiming for 800 corrections).\n\nHere are the descriptive statistics for the correction values (all in\nmicroseconds):\n\n- pi5 with RPiSync\n    Min. 1st Qu. Median Mean 3rd Qu. Max.\n    238.0 247.0 252.0 251.9 257.0 263.0\n\n- pi5 with SyncLayer\n    Min. 1st Qu. Median Mean 3rd Qu. Max.\n    239.0 247.0 252.0 251.9 257.0 263.0\n\n- som with SyncLayer\n    Min. 1st Qu. Median Mean 3rd Qu. Max.\n    -16661 1273 7705 4386 11616 16643\n\nI have graphs of these runs here [10].\n\nThe som could use some optimization, but we can see that on the pi5 the\ncorrection times between RPiSync and SyncLayer are nearly identical.\n\n[0] https://patchwork.libcamera.org/project/libcamera/list/?series=5753\n[1] https://patchwork.libcamera.org/project/libcamera/list/?series=5758\n[2] https://git.ideasonboard.com/epaul/libcamera/src/branch/epaul/dev/sync\n[3] https://git.ideasonboard.com/epaul/libcamera/src/branch/epaul/dev/sync-pi5\n[4] https://github.com/raspberrypi/libcamera/tree/next\n[5] https://git.ideasonboard.com/epaul/libcamera/commit/4c480e1ec43ec3d698a19f444c8994f03b3ed5d6\n[6] https://git.ideasonboard.com/epaul/libcamera/pulls/2\n[7] https://git.ideasonboard.com/epaul/libcamera/commit/f0e40f1c\n[8] https://git.ideasonboard.com/epaul/libcamera/commit/4c480e1e\n[9] https://git.ideasonboard.com/epaul/libcamera/commit/0427d359\n[10] https://git.ideasonboard.com/epaul/libcamera/pulls/2#issuecomment-26463\n\nPaul Elder (4):\n  controls: Add SyncAdjustment and SyncInterface controls\n  layer: Add layer that implements the sync algorithm\n  libipa: Add SyncHelper\n  ipa: rkisp1: agc: Add support for sync\n\n src/ipa/libipa/meson.build          |   2 +\n src/ipa/libipa/sync_helper.cpp      |  88 ++++++\n src/ipa/libipa/sync_helper.h        |  43 +++\n src/ipa/rkisp1/algorithms/agc.cpp   |  22 +-\n src/ipa/rkisp1/algorithms/agc.h     |   3 +\n src/ipa/rkisp1/ipa_context.h        |   1 +\n src/layer/meson.build               |   1 +\n src/layer/sync/meson.build          |  15 +\n src/layer/sync/sync.cpp             | 463 ++++++++++++++++++++++++++++\n src/layer/sync/sync.h               |  98 ++++++\n src/libcamera/control_ids_core.yaml |  23 ++\n 11 files changed, 758 insertions(+), 1 deletion(-)\n create mode 100644 src/ipa/libipa/sync_helper.cpp\n create mode 100644 src/ipa/libipa/sync_helper.h\n create mode 100644 src/layer/sync/meson.build\n create mode 100644 src/layer/sync/sync.cpp\n create mode 100644 src/layer/sync/sync.h"
}