mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 15:29:45 +03:00
pipeline: rpi: Move flip handling validation code
Move the handling of Bayer order changes due to flips to run before platformValidate(). This removes the need for this code to be split between platformValidate() and validate() as it is right now. Also add some validation to ensure the vc4 pipeline handler only supports CSI2 packing or no packing. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
2ec7f2fede
commit
0d4342bf22
2 changed files with 38 additions and 20 deletions
|
@ -231,16 +231,12 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
|
|||
}
|
||||
}
|
||||
|
||||
/* Do any platform specific fixups. */
|
||||
status = data_->platformValidate(this);
|
||||
if (status == Invalid)
|
||||
return Invalid;
|
||||
|
||||
/* Further fixups on the RAW streams. */
|
||||
/* Start with some initial generic RAW stream adjustments. */
|
||||
for (auto &raw : rawStreams_) {
|
||||
int ret = raw.dev->tryFormat(&raw.format);
|
||||
if (ret)
|
||||
return Invalid;
|
||||
StreamConfiguration *rawStream = raw.cfg;
|
||||
|
||||
/* Adjust the RAW stream to match the computed sensor format. */
|
||||
BayerFormat sensorBayer = BayerFormat::fromMbusCode(sensorFormat_.mbus_code);
|
||||
|
||||
/*
|
||||
* Some sensors change their Bayer order when they are h-flipped
|
||||
|
@ -249,12 +245,33 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
|
|||
* Note how we must fetch the "native" (i.e. untransformed) Bayer
|
||||
* order, because the sensor may currently be flipped!
|
||||
*/
|
||||
BayerFormat bayer = BayerFormat::fromPixelFormat(raw.cfg->pixelFormat);
|
||||
if (data_->flipsAlterBayerOrder_) {
|
||||
bayer.order = data_->nativeBayerOrder_;
|
||||
bayer = bayer.transform(combinedTransform_);
|
||||
sensorBayer.order = data_->nativeBayerOrder_;
|
||||
sensorBayer = sensorBayer.transform(combinedTransform_);
|
||||
}
|
||||
raw.cfg->pixelFormat = bayer.toPixelFormat();
|
||||
|
||||
/* Apply the sensor adjusted Bayer order to the user request. */
|
||||
BayerFormat cfgBayer = BayerFormat::fromPixelFormat(rawStream->pixelFormat);
|
||||
cfgBayer.order = sensorBayer.order;
|
||||
|
||||
if (rawStream->pixelFormat != cfgBayer.toPixelFormat()) {
|
||||
rawStream->pixelFormat = cfgBayer.toPixelFormat();
|
||||
status = Adjusted;
|
||||
}
|
||||
}
|
||||
|
||||
/* Do any platform specific fixups. */
|
||||
Status st = data_->platformValidate(this);
|
||||
if (st == Invalid)
|
||||
return Invalid;
|
||||
else if (st == Adjusted)
|
||||
status = Adjusted;
|
||||
|
||||
/* Further fixups on the RAW streams. */
|
||||
for (auto &raw : rawStreams_) {
|
||||
int ret = raw.dev->tryFormat(&raw.format);
|
||||
if (ret)
|
||||
return Invalid;
|
||||
|
||||
if (RPi::PipelineHandlerBase::updateStreamConfig(raw.cfg, raw.format))
|
||||
status = Adjusted;
|
||||
|
|
|
@ -409,16 +409,17 @@ CameraConfiguration::Status Vc4CameraData::platformValidate(RPi::RPiCameraConfig
|
|||
|
||||
/* Adjust the RAW stream to match the computed sensor format. */
|
||||
StreamConfiguration *rawStream = rawStreams[0].cfg;
|
||||
BayerFormat rawBayer = BayerFormat::fromMbusCode(rpiConfig->sensorFormat_.mbus_code);
|
||||
BayerFormat rawBayer = BayerFormat::fromPixelFormat(rawStream->pixelFormat);
|
||||
|
||||
/* Handle flips to make sure to match the RAW stream format. */
|
||||
if (flipsAlterBayerOrder_)
|
||||
rawBayer = rawBayer.transform(rpiConfig->combinedTransform_);
|
||||
/* Apply the sensor bitdepth. */
|
||||
rawBayer.bitDepth = BayerFormat::fromMbusCode(rpiConfig->sensorFormat_.mbus_code).bitDepth;
|
||||
|
||||
/* Default to CSI2 packing if the user request is unsupported. */
|
||||
if (rawBayer.packing != BayerFormat::Packing::CSI2 &&
|
||||
rawBayer.packing != BayerFormat::Packing::None)
|
||||
rawBayer.packing = BayerFormat::Packing::CSI2;
|
||||
|
||||
/* Apply the user requested packing. */
|
||||
rawBayer.packing = BayerFormat::fromPixelFormat(rawStream->pixelFormat).packing;
|
||||
PixelFormat rawFormat = rawBayer.toPixelFormat();
|
||||
|
||||
if (rawStream->pixelFormat != rawFormat ||
|
||||
rawStream->size != rpiConfig->sensorFormat_.size) {
|
||||
rawStream->pixelFormat = rawFormat;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue