From d4759b731b71536335b8342726c219e9eacdff46 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Mon, 23 Oct 2023 23:31:09 +0000 Subject: Camera: Disable buffer timestamp pruning during burst capture In some scenarios, burst during basic extension still capture can encounter older or duplicate frames. Instead of failing the request, continue collecting frames and results and send them for processing in the extension. Extensions can decide how to handle this and accordingly. Bug: 306121595 Test: atest -c -d cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: I3afd57af08dd3c1ad375e62eff02152e2cf52479 --- .../camera2/impl/CameraExtensionSessionImpl.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index bf77681bbbbd..db7055b1756d 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -357,7 +357,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { mCameraRepeatingSurface = mRepeatingRequestImageReader.getSurface(); } mRepeatingRequestImageCallback = new CameraOutputImageCallback( - mRepeatingRequestImageReader); + mRepeatingRequestImageReader, true /*pruneOlderBuffers*/); mRepeatingRequestImageReader .setOnImageAvailableListener(mRepeatingRequestImageCallback, mHandler); } @@ -398,7 +398,8 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT); } - mBurstCaptureImageCallback = new CameraOutputImageCallback(mBurstCaptureImageReader); + mBurstCaptureImageCallback = new CameraOutputImageCallback(mBurstCaptureImageReader, + false /*pruneOlderBuffers*/); mBurstCaptureImageReader.setOnImageAvailableListener(mBurstCaptureImageCallback, mHandler); mCameraBurstSurface = mBurstCaptureImageReader.getSurface(); @@ -1106,7 +1107,9 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { } for (Pair captureStage : mCaptureStageMap.values()) { - captureStage.first.close(); + if (captureStage.first != null) { + captureStage.first.close(); + } } mCaptureStageMap.clear(); } @@ -1207,6 +1210,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { if (mImageProcessor != null) { if (mCapturePendingMap.indexOfKey(timestamp) >= 0) { Image img = mCapturePendingMap.get(timestamp).first; + mCapturePendingMap.remove(timestamp); mCaptureStageMap.put(stageId, new Pair<>(img, result)); checkAndFireBurstProcessing(); } else { @@ -1303,6 +1307,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { reader.detachImage(img); if (mCapturePendingMap.indexOfKey(timestamp) >= 0) { Integer stageId = mCapturePendingMap.get(timestamp).second; + mCapturePendingMap.remove(timestamp); Pair captureStage = mCaptureStageMap.get(stageId); if (captureStage != null) { @@ -1402,9 +1407,11 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { private HashMap> mImageListenerMap = new HashMap<>(); private boolean mOutOfBuffers = false; + private final boolean mPruneOlderBuffers; - CameraOutputImageCallback(ImageReader imageReader) { + CameraOutputImageCallback(ImageReader imageReader, boolean pruneOlderBuffers) { mImageReader = imageReader; + mPruneOlderBuffers = pruneOlderBuffers; } @Override @@ -1447,6 +1454,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { ArrayList removedTs = new ArrayList<>(); for (long ts : timestamps) { if (ts < timestamp) { + if (!mPruneOlderBuffers) { + Log.w(TAG, "Unexpected older image with ts: " + ts); + continue; + } Log.e(TAG, "Dropped image with ts: " + ts); Pair entry = mImageListenerMap.get(ts); if (entry.second != null) { -- cgit v1.2.3-59-g8ed1b