[libcamera-devel] [PATCH v5 13/23] libcamera: raspberrypi: Fill stride and frameSize at config validation
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Jul 9 20:24:14 CEST 2020
Hi Paul,
Thank you for the patch.
On Thu, Jul 09, 2020 at 10:28:25PM +0900, Paul Elder wrote:
> Fill the stride and frameSize fields of the StreamConfiguration at
> configuration validation time instead of at camera configuration time.
> This allows applications to get the stride when trying a configuration
> without modifying the active configuration of the camera.
>
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> Changes in v5:
> - clean up code a bit
> - move setting default size and width into separate patch
>
> Changes in v4:
> - mention motivation in commit message
> - also fill stride and frameSize in the default format
>
> New in v3
> ---
> .../pipeline/raspberrypi/raspberrypi.cpp | 34 +++++++++++++++----
> 1 file changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 1822ac9..a08ad6a 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -427,6 +427,10 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
> */
> V4L2PixFmtMap fmts = data_->unicam_[Unicam::Image].dev()->formats();
> V4L2DeviceFormat sensorFormat = findBestMode(fmts, cfg.size);
> + int ret = data_->unicam_[Unicam::Image].dev()->tryFormat(&sensorFormat);
> + if (ret)
> + return Invalid;
> +
> PixelFormat sensorPixFormat = sensorFormat.fourcc.toPixelFormat();
> if (cfg.size != sensorFormat.size ||
> cfg.pixelFormat != sensorPixFormat) {
> @@ -434,6 +438,10 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
> cfg.pixelFormat = sensorPixFormat;
> status = Adjusted;
> }
> +
> + cfg.stride = sensorFormat.planes[0].bpl;
> + cfg.frameSize = sensorFormat.planes[0].size;
> +
> rawCount++;
> } else {
> outSize[outCount] = std::make_pair(count, cfg.size);
> @@ -478,19 +486,34 @@ CameraConfiguration::Status RPiCameraConfiguration::validate()
> * have that fixed up in the code above.
> *
> */
> - PixelFormat &cfgPixFmt = config_.at(outSize[i].first).pixelFormat;
> - V4L2PixFmtMap fmts;
> + StreamConfiguration &cfg = config_.at(outSize[i].first);
> + PixelFormat &cfgPixFmt = cfg.pixelFormat;
> + V4L2VideoDevice *dev;
>
> if (i == maxIndex)
> - fmts = data_->isp_[Isp::Output0].dev()->formats();
> + dev = data_->isp_[Isp::Output0].dev();
> else
> - fmts = data_->isp_[Isp::Output1].dev()->formats();
> + dev = data_->isp_[Isp::Output1].dev();
> +
> + V4L2PixFmtMap fmts = dev->formats();
>
> if (fmts.find(V4L2PixelFormat::fromPixelFormat(cfgPixFmt, false)) == fmts.end()) {
> /* If we cannot find a native format, use a default one. */
> cfgPixFmt = formats::NV12;
> status = Adjusted;
> }
> +
> + V4L2DeviceFormat format = {};
> + format.fourcc = dev->toV4L2PixelFormat(cfg.pixelFormat);
> + format.size = cfg.size;
> +
> + int ret = dev->tryFormat(&format);
> + if (ret)
> + return Invalid;
> +
> + cfg.stride = format.planes[0].bpl;
> + cfg.frameSize = format.planes[0].size;
> +
> }
>
> return status;
> @@ -655,7 +678,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
>
> if (isRaw(cfg.pixelFormat)) {
> cfg.setStream(&data->isp_[Isp::Input]);
> - cfg.stride = sensorFormat.planes[0].bpl;
> data->isp_[Isp::Input].setExternal(true);
> continue;
> }
> @@ -679,7 +701,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
> }
>
> cfg.setStream(&data->isp_[Isp::Output0]);
> - cfg.stride = format.planes[0].bpl;
> data->isp_[Isp::Output0].setExternal(true);
> }
>
> @@ -705,7 +726,6 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
> */
> if (!cfg.stream()) {
> cfg.setStream(&data->isp_[Isp::Output1]);
> - cfg.stride = format.planes[0].bpl;
> data->isp_[Isp::Output1].setExternal(true);
> }
> }
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list