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

Commit a6118c63 authored by Dave Sparks's avatar Dave Sparks
Browse files

Throttle camera preview frames to the app. Bug 2180302.

With higher frame rates and larger preview frames, we can easily
flood the application with too much data. This patch fakes the
old camera preview mode by doing continuous one-shot frames.
After the previous frame is handled, if the application hasn't
cleared the preview callback, we start another one-shot preview
frame. With this change, the application should never have more
than one preview frame unless it is explicitly saving references
to them.

	modified:   core/java/android/hardware/Camera.java
parent 6dc3f4e5
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -229,7 +229,9 @@ public class Camera {
    public final void setPreviewCallback(PreviewCallback cb) {
        mPreviewCallback = cb;
        mOneShot = false;
        setHasPreviewCallback(cb != null, false);
        // Always use one-shot mode. We fake camera preview mode by
        // doing one-shot preview continuously.
        setHasPreviewCallback(cb != null, true);
    }

    /**
@@ -280,10 +282,19 @@ public class Camera {

            case CAMERA_MSG_PREVIEW_FRAME:
                if (mPreviewCallback != null) {
                    mPreviewCallback.onPreviewFrame((byte[])msg.obj, mCamera);
                    PreviewCallback cb = mPreviewCallback;
                    if (mOneShot) {
                        // Clear the callback variable before the callback
                        // in case the app calls setPreviewCallback from
                        // the callback function
                        mPreviewCallback = null;
                    } else {
                        // We're faking the camera preview mode to prevent
                        // the app from being flooded with preview frames.
                        // Set to oneshot mode again.
                        setHasPreviewCallback(true, true);
                    }
                    cb.onPreviewFrame((byte[])msg.obj, mCamera);
                }
                return;