[libcamera-devel] [PATCH] pipeline: rpi: Move flip handling validation code
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Tue Oct 17 13:54:41 CEST 2023
Hi Naush
On Fri, Oct 13, 2023 at 10:10:03AM +0100, Naushir Patuck via libcamera-devel wrote:
> 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 at raspberrypi.com>
> Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
> ---
> .../pipeline/rpi/common/pipeline_base.cpp | 43 +++++++++++++------
> src/libcamera/pipeline/rpi/vc4/vc4.cpp | 15 ++++---
> 2 files changed, 38 insertions(+), 20 deletions(-)
>
> diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
> index 825eae80d014..7c88b87e0608 100644
> --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
> +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp
> @@ -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_);
> + }
> +
> + /* 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;
> }
> - raw.cfg->pixelFormat = bayer.toPixelFormat();
> + }
> +
> + /* 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;
> diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
> index 233473e2fe2b..425ab9ae6ea5 100644
> --- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp
> +++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp
> @@ -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;
>
> - /* Apply the user requested packing. */
> - rawBayer.packing = BayerFormat::fromPixelFormat(rawStream->pixelFormat).packing;
> - PixelFormat rawFormat = rawBayer.toPixelFormat();
> + /* 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;
Do you need to return Adjusted in this case ?
Thanks
j
>
> + PixelFormat rawFormat = rawBayer.toPixelFormat();
> if (rawStream->pixelFormat != rawFormat ||
> rawStream->size != rpiConfig->sensorFormat_.size) {
> rawStream->pixelFormat = rawFormat;
> --
> 2.34.1
>
More information about the libcamera-devel
mailing list