[RFC PATCH v2 04/13] libcamera: simple: Add plain output configurations to software ISP

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jan 26 22:30:04 CET 2025


Hi Milan,

Thank you for the patch.

On Fri, Jan 24, 2025 at 10:57:55PM +0100, Milan Zamazal wrote:
> When software ISP is active, only software ISP adjusted output
> configurations are considered.  We want to support raw streams together
> with software ISP and for that purpose, we need to track also unmodified
> configurations.
> 
> A flag is added to SimpleCameraData::Configuration indicating whether
> it's for software ISP.  Configurations for unmodified output sizes and
> formats are added now whether software ISP is active or not.  We later
> filter formats and output sizes for particular stream configuration
> according to the new configuration flag.  This is just preparation and
> raw output is still not supported; for this reason, we just look whether
> software ISP is active; this will be changed in followup patches.
> 
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> ---
>  src/libcamera/pipeline/simple/simple.cpp | 30 ++++++++++++++----------
>  1 file changed, 18 insertions(+), 12 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 06df909b..71853bb2 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -273,6 +273,7 @@ public:
>  		Size captureSize;
>  		std::vector<PixelFormat> outputFormats;
>  		SizeRange outputSizes;
> +		bool swisp;
>  	};
>  
>  	std::vector<Stream> streams_;
> @@ -654,19 +655,24 @@ void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)
>  		config.sensorSize = size;
>  		config.captureFormat = pixelFormat;
>  		config.captureSize = format.size;
> +		config.swisp = false;
>  
>  		if (converter_) {
>  			config.outputFormats = converter_->formats(pixelFormat);
>  			config.outputSizes = converter_->sizes(format.size);
> -		} else if (swIsp_) {
> -			config.outputFormats = swIsp_->formats(pixelFormat);
> -			config.outputSizes = swIsp_->sizes(pixelFormat, format.size);
> -			if (config.outputFormats.empty()) {
> -				/* Do not use swIsp for unsupported pixelFormat's. */
> -				config.outputFormats = { pixelFormat };
> -				config.outputSizes = config.captureSize;
> -			}
>  		} else {
> +			if (swIsp_) {
> +				Configuration swispConfig = config;
> +				swispConfig.outputFormats = swIsp_->formats(pixelFormat);
> +				swispConfig.outputSizes = swIsp_->sizes(pixelFormat, format.size);
> +				if (swispConfig.outputFormats.empty()) {
> +					/* Do not use swIsp for unsupported pixelFormat's. */
> +					swispConfig.outputFormats = { pixelFormat };
> +					swispConfig.outputSizes = swispConfig.captureSize;
> +				}
> +				swispConfig.swisp = true;
> +				configs_.push_back(swispConfig);
> +			}

That's really getting too confusing. I've read the rest of the series,
and it doesn't get better :-(

I think we need to first refactor the existing code to make raw handling
identifical for the converter and software ISP cases. It doesn't mean
you have to create a common interface for the two elements (it would
be nice, but it's more yak shaving than I could reasonably ask for).

>  			config.outputFormats = { pixelFormat };
>  			config.outputSizes = config.captureSize;
>  		}
> @@ -1185,10 +1191,10 @@ SimplePipelineHandler::generateConfiguration(Camera *camera, Span<const StreamRo
>  	/* Create the formats map. */
>  	std::map<PixelFormat, std::vector<SizeRange>> formats;
>  
> -	for (const SimpleCameraData::Configuration &cfg : data->configs_) {
> -		for (PixelFormat format : cfg.outputFormats)
> -			formats[format].push_back(cfg.outputSizes);
> -	}
> +	for (const SimpleCameraData::Configuration &cfg : data->configs_)
> +		if (static_cast<bool>(data->swIsp_) == cfg.swisp)
> +			for (PixelFormat format : cfg.outputFormats)
> +				formats[format].push_back(cfg.outputSizes);
>  
>  	/* Sort the sizes and merge any consecutive overlapping ranges. */
>  	for (auto &[format, sizes] : formats) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list