diff options
author | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2020-05-22 17:29:08 +0100 |
---|---|---|
committer | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2020-06-04 11:03:00 +0100 |
commit | 3d978a5655d93fcd35e8d4b5a98e84114ebbaf56 (patch) | |
tree | 39157188426362009b4cdafa4f465d17d79cae19 | |
parent | a69a8ffb0293e9e962fb7354a94a2872467a2e65 (diff) |
libcamera: pipeline: vimc: Skip unsupported formats
Older kernels do not support all 'reported' formats. Skip them on those
kernels.
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r-- | src/libcamera/pipeline/vimc/vimc.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 68d65bc7..b721581a 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -136,8 +136,9 @@ CameraConfiguration::Status VimcCameraConfiguration::validate() StreamConfiguration &cfg = config_[0]; /* Adjust the pixel format. */ - if (pixelformats.find(cfg.pixelFormat) == pixelformats.end()) { - LOG(VIMC, Debug) << "Adjusting format to RGB24"; + const std::vector<libcamera::PixelFormat> formats = cfg.formats().pixelformats(); + if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == formats.end()) { + LOG(VIMC, Debug) << "Adjusting format to BGR888"; cfg.pixelFormat = PixelFormat(DRM_FORMAT_BGR888); status = Adjusted; } @@ -171,6 +172,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera, const StreamRoles &roles) { CameraConfiguration *config = new VimcCameraConfiguration(); + VimcCameraData *data = cameraData(camera); if (roles.empty()) return config; @@ -178,6 +180,19 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera, std::map<PixelFormat, std::vector<SizeRange>> formats; for (const auto &pixelformat : pixelformats) { + /* + * Kernels prior to v5.7 incorrectly report support for RGB888, + * but it isn't functional within the pipeline. + */ + if (data->media_->version() < KERNEL_VERSION(5, 7, 0)) { + if (pixelformat.first != PixelFormat(DRM_FORMAT_BGR888)) { + LOG(VIMC, Info) + << "Skipping unsupported pixel format " + << pixelformat.first.toString(); + continue; + } + } + /* The scaler hardcodes a x3 scale-up ratio. */ std::vector<SizeRange> sizes{ SizeRange{ { 48, 48 }, { 4096, 2160 } } |