[libcamera-devel] [PATCH] libcamera: pipeline: raspberrypi: Add StreamFormats to StreamConfiguration

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Jun 18 11:03:38 CEST 2020


Hi Naush, Jacopo,

On 18/06/2020 09:41, Jacopo Mondi wrote:
> Hi Naush,
>    sorry for the delay, this fell through the cracks
> 
> On Wed, Jun 10, 2020 at 03:26:40PM +0100, Naushir Patuck wrote:
>> In generateConfiguration(), add the device node specific formats to the
>> StreamConfiguration for each StreamRole requested.
>>
>> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
>> ---
>>  .../pipeline/raspberrypi/raspberrypi.cpp      | 52 +++++++++++++------
>>  1 file changed, 36 insertions(+), 16 deletions(-)
>>
>> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> index e16a9c7f..03a1e641 100644
>> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
>> @@ -518,41 +518,45 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>>  	RPiCameraData *data = cameraData(camera);
>>  	CameraConfiguration *config = new RPiCameraConfiguration(data);
>>  	V4L2DeviceFormat sensorFormat;
>> +	unsigned int bufferCount;
>> +	PixelFormat pixelFormat;
>>  	V4L2PixFmtMap fmts;
>> +	Size size;
>>
>>  	if (roles.empty())
>>  		return config;
>>
>>  	for (const StreamRole role : roles) {
>> -		StreamConfiguration cfg{};
>> -
>>  		switch (role) {
>>  		case StreamRole::StillCaptureRaw:
>> -			cfg.size = data->sensor_->resolution();
>> +			size = data->sensor_->resolution();
>>  			fmts = data->unicam_[Unicam::Image].dev()->formats();
>> -			sensorFormat = findBestMode(fmts, cfg.size);
>> -			cfg.pixelFormat = sensorFormat.fourcc.toPixelFormat();
>> -			ASSERT(cfg.pixelFormat.isValid());
>> -			cfg.bufferCount = 1;
>> +			sensorFormat = findBestMode(fmts, size);
>> +			pixelFormat = sensorFormat.fourcc.toPixelFormat();
>> +			ASSERT(pixelFormat.isValid());
>> +			bufferCount = 1;
>>  			break;
>>
>>  		case StreamRole::StillCapture:
>> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
>> +			fmts = data->isp_[Isp::Output0].dev()->formats();
>> +			pixelFormat = PixelFormat(DRM_FORMAT_NV12);
>>  			/* Return the largest sensor resolution. */
>> -			cfg.size = data->sensor_->resolution();
>> -			cfg.bufferCount = 1;
>> +			size = data->sensor_->resolution();
>> +			bufferCount = 1;
>>  			break;
>>
>>  		case StreamRole::VideoRecording:
>> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
>> -			cfg.size = { 1920, 1080 };
>> -			cfg.bufferCount = 4;
>> +			fmts = data->isp_[Isp::Output0].dev()->formats();
>> +			pixelFormat = PixelFormat(DRM_FORMAT_NV12);
>> +			size = { 1920, 1080 };
>> +			bufferCount = 4;
>>  			break;
>>
>>  		case StreamRole::Viewfinder:
>> -			cfg.pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
>> -			cfg.size = { 800, 600 };
>> -			cfg.bufferCount = 4;
>> +			fmts = data->isp_[Isp::Output0].dev()->formats();
>> +			pixelFormat = PixelFormat(DRM_FORMAT_ARGB8888);
>> +			size = { 800, 600 };
>> +			bufferCount = 4;
>>  			break;
>>
>>  		default:
>> @@ -561,6 +565,22 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>>  			break;
>>  		}
>>
>> +		/* Translate the V4L2PixelFormat to PixelFormat. */
>> +		std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
>> +		std::transform(fmts.begin(), fmts.end(), std::inserter(deviceFormats, deviceFormats.begin()),
>> +			       [&](const decltype(fmts)::value_type &format) {
>> +					return decltype(deviceFormats)::value_type{
>> +						format.first.toPixelFormat(),
>> +						format.second
>> +					};
>> +			       });
> 
> Really took me a while to parse this, as I was not expecting to see
> std::inserter() but just deviceFormats.begin() there, but then I
> learned about inserter, and indeed if I remove std::inserter() I get
> an error due to the fact the copy operator of std::pair is deleted.

I think that's the same as the conversion routine in the UVC pipeline
handler (which I think came from Laurent).

Not for this patch (I think this can go in as is) but we should really
make a helper for that conversion as it's likely to be used in multiple
places, and it is quite hard to parse on it's own ;-(.

However, I think that overlaps with changes that you (Jacopo) were
working on with ImageFormats anyway.

Eitherway, this patch will help support more formats and enumeration on
the RPi pipeline handler:

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>


> 
>> +
>> +		/* Add the stream format based on the device node used for the use case. */
>> +		StreamFormats formats(deviceFormats);
>> +		StreamConfiguration cfg(formats);
>> +		cfg.size = size;
>> +		cfg.pixelFormat = pixelFormat;
>> +		cfg.bufferCount = bufferCount;
> 
> Patch looks good to me
> 
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
> 
> Thanks
>   j
> 
>>  		config->addConfiguration(cfg);
>>  	}
>>
>> --
>> 2.25.1
>>
>> _______________________________________________
>> libcamera-devel mailing list
>> libcamera-devel at lists.libcamera.org
>> https://lists.libcamera.org/listinfo/libcamera-devel
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list