Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4759b73 authored by Emilian Peev's avatar Emilian Peev
Browse files

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
parent 303e2ced
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -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,8 +1107,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                }

                for (Pair<Image, TotalCaptureResult> captureStage : mCaptureStageMap.values()) {
                    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<Image, TotalCaptureResult> captureStage =
                            mCaptureStageMap.get(stageId);
                    if (captureStage != null) {
@@ -1402,9 +1407,11 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
        private HashMap<Long, Pair<Image, OnImageAvailableListener>> 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<Long> 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<Image, OnImageAvailableListener> entry = mImageListenerMap.get(ts);
                        if (entry.second != null) {