androidcamera: Add autofocus support

This commit is contained in:
Youness Alaoui 2012-11-02 17:00:45 -04:00 committed by Nicolas Dufresne
parent 24b29d4266
commit 1ef65636d1
4 changed files with 92 additions and 5 deletions

View file

@ -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);
}
}

View file

@ -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)
{

View file

@ -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);

View file

@ -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);