QCamera2: HAL3: handle out of order buffers correctly
Sometimes, the stream buffers come in disorder,
treat the disordered frames as error frames.
Test: Camera CTS
Bug: 37657585
Change-Id: I910153e9216ed7a83648663176c58d3696b27107
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index eced938..df38002 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -841,7 +841,26 @@
if (mOutOfSequenceBuffers.empty()) {
stream->cancelBuffer(oldestBufIndex);
}
- mOutOfSequenceBuffers.push_back(super_frame);
+
+ //push in order!
+ auto itr = mOutOfSequenceBuffers.begin();
+ for (; itr != mOutOfSequenceBuffers.end(); itr++) {
+ mm_camera_super_buf_t *super_buf = *itr;
+ uint32_t buf_idx = super_buf->bufs[0]->buf_idx;
+ int32_t frame_num = mMemory.getFrameNumber(buf_idx);
+ if (resultFrameNumber < frame_num) {
+ LOGE("Out of order frame!! set buffer status error flag!");
+ mOutOfSequenceBuffers.insert(itr, super_frame);
+ super_buf->bufs[0]->flags |= V4L2_BUF_FLAG_ERROR;
+ break;
+ }
+ }
+
+ if (itr == mOutOfSequenceBuffers.end()) {
+ LOGE("Add the frame to the end of mOutOfSequenceBuffers");
+ // add the buffer
+ mOutOfSequenceBuffers.push_back(super_frame);
+ }
return;
}