androidcamera: Add autofocus support
This commit is contained in:
parent
24b29d4266
commit
1ef65636d1
@ -2,7 +2,9 @@ package com.gstreamer;
|
|||||||
|
|
||||||
import android.hardware.Camera;
|
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 mUserData;
|
||||||
public long mCallback;
|
public long mCallback;
|
||||||
|
|
||||||
@ -10,6 +12,8 @@ public class GstAhcCallback implements Camera.PreviewCallback, Camera.ErrorCallb
|
|||||||
long callback, long user_data);
|
long callback, long user_data);
|
||||||
public static native void gst_ah_camera_on_error(int error, Camera camera,
|
public static native void gst_ah_camera_on_error(int error, Camera camera,
|
||||||
long callback, long user_data);
|
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) {
|
public GstAhcCallback(long callback, long user_data) {
|
||||||
mCallback = callback;
|
mCallback = callback;
|
||||||
@ -25,4 +29,9 @@ public class GstAhcCallback implements Camera.PreviewCallback, Camera.ErrorCallb
|
|||||||
public void onError(int error, Camera camera) {
|
public void onError(int error, Camera camera) {
|
||||||
gst_ah_camera_on_error(error, camera, mCallback, mUserData);
|
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;
|
jclass klass;
|
||||||
jmethodID addCallbackBuffer;
|
jmethodID addCallbackBuffer;
|
||||||
|
jmethodID autoFocus;
|
||||||
|
jmethodID cancelAutoFocus;
|
||||||
jmethodID getCameraInfo;
|
jmethodID getCameraInfo;
|
||||||
jmethodID getNumberOfCameras;
|
jmethodID getNumberOfCameras;
|
||||||
jmethodID getParameters;
|
jmethodID getParameters;
|
||||||
@ -277,11 +279,23 @@ gst_ah_camera_on_error (JNIEnv * env, jclass klass, jint error,
|
|||||||
cb (error, (gpointer) (gsize) user_data);
|
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[] = {
|
static JNINativeMethod native_methods[] = {
|
||||||
{"gst_ah_camera_on_preview_frame", "([BLandroid/hardware/Camera;JJ)V",
|
{"gst_ah_camera_on_preview_frame", "([BLandroid/hardware/Camera;JJ)V",
|
||||||
(void *) gst_ah_camera_on_preview_frame},
|
(void *) gst_ah_camera_on_preview_frame},
|
||||||
{"gst_ah_camera_on_error", "(ILandroid/hardware/Camera;JJ)V",
|
{"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
|
static gboolean
|
||||||
@ -292,6 +306,9 @@ _init_classes (void)
|
|||||||
/* android.hardware.Camera */
|
/* android.hardware.Camera */
|
||||||
GST_DVM_GET_CLASS (android_hardware_camera, "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, 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,
|
GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getCameraInfo,
|
||||||
"(ILandroid/hardware/Camera$CameraInfo;)V");
|
"(ILandroid/hardware/Camera$CameraInfo;)V");
|
||||||
GST_DVM_GET_STATIC_METHOD (android_hardware_camera, getNumberOfCameras,
|
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);
|
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
|
gboolean
|
||||||
gst_ah_camera_get_camera_info (gint camera_id, GstAHCCameraInfo * camera_info)
|
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 */
|
/* android.hardware.Camera.PreviewCallback */
|
||||||
typedef void (*GstAHCPreviewCallback) (jbyteArray data, gpointer user_data);
|
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);
|
gboolean gst_android_hardware_camera_init (void);
|
||||||
void gst_android_hardware_camera_deinit (void);
|
void gst_android_hardware_camera_deinit (void);
|
||||||
|
|
||||||
/* android.hardware.Camera */
|
/* android.hardware.Camera */
|
||||||
void gst_ah_camera_add_callback_buffer (GstAHCamera * self, jbyteArray buffer);
|
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,
|
gboolean gst_ah_camera_get_camera_info (gint camera_id,
|
||||||
GstAHCCameraInfo * camera_info);
|
GstAHCCameraInfo * camera_info);
|
||||||
gint gst_ah_camera_get_number_of_cameras (void);
|
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 */
|
/* GstAHCSrc */
|
||||||
static void gst_ahc_src_close (GstAHCSrc * self);
|
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_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
|
#define NUM_CALLBACK_BUFFERS 5
|
||||||
|
|
||||||
@ -1262,13 +1263,27 @@ gst_ahc_src_get_capabilities (GstPhotography * photo)
|
|||||||
GST_PHOTOGRAPHY_CAPS_FOCUS;
|
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
|
static void
|
||||||
gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on)
|
gst_ahc_src_set_autofocus (GstPhotography * photo, gboolean on)
|
||||||
{
|
{
|
||||||
GstAHCSrc *self = GST_AHC_SRC (photo);
|
GstAHCSrc *self = GST_AHC_SRC (photo);
|
||||||
|
|
||||||
if (self->camera) {
|
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
|
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);
|
GstAHCSrc *self = GST_AHC_SRC (user_data);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user