From patchwork Sat Sep 3 18:10:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 17289 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 434E3C327D for ; Sat, 3 Sep 2022 18:10:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AB3E562041; Sat, 3 Sep 2022 20:10:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1662228654; bh=h+Ea5s0Py13CdWRkDEd6pdhtJD2qNog0XbZAWrjL24o=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=ucgzWyxptvwUNRR/N+udfmSX9DTvDp9NK7lMwoowaj+2nPfK/hpituv47V72bfyTj PsTUlOvTlRzFpNls7RIBteEg5Ff2ubkoVJEhh8btelIExN7AZ9csbsvzujtv6PvqhT 61B7O/KKmdlTNVbezicKSA9bqK2wpj/H3YBb1yfMe2LfKAVYFkHbCNMCcAQ0RyhcXs DOHww0VlTkb9j76tuAR3VSTOWPm/3tGUSD8iCeOhMc9iKZojK4+65QqSnkMGP6rgG2 MPbO30DafDPCiY3Mv5XWc13D+0qBKHsRCCmxZqlmh02kB0RJYhx6/OJIPhijd+0GRc 5+BxD4rbrgZew== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4455F62033 for ; Sat, 3 Sep 2022 20:10:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ISZQg2oV"; dkim-atps=neutral Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id C147751E; Sat, 3 Sep 2022 20:10:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1662228653; bh=h+Ea5s0Py13CdWRkDEd6pdhtJD2qNog0XbZAWrjL24o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ISZQg2oVcxde0lZGgZu5a1QNZXwcFcyKMrlF729ekz1NPMyWYZjdlzUWkl5foJShO vYnvPQTwY2N9htfekLxpzYfIG2zQd+qblEJ1Z2rQWomyOOSR3LzlE7YU11vEkF/o9p z99Vx64Rod+N7d3jEa6YP99Zr8pvPfCrQWqxP5UY= To: libcamera-devel@lists.libcamera.org Date: Sat, 3 Sep 2022 21:10:36 +0300 Message-Id: <20220903181037.1406-3-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220903181037.1406-1-laurent.pinchart@ideasonboard.com> References: <20220903181037.1406-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/3] pipeline: uvcvideo: Cache supported formats in UVCCameraData 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: , X-Patchwork-Original-From: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Populate and cache the list of supported formats in UVCCameraData::init(), to avoid repeating the operation every time generateConfiguration() is called. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 44 ++++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 22b67faf309e..be0fbaea508a 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -50,6 +50,7 @@ public: std::unique_ptr video_; Stream stream_; + std::map> formats_; private: bool generateId(); @@ -186,15 +187,7 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera, if (roles.empty()) return config; - V4L2VideoDevice::Formats v4l2Formats = data->video_->formats(); - std::map> deviceFormats; - for (const auto &format : v4l2Formats) { - PixelFormat pixelFormat = format.first.toPixelFormat(); - if (pixelFormat.isValid()) - deviceFormats[pixelFormat] = format.second; - } - - StreamFormats formats(deviceFormats); + StreamFormats formats(data->formats_); StreamConfiguration cfg(formats); cfg.pixelFormat = formats.pixelformats().front(); @@ -445,6 +438,26 @@ int UVCCameraData::init(MediaDevice *media) return -EINVAL; } + /* + * Populate the map of supported formats, and infer the camera sensor + * resolution from the largest size it advertises. + */ + Size resolution; + for (const auto &format : video_->formats()) { + PixelFormat pixelFormat = format.first.toPixelFormat(); + if (!pixelFormat.isValid()) + continue; + + formats_[pixelFormat] = format.second; + + const std::vector &sizeRanges = format.second; + for (const SizeRange &sizeRange : sizeRanges) { + if (sizeRange.max > resolution) + resolution = sizeRange.max; + } + } + + /* Populate the camera properties. */ properties_.set(properties::Model, utils::toAscii(media->model())); /* @@ -475,19 +488,6 @@ int UVCCameraData::init(MediaDevice *media) properties_.set(properties::Location, location); - /* - * Get the current format in order to initialize the sensor array - * properties. - */ - Size resolution; - for (const auto &it : video_->formats()) { - const std::vector &sizeRanges = it.second; - for (const SizeRange &sizeRange : sizeRanges) { - if (sizeRange.max > resolution) - resolution = sizeRange.max; - } - } - properties_.set(properties::PixelArraySize, resolution); properties_.set(properties::PixelArrayActiveAreas, { Rectangle(resolution) });