[libcamera-devel,v3,3/3] pipeline: raspberrypi: Add a Unicam timeout override config options
diff mbox series

Message ID 20230307103023.3932-4-naush@raspberrypi.com
State Superseded
Headers show
Series
  • Raspberry Pi: Improving camera timeouts
Related show

Commit Message

Naushir Patuck March 7, 2023, 10:30 a.m. UTC
Add a new parameter to the pipeline handler config file named
"unicam_timeout_value_ms" to allow users to override the automatically
computed Unicam timeout value.

This value is given in milliseconds, and setting a value of 0 (the
default value) disables the override.

An example use of this parameter would be if an application configured a
RAW stream, and provides buffers for the stream on every request. If the
application holds off on sending requests for a particular reason (e.g.
a timelapse use case), then we will possibly hit the watchdog timeout as
it is only a small multiple of the frame length. This override allows an
application to select a larger value with the knowledge that it may
space requests longer than the calculated timeout value.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
---
 .../pipeline/raspberrypi/data/example.yaml         | 11 ++++++++++-
 src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 14 ++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml b/src/libcamera/pipeline/raspberrypi/data/example.yaml
index ad5f2344384f..c90f518f8849 100644
--- a/src/libcamera/pipeline/raspberrypi/data/example.yaml
+++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml
@@ -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,
         }
 }
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 3d04842a2440..58bab6b6e0d5 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -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_;
@@ -1715,6 +1720,7 @@  int RPiCameraData::loadPipelineConfiguration()
 		.minUnicamBuffers = 2,
 		.minTotalUnicamBuffers = 4,
 		.disableStartupFrameDrops = false,
+		.unicamTimeoutValue = 0,
 	};
 
 	char const *configFromEnv = utils::secure_getenv("LIBCAMERA_RPI_CONFIG_FILE");
@@ -1750,6 +1756,14 @@  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_.unicamTimeoutValue) {
+		/* Disable the IPA signal to control timeout and set the user requested value. */
+		ipa_->setCameraTimeout.disconnect();
+		unicam_[Unicam::Image].dev()->setDequeueTimeout(config_.unicamTimeoutValue * 1ms);
+	}
 
 	if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {
 		LOG(RPI, Error) << "Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers";