#include "gstv4l2camvidorient.h"
#include <mfld_cam.h>
-#include "exifmakernote_main.h"
-#include "exifmakernote_util.h"
-
#define MFLD_ADVCI_PATH "/usr/lib/"
-#define MFLD_V4L2CAMSRC_VERSION "5e436697caea9d9d47d31601c4c9b9bf14559d7c"
+#define MFLD_V4L2CAMSRC_VERSION "85de990a519ae021f0bf4ec89c0e352ec76f6965"
#define FOCUS_POSITION_MIN 0
#define FOCUS_POSITION_MAX 512
static gboolean gst_v4l2camsrc_unlock (GstCameraSrc * src);
static gboolean gst_v4l2camsrc_unlock_stop (GstCameraSrc * src);
static gboolean gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom);
+static gboolean gst_v4l2camsrc_set_ae_mode (GstCameraSrc * camsrc, int mode);
+static gboolean gst_v4l2camsrc_get_ae_mode (GstCameraSrc * camsrc, int *mode);
+
static gboolean gst_v4l2camsrc_iface_supported (GstImplementsInterface * iface,
GType iface_type);
static gboolean gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size);
PROP_AE,
PROP_AE_METERING_MODE,
PROP_AE_WINDOW,
+ PROP_AE_MODE,
PROP_AF,
PROP_AF_METERING_MODE,
PROP_AF_WINDOW,
PROP_DUMP_RAW,
PROP_DUMP_IMAGE,
PROP_DEBUG_FLAGS,
+ PROP_DISABLE_LOW_RES_CROP,
+ PROP_DRAW_CORNER_MARKERS,
} GstV4L2CamSrcProperties;
#define DEFAULT_DEBUG_FLAGS 0
#define C_FLAGS(v) ((guint) v)
+
+static const char* surface_string =
+ "video/x-vaapi-sharing, "
+ "type = vaapi, "
+ "width = (int) [ 1, MAX ], "
+ "height = (int) [ 1, MAX ], "
+ "framerate = (fraction) [ 0, MAX ]";
+
+
GType
gst_camera_input_sensor_get_type (void)
{
}
GType
+gst_camera_ae_mode_get_type(void)
+{
+ static GType gst_camera_ae_mode_type = 0;
+ static GEnumValue gst_camera_ae_mode[] = {
+ {GST_CAMERA_AE_MODE_AUTO, "AE auto", "auto"},
+ {GST_CAMERA_AE_MODE_MANUAL, "AE manual", "manual"},
+ {GST_CAMERA_AE_MODE_SHUTTER_PRIORITY, "AE shutter priority", "shutter"},
+ {GST_CAMERA_AE_MODE_APERTURE_PRIORITY, "AE aperture priority", "aperture"},
+ {0, NULL, NULL},
+ };
+
+ if (G_UNLIKELY (!gst_camera_ae_mode_type)) {
+ gst_camera_ae_mode_type=
+ g_enum_register_static ("GstCameraAEMode",
+ gst_camera_ae_mode);
+ }
+ return gst_camera_ae_mode_type;
+}
+
+GType
gst_camera_af_metering_mode_get_type(void)
{
static GType gst_camera_af_metering_mode_type = 0;
}
}
+ GstStructure * structure = gst_structure_from_string(surface_string, NULL);
+ gst_caps_append_structure (ret, structure);
+
v4l2camsrc->probed_caps = gst_caps_ref (ret);
- GST_INFO_OBJECT (v4l2camsrc, "probed caps: %" GST_PTR_FORMAT, ret);
+ GST_INFO_OBJECT(v4l2camsrc, "use GST_DEBUG >= 5 for probed caps");
+ GST_LOG_OBJECT (v4l2camsrc, "probed caps: %" GST_PTR_FORMAT, ret);
return ret;
}
gst_caps_append_structure (caps, structure);
}
}
+ structure = gst_structure_from_string(surface_string, NULL);
+ gst_caps_append_structure (caps, structure);
}
return gst_caps_ref (caps);
GstPhotoSettings * photoconf, gboolean scene_override);
gboolean
gst_v4l2camsrc_set_flash_mode (GstCameraSrc *camsrc, int value);
+gboolean
+gst_v4l2camsrc_read_exif (GstCameraSrc *camsrc,
+ GstCameraControlExifInfo *exif_info);
+gboolean
+gst_v4l2camsrc_set_strobe_state (GstCameraSrc *camsrc, gboolean state);
+gboolean
+gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window);
/*
* gst_v4l2camsrc_class_init:
GST_CAMERA_AE_METERING_AUTO,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_AE_MODE,
+ g_param_spec_enum ("ae-mode", "AE Mode",
+ "Select AE Mode",
+ GST_TYPE_CAMERA_AE_MODE,
+ GST_CAMERA_AE_MODE_AUTO,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class, PROP_AE_WINDOW,
g_param_spec_string("ae-window", "AE Window",
"Set AE Window Coordinates in format: x_left=value,x_right=value,"
"Horisontal flip", FALSE,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+ g_object_class_install_property (gobject_class,
+ PROP_DISABLE_LOW_RES_CROP,
+ g_param_spec_boolean ("disable-low-res-crop", "disable low resolution crop",
+ "disable software crop on unsupported low resolution frame size", FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_DRAW_CORNER_MARKERS,
+ g_param_spec_boolean ("draw-corner-markers", "draw markers in frame corners",
+ "draw markers in frame corners", FALSE,
+ G_PARAM_READWRITE));
+
camera_class->is_open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_is_open);
camera_class->open = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_open);
camera_class->close = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_close);
camera_class->get_capabilities =
GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_capabilities);
camera_class->set_zoom = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_zoom);
+ camera_class->set_AeAafwindow = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_AeAafwindow);
+ camera_class->set_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_ae_mode);
+ camera_class->get_ae_mode = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_ae_mode);
+
camera_class->get_makernote = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_makernote);
camera_class->makernote_init = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_init);
camera_class->makernote_deal = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_deal);
camera_class->makernote_uninit = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_makernote_uninit);
camera_class->set_flash_mode = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_flash_mode);
+ camera_class->read_exif = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_read_exif);
+ camera_class->set_strobe_state = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_set_strobe_state);
//camera_class->fill_image_tags = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_fill_image_tags);
//camera_class->get_preview_image = GST_DEBUG_FUNCPTR(gst_v4l2camsrc_get_preview_image);
GstV4l2MFLDAdvCI *mfldadvci;
mfldadvci = g_new0 (GstV4l2MFLDAdvCI, 1);
- gint advci_version;
-
- int (*init_function) (GstV4l2MFLDAdvCI * mfldadvci);
-
- wrapper_default_functions_init (mfldadvci);
+ wrapper_default_link_functions_init(mfldadvci);
+#ifdef USE_DYNAMIC_3A
if (g_module_supported ()) {
gchar *module_file;
-
module_file = g_module_build_path (MFLD_ADVCI_PATH, "libmfldadvci.so.0");
-
GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
}
-
- printf("Camera Source Interface version is %d\n", LIBMFLDADVCI_VERSION);
-
+ GST_DEBUG_OBJECT(v4l2camsrc, "Camera Source Interface version is %d\n", LIBMFLDADVCI_VERSION);
if (v4l2camsrc->module) {
- gboolean ret;
-
- ret = g_module_symbol (v4l2camsrc->module, "libmfldadvci_init",
- (gpointer) & init_function);
-
- if (ret) {
- advci_version = init_function (mfldadvci);
- if (advci_version < 0) {
- GST_WARNING_OBJECT (v4l2camsrc, "Failed to init libmfldadvci symbol");
- g_module_close (v4l2camsrc->module);
- v4l2camsrc->module = NULL;
- } else {
- if (advci_version != LIBMFLDADVCI_VERSION) {
- GST_WARNING_OBJECT (v4l2camsrc,
- "libmfldadvci version mismatch with camera source,"
- "the 3A is disabled, please update your libmfldadvci to %d",
- LIBMFLDADVCI_VERSION);
- g_module_close (v4l2camsrc->module);
- v4l2camsrc->module = NULL;
- wrapper_default_functions_init (mfldadvci);
- }
- }
- } else {
- GST_WARNING_OBJECT (v4l2camsrc, "libmfldadvci: Init symbol not found");
- g_module_close (v4l2camsrc->module);
- v4l2camsrc->module = NULL;
- }
- } else {
- GST_DEBUG_OBJECT (v4l2camsrc,
- "libmfldadvci: Opening the module failed: %s", g_module_error ());
+ lib_3a_link_functions_init(mfldadvci, v4l2camsrc->module);
}
- g_free (module_file);
- GST_DEBUG_OBJECT (v4l2camsrc, "libmfldadvci: initialized");
}
+#endif /* USE_DYNAMIC_3A */
return mfldadvci;
}
{
GstV4l2MFLDAdvCI *mfldadvci = v4l2camsrc->mfldadvci;
- if (v4l2camsrc->module) {
- void (*deinit_function) (GstV4l2MFLDAdvCI * mfldadvci);
- gboolean ret;
-
- GST_DEBUG_OBJECT (v4l2camsrc, "Unloading libmfldadvci");
+ GST_DEBUG ("mfldadvci unload");
+ g_module_close (v4l2camsrc->module);
+ v4l2camsrc->module = NULL;
- ret = g_module_symbol (v4l2camsrc->module, "libmfdladvci_deinit",
- (gpointer) & deinit_function);
- if (ret) {
- deinit_function (mfldadvci);
- }
- g_module_close (v4l2camsrc->module);
- v4l2camsrc->module = NULL;
- }
g_free (mfldadvci);
+
}
v4l2camsrc->sc_enabled = TRUE;
v4l2camsrc->cc_updated = FALSE;
v4l2camsrc->gamma_updated = FALSE;
- v4l2camsrc->ae_enabled = FALSE;
- v4l2camsrc->af_enabled = FALSE;
- v4l2camsrc->awb_enabled = FALSE;
+ v4l2camsrc->ae_enabled = TRUE;
+ v4l2camsrc->af_enabled = TRUE;
+ v4l2camsrc->awb_enabled = TRUE;
v4l2camsrc->still_af = FALSE;
v4l2camsrc->bayer_downscaling = FALSE;
v4l2camsrc->tone.gamma = 2.2;
v4l2camsrc->dump_image = FALSE;
v4l2camsrc->raw_output_size = 0;
v4l2camsrc->debug_flags = DEFAULT_DEBUG_FLAGS;
+ v4l2camsrc->disable_low_res_crop = FALSE;
+ v4l2camsrc->draw_corner_markers = FALSE;
v4l2camsrc->device_mutex = g_mutex_new ();
v4l2camsrc->input_sensor = GST_CAMERA_INPUT_SENSOR_PRIMARY;
v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_AUTO;
+ v4l2camsrc->ae_mode = GST_CAMERA_AE_MODE_AUTO;
v4l2camsrc->af_metering_mode = GST_CAMERA_AF_METERING_AUTO;
v4l2camsrc->ae_window.x_left = 0;
G_OBJECT_CLASS (parent_class)->dispose (object);
libmfld_cam_dispose ();
+ gst_v4l2camsrc_mfldadvci_wrapper_unload(v4l2camsrc);
}
GstStructure *ae_window_param = NULL;
char * ctmp = NULL;
gboolean parsed = TRUE;
- ci_adv_Err r;
ctmp = g_malloc0 (60);
if (ctmp == NULL)
"y_bottom:%d, y_top:%d, weight:%d.\n",
v4l2camsrc->ae_window.x_left,v4l2camsrc->ae_window.x_right,
v4l2camsrc->ae_window.y_bottom, v4l2camsrc->ae_window.y_top,
- v4l2camsrc->ae_window.y_top);
+ v4l2camsrc->ae_window.weight);
if (v4l2camsrc->ae_metering_mode != GST_CAMERA_AE_METERING_SPOT)
{
GST_DEBUG_OBJECT(v4l2camsrc,"wrong ae metering mode. set it to spot mode automaticly.\n");
v4l2camsrc->ae_metering_mode = GST_CAMERA_AE_METERING_SPOT;
- ci_adv_Err r = v4l2camsrc->mfldadvci->AeSetMeteringMode
- ( (ci_adv_AeMeteringMode) v4l2camsrc->ae_metering_mode);
- if(r != ci_adv_Success)
- {
- GST_DEBUG_OBJECT(v4l2camsrc,"set metering mode failed.\n");
- }
+ v4l2camsrc->mfldadvci->AeSetMeteringMode
+ ( (advci_ae_metering_mode) v4l2camsrc->ae_metering_mode);
}
- r = v4l2camsrc->mfldadvci->AeSetWindow ((ci_adv_Window *) (&(v4l2camsrc->ae_window)));
- if(r != ci_adv_Success)
- {
- GST_DEBUG_OBJECT(v4l2camsrc,"ae set window failed due to 3a lib error.\n");
- }
+ v4l2camsrc->mfldadvci->AeSetWindow ((advci_window *) (&(v4l2camsrc->ae_window)));
gst_structure_free (ae_window_param);
g_free (ctmp);
case PROP_AE_METERING_MODE:
{
v4l2camsrc->ae_metering_mode = g_value_get_enum (value);
- v4l2camsrc->mfldadvci->AeSetMeteringMode((ci_adv_AeMeteringMode)v4l2camsrc->ae_metering_mode);
+ v4l2camsrc->mfldadvci->AeSetMeteringMode((advci_ae_metering_mode)v4l2camsrc->ae_metering_mode);
+ break;
+ }
+ case PROP_AE_MODE:
+ {
+ v4l2camsrc->ae_mode = g_value_get_enum (value);
+ v4l2camsrc->mfldadvci->AeSetMode((advci_ae_mode)v4l2camsrc->ae_mode);
break;
}
case PROP_AF_METERING_MODE:
{
v4l2camsrc->af_metering_mode = g_value_get_enum (value);
- v4l2camsrc->mfldadvci->AfSetMeteringMode((ci_adv_AfMeteringMode)v4l2camsrc->af_metering_mode);
+ v4l2camsrc->mfldadvci->AfSetMeteringMode((advci_af_metering_mode)v4l2camsrc->af_metering_mode);
break;
}
case PROP_AF_WINDOW:
GstStructure *af_window_param = NULL;
char * ctmp = NULL;
gboolean parsed = TRUE;
- ci_adv_Err r;
ctmp = g_malloc0 (60);
if (ctmp == NULL)
v4l2camsrc->af_window.y_top);
- r = v4l2camsrc->mfldadvci->AfSetWindow ((ci_adv_Window *) (&(v4l2camsrc->af_window)));
- if(r != ci_adv_Success)
- {
- GST_DEBUG_OBJECT(v4l2camsrc,"af set window failed due to 3a lib error.\n");
- }
+ v4l2camsrc->mfldadvci->AfSetWindows (1, (advci_window *) (&(v4l2camsrc->af_window)));
gst_structure_free (af_window_param);
g_free (ctmp);
case PROP_DEBUG_FLAGS:
v4l2camsrc->debug_flags = g_value_get_flags (value);
break;
+ case PROP_DISABLE_LOW_RES_CROP:
+ v4l2camsrc->disable_low_res_crop = g_value_get_boolean (value);
+ break;
+ case PROP_DRAW_CORNER_MARKERS:
+ v4l2camsrc->draw_corner_markers = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_AE_METERING_MODE:
g_value_set_enum (value, v4l2camsrc->ae_metering_mode);
break;
+ case PROP_AE_MODE:
+ g_value_set_enum (value, v4l2camsrc->ae_mode);
+ break;
case PROP_AE_WINDOW:
{
GstStructure *tmp = NULL;
case PROP_DEBUG_FLAGS:
g_value_set_flags (value, v4l2camsrc->debug_flags);
break;
+ case PROP_DISABLE_LOW_RES_CROP:
+ g_value_set_boolean (value, v4l2camsrc->disable_low_res_crop);
+ break;
+ case PROP_DRAW_CORNER_MARKERS:
+ g_value_set_boolean (value, v4l2camsrc->draw_corner_markers);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
return ret;
}
+static gboolean
+gst_v4l2camsrc_set_ae_mode(GstCameraSrc * camsrc, int mode)
+{
+ GstMFLDV4l2CamSrc *v4l2camsrc;
+ gboolean ret = TRUE;
+
+ v4l2camsrc = GST_V4L2CAMSRC (camsrc);
+
+ if (v4l2camsrc->is_active) {
+ g_mutex_lock (v4l2camsrc->device_mutex);
+ v4l2camsrc->ae_metering_mode = *(GstCameraAEMeteringMode *)&mode;
+ v4l2camsrc->mfldadvci->AeSetMeteringMode((advci_ae_metering_mode)v4l2camsrc->ae_metering_mode);
+ g_mutex_unlock (v4l2camsrc->device_mutex);
+ }
+
+ return ret;
+}
+static gboolean
+gst_v4l2camsrc_get_ae_mode(GstCameraSrc * camsrc, int *mode)
+{
+ GstMFLDV4l2CamSrc *v4l2camsrc;
+ gboolean ret = TRUE;
+
+ v4l2camsrc = GST_V4L2CAMSRC (camsrc);
+
+ if (v4l2camsrc->is_active) {
+ g_mutex_lock (v4l2camsrc->device_mutex);
+ *mode = v4l2camsrc->ae_metering_mode;
+ g_mutex_unlock (v4l2camsrc->device_mutex);
+ }
+
+ return ret;
+}
static gboolean
gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size)
int *handle)
{
GstMFLDV4l2CamSrc *v4l2camsrc;
- ENUM_MAKERNOTE_RET_VAL ret;
v4l2camsrc = GST_V4L2CAMSRC (camsrc);
GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
num_afwindows = num_grid = 1;
num_faces = num_eyes = 0;
- ret = makernote_nokia_init(num_afwindows, num_faces,
- num_eyes, num_grid, handle, buf_size);
- if(ENUM_MAKERNOTE_RET_TRUE != ret)
- return FALSE;
+ return FALSE;
- return TRUE;
}
static gboolean gst_v4l2camsrc_makernote_deal(GstCameraSrc * camsrc,
int handle)
{
GstMFLDV4l2CamSrc *v4l2camsrc;
- ENUM_MAKERNOTE_RET_VAL ret;
v4l2camsrc = GST_V4L2CAMSRC (camsrc);
GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
- makernote_util_create(handle, num_afwindows, num_grid, camsrc); // af windows is one, grid for awb is one
-
- ret = makernote_nokia_copy_buffer(handle, GST_BUFFER_DATA(pmakerbuf),
- GST_BUFFER_SIZE(pmakerbuf));
- if(ENUM_MAKERNOTE_RET_TRUE != ret)
- return FALSE;
+ return FALSE;
- return TRUE;
}
static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
v4l2camsrc = GST_V4L2CAMSRC (camsrc);
GST_DEBUG_OBJECT (v4l2camsrc, "%s, !!!!!!line:%d\n", __func__, __LINE__);
- if(makernote_nokia_uninit(handle) != ENUM_MAKERNOTE_RET_TRUE)
- return FALSE;
-
- return TRUE;
+ return FALSE;
}
static gboolean
plugin_init (GstPlugin * plugin)
{
- GST_DEBUG_CATEGORY_INIT (gst_v4l2camsrc_debug, "mfldv4l2camsrc", 0,
+ GST_DEBUG_CATEGORY_INIT (gst_v4l2camsrc_debug, "camerasrc", 0,
"Medfield V4L2 camera source");
- return gst_element_register (plugin, "mfldv4l2camsrc",
+ return gst_element_register (plugin, "camerasrc",
GST_RANK_NONE, GST_TYPE_V4L2CAMSRC);
}