[libcamera-devel] [PATCH 5/6] libcamera: pipeline: rkisp1: Implement color space support

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Thu Aug 25 23:17:06 CEST 2022


Hi Laurent,

On Thu, Aug 25, 2022 at 11:17:11PM +0300, Laurent Pinchart wrote:
> Hi Paul,
> 
> On Thu, Aug 25, 2022 at 03:08:13PM -0500, paul.elder at ideasonboard.com wrote:
> > On Tue, Aug 23, 2022 at 08:43:13PM +0300, Laurent Pinchart via libcamera-devel wrote:
> > 
> > I think some changelog would be nice to have :)
> 
> Oops :-) I'll add
> 
> Implement color space support in the rkisp1 pipeline handler, in the
> configuration generation, configuration validation and camera
> configuration. As all the processing related to the color space is
> performed in the part of the pipeline shared by all streams, a single
> color space must cover all stream configurations. This is enforced
> manually when generating the configuration, and with the
> validateColorSpaces() helper when validating it.
> 
> Only the Y'CbCr encoding and quantization range are currently taken into
> account, and they are programmed through the V4L2 color space API. The
> primary colors chromaticities and the transfer function need to be
> configured in the ISP parameters buffer, and thus conveyed to the IPA,
> but the rkisp1 driver does not currently support tone mapping, so this
> will be done later.

Looks good.

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>

> 
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > ---
> > >  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 38 ++++++++++++++++++++----
> > >  1 file changed, 33 insertions(+), 5 deletions(-)
> > > 
> > > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > > index 03bbe6b467ae..25fbf9f1a0a9 100644
> > > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > > @@ -18,6 +18,7 @@
> > >  #include <libcamera/base/utils.h>
> > >  
> > >  #include <libcamera/camera.h>
> > > +#include <libcamera/color_space.h>
> > >  #include <libcamera/control_ids.h>
> > >  #include <libcamera/formats.h>
> > >  #include <libcamera/framebuffer.h>
> > > @@ -416,11 +417,13 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
> > >  {
> > >  	const CameraSensor *sensor = data_->sensor_.get();
> > >  	unsigned int pathCount = data_->selfPath_ ? 2 : 1;
> > > -	Status status = Valid;
> > > +	Status status;
> > >  
> > >  	if (config_.empty())
> > >  		return Invalid;
> > >  
> > > +	status = validateColorSpaces(ColorSpaceFlag::StreamsShareColorSpace);
> > > +
> > >  	if (transform != Transform::Identity) {
> > >  		transform = Transform::Identity;
> > >  		status = Adjusted;
> > > @@ -547,21 +550,44 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
> > >  	if (roles.empty())
> > >  		return config;
> > >  
> > > +	/*
> > > +	 * As the ISP can't output different color spaces for the main and self
> > > +	 * path, pick a sensible default color space based on the role of the
> > > +	 * first stream and use it for all streams.
> > > +	 */
> > > +	std::optional<ColorSpace> colorSpace;
> > > +
> > >  	bool mainPathAvailable = true;
> > >  	bool selfPathAvailable = data->selfPath_;
> > > +
> > >  	for (const StreamRole role : roles) {
> > >  		bool useMainPath;
> > >  
> > >  		switch (role) {
> > > -		case StreamRole::StillCapture: {
> > > +		case StreamRole::StillCapture:
> > >  			useMainPath = mainPathAvailable;
> > > +			/* JPEG encoders typically expect sYCC. */
> > > +			if (!colorSpace)
> > > +				colorSpace = ColorSpace::Sycc;
> > >  			break;
> > > -		}
> > > +
> > >  		case StreamRole::Viewfinder:
> > > -		case StreamRole::VideoRecording: {
> > >  			useMainPath = !selfPathAvailable;
> > > +			/*
> > > +			 * sYCC is the YCbCr encoding of sRGB, which is commonly
> > > +			 * used by displays.
> > > +			 */
> > > +			if (!colorSpace)
> > > +				colorSpace = ColorSpace::Sycc;
> > >  			break;
> > > -		}
> > > +
> > > +		case StreamRole::VideoRecording:
> > > +			useMainPath = !selfPathAvailable;
> > > +			/* Rec. 709 is a good default for HD video recording. */
> > > +			if (!colorSpace)
> > > +				colorSpace = ColorSpace::Rec709;
> > > +			break;
> > > +
> > >  		default:
> > >  			LOG(RkISP1, Warning)
> > >  				<< "Requested stream role not supported: " << role;
> > > @@ -580,6 +606,7 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
> > >  			selfPathAvailable = false;
> > >  		}
> > >  
> > > +		cfg.colorSpace = colorSpace;
> > >  		config->addConfiguration(cfg);
> > >  	}
> > >  
> > > @@ -642,6 +669,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
> > >  	if (ret < 0)
> > >  		return ret;
> > >  
> > > +	format.colorSpace = config->at(0).colorSpace;
> > >  	ret = isp_->setFormat(2, &format);
> > >  	if (ret < 0)
> > >  		return ret;
> 
> -- 
> Regards,
> 
> Laurent Pinchart


More information about the libcamera-devel mailing list