Patch Detail
Show a patch.
GET /api/patches/8478/?format=api
{ "id": 8478, "url": "https://patchwork.libcamera.org/api/patches/8478/?format=api", "web_url": "https://patchwork.libcamera.org/patch/8478/", "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": "<20200628161723.30625-2-jacopo@jmondi.org>", "date": "2020-06-28T16:17:21", "name": "[libcamera-devel,1/3] libcamera: raspberrypi: Refuse invalid roles configuration", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "391788cb8aa6ffe62a95852ad84fb82d1d3be998", "submitter": { "id": 3, "url": "https://patchwork.libcamera.org/api/people/3/?format=api", "name": "Jacopo Mondi", "email": "jacopo@jmondi.org" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/8478/mbox/", "series": [ { "id": 1052, "url": "https://patchwork.libcamera.org/api/series/1052/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1052", "date": "2020-06-28T16:17:20", "name": "libcamera: pipeline handlers: Fail if roles are not supported", "version": 1, "mbox": "https://patchwork.libcamera.org/series/1052/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/8478/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/8478/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 3F1FEC2E66\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 28 Jun 2020 16:14:00 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1A2AB60AF2;\n\tSun, 28 Jun 2020 18:14:00 +0200 (CEST)", "from relay11.mail.gandi.net (relay11.mail.gandi.net\n\t[217.70.178.231])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 200B0609C7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 28 Jun 2020 18:13:58 +0200 (CEST)", "from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay11.mail.gandi.net (Postfix) with ESMTPSA id 8BD3C100011;\n\tSun, 28 Jun 2020 16:13:57 +0000 (UTC)" ], "From": "Jacopo Mondi <jacopo@jmondi.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Sun, 28 Jun 2020 18:17:21 +0200", "Message-Id": "<20200628161723.30625-2-jacopo@jmondi.org>", "X-Mailer": "git-send-email 2.27.0", "In-Reply-To": "<20200628161723.30625-1-jacopo@jmondi.org>", "References": "<20200628161723.30625-1-jacopo@jmondi.org>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH 1/3] libcamera: raspberrypi: Refuse\n\tinvalid roles configuration", "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>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "The generateConfiguration() implementation does not check if the\nrequested list of roles can actually be satisfied. The camera API\ndocumentation prescribes the function shall fail in that case, instead\nof silently adjust the returned confiuguration.\n\nFix this by implementing the same logic as the validate() function\nimplements, as the pipeline handler supports one raw stream and up to\ntwo output streams.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 11 +++++++++++\n 1 file changed, 11 insertions(+)", "diff": "diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex dcd737a1d1a0..d1338b640e3c 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -526,6 +526,8 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \tif (roles.empty())\n \t\treturn config;\n \n+\tunsigned int rawCount = 0;\n+\tunsigned int outCount = 0;\n \tfor (const StreamRole role : roles) {\n \t\tswitch (role) {\n \t\tcase StreamRole::StillCaptureRaw:\n@@ -535,6 +537,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tpixelFormat = sensorFormat.fourcc.toPixelFormat();\n \t\t\tASSERT(pixelFormat.isValid());\n \t\t\tbufferCount = 1;\n+\t\t\trawCount++;\n \t\t\tbreak;\n \n \t\tcase StreamRole::StillCapture:\n@@ -543,6 +546,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\t/* Return the largest sensor resolution. */\n \t\t\tsize = data->sensor_->resolution();\n \t\t\tbufferCount = 1;\n+\t\t\toutCount++;\n \t\t\tbreak;\n \n \t\tcase StreamRole::VideoRecording:\n@@ -550,6 +554,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tpixelFormat = formats::NV12;\n \t\t\tsize = { 1920, 1080 };\n \t\t\tbufferCount = 4;\n+\t\t\toutCount++;\n \t\t\tbreak;\n \n \t\tcase StreamRole::Viewfinder:\n@@ -557,6 +562,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tpixelFormat = formats::ARGB8888;\n \t\t\tsize = { 800, 600 };\n \t\t\tbufferCount = 4;\n+\t\t\toutCount++;\n \t\t\tbreak;\n \n \t\tdefault:\n@@ -565,6 +571,11 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tbreak;\n \t\t}\n \n+\t\tif (rawCount > 1 || outCount > 2) {\n+\t\t\tdelete config;\n+\t\t\treturn nullptr;\n+\t\t}\n+\n \t\t/* Translate the V4L2PixelFormat to PixelFormat. */\n \t\tstd::map<PixelFormat, std::vector<SizeRange>> deviceFormats;\n \t\tstd::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.end()),\n", "prefixes": [ "libcamera-devel", "1/3" ] }