mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
androidcamera: Add autofocus support
This commit is contained in:
parent
24b29d4266
commit
1ef65636d1
4 changed files with 92 additions and 5 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue