[libcamera-devel] [PATCH v2 3/6] pipeline: raspberrypi: Set packing formats for the Unicam image node

David Plowman david.plowman at raspberrypi.com
Fri Oct 22 17:22:28 CEST 2021


Hi Naush

Thanks for the update.

On Fri, 22 Oct 2021 at 15:40, Naushir Patuck <naush at raspberrypi.com> wrote:
>
> Default to using CSI2 packed formats when setting up the Unicam image format,
> but use an unpacked format if the user requests one through StreamConfiguration.

Yes, I think this is the right way to do it!

>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index a31b0f81eba7..45725527d66e 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -61,11 +61,14 @@ SensorFormats populateSensorFormats(std::unique_ptr<CameraSensor> &sensor)
>         return formats;
>  }
>
> -inline V4L2DeviceFormat toV4L2DeviceFormat(V4L2SubdeviceFormat &mode)
> +inline V4L2DeviceFormat toV4L2DeviceFormat(V4L2SubdeviceFormat &mode, bool unpacked = false)

I'm not totally sure I like the default value here - I kind of feel
people should be forced to think about it. But that's a teeny thing so
I wouldn't worry.

And also ignoring the very minor brain contortion involved in passing
*un*-packed which gets flipped to set the *packed* field!

Reviewed-by: David Plowman <david.plowman at raspberrypi.com>

Thanks!
David

>  {
>         V4L2DeviceFormat deviceFormat;
>         BayerFormat bayer = BayerFormat::fromMbusCode(mode.mbus_code);
>
> +       bayer.packing = unpacked ? BayerFormat::Packing::None
> +                                : BayerFormat::Packing::CSI2Packed;
> +
>         deviceFormat.fourcc = bayer.toV4L2PixelFormat();
>         deviceFormat.size = mode.size;
>         return deviceFormat;
> @@ -598,6 +601,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>         Size maxSize, sensorSize;
>         unsigned int maxIndex = 0;
>         bool rawStream = false;
> +       bool unpacked = false;
>
>         /*
>          * Look for the RAW stream (if given) size as well as the largest
> @@ -613,6 +617,10 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>                          */
>                         sensorSize = cfg.size;
>                         rawStream = true;
> +                       /* Check if the user has explicitly set an unpacked format. */
> +                       V4L2PixelFormat fourcc = V4L2PixelFormat::fromPixelFormat(cfg.pixelFormat);
> +                       BayerFormat bayer = BayerFormat::fromV4L2PixelFormat(fourcc);
> +                       unpacked = bayer.packing == BayerFormat::Packing::None;
>                 } else {
>                         if (cfg.size > maxSize) {
>                                 maxSize = config->at(i).size;
> @@ -623,7 +631,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>
>         /* First calculate the best sensor mode we can use based on the user request. */
>         V4L2SubdeviceFormat sensorFormat = findBestMode(data->sensorFormats_, rawStream ? sensorSize : maxSize);
> -       V4L2DeviceFormat unicamFormat = toV4L2DeviceFormat(sensorFormat);
> +       V4L2DeviceFormat unicamFormat = toV4L2DeviceFormat(sensorFormat, unpacked);
>
>         ret = data->sensor_->setFormat(&sensorFormat);
>         if (ret)
> --
> 2.25.1
>


More information about the libcamera-devel mailing list