summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java82
1 files changed, 59 insertions, 23 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
index e787779d0f57..f52c3dad68b5 100644
--- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
@@ -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) {