From patchwork Thu Apr 18 10:47:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 1045 Return-Path: Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6F7DE60DC9 for ; Thu, 18 Apr 2019 12:46:39 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id E8C4E1C0004; Thu, 18 Apr 2019 10:46:38 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Thu, 18 Apr 2019 12:47:14 +0200 Message-Id: <20190418104715.22622-14-jacopo@jmondi.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190418104715.22622-1-jacopo@jmondi.org> References: <20190418104715.22622-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v5 13/14] libcamera: ipu3: Use roles in stream configuration X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Apr 2019 10:46:39 -0000 Use and inspect the stream roles provided by the application to streamConfiguration() to assign streams to their intended roles and return a default configuration associated with them. Support a limited number of usages, as the viewfinder stream can optionally be used for capturing still images, but the main output stream cannot be used as viewfinder or for video recording purposes. Signed-off-by: Jacopo Mondi --- src/libcamera/pipeline/ipu3/ipu3.cpp | 99 +++++++++++++++++++--------- 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 71b36ecf6cd9..daa66d23d5f3 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -226,38 +226,77 @@ CameraConfiguration PipelineHandlerIPU3::streamConfiguration(Camera *camera, const std::vector &usages) { - CameraConfiguration configs; IPU3CameraData *data = cameraData(camera); - StreamConfiguration config = {}; + CameraConfiguration cameraConfig; + std::set streams = { + &data->outStream_, + &data->vfStream_, + }; - /* - * FIXME: Soraka: the maximum resolution reported by both sensors - * (2592x1944 for ov5670 and 4224x3136 for ov13858) are returned as - * default configurations but they're not correctly processed by the - * ImgU. Resolutions up tp 2560x1920 have been validated. - * - * \todo Clarify ImgU alignement requirements. - */ - config.width = 2560; - config.height = 1920; - config.pixelFormat = V4L2_PIX_FMT_NV12; - config.bufferCount = IPU3_BUFFER_COUNT; - - configs[&data->outStream_] = config; - LOG(IPU3, Debug) - << "Stream '" << data->outStream_.name_ << "' set to " - << config.width << "x" << config.height << "-0x" - << std::hex << std::setfill('0') << std::setw(8) - << config.pixelFormat; - - configs[&data->vfStream_] = config; - LOG(IPU3, Debug) - << "Stream '" << data->vfStream_.name_ << "' set to " - << config.width << "x" << config.height << "-0x" - << std::hex << std::setfill('0') << std::setw(8) - << config.pixelFormat; - - return configs; + for (const StreamUsage &usage : usages) { + std::vector::iterator found; + StreamUsage::Role role = usage.role(); + StreamConfiguration streamConfig = {}; + IPU3Stream *stream = nullptr; + + if (role == StreamUsage::Role::StillCapture) { + /* + * We can use the viewfinder stream in case the + * 'StillCapture' usage is required multiple times. + */ + if (streams.find(&data->outStream_) != streams.end()) + stream = &data->outStream_; + else if (streams.find(&data->vfStream_) != streams.end()) + stream = &data->vfStream_; + else + goto error; + + /* + * FIXME: Soraka: the maximum resolution reported by + * both sensors (2592x1944 for ov5670 and 4224x3136 for + * ov13858) are returned as default configurations but + * they're not correctly processed by the ImgU. + * Resolutions up tp 2560x1920 have been validated. + * + * \todo Clarify ImgU alignment requirements. + */ + streamConfig.width = 2560; + streamConfig.height = 1920; + } else if (role == StreamUsage::Role::Viewfinder || + role == StreamUsage::Role::VideoRecording) { + /* + * We can't use the 'output' stream for viewfinder or + * video capture usages. + */ + if (streams.find(&data->vfStream_) == streams.end()) + goto error; + + stream = &data->vfStream_; + + streamConfig.width = usage.size().width; + streamConfig.height = usage.size().height; + } + + streams.erase(stream); + + streamConfig.pixelFormat = V4L2_PIX_FMT_NV12; + streamConfig.bufferCount = IPU3_BUFFER_COUNT; + + cameraConfig[stream] = streamConfig; + + LOG(IPU3, Debug) + << "Stream '" << stream->name_ << "' format set to " + << streamConfig.width << "x" << streamConfig.height + << "-0x" << std::hex << std::setfill('0') + << std::setw(8) << streamConfig.pixelFormat; + } + + return cameraConfig; + +error: + LOG(IPU3, Error) << "Requested stream roles not supported"; + + return CameraConfiguration{}; } int PipelineHandlerIPU3::configureStreams(Camera *camera,