[libcamera-devel] [PATCH 09/20] libcamera: ipu3: Report StreamFormats
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Jul 14 23:31:29 CEST 2020
Hi Jacopo,
Thank you for the patch.
On Tue, Jul 14, 2020 at 12:42:01PM +0200, Jacopo Mondi wrote:
> Report StreamFormats associated to each StreamConfiguration generated
> by the IPU3 pipeline handler.
>
> The StreamFormats are generated differently for RAW and processed
> streams, with the former using the sensor enumerated resolutions and
> the latter using a continuous range of sizes constructed by matching the
> sensor capabilities with the platform constraints.
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 45 +++++++++++++++++++---------
> 1 file changed, 31 insertions(+), 14 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 517d9bd11fbf..b480d41f89ab 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -313,7 +313,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
>
> Size sensorResolution = data->cio2_.sensor()->resolution();
> for (const StreamRole role : roles) {
> - StreamConfiguration cfg = {};
> + std::map<PixelFormat, std::vector<SizeRange>> streamFormats;
> + unsigned int bufferCount;
> + PixelFormat pixelFormat;
> + Size size;
>
> switch (role) {
> case StreamRole::StillCapture:
> @@ -322,18 +325,26 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> * output constraints and required frame margin
> * by rounding down to the closest alignment.
> */
> - cfg.size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> - cfg.size.width = utils::alignDown(cfg.size.width - 1,
> - IMGU_OUTPUT_WIDTH_MARGIN);
> - cfg.size.height = utils::alignDown(cfg.size.height - 1,
> - IMGU_OUTPUT_HEIGHT_MARGIN);
> - cfg.pixelFormat = formats::NV12;
> - cfg.bufferCount = IPU3_BUFFER_COUNT;
> + size = sensorResolution.boundedTo(IMGU_OUTPUT_MAX_SIZE);
> + size.width = utils::alignDown(size.width - 1,
> + IMGU_OUTPUT_WIDTH_MARGIN);
> + size.height = utils::alignDown(size.height - 1,
> + IMGU_OUTPUT_HEIGHT_MARGIN);
> + pixelFormat = formats::NV12;
> + bufferCount = IPU3_BUFFER_COUNT;
> + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>
> break;
>
> case StreamRole::StillCaptureRaw: {
> - cfg = data->cio2_.generateConfiguration(sensorResolution);
> + StreamConfiguration cio2Config =
> + data->cio2_.generateConfiguration(sensorResolution);
> + pixelFormat = cio2Config.pixelFormat;
> + size = cio2Config.size;
> + bufferCount = cio2Config.bufferCount;
> +
> + for (const PixelFormat &format : data->cio2_.formats())
> + streamFormats[format] = data->cio2_.sizes();
>
> break;
> }
> @@ -345,11 +356,12 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> * capped to the maximum sensor resolution and aligned
> * to the ImgU output constraints.
> */
> - cfg.size = sensorResolution.boundedTo({ 1280, 720 })
> - .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> - IMGU_OUTPUT_HEIGHT_ALIGN);
> - cfg.pixelFormat = formats::NV12;
> - cfg.bufferCount = IPU3_BUFFER_COUNT;
> + size = sensorResolution.boundedTo({ 1280, 720 })
> + .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,
> + IMGU_OUTPUT_HEIGHT_ALIGN);
> + pixelFormat = formats::NV12;
> + bufferCount = IPU3_BUFFER_COUNT;
> + streamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };
>
> break;
> }
> @@ -361,6 +373,11 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> return nullptr;
> }
>
> + StreamFormats formats(streamFormats);
> + StreamConfiguration cfg(formats);
> + cfg.size = size;
> + cfg.pixelFormat = pixelFormat;
> + cfg.bufferCount = bufferCount;
> config->addConfiguration(cfg);
> }
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list