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

Stanislaw Gruszka stanislaw.gruszka at linux.intel.com
Wed Apr 2 11:08:24 CEST 2025


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 ? 

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