Camera: re-space camera output for hardware texture target
2 issues with overriding presentation timestamp for SurfaceTexture:
- We cannot override timestamp for SurfaceTexture, because the timestamp
may be used for AV sync.
- TextureView always picks the latest buffer and display it right away
without using the presentation timestamp.
Due to these reasons, the cameraservice re-spaces queuing of the buffer
based on capture time intervals rather than overriding timestamps.
The buffer timestamp is left untouched.
Test: Run Instagram, Snapchat, and Tiktok and observe improved preview
Test: Camera CTS
Bug: 195025014
Change-Id: I28b23d9f2b39b6a289b6d9f87968e4bc667870a4
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h
index 6ea7ef7..e68bc67 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.h
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h
@@ -28,6 +28,7 @@
#include "Camera3IOStreamBase.h"
#include "Camera3OutputStreamInterface.h"
#include "Camera3BufferManager.h"
+#include "PreviewFrameSpacer.h"
namespace android {
@@ -250,6 +251,7 @@
static void applyZSLUsageQuirk(int format, uint64_t *consumerUsage /*inout*/);
void setImageDumpMask(int mask) { mImageDumpMask = mask; }
+ bool shouldLogError(status_t res);
protected:
Camera3OutputStream(int id, camera_stream_type_t type,
@@ -282,7 +284,7 @@
status_t getEndpointUsageForSurface(uint64_t *usage,
const sp<Surface>& surface) const;
- status_t configureConsumerQueueLocked(bool allowDisplaySync);
+ status_t configureConsumerQueueLocked(bool allowPreviewRespace);
// Consumer as the output of camera HAL
sp<Surface> mConsumer;
@@ -396,15 +398,14 @@
void returnPrefetchedBuffersLocked();
- // Synchronize camera timestamp to display, and the return value
- // can be used as presentation timestamp
- nsecs_t syncTimestampToDisplayLocked(nsecs_t t);
static const int32_t kDequeueLatencyBinSize = 5; // in ms
CameraLatencyHistogram mDequeueBufferLatency;
int mImageDumpMask = 0;
+ // Re-space frames by overriding timestamp to align with display Vsync.
+ // Default is on for SurfaceView bound streams.
nsecs_t mMinExpectedDuration = 0;
bool mSyncToDisplay = false;
DisplayEventReceiver mDisplayEventReceiver;
@@ -414,6 +415,12 @@
static constexpr size_t kDisplaySyncExtraBuffer = 2;
static constexpr nsecs_t kSpacingResetIntervalNs = 1000000000LL; // 1 second
static constexpr nsecs_t kTimelineThresholdNs = 1000000LL; // 1 millisecond
+ nsecs_t syncTimestampToDisplayLocked(nsecs_t t);
+
+ // Re-space frames by delaying queueBuffer so that frame delivery has
+ // the same cadence as capture. Default is on for SurfaceTexture bound
+ // streams.
+ sp<PreviewFrameSpacer> mPreviewFrameSpacer;
}; // class Camera3OutputStream
} // namespace camera3