Camera: Treat decreasing timestamp as BUFFER_ERROR
Decreasing timestamp shouldn't happen in non ZSL or reprocessing case.
When that happens, treat the buffer as error and return to buffer queue
directly.
Test: Camera CTS
Bug: 113670946
Change-Id: I39d3417dd9307d6cc7c90ff357a82604566a9081
diff --git a/services/camera/libcameraservice/device3/Camera3Stream.cpp b/services/camera/libcameraservice/device3/Camera3Stream.cpp
index b208d9f..9238590 100644
--- a/services/camera/libcameraservice/device3/Camera3Stream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Stream.cpp
@@ -662,9 +662,12 @@
removeOutstandingBuffer(buffer);
+ // Buffer status may be changed, so make a copy of the stream_buffer struct.
+ camera3_stream_buffer b = buffer;
if (timestampIncreasing && timestamp != 0 && timestamp <= mLastTimestamp) {
- ALOGW("%s: Stream %d: timestamp %" PRId64 " is not increasing. Prev timestamp %" PRId64,
+ ALOGE("%s: Stream %d: timestamp %" PRId64 " is not increasing. Prev timestamp %" PRId64,
__FUNCTION__, mId, timestamp, mLastTimestamp);
+ b.status = CAMERA3_BUFFER_STATUS_ERROR;
}
mLastTimestamp = timestamp;
@@ -676,9 +679,9 @@
*
* Do this for getBuffer as well.
*/
- status_t res = returnBufferLocked(buffer, timestamp);
+ status_t res = returnBufferLocked(b, timestamp);
if (res == OK) {
- fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/true);
+ fireBufferListenersLocked(b, /*acquired*/false, /*output*/true);
}
// Even if returning the buffer failed, we still want to signal whoever is waiting for the