diff options
Diffstat (limited to 'src/libcamera/pipeline/vimc.cpp')
-rw-r--r-- | src/libcamera/pipeline/vimc.cpp | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp index ed5b1ad4..0e4eede3 100644 --- a/src/libcamera/pipeline/vimc.cpp +++ b/src/libcamera/pipeline/vimc.cpp @@ -5,6 +5,9 @@ * vimc.cpp - Pipeline handler for the vimc device */ +#include <algorithm> +#include <array> + #include <libcamera/camera.h> #include <libcamera/request.h> #include <libcamera/stream.h> @@ -39,6 +42,14 @@ public: Stream stream_; }; +class VimcCameraConfiguration : public CameraConfiguration +{ +public: + VimcCameraConfiguration(); + + Status validate() override; +}; + class PipelineHandlerVimc : public PipelineHandler { public: @@ -68,6 +79,57 @@ private: } }; +VimcCameraConfiguration::VimcCameraConfiguration() + : CameraConfiguration() +{ +} + +CameraConfiguration::Status VimcCameraConfiguration::validate() +{ + static const std::array<unsigned int, 3> formats{ + V4L2_PIX_FMT_BGR24, + V4L2_PIX_FMT_RGB24, + V4L2_PIX_FMT_ARGB32, + }; + + Status status = Valid; + + if (config_.empty()) + return Invalid; + + /* Cap the number of entries to the available streams. */ + if (config_.size() > 1) { + config_.resize(1); + status = Adjusted; + } + + StreamConfiguration &cfg = config_[0]; + + /* Adjust the pixel format. */ + if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == + formats.end()) { + LOG(VIMC, Debug) << "Adjusting format to RGB24"; + cfg.pixelFormat = V4L2_PIX_FMT_RGB24; + status = Adjusted; + } + + /* Clamp the size based on the device limits. */ + const Size size = cfg.size; + + cfg.size.width = std::max(16U, std::min(4096U, cfg.size.width)); + cfg.size.height = std::max(16U, std::min(2160U, cfg.size.height)); + + if (cfg.size != size) { + LOG(VIMC, Debug) + << "Adjusting size to " << cfg.size.toString(); + status = Adjusted; + } + + cfg.bufferCount = 4; + + return status; +} + PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager) : PipelineHandler(manager) { @@ -76,7 +138,7 @@ PipelineHandlerVimc::PipelineHandlerVimc(CameraManager *manager) CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera, const StreamRoles &roles) { - CameraConfiguration *config = new CameraConfiguration(); + CameraConfiguration *config = new VimcCameraConfiguration(); if (roles.empty()) return config; @@ -88,6 +150,8 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera, config->addConfiguration(cfg); + config->validate(); + return config; } |