@@ -19,6 +19,11 @@
# Override any request from the IPA to drop a number of startup
# frames.
- "disable_startup_frame_drops": false
+ "disable_startup_frame_drops": false,
+
+ # Always process a pending request with the last captured sensor
+ # frame. Note that this might lead to avoidable frame drops
+ # during periods of transient heavy CPU loading.
+ "return_newest_frames": false
}
}
@@ -313,6 +313,11 @@ public:
* frames.
*/
bool disableStartupFrameDrops;
+ /*
+ * Always process a pending request with the last captured sensor
+ * frame.
+ */
+ bool returnNewestFrames;
};
Config config_;
@@ -1730,6 +1735,7 @@ int RPiCameraData::configurePipeline()
.minUnicamBuffers = 2,
.minTotalUnicamBuffers = 4,
.disableStartupFrameDrops = false,
+ .returnNewestFrames = false,
};
char const *configFromEnv = utils::secure_getenv("LIBCAMERA_RPI_CONFIG_FILE");
@@ -1765,6 +1771,8 @@ int RPiCameraData::configurePipeline()
phConfig["min_total_unicam_buffers"].get<unsigned int>(config_.minTotalUnicamBuffers);
config_.disableStartupFrameDrops =
phConfig["disable_startup_frame_drops"].get<bool>(config_.disableStartupFrameDrops);
+ config_.returnNewestFrames =
+ phConfig["return_newest_frames"].get<bool>(config_.returnNewestFrames);
if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {
LOG(RPI, Error) << "Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers";
@@ -2354,6 +2362,21 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em
if (bayerQueue_.empty())
return false;
+ /*
+ * If the pipeline is configured to only ever return the most recently
+ * captured frame, empty the buffer queue until a single element is
+ * left, corresponding to the most recent buffer. Note that this will
+ * likely result in possibly avoidable dropped frames.
+ */
+ if (config_.returnNewestFrames && !unicam_[Unicam::Image].isExternal()) {
+ while (bayerQueue_.size() > 1) {
+ FrameBuffer *bayer = bayerQueue_.front().buffer;
+
+ unicam_[Unicam::Image].returnBuffer(bayer);
+ bayerQueue_.pop();
+ }
+ }
+
/*
* Find the embedded data buffer with a matching timestamp to pass to
* the IPA. Any embedded buffers with a timestamp lower than the