From a6118c6383c6f5703a576d08586a340fd71d28a4 Mon Sep 17 00:00:00 2001 From: Dave Sparks Date: Tue, 13 Oct 2009 02:28:54 -0700 Subject: [PATCH] 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 --- core/java/android/hardware/Camera.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 3806fa815ec36..0c1c7ec666984 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -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;