Camera: Mark streams unpreparable when using HAL buffer management
With CameraHal buffer management enabled there is a window of
opportunity where camera clients will be able to prepare streams
that already have submitted capture requests. Depending on timing
if the client is able to trigger prepare immediately after
submitting a capture request, then CameraHal might not be able to
request a buffer quickly enough and the prepare operation will
succeed which contradicts the public API guarantees.
To avoid this, mark the requested stream as unpreparable before
sending the request over to CameraHal.
Bug: 162884320
Test: Camera CTS
Change-Id: If9678fe440a5fbf12a6b2e424b9e63dd40d91fa8
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 8754ad3..1b36b93 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -4686,6 +4686,10 @@
buffer.status = CAMERA3_BUFFER_STATUS_OK;
buffer.acquire_fence = -1;
buffer.release_fence = -1;
+ // Mark the output stream as unpreparable to block clients from calling
+ // 'prepare' after this request reaches CameraHal and before the respective
+ // buffers are requested.
+ outputStream->markUnpreparable();
} else {
res = outputStream->getBuffer(&outputBuffers->editItemAt(j),
waitDuration,