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

Commit 6cb99a27 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Camera: Avoid holding locks during extension initialization" am:...

Merge "Camera: Avoid holding locks during extension initialization" am: 558b16bb am: 9988da95 am: e7c03bc2

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2454926



Change-Id: I99123a30cb27478a1ea8ec78ddaa900979ccd5f6
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 81a6dbd3 e7c03bc2
Loading
Loading
Loading
Loading
+57 −44
Original line number Diff line number Diff line
@@ -101,15 +101,15 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes


    // Lock to synchronize cross-thread access to device public interface
    final Object mInterfaceLock = new Object(); // access from this class and Session only!
    final Object mInterfaceLock;

    /**
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.CAMERA)
    public static CameraAdvancedExtensionSessionImpl createCameraAdvancedExtensionSession(
            @NonNull CameraDevice cameraDevice, @NonNull Context ctx,
            @NonNull ExtensionSessionConfiguration config, int sessionId)
            @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
            @NonNull Context ctx, @NonNull ExtensionSessionConfiguration config, int sessionId)
            throws CameraAccessException, RemoteException {
        long clientId = CameraExtensionCharacteristics.registerClient(ctx);
        if (clientId < 0) {
@@ -209,7 +209,8 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
    }

    private CameraAdvancedExtensionSessionImpl(long extensionClientId,
            @NonNull IAdvancedExtenderImpl extender, @NonNull CameraDevice cameraDevice,
            @NonNull IAdvancedExtenderImpl extender,
            @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
            @Nullable Surface repeatingRequestSurface, @Nullable Surface burstCaptureSurface,
            @Nullable Surface postviewSurface,
            @NonNull CameraExtensionSession.StateCallback callback, @NonNull Executor executor,
@@ -228,6 +229,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        mInitialized = false;
        mInitializeHandler = new InitializeSessionHandler();
        mSessionId = sessionId;
        mInterfaceLock = cameraDevice.mInterfaceLock;
    }

    /**
@@ -599,6 +601,8 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
        public void onConfigured(@NonNull CameraCaptureSession session) {
            synchronized (mInterfaceLock) {
                mCaptureSession = session;
            }

            try {
                CameraExtensionCharacteristics.initializeSession(mInitializeHandler);
            } catch (RemoteException e) {
@@ -608,11 +612,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
            }
        }
    }
    }

    private class InitializeSessionHandler extends IInitializeSessionCallback.Stub {
        @Override
        public void onSuccess() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    boolean status = true;
                    synchronized (mInterfaceLock) {
                        try {
@@ -620,40 +626,47 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
                                mSessionProcessor.onCaptureSessionStart(mRequestProcessor);
                                mInitialized = true;
                            } else {
                        Log.v(TAG, "Failed to start capture session, session released before " +
                                "extension start!");
                                Log.v(TAG, "Failed to start capture session, session " +
                                                " released before extension start!");
                                status = false;
                        mCaptureSession.close();
                            }
                        } catch (RemoteException e) {
                            Log.e(TAG, "Failed to start capture session,"
                                    + " extension service does not respond!");
                            status = false;
                    mCaptureSession.close();
                            mInitialized = false;
                        }
                    }

                    if (status) {
                        final long ident = Binder.clearCallingIdentity();
                        try {
                    mExecutor.execute(
                            () -> mCallbacks.onConfigured(CameraAdvancedExtensionSessionImpl.this));
                            mExecutor.execute(() -> mCallbacks.onConfigured(
                                    CameraAdvancedExtensionSessionImpl.this));
                        } finally {
                            Binder.restoreCallingIdentity(ident);
                        }
                    } else {
                notifyConfigurationFailure();
                        onFailure();
                    }
                }
            });
        }

        @Override
        public void onFailure() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mCaptureSession.close();

                    Log.e(TAG, "Failed to initialize proxy service session!"
                            + " This can happen when trying to configure multiple "
                            + "concurrent extension sessions!");
                    notifyConfigurationFailure();
                }
            });
        }
    }

    private final class RequestCallbackHandler extends ICaptureCallback.Stub {
+48 −37
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
    private boolean mInternalRepeatingRequestEnabled = true;

    // Lock to synchronize cross-thread access to device public interface
    final Object mInterfaceLock = new Object(); // access from this class and Session only!
    final Object mInterfaceLock;

    private static int nativeGetSurfaceFormat(Surface surface) {
        return SurfaceUtils.getSurfaceFormat(surface);
@@ -128,7 +128,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
     */
    @RequiresPermission(android.Manifest.permission.CAMERA)
    public static CameraExtensionSessionImpl createCameraExtensionSession(
            @NonNull CameraDevice cameraDevice,
            @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
            @NonNull Context ctx,
            @NonNull ExtensionSessionConfiguration config,
            int sessionId)
@@ -251,7 +251,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
            @NonNull IPreviewExtenderImpl previewExtender,
            @NonNull List<Size> previewSizes,
            long extensionClientId,
            @NonNull CameraDevice cameraDevice,
            @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice,
            @Nullable Surface repeatingRequestSurface,
            @Nullable Surface burstCaptureSurface,
            @Nullable Surface postviewSurface,
@@ -279,6 +279,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
        mSupportedRequestKeys = requestKeys;
        mSupportedResultKeys = resultKeys;
        mCaptureResultsSupported = !resultKeys.isEmpty();
        mInterfaceLock = cameraDevice.mInterfaceLock;
    }

    private void initializeRepeatingRequestPipeline() throws RemoteException {
@@ -969,6 +970,9 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
    private class InitializeSessionHandler extends IInitializeSessionCallback.Stub {
        @Override
        public void onSuccess() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    boolean status = true;
                    ArrayList<CaptureStageImpl> initialRequestList =
                            compileInitialRequestList();
@@ -1001,15 +1005,22 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
                        notifyConfigurationFailure();
                    }
                }
            });
        }

        @Override
        public void onFailure() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    mCaptureSession.close();
                    Log.e(TAG, "Failed to initialize proxy service session!"
                            + " This can happen when trying to configure multiple "
                            + "concurrent extension sessions!");
                    notifyConfigurationFailure();
                }
            });
        }
    }

    private class BurstRequestHandler extends CameraCaptureSession.CaptureCallback {