Patch Detail
Show a patch.
GET /api/patches/1090/?format=api
{ "id": 1090, "url": "https://patchwork.libcamera.org/api/patches/1090/?format=api", "web_url": "https://patchwork.libcamera.org/patch/1090/", "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": "<20190419132531.17856-5-jacopo@jmondi.org>", "date": "2019-04-19T13:25:27", "name": "[libcamera-devel,v8,4/8] libcamera: ipu3: Use roles in stream configuration", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "be8e1611d835be66667e54f3745891f0558e5e87", "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/1090/mbox/", "series": [ { "id": 263, "url": "https://patchwork.libcamera.org/api/series/263/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=263", "date": "2019-04-19T13:25:23", "name": "libcamera: ipu3: Multiple streams support", "version": 8, "mbox": "https://patchwork.libcamera.org/series/263/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/1090/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/1090/checks/", "tags": {}, "headers": { "Return-Path": "<jacopo@jmondi.org>", "Received": [ "from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net\n\t[217.70.183.200])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9B47260B2E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Apr 2019 15:24:46 +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 relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 315F020003;\n\tFri, 19 Apr 2019 13:24:46 +0000 (UTC)" ], "X-Originating-IP": "2.224.242.101", "From": "Jacopo Mondi <jacopo@jmondi.org>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 19 Apr 2019 15:25:27 +0200", "Message-Id": "<20190419132531.17856-5-jacopo@jmondi.org>", "X-Mailer": "git-send-email 2.21.0", "In-Reply-To": "<20190419132531.17856-1-jacopo@jmondi.org>", "References": "<20190419132531.17856-1-jacopo@jmondi.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v8 4/8] libcamera: ipu3: Use roles in\n\tstream configuration", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.23", "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>", "X-List-Received-Date": "Fri, 19 Apr 2019 13:24:47 -0000" }, "content": "Use and inspect the stream roles provided by the application to\nstreamConfiguration() to assign streams to their intended roles and\nreturn a default configuration associated with them.\n\nSupport a limited number of usages, with the viewfinder stream able to\ncapture both continuous video streams and still images, and the main\noutput stream supporting still images only. This is an artificial\nlimitation until we figure out the exact capabilities of the hardware.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n src/libcamera/pipeline/ipu3/ipu3.cpp | 124 +++++++++++++++++++++------\n 1 file changed, 98 insertions(+), 26 deletions(-)", "diff": "diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 46384d88dddd..0130a83973ca 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -5,6 +5,7 @@\n * ipu3.cpp - Pipeline handler for Intel IPU3\n */\n \n+#include <algorithm>\n #include <iomanip>\n #include <memory>\n #include <vector>\n@@ -221,34 +222,105 @@ CameraConfiguration\n PipelineHandlerIPU3::streamConfiguration(Camera *camera,\n \t\t\t\t\t const std::vector<StreamUsage> &usages)\n {\n-\tCameraConfiguration configs;\n \tIPU3CameraData *data = cameraData(camera);\n-\tStreamConfiguration config = {};\n+\tCameraConfiguration cameraConfig = {};\n+\tstd::set<IPU3Stream *> streams = {\n+\t\t&data->outStream_,\n+\t\t&data->vfStream_,\n+\t};\n \n-\t/*\n-\t * FIXME: Soraka: the maximum resolution reported by both sensors\n-\t * (2592x1944 for ov5670 and 4224x3136 for ov13858) are returned as\n-\t * default configurations but they're not correctly processed by the\n-\t * ImgU. Resolutions up tp 2560x1920 have been validated.\n-\t *\n-\t * \\todo Clarify ImgU alignement requirements.\n-\t */\n-\tconfig.width = 2560;\n-\tconfig.height = 1920;\n-\tconfig.pixelFormat = V4L2_PIX_FMT_NV12;\n-\tconfig.bufferCount = IPU3_BUFFER_COUNT;\n-\n-\tconfigs[&data->outStream_] = config;\n-\tLOG(IPU3, Debug)\n-\t\t<< \"Stream '\" << data->outStream_.name_ << \"' format set to \"\n-\t\t<< config.toString();\n-\n-\tconfigs[&data->vfStream_] = config;\n-\tLOG(IPU3, Debug)\n-\t\t<< \"Stream '\" << data->vfStream_.name_ << \"' format set to \"\n-\t\t<< config.toString();\n-\n-\treturn configs;\n+\tfor (const StreamUsage &usage : usages) {\n+\t\tStreamConfiguration streamConfig = {};\n+\t\tStreamUsage::Role role = usage.role();\n+\t\tIPU3Stream *stream = nullptr;\n+\n+\t\tswitch (role) {\n+\t\tcase StreamUsage::Role::StillCapture:\n+\t\t\t/*\n+\t\t\t * Don't allow viewfinder or video capture on the\n+\t\t\t * 'output' stream. This is an artificial limitation\n+\t\t\t * until we figure out the capabilities of the\n+\t\t\t * hardware.\n+\t\t\t */\n+\t\t\tif (streams.find(&data->outStream_) != streams.end()) {\n+\t\t\t\tstream = &data->outStream_;\n+\t\t\t} else if (streams.find(&data->vfStream_) != streams.end()) {\n+\t\t\t\tstream = &data->vfStream_;\n+\t\t\t} else {\n+\t\t\t\tLOG(IPU3, Error)\n+\t\t\t\t\t<< \"No stream available for requested role \"\n+\t\t\t\t\t<< role;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\t/*\n+\t\t\t * FIXME: Soraka: the maximum resolution reported by\n+\t\t\t * both sensors (2592x1944 for ov5670 and 4224x3136 for\n+\t\t\t * ov13858) are returned as default configurations but\n+\t\t\t * they're not correctly processed by the ImgU.\n+\t\t\t * Resolutions up tp 2560x1920 have been validated.\n+\t\t\t *\n+\t\t\t * \\todo Clarify ImgU alignment requirements.\n+\t\t\t */\n+\t\t\tstreamConfig.width = 2560;\n+\t\t\tstreamConfig.height = 1920;\n+\n+\t\t\tbreak;\n+\t\tcase StreamUsage::Role::Viewfinder:\n+\t\tcase StreamUsage::Role::VideoRecording: {\n+\t\t\t/*\n+\t\t\t * We can't use the 'output' stream for viewfinder or\n+\t\t\t * video capture usages.\n+\t\t\t *\n+\t\t\t * \\todo This is an artificial limitation until we\n+\t\t\t * figure out the exact capabilities of the hardware.\n+\t\t\t */\n+\t\t\tif (streams.find(&data->vfStream_) == streams.end()) {\n+\t\t\t\tLOG(IPU3, Error)\n+\t\t\t\t\t<< \"No stream available for requested role \"\n+\t\t\t\t\t<< role;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tstream = &data->vfStream_;\n+\n+\t\t\t/*\n+\t\t\t * Align the requested viewfinder size to the\n+\t\t\t * maximum available sensor resolution and to the\n+\t\t\t * IPU3 alignment constraints.\n+\t\t\t */\n+\t\t\tconst Size &res = data->cio2_.sensor_->resolution();\n+\t\t\tunsigned int width = std::min(usage.size().width,\n+\t\t\t\t\t\t res.width);\n+\t\t\tunsigned int height = std::min(usage.size().height,\n+\t\t\t\t\t\t res.height);\n+\t\t\tstreamConfig.width = width & ~7;\n+\t\t\tstreamConfig.height = height & ~3;\n+\n+\t\t\tbreak;\n+\t\t}\n+\t\tdefault:\n+\t\t\tLOG(IPU3, Error)\n+\t\t\t\t<< \"Requested stream role not supported: \" << role;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tif (!stream)\n+\t\t\treturn cameraConfig;\n+\n+\t\tstreams.erase(stream);\n+\n+\t\tstreamConfig.pixelFormat = V4L2_PIX_FMT_NV12;\n+\t\tstreamConfig.bufferCount = IPU3_BUFFER_COUNT;\n+\n+\t\tcameraConfig[stream] = streamConfig;\n+\n+\t\tLOG(IPU3, Debug)\n+\t\t\t<< \"Stream '\" << stream->name_ << \"' format set to \"\n+\t\t\t<< streamConfig.toString();\n+\t}\n+\n+\treturn cameraConfig;\n }\n \n int PipelineHandlerIPU3::configureStreams(Camera *camera,\n", "prefixes": [ "libcamera-devel", "v8", "4/8" ] }