summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2021-12-08 12:36:37 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2021-12-08 14:45:30 +0000
commitf16acb275c85518c13e81ffa6503347abcc01dc5 (patch)
tree1a21361204363b376a24cff431ef54511f119657
parent59644205705c3c96331479f9b6603fea90c87145 (diff)
pipeline: raspberrypi: Restrict the advertised maximum ISP output resolution
Limit the advertised ISP output sizes available to the sensor resolution in PipelineHandlerRPi::generateConfiguration(). The user is free to configure a larger resolution than this, and this will work. However, this stops strange behavior in applications that use the V4L2 compatability layer to run, and request the largest possible advertised resolution, which is much larger than the sensor resolution. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 101aaea3..86851ac4 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -530,10 +530,11 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
unsigned int rawCount = 0;
unsigned int outCount = 0;
+ Size sensorSize = data->sensor_->resolution();
for (const StreamRole role : roles) {
switch (role) {
case StreamRole::Raw:
- size = data->sensor_->resolution();
+ size = sensorSize;
sensorFormat = findBestFormat(data->sensorFormats_, size, defaultRawBitDepth);
pixelFormat = mbusCodeToPixelFormat(sensorFormat.mbus_code,
BayerFormat::Packing::CSI2);
@@ -546,7 +547,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
fmts = data->isp_[Isp::Output0].dev()->formats();
pixelFormat = formats::NV12;
/* Return the largest sensor resolution. */
- size = data->sensor_->resolution();
+ size = sensorSize;
bufferCount = 1;
outCount++;
break;
@@ -599,11 +600,15 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
std::forward_as_tuple(format.second.begin(), format.second.end()));
}
} else {
- /* Translate the V4L2PixelFormat to PixelFormat. */
+ /*
+ * Translate the V4L2PixelFormat to PixelFormat. Note that we
+ * limit the recommended largest ISP output size to match the
+ * sensor resolution.
+ */
for (const auto &format : fmts) {
PixelFormat pf = format.first.toPixelFormat();
if (pf.isValid())
- deviceFormats[pf] = format.second;
+ deviceFormats[pf].emplace_back(sensorSize);
}
}