[libcamera-devel] [PATCH 05/15] libcamera: ipu3: Report StreamFormats
Niklas Söderlund
niklas.soderlund at ragnatech.se
Wed Jul 1 18:30:04 CEST 2020
Hi Jacopo,
Thanks for your work.
On 2020-07-01 14:30:26 +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.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/libcamera/pipeline/ipu3/ipu3.cpp | 47 +++++++++++++++++++++-------
> 1 file changed, 35 insertions(+), 12 deletions(-)
>
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index cd18c6f31023..ed2360347fb4 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -33,6 +33,9 @@ LOG_DEFINE_CATEGORY(IPU3)
>
> static constexpr unsigned int IPU3_BUFFER_COUNT = 4;
> static constexpr unsigned int IPU3_MAX_STREAMS = 3;
> +static constexpr unsigned int IPU3_OUTPUT_MAX_WIDTH = 4480;
> +static constexpr unsigned int IPU3_OUTPUT_MAX_HEIGHT = 34004;
> +static const Size minIPU3OutputSize = { 2, 2 };
>
> class IPU3CameraData : public CameraData
> {
> @@ -295,15 +298,19 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> {
> IPU3CameraData *data = cameraData(camera);
> IPU3CameraConfiguration *config = new IPU3CameraConfiguration(camera, data);
> + CIO2Device *cio2 = &data->cio2_;
This chance touches none of the code that is added and only modifies
code that is already here. I like it the way it is and that data is used
in the code below. If it must change I would do so in a separate patch.
Whit this fixed,
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
>
> if (roles.empty())
> return config;
>
> - Size sensorResolution = data->cio2_.sensor()->resolution();
> + Size sensorResolution = cio2->sensor()->resolution();
> unsigned int rawCount = 0;
> unsigned int outCount = 0;
> 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:
> @@ -311,19 +318,29 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> * Use the sensor resolution adjusted to respect the
> * ImgU output alignement contraints.
> */
> - cfg.pixelFormat = formats::NV12;
> - cfg.size = sensorResolution;
> - cfg.size.width &= ~7;
> - cfg.size.height &= ~3;
> - cfg.bufferCount = IPU3_BUFFER_COUNT;
> + pixelFormat = formats::NV12;
> + size.width = std::min(sensorResolution.width,
> + IPU3_OUTPUT_MAX_WIDTH);
> + size.height = std::min(sensorResolution.height,
> + IPU3_OUTPUT_MAX_HEIGHT);
> + size.width &= ~7;
> + size.height &= ~3;
> + bufferCount = IPU3_BUFFER_COUNT;
> + streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
>
> outCount++;
>
> break;
>
> case StreamRole::StillCaptureRaw: {
> - cfg = data->cio2_.generateConfiguration(sensorResolution);
> - cfg.bufferCount = 1;
> + StreamConfiguration cio2Config =
> + cio2->generateConfiguration(sensorResolution);
> + pixelFormat = cio2Config.pixelFormat;
> + size = cio2Config.size;
> + bufferCount = cio2Config.bufferCount;
> +
> + for (const PixelFormat &format : cio2->formats())
> + streamFormats[format] = cio2->sizes();
>
> rawCount++;
>
> @@ -339,9 +356,10 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,
> */
> unsigned int width = std::min(1280U, sensorResolution.width);
> unsigned int height = std::min(720U, sensorResolution.height);
> - cfg.size = { width & ~7, height & ~3 };
> - cfg.pixelFormat = formats::NV12;
> - cfg.bufferCount = IPU3_BUFFER_COUNT;
> + size = { width & ~7, height & ~3 };
> + pixelFormat = formats::NV12;
> + bufferCount = IPU3_BUFFER_COUNT;
> + streamFormats[pixelFormat] = { { minIPU3OutputSize, size } };
>
> outCount++;
>
> @@ -361,6 +379,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);
> }
>
> --
> 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