Camera: Release advanced extension references
Release several binder references that can keep proxy service from releasing extension specific resources. Bug: 274562997 Bug: 278160236 Test: Camera CTS, Manual using Camera2Extension app Change-Id: If71d8f42d2b812d81c233344cf7f0cba3610d897
This commit is contained in:
@@ -76,18 +76,18 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
private static final String TAG = "CameraAdvancedExtensionSessionImpl";
|
||||
|
||||
private final Executor mExecutor;
|
||||
private final CameraDevice mCameraDevice;
|
||||
private CameraDevice mCameraDevice;
|
||||
private final Map<String, CameraMetadataNative> mCharacteristicsMap;
|
||||
private final long mExtensionClientId;
|
||||
private final Handler mHandler;
|
||||
private final HandlerThread mHandlerThread;
|
||||
private final CameraExtensionSession.StateCallback mCallbacks;
|
||||
private final IAdvancedExtenderImpl mAdvancedExtender;
|
||||
private IAdvancedExtenderImpl mAdvancedExtender;
|
||||
// maps registered camera surfaces to extension output configs
|
||||
private final HashMap<Surface, CameraOutputConfig> mCameraConfigMap = new HashMap<>();
|
||||
// maps camera extension output ids to camera registered image readers
|
||||
private final HashMap<Integer, ImageReader> mReaderMap = new HashMap<>();
|
||||
private final RequestProcessor mRequestProcessor = new RequestProcessor();
|
||||
private RequestProcessor mRequestProcessor = new RequestProcessor();
|
||||
private final int mSessionId;
|
||||
|
||||
private Surface mClientRepeatingRequestSurface;
|
||||
@@ -98,7 +98,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
private final InitializeSessionHandler mInitializeHandler;
|
||||
|
||||
private boolean mInitialized;
|
||||
|
||||
private boolean mSessionClosed;
|
||||
|
||||
// Lock to synchronize cross-thread access to device public interface
|
||||
final Object mInterfaceLock;
|
||||
@@ -231,6 +231,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
mHandlerThread.start();
|
||||
mHandler = new Handler(mHandlerThread.getLooper());
|
||||
mInitialized = false;
|
||||
mSessionClosed = false;
|
||||
mInitializeHandler = new InitializeSessionHandler();
|
||||
mSessionId = sessionId;
|
||||
mInterfaceLock = cameraDevice.mInterfaceLock;
|
||||
@@ -415,7 +416,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
mSessionProcessor.setParameters(request);
|
||||
|
||||
seqId = mSessionProcessor.startRepeating(new RequestCallbackHandler(request,
|
||||
executor, listener));
|
||||
executor, listener, mCameraDevice.getId()));
|
||||
} catch (RemoteException e) {
|
||||
throw new CameraAccessException(CameraAccessException.CAMERA_ERROR,
|
||||
"Failed to enable repeating request, extension service failed to respond!");
|
||||
@@ -443,7 +444,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
mSessionProcessor.setParameters(request);
|
||||
|
||||
seqId = mSessionProcessor.startCapture(new RequestCallbackHandler(request,
|
||||
executor, listener), isPostviewRequested);
|
||||
executor, listener, mCameraDevice.getId()), isPostviewRequested);
|
||||
} catch (RemoteException e) {
|
||||
throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
|
||||
" to submit capture request, extension service failed to respond!");
|
||||
@@ -451,8 +452,8 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
} else if ((mClientRepeatingRequestSurface != null) &&
|
||||
request.containsTarget(mClientRepeatingRequestSurface)) {
|
||||
try {
|
||||
seqId = mSessionProcessor.startTrigger(request,
|
||||
new RequestCallbackHandler(request, executor, listener));
|
||||
seqId = mSessionProcessor.startTrigger(request, new RequestCallbackHandler(
|
||||
request, executor, listener, mCameraDevice.getId()));
|
||||
} catch (RemoteException e) {
|
||||
throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
|
||||
" to submit trigger request, extension service failed to respond!");
|
||||
@@ -519,6 +520,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
mCaptureSession.stopRepeating();
|
||||
mSessionProcessor.stopRepeating();
|
||||
mSessionProcessor.onCaptureSessionEnd();
|
||||
mSessionClosed = true;
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to stop the repeating request or end the session,"
|
||||
+ " , extension service does not respond!") ;
|
||||
@@ -536,6 +538,9 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
|
||||
if (mSessionProcessor != null) {
|
||||
try {
|
||||
if (!mSessionClosed) {
|
||||
mSessionProcessor.onCaptureSessionEnd();
|
||||
}
|
||||
mSessionProcessor.deInitSession();
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to de-initialize session processor, extension service"
|
||||
@@ -560,6 +565,10 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
|
||||
mClientRepeatingRequestSurface = null;
|
||||
mClientCaptureSurface = null;
|
||||
mCaptureSession = null;
|
||||
mRequestProcessor = null;
|
||||
mCameraDevice = null;
|
||||
mAdvancedExtender = null;
|
||||
}
|
||||
|
||||
if (notifyClose && !skipCloseNotification) {
|
||||
@@ -680,13 +689,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
private final CaptureRequest mClientRequest;
|
||||
private final Executor mClientExecutor;
|
||||
private final ExtensionCaptureCallback mClientCallbacks;
|
||||
private final String mCameraId;
|
||||
|
||||
private RequestCallbackHandler(@NonNull CaptureRequest clientRequest,
|
||||
@NonNull Executor clientExecutor,
|
||||
@NonNull ExtensionCaptureCallback clientCallbacks) {
|
||||
@NonNull ExtensionCaptureCallback clientCallbacks,
|
||||
@NonNull String cameraId) {
|
||||
mClientRequest = clientRequest;
|
||||
mClientExecutor = clientExecutor;
|
||||
mClientCallbacks = clientCallbacks;
|
||||
mCameraId = cameraId;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -758,7 +770,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
}
|
||||
|
||||
result.set(CaptureResult.SENSOR_TIMESTAMP, timestamp);
|
||||
TotalCaptureResult totalResult = new TotalCaptureResult(mCameraDevice.getId(), result,
|
||||
TotalCaptureResult totalResult = new TotalCaptureResult(mCameraId, result,
|
||||
mClientRequest, requestId, timestamp, new ArrayList<>(), mSessionId,
|
||||
new PhysicalCaptureResultInfo[0]);
|
||||
final long ident = Binder.clearCallingIdentity();
|
||||
@@ -1010,14 +1022,20 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
public int submitBurst(List<Request> requests, IRequestCallback callback) {
|
||||
int seqId = -1;
|
||||
try {
|
||||
CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
|
||||
ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
|
||||
for (Request request : requests) {
|
||||
captureRequests.add(initializeCaptureRequest(mCameraDevice, request,
|
||||
mCameraConfigMap));
|
||||
synchronized (mInterfaceLock) {
|
||||
if (!mInitialized) {
|
||||
return seqId;
|
||||
}
|
||||
|
||||
CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
|
||||
ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
|
||||
for (Request request : requests) {
|
||||
captureRequests.add(initializeCaptureRequest(mCameraDevice, request,
|
||||
mCameraConfigMap));
|
||||
}
|
||||
seqId = mCaptureSession.captureBurstRequests(captureRequests,
|
||||
new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
|
||||
}
|
||||
seqId = mCaptureSession.captureBurstRequests(captureRequests,
|
||||
new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
|
||||
} catch (CameraAccessException e) {
|
||||
Log.e(TAG, "Failed to submit capture requests!");
|
||||
} catch (IllegalStateException e) {
|
||||
@@ -1031,11 +1049,17 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
public int setRepeating(Request request, IRequestCallback callback) {
|
||||
int seqId = -1;
|
||||
try {
|
||||
CaptureRequest repeatingRequest = initializeCaptureRequest(mCameraDevice,
|
||||
synchronized (mInterfaceLock) {
|
||||
if (!mInitialized) {
|
||||
return seqId;
|
||||
}
|
||||
|
||||
CaptureRequest repeatingRequest = initializeCaptureRequest(mCameraDevice,
|
||||
request, mCameraConfigMap);
|
||||
CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
|
||||
seqId = mCaptureSession.setSingleRepeatingRequest(repeatingRequest,
|
||||
new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
|
||||
CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
|
||||
seqId = mCaptureSession.setSingleRepeatingRequest(repeatingRequest,
|
||||
new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
|
||||
}
|
||||
} catch (CameraAccessException e) {
|
||||
Log.e(TAG, "Failed to enable repeating request!");
|
||||
} catch (IllegalStateException e) {
|
||||
@@ -1048,7 +1072,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
@Override
|
||||
public void abortCaptures() {
|
||||
try {
|
||||
mCaptureSession.abortCaptures();
|
||||
synchronized (mInterfaceLock) {
|
||||
if (!mInitialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
mCaptureSession.abortCaptures();
|
||||
}
|
||||
} catch (CameraAccessException e) {
|
||||
Log.e(TAG, "Failed during capture abort!");
|
||||
} catch (IllegalStateException e) {
|
||||
@@ -1059,7 +1089,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
|
||||
@Override
|
||||
public void stopRepeating() {
|
||||
try {
|
||||
mCaptureSession.stopRepeating();
|
||||
synchronized (mInterfaceLock) {
|
||||
if (!mInitialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
mCaptureSession.stopRepeating();
|
||||
}
|
||||
} catch (CameraAccessException e) {
|
||||
Log.e(TAG, "Failed during repeating capture stop!");
|
||||
} catch (IllegalStateException e) {
|
||||
|
||||
Reference in New Issue
Block a user