summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/vimc
diff options
context:
space:
mode:
authorKieran Bingham <kieran.bingham@ideasonboard.com>2020-05-22 17:29:08 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-06-04 11:03:00 +0100
commit3d978a5655d93fcd35e8d4b5a98e84114ebbaf56 (patch)
tree39157188426362009b4cdafa4f465d17d79cae19 /src/libcamera/pipeline/vimc
parenta69a8ffb0293e9e962fb7354a94a2872467a2e65 (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>
Diffstat (limited to 'src/libcamera/pipeline/vimc')
-rw-r--r--src/libcamera/pipeline/vimc/vimc.cpp19
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 } }