pipeline: uvcvideo: Cache supported formats in UVCCameraData

Populate and cache the list of supported formats in
UVCCameraData::init(), to avoid repeating the operation every time
generateConfiguration() is called. Combine this with the search for
the largest size advertised by the camera to avoid iterating over the
formats twice in init().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Christian Rauch <Rauch.Christian@gmx.de>
This commit is contained in:
Laurent Pinchart 2022-09-03 17:44:00 +03:00
parent 52660f2b13
commit f98919307e

View file

@ -50,6 +50,7 @@ public:
std::unique_ptr<V4L2VideoDevice> video_; std::unique_ptr<V4L2VideoDevice> video_;
Stream stream_; Stream stream_;
std::map<PixelFormat, std::vector<SizeRange>> formats_;
private: private:
bool generateId(); bool generateId();
@ -186,15 +187,7 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,
if (roles.empty()) if (roles.empty())
return config; return config;
V4L2VideoDevice::Formats v4l2Formats = data->video_->formats(); StreamFormats formats(data->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);
StreamConfiguration cfg(formats); StreamConfiguration cfg(formats);
cfg.pixelFormat = formats.pixelformats().front(); cfg.pixelFormat = formats.pixelformats().front();
@ -445,6 +438,26 @@ int UVCCameraData::init(MediaDevice *media)
return -EINVAL; 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())); properties_.set(properties::Model, utils::toAscii(media->model()));
/* /*
@ -475,19 +488,6 @@ int UVCCameraData::init(MediaDevice *media)
properties_.set(properties::Location, location); 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::PixelArraySize, resolution);
properties_.set(properties::PixelArrayActiveAreas, { Rectangle(resolution) }); properties_.set(properties::PixelArrayActiveAreas, { Rectangle(resolution) });