mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 23:39:44 +03:00
pipeline: ipa: raspberrypi: Change Unicam timeout handling
Add an explicit helper function setCameraTimeout() in the pipeline handler to set the Unicam timeout value. This function is signalled from the IPA to set up an appropriate timeout. This replaces the maxSensorFrameLengthMs value parameter returned back from IPARPi::start(). Adjust the timeout to be 5x the maximum frame duration reported by the IPA. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
cde9293cf9
commit
b6d84ed456
3 changed files with 18 additions and 10 deletions
|
@ -49,7 +49,6 @@ struct IPAConfigResult {
|
||||||
struct StartConfig {
|
struct StartConfig {
|
||||||
libcamera.ControlList controls;
|
libcamera.ControlList controls;
|
||||||
int32 dropFrameCount;
|
int32 dropFrameCount;
|
||||||
uint32 maxSensorFrameLengthMs;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
interface IPARPiInterface {
|
interface IPARPiInterface {
|
||||||
|
@ -132,4 +131,5 @@ interface IPARPiEventInterface {
|
||||||
setIspControls(libcamera.ControlList controls);
|
setIspControls(libcamera.ControlList controls);
|
||||||
setDelayedControls(libcamera.ControlList controls, uint32 delayContext);
|
setDelayedControls(libcamera.ControlList controls, uint32 delayContext);
|
||||||
setLensControls(libcamera.ControlList controls);
|
setLensControls(libcamera.ControlList controls);
|
||||||
|
setCameraTimeout(uint32 maxFrameLengthMs);
|
||||||
};
|
};
|
||||||
|
|
|
@ -341,7 +341,7 @@ void IPARPi::start(const ControlList &controls, StartConfig *startConfig)
|
||||||
|
|
||||||
startConfig->dropFrameCount = dropFrameCount_;
|
startConfig->dropFrameCount = dropFrameCount_;
|
||||||
const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.maxLineLength;
|
const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.maxLineLength;
|
||||||
startConfig->maxSensorFrameLengthMs = maxSensorFrameDuration.get<std::milli>();
|
setCameraTimeout.emit(maxSensorFrameDuration.get<std::milli>());
|
||||||
|
|
||||||
firstStart_ = false;
|
firstStart_ = false;
|
||||||
lastRunTimestamp_ = 0;
|
lastRunTimestamp_ = 0;
|
||||||
|
|
|
@ -212,6 +212,7 @@ public:
|
||||||
void setIspControls(const ControlList &controls);
|
void setIspControls(const ControlList &controls);
|
||||||
void setDelayedControls(const ControlList &controls, uint32_t delayContext);
|
void setDelayedControls(const ControlList &controls, uint32_t delayContext);
|
||||||
void setLensControls(const ControlList &controls);
|
void setLensControls(const ControlList &controls);
|
||||||
|
void setCameraTimeout(uint32_t maxExposureTimeMs);
|
||||||
void setSensorControls(ControlList &controls);
|
void setSensorControls(ControlList &controls);
|
||||||
void unicamTimeout();
|
void unicamTimeout();
|
||||||
|
|
||||||
|
@ -1166,14 +1167,6 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the dequeue timeout to the larger of 2x the maximum possible
|
|
||||||
* frame duration or 1 second.
|
|
||||||
*/
|
|
||||||
utils::Duration timeout =
|
|
||||||
std::max<utils::Duration>(1s, 2 * startConfig.maxSensorFrameLengthMs * 1ms);
|
|
||||||
data->unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1645,6 +1638,7 @@ int RPiCameraData::loadIPA(ipa::RPi::IPAInitResult *result)
|
||||||
ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);
|
ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);
|
||||||
ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);
|
ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);
|
||||||
ipa_->setLensControls.connect(this, &RPiCameraData::setLensControls);
|
ipa_->setLensControls.connect(this, &RPiCameraData::setLensControls);
|
||||||
|
ipa_->setCameraTimeout.connect(this, &RPiCameraData::setCameraTimeout);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The configuration (tuning file) is made from the sensor name unless
|
* The configuration (tuning file) is made from the sensor name unless
|
||||||
|
@ -1957,6 +1951,20 @@ void RPiCameraData::setLensControls(const ControlList &controls)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RPiCameraData::setCameraTimeout(uint32_t maxFrameLengthMs)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Set the dequeue timeout to the larger of 5x the maximum reported
|
||||||
|
* frame length advertised by the IPA over a number of frames. Allow
|
||||||
|
* a minimum timeout value of 1s.
|
||||||
|
*/
|
||||||
|
utils::Duration timeout =
|
||||||
|
std::max<utils::Duration>(1s, 5 * maxFrameLengthMs * 1ms);
|
||||||
|
|
||||||
|
LOG(RPI, Debug) << "Setting Unicam timeout to " << timeout;
|
||||||
|
unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
void RPiCameraData::setSensorControls(ControlList &controls)
|
void RPiCameraData::setSensorControls(ControlList &controls)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue