[PATCH v6 3/5] pipeline: simple: Enable frame start events

Stefan Klug stefan.klug at ideasonboard.com
Wed Apr 2 16:00:59 CEST 2025


Hi Stanislaw,

On Wed, Apr 02, 2025 at 11:08:24AM +0200, Stanislaw Gruszka wrote:
> Hi Stefan,
> 
> thanks for the review.
> 
> On Mon, Mar 31, 2025 at 05:52:16PM +0200, Stefan Klug wrote:
> > > @@ -897,8 +912,18 @@ void SimpleCameraData::ispStatsReady(uint32_t frame, uint32_t bufferId)
> > >  void SimpleCameraData::setSensorControls(const ControlList &sensorControls)
> > >  {
> > >  	delayedCtrls_->push(sensorControls);
> > > -	ControlList ctrls(sensorControls);
> > > -	sensor_->setControls(&ctrls);
> > > +	/*
> > > +         * Directly apply controls now if there is no frameStart signal.
> > > +	 *
> > > +	 * \todo Applying controls directly not only increases the risk of
> > > +	 * applying them to the wrong frame (or across a frame boundary),
> > > +	 * but it also bypasses delayedCtrls_, creating AGC regulation issues.
> > > +	 * Both problems should be fixed.
> > > +	 */
> > > +	if (!frameStartEmitter_) {
> > > +		ControlList ctrls(sensorControls);
> > > +		sensor_->setControls(&ctrls);
> > > +	}
> > 
> > If I get it right, we don't use delayedControls::applyControls() here
> > because we don't have the sequence number available. Wouldn't it be
> > better to reduce this to delayedControls_->push()
> > 
> > and to add a
> > 
> > if(!frameStartEmitter_) {
> > 	delayedControls_::applyControls(buffer->metadata().sequence);
> > }
> > 
> > to SimpleCameraData::imageBufferReady().
> > 
> > then we get the "per control delays" from delayed controls. Timing might
> > still be off, but it would be the best we can do for now.
> 
> I'm testing below change and sometimes get strange low frequency flickering.
> 
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 659b1123a717..c71bacc90bfb 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -597,7 +597,7 @@ int SimpleCameraData::init()
>  		LOG(SimplePipeline, Debug)
>  			<< "Using frameStart signal from '"
>  			<< entity.entity->name() << "'";
> -		frameStartEmitter_ = sd;
> +		// frameStartEmitter_ = sd;
>  		break;
>  	}
>  
> @@ -851,6 +851,10 @@ void SimpleCameraData::imageBufferReady(FrameBuffer *buffer)
>  		}
>  	}
>  
> +	if (!frameStartEmitter_) {
> +		delayedCtrls_->applyControls(buffer->metadata().sequence);
> +	}
> +
>  	if (request)
>  		request->metadata().set(controls::SensorTimestamp,
>  					buffer->metadata().timestamp);
> @@ -927,10 +931,10 @@ void SimpleCameraData::setSensorControls(const ControlList &sensorControls)
>  	 * but it also bypasses delayedCtrls_, creating AGC regulation issues.
>  	 * Both problems should be fixed.
>  	 */
> -	if (!frameStartEmitter_) {
> -		ControlList ctrls(sensorControls);
> -		sensor_->setControls(&ctrls);
> -	}
> +	// if (!frameStartEmitter_) {
> +	// 	ControlList ctrls(sensorControls);
> +	// 	sensor_->setControls(&ctrls);
> +	// }
>  }
>  
>  /* Retrieve all source pads connected to a sink pad through active routes. */
> 
> Could we apply this one for now with \todo and do
> applyControls(buffer->metadata().sequence) change later on top,
> once I figure out why I'm getting the flickering ? 

Thanks for testing that out. I'm fine with merging this and doing the
rest later (There was a bit of hope it could "just work"). There are
also some changes and fixes to delayed controls in my pipeline that I
hope to post as an RFC in the not too far future.

So

Reviewed-by: Stefan Klug <stefan.klug at ideasonboard.com> 

Best regards,
Stefan

> 
> I think that should be fine as this patch does not change existing
> behaviour for !frameStartEmitter case.
> 
> Regards
> Stanislaw
> 


More information about the libcamera-devel mailing list