pipeline: simple: Connect/disconnect frameStart signal at start/stop time

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.

Reviewed-by: Stefan Klug <stefan.klug@ideasonboard.com> # v6
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: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Stanislaw Gruszka 2025-04-03 09:45:48 +02:00 committed by Kieran Bingham
parent b2eccef711
commit 2f7bece17b

View file

@ -1371,8 +1371,6 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
data->delayedCtrls_ = data->delayedCtrls_ =
std::make_unique<DelayedControls>(data->sensor_->device(), std::make_unique<DelayedControls>(data->sensor_->device(),
params); params);
data->video_->frameStart.connect(data->delayedCtrls_.get(),
&DelayedControls::applyControls);
StreamConfiguration inputCfg; StreamConfiguration inputCfg;
inputCfg.pixelFormat = pipeConfig->captureFormat; inputCfg.pixelFormat = pipeConfig->captureFormat;
@ -1440,6 +1438,9 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL
video->bufferReady.connect(data, &SimpleCameraData::imageBufferReady); video->bufferReady.connect(data, &SimpleCameraData::imageBufferReady);
data->video_->frameStart.connect(data->delayedCtrls_.get(),
&DelayedControls::applyControls);
ret = video->streamOn(); ret = video->streamOn();
if (ret < 0) { if (ret < 0) {
stop(camera); stop(camera);
@ -1472,6 +1473,9 @@ void SimplePipelineHandler::stopDevice(Camera *camera)
SimpleCameraData *data = cameraData(camera); SimpleCameraData *data = cameraData(camera);
V4L2VideoDevice *video = data->video_; V4L2VideoDevice *video = data->video_;
data->video_->frameStart.disconnect(data->delayedCtrls_.get(),
&DelayedControls::applyControls);
if (data->useConversion_) { if (data->useConversion_) {
if (data->converter_) if (data->converter_)
data->converter_->stop(); data->converter_->stop();