[libcamera-devel] [PATCH] libcamera: pipeline: rkisp1: fix crop configuration

Helen Koike helen.koike at collabora.com
Fri Nov 13 12:53:16 CET 2020


Hi Niklas,

On 11/12/20 8:57 PM, Niklas Söderlund wrote:
> Hi Helen,
> 
> Thanks for your work.
> 
> On 2020-11-06 17:32:27 -0300, Helen Koike wrote:
>> Crop rectangle was not being configured on the isp output pad nor in the
>> resizer input pad, causing an unecessary crop in the image and an
>> unecessary scaling by the resizer when streaming with a higher
>> resolution then the default 800x600.
>>
>> Example:
>>     cam -c 1 -C -s width=3280,height=2464
>>
>> In the pipeline:
>>     sensor->isp->resizer->dma_engine
>>
>> isp output crop is set to 800x600, which limits the output format to
>> 800x600, which is propagated to the resizer input format set to 800x600,
>> and the resizer output format is set to the desired end resolution
>> 3280x2464.
>>
>> Signed-off-by: Helen Koike <helen.koike at collabora.com>
>> ---
>>  src/libcamera/pipeline/rkisp1/rkisp1.cpp      | 16 +++++++++++++---
>>  src/libcamera/pipeline/rkisp1/rkisp1_path.cpp |  7 ++++++-
>>  2 files changed, 19 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> index c74a2e9b..10d44400 100644
>> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
>> @@ -698,17 +698,27 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
>>  	if (ret < 0)
>>  		return ret;
>>  
>> -	LOG(RkISP1, Debug) << "ISP input pad configured with " << format.toString();
>> +	LOG(RkISP1, Debug)
>> +		<< "ISP input pad configured with " << format.toString()
>> +		<< " crop " << rect.toString();
>>  
>>  	/* YUYV8_2X8 is required on the ISP source path pad for YUV output. */
>>  	format.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8;
>> -	LOG(RkISP1, Debug) << "Configuring ISP output pad with " << format.toString();
>> +	LOG(RkISP1, Debug)
>> +		<< "Configuring ISP output pad with " << format.toString()
>> +		<< " crop (img stabilizer) " << rect.toString();
> 
> I understand the crop rectangle may be used to implement image 
> stabilization, but it's not yet. Is there any specific reason you 
> mention it here or would it make sens to s/(img stabilizer)// ?

There is no specific reason, just to help identifying which part of the
topology this configuration applies.
We can remove it, no problem.

> 
> For the patch itself,
> 
> Tested-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

Thanks!

> 
> I will wait for us to figure out the best wording here, but I can fix it 
> while applying once we do.

Thanks.
Helen

> 
>> +
>> +	ret = isp_->setSelection(2, V4L2_SEL_TGT_CROP, &rect);
>> +	if (ret < 0)
>> +		return ret;
>>  
>>  	ret = isp_->setFormat(2, &format);
>>  	if (ret < 0)
>>  		return ret;
>>  
>> -	LOG(RkISP1, Debug) << "ISP output pad configured with " << format.toString();
>> +	LOG(RkISP1, Debug)
>> +		<< "ISP output pad configured with " << format.toString()
>> +		<< " crop (img stabilizer) " << rect.toString();
>>  
>>  	for (const StreamConfiguration &cfg : *config) {
>>  		if (cfg.stream() == &data->mainPathStream_)
>> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
>> index e98515c8..50c0747c 100644
>> --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
>> +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp
>> @@ -117,9 +117,14 @@ int RkISP1Path::configure(const StreamConfiguration &config,
>>  	if (ret < 0)
>>  		return ret;
>>  
>> +	Rectangle rect(0, 0, ispFormat.size);
>> +	ret = resizer_->setSelection(0, V4L2_SEL_TGT_CROP, &rect);
>> +	if (ret < 0)
>> +		return ret;
>> +
>>  	LOG(RkISP1, Debug)
>>  		<< "Configured " << name_ << " resizer input pad with "
>> -		<< ispFormat.toString();
>> +		<< ispFormat.toString() << " crop " << rect.toString();
>>  
>>  	ispFormat.size = config.size;
>>  
>> -- 
>> 2.29.2
>>
> 


More information about the libcamera-devel mailing list