From patchwork Fri May 17 23:06:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 1228 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6F5F361880 for ; Sat, 18 May 2019 01:06:46 +0200 (CEST) Received: from pendragon.bb.dnainternet.fi (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 16985549 for ; Sat, 18 May 2019 01:06:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558134406; bh=N5Z05dGtKGOdQk7W9NFxBi/RrT1pg9hi6HqixLgiwoM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Ga+t3KvXT89l3IO83wKePCvitgesEB7ikx8eYnPtzeud9zbFvaAkrTwzll7cKZtAF Q2aM28lwAJz89HShDA7rUPPKKnSz4buAFXh7cexIGaBzIsNwBRk5I9CO6qEsmcYdaW GSKwG6veSw6WzDYVYsB8VKYNDj7sBefTrg9KsLo8= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 18 May 2019 02:06:20 +0300 Message-Id: <20190517230621.24668-12-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190517230621.24668-1-laurent.pinchart@ideasonboard.com> References: <20190517230621.24668-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH/RFC 11/12] libcamera: pipeline: uvcvideo: Validate format in UVCCameraConfiguration::validate() 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: Fri, 17 May 2019 23:06:49 -0000 From: Niklas Söderlund Validate and potentially adjust the requested format with a list of discrete formats retrieved from the video device. Signed-off-by: Niklas Söderlund --- src/libcamera/pipeline/uvcvideo.cpp | 44 ++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp index 286d19b0af01..e02d5b19e82a 100644 --- a/src/libcamera/pipeline/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo.cpp @@ -37,6 +37,7 @@ public: V4L2Device *video_; Stream stream_; + StreamFormats formats_; }; class UVCCameraConfiguration : public CameraConfiguration @@ -45,6 +46,7 @@ public: UVCCameraConfiguration(); Status validate() override; + StreamFormats formats; }; class PipelineHandlerUVC : public PipelineHandler @@ -96,21 +98,42 @@ CameraConfiguration::Status UVCCameraConfiguration::validate() StreamConfiguration &cfg = config_[0]; - /* \todo: Validate the configuration against the device capabilities. */ const unsigned int pixelFormat = cfg.pixelFormat; const Size size = cfg.size; + const unsigned int bufferCount = cfg.bufferCount; cfg.pixelFormat = V4L2_PIX_FMT_YUYV; - cfg.size = { 640, 480 }; + if (cfg.pixelFormat != pixelFormat) { + LOG(UVC, Debug) + << "Adjusting pixel format from " << pixelFormat + << " to " << cfg.pixelFormat; + status = Adjusted; + } - if (cfg.pixelFormat != pixelFormat || cfg.size != size) { + const std::vector &formatSizes = formats.sizes(cfg.pixelFormat); + cfg.size = formatSizes.front(); + for (const Size &formatsSize : formatSizes) { + if (formatsSize <= size) + cfg.size = formatsSize; + + if (formatsSize == size) + break; + } + + if (cfg.size != size) { LOG(UVC, Debug) - << "Adjusting configuration from " << cfg.toString() - << " to " << cfg.size.toString() << "-YUYV"; + << "Adjusting size from " << size.toString() + << " to " << cfg.size.toString(); status = Adjusted; } - cfg.bufferCount = 4; + if (bufferCount < 4) { + cfg.bufferCount = 4; + LOG(UVC, Debug) + << "Adjusting buffer count from " << bufferCount + << " to " << cfg.bufferCount; + status = Adjusted; + } return status; } @@ -123,7 +146,10 @@ PipelineHandlerUVC::PipelineHandlerUVC(CameraManager *manager) CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera, const StreamRoles &roles) { - CameraConfiguration *config = new UVCCameraConfiguration(); + UVCCameraData *data = cameraData(camera); + UVCCameraConfiguration *config = new UVCCameraConfiguration(); + + config->formats = data->formats_; if (!roles.empty()) { StreamConfiguration cfg{}; @@ -242,6 +268,10 @@ bool PipelineHandlerUVC::match(DeviceEnumerator *enumerator) if (data->video_->open()) return false; + data->formats_ = StreamFormats(data->video_->enumerateFrameSizes({ V4L2_PIX_FMT_YUYV })); + for (const Size &size : data->formats_.sizes(V4L2_PIX_FMT_YUYV)) + LOG(UVC, Info) << size.toString(); + data->video_->bufferReady.connect(data.get(), &UVCCameraData::bufferReady); /* Create and register the camera. */