From 91e64e2d3a71e2dad5d2f8efca0721dbf4f9b235 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Fri, 18 Sep 2020 01:28:25 -0700 Subject: [PATCH] camera2: Remove partial result nodes for error frames. When there's an capture error reported for a frame, remove its nodes in mPartialResults map node, since they'll not be used by clients of FrameTracker. This should also reduce slow memory pressure build up because of mPartialResult growth as and when there are error frames which have some partial results as well. Bug: 167944895 Test: GCA on Pixel2, constant mode changes don't show steady state increase in mPartialResults map size (Basic validity) Change-Id: I6de585deb24039321310ddbd5dccd9119b25b23d Signed-off-by: Jayant Chowdhary --- .../camera2/impl/FrameNumberTracker.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/core/java/android/hardware/camera2/impl/FrameNumberTracker.java b/core/java/android/hardware/camera2/impl/FrameNumberTracker.java index 97c79f6e13740..7b6a457411f35 100644 --- a/core/java/android/hardware/camera2/impl/FrameNumberTracker.java +++ b/core/java/android/hardware/camera2/impl/FrameNumberTracker.java @@ -70,30 +70,29 @@ public class FrameNumberTracker { int requestType = (int) pair.getValue(); Boolean removeError = false; if (errorFrameNumber == mCompletedFrameNumber[requestType] + 1) { - mCompletedFrameNumber[requestType] = errorFrameNumber; removeError = true; + } + // The error frame number could have also either been in the pending list or one of the + // 'other' pending lists. + if (!mPendingFrameNumbers[requestType].isEmpty()) { + if (errorFrameNumber == mPendingFrameNumbers[requestType].element()) { + mPendingFrameNumbers[requestType].remove(); + removeError = true; + } } else { - if (!mPendingFrameNumbers[requestType].isEmpty()) { - if (errorFrameNumber == mPendingFrameNumbers[requestType].element()) { - mCompletedFrameNumber[requestType] = errorFrameNumber; - mPendingFrameNumbers[requestType].remove(); + for (int i = 1; i < CaptureRequest.REQUEST_TYPE_COUNT; i++) { + int otherType = (requestType + i) % CaptureRequest.REQUEST_TYPE_COUNT; + if (!mPendingFrameNumbersWithOtherType[otherType].isEmpty() && errorFrameNumber + == mPendingFrameNumbersWithOtherType[otherType].element()) { + mPendingFrameNumbersWithOtherType[otherType].remove(); removeError = true; - } - } else { - for (int i = 1; i < CaptureRequest.REQUEST_TYPE_COUNT; i++) { - int otherType = (requestType + i) % CaptureRequest.REQUEST_TYPE_COUNT; - if (!mPendingFrameNumbersWithOtherType[otherType].isEmpty() - && errorFrameNumber - == mPendingFrameNumbersWithOtherType[otherType].element()) { - mCompletedFrameNumber[requestType] = errorFrameNumber; - mPendingFrameNumbersWithOtherType[otherType].remove(); - removeError = true; - break; - } + break; } } } if (removeError) { + mCompletedFrameNumber[requestType] = errorFrameNumber; + mPartialResults.remove(errorFrameNumber); iter.remove(); } }