summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/rpi/vc4/vc4.cpp
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-09-21 18:55:41 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-09-27 14:41:29 +0300
commit40d50263f553c10f2ed8b30a6d473553c8163674 (patch)
tree03b984271cdc1e5ae68e16938156520413ee87eb /src/libcamera/pipeline/rpi/vc4/vc4.cpp
parentf446c23842d080bdc2e8a81fe4328762e22e39ec (diff)
libcamera: rpi: Handle SensorConfiguration
Handle the SensorConfiguration provided by the application in the pipeline validate() and configure() call chains. During validation, first make sure SensorConfiguration is valid, then handle it to compute the sensor format. For the VC4 platform where the RAW stream follows the sensor's configuration adjust the RAW stream configuration to match the sensor configuration. Reviewed-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/libcamera/pipeline/rpi/vc4/vc4.cpp')
-rw-r--r--src/libcamera/pipeline/rpi/vc4/vc4.cpp31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
index 018cf488..46504636 100644
--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
@@ -65,7 +65,8 @@ public:
{
}
- CameraConfiguration::Status platformValidate(std::vector<StreamParams> &rawStreams,
+ CameraConfiguration::Status platformValidate(RPi::RPiCameraConfiguration *rpiConfig,
+ std::vector<StreamParams> &rawStreams,
std::vector<StreamParams> &outStreams) const override;
int platformPipelineConfigure(const std::unique_ptr<YamlObject> &root) override;
@@ -394,7 +395,8 @@ int PipelineHandlerVc4::platformRegister(std::unique_ptr<RPi::CameraData> &camer
return 0;
}
-CameraConfiguration::Status Vc4CameraData::platformValidate(std::vector<StreamParams> &rawStreams,
+CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfiguration *rpiConfig,
+ std::vector<StreamParams> &rawStreams,
std::vector<StreamParams> &outStreams) const
{
CameraConfiguration::Status status = CameraConfiguration::Status::Valid;
@@ -405,9 +407,27 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(std::vector<StreamPa
return CameraConfiguration::Status::Invalid;
}
- if (!rawStreams.empty())
+ if (!rawStreams.empty()) {
rawStreams[0].dev = unicam_[Unicam::Image].dev();
+ /* Adjust the RAW stream to match the computed sensor format. */
+ StreamConfiguration *rawStream = rawStreams[0].cfg;
+ BayerFormat rawBayer = BayerFormat::fromMbusCode(rpiConfig->sensorFormat_.mbus_code);
+
+ /* Handle flips to make sure to match the RAW stream format. */
+ if (flipsAlterBayerOrder_)
+ rawBayer = rawBayer.transform(rpiConfig->combinedTransform_);
+ PixelFormat rawFormat = rawBayer.toPixelFormat();
+
+ if (rawStream->pixelFormat != rawFormat ||
+ rawStream->size != rpiConfig->sensorFormat_.size) {
+ rawStream->pixelFormat = rawFormat;
+ rawStream->size = rpiConfig->sensorFormat_.size;
+
+ status = CameraConfiguration::Adjusted;
+ }
+ }
+
/*
* For the two ISP outputs, one stream must be equal or smaller than the
* other in all dimensions.
@@ -417,6 +437,11 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(std::vector<StreamPa
for (unsigned int i = 0; i < outStreams.size(); i++) {
Size size;
+ /*
+ * \todo Should we warn if upscaling, as it reduces the image
+ * quality and is usually undesired ?
+ */
+
size.width = std::min(outStreams[i].cfg->size.width,
outStreams[0].cfg->size.width);
size.height = std::min(outStreams[i].cfg->size.height,