[libcamera-devel] [PATCH 2/3] pipeline: uvcvideo: Cache supported formats in UVCCameraData

Kieran Bingham kieran.bingham at ideasonboard.com
Tue Sep 6 11:29:50 CEST 2022


Quoting Laurent Pinchart via libcamera-devel (2022-09-03 19:10:36)
> Populate and cache the list of supported formats in
> UVCCameraData::init(), to avoid repeating the operation every time
> generateConfiguration() is called.
> 

Furthermore, optimize the search for the largest supported size reported
by the device by determining this while processing the supported formats
to prevent searching the list twice.

(Or otherwise...)


Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  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<V4L2VideoDevice> video_;
>         Stream stream_;
> +       std::map<PixelFormat, std::vector<SizeRange>> 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<PixelFormat, std::vector<SizeRange>> 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<SizeRange> &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<SizeRange> &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) });
>  
> -- 
> Regards,
> 
> Laurent Pinchart
>


More information about the libcamera-devel mailing list