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

Commit cad1bfe6 authored by Eino-Ville Talvala's avatar Eino-Ville Talvala
Browse files

Camera2: Fix broken onCaptureBufferLost callback

Turns out this never worked. 😱

- Add missing oncaptureBufferLost proxy method
- To avoid this issue in the future, change CameraDeviceImpl.CaptureCallback to be
  an interface instead of an abstract class; now all implementers _must_ implement
  all the methods
- For the short-circuit local callback when no callback is provided by the user,
  implement all no-ops explicitly.

Test: Camera CTS continues to pass; manual testing with injected buffer drops
Bug: 62004599
Change-Id: I7732903dbc00e80084162e067de66b5db6cee74c
parent 07c832f4
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ public class CallbackProxies {
    }

    @SuppressWarnings("deprecation")
    public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
    public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
        private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;

        public DeviceCaptureCallbackProxy(
@@ -138,6 +138,13 @@ public class CallbackProxies {
                int sequenceId) {
            mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
        }

        @Override
        public void onCaptureBufferLost(CameraDevice camera,
                CaptureRequest request, Surface target, long frameNumber) {
            mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
        }

    }

    public static class SessionStateCallbackProxy
+38 −0
Original line number Diff line number Diff line
@@ -452,6 +452,37 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
    private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
            Handler handler, CaptureCallback callback) {
        CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {

            @Override
            public void onCaptureStarted(CameraDevice camera,
                    CaptureRequest request, long timestamp, long frameNumber) {
                // Do nothing
            }

            @Override
            public void onCapturePartial(CameraDevice camera,
                    CaptureRequest request, android.hardware.camera2.CaptureResult result) {
                // Do nothing
            }

            @Override
            public void onCaptureProgressed(CameraDevice camera,
                    CaptureRequest request, android.hardware.camera2.CaptureResult partialResult) {
                // Do nothing
            }

            @Override
            public void onCaptureCompleted(CameraDevice camera,
                    CaptureRequest request, android.hardware.camera2.TotalCaptureResult result) {
                // Do nothing
            }

            @Override
            public void onCaptureFailed(CameraDevice camera,
                    CaptureRequest request, android.hardware.camera2.CaptureFailure failure) {
                // Do nothing
            }

            @Override
            public void onCaptureSequenceCompleted(CameraDevice camera,
                    int sequenceId, long frameNumber) {
@@ -463,6 +494,13 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
                    int sequenceId) {
                finishPendingSequence(sequenceId);
            }

            @Override
            public void onCaptureBufferLost(CameraDevice camera,
                    CaptureRequest request, Surface target, long frameNumber) {
                // Do nothing
            }

        };

        /*
+18 −25
Original line number Diff line number Diff line
@@ -1112,8 +1112,11 @@ public class CameraDeviceImpl extends CameraDevice
     * <p>A callback for tracking the progress of a {@link CaptureRequest}
     * submitted to the camera device.</p>
     *
     * An interface instead of an abstract class because this is internal and
     * we want to make sure we always implement all its callbacks until we reach
     * the public layer.
     */
    public static abstract class CaptureCallback {
    public interface CaptureCallback {

        /**
         * This constant is used to indicate that no images were captured for
@@ -1130,9 +1133,7 @@ public class CameraDeviceImpl extends CameraDevice
         * @see android.media.MediaActionSound
         */
        public void onCaptureStarted(CameraDevice camera,
                CaptureRequest request, long timestamp, long frameNumber) {
            // default empty implementation
        }
                CaptureRequest request, long timestamp, long frameNumber);

        /**
         * This method is called when some results from an image capture are
@@ -1141,9 +1142,7 @@ public class CameraDeviceImpl extends CameraDevice
         * @hide
         */
        public void onCapturePartial(CameraDevice camera,
                CaptureRequest request, CaptureResult result) {
            // default empty implementation
        }
                CaptureRequest request, CaptureResult result);

        /**
         * This method is called when an image capture makes partial forward progress; some
@@ -1151,18 +1150,14 @@ public class CameraDeviceImpl extends CameraDevice
         *
         */
        public void onCaptureProgressed(CameraDevice camera,
                CaptureRequest request, CaptureResult partialResult) {
            // default empty implementation
        }
                CaptureRequest request, CaptureResult partialResult);

        /**
         * This method is called when an image capture has fully completed and all the
         * result metadata is available.
         */
        public void onCaptureCompleted(CameraDevice camera,
                CaptureRequest request, TotalCaptureResult result) {
            // default empty implementation
        }
                CaptureRequest request, TotalCaptureResult result);

        /**
         * This method is called instead of {@link #onCaptureCompleted} when the
@@ -1170,9 +1165,7 @@ public class CameraDeviceImpl extends CameraDevice
         * request.
         */
        public void onCaptureFailed(CameraDevice camera,
                CaptureRequest request, CaptureFailure failure) {
            // default empty implementation
        }
                CaptureRequest request, CaptureFailure failure);

        /**
         * This method is called independently of the others in CaptureCallback,
@@ -1180,9 +1173,7 @@ public class CameraDeviceImpl extends CameraDevice
         * or {@link CaptureFailure} for it have been returned via this callback.
         */
        public void onCaptureSequenceCompleted(CameraDevice camera,
                int sequenceId, long frameNumber) {
            // default empty implementation
        }
                int sequenceId, long frameNumber);

        /**
         * This method is called independently of the others in CaptureCallback,
@@ -1190,14 +1181,16 @@ public class CameraDeviceImpl extends CameraDevice
         * or {@link CaptureFailure} for it have been returned via this callback.
         */
        public void onCaptureSequenceAborted(CameraDevice camera,
                int sequenceId) {
            // default empty implementation
        }
                int sequenceId);

        /**
         * This method is called independently of the others in CaptureCallback, if an output buffer
         * is dropped for a particular capture request.
         *
         * Loss of metadata is communicated via onCaptureFailed, independently of any buffer loss.
         */
        public void onCaptureBufferLost(CameraDevice camera,
                CaptureRequest request, Surface target, long frameNumber) {
            // default empty implementation
        }
                CaptureRequest request, Surface target, long frameNumber);
    }

    /**