[libcamera-devel] [PATCH 13/15] libcamera: ipu3: Collect ImgU pipe configuration
Niklas Söderlund
niklas.soderlund at ragnatech.se
Wed Jul 1 18:54:24 CEST 2020
Hi Jacopo,
Thanks for your work.
On 2020-07-01 14:30:34 +0200, Jacopo Mondi wrote:
> Break the stream assignement and ImgU configuration performed at
> IPU3PipelineHandler::configure() time in two parts, to collect the
> ImgU pipe configuration.
>
> The first pass collects the desired ImgU pipe configuration and assigns
> streams to configurations. The second pass, which is performed after the
> ImgU pipe has been configured, programs the computed sizes to the ImgU
> output video devices.
>
> Use the collected pipe configuration in ImgUDevice::configureInput() as
> it will be used to compute the pipe configuration parameters.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/pipeline/ipu3/imgu.cpp | 11 ++--
> src/libcamera/pipeline/ipu3/imgu.h | 2 +-
> src/libcamera/pipeline/ipu3/ipu3.cpp | 80 +++++++++++++++++++---------
> 3 files changed, 60 insertions(+), 33 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/imgu.cpp b/src/libcamera/pipeline/ipu3/imgu.cpp
> index 7e9047cc8dc1..49201157eb07 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.cpp
> +++ b/src/libcamera/pipeline/ipu3/imgu.cpp
> @@ -95,12 +95,11 @@ int ImgUDevice::init(MediaDevice *media, unsigned int index)
>
> /**
> * \brief Configure the ImgU unit input
> - * \param[in] size The ImgU input frame size
> + * \param[in] pipe The ImgU pipe configuration
> * \param[in] inputFormat The format to be applied to ImgU input
> * \return 0 on success or a negative error code otherwise
> */
> -int ImgUDevice::configureInput(const Size &size,
> - V4L2DeviceFormat *inputFormat)
> +int ImgUDevice::configureInput(struct Pipe *pipe, V4L2DeviceFormat *inputFormat)
> {
> /* Configure the ImgU input video device with the requested sizes. */
> int ret = input_->setFormat(inputFormat);
> @@ -122,8 +121,8 @@ int ImgUDevice::configureInput(const Size &size,
> Rectangle rect = {
> .x = 0,
> .y = 0,
> - .width = inputFormat->size.width,
> - .height = inputFormat->size.height,
> + .width = pipe->input.width,
> + .height = pipe->input.height,
> };
> ret = imgu_->setSelection(PAD_INPUT, V4L2_SEL_TGT_CROP, &rect);
> if (ret)
> @@ -138,7 +137,7 @@ int ImgUDevice::configureInput(const Size &size,
>
> V4L2SubdeviceFormat imguFormat = {};
> imguFormat.mbus_code = MEDIA_BUS_FMT_FIXED;
> - imguFormat.size = size;
> + imguFormat.size = pipe->input;
>
> ret = imgu_->setFormat(PAD_INPUT, &imguFormat);
> if (ret)
> diff --git a/src/libcamera/pipeline/ipu3/imgu.h b/src/libcamera/pipeline/ipu3/imgu.h
> index 8fb271fb8350..c0353955ea43 100644
> --- a/src/libcamera/pipeline/ipu3/imgu.h
> +++ b/src/libcamera/pipeline/ipu3/imgu.h
> @@ -31,7 +31,7 @@ public:
>
> int init(MediaDevice *media, unsigned int index);
>
> - int configureInput(const Size &size, V4L2DeviceFormat *inputFormat);
> + int configureInput(struct Pipe *pipe, V4L2DeviceFormat *inputFormat);
>
> int configureOutput(const StreamConfiguration &cfg,
> V4L2DeviceFormat *outputFormat)
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 16bda97a3cc3..9499c127ef79 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -396,32 +396,26 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> outCount++;
> }
>
> - /*
> - * Configure the CIO2 unit with the format computed during validation
> - * and apply the same format to the ImgU input.
> - */
> + /* Configure the CIO2 unit with the format computed during validation. */
> const Size &sensorSize = config->cio2Format().size;
> V4L2DeviceFormat cio2Format = {};
> ret = data->cio2_.configure(sensorSize, &cio2Format);
> if (ret)
> return ret;
>
> - ret = imgu->configureInput(sensorSize, &cio2Format);
> - if (ret)
> - return ret;
> + /*
> + * Collect the input, output and viewfinder sizes to configure the
> + * ImgU pipe and assign streams to configurations while iterating them.
> + */
> + ImgUDevice::Pipe imguPipe{};
> + imguPipe.input.width = cio2Format.size.width;
> + imguPipe.input.height = cio2Format.size.height;
Would not 'imguPipe.input = cio2Format.size' work here and below? With
this fixed,
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> - /* Apply the format to the configured streams output devices. */
> - bool outActive = false;
> - bool vfActive = false;
> for (unsigned int i = 0; i < config->size(); ++i) {
> StreamConfiguration &cfg = (*config)[i];
> const PixelFormatInfo &info =
> PixelFormatInfo::info(cfg.pixelFormat);
> if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW) {
> - /*
> - * The RAW stream is configured as part of the CIO2 and
> - * no configuration is needed for the ImgU.
> - */
> cfg.setStream(&data->rawStream_);
> cfg.stride = cio2Format.planes[0].bpl;
>
> @@ -437,13 +431,9 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> * requested.
> */
> if (cfg.size == maxOut && outCount > 1) {
> - ret = imgu->configureOutput(cfg, &outputFormat);
> - if (ret)
> - return ret;
> -
> - cfg.stride = outputFormat.planes[0].bpl;
> cfg.setStream(&data->outStream_);
> - outActive = true;
> + imguPipe.output.width = cfg.size.width;
> + imguPipe.output.height = cfg.size.height;
>
> LOG(IPU3, Debug) << "Assigned " << cfg.toString()
> << " to the main output";
> @@ -457,18 +447,56 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> * the smaller one to reduce the cropping required (if any) on
> * the main output.
> */
> - ret = imgu->configureViewfinder(cfg, &outputFormat);
> - if (ret)
> - return ret;
> -
> - cfg.stride = outputFormat.planes[0].bpl;
> cfg.setStream(&data->vfStream_);
> - vfActive = true;
> + imguPipe.viewfinder.width = cfg.size.width;
> + imguPipe.viewfinder.height = cfg.size.height;
>
> LOG(IPU3, Debug) << "Assigned " << cfg.toString()
> << " to the viewfinder output";
> }
>
> + /*
> + * Configure the ImgU with the collected pipe configuration and the
> + * CIO2 unit format.
> + */
> + ret = imgu->configureInput(&imguPipe, &cio2Format);
> + if (ret)
> + return ret;
> +
> + /* Apply the format to the ImgU output devices. */
> + bool outActive = false;
> + bool vfActive = false;
> + for (unsigned int i = 0; i < config->size(); ++i) {
> + StreamConfiguration &cfg = (*config)[i];
> + Stream *stream = cfg.stream();
> +
> + if (stream == &data->rawStream_) {
> + /*
> + * The RAW stream is configured as part of the CIO2 and
> + * no configuration is needed for the ImgU.
> + */
> + continue;
> + }
> +
> + if (stream == &data->outStream_) {
> + ret = imgu->configureOutput(cfg, &outputFormat);
> + if (ret)
> + return ret;
> +
> + outActive = true;
> + cfg.stride = outputFormat.planes[0].bpl;
> + }
> +
> + if (stream == &data->vfStream_) {
> + ret = imgu->configureViewfinder(cfg, &outputFormat);
> + if (ret)
> + return ret;
> +
> + vfActive = true;
> + cfg.stride = outputFormat.planes[0].bpl;
> + }
> + }
> +
> /*
> * As we need to set format also on the non-active streams, use
> * the configuration of the active one for that purpose (there should
> --
> 2.27.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list