Add zoom and postview callbacks to Camera. This patch

adds a zoom callback to the Java layer. If the hardware supports
a smooth zoom function, this provides a way to update the UI as
the zoom is moving from its original setting to the new commanded
setting. This postview callback supports receive a processed
image before the JPEG encode completes. This allows the display
to be rotated without losing the final preview frame.
This commit is contained in:
Dave Sparks
2009-07-14 10:35:40 -07:00
parent c634fdd803
commit e8b26e197f
2 changed files with 133 additions and 8 deletions

View File

@@ -56,7 +56,9 @@ public class Camera {
private PictureCallback mRawImageCallback;
private PictureCallback mJpegCallback;
private PreviewCallback mPreviewCallback;
private PictureCallback mPostviewCallback;
private AutoFocusCallback mAutoFocusCallback;
private ZoomCallback mZoomCallback;
private ErrorCallback mErrorCallback;
private boolean mOneShot;
@@ -72,6 +74,8 @@ public class Camera {
mRawImageCallback = null;
mJpegCallback = null;
mPreviewCallback = null;
mPostviewCallback = null;
mZoomCallback = null;
Looper looper;
if ((looper = Looper.myLooper()) != null) {
@@ -245,13 +249,15 @@ public class Camera {
return;
case CAMERA_MSG_RAW_IMAGE:
if (mRawImageCallback != null)
if (mRawImageCallback != null) {
mRawImageCallback.onPictureTaken((byte[])msg.obj, mCamera);
}
return;
case CAMERA_MSG_COMPRESSED_IMAGE:
if (mJpegCallback != null)
if (mJpegCallback != null) {
mJpegCallback.onPictureTaken((byte[])msg.obj, mCamera);
}
return;
case CAMERA_MSG_PREVIEW_FRAME:
@@ -263,15 +269,29 @@ public class Camera {
}
return;
case CAMERA_MSG_POSTVIEW_FRAME:
if (mPostviewCallback != null) {
mPostviewCallback.onPictureTaken((byte[])msg.obj, mCamera);
}
return;
case CAMERA_MSG_FOCUS:
if (mAutoFocusCallback != null)
if (mAutoFocusCallback != null) {
mAutoFocusCallback.onAutoFocus(msg.arg1 == 0 ? false : true, mCamera);
}
return;
case CAMERA_MSG_ZOOM:
if (mZoomCallback != null) {
mZoomCallback.onZoomUpdate(msg.arg1, mCamera);
}
return;
case CAMERA_MSG_ERROR :
Log.e(TAG, "Error " + msg.arg1);
if (mErrorCallback != null)
if (mErrorCallback != null) {
mErrorCallback.onError(msg.arg1, mCamera);
}
return;
default:
@@ -364,13 +384,63 @@ public class Camera {
*/
public final void takePicture(ShutterCallback shutter, PictureCallback raw,
PictureCallback jpeg) {
mShutterCallback = shutter;
mRawImageCallback = raw;
mJpegCallback = jpeg;
native_takePicture();
takePicture(shutter, raw, null, jpeg);
}
private native final void native_takePicture();
/**
* Triggers an asynchronous image capture. The camera service
* will initiate a series of callbacks to the application as the
* image capture progresses. The shutter callback occurs after
* the image is captured. This can be used to trigger a sound
* to let the user know that image has been captured. The raw
* callback occurs when the raw image data is available. The
* postview callback occurs when a scaled, fully processed
* postview image is available (NOTE: not all hardware supports
* this). The jpeg callback occurs when the compressed image is
* available. If the application does not need a particular
* callback, a null can be passed instead of a callback method.
*
* @param shutter callback after the image is captured, may be null
* @param raw callback with raw image data, may be null
* @param postview callback with postview image data, may be null
* @param jpeg callback with jpeg image data, may be null
*/
public final void takePicture(ShutterCallback shutter, PictureCallback raw,
PictureCallback postview, PictureCallback jpeg) {
mShutterCallback = shutter;
mRawImageCallback = raw;
mPostviewCallback = postview;
mJpegCallback = jpeg;
native_takePicture();
}
/**
* Handles the zoom callback.
*/
public interface ZoomCallback
{
/**
* Callback for zoom updates
* @param zoomLevel new zoom level in 1/1000 increments,
* e.g. a zoom of 3.2x is stored as 3200. Accuracy of the
* value is dependent on the hardware implementation. Not
* all devices will generate this callback.
* @param camera the Camera service object
*/
void onZoomUpdate(int zoomLevel, Camera camera);
};
/**
* Registers a callback to be invoked when the zoom
* level is updated by the camera driver.
* @param cb the callback to run
*/
public final void setZoomCallback(ZoomCallback cb)
{
mZoomCallback = cb;
}
// These match the enum in include/ui/Camera.h
/** Unspecified camerar error. @see #ErrorCallback */
public static final int CAMERA_ERROR_UNKNOWN = 1;