summaryrefslogtreecommitdiffstats
path: root/core/java/android/hardware
diff options
context:
space:
mode:
authorAndrew Harp <andrewharp@google.com>2009-10-20 01:47:05 -0400
committerAndrew Harp <andrewharp@google.com>2009-10-23 01:44:47 -0400
commit94927dffce1626898b59579dfc5af53b5de8cef6 (patch)
tree792222e0686d1d72abfeb4d1b10d1d68d940bf01 /core/java/android/hardware
parent785768a9216b3a631237587feffea2aeb05a91cc (diff)
downloadframeworks_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.java54
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);
}