diff --git a/sys/androidcamera/com/gstreamer/GstAhcCallback.java b/sys/androidcamera/com/gstreamer/GstAhcCallback.java index 45ce0e8550..0763d91f6e 100644 --- a/sys/androidcamera/com/gstreamer/GstAhcCallback.java +++ b/sys/androidcamera/com/gstreamer/GstAhcCallback.java @@ -2,7 +2,9 @@ package com.gstreamer; import android.hardware.Camera; -public class GstAhcCallback implements Camera.PreviewCallback, Camera.ErrorCallback { +public class GstAhcCallback implements Camera.PreviewCallback, + Camera.ErrorCallback, + Camera.AutoFocusCallback { public long mUserData; public long mCallback; @@ -10,6 +12,8 @@ public class GstAhcCallback implements Camera.PreviewCallback, Camera.ErrorCallb long callback, long user_data); public static native void gst_ah_camera_on_error(int error, Camera camera, long callback, long user_data); + public static native void gst_ah_camera_on_auto_focus(boolean success, Camera camera, + long callback, long user_data); public GstAhcCallback(long callback, long user_data) { mCallback = callback; @@ -25,4 +29,9 @@ public class GstAhcCallback implements Camera.PreviewCallback, Camera.ErrorCallb public void onError(int error, Camera camera) { gst_ah_camera_on_error(error, camera, mCallback, mUserData); } + + @Override + public void onAutoFocus(boolean success, Camera camera) { + gst_ah_camera_on_auto_focus(success, camera, mCallback, mUserData); + } } diff --git a/sys/androidcamera/gst-android-hardware-camera.c b/sys/androidcamera/gst-android-hardware-camera.c index 53d09e46e5..7578c847df 100644 --- a/sys/androidcamera/gst-android-hardware-camera.c +++ b/sys/androidcamera/gst-android-hardware-camera.c @@ -32,6 +32,8 @@ static struct { jclass klass; jmethodID addCallbackBuffer; + jmethodID autoFocus; + jmethodID cancelAutoFocus; jmethodID getCameraInfo; jmethodID getNumberOfCameras; jmethodID getParameters; @@ -277,11 +279,23 @@ gst_ah_camera_on_error (JNIEnv * env, jclass klass, jint error, cb (error, (gpointer) (gsize) user_data); } +static void +gst_ah_camera_on_auto_focus (JNIEnv * env, jclass klass, jboolean success, + jobject camera, jlong callback, jlong user_data) +{ + GstAHCAutoFocusCallback cb = (GstAHCAutoFocusCallback) (gsize) callback; + + if (cb) + cb (success, (gpointer) (gsize) user_data); +} + static JNINativeMethod native_methods[] = { {"gst_ah_camera_on_preview_frame", "([BLandroid/hardware/Camera;JJ)V", (void *) gst_ah_camera_on_preview_frame}, {"gst_ah_camera_on_error", "(ILandroid/hardware/Camera;JJ)V", - (void *) gst_ah_camera_on_error} + (void *) gst_ah_camera_on_error}, + {"gst_ah_camera_on_auto_focus", "(ZLandroid/hardware/Camera;JJ)V", + (void *) gst_ah_camera_on_auto_focus} }; static gboolean @@ -292,6 +306,9 @@ _init_classes (void) /* android.hardware.Camera */ GST_DVM_GET_CLASS (android_hardware_camera, "android/hardware/Camera"); GST_DVM_GET_METHOD (android_hardware_camera, addCallbackBuffer, "([B)V"); + GST_DVM_GET_METHOD (android_hardware_camera, autoFocus, + "(Landroid/hardware/Camera$AutoFocusCallback;)V"); + GST_DVM_GET_METHOD (android_hardware_camera, cancelAutoFocus, "()V"); GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getCameraInfo, "(ILandroid/hardware/Camera$CameraInfo;)V"); GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getNumberOfCameras, @@ -1654,6 +1671,46 @@ gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer) AHC_CALL (, Void, addCallbackBuffer, buffer); } +gboolean +gst_ah_camera_auto_focus (GstAHCamera * self, + GstAHCAutoFocusCallback cb, gpointer user_data) +{ + JNIEnv *env = gst_dvm_get_env (); + jobject object = NULL; + gboolean ret = FALSE; + + if (cb) { + object = (*env)->NewObject (env, + com_gstreamer_gstahccallback.klass, + com_gstreamer_gstahccallback.constructor, + *((jlong *) & cb), *((jlong *) & user_data)); + if (!object) { + GST_ERROR ("Failed to create callback object"); + (*env)->ExceptionClear (env); + goto done; + } + } + + AHC_CALL (goto done, Void, autoFocus, object); + + ret = TRUE; +done: + if (object) + (*env)->DeleteLocalRef (env, object); + + return ret; +} + +gboolean +gst_ah_camera_cancel_auto_focus (GstAHCamera * self) +{ + JNIEnv *env = gst_dvm_get_env (); + + AHC_CALL (return FALSE, Void, cancelAutoFocus); + + return TRUE; +} + gboolean gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info) { diff --git a/sys/androidcamera/gst-android-hardware-camera.h b/sys/androidcamera/gst-android-hardware-camera.h index d4246bc480..6ce80337c3 100644 --- a/sys/androidcamera/gst-android-hardware-camera.h +++ b/sys/androidcamera/gst-android-hardware-camera.h @@ -118,11 +118,17 @@ typedef void (*GstAHCErrorCallback) (gint error, gpointer user_data); /* android.hardware.Camera.PreviewCallback */ typedef void (*GstAHCPreviewCallback) (jbyteArray data, gpointer user_data); +/* android.hardware.Camera.AutoFocusCallback */ +typedef void (*GstAHCAutoFocusCallback) (gboolean success, gpointer user_data); + gboolean gst_android_hardware_camera_init (void); void gst_android_hardware_camera_deinit (void); /* android.hardware.Camera */ void gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer); +gboolean gst_ah_camera_auto_focus (GstAHCamera * self, + GstAHCAutoFocusCallback cb, gpointer user_data); +gboolean gst_ah_camera_cancel_auto_focus (GstAHCamera * self); gboolean gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info); gint gst_ah_camera_get_number_of_cameras (void); diff --git a/sys/androidcamera/gstahcsrc.c b/sys/androidcamera/gstahcsrc.c index 121a74612a..12d44efd6b 100644 --- a/sys/androidcamera/gstahcsrc.c +++ b/sys/androidcamera/gstahcsrc.c @@ -101,7 +101,8 @@ static void gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on); /* GstAHCSrc */ static void gst_ahc_src_close (GstAHCSrc * self); static void gst_ahc_src_on_preview_frame (jbyteArray data, gpointer user_data); -static void gst_ahc_src_on_error (int error, gpointer user_data); +static void gst_ahc_src_on_error (gint error, gpointer user_data); +static void gst_ahc_src_on_auto_focus (gboolean success, gpointer user_data); #define NUM_CALLBACK_BUFFERS 5 @@ -1262,13 +1263,27 @@ gst_ahc_src_get_capabilities (GstPhotography * photo) GST_PHOTOGRAPHY_CAPS_FOCUS; } +static void +gst_ahc_src_on_auto_focus (gboolean success, gpointer user_data) +{ + GstAHCSrc *self = GST_AHC_SRC (user_data); + + GST_WARNING_OBJECT (self, "Auto focus completed : %d", success); + gst_element_post_message (GST_ELEMENT (self), + gst_message_new_custom (GST_MESSAGE_ELEMENT, GST_OBJECT (self), + gst_structure_new (GST_PHOTOGRAPHY_AUTOFOCUS_DONE, NULL))); +} + static void gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on) { GstAHCSrc *self = GST_AHC_SRC (photo); if (self->camera) { - /* TODO: Call the autofocus and signal when callback is called */ + if (on) + gst_ah_camera_auto_focus (self->camera, gst_ahc_src_on_auto_focus, self); + else + gst_ah_camera_cancel_auto_focus (self->camera); } } @@ -1700,7 +1715,7 @@ gst_ahc_src_on_preview_frame (jbyteArray array, gpointer user_data) } static void -gst_ahc_src_on_error (int error, gpointer user_data) +gst_ahc_src_on_error (gint error, gpointer user_data) { GstAHCSrc *self = GST_AHC_SRC (user_data);