summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2022-07-13 13:00:35 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-07-22 00:41:13 +0300
commitc49f47589cbafaa94e2baa53424f32a8755185cd (patch)
treeb8176c408a2fd66ad236263288650605440a94a7
parentd4eee094e684806dbdb54fbe1bc02c9c590aa7f4 (diff)
pipeline: raspberrypi: Improve image/embedded buffer matching logic
The logic used to match asynchronous image and embedded buffers was being overly aggressive by possibly allowing an unmatched image buffer to be sent to the IPA if the matching embedded buffer had not yet been dequeued. This condition only occurs when the system is heavily loaded and dropping frames. Fix this by holding image buffer in the queue during these conditions until the next embedded buffer dequeue event. Reported-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Tested-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/libcamera/pipeline/raspberrypi/raspberrypi.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index c130260f..9d561415 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -2161,16 +2161,12 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em
if (bayerQueue_.empty())
return false;
- /* Start with the front of the bayer queue. */
- bayerFrame = std::move(bayerQueue_.front());
- 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
* current bayer buffer will be removed and re-queued to the driver.
*/
- uint64_t ts = bayerFrame.buffer->metadata().timestamp;
+ uint64_t ts = bayerQueue_.front().buffer->metadata().timestamp;
embeddedBuffer = nullptr;
while (!embeddedQueue_.empty()) {
FrameBuffer *b = embeddedQueue_.front();
@@ -2190,10 +2186,23 @@ bool RPiCameraData::findMatchingBuffers(BayerFrame &bayerFrame, FrameBuffer *&em
}
if (!embeddedBuffer && sensorMetadata_) {
+ if (embeddedQueue_.empty()) {
+ /*
+ * If the embedded buffer queue is empty, wait for the next
+ * buffer to arrive - dequeue ordering may send the image
+ * buffer first.
+ */
+ LOG(RPI, Debug) << "Waiting for next embedded buffer.";
+ return false;
+ }
+
/* Log if there is no matching embedded data buffer found. */
LOG(RPI, Debug) << "Returning bayer frame without a matching embedded buffer.";
}
+ bayerFrame = std::move(bayerQueue_.front());
+ bayerQueue_.pop();
+
return true;
}