Camera: Disable surface usage caching for external surfaces
Calls to 'getEndpointUsageForSurface' may pass a reference
to a surface that is external (not equal to 'mConsumer').
Caching the usage value in this scenario must be avoided.
Bug: 332417443
Test: atest CtsCameraTestCases:android.hardware.camera2.cts.RecordingTest#testVideoPreviewSurfaceSharing
Change-Id: Ie10dae67385560c7825b6a4e36171da683ceef2c
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index 8c6fa8f..3cd4543 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -1030,7 +1030,8 @@
status_t Camera3OutputStream::getEndpointUsageForSurface(uint64_t *usage,
const sp<Surface>& surface) {
- if (mConsumerUsageCachedValue.has_value() && flags::surface_ipc()) {
+ bool internalConsumer = (mConsumer.get() != nullptr) && (mConsumer == surface);
+ if (mConsumerUsageCachedValue.has_value() && flags::surface_ipc() && internalConsumer) {
*usage = mConsumerUsageCachedValue.value();
return OK;
}
@@ -1039,7 +1040,9 @@
res = native_window_get_consumer_usage(static_cast<ANativeWindow*>(surface.get()), usage);
applyZSLUsageQuirk(camera_stream::format, usage);
- mConsumerUsageCachedValue = *usage;
+ if (internalConsumer) {
+ mConsumerUsageCachedValue = *usage;
+ }
return res;
}