OSDN Git Service

Throttle camera preview frames to the app. Bug 2180302.
authorDave Sparks <davidsparks@android.com>
Tue, 13 Oct 2009 09:28:54 +0000 (02:28 -0700)
committerDave Sparks <davidsparks@android.com>
Tue, 13 Oct 2009 09:52:00 +0000 (02:52 -0700)
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

core/java/android/hardware/Camera.java

index 3806fa8..0c1c7ec 100644 (file)
@@ -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;