Merge "Camera:Fix the memory leak caused during HFR mode." into sc-qpr1-dev

This commit is contained in:
Rucha Katakwar
2021-09-15 17:33:28 +00:00
committed by Android (Google) Code Review

View File

@@ -104,6 +104,9 @@ public class CameraDeviceImpl extends CameraDevice
private SparseArray<CaptureCallbackHolder> mCaptureCallbackMap = private SparseArray<CaptureCallbackHolder> mCaptureCallbackMap =
new SparseArray<CaptureCallbackHolder>(); new SparseArray<CaptureCallbackHolder>();
/** map request IDs which have batchedOutputs to requestCount*/
private HashMap<Integer, Integer> mBatchOutputMap = new HashMap<>();
private int mRepeatingRequestId = REQUEST_ID_NONE; private int mRepeatingRequestId = REQUEST_ID_NONE;
// Latest repeating request list's types // Latest repeating request list's types
private int[] mRepeatingRequestTypes; private int[] mRepeatingRequestTypes;
@@ -973,6 +976,7 @@ public class CameraDeviceImpl extends CameraDevice
mConfiguredInput = new SimpleEntry<Integer, InputConfiguration>(REQUEST_ID_NONE, null); mConfiguredInput = new SimpleEntry<Integer, InputConfiguration>(REQUEST_ID_NONE, null);
mIdle = true; mIdle = true;
mCaptureCallbackMap = new SparseArray<CaptureCallbackHolder>(); mCaptureCallbackMap = new SparseArray<CaptureCallbackHolder>();
mBatchOutputMap = new HashMap<>();
mFrameNumberTracker = new FrameNumberTracker(); mFrameNumberTracker = new FrameNumberTracker();
mCurrentSession.closeWithoutDraining(); mCurrentSession.closeWithoutDraining();
@@ -1179,6 +1183,41 @@ public class CameraDeviceImpl extends CameraDevice
return requestTypes; return requestTypes;
} }
private boolean hasBatchedOutputs(List<CaptureRequest> requestList) {
boolean hasBatchedOutputs = true;
for (int i = 0; i < requestList.size(); i++) {
CaptureRequest request = requestList.get(i);
if (!request.isPartOfCRequestList()) {
hasBatchedOutputs = false;
break;
}
if (i == 0) {
Collection<Surface> targets = request.getTargets();
if (targets.size() != 2) {
hasBatchedOutputs = false;
break;
}
}
}
return hasBatchedOutputs;
}
private void updateTracker(int requestId, long frameNumber,
int requestType, CaptureResult result, boolean isPartialResult) {
int requestCount = 1;
// If the request has batchedOutputs update each frame within the batch.
if (mBatchOutputMap.containsKey(requestId)) {
requestCount = mBatchOutputMap.get(requestId);
for (int i = 0; i < requestCount; i++) {
mFrameNumberTracker.updateTracker(frameNumber - (requestCount - 1 - i),
result, isPartialResult, requestType);
}
} else {
mFrameNumberTracker.updateTracker(frameNumber, result,
isPartialResult, requestType);
}
}
private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureCallback callback, private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureCallback callback,
Executor executor, boolean repeating) throws CameraAccessException { Executor executor, boolean repeating) throws CameraAccessException {
@@ -1224,6 +1263,14 @@ public class CameraDeviceImpl extends CameraDevice
request.recoverStreamIdToSurface(); request.recoverStreamIdToSurface();
} }
// If the request has batched outputs, then store the
// requestCount and requestId in the map.
boolean hasBatchedOutputs = hasBatchedOutputs(requestList);
if (hasBatchedOutputs) {
int requestCount = requestList.size();
mBatchOutputMap.put(requestInfo.getRequestId(), requestCount);
}
if (callback != null) { if (callback != null) {
mCaptureCallbackMap.put(requestInfo.getRequestId(), mCaptureCallbackMap.put(requestInfo.getRequestId(),
new CaptureCallbackHolder( new CaptureCallbackHolder(
@@ -1839,8 +1886,18 @@ public class CameraDeviceImpl extends CameraDevice
if (DEBUG) { if (DEBUG) {
Log.v(TAG, String.format("got error frame %d", frameNumber)); Log.v(TAG, String.format("got error frame %d", frameNumber));
} }
mFrameNumberTracker.updateTracker(frameNumber,
/*error*/true, request.getRequestType()); // 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());
}
checkAndFireSequenceComplete(); checkAndFireSequenceComplete();
// Dispatch the failure callback // Dispatch the failure callback
@@ -2023,7 +2080,6 @@ public class CameraDeviceImpl extends CameraDevice
public void onResultReceived(CameraMetadataNative result, public void onResultReceived(CameraMetadataNative result,
CaptureResultExtras resultExtras, PhysicalCaptureResultInfo physicalResults[]) CaptureResultExtras resultExtras, PhysicalCaptureResultInfo physicalResults[])
throws RemoteException { throws RemoteException {
int requestId = resultExtras.getRequestId(); int requestId = resultExtras.getRequestId();
long frameNumber = resultExtras.getFrameNumber(); long frameNumber = resultExtras.getFrameNumber();
@@ -2064,8 +2120,8 @@ public class CameraDeviceImpl extends CameraDevice
+ frameNumber); + frameNumber);
} }
mFrameNumberTracker.updateTracker(frameNumber, /*result*/null, isPartialResult, updateTracker(requestId, frameNumber, requestType, /*result*/null,
requestType); isPartialResult);
return; return;
} }
@@ -2077,8 +2133,9 @@ public class CameraDeviceImpl extends CameraDevice
+ frameNumber); + frameNumber);
} }
mFrameNumberTracker.updateTracker(frameNumber, /*result*/null, isPartialResult, updateTracker(requestId, frameNumber, requestType, /*result*/null,
requestType); isPartialResult);
return; return;
} }
@@ -2184,9 +2241,7 @@ public class CameraDeviceImpl extends CameraDevice
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
} }
// Collect the partials for a total result; or mark the frame as totally completed updateTracker(requestId, frameNumber, requestType, finalResult, isPartialResult);
mFrameNumberTracker.updateTracker(frameNumber, finalResult, isPartialResult,
requestType);
// Fire onCaptureSequenceCompleted // Fire onCaptureSequenceCompleted
if (!isPartialResult) { if (!isPartialResult) {