Merge "Camera:Fix the memory leak caused during HFR mode." into sc-qpr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4881b7d690
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user