From a4adaecacead593261614dfdc7b44725e2136093 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Tue, 25 Apr 2023 10:49:24 -0700 Subject: [PATCH] Camera: Don't update frameNumberTracker for physical camera result error In case of physical camera result error, the corresponding frameNumber shouldn't be removed from the tracker because the totalCaptureResult is still be pending. Test: vendor testing, Camera CTS Bug: 279612822 Change-Id: I69aca02245f86c62bf14017b3d8788485e783cac --- .../camera2/CameraCaptureSession.java | 5 +++++ .../camera2/impl/CameraDeviceImpl.java | 21 +++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java index 1bc6099fd6513..f6a2708cbe4d8 100644 --- a/core/java/android/hardware/camera2/CameraCaptureSession.java +++ b/core/java/android/hardware/camera2/CameraCaptureSession.java @@ -1397,6 +1397,11 @@ public abstract class CameraCaptureSession implements AutoCloseable { * the capture may have been pushed to their respective output * streams.

* + *

If a logical multi-camera fails to generate capture result for one of + * its physical cameras, this method will be called with a {@link CaptureFailure} + * for that physical camera. In such cases, as long as the logical camera capture + * result is valid, {@link #onCaptureCompleted} will still be called.

+ * *

The default implementation of this method does nothing.

* * @param session diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index f2d8caaab0e7a..693b5e085d8a4 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -1908,18 +1908,21 @@ public class CameraDeviceImpl extends CameraDevice Log.v(TAG, String.format("got error frame %d", frameNumber)); } - // Update FrameNumberTracker for every frame during HFR mode. - if (mBatchOutputMap.containsKey(requestId)) { - for (int i = 0; i < mBatchOutputMap.get(requestId); i++) { - mFrameNumberTracker.updateTracker(frameNumber - (subsequenceId - i), + // Do not update frame number tracker for physical camera result error. + if (errorPhysicalCameraId == null) { + // Update FrameNumberTracker for every frame during HFR mode. + if (mBatchOutputMap.containsKey(requestId)) { + for (int i = 0; i < mBatchOutputMap.get(requestId); i++) { + mFrameNumberTracker.updateTracker(frameNumber - (subsequenceId - i), + /*error*/true, request.getRequestType()); + } + } else { + mFrameNumberTracker.updateTracker(frameNumber, /*error*/true, request.getRequestType()); } - } else { - mFrameNumberTracker.updateTracker(frameNumber, - /*error*/true, request.getRequestType()); - } - checkAndFireSequenceComplete(); + checkAndFireSequenceComplete(); + } // Dispatch the failure callback final long ident = Binder.clearCallingIdentity();