[libcamera-devel] [PATCH 1/3] libcamera: ipu3: Fix RAW+YUV capture

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Sep 29 01:22:11 CEST 2020


On Tue, Sep 29, 2020 at 02:20:27AM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
> 
> Thank you for the patch.
> 
> On Thu, Sep 24, 2020 at 04:51:41PM +0200, Jacopo Mondi wrote:
> > When requesting one RAW stream and one YUV stream the
> > StreamConfiguration assigned to the RAW stream is the first one
> > added to the CameraConfiguration, while the YUV stream gets assigned to
> > the main output.
> > 
> > At configure() time the viewfinder output needs to be configured with
> > the same format as the main output, but since the introduction of RAW
> > capture support, the pipeline has not been updated and still assumes
> > the main output configuration is the first one in the
> > CameraConfiguration. This causes the viewfinder to be configured
> > with the same format as the raw stream, breaking capture operations.
> 
> Oops... You mentioned no CTS regression, is there also no CTS tests
> fixed by this ?
> 
> > Before this commit the following command fails and the ImgU does not
> > produce frames:
> > cam -srole=stillraw -srole=viewfinder -c2 -C
> > 
> > Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 20 +++++++++-----------
> >  1 file changed, 9 insertions(+), 11 deletions(-)
> > 
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index 221259c7fe61..9cea6c7e9611 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -476,25 +476,23 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> >  		return ret;
> >  
> >  	/* Apply the format to the configured streams output devices. */
> > -	bool outActive = false;
> > -	bool vfActive = false;
> > +	StreamConfiguration *mainCfg = nullptr;
> > +	StreamConfiguration *vfCfg = nullptr;
> >  
> >  	for (unsigned int i = 0; i < config->size(); ++i) {
> >  		StreamConfiguration &cfg = (*config)[i];
> >  		Stream *stream = cfg.stream();
> >  
> >  		if (stream == outStream) {
> > +			mainCfg = &cfg;
> >  			ret = imgu->configureOutput(cfg, &outputFormat);
> >  			if (ret)
> >  				return ret;
> > -
> > -			outActive = true;
> >  		} else if (stream == vfStream) {
> > +			vfCfg = &cfg;
> >  			ret = imgu->configureViewfinder(cfg, &outputFormat);
> >  			if (ret)
> >  				return ret;
> > -
> > -			vfActive = true;
> >  		}
> >  	}
> >  
> > @@ -503,14 +501,14 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> >  	 * the configuration of the active one for that purpose (there should
> >  	 * be at least one active stream in the configuration request).
> >  	 */
> > -	if (!outActive) {
> > -		ret = imgu->configureOutput(config->at(0), &outputFormat);
> > +	if (!mainCfg) {
> > +		ret = imgu->configureOutput(*vfCfg, &outputFormat);
> 
> What if the only stream requested is the raw stream ? Won't both mainCfg
> and vfCfg be null ?

Scratch this, there's a check above the returns early if only a raw
stream is requested.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>


> >  		if (ret)
> >  			return ret;
> >  	}
> >  
> > -	if (!vfActive) {
> > -		ret = imgu->configureViewfinder(config->at(0), &outputFormat);
> > +	if (!vfCfg) {
> > +		ret = imgu->configureViewfinder(*mainCfg, &outputFormat);
> >  		if (ret)
> >  			return ret;
> >  	}
> > @@ -529,7 +527,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
> >  	/* Apply the "pipe_mode" control to the ImgU subdevice. */
> >  	ControlList ctrls(imgu->imgu_->controls());
> >  	ctrls.set(V4L2_CID_IPU3_PIPE_MODE,
> > -		  static_cast<int32_t>(vfActive ? IPU3PipeModeVideo :
> > +		  static_cast<int32_t>(vfCfg ? IPU3PipeModeVideo :
> >  				       IPU3PipeModeStillCapture));
> >  	ret = imgu->imgu_->setControls(&ctrls);
> >  	if (ret) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list