@@ -32,6 +32,15 @@
# Override any request from the IPA to drop a number of startup
# frames.
#
- # "disable_startup_frame_drops": false
+ # "disable_startup_frame_drops": false,
+
+ # Custom timeout value (in ms) for Unicam to use. This overrides
+ # the value computed by the pipeline handler based on frame
+ # durations.
+ #
+ # Set this value to 0 to use the pipeline handler computed
+ # timeout value.
+ #
+ # "unicam_timeout_value_ms": 0
}
}
@@ -319,6 +319,11 @@ public:
* frames.
*/
bool disableStartupFrameDrops;
+ /*
+ * Override the Unicam timeout value calculated by the IPA based
+ * on frame durations.
+ */
+ unsigned int unicamTimeoutValue;
};
Config config_;
@@ -1158,6 +1163,9 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
data->state_ = RPiCameraData::State::Idle;
+ if (data->config_.unicamTimeoutValue)
+ data->setCameraTimeout(data->config_.unicamTimeoutValue);
+
/* Start all streams. */
for (auto const stream : data->streams_) {
ret = stream->dev()->streamOn();
@@ -1715,6 +1723,7 @@ int RPiCameraData::loadPipelineConfiguration()
.minUnicamBuffers = 2,
.minTotalUnicamBuffers = 4,
.disableStartupFrameDrops = false,
+ .unicamTimeoutValue = 0,
};
char const *configFromEnv = utils::secure_getenv("LIBCAMERA_RPI_CONFIG_FILE");
@@ -1750,6 +1759,8 @@ int RPiCameraData::loadPipelineConfiguration()
phConfig["min_total_unicam_buffers"].get<unsigned int>(config_.minTotalUnicamBuffers);
config_.disableStartupFrameDrops =
phConfig["disable_startup_frame_drops"].get<bool>(config_.disableStartupFrameDrops);
+ config_.unicamTimeoutValue =
+ phConfig["unicam_timeout_value_ms"].get<unsigned int>(config_.unicamTimeoutValue);
if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {
LOG(RPI, Error) << "Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers";
@@ -1953,13 +1964,17 @@ 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);
+ utils::Duration timeout;
+
+ if (!config_.unicamTimeoutValue) {
+ /*
+ * 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.
+ */
+ timeout = std::max<utils::Duration>(1s, 5 * maxFrameLengthMs * 1ms);
+ } else
+ timeout = config_.unicamTimeoutValue * 1ms;
LOG(RPI, Debug) << "Setting Unicam timeout to " << timeout;
unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);