unload 3a in dispose.
[adaptation/intel_mfld/gst-plugins-atomisp.git] / gst / mfldv4l2cam / gstv4l2camsrc.c
index 3398d04..b189d92 100644 (file)
 #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 "c0b0c2804fa1e21f68ade84a5b403e4cb7f990bd"
+#define MFLD_V4L2CAMSRC_VERSION "85de990a519ae021f0bf4ec89c0e352ec76f6965"
+#define FOCUS_POSITION_MIN     0
+#define FOCUS_POSITION_MAX     512
 
 GST_DEBUG_CATEGORY (gst_v4l2camsrc_debug);
 #define GST_CAT_DEFAULT gst_v4l2camsrc_debug
@@ -70,9 +69,12 @@ static void gst_v4l2camsrc_get_property (GObject * object,
 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, void *buf);
+static gboolean gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size);
 static gboolean gst_v4l2camsrc_makernote_init(GstCameraSrc * camsrc,
                                                       unsigned * buf_size,
                                                       unsigned num_afwindows,
@@ -100,10 +102,16 @@ typedef enum
   PROP_USE_COPY,
   PROP_AE,
   PROP_AE_METERING_MODE,
+  PROP_AE_WINDOW,
+  PROP_AE_MODE,
   PROP_AF,
+  PROP_AF_METERING_MODE,
+  PROP_AF_WINDOW,
   PROP_AWB,
   PROP_STILL_AF,
   PROP_FOCUS_POSITION,
+  PROP_VFLIP,
+  PROP_HFLIP,
   PROP_BAYER_DOWNSCALING,
   PROP_CAPTURE_CORRECTION_GDC,
   PROP_CAPTURE_CORRECTION_CAC,
@@ -119,6 +127,9 @@ typedef enum
   PROP_CAPTURE_CORRECTION_BRIGHTNESS,
   PROP_DUMP_RAW,
   PROP_DUMP_IMAGE,
+  PROP_DEBUG_FLAGS,
+  PROP_DISABLE_LOW_RES_CROP,
+  PROP_DRAW_CORNER_MARKERS,
 } GstV4L2CamSrcProperties;
 
 
@@ -127,6 +138,19 @@ typedef enum
 #define DEFAULT_PROP_DEVICE_NAME  NULL
 #define DEFAULT_PROP_DEVICE       "/dev/video0"
 #define DEFAULT_PROP_DEVICE_FD    -1
+#define DEFAULT_PROP_AE_WINDOW  "x_left=0,x_right=0,y_bottom=0,y_top=0"
+#define DEFAULT_PROP_AF_WINDOW  "x_left=0,x_right=0,y_bottom=0,y_top=0"
+#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)
@@ -166,6 +190,68 @@ gst_camera_ae_metering_mode_get_type(void)
   return  gst_camera_ae_metering_mode_type;
 }
 
+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;
+  static GEnumValue gst_camera_af_metering_mode[] = {
+    {GST_CAMERA_AF_METERING_AUTO, "AF auto metering", "auto"},
+    {GST_CAMERA_AF_METERING_SPOT, "AF spot metering", "spot"},
+    {GST_CAMERA_AF_METERING_CENTER, "AF center metering", "center"},
+    {GST_CAMERA_AF_METERING_CUSTOMIZED, "AF customized metering", "customized"},
+    {0, NULL, NULL},
+  };
+
+  if (G_UNLIKELY (!gst_camera_af_metering_mode_type)) {
+    gst_camera_af_metering_mode_type=
+        g_enum_register_static ("GstCameraAFMeteringMode",
+        gst_camera_af_metering_mode);
+  }
+  return  gst_camera_af_metering_mode_type;
+}
+
+GType
+gst_camerasrc_debug_flags_get_type (void)
+{
+  static GType gst_camerasrc_debug_flags = 0;
+  static const GFlagsValue values [] = {
+    {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_PERFORMANCE), "Debug flags for performance tuning",
+      "performance"},
+    {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_MAKER_NOTE), "Debug flags for maker note",
+      "maker-note"},
+    {C_FLAGS (GST_CAMERASRC_DEBUG_FLAGS_AUTO_FOCUS), "Debug flags for auto focus",
+      "auto-focus"},
+    {0, NULL, NULL},
+  };
+
+  if (G_UNLIKELY (!gst_camerasrc_debug_flags)) {
+    gst_camerasrc_debug_flags =
+        g_flags_register_static ("GstCameraSrcDebugFlags", values);
+  }
+  return  gst_camerasrc_debug_flags;
+}
+
+
 
 GST_IMPLEMENT_V4L2CAMSRC_VIDORIENT_METHODS (GstMFLDV4l2CamSrc, gst_v4l2camsrc);
 
