From patchwork Wed Dec 1 15:23:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 14972 X-Patchwork-Delegate: kieran.bingham@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id EA7AEBF415 for ; Wed, 1 Dec 2021 15:23:11 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3164960746; Wed, 1 Dec 2021 16:23:11 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="qtFALp1I"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7C0886011A for ; Wed, 1 Dec 2021 16:23:10 +0100 (CET) Received: from Monstersaurus.local (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0FC71A15; Wed, 1 Dec 2021 16:23:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1638372190; bh=L/V/k0PmnxOPR5qPqcaJNU3lzX6xXKMlFpuEWOp4YZA=; h=From:To:Cc:Subject:Date:From; b=qtFALp1INxUdSooe3+bfAHmrUP16KIz3OliMQxXCYzmm/VsnROwbtGEV3btxzxQVu Zx2rtrKyA4yyMiHOkmz0z1BZ6hIl9KoUTZx2LgMWICI/kAlQmsB/5bKmiJB2VxoPQY jlvt/6I5QJrfQ8m6DxMWc4xIu4pj38b5erLyZAck= From: Kieran Bingham To: libcamera devel Date: Wed, 1 Dec 2021 15:23:06 +0000 Message-Id: <20211201152306.3401143-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] libcamera: pipeline: simple: Support output size ranges X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Benjamin Schaaf Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" From: Benjamin Schaaf Use the list of supported ranges from the video format to configure the stream and subdev instead of the capture size, allowing streams to be configured below the maximum resolution. Bug: https://bugs.libcamera.org/show_bug.cgi?id=96 Signed-off-by: Benjamin Schaaf --- Sent on behalf of Benjamin as posted at https://bugs.libcamera.org/attachment.cgi?id=33 src/libcamera/pipeline/simple/simple.cpp | 34 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 701fb4be0b71..a597e27f6139 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -213,7 +213,7 @@ public: PixelFormat captureFormat; Size captureSize; std::vector outputFormats; - SizeRange outputSizes; + std::vector outputSizes; }; std::vector streams_; @@ -492,10 +492,10 @@ int SimpleCameraData::init() if (!converter_) { config.outputFormats = { pixelFormat }; - config.outputSizes = config.captureSize; + config.outputSizes = videoFormat.second; } else { config.outputFormats = converter_->formats(pixelFormat); - config.outputSizes = converter_->sizes(format.size); + config.outputSizes = { converter_->sizes(format.size) }; } configs_.push_back(config); @@ -804,17 +804,23 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() status = Adjusted; } - if (!pipeConfig_->outputSizes.contains(cfg.size)) { + auto sizeIt = std::find_if(pipeConfig_->outputSizes.begin(), + pipeConfig_->outputSizes.end(), + [&](SizeRange r) { return r.contains(cfg.size); }); + if (sizeIt == pipeConfig_->outputSizes.end()) { LOG(SimplePipeline, Debug) << "Adjusting size from " << cfg.size.toString() << " to " << pipeConfig_->captureSize.toString(); - cfg.size = pipeConfig_->captureSize; + + cfg.size = pipeConfig_->outputSizes[0].max; status = Adjusted; + + /* \todo Create a libcamera core class to group format and size */ + if (cfg.size != pipeConfig_->captureSize) + needConversion_ = true; } - /* \todo Create a libcamera core class to group format and size */ - if (cfg.pixelFormat != pipeConfig_->captureFormat || - cfg.size != pipeConfig_->captureSize) + if (cfg.pixelFormat != pipeConfig_->captureFormat) needConversion_ = true; /* Set the stride, frameSize and bufferCount. */ @@ -907,8 +913,14 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) if (ret < 0) return ret; + Size size; + for (unsigned int i = 0; i < config->size(); ++i) { + StreamConfiguration &cfg = config->at(i); + size.expandTo(cfg.size); + } + const SimpleCameraData::Configuration *pipeConfig = config->pipeConfig(); - V4L2SubdeviceFormat format{ pipeConfig->code, data->sensor_->resolution() }; + V4L2SubdeviceFormat format{ pipeConfig->code, size }; ret = data->setupFormats(&format, V4L2Subdevice::ActiveFormat); if (ret < 0) @@ -919,7 +931,7 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) V4L2DeviceFormat captureFormat; captureFormat.fourcc = videoFormat; - captureFormat.size = pipeConfig->captureSize; + captureFormat.size = size; ret = video->setFormat(&captureFormat); if (ret) @@ -932,7 +944,7 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) } if (captureFormat.fourcc != videoFormat || - captureFormat.size != pipeConfig->captureSize) { + captureFormat.size != size) { LOG(SimplePipeline, Error) << "Unable to configure capture in " << pipeConfig->captureSize.toString() << "-"