summaryrefslogtreecommitdiff
path: root/src/libcamera/pipeline/rpi/vc4/vc4.cpp
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2023-09-21 18:55:47 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-09-27 14:42:36 +0300
commit723c0abb40f9cfe68373a3b6d2ced45885db7239 (patch)
tree8491cf4f01038687090218c4096b3b8799fec3d6 /src/libcamera/pipeline/rpi/vc4/vc4.cpp
parent71bbf10a2f79d498db7e85293dd8115b87fa30aa (diff)
libcamera: rpi: Simplify validate() and configure() for RAW streams
This commit simplifies the validate() and configure() calls in the pipeline handler in a number of ways: - Only pass the RPiCameraConfiguration structure into platformValidate() and platformConfigure(). - Determine the V4L2DeviceFormat structure fields for all streams in validate(), cache them and reuse in configure() instead of re-generating this structure multiple times. - Use the recently added updateStreamConfig() and toV4L2DeviceFormat() helpers to populate fields in the V4L2DeviceFormat and StreamConfiguration structures to reduce code duplication. 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.cpp35
1 files changed, 20 insertions, 15 deletions
diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
index 1c860d7f..785f0712 100644
--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
+++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
@@ -115,9 +115,7 @@ private:
isp_[Isp::Input].dev()->setSelection(V4L2_SEL_TGT_CROP, &ispCrop_);
}
- int platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
- std::optional<BayerFormat::Packing> packing,
- const RPi::RPiCameraConfiguration *rpiConfig) override;
+ int platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig) override;
int platformConfigureIpa(ipa::RPi::ConfigParams &params) override;
int platformInitIpa([[maybe_unused]] ipa::RPi::InitParams &params) override
@@ -416,6 +414,9 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfig
/* Handle flips to make sure to match the RAW stream format. */
if (flipsAlterBayerOrder_)
rawBayer = rawBayer.transform(rpiConfig->combinedTransform_);
+
+ /* Apply the user requested packing. */
+ rawBayer.packing = BayerFormat::fromPixelFormat(rawStream->pixelFormat).packing;
PixelFormat rawFormat = rawBayer.toPixelFormat();
if (rawStream->pixelFormat != rawFormat ||
@@ -425,6 +426,9 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfig
status = CameraConfiguration::Adjusted;
}
+
+ rawStreams[0].format =
+ RPi::PipelineHandlerBase::toV4L2DeviceFormat(unicam_[Unicam::Image].dev(), rawStream);
}
/*
@@ -503,23 +507,14 @@ int Vc4CameraData::platformPipelineConfigure(const std::unique_ptr<YamlObject> &
return 0;
}
-int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
- std::optional<BayerFormat::Packing> packing,
- const RPi::RPiCameraConfiguration *rpiConfig)
+int Vc4CameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConfig)
{
const std::vector<StreamParams> &rawStreams = rpiConfig->rawStreams_;
const std::vector<StreamParams> &outStreams = rpiConfig->outStreams_;
int ret;
- if (!packing)
- packing = BayerFormat::Packing::CSI2;
-
V4L2VideoDevice *unicam = unicam_[Unicam::Image].dev();
- V4L2DeviceFormat unicamFormat = RPi::PipelineHandlerBase::toV4L2DeviceFormat(unicam, sensorFormat, *packing);
-
- ret = unicam->setFormat(&unicamFormat);
- if (ret)
- return ret;
+ V4L2DeviceFormat unicamFormat;
/*
* See which streams are requested, and route the user
@@ -528,14 +523,24 @@ int Vc4CameraData::platformConfigure(const V4L2SubdeviceFormat &sensorFormat,
if (!rawStreams.empty()) {
rawStreams[0].cfg->setStream(&unicam_[Unicam::Image]);
unicam_[Unicam::Image].setFlags(StreamFlag::External);
+ unicamFormat = rawStreams[0].format;
+ } else {
+ unicamFormat =
+ RPi::PipelineHandlerBase::toV4L2DeviceFormat(unicam,
+ rpiConfig->sensorFormat_,
+ BayerFormat::Packing::CSI2);
}
+ ret = unicam->setFormat(&unicamFormat);
+ if (ret)
+ return ret;
+
ret = isp_[Isp::Input].dev()->setFormat(&unicamFormat);
if (ret)
return ret;
LOG(RPI, Info) << "Sensor: " << sensor_->id()
- << " - Selected sensor format: " << sensorFormat
+ << " - Selected sensor format: " << rpiConfig->sensorFormat_
<< " - Selected unicam format: " << unicamFormat;
/* Use a sensible small default size if no output streams are configured. */