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:
parent
52660f2b13
commit
f98919307e
1 changed files with 22 additions and 22 deletions
|
@ -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) });
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue