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:
Emilian Peev
2023-03-21 15:37:46 -07:00
parent 6cca48d23d
commit 02d53f863d

View File

@@ -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) {