Patch Detail
Show a patch.
GET /api/1.1/patches/14613/?format=api
{ "id": 14613, "url": "https://patchwork.libcamera.org/api/1.1/patches/14613/?format=api", "web_url": "https://patchwork.libcamera.org/patch/14613/", "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": "<20211115161205.24335-8-david.plowman@raspberrypi.com>", "date": "2021-11-15T16:12:05", "name": "[libcamera-devel,v5,7/7] libcamera: pipeline: raspberrypi: Support color spaces", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "8175190bc270caab83300662d1d3148d4cdab013", "submitter": { "id": 42, "url": "https://patchwork.libcamera.org/api/1.1/people/42/?format=api", "name": "David Plowman", "email": "david.plowman@raspberrypi.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/14613/mbox/", "series": [ { "id": 2719, "url": "https://patchwork.libcamera.org/api/1.1/series/2719/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2719", "date": "2021-11-15T16:11:58", "name": "Colour spaces", "version": 5, "mbox": "https://patchwork.libcamera.org/series/2719/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/14613/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/14613/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 7267BBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 15 Nov 2021 16:13:11 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0F50C603EE;\n\tMon, 15 Nov 2021 17:13:11 +0100 (CET)", "from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com\n\t[IPv6:2a00:1450:4864:20::32c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DE06D603BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 15 Nov 2021 17:13:02 +0100 (CET)", "by mail-wm1-x32c.google.com with SMTP id o29so14465858wms.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 15 Nov 2021 08:13:02 -0800 (PST)", "from pi4-davidp.pitowers.org\n\t([2a00:1098:3142:14:1ce1:9965:4328:89c4])\n\tby smtp.gmail.com with ESMTPSA id\n\tj40sm16315615wms.16.2021.11.15.08.13.02\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 15 Nov 2021 08:13:02 -0800 (PST)" ], "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=raspberrypi.com header.i=@raspberrypi.com\n\theader.b=\"pkafFUku\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=MWi8mj5S4W6cGhtr7B2BNpqXeeXBc2vqiVreCzJ+MGg=;\n\tb=pkafFUkuNsZmry6XV2Z3L1635rN0NUm46EEalWr8Y4ft1buSpHbllgzIv/HpD3O8YL\n\tc519zKZaSlJHMuMIkoFw3OOO3Ky+wRpY8gJUUq1DxjNvVq2LJV/N48jiTmqy8pU8wv9I\n\tTzTpIf6iZoiWDVvGIFq7YuxTBS3G1TL5dlDi44WFtENXDsQEGvwzIrnaZoAThTSIm61X\n\tKBmuBJwgcl0rcnoKZUZ+/u67XOmDQ3ibUsj+vw+0A0s+C4QPtS17nDP4MIFmEodWfNCw\n\tpJ1uIhdPYCQCIKsE/jl/63Okv9KxrwCHVXZasR3rdwsZuHAwmJaNJVU06enapOgrh8l1\n\tAEbQ==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20210112;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=MWi8mj5S4W6cGhtr7B2BNpqXeeXBc2vqiVreCzJ+MGg=;\n\tb=5suObWhDYUlYq2/Es69cVpnsgeVCd63mZP3JJyxGNggwc+oMHNx9+pPU834lZrArns\n\t9wLyEq8MJ9554rG3tduk22ZxI83XhCUC15RKAUq50fnKMMKxJk8cOGV3Q1xfo7BpRzQg\n\tGS1X6Xec8gWeKnLYzjQlc+/dEfd/AJuQEnAB5iMrCzRdkoGmzE057zjXbeX6RBVjHvSk\n\t+aKVsPBYGr3PK/cPRPAoceMeNbzyETwJan8IcUfjOfBWof33eHTHuQ7Oyt7BKUjEMi7Z\n\t7QNp1B0MhDnPshvFOZOjSJqoDTunARG2uketpSKYRXharw+9T4Az06eXv7UCR9eKLNyf\n\tB1oQ==", "X-Gm-Message-State": "AOAM530zFq3hlZ4AzMge34q1mwVCD9rjfebOAXrkxw7KIfBYWmB1JRnN\n\tyZ20d/VU22pw2dCRQYMWbZJZhQuNuoQZEilg", "X-Google-Smtp-Source": "ABdhPJwOwf5AXDcB5BwQalHOCOiBNJBq3ftV4r+n3CsV9NpA6zPVut7C2g5Cf66XJDvKZZro+4QMwA==", "X-Received": "by 2002:a1c:cc09:: with SMTP id\n\th9mr45736360wmb.191.1636992782633; \n\tMon, 15 Nov 2021 08:13:02 -0800 (PST)", "From": "David Plowman <david.plowman@raspberrypi.com>", "To": "hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com,\n\tkieran.bingham@ideasonboard.com, jacopo@jmondi.org, tfiga@google.com, \n\tnaush@raspberrypi.com, libcamera-devel@lists.libcamera.org", "Date": "Mon, 15 Nov 2021 16:12:05 +0000", "Message-Id": "<20211115161205.24335-8-david.plowman@raspberrypi.com>", "X-Mailer": "git-send-email 2.20.1", "In-Reply-To": "<20211115161205.24335-1-david.plowman@raspberrypi.com>", "References": "<20211115161205.24335-1-david.plowman@raspberrypi.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v5 7/7] libcamera: pipeline: raspberrypi:\n\tSupport color spaces", "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": "The Raspberry Pi pipeline handler now sets color spaces correctly.\n\nIn generateConfiguration() it sets them to reasonable default values\nbased on the stream role.\n\nvalidate() now calls validateColorSpaces() to ensure that the\nrequested color spaces are sensible, before proceeding to check what\nthe hardware can deliver.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n---\n .../pipeline/raspberrypi/raspberrypi.cpp | 42 +++++++++++++++++++\n 1 file changed, 42 insertions(+)", "diff": "diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex 5e1f2273..bbb21e9b 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -93,6 +93,7 @@ V4L2DeviceFormat toV4L2DeviceFormat(const V4L2SubdeviceFormat &format,\n \n \tdeviceFormat.fourcc = V4L2PixelFormat::fromPixelFormat(pix);\n \tdeviceFormat.size = format.size;\n+\tdeviceFormat.colorSpace = format.colorSpace;\n \treturn deviceFormat;\n }\n \n@@ -126,6 +127,7 @@ V4L2SubdeviceFormat findBestFormat(const SensorFormats &formatsMap, const Size &\n {\n \tdouble bestScore = std::numeric_limits<double>::max(), score;\n \tV4L2SubdeviceFormat bestFormat;\n+\tbestFormat.colorSpace = ColorSpace::Raw;\n \n #define PENALTY_AR\t\t1500.0\n #define PENALTY_8BIT\t\t2000.0\n@@ -332,6 +334,8 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n \tif (config_.empty())\n \t\treturn Invalid;\n \n+\tstatus = validateColorSpaces(true);\n+\n \t/*\n \t * What if the platform has a non-90 degree rotation? We can't even\n \t * \"adjust\" the configuration and carry on. Alternatively, raising an\n@@ -494,10 +498,21 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()\n \t\tV4L2DeviceFormat format;\n \t\tformat.fourcc = V4L2PixelFormat::fromPixelFormat(cfg.pixelFormat);\n \t\tformat.size = cfg.size;\n+\t\tformat.colorSpace = cfg.requestedColorSpace;\n+\t\tLOG(RPI, Debug)\n+\t\t\t<< \"Try color space \" << cfg.requestedColorSpace.toString();\n \n \t\tint ret = dev->tryFormat(&format);\n \t\tif (ret)\n \t\t\treturn Invalid;\n+\t\tcfg.actualColorSpace = format.colorSpace;\n+\t\tif (cfg.actualColorSpace != cfg.requestedColorSpace) {\n+\t\t\tstatus = Adjusted;\n+\t\t\tLOG(RPI, Warning)\n+\t\t\t\t<< \"Color space changed from \"\n+\t\t\t\t<< cfg.requestedColorSpace.toString() << \" to \"\n+\t\t\t\t<< cfg.actualColorSpace.toString();\n+\t\t}\n \n \t\tcfg.stride = format.planes[0].bpl;\n \t\tcfg.frameSize = format.planes[0].size;\n@@ -522,6 +537,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \tPixelFormat pixelFormat;\n \tV4L2VideoDevice::Formats fmts;\n \tSize size;\n+\tColorSpace colorSpace;\n \n \tif (roles.empty())\n \t\treturn config;\n@@ -536,6 +552,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tpixelFormat = mbusCodeToPixelFormat(sensorFormat.mbus_code,\n \t\t\t\t\t\t\t BayerFormat::Packing::CSI2);\n \t\t\tASSERT(pixelFormat.isValid());\n+\t\t\tcolorSpace = ColorSpace::Raw;\n \t\t\tbufferCount = 2;\n \t\t\trawCount++;\n \t\t\tbreak;\n@@ -543,6 +560,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\tcase StreamRole::StillCapture:\n \t\t\tfmts = data->isp_[Isp::Output0].dev()->formats();\n \t\t\tpixelFormat = formats::NV12;\n+\t\t\tcolorSpace = ColorSpace::Jpeg;\n \t\t\t/* Return the largest sensor resolution. */\n \t\t\tsize = data->sensor_->resolution();\n \t\t\tbufferCount = 1;\n@@ -560,6 +578,8 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\t */\n \t\t\tfmts = data->isp_[Isp::Output0].dev()->formats();\n \t\t\tpixelFormat = formats::YUV420;\n+\t\t\t/* This will be reasonable for many applications. */\n+\t\t\tcolorSpace = ColorSpace::Rec709;\n \t\t\tsize = { 1920, 1080 };\n \t\t\tbufferCount = 4;\n \t\t\toutCount++;\n@@ -568,6 +588,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\tcase StreamRole::Viewfinder:\n \t\t\tfmts = data->isp_[Isp::Output0].dev()->formats();\n \t\t\tpixelFormat = formats::ARGB8888;\n+\t\t\tcolorSpace = ColorSpace::Jpeg;\n \t\t\tsize = { 800, 600 };\n \t\t\tbufferCount = 4;\n \t\t\toutCount++;\n@@ -599,6 +620,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\tStreamConfiguration cfg(formats);\n \t\tcfg.size = size;\n \t\tcfg.pixelFormat = pixelFormat;\n+\t\tcfg.requestedColorSpace = colorSpace;\n \t\tcfg.bufferCount = bufferCount;\n \t\tconfig->addConfiguration(cfg);\n \t}\n@@ -703,6 +725,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n \t\tV4L2PixelFormat fourcc = V4L2PixelFormat::fromPixelFormat(cfg.pixelFormat);\n \t\tformat.size = cfg.size;\n \t\tformat.fourcc = fourcc;\n+\t\tformat.colorSpace = cfg.requestedColorSpace;\n \n \t\tLOG(RPI, Debug) << \"Setting \" << stream->name() << \" to \"\n \t\t\t\t<< format.toString();\n@@ -718,6 +741,23 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n \t\t\treturn -EINVAL;\n \t\t}\n \n+\t\tif (cfg.actualColorSpace != format.colorSpace) {\n+\t\t\t/*\n+\t\t\t * We should have been through validate() before so this\n+\t\t\t * shouldn't be possible, but we mustn't sweep color space\n+\t\t\t * problems under the carpet.\n+\t\t\t */\n+\t\t\tLOG(RPI, Warning)\n+\t\t\t\t<< \"Unexpected color space change (\"\n+\t\t\t\t<< cfg.actualColorSpace.toString() << \" to \"\n+\t\t\t\t<< format.colorSpace.toString() << \") in stream \"\n+\t\t\t\t<< stream->name();\n+\t\t\tcfg.actualColorSpace = format.colorSpace;\n+\t\t}\n+\t\tLOG(RPI, Debug)\n+\t\t\t<< \"Stream \" << stream->name() << \" has color space \"\n+\t\t\t<< cfg.actualColorSpace.toString();\n+\n \t\tcfg.setStream(stream);\n \t\tstream->setExternal(true);\n \n@@ -742,6 +782,8 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n \t\tformat = {};\n \t\tformat.size = maxSize;\n \t\tformat.fourcc = V4L2PixelFormat::fromPixelFormat(formats::YUV420);\n+\t\t/* No one asked for output, so the color space doesn't matter. */\n+\t\tformat.colorSpace = ColorSpace::Jpeg;\n \t\tret = data->isp_[Isp::Output0].dev()->setFormat(&format);\n \t\tif (ret) {\n \t\t\tLOG(RPI, Error)\n", "prefixes": [ "libcamera-devel", "v5", "7/7" ] }