Message ID | 20250305135256.801351-3-stanislaw.gruszka@linux.intel.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Stanislaw, Thank you for the patch. On Wed, Mar 05, 2025 at 02:52:53PM +0100, Stanislaw Gruszka wrote: > The frameStart signal from the frame start emitter is connected in the > configure() function, and is never disconnected. This means that each > time the camera is configured a new connection is made, causing the > DelayedControls::applyControls() to be called multiple times. Fix it by > connecting and disconnecting the signal when starting and stopping the > camera. > > Co-developed-by: Hans de Goede <hdegoede@redhat.com> > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > Co-developed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Signed-off-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com> Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> Cheers, Stefan > --- > src/libcamera/pipeline/simple/simple.cpp | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp > index 6e039bf3..8345a771 100644 > --- a/src/libcamera/pipeline/simple/simple.cpp > +++ b/src/libcamera/pipeline/simple/simple.cpp > @@ -1285,8 +1285,6 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) > data->delayedCtrls_ = > std::make_unique<DelayedControls>(data->sensor_->device(), > params); > - data->video_->frameStart.connect(data->delayedCtrls_.get(), > - &DelayedControls::applyControls); > > StreamConfiguration inputCfg; > inputCfg.pixelFormat = pipeConfig->captureFormat; > @@ -1354,6 +1352,9 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL > > video->bufferReady.connect(data, &SimpleCameraData::imageBufferReady); > > + data->video_->frameStart.connect(data->delayedCtrls_.get(), > + &DelayedControls::applyControls); > + > ret = video->streamOn(); > if (ret < 0) { > stop(camera); > @@ -1386,6 +1387,9 @@ void SimplePipelineHandler::stopDevice(Camera *camera) > SimpleCameraData *data = cameraData(camera); > V4L2VideoDevice *video = data->video_; > > + data->video_->frameStart.disconnect(data->delayedCtrls_.get(), > + &DelayedControls::applyControls); > + > if (data->useConversion_) { > if (data->converter_) > data->converter_->stop(); > -- > 2.43.0 >
diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 6e039bf3..8345a771 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -1285,8 +1285,6 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c) data->delayedCtrls_ = std::make_unique<DelayedControls>(data->sensor_->device(), params); - data->video_->frameStart.connect(data->delayedCtrls_.get(), - &DelayedControls::applyControls); StreamConfiguration inputCfg; inputCfg.pixelFormat = pipeConfig->captureFormat; @@ -1354,6 +1352,9 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL video->bufferReady.connect(data, &SimpleCameraData::imageBufferReady); + data->video_->frameStart.connect(data->delayedCtrls_.get(), + &DelayedControls::applyControls); + ret = video->streamOn(); if (ret < 0) { stop(camera); @@ -1386,6 +1387,9 @@ void SimplePipelineHandler::stopDevice(Camera *camera) SimpleCameraData *data = cameraData(camera); V4L2VideoDevice *video = data->video_; + data->video_->frameStart.disconnect(data->delayedCtrls_.get(), + &DelayedControls::applyControls); + if (data->useConversion_) { if (data->converter_) data->converter_->stop();