@@ -533,9 +619,13 @@ gst_v4l2camsrc_get_caps (GstCameraSrc * camsrc)
     }
   }
 
+  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;
 }
@@ -621,6 +711,8 @@ gst_v4l2camsrc_get_all_caps (void)
         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);
@@ -658,6 +750,16 @@ gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
     GstPhotoSettings * photoconf);
 gboolean gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
     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:
@@ -697,7 +799,7 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class, PROP_INPUT_SENSOR,
-      g_param_spec_enum ("input-sensor", "Input Sensor",
+      g_param_spec_enum ("camera-id", "Camera Id",
           "Which sensor is the input of the ISP",
           GST_TYPE_CAMERA_INPUT_SENSOR,
           GST_CAMERA_INPUT_SENSOR_PRIMARY,
@@ -723,10 +825,39 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
           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,"
+         "y_bottom=value,y_top=value",
+         DEFAULT_PROP_AE_WINDOW,
+         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
+
 
   g_object_class_install_property (gobject_class, PROP_AF,
       g_param_spec_boolean ("af", "Auto Focus",
           "Auto Focus is On or Off", TRUE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+  g_object_class_install_property (gobject_class, PROP_AF_METERING_MODE,
+      g_param_spec_enum ("af-metering-mode", "AF Metering Mode",
+          "Select AF Metering Mode",
+          GST_TYPE_CAMERA_AF_METERING_MODE,
+          GST_CAMERA_AF_METERING_AUTO,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_AF_WINDOW,
+      g_param_spec_string("af-window", "AF Window",
+          "Set AF Window Coordinates in format: x_left=value,x_right=value,"
+         "y_bottom=value,y_top=value",
+         DEFAULT_PROP_AF_WINDOW,
+         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS ));
+
   g_object_class_install_property (gobject_class, PROP_AWB,
       g_param_spec_boolean ("awb", "White Balance",
           "White Balance is On or Off",
@@ -739,7 +870,8 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_FOCUS_POSITION,
       g_param_spec_int ("focus-posi", "Focus Position",
-          "Focus abosolute position set to Sensor.", G_MININT, G_MAXINT, 0,
+          "Focus absolute position set to Sensor.", FOCUS_POSITION_MIN,
+         FOCUS_POSITION_MAX, 0,
          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE));
 
   g_object_class_install_property (gobject_class, PROP_BAYER_DOWNSCALING,
@@ -817,10 +949,40 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_DUMP_IMAGE,
       g_param_spec_boolean ("dump-image", "Dump images simultanious in pipeline",
-          "Whether dump the  images as output when pipeline, debug only,"
+          "Whether dump the  images as output in pipeline, debug only,"
          "output the image in current directory",
           FALSE, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_DEBUG_FLAGS,
+      g_param_spec_flags ("debug-flags", "debug flags",
+          "debug flags for development and performance tuning usage",
+         GST_TYPE_CAMERASRC_DEBUG_FLAGS, DEFAULT_DEBUG_FLAGS,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class,
+      PROP_VFLIP,
+      g_param_spec_boolean ("vflip", "Vertical Flip",
+          "Vertical flip", FALSE,
+          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+  g_object_class_install_property (gobject_class,
+      PROP_HFLIP,
+      g_param_spec_boolean ("hflip", "Horisontal Flip",
+          "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);
@@ -853,10 +1015,19 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
   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);
 }
@@ -872,16 +1043,12 @@ gst_v4l2camsrc_mfldadvci_wrapper_load (GstMFLDV4l2CamSrc * v4l2camsrc)
   GstV4l2MFLDAdvCI *mfldadvci;
 
   mfldadvci = g_new0 (GstV4l2MFLDAdvCI, 1);
+  wrapper_default_link_functions_init(mfldadvci);
 
-  int (*init_function) (GstV4l2MFLDAdvCI * mfldadvci);
-
-  wrapper_default_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);
@@ -892,31 +1059,12 @@ gst_v4l2camsrc_mfldadvci_wrapper_load (GstMFLDV4l2CamSrc * v4l2camsrc)
       v4l2camsrc->module = g_module_open (module_file, G_MODULE_BIND_LOCAL);
       GST_DEBUG_OBJECT (v4l2camsrc, "Loading %s", module_file);
     }
-
+    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) {
-        if (init_function (mfldadvci) < 0) {
-          GST_WARNING_OBJECT (v4l2camsrc, "Failed to init libmfldadvci symbol");
-          g_module_close (v4l2camsrc->module);
-          v4l2camsrc->module = NULL;
-        }
-      } 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;
 }
@@ -930,21 +1078,12 @@ gst_v4l2camsrc_mfldadvci_wrapper_unload (GstMFLDV4l2CamSrc * v4l2camsrc)
 {
   GstV4l2MFLDAdvCI *mfldadvci = v4l2camsrc->mfldadvci;
 
-  if (v4l2camsrc->module) {
-    void (*deinit_function) (GstV4l2MFLDAdvCI * mfldadvci);
-    gboolean ret;
+  GST_DEBUG ("mfldadvci unload");
+  g_module_close (v4l2camsrc->module);
+  v4l2camsrc->module = NULL;
 
-    GST_DEBUG_OBJECT (v4l2camsrc, "Unloading libmfldadvci");
-
-    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);
+
 }
 
 
@@ -981,9 +1120,9 @@ gst_v4l2camsrc_init (GstMFLDV4l2CamSrc * v4l2camsrc,
   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;
@@ -997,12 +1136,29 @@ gst_v4l2camsrc_init (GstMFLDV4l2CamSrc * v4l2camsrc,
   v4l2camsrc->dump_raw = FALSE;
   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->mfldadvci = gst_v4l2camsrc_mfldadvci_wrapper_load (v4l2camsrc);
 
   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;
+  v4l2camsrc->ae_window.x_right = 0;
+  v4l2camsrc->ae_window.y_bottom = 0;
+  v4l2camsrc->ae_window.y_top = 0;
+  v4l2camsrc->ae_window.weight= 0x8000;
+  v4l2camsrc->af_window.x_left = 0;
+  v4l2camsrc->af_window.x_right = 0;
+  v4l2camsrc->af_window.y_bottom = 0;
+  v4l2camsrc->af_window.y_top = 0;
+  v4l2camsrc->af_window.weight= 0x8000;
 
   libmfld_cam_init (v4l2camsrc->mfldadvci);
 
@@ -1038,6 +1194,7 @@ gst_v4l2camsrc_dispose (GObject * object)
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
   libmfld_cam_dispose ();
+  gst_v4l2camsrc_mfldadvci_wrapper_unload(v4l2camsrc);
 }
 
 
@@ -1084,15 +1241,162 @@ gst_v4l2camsrc_set_property (GObject * object,
     case PROP_AE:
       v4l2camsrc->ae_enabled = g_value_get_boolean (value);
       break;
+    case PROP_AE_WINDOW:
+    {
+      GstStructure *ae_window_param = NULL;
+      char * ctmp = NULL;
+      gboolean parsed = TRUE;
+
+      ctmp = g_malloc0 (60);
+      if (ctmp == NULL)
+      {
+            GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
+            break;
+      }
+      strncpy (ctmp,"ae,",3);
+      strncat (ctmp,g_value_get_string (value),55);
+      ae_window_param = gst_structure_from_string (ctmp, NULL);
+      if(ae_window_param == NULL)
+      {
+             GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting ae window.\n");
+             g_free (ctmp);
+             break;
+      }
+
+      parsed = gst_structure_get_int(ae_window_param, "x_left",
+                     &v4l2camsrc->ae_window.x_left);
+      parsed |= gst_structure_get_int(ae_window_param, "x_right",
+                     &v4l2camsrc->ae_window.x_right);
+      parsed |= gst_structure_get_int(ae_window_param, "y_top",
+                     &v4l2camsrc->ae_window.y_top);
+      parsed |= gst_structure_get_int(ae_window_param, "y_bottom",
+                     &v4l2camsrc->ae_window.y_bottom);
+
+      if (parsed == FALSE)
+      {
+               GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse ae window parameter. \n");
+               gst_structure_free (ae_window_param);
+               g_free (ctmp);
+               break;
+      }
+
+      parsed = gst_structure_get_int(ae_window_param, "weight",
+                     &v4l2camsrc->ae_window.weight);
+
+      if (parsed == FALSE)
+      {
+       GST_DEBUG_OBJECT(v4l2camsrc,
+                            "set ae window weight to default value 0x8000.\n");
+        v4l2camsrc->ae_window.weight = 0x8000;
+      }
+
+      GST_DEBUG_OBJECT(v4l2camsrc,"ae-window-setting: x_left:%d, x_right:%d,"
+                     "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.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;
+               v4l2camsrc->mfldadvci->AeSetMeteringMode
+                       ( (advci_ae_metering_mode) v4l2camsrc->ae_metering_mode);
+
+      }
+      v4l2camsrc->mfldadvci->AeSetWindow ((advci_window *) (&(v4l2camsrc->ae_window)));
+
+      gst_structure_free (ae_window_param);
+      g_free (ctmp);
+      break;
+    }
+
     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((advci_af_metering_mode)v4l2camsrc->af_metering_mode);
+      break;
+    }
+    case PROP_AF_WINDOW:
+    {
+      GstStructure *af_window_param = NULL;
+      char * ctmp = NULL;
+      gboolean parsed = TRUE;
+
+      ctmp = g_malloc0 (60);
+      if (ctmp == NULL)
+      {
+            GST_DEBUG_OBJECT(v4l2camsrc, "alloc string mem failed.\n");
+            break;
+      }
+      strncpy (ctmp,"af,",3);
+      strncat (ctmp,g_value_get_string (value),55);
+      af_window_param = gst_structure_from_string (ctmp, NULL);
+      if(af_window_param == NULL)
+      {
+             GST_DEBUG_OBJECT(v4l2camsrc,"wrong string format is entered. stop setting af window.\n");
+             g_free (ctmp);
+             break;
+      }
+
+      parsed = gst_structure_get_int(af_window_param, "x_left",
+                     &v4l2camsrc->af_window.x_left);
+      parsed |= gst_structure_get_int(af_window_param, "x_right",
+                     &v4l2camsrc->af_window.x_right);
+      parsed |= gst_structure_get_int(af_window_param, "y_top",
+                     &v4l2camsrc->af_window.y_top);
+      parsed |= gst_structure_get_int(af_window_param, "y_bottom",
+                     &v4l2camsrc->af_window.y_bottom);
+
+      if (parsed == FALSE)
+      {
+               GST_DEBUG_OBJECT(v4l2camsrc,"cannot parse af window parameter. \n");
+               gst_structure_free (af_window_param);
+               g_free (ctmp);
+               break;
+      }
+
+      parsed = gst_structure_get_int(af_window_param, "weight",
+                     &v4l2camsrc->af_window.weight);
+
+      if (parsed == FALSE)
+      {
+            GST_DEBUG_OBJECT(v4l2camsrc,
+                            "set af window weight to default value 0x8000.\n");
+            v4l2camsrc->af_window.weight = 0x8000;
+      }
+
+      GST_DEBUG_OBJECT(v4l2camsrc,"af-window-setting: x_left:%d, x_right:%d,"
+                     "y_bottom:%d, y_top:%d, weight:%d.\n",
+                     v4l2camsrc->af_window.x_left,v4l2camsrc->af_window.x_right,
+                     v4l2camsrc->af_window.y_bottom, v4l2camsrc->af_window.y_top,
+                     v4l2camsrc->af_window.y_top);
+
+
+      v4l2camsrc->mfldadvci->AfSetWindows (1, (advci_window *) (&(v4l2camsrc->af_window)));
+
+      gst_structure_free (af_window_param);
+      g_free (ctmp);
       break;
     }
+
     case PROP_AF:
       v4l2camsrc->af_enabled = g_value_get_boolean (value);
       break;
+
     case PROP_AWB:
       v4l2camsrc->awb_enabled = g_value_get_boolean (value);
       break;
@@ -1107,6 +1411,16 @@ gst_v4l2camsrc_set_property (GObject * object,
       else
         v4l2camsrc->focus_updated = TRUE;
       break;
+    case PROP_VFLIP:
+      v4l2camsrc->vflip = g_value_get_boolean(value);
+      if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc)))
+        gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_VFLIP,v4l2camsrc->vflip);
+      break;
+    case  PROP_HFLIP:
+      v4l2camsrc->hflip = g_value_get_boolean(value);
+      if (gst_v4l2camsrc_is_open (GST_CAMERA_SRC (v4l2camsrc))) 
+        gst_v4l2camsrc_set_attribute (GST_CAMERA_SRC (v4l2camsrc),V4L2_CID_HFLIP,v4l2camsrc->hflip);
+      break;
     case PROP_BAYER_DOWNSCALING:
       v4l2camsrc->bayer_downscaling = g_value_get_boolean (value);
       break;
@@ -1206,6 +1520,15 @@ gst_v4l2camsrc_set_property (GObject * object,
     case PROP_DUMP_IMAGE:
       v4l2camsrc->dump_image = g_value_get_boolean (value);
       break;
+    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;
@@ -1266,9 +1589,59 @@ gst_v4l2camsrc_get_property (GObject * object,
     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;
+      tmp = gst_structure_empty_new("ae-window");
+      if(tmp == NULL)
+      {
+             GST_DEBUG ("wrong default ae window setting.\n");
+             break;
+      }
+      gst_structure_set (tmp,"x_left", G_TYPE_INT,
+                     v4l2camsrc->ae_window.x_left,NULL);
+      gst_structure_set (tmp,"x_right", G_TYPE_INT,
+                     v4l2camsrc->ae_window.x_right,NULL);
+      gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
+                     v4l2camsrc->ae_window.y_bottom,NULL);
+      gst_structure_set (tmp,"y_top", G_TYPE_INT,
+                     v4l2camsrc->ae_window.y_top,NULL);
+      g_value_set_string(value, gst_structure_to_string(tmp));
+      gst_structure_free(tmp);
+      break;
+    }
+
     case PROP_AF:
       g_value_set_boolean (value, v4l2camsrc->af_enabled);
       break;
+    case PROP_AF_METERING_MODE:
+      g_value_set_enum (value, v4l2camsrc->af_metering_mode);
+      break;
+    case PROP_AF_WINDOW:
+    {
+      GstStructure *tmp = NULL;
+      tmp = gst_structure_empty_new("af-window");
+      if(tmp == NULL)
+      {
+             GST_DEBUG ("wrong default af window setting.\n");
+             break;
+      }
+      gst_structure_set (tmp,"x_left", G_TYPE_INT,
+                     v4l2camsrc->af_window.x_left,NULL);
+      gst_structure_set (tmp,"x_right", G_TYPE_INT,
+                     v4l2camsrc->af_window.x_right,NULL);
+      gst_structure_set (tmp,"y_bottom", G_TYPE_INT,
+                     v4l2camsrc->af_window.y_bottom,NULL);
+      gst_structure_set (tmp,"y_top", G_TYPE_INT,
+                     v4l2camsrc->af_window.y_top,NULL);
+      g_value_set_string(value, gst_structure_to_string(tmp));
+      gst_structure_free(tmp);
+      break;
+    }
+
     case PROP_AWB:
       g_value_set_boolean (value, v4l2camsrc->awb_enabled);
       break;
@@ -1278,6 +1651,12 @@ gst_v4l2camsrc_get_property (GObject * object,
     case PROP_FOCUS_POSITION:
       g_value_set_int (value, v4l2camsrc->focus_posi);
       break;
+    case PROP_VFLIP:
+      g_value_set_boolean (value, v4l2camsrc->vflip);
+      break;
+    case PROP_HFLIP:
+      g_value_set_boolean (value,  v4l2camsrc->hflip);
+      break;
     case PROP_BAYER_DOWNSCALING:
       g_value_set_boolean (value, v4l2camsrc->bayer_downscaling);
       break;
@@ -1323,6 +1702,15 @@ gst_v4l2camsrc_get_property (GObject * object,
     case PROP_DUMP_IMAGE:
       g_value_set_boolean (value, v4l2camsrc->dump_image);
       break;
+    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;
@@ -1382,9 +1770,42 @@ gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom)
 
   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, void *buf)
+gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, unsigned char *buf, unsigned size)
 {
   GstMFLDV4l2CamSrc *v4l2camsrc;
   gboolean ret = TRUE;
@@ -1394,7 +1815,7 @@ gst_v4l2camsrc_get_makernote (GstCameraSrc * camsrc, void *buf)
 
   if (v4l2camsrc->is_active) {
     g_mutex_lock (v4l2camsrc->device_mutex);
-    ret = gst_v4l2camsrc_libmfldcam_get_makernote(v4l2camsrc, buf);
+    ret = gst_v4l2camsrc_libmfldcam_get_makernote(v4l2camsrc, buf, size);
     g_mutex_unlock (v4l2camsrc->device_mutex);
   }
 
@@ -1410,19 +1831,14 @@ static gboolean gst_v4l2camsrc_makernote_init(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__);
 
   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,
@@ -1432,19 +1848,12 @@ 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,
@@ -1455,10 +1864,7 @@ 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;
 }
 
 
@@ -1471,10 +1877,10 @@ static gboolean gst_v4l2camsrc_makernote_uninit(GstCameraSrc * camsrc,
 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);
 }