Camera: Narrow down cases preview spacer is used
HW_TEXTURE usage flag may be used for ImageReader. Do not treat the
surface as SurfaceTexture if the surface has CPU read flag at the
same time.
In addition:
- Only enable preview spacer if timestamp base is DEFAULT,
- Use readoutTimestamp for re-spacing.
- Remove the system property to disable frame spacing.
Test: Camera CTS, Observe smoother GCA photo preview
Bug: 195025014
Change-Id: I40a3b1acac44ed8a474aad94b77aee8f7399eb31
Merged-In: I40a3b1acac44ed8a474aad94b77aee8f7399eb31
diff --git a/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp b/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
index 9112b93..496580f 100644
--- a/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
+++ b/services/camera/libcameraservice/device3/PreviewFrameSpacer.cpp
@@ -36,12 +36,12 @@
Thread::requestExitAndWait();
}
-status_t PreviewFrameSpacer::queuePreviewBuffer(nsecs_t timestamp, int32_t transform,
- ANativeWindowBuffer* anwBuffer, int releaseFence) {
+status_t PreviewFrameSpacer::queuePreviewBuffer(nsecs_t timestamp, nsecs_t readoutTimestamp,
+ int32_t transform, ANativeWindowBuffer* anwBuffer, int releaseFence) {
Mutex::Autolock l(mLock);
- mPendingBuffers.emplace(timestamp, transform, anwBuffer, releaseFence);
- ALOGV("%s: mPendingBuffers size %zu, timestamp %" PRId64, __FUNCTION__,
- mPendingBuffers.size(), timestamp);
+ mPendingBuffers.emplace(timestamp, readoutTimestamp, transform, anwBuffer, releaseFence);
+ ALOGV("%s: mPendingBuffers size %zu, timestamp %" PRId64 ", readoutTime %" PRId64,
+ __FUNCTION__, mPendingBuffers.size(), timestamp, readoutTimestamp);
mBufferCond.signal();
return OK;
@@ -56,17 +56,17 @@
nsecs_t currentTime = systemTime();
auto buffer = mPendingBuffers.front();
- nsecs_t captureInterval = buffer.timestamp - mLastCameraCaptureTime;
- // If the capture interval exceeds threshold, directly queue
+ nsecs_t readoutInterval = buffer.readoutTimestamp - mLastCameraReadoutTime;
+ // If the readout interval exceeds threshold, directly queue
// cached buffer.
- if (captureInterval >= kFrameIntervalThreshold) {
+ if (readoutInterval >= kFrameIntervalThreshold) {
mPendingBuffers.pop();
queueBufferToClientLocked(buffer, currentTime);
return true;
}
- // Cache the frame to match capture time interval, for up to 33ms
- nsecs_t expectedQueueTime = mLastCameraPresentTime + captureInterval;
+ // Cache the frame to match readout time interval, for up to 33ms
+ nsecs_t expectedQueueTime = mLastCameraPresentTime + readoutInterval;
nsecs_t frameWaitTime = std::min(kMaxFrameWaitTime, expectedQueueTime - currentTime);
if (frameWaitTime > 0 && mPendingBuffers.size() < 2) {
mBufferCond.waitRelative(mLock, frameWaitTime);
@@ -75,8 +75,8 @@
}
currentTime = systemTime();
}
- ALOGV("%s: captureInterval %" PRId64 ", queueInterval %" PRId64 ", waited for %" PRId64
- ", timestamp %" PRId64, __FUNCTION__, captureInterval,
+ ALOGV("%s: readoutInterval %" PRId64 ", queueInterval %" PRId64 ", waited for %" PRId64
+ ", timestamp %" PRId64, __FUNCTION__, readoutInterval,
currentTime - mLastCameraPresentTime, frameWaitTime, buffer.timestamp);
mPendingBuffers.pop();
queueBufferToClientLocked(buffer, currentTime);
@@ -114,7 +114,7 @@
}
mLastCameraPresentTime = currentTime;
- mLastCameraCaptureTime = bufferHolder.timestamp;
+ mLastCameraReadoutTime = bufferHolder.readoutTimestamp;
}
}; // namespace camera3