Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02d53f86 authored by Emilian Peev's avatar Emilian Peev
Browse files

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
parent 6cca48d2
Loading
Loading
Loading
Loading
+59 −23
Original line number Original line Diff line number Diff line
@@ -76,18 +76,18 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
    private static final String TAG = "CameraAdvancedExtensionSessionImpl";
    private static final String TAG = "CameraAdvancedExtensionSessionImpl";


    private final Executor mExecutor;
    private final Executor mExecutor;
    private final CameraDevice mCameraDevice;
    private CameraDevice mCameraDevice;
    private final Map<String, CameraMetadataNative> mCharacteristicsMap;
    private final Map<String, CameraMetadataNative> mCharacteristicsMap;
    private final long mExtensionClientId;
    private final long mExtensionClientId;
    private final Handler mHandler;
    private final Handler mHandler;
    private final HandlerThread mHandlerThread;
    private final HandlerThread mHandlerThread;
    private final CameraExtensionSession.StateCallback mCallbacks;
    private final CameraExtensionSession.StateCallback mCallbacks;
    private final IAdvancedExtenderImpl mAdvancedExtender;
    private IAdvancedExtenderImpl mAdvancedExtender;
    // maps registered camera surfaces to extension output configs
    // maps registered camera surfaces to extension output configs
    private final HashMap<Surface, CameraOutputConfig> mCameraConfigMap = new HashMap<>();
    private final HashMap<Surface, CameraOutputConfig> mCameraConfigMap = new HashMap<>();
    // maps camera extension output ids to camera registered image readers
    // maps camera extension output ids to camera registered image readers
    private final HashMap<Integer, ImageReader> mReaderMap = new HashMap<>();
    private final HashMap<Integer, ImageReader> mReaderMap = new HashMap<>();
    private final RequestProcessor mRequestProcessor = new RequestProcessor();
    private RequestProcessor mRequestProcessor = new RequestProcessor();
    private final int mSessionId;
    private final int mSessionId;


    private Surface mClientRepeatingRequestSurface;
    private Surface mClientRepeatingRequestSurface;
@@ -98,7 +98,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
    private final InitializeSessionHandler mInitializeHandler;
    private final InitializeSessionHandler mInitializeHandler;


    private boolean mInitialized;
    private boolean mInitialized;

    private boolean mSessionClosed;


    // Lock to synchronize cross-thread access to device public interface
    // Lock to synchronize cross-thread access to device public interface
    final Object mInterfaceLock;
    final Object mInterfaceLock;
@@ -231,6 +231,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        mHandlerThread.start();
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
        mHandler = new Handler(mHandlerThread.getLooper());
        mInitialized = false;
        mInitialized = false;
        mSessionClosed = false;
        mInitializeHandler = new InitializeSessionHandler();
        mInitializeHandler = new InitializeSessionHandler();
        mSessionId = sessionId;
        mSessionId = sessionId;
        mInterfaceLock = cameraDevice.mInterfaceLock;
        mInterfaceLock = cameraDevice.mInterfaceLock;
@@ -415,7 +416,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
                mSessionProcessor.setParameters(request);
                mSessionProcessor.setParameters(request);


                seqId = mSessionProcessor.startRepeating(new RequestCallbackHandler(request,
                seqId = mSessionProcessor.startRepeating(new RequestCallbackHandler(request,
                        executor, listener));
                        executor, listener, mCameraDevice.getId()));
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                throw new CameraAccessException(CameraAccessException.CAMERA_ERROR,
                throw new CameraAccessException(CameraAccessException.CAMERA_ERROR,
                        "Failed to enable repeating request, extension service failed to respond!");
                        "Failed to enable repeating request, extension service failed to respond!");
