diff options
| author | Andrew Harp <andrewharp@google.com> | 2009-10-20 01:47:05 -0400 |
|---|---|---|
| committer | Andrew Harp <andrewharp@google.com> | 2009-10-23 01:44:47 -0400 |
| commit | 94927dffce1626898b59579dfc5af53b5de8cef6 (patch) | |
| tree | 792222e0686d1d72abfeb4d1b10d1d68d940bf01 /core/java/android/hardware | |
| parent | 785768a9216b3a631237587feffea2aeb05a91cc (diff) | |
| download | frameworks_base-94927dffce1626898b59579dfc5af53b5de8cef6.zip frameworks_base-94927dffce1626898b59579dfc5af53b5de8cef6.tar.gz frameworks_base-94927dffce1626898b59579dfc5af53b5de8cef6.tar.bz2 | |
Patching in hidden API to allow app managed preview frame buffers.
Commit-Id: If3c30fc932697afa966cc97b17749e9996de92ee
Diffstat (limited to 'core/java/android/hardware')
| -rw-r--r-- | core/java/android/hardware/Camera.java | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 0c1c7ec..4b733ef 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -81,6 +81,7 @@ public class Camera { private ZoomCallback mZoomCallback; private ErrorCallback mErrorCallback; private boolean mOneShot; + private boolean mWithBuffer; /** * Returns a new Camera object. @@ -229,9 +230,10 @@ public class Camera { public final void setPreviewCallback(PreviewCallback cb) { mPreviewCallback = cb; mOneShot = false; + mWithBuffer = false; // Always use one-shot mode. We fake camera preview mode by // doing one-shot preview continuously. - setHasPreviewCallback(cb != null, true); + setHasPreviewCallback(cb != null, false); } /** @@ -241,14 +243,48 @@ public class Camera { * @param cb A callback object that receives a copy of the preview frame. */ public final void setOneShotPreviewCallback(PreviewCallback cb) { - if (cb != null) { - mPreviewCallback = cb; - mOneShot = true; - setHasPreviewCallback(true, true); - } + mPreviewCallback = cb; + mOneShot = true; + mWithBuffer = false; + setHasPreviewCallback(cb != null, false); + } + + private native final void setHasPreviewCallback(boolean installed, boolean manualBuffer); + + /** + * Installs a callback which will get called as long as there are buffers in the + * preview buffer queue, which minimizes dynamic allocation of preview buffers. + * + * Apps must call addCallbackBuffer to explicitly register the buffers to use, or no callbacks + * will be received. addCallbackBuffer may be safely called before or after + * a call to setPreviewCallbackWithBuffer with a non-null callback parameter. + * + * The buffer queue will be cleared upon any calls to setOneShotPreviewCallback, + * setPreviewCallback, or to this method with a null callback parameter. + * + * @param cb A callback object that receives a copy of the preview frame. A null value will clear the queue. + * @hide + */ + public final void setPreviewCallbackWithBuffer(PreviewCallback cb) { + mPreviewCallback = cb; + mOneShot = false; + mWithBuffer = true; + setHasPreviewCallback(cb != null, true); } - private native final void setHasPreviewCallback(boolean installed, boolean oneshot); + /** + * Adds a pre-allocated buffer to the callback buffer queue. + * Preview width and height can be determined from getPreviewSize, and bitsPerPixel can be + * found from from {@link android.hardware.Camera.Parameters#getPreviewFormat()} and + * {@link android.graphics.PixelFormat#getPixelFormatInfo(int, PixelFormat)} + * + * Alternatively, a buffer from a previous callback may be passed in or used + * to determine the size of new preview frame buffers. + * + * @param callbackBuffer The buffer to register. Size should be width * height * bitsPerPixel / 8. + * @hide + */ + public native final void addCallbackBuffer(byte[] callbackBuffer); private class EventHandler extends Handler { @@ -288,11 +324,11 @@ public class Camera { // in case the app calls setPreviewCallback from // the callback function mPreviewCallback = null; - } else { + } else if (!mWithBuffer) { // 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); + setHasPreviewCallback(true, false); } cb.onPreviewFrame((byte[])msg.obj, mCamera); } |
