Patch Detail
Show a patch.
GET /api/1.1/patches/17174/?format=api
{ "id": 17174, "url": "https://patchwork.libcamera.org/api/1.1/patches/17174/?format=api", "web_url": "https://patchwork.libcamera.org/patch/17174/", "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": "<20220819065323.10051-2-rishikeshdonadkar@gmail.com>", "date": "2022-08-19T06:53:23", "name": "[libcamera-devel,v5,1/1] gstreamer: Provide mulitple colorimetry support", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "ea30fb1a637e0bdfcb62b9641575027c01480ea9", "submitter": { "id": 118, "url": "https://patchwork.libcamera.org/api/1.1/people/118/?format=api", "name": "Rishikesh Donadkar", "email": "rishikeshdonadkar@gmail.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/17174/mbox/", "series": [ { "id": 3427, "url": "https://patchwork.libcamera.org/api/1.1/series/3427/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3427", "date": "2022-08-19T06:53:22", "name": "Multiple colorimetry support for libcamerasrc", "version": 5, "mbox": "https://patchwork.libcamera.org/series/3427/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/17174/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/17174/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 53FBCBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 19 Aug 2022 06:53:45 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 16AFD61FC4;\n\tFri, 19 Aug 2022 08:53:45 +0200 (CEST)", "from mail-pf1-x435.google.com (mail-pf1-x435.google.com\n\t[IPv6:2607:f8b0:4864:20::435])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id ACDC3603E2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Aug 2022 08:53:43 +0200 (CEST)", "by mail-pf1-x435.google.com with SMTP id y127so595262pfy.5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 18 Aug 2022 23:53:43 -0700 (PDT)", "from localhost.localdomain ([49.36.101.190])\n\tby smtp.googlemail.com with ESMTPSA id\n\tn17-20020a170902d2d100b0016d6c939332sm2451945plc.279.2022.08.18.23.53.39\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 18 Aug 2022 23:53:41 -0700 (PDT)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1660892025;\n\tbh=uinBByPKYC7/sIpOsODtECJZOrfa/XxzAqPVTLMbL0Y=;\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=StpBhC1PBKmU3iNI8SzzzxSf9qEsij/1lWaX/3MLXuDszwp5g5b7faoE01er0eYmZ\n\tm3MSWfHwKZtjrw6v0wi/XJ61ec5BCZl38D9eQm0A1FThHb82Vds2BwzJ46gbruxQbx\n\tRdgxREoIe7PmXxaoJP6iypY5viDV1p+gyPf9w7VQxKJE1dtXKzgGC+BO0C0KY/a8mK\n\t3+/U8V2ZpIRQuCy88t4Qc9FcsZOwo20gbG44jx/q61y74GaezuTrjqlhiG2+N4nfcw\n\tgZKQxFGKyBArIBFC5YN+dI7rNG5+T71Fpk9NFFAhdUWoBiqnC0ub7Cn5OJAkBjt6En\n\ts7B7QrLqawM0A==", "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;\n\tbh=jmlxqwiHFTj3PvVBts++O8QHZgHqAZzRdjewWYirD+A=;\n\tb=FLGi6rYJip65h6PUCokUriaw6ZRlTHepGqGnDutms7itLBxPwI7iDXwcBrrHS8g1A/\n\tb1lapa8nBaM05ruKKlOfpJAlyC8xJnk6HD5a/W7VPG5DolRvTcotRE/6uB+a1o/E0Ihu\n\t4C89U3Ge5BVUJOVWpHfQYiREc1h3HW8UEgRiwUGMG1X/gbjnjq+9Bghor7oqhRVlvsAe\n\txiO22OmjsKB4YfP+KmlYkyY0U1WOi7gIm4o4t1eQHw8CEktqSmMCUtXkVbKj5LAWLzyQ\n\t1pqV+aNaJQ7WrY6ZMozQZBUEUcAJnyAzDrbhJDLPS0Zli0ZQLPGu4ZVYibmDEINP3Clt\n\tq+zg==" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"FLGi6rYJ\"; 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\tbh=jmlxqwiHFTj3PvVBts++O8QHZgHqAZzRdjewWYirD+A=;\n\tb=ZgUq8DD/1Q8/sdi/fRVhXRHqK7NsdEbrUmqJ3Rwv98hcJoCu5wLDy2+oTQx5nbo/lv\n\tMliooabX/V3r6XrsbU+MEt9VYiExmOucCaIKRXR+6Vird3JW0RvLgHQTAstzkjkMR6BK\n\tPE8TjB2PYrt6SfAZxotdlBKszZiy0MEnx7wOrR+YfERAeHNo8Z6JGhMkN/QHE+mnpRij\n\tmzRvsbMHxJ18jAiuZ1t0mqTrDW7kay7XTU8ET/qJR1PzYhoLF3vOoweSE0rMGfmAvbEY\n\tDt0IDowt/m7UxH2IT2lHBd/e/O3bRIQb78WX28P3jS+GLTm6tk2DG75HPUzVTXPEAiMK\n\t1fRA==", "X-Gm-Message-State": "ACgBeo3JREeq+vx3udwkhQc1qlnvwqSj18qPj28Jp5nlFso15+TkubuX\n\t8hGBoMV32of7sZS1g8B9Rp4ubj5HLLSAEg==", "X-Google-Smtp-Source": "AA6agR5vOj7SSeCig+TWsnWSjhViYWnKaMn+U1efEzsFBp1bas0PU4J5G31oHIj03iEeFjuRM6dqyA==", "X-Received": "by 2002:a65:4984:0:b0:429:b7b2:46fb with SMTP id\n\tr4-20020a654984000000b00429b7b246fbmr5315857pgs.293.1660892022103; \n\tThu, 18 Aug 2022 23:53:42 -0700 (PDT)", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 19 Aug 2022 12:23:23 +0530", "Message-Id": "<20220819065323.10051-2-rishikeshdonadkar@gmail.com>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20220819065323.10051-1-rishikeshdonadkar@gmail.com>", "References": "<20220819065323.10051-1-rishikeshdonadkar@gmail.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v5 1/1] gstreamer: Provide mulitple\n\tcolorimetry support", "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": "Rishikesh Donadkar <rishikeshdonadkar@gmail.com>,\n\tnicolas.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 using the\nfunction colorspace_from_colorimetry() and validate the camera configuration.\nRetrieve the colorspace after validation, convert to colorimetry and\ncheck if the 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>\nSigned-off-by: Umang Jain <umang.jain@ideasonboard.com>\nReviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 76 +++++++++++++++++++++-------\n src/gstreamer/gstlibcamera-utils.h | 4 +-\n src/gstreamer/gstlibcamerasrc.cpp | 2 +-\n 3 files changed, 63 insertions(+), 19 deletions(-)", "diff": "diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex d895a67d..218419fd 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -302,13 +302,38 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n \treturn caps;\n }\n \n+static gboolean\n+configure_colorspace_from_caps(StreamConfiguration &stream_cfg,\n+\t\t\t const gchar *colorimetry_str)\n+{\n+\tif (colorimetry_str) {\n+\t\tGstVideoColorimetry colorimetry;\n+\n+\t\tif (!gst_video_colorimetry_from_string(&colorimetry, colorimetry_str)) {\n+\t\t\tg_critical(\"Invalid colorimetry %s\", colorimetry_str);\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry);\n+\t\t/* Check if colorimetry had any identifiers which did not map */\n+\t\tif (colorimetry.primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN &&\n+\t\t stream_cfg.colorSpace == ColorSpace::Raw) {\n+\t\t\tGST_ERROR(\"One or more identifiers could not be mapped for %s colorimetry\",\n+\t\t\t\t colorimetry_str);\n+\t\t\tstream_cfg.colorSpace = std::nullopt;\n+\t\t}\n+\t}\n+\treturn true;\n+}\n+\n void\n-gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n+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-\tgint best_fixed = -1, best_in_range = -1;\n+\tgint best_fixed = -1, best_in_range = -1, ret;\n \tGstStructure *s;\n \n \t/*\n@@ -381,22 +406,39 @@ 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-\n-\t\tif (!gst_video_colorimetry_from_string(&colorimetry, colorimetry_str))\n-\t\t\tg_critical(\"Invalid colorimetry %s\", colorimetry_str);\n-\n-\t\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry);\n-\t\t/* Check if colorimetry had any identifiers which did not map */\n-\t\tif (colorimetry.primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN &&\n-\t\t stream_cfg.colorSpace == ColorSpace::Raw) {\n-\t\t\tGST_ERROR(\"One or more identifiers could not be mapped for %s colorimetry\",\n-\t\t\t\t colorimetry_str);\n-\t\t\tstream_cfg.colorSpace = std::nullopt;\n+\tconst GValue *colorimetry = gst_structure_get_value(s, \"colorimetry\");\n+\tif (!colorimetry)\n+\t\treturn;\n+\n+\t/* Configure 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+\t\t\tGstVideoColorimetry colorimetry_old, colorimetry_new;\n+\n+\t\t\tret = configure_colorspace_from_caps(stream_cfg, g_value_get_string(val));\n+\t\t\tif (!ret)\n+\t\t\t\tcontinue;\n+\n+\t\t\tcolorimetry_old = colorimetry_from_colorspace(stream_cfg.colorSpace.value());\n+\n+\t\t\t/* Validate the configuration and check if the requested\n+\t\t\t * colorimetry can be applied to the sensor.\n+\t\t\t */\n+\t\t\tif (cam_cfg->validate() != CameraConfiguration::Invalid) {\n+\t\t\t\tcolorimetry_new = colorimetry_from_colorspace(stream_cfg.colorSpace.value());\n+\t\t\t\tif (gst_video_colorimetry_is_equal(&colorimetry_old, &colorimetry_new)) {\n+\t\t\t\t\tg_print(\"Selected colorimetry %s\\n\", gst_video_colorimetry_to_string(&colorimetry_new));\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}\n \t\t}\n+\t} else if (G_VALUE_HOLDS_STRING(colorimetry)) {\n+\t\tconfigure_colorspace_from_caps(stream_cfg, g_value_get_string(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", "v5", "1/1" ] }