@@ -443,7 +444,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
                    mSessionProcessor.setParameters(request);
                    mSessionProcessor.setParameters(request);


                    seqId = mSessionProcessor.startCapture(new RequestCallbackHandler(request,
                    seqId = mSessionProcessor.startCapture(new RequestCallbackHandler(request,
                            executor, listener), isPostviewRequested);
                            executor, listener, mCameraDevice.getId()), isPostviewRequested);
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
                    throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
                            " to submit capture request, extension service failed to respond!");
                            " to submit capture request, extension service failed to respond!");
@@ -451,8 +452,8 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
            } else if ((mClientRepeatingRequestSurface != null) &&
            } else if ((mClientRepeatingRequestSurface != null) &&
                    request.containsTarget(mClientRepeatingRequestSurface)) {
                    request.containsTarget(mClientRepeatingRequestSurface)) {
                try {
                try {
                    seqId = mSessionProcessor.startTrigger(request,
                    seqId = mSessionProcessor.startTrigger(request, new RequestCallbackHandler(
                            new RequestCallbackHandler(request, executor, listener));
                            request, executor, listener, mCameraDevice.getId()));
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
                    throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, "Failed " +
                            " to submit trigger request, extension service failed to respond!");
                            " to submit trigger request, extension service failed to respond!");
@@ -519,6 +520,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
                    mCaptureSession.stopRepeating();
                    mCaptureSession.stopRepeating();
                    mSessionProcessor.stopRepeating();
                    mSessionProcessor.stopRepeating();
                    mSessionProcessor.onCaptureSessionEnd();
                    mSessionProcessor.onCaptureSessionEnd();
                    mSessionClosed = true;
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    Log.e(TAG, "Failed to stop the repeating request or end the session,"
                    Log.e(TAG, "Failed to stop the repeating request or end the session,"
                            + " , extension service does not respond!") ;
                            + " , extension service does not respond!") ;
@@ -536,6 +538,9 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes


            if (mSessionProcessor != null) {
            if (mSessionProcessor != null) {
                try {
                try {
                    if (!mSessionClosed) {
                        mSessionProcessor.onCaptureSessionEnd();
                    }
                    mSessionProcessor.deInitSession();
                    mSessionProcessor.deInitSession();
                } catch (RemoteException e) {
                } catch (RemoteException e) {
                    Log.e(TAG, "Failed to de-initialize session processor, extension service"
                    Log.e(TAG, "Failed to de-initialize session processor, extension service"
@@ -560,6 +565,10 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes


            mClientRepeatingRequestSurface = null;
            mClientRepeatingRequestSurface = null;
            mClientCaptureSurface = null;
            mClientCaptureSurface = null;
            mCaptureSession = null;
            mRequestProcessor = null;
            mCameraDevice = null;
            mAdvancedExtender = null;
        }
        }


        if (notifyClose && !skipCloseNotification) {
        if (notifyClose && !skipCloseNotification) {
@@ -680,13 +689,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        private final CaptureRequest mClientRequest;
        private final CaptureRequest mClientRequest;
        private final Executor mClientExecutor;
        private final Executor mClientExecutor;
        private final ExtensionCaptureCallback mClientCallbacks;
        private final ExtensionCaptureCallback mClientCallbacks;
        private final String mCameraId;


        private RequestCallbackHandler(@NonNull CaptureRequest clientRequest,
        private RequestCallbackHandler(@NonNull CaptureRequest clientRequest,
                @NonNull Executor clientExecutor,
                @NonNull Executor clientExecutor,
                @NonNull ExtensionCaptureCallback clientCallbacks) {
                @NonNull ExtensionCaptureCallback clientCallbacks,
                @NonNull String cameraId) {
            mClientRequest = clientRequest;
            mClientRequest = clientRequest;
            mClientExecutor = clientExecutor;
            mClientExecutor = clientExecutor;
            mClientCallbacks = clientCallbacks;
            mClientCallbacks = clientCallbacks;
            mCameraId = cameraId;
        }
        }


        @Override
        @Override
@@ -758,7 +770,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
            }
            }


            result.set(CaptureResult.SENSOR_TIMESTAMP, timestamp);
            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,
                    mClientRequest, requestId, timestamp, new ArrayList<>(), mSessionId,
                    new PhysicalCaptureResultInfo[0]);
                    new PhysicalCaptureResultInfo[0]);
            final long ident = Binder.clearCallingIdentity();
            final long ident = Binder.clearCallingIdentity();
@@ -1010,6 +1022,11 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        public int submitBurst(List<Request> requests, IRequestCallback callback) {
        public int submitBurst(List<Request> requests, IRequestCallback callback) {
            int seqId = -1;
            int seqId = -1;
            try {
            try {
                synchronized (mInterfaceLock) {
                    if (!mInitialized) {
                        return seqId;
                    }

                    CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
                    CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
                    ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
                    ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
                    for (Request request : requests) {
                    for (Request request : requests) {
@@ -1018,6 +1035,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
                    }
                    }
                    seqId = mCaptureSession.captureBurstRequests(captureRequests,
                    seqId = mCaptureSession.captureBurstRequests(captureRequests,
                            new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
                            new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
                }
            } catch (CameraAccessException e) {
            } catch (CameraAccessException e) {
                Log.e(TAG, "Failed to submit capture requests!");
                Log.e(TAG, "Failed to submit capture requests!");
            } catch (IllegalStateException e) {
            } catch (IllegalStateException e) {
@@ -1031,11 +1049,17 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        public int setRepeating(Request request, IRequestCallback callback) {
        public int setRepeating(Request request, IRequestCallback callback) {
            int seqId = -1;
            int seqId = -1;
            try {
            try {
                synchronized (mInterfaceLock) {
                    if (!mInitialized) {
                        return seqId;
                    }

                    CaptureRequest repeatingRequest = initializeCaptureRequest(mCameraDevice,
                    CaptureRequest repeatingRequest = initializeCaptureRequest(mCameraDevice,
                            request, mCameraConfigMap);
                            request, mCameraConfigMap);
                    CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
                    CaptureCallbackHandler captureCallback = new CaptureCallbackHandler(callback);
                    seqId = mCaptureSession.setSingleRepeatingRequest(repeatingRequest,
                    seqId = mCaptureSession.setSingleRepeatingRequest(repeatingRequest,
                            new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
                            new CameraExtensionUtils.HandlerExecutor(mHandler), captureCallback);
                }
            } catch (CameraAccessException e) {
            } catch (CameraAccessException e) {
                Log.e(TAG, "Failed to enable repeating request!");
                Log.e(TAG, "Failed to enable repeating request!");
            } catch (IllegalStateException e) {
            } catch (IllegalStateException e) {
@@ -1048,7 +1072,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        @Override
        @Override
        public void abortCaptures() {
        public void abortCaptures() {
            try {
            try {
                synchronized (mInterfaceLock) {
                    if (!mInitialized) {
                        return;
                    }

                    mCaptureSession.abortCaptures();
                    mCaptureSession.abortCaptures();
                }
            } catch (CameraAccessException e) {
            } catch (CameraAccessException e) {
                Log.e(TAG, "Failed during capture abort!");
                Log.e(TAG, "Failed during capture abort!");
            } catch (IllegalStateException e) {
            } catch (IllegalStateException e) {
@@ -1059,7 +1089,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        @Override
        @Override
        public void stopRepeating() {
        public void stopRepeating() {
            try {
            try {
                synchronized (mInterfaceLock) {
                    if (!mInitialized) {
                        return;
                    }

                    mCaptureSession.stopRepeating();
                    mCaptureSession.stopRepeating();
                }
            } catch (CameraAccessException e) {
            } catch (CameraAccessException e) {
                Log.e(TAG, "Failed during repeating capture stop!");
                Log.e(TAG, "Failed during repeating capture stop!");
            } catch (IllegalStateException e) {
            } catch (IllegalStateException e) {