Show a patch.

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

{
    "id": 17379,
    "url": "https://patchwork.libcamera.org/api/patches/17379/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/17379/",
    "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": "<20220919025709.34528-2-rishikeshdonadkar@gmail.com>",
    "date": "2022-09-19T02:57:09",
    "name": "[libcamera-devel,v6,1/1] gstreamer: Provide multiple colorimetry support for libcamerasrc",
    "commit_ref": null,
    "pull_url": null,
    "state": "not-applicable",
    "archived": false,
    "hash": "9b33ed4f184ce2ce12a58742caf300cfc8d4838f",
    "submitter": {
        "id": 118,
        "url": "https://patchwork.libcamera.org/api/people/118/?format=api",
        "name": "Rishikesh Donadkar",
        "email": "rishikeshdonadkar@gmail.com"
    },
    "delegate": {
        "id": 12,
        "url": "https://patchwork.libcamera.org/api/users/12/?format=api",
        "username": "uajain",
        "first_name": "Umang",
        "last_name": "Jain",
        "email": "umang.jain@ideasonboard.com"
    },
    "mbox": "https://patchwork.libcamera.org/patch/17379/mbox/",
    "series": [
        {
            "id": 3490,
            "url": "https://patchwork.libcamera.org/api/series/3490/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3490",
            "date": "2022-09-19T02:57:08",
            "name": "Provide multiple colorimetry for libcamerasrc.",
            "version": 6,
            "mbox": "https://patchwork.libcamera.org/series/3490/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/17379/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/17379/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 1C1C4C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 19 Sep 2022 02:57:33 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id D79DC62191;\n\tMon, 19 Sep 2022 04:57:32 +0200 (CEST)",
            "from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com\n\t[IPv6:2607:f8b0:4864:20::1031])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B98C26218A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 19 Sep 2022 04:57:31 +0200 (CEST)",
            "by mail-pj1-x1031.google.com with SMTP id fs14so26431524pjb.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 18 Sep 2022 19:57:31 -0700 (PDT)",
            "from localhost.localdomain ([49.36.97.74])\n\tby smtp.googlemail.com with ESMTPSA id\n\ta3-20020a656403000000b0042b291a89bfsm17303922pgv.11.2022.09.18.19.57.27\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 18 Sep 2022 19:57:29 -0700 (PDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1663556252;\n\tbh=ZDMbdykIvGeRwtJ/q5oqXpcMj4gGgSxe0VEhTKQ0YW4=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=0Nr4qk05jSyAS0XqIjKmRwNCJPJzirum3NbiL3kZwC05lwFQO6gQQHGzcDGcf30em\n\tN2lcPO88nKeWhn1Op3CADTCbiG/M4/z1ME6YHwTyHm/eq74A96hcgixz4HMyFW6Z0O\n\tAXwNtQTH+ZFng8INh1j3lpdeswTvZm0NALllehlTnV9+HDhcYGujXDfaPnLxPJgRqb\n\tR+uDpIsUEDy+iMhEyOB5twy4LV2cZEI6fwqnNc66bB9OimVSUbXwNHK3I7n1vku+2T\n\t2yRo0Jf0JrTmph3PRqg/guomVyfSYotW24592Y8XbHXeD0MAGjaC+Y2wdnWlHqJuzg\n\tFxB3e8RuwaVBw==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:from:to:cc:subject:date;\n\tbh=ReFAL9IdGX6D2qk/YUzwcdCVilF9NS71DQzJCDoUc+Q=;\n\tb=PckKWg1xYcmqjnYe16R64bGjuRkkAwVSRhBEK9a5O/VU5XpB7pLLjkgjwD1xZ9DaeP\n\tqfSqzBJ2x9WrDJN5c0FvkH/BlqH+H3FuMmCqem64fi9Ttgl0UopsEsVZgWevKUKOiId5\n\t2Tb1V76ApjZobyB/M5VWAXMolj63XnV/U8tVpcmYo6Y+10iOq/+2PapCXk5dwMBnQzjS\n\ts+QW8A0MNbU6Pv25TCbq2CsF0+VHWXXw62AkVbQSiH1x56TPog/qBd+YMui4KytoWnjc\n\tF3/w/ePBpEx9fEiC+fyGwEXT4yDI3VW+tuEFY7LIuUeDAcOfaQuM+UybB6haq+e83G4M\n\tdZ1w=="
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"PckKWg1x\"; dkim-atps=neutral",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n\t:subject:date;\n\tbh=ReFAL9IdGX6D2qk/YUzwcdCVilF9NS71DQzJCDoUc+Q=;\n\tb=7hnQpw9dWOp82WG9EID3KzY6/7FGGE1JoeI3csmsuj8hKvYPHOT46Vr9FifHAVE4fd\n\tm8jqFe6kB3kWnuN2vtWmQ07TwpueBHhDNhe14VBKmQTC5PIUaeZJFmhb+z1vyigYs1cD\n\tJat0H8m36hncFlQDCoeWo8lqMJpeOiVC6nd2+FnX+ZTPoOPXCEDONWSI9vYpzwI76VkA\n\tr5u6Uib0W+UpPGY8vKIHj8WReQFv/DK51FLYkf7DQ3t5Y6lyxbYQzBFi+bU+BA0Prbny\n\t6xA4XyvzsfqcJ54PVfT+SdUWmpM6Hte/ox0Kbu9XTBsgDtX/oXS0xBdsjzHBQZTBDQxN\n\tTkaQ==",
        "X-Gm-Message-State": "ACrzQf2qO7WLw42VmD+8Zm3y5gg9bZnCsvEwnD3vNMDFDnUylvvbzei7\n\tdHRsCKZZ23+ZggDyGFR5VQMluZ76cSc=",
        "X-Google-Smtp-Source": "AMsMyM4MQiqWlbbEC6mjiD4NaJCXgDad2WOFA5Vrox351xEurA1WJMCusvP4DD2cK/GaVXaQPsDfVw==",
        "X-Received": "by 2002:a17:902:d490:b0:177:fc1d:6b0c with SMTP id\n\tc16-20020a170902d49000b00177fc1d6b0cmr10903877plg.28.1663556249963; \n\tSun, 18 Sep 2022 19:57:29 -0700 (PDT)",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Mon, 19 Sep 2022 08:27:09 +0530",
        "Message-Id": "<20220919025709.34528-2-rishikeshdonadkar@gmail.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20220919025709.34528-1-rishikeshdonadkar@gmail.com>",
        "References": "<20220919025709.34528-1-rishikeshdonadkar@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v6 1/1] gstreamer: Provide multiple\n\tcolorimetry support for libcamerasrc",
        "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>",
        "From": "Rishikesh Donadkar via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>",
        "Reply-To": "Rishikesh Donadkar <rishikeshdonadkar@gmail.com>",
        "Cc": "nicolas.dufresne@collabora.com, vedantparanjape160201@gmail.com",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Iterate over each GValue in the colorimetry list,\nretrieve the colorimetry string, convert to colorspace,\nset the colorspace in the  stream_cfg and validate the camera configuration.\nRetrieve the colorspace after validation, convert to colorimetry and\ncheck if it is same as the colorimetry requested.\n\nIf none of the colorimetry requested is supported by the camera (i.e. not\nthe same after validation) then set the stream_cfg to the previous\nconfiguration that was present before trying new colorimetry.\n\nSigned-off-by: Rishikesh Donadkar <rishikeshdonadkar@gmail.com>\nReviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 49 +++++++++++++++++++++++-----\n src/gstreamer/gstlibcamera-utils.h   |  4 ++-\n src/gstreamer/gstlibcamerasrc.cpp    |  2 +-\n 3 files changed, 44 insertions(+), 11 deletions(-)",
    "diff": "diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex 244a4a79..f73b6349 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -316,9 +316,9 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n \treturn caps;\n }\n \n-void\n-gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n-\t\t\t\t\t GstCaps *caps)\n+void gst_libcamera_configure_stream_from_caps(std::unique_ptr<CameraConfiguration> &cam_cfg,\n+\t\t\t\t\t      StreamConfiguration &stream_cfg,\n+\t\t\t\t\t      GstCaps *caps)\n {\n \tGstVideoFormat gst_format = pixel_format_to_gst_format(stream_cfg.pixelFormat);\n \tguint i;\n@@ -395,15 +395,46 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n \tstream_cfg.size.width = width;\n \tstream_cfg.size.height = height;\n \n-\t/* Configure colorimetry */\n-\tif (gst_structure_has_field(s, \"colorimetry\")) {\n-\t\tconst gchar *colorimetry_str = gst_structure_get_string(s, \"colorimetry\");\n-\t\tGstVideoColorimetry colorimetry;\n+\tconst GValue *colorimetry_ = gst_structure_get_value(s, \"colorimetry\");\n+\tif (!colorimetry_)\n+\t\treturn;\n \n-\t\tif (!gst_video_colorimetry_from_string(&colorimetry, colorimetry_str))\n-\t\t\tg_critical(\"Invalid colorimetry %s\", colorimetry_str);\n+\t/* Configure Colorimetry */\n+\tGstVideoColorimetry colorimetry;\n+\tif (GST_VALUE_HOLDS_LIST(colorimetry_)) {\n+\t\tStreamConfiguration pristine_stream_cfg = stream_cfg;\n+\t\tfor (i = 0; i < gst_value_list_get_size(colorimetry_); i++) {\n+\t\t\tconst GValue *val = gst_value_list_get_value(colorimetry_, i);\n+\n+\t\t\tif (!gst_video_colorimetry_from_string(&colorimetry, g_value_get_string(val))) {\n+\t\t\t\tg_warning(\"Invalid colorimetry %s, trying next option\", g_value_get_string(val));\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\n+\t\t\tstd::optional<ColorSpace> clrSpace = colorspace_from_colorimetry(colorimetry);\n+\t\t\tstream_cfg.colorSpace = clrSpace;\n+\n+\t\t\t/* Validate the configuration and check if the requested\n+\t\t\t * colorimetry can be applied to the sensor. Otherwise,\n+\t\t\t * restore the configuration back to pristine one.\n+\t\t\t */\n+\t\t\tif (cam_cfg->validate() != CameraConfiguration::Invalid) {\n+\t\t\t\t/* Check the colorspace returned after validation, with the colorspace before validation */\n+\t\t\t\tif (stream_cfg.colorSpace == clrSpace) {\n+\t\t\t\t\tg_print(\"Selected colorimetry %s\\n\", gst_video_colorimetry_to_string(&colorimetry));\n+\t\t\t\t\tbreak;\n+\t\t\t\t} else {\n+\t\t\t\t\tstream_cfg = pristine_stream_cfg;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t} else if (G_VALUE_HOLDS_STRING(colorimetry_)) {\n+\t\tif (!gst_video_colorimetry_from_string(&colorimetry, g_value_get_string(colorimetry_)))\n+\t\t\tg_critical(\"Invalid colorimetry %s\", g_value_get_string(colorimetry_));\n \n \t\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry);\n+\t} else {\n+\t\tGST_WARNING(\"colorimetry field type should only be string or list.\");\n \t}\n }\n \ndiff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\nindex 164189a2..7afad576 100644\n--- a/src/gstreamer/gstlibcamera-utils.h\n+++ b/src/gstreamer/gstlibcamera-utils.h\n@@ -8,6 +8,7 @@\n \n #pragma once\n \n+#include <libcamera/camera.h>\n #include <libcamera/camera_manager.h>\n #include <libcamera/stream.h>\n \n@@ -16,7 +17,8 @@\n \n GstCaps *gst_libcamera_stream_formats_to_caps(const libcamera::StreamFormats &formats);\n GstCaps *gst_libcamera_stream_configuration_to_caps(const libcamera::StreamConfiguration &stream_cfg);\n-void gst_libcamera_configure_stream_from_caps(libcamera::StreamConfiguration &stream_cfg,\n+void gst_libcamera_configure_stream_from_caps(std::unique_ptr<libcamera::CameraConfiguration> &cam_cfg,\n+\t\t\t\t\t      libcamera::StreamConfiguration &stream_cfg,\n \t\t\t\t\t      GstCaps *caps);\n #if !GST_CHECK_VERSION(1, 17, 1)\n gboolean gst_task_resume(GstTask *task);\ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 16d70fea..25059914 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -503,7 +503,7 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread,\n \n \t\t/* Fixate caps and configure the stream. */\n \t\tcaps = gst_caps_make_writable(caps);\n-\t\tgst_libcamera_configure_stream_from_caps(stream_cfg, caps);\n+\t\tgst_libcamera_configure_stream_from_caps(state->config_, stream_cfg, caps);\n \t}\n \n \tif (flow_ret != GST_FLOW_OK)\n",
    "prefixes": [
        "libcamera-devel",
        "v6",
        "1/1"
    ]
}