Show a cover letter.

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

{
    "id": 23341,
    "url": "https://patchwork.libcamera.org/api/1.1/covers/23341/?format=api",
    "web_url": "https://patchwork.libcamera.org/cover/23341/",
    "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": "<20250507082753.2306743-1-naush@raspberrypi.com>",
    "date": "2025-05-07T07:52:07",
    "name": "[RFC,0/6] Eliminating startup frames",
    "submitter": {
        "id": 34,
        "url": "https://patchwork.libcamera.org/api/1.1/people/34/?format=api",
        "name": "Naushir Patuck",
        "email": "naush@raspberrypi.com"
    },
    "mbox": "https://patchwork.libcamera.org/cover/23341/mbox/",
    "series": [
        {
            "id": 5164,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5164/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5164",
            "date": "2025-05-07T07:52:07",
            "name": "Eliminating startup frames",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5164/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/covers/23341/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 9A52FC3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  7 May 2025 08:28:01 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E82AD68B2E;\n\tWed,  7 May 2025 10:27:59 +0200 (CEST)",
            "from mail-wm1-x329.google.com (mail-wm1-x329.google.com\n\t[IPv6:2a00:1450:4864:20::329])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 360B568AD3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  7 May 2025 10:27:57 +0200 (CEST)",
            "by mail-wm1-x329.google.com with SMTP id\n\t5b1f17b1804b1-43cee550af2so7047195e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 07 May 2025 01:27:57 -0700 (PDT)",
            "from NAUSH-P-DELL.pitowers.org ([93.93.133.154])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-441d440fff6sm22182575e9.25.2025.05.07.01.27.55\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 07 May 2025 01:27:55 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"cngenAga\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google; t=1746606476; x=1747211276;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:from:to:cc:subject:date:message-id:reply-to;\n\tbh=v/Foq4rHHSRZIsPO5URXdBlZZw4YnjS05CZfgNIOXz8=;\n\tb=cngenAgalqguFR1TxJWjm/ZA3c11SErqDzVu5naiMbvWgUgSJPgW0d4mWGLMdtiANh\n\t3kIm4XN2ViqU29643KNyL68lyoF5HYGwZrvWFVaRN+u3gse/5p0rfJrd85uPAf/ZeNIQ\n\t6vFH88zgvWQqQwefu3AJmwMuZomiBEqWluoF1BqB5608mXWA2V6mhkC92/BudVUKLS2C\n\tA+oV4yqD9n4TPSki9BdhjdmmCU2PmQ05/tqtpt40ZcSaW5xksNoOoVeKW3/XKq1vUAQH\n\tqYE/a/ynDH+7cuVBb0BaL+gGVRlpztSCeE237CxotnZt5uo/Ju0HSMxkOCVmFewsR/Bd\n\tM1ow==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1746606476; x=1747211276;\n\th=content-transfer-encoding:mime-version:message-id:date:subject:cc\n\t:to:from:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=v/Foq4rHHSRZIsPO5URXdBlZZw4YnjS05CZfgNIOXz8=;\n\tb=dRJD9nIQdHAEzifWDGDXDdpNyLL7Yni3v1utEvW4KCZ5XP1KfcmBqPRoFz7/1IGlmT\n\t9r/g4E2x/TCLQgLaV0koWfosHVZvRbQeuf+gCt7I8mB78yfUGnOW/+lfzNlboAeJajcU\n\tR2A/agYzoRWfmIVmVc7PB30fdi5M/IM2MoCcJwGdXyQlB6tGfnBPZ1yXjGtZk7fqH7d/\n\tlS4UhRN/sgpxZxS6UbfJJ3WTKa4DubCE4wFRUiHETOMZ9hO44wQNOAJq147l+8eRLpWa\n\tqhv8irHUBpkPi35nFZmEAGyDiYs3bRitZ8GU7/ZF8IdaU5N8b0WNwudhaon3yIQZcap2\n\tvCAw==",
        "X-Gm-Message-State": "AOJu0YzMmEHnQ/Isrw7dUzgxNEMYh8uKvZPaXPv3VexloRlqFRO/lQrb\n\tP5YrLW8NZl6FGRVwSHNzHgRMiUJgugcXmL0kBzBlcj6DISbWjeiVuCqEF3y59A4DPEpor6y8OPh\n\tb",
        "X-Gm-Gg": "ASbGncuiJKDE/tu9jDrGTHgV5AuEsNaX6nCTmMR1/2xGIsPwOFB3FCQk5z/qHt/2RKC\n\t61FoU4Bv86tViQiEk86QRKVjzhDgHRXuxVd/IQ2PVDbkMOB+cTC5pDnmkjIa7NRhm3tWzyy/dW2\n\ttFFsbC3dY5fj+REh+qVUHhpwwFwJUYbvolkMamibv2XLuZwPKdfv+ythv56r1ZdrbQNDceec0ZE\n\t++pysySY99+XEpJgTZgWuURiNRbo1xpdxuX7wEEiVsTWEXpVruUrsknwFQjdXx5oYXMAQglVQ5+\n\txz5XkwS8rhMM4qxJXxBl8UJ97HQwnZxuN/c5vwhwGGqZELHFWCUuLZsmFU1h",
        "X-Google-Smtp-Source": "AGHT+IELZKStGDOewbMhMKQXYjEgojB3YTHEncj6bkT9hXQVpVd17G8D5h8ZPCxfXozhzI5viSbfnw==",
        "X-Received": "by 2002:a05:600c:3e18:b0:439:930a:58a6 with SMTP id\n\t5b1f17b1804b1-441d44ed3c7mr6738575e9.8.1746606475997; \n\tWed, 07 May 2025 01:27:55 -0700 (PDT)",
        "From": "Naushir Patuck <naush@raspberrypi.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Naushir Patuck <naush@raspberrypi.com>",
        "Subject": "[RFC PATCH 0/6] Eliminating startup frames",
        "Date": "Wed,  7 May 2025 08:52:07 +0100",
        "Message-ID": "<20250507082753.2306743-1-naush@raspberrypi.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "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": "Hi,\n\nFrom the earliest days, the Raspberry Pi pipeline handler had the ability for\nthe pipeline handler to drop a number of frames on startup or re-configuration.\nThis is used to hide frames that should not be consumed by application (for\nreasons discussed below).  However, this code to handle dropping frames silently\ncomplicates the pipeline handler, and more crucially requires additional buffer\nallocations that we don't really want to add for more memory-limited platforms\nsuch as the Raspberry Pi Zero. Just removing the drop frame handling from the\npipeline handler is not enough as we have to have a way to signal applications\nnot to consume these frames.\n\nThis RFC patch series removes our drop frame handling logic, but still provides\nthe user or application with the necessary metadata on whether a frame should be\nconsumed or not.\n\nThere are 2 main reasons for these frame drops on startup.  First, some sensors\nproduce complete garbage output when startup up, either on a power cycle, or\ngoing from stream-off to stream-on. These frames are completely unusable and\nshould be discarded.\n\nSecond, some IQ algorithms, e.g. AWB/AGC/ALSC, will take a finite number of\nframes to converge to a stable state and before this time the IQ will likely be\nwildly oscillating.  Note that this initial startup converging phase is quite\ndifferent from the runtime converging that can be determined by, for example the\nAeState == AeStateConverged metadata control.  The latter condition is generally\na smooth softly filtered transition whereas the former is much more aggressive\nto converge as quickly as possible. Also, an application may not know what\nalgorithms are running and need converging on startup, so they cannot rely\nsolely on these controls changing state to determine if a frame is usable.\n\nFor this RFC patch, I propose to use FrameMetadata::status for pipeline handler\nto signal either of these states, and rely on the application to drop the frames\nif it requires. Status::FrameError is overloaded to include the sensor producing\nbad frames on startup, and the new Status::FrameStartup is used to indicate the\nIQ algorithms are in a startup state.\n\nPatch 1 updates the libcamera API to add the new state, and all subsequent\npatches strip out the drop frame logic in the Raspberry Pi pipeline handler and\nIPA.\n\nAs always, thoughts and comments are welcome, either through email or perhaps\nduring our F2F next week!\n\nRegards,\nNaush\n\nNaushir Patuck (6):\n  libcamera: framebuffer: Add FrameMetadata::Status::FrameStartup\n  ipa: rpi: Replace dropFrameCount in the IPA -> PH interface\n  pipeline: ipa: rpi: Split RPiCameraData::dropFrameCount_\n  pipeline: rpi: Remove disable_startup_frame_drops config option\n  pipeline: rpi: Remove ispOutputCount_ and ispOutputTotal_\n  ipa: rpi: Rename dropFrameCount_ to startupCount_\n\n include/libcamera/framebuffer.h               |  1 +\n include/libcamera/ipa/raspberrypi.mojom       |  3 +-\n src/ipa/rpi/common/ipa_base.cpp               | 20 ++--\n src/ipa/rpi/common/ipa_base.h                 |  4 +-\n src/libcamera/framebuffer.cpp                 | 11 ++-\n .../pipeline/rpi/common/pipeline_base.cpp     | 95 ++++++++-----------\n .../pipeline/rpi/common/pipeline_base.h       | 14 +--\n .../pipeline/rpi/pisp/data/example.yaml       |  5 -\n src/libcamera/pipeline/rpi/pisp/pisp.cpp      | 12 ---\n .../pipeline/rpi/vc4/data/example.yaml        |  5 -\n src/libcamera/pipeline/rpi/vc4/vc4.cpp        | 15 ---\n 11 files changed, 66 insertions(+), 119 deletions(-)"
}