Show a patch.

GET /api/patches/20482/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 20482,
    "url": "https://patchwork.libcamera.org/api/patches/20482/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/20482/",
    "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": "<20240628104828.2928109-24-stefan.klug@ideasonboard.com>",
    "date": "2024-06-28T10:47:16",
    "name": "[v2,23/25] libtuning: Make blacklevel optional",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "fcdd2775eaa6b95c61fbc24bbf5be593877f7356",
    "submitter": {
        "id": 184,
        "url": "https://patchwork.libcamera.org/api/people/184/?format=api",
        "name": "Stefan Klug",
        "email": "stefan.klug@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/20482/mbox/",
    "series": [
        {
            "id": 4430,
            "url": "https://patchwork.libcamera.org/api/series/4430/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4430",
            "date": "2024-06-28T10:46:53",
            "name": "Add ccm calibration to libtuning",
            "version": 2,
            "mbox": "https://patchwork.libcamera.org/series/4430/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/20482/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/20482/checks/",
    "tags": {},
    "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 E68C2BD87C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 28 Jun 2024 10:49:46 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A12B463367;\n\tFri, 28 Jun 2024 12:49:46 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BC7B663362\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Jun 2024 12:49:44 +0200 (CEST)",
            "from ideasonboard.com (unknown\n\t[IPv6:2a00:6020:448c:6c00:82ab:924:d918:cd24])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 405DA735;\n\tFri, 28 Jun 2024 12:49:20 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"VKMN0pdQ\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1719571760;\n\tbh=TEeO5DWfj3x/4A/L879TfnOp/7D0yqa8qPAlDF9A3AE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=VKMN0pdQr3UVTBV8mnvnCHTGIFDD8NK1NZkGC1snFlKkwSurqDTorGP2Z1Y78vpEX\n\t4dr3dc0wDxKyn+FSEkaoiNyV6b3m7XVk3mdShSNTlLldFtNyw2eyrOVm76UZ5788Sn\n\tCoVXurmsm90ByY2KhmTnJrJfo8iUxLoL88ztcJ/o=",
        "From": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Stefan Klug <stefan.klug@ideasonboard.com>",
        "Subject": "[PATCH v2 23/25] libtuning: Make blacklevel optional",
        "Date": "Fri, 28 Jun 2024 12:47:16 +0200",
        "Message-ID": "<20240628104828.2928109-24-stefan.klug@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20240628104828.2928109-1-stefan.klug@ideasonboard.com>",
        "References": "<20240628104828.2928109-1-stefan.klug@ideasonboard.com>",
        "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": "Not every sensor provides blacklevel information through the kernel\ninterface. We should therefore not require that information to be in the\nraw images for the tuning process. It can be provided via the tuning config.\n\nSigned-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n---\n utils/tuning/libtuning/image.py | 10 ++++++++--\n 1 file changed, 8 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/utils/tuning/libtuning/image.py b/utils/tuning/libtuning/image.py\nindex c8911a0ff125..0b9c78fcd9c2 100644\n--- a/utils/tuning/libtuning/image.py\n+++ b/utils/tuning/libtuning/image.py\n@@ -25,6 +25,8 @@ class Image:\n         self.color = -1\n         self.lux = -1\n         self.macbeth = None\n+        self.blacklevel = 0\n+        self.blacklevel_16 = 0\n \n         try:\n             self._load_metadata_exif()\n@@ -74,8 +76,12 @@ class Image:\n         self.againQ8 = metadata[f'Exif.{photo}.ISOSpeedRatings'].value * 256 / 100\n         self.againQ8_norm = self.againQ8 / 256\n         self.camName = metadata['Exif.Image.Model'].value\n-        self.blacklevel = int(metadata[f'Exif.{subimage}.BlackLevel'].value[0])\n-        self.blacklevel_16 = self.blacklevel << (16 - self.sigbits)\n+        if f'Exif.{subimage}.BlackLevel' in metadata:\n+            self.blacklevel = int(metadata[f'Exif.{subimage}.BlackLevel'].value[0])\n+            self.blacklevel_16 = self.blacklevel << (16 - self.sigbits)\n+        else:\n+            logger.warning(\"Image doesn't contain blacklevel info\")\n+\n \n         # Channel order depending on bayer pattern\n         # The key is the order given by exif, where 0 is R, 1 is G, and 2 is B\n",
    "prefixes": [
        "v2",
        "23/25"
    ]
}