[libcamera-devel] [PATCH] libcamera: pipeline: raspberrypi: Add StreamFormats to StreamConfiguration

Naushir Patuck naush at raspberrypi.com
Thu Jun 18 09:31:07 CEST 2020


Hi all,

Gentle ping to see if anyone can review this when you get a chance.

Thanks,

Naush

On Wed, 10 Jun 2020 at 15:26, Naushir Patuck <naush at raspberrypi.com> wrote:
>
> In generateConfiguration(), add the device node specific formats to the
> StreamConfiguration for each StreamRole requested.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 52 +++++++++++++------
>  1 file changed, 36 insertions(+), 16 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index e16a9c7f..03a1e641 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -518,41 +518,45 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>         RPiCameraData *data = cameraData(camera);
>         CameraConfiguration *config = new RPiCameraConfiguration(data);
>         V4L2DeviceFormat sensorFormat;
> +       unsigned int bufferCount;
> +       PixelFormat pixelFormat;
>         V4L2PixFmtMap fmts;
> +       Size size;
>
>         if (roles.empty())
>                 return config;
>
>         for (const StreamRole role : roles) {
> -               StreamConfiguration cfg{};
> -
>                 switch (role) {
>                 case StreamRole::StillCaptureRaw:
> -                       cfg.size = data->sensor_->resolution();
> +                       size = data->sensor_->resolution();
>                         fmts = data->unicam_[Unicam::Image].dev()->formats();
> -                       sensorFormat = findBestMode(fmts, cfg.size);
> -                       cfg.pixelFormat = sensorFormat.fourcc.toPixelFormat();
> -                       ASSERT(cfg.pixelFormat.isValid());
> -                       cfg.bufferCount = 1;
> +                       sensorFormat = findBestMode(fmts, size);
> +                       pixelFormat = sensorFormat.fourcc.toPixelFormat();
> +                       ASSERT(pixelFormat.isValid());
> +                       bufferCount = 1;
>                         break;
>
>                 case StreamRole::StillCapture:
> -                       cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +                       fmts = data->isp_[Isp::Output0].dev()->formats();
> +                       pixelFormat = PixelFormat(DRM_FORMAT_NV12);
>                         /* Return the largest sensor resolution. */
> -                       cfg.size = data->sensor_->resolution();
> -                       cfg.bufferCount = 1;
> +                       size = data->sensor_->resolution();
> +                       bufferCount = 1;
>                         break;
>
>                 case StreamRole::VideoRecording:
> -                       cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> -                       cfg.size = { 1920, 1080 };
> -                       cfg.bufferCount = 4;
> +                       fmts = data->isp_[Isp::Output0].dev()->formats();
> +                       pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> +                       size = { 1920, 1080 };
> +                       bufferCount = 4;
>                         break;
>
>                 case StreamRole::Viewfinder:
> -                       cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
> -                       cfg.size = { 800, 600 };
> -                       cfg.bufferCount = 4;
> +                       fmts = data->isp_[Isp::Output0].dev()->formats();
> +                       pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
> +                       size = { 800, 600 };
> +                       bufferCount = 4;
>                         break;
>
>                 default:
> @@ -561,6 +565,22 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>                         break;
>                 }
>
> +               /* Translate the V4L2PixelFormat to PixelFormat. */
> +               std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
> +               std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.begin()),
> +                              [&](const decltype(fmts)::value_type &format) {
> +                                       return decltype(deviceFormats)::value_type{
> +                                               format.first.toPixelFormat(),
> +                                               format.second
> +                                       };
> +                              });
> +
> +               /* Add the stream format based on the device node used for the use case. */
> +               StreamFormats formats(deviceFormats);
> +               StreamConfiguration cfg(formats);
> +               cfg.size = size;
> +               cfg.pixelFormat = pixelFormat;
> +               cfg.bufferCount = bufferCount;
>                 config->addConfiguration(cfg);
>         }
>
> --
> 2.25.1
>


More information about the libcamera-devel mailing list