Add support for auto focus range.
authorMarko Ollonen <marko.ollonen@ixonos.com>
Tue, 9 Apr 2013 13:07:23 +0000 (16:07 +0300)
committerMarko Ollonen <marko.ollonen@ixonos.com>
Tue, 9 Apr 2013 13:28:27 +0000 (16:28 +0300)
Focus range and mode now separated.

Change-Id: I4eeaa81abc740a957b6b78d9c74b40f7891016c1

gst-libs/atomisphal/mfld_cam.c
gst-libs/atomisphal/mfld_cam.h
gst-libs/gst/camera/gstmfldcameracontroliface.c
gst-libs/gst/camera/gstmfldcameracontroliface.h
gst-libs/gst/camera/gstmfldcamerasrc.c
gst-libs/gst/camera/gstmfldcamerasrc.h
gst/mfldv4l2cam/gstv4l2camsrc.c
gst/mfldv4l2cam/v4l2camsrc_calls.c
packaging/gst-plugins-atomisp.changes

index e82c67f..7ee6d58 100644 (file)
@@ -427,49 +427,57 @@ get_flicker_mode (int *mode)
   return ret;
 }
 
-static cam_err_t
-set_focus_mode (int mode)
+cam_err_t
+cam_set_focus_mode (int mode, int range)
 {
 
   if ( (mfld_driver.sensor_type == SENSOR_TYPE_RAW) &&
-             (mfld_cam_settings.focus_mode != mode) ) {
+             (mfld_cam_settings.focus_mode != mode  ||
+             mfld_cam_settings.focus_range != range) ) {
 
-    cam_driver_dbg ("%s mode %d\n", __func__, mode);
+    cam_driver_dbg ("%s mode: %d range:%d \n", __func__, mode, range);
     switch (mode) {
       case CAM_FOCUS_MODE_AUTO:
         mfldadvci->AfSetMode (advci_af_mode_manual);
-        mfldadvci->AfSetRange (advci_af_range_norm);
         mfldadvci->AfSetMeteringMode(advci_af_metering_mode_auto);
         break;
       case CAM_FOCUS_MODE_TOUCH_AUTO:
         mfldadvci->AfSetMode (advci_af_mode_auto);
-        mfldadvci->AfSetRange (advci_af_range_full);
         mfldadvci->AfSetMeteringMode(advci_af_metering_mode_multi);
         break;
       case CAM_FOCUS_MODE_MACRO:
-        mfldadvci->AfSetMode (advci_af_mode_auto);
-        mfldadvci->AfSetRange (advci_af_range_macro);
-        mfldadvci->AfSetMeteringMode(advci_af_metering_mode_auto);
-        break;
       case CAM_FOCUS_MODE_NORM:
+      case CAM_FOCUS_MODE_CONTINUOUS:
         mfldadvci->AfSetMode (advci_af_mode_auto);
-        mfldadvci->AfSetRange (advci_af_range_norm);
         mfldadvci->AfSetMeteringMode(advci_af_metering_mode_auto);
         break;
       case CAM_FOCUS_MODE_FULL:
+      case CAM_FOCUS_MODE_HYPERFOCAL:
+      case CAM_FOCUS_MODE_MANUAL:
         mfldadvci->AfSetMode (advci_af_mode_manual);
-        mfldadvci->AfSetRange (advci_af_range_full);
         break;
-      case CAM_FOCUS_MODE_CONTINUOUS:
-        mfldadvci->AfSetMode (advci_af_mode_auto);
+      default:
+        cam_driver_dbg ("Not supported mode\n");
+        return CAM_ERR_UNSUPP;
+    }
+    switch (range) {
+      case CAM_FOCUS_RANGE_NORMAL:
         mfldadvci->AfSetRange (advci_af_range_norm);
-        mfldadvci->AfSetMeteringMode(advci_af_metering_mode_auto);
+        break;
+      case CAM_FOCUS_RANGE_MACRO:
+        mfldadvci->AfSetRange (advci_af_range_macro);
+        break;
+      case CAM_FOCUS_RANGE_FULL:
+        mfldadvci->AfSetRange (advci_af_range_full);
         break;
       default:
         cam_driver_dbg ("Not supported mode\n");
         return CAM_ERR_UNSUPP;
+        break;
     }
   mfld_cam_settings.focus_mode = mode;
+  mfld_cam_settings.focus_range = range;
+
   }
   return CAM_ERR_NONE;
 }
@@ -1077,9 +1085,6 @@ cam_feature_set (int fd, cam_photo_feature_t feature, int value)
     case CAM_EXPOSURE_ISO_VALUE:
          ret = set_iso_speed (value);
       break;
-    case CAM_FOCUS_MODE:
-      ret = set_focus_mode (value);
-      break;
     case CAM_GENERAL_FLICKER_REDUCTION_MODE:
       ret = set_flicker_mode (value);
       break;
@@ -1205,6 +1210,7 @@ libmfld_cam_init (GstV4l2MFLDAdvCI * advci)
   mfld_cam_settings.tone_mode = CAM_GENERAL_EFFECT_TYPE_NORMAL;
   mfld_cam_settings.flicker_mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_50HZ;
   mfld_cam_settings.focus_mode = CAM_FOCUS_MODE_AUTO;
+  mfld_cam_settings.focus_range = CAM_FOCUS_RANGE_FULL;
 
   mfld_driver.ae_awb_af_enabled = 0;
   mfld_driver.dis_enabled = 0;
index 21c447c..b690a01 100644 (file)
@@ -141,8 +141,18 @@ typedef enum
   CAM_FOCUS_MODE_NORM,
   CAM_FOCUS_MODE_CONTINUOUS,
   CAM_FOCUS_MODE_TOUCH_AUTO,
+  CAM_FOCUS_MODE_HYPERFOCAL,
+  CAM_FOCUS_MODE_MANUAL
 } cam_focus_mode_t;
 
+
+typedef enum
+{
+ CAM_FOCUS_RANGE_NORMAL,
+ CAM_FOCUS_RANGE_MACRO,
+ CAM_FOCUS_RANGE_FULL
+} cam_focus_range_t;
+
 typedef enum
 {
   CAM_VIEWFINDER_MODE_VIEWFINDER,
@@ -208,7 +218,7 @@ struct mfld_cam_settings_t
   int ev_compensation;
   int iso_speed;
   struct tone_control tone;
-  int flicker_mode, focus_mode;
+  int flicker_mode, focus_mode, focus_range;
   int noise_reduction, capture_correction;
   float zoom;
 };
@@ -248,6 +258,8 @@ cam_err_t cam_set_frame_rate( float frame_rate);
 
 int cam_checkfocus_status (cam_focus_status_t * status, int force_update);
 
+cam_err_t cam_set_focus_mode (int mode, int range);
+
 cam_err_t cam_get_shake_risk (int fd, int risk);
 
 cam_err_t cam_set_flash (int fd, int on);
index 8b1b9d8..5d4fe0a 100644 (file)
@@ -360,42 +360,21 @@ gst_camerasrc_camera_control_set_focus( GstCameraSrc* camerasrc,
   GstFocusMode focus_mode;
   gboolean ret = TRUE;
 
-  GST_DEBUG_OBJECT (camerasrc, "gst_camerasrc_camera_control_set_focus: %d", mode);
+  GST_DEBUG_OBJECT (camerasrc, "set_focus mode: %d range:%d", mode, range);
 
   bclass = GST_CAMERA_SRC_GET_CLASS (camerasrc);
   opened = bclass->is_open (camerasrc);
   g_return_val_if_fail (opened, FALSE);
 
-  // Map focus to photography definitions
-  switch (mode) {
-    case MM_CAMCORDER_FOCUS_MODE_NONE:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY;
-      break;
-    case MM_CAMCORDER_FOCUS_MODE_AUTO:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO;
-      break;
-   case MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT;
-      break;
-    case MM_CAMCORDER_FOCUS_MODE_PAN:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL;
-      break;
-    case MM_CAMCORDER_FOCUS_MODE_MANUAL:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY;
-      break;
-    case MM_CAMCORDER_FOCUS_MODE_CONTINUOUS:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL ;
-      break;
-    default:
-      focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY;
-      break;
-   }
   GST_OBJECT_LOCK (camerasrc);
   camerasrc->photoconf.focus_mode = focus_mode;
+  camerasrc->af_range = range;
+  camerasrc->af_mode = mode;
+
   GST_OBJECT_UNLOCK (camerasrc);
 
   if (bclass->is_active (camerasrc)) {
-    ret = bclass->write_settings (camerasrc, &camerasrc->photoconf, FALSE);
+    bclass->set_focus_state(camerasrc, camerasrc->af_mode, camerasrc->af_range);
   }
 
   return ret;
@@ -412,27 +391,12 @@ gst_camerasrc_camera_control_get_focus( GstCameraSrc* camerasrc,
   bclass = GST_CAMERA_SRC_GET_CLASS (camerasrc);
   opened = bclass->is_open (camerasrc);
   g_return_val_if_fail (opened, FALSE);
-  // Map focus from photography definitions
+
   GST_OBJECT_LOCK (camerasrc);
-  switch (camerasrc->photoconf.focus_mode) {
-    case GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY:
-      *mode = MM_CAMCORDER_FOCUS_MODE_NONE;
-      break;
-    case GST_PHOTOGRAPHY_FOCUS_MODE_AUTO:
-      *mode = MM_CAMCORDER_FOCUS_MODE_AUTO;
-      break;
-    case GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL:
-      *mode = MM_CAMCORDER_FOCUS_MODE_PAN;
-      break;
-    case GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL:
-      *mode = MM_CAMCORDER_FOCUS_MODE_CONTINUOUS;
-      break;
-    default:
-      *mode = MM_CAMCORDER_FOCUS_MODE_NONE;
-      break;
-   }
+  *mode = camerasrc->af_mode;
+  *range = camerasrc->af_range;
   GST_OBJECT_UNLOCK (camerasrc);
-  *range = 0;
+
 
   return TRUE;
 }
index 5814830..6a70ee0 100644 (file)
@@ -45,16 +45,6 @@ G_BEGIN_DECLS
 #define GST_IS_CAMERA_SRC_CAMERA_CONTROL_CHANNEL_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CAMERA_SRC_CAMERA_CONTROL_CHANNEL))
 
-/* Nicely defined Interface. These are taken from user of interface no definitions in interface itself  */
-typedef enum{
-  MM_CAMCORDER_FOCUS_MODE_NONE = 0,   /**< Focus mode is None */
-  MM_CAMCORDER_FOCUS_MODE_PAN,        /**< Pan focus mode*/
-  MM_CAMCORDER_FOCUS_MODE_AUTO,       /**< Autofocus mode*/
-  MM_CAMCORDER_FOCUS_MODE_MANUAL,     /**< Manual focus mode*/
-  MM_CAMCORDER_FOCUS_MODE_TOUCH_AUTO, /**< Touch Autofocus mode*/
-  MM_CAMCORDER_FOCUS_MODE_CONTINUOUS, /**< Continuous Autofocus mode*/
-} MMCamcorderFocusMode;
-
 
 typedef struct _GstCameraSrcCameraControlChannel {
   GstCameraControlChannel parent;
index 241338f..b177a7b 100644 (file)
@@ -919,6 +919,8 @@ gst_camerasrc_init (GstCameraSrc * camerasrc, GstCameraSrcClass * klass)
   camerasrc->preview_fourcc = 0;
 
   camerasrc->requested_af_mode = AF_NONE_REQUESTED;
+  camerasrc->af_range = AF_RANGE_FULL;
+  camerasrc->af_mode = AF_MODE_AUTO;
   camerasrc->maker_note = FALSE;
 
   /* second pad init */
index 2a99adc..e1a9653 100644 (file)
@@ -136,6 +136,21 @@ typedef enum {
   AF_ON_REQUESTED
 } GstCameraSrcAFReqMode;
 
+typedef enum {
+  AF_RANGE_NORMAL,
+  AF_RANGE_MACRO,
+  AF_RANGE_FULL
+} GstCameraSrcAFRange;
+
+typedef enum{
+  AF_MODE_NONE = 0,   /**< Focus mode is None */
+  AF_MODE_PAN,        /**< Pan focus mode*/
+  AF_MODE_AUTO,       /**< Autofocus mode*/
+  AF_MODE_MANUAL,     /**< Manual focus mode*/
+  AF_TOUCH_AUTO,      /**< Touch Autofocus mode*/
+  AF_CONTINUOUS,      /**< Continuous Autofocus mode*/
+} GstCameraSrcAFMode;
+
 
 /**
  * GstCameraCapturePhase:
@@ -246,6 +261,9 @@ struct _GstCameraSrc {
   //guint      frame_byte_size;
 
   guint8 requested_af_mode;
+  gint af_range;
+  gint af_mode;
+
   gboolean     maker_note;
   gboolean enable_torch;
 
@@ -391,6 +409,9 @@ struct _GstCameraSrcClass
   (*write_settings)    (GstCameraSrc *camsrc,
                         GstPhotoSettings *photoconf,
                         gboolean scene_mode_override);
+  gboolean
+  (*set_focus_state)    (GstCameraSrc *camsrc,
+                         gint mode, gint range);
 
   gboolean
   (*read_settings)     (GstCameraSrc *camsrc, GstPhotoSettings *photoconf);
index b71399b..53898f9 100644 (file)
@@ -751,6 +751,10 @@ gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
     GstPhotoSettings * photoconf);
 gboolean gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
     GstPhotoSettings * photoconf, gboolean scene_override);
+
+gboolean gst_v4l2camsrc_set_focus_state(GstCameraSrc *camsrc,
+     gint mode, gint range);
+
 gboolean
 gst_v4l2camsrc_set_flash_mode (GstCameraSrc *camsrc, int value);
 gboolean
@@ -1030,6 +1034,9 @@ gst_v4l2camsrc_class_init (GstMFLDV4l2CamSrcClass * klass)
       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_read_settings);
   camera_class->write_settings =
       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_write_settings);
+  camera_class->set_focus_state =
+      GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_focus_state);
+
   camera_class->get_capabilities =
       GST_DEBUG_FUNCPTR (gst_v4l2camsrc_get_capabilities);
   camera_class->set_zoom = GST_DEBUG_FUNCPTR (gst_v4l2camsrc_set_zoom);
index 51f2eaf..558f8d1 100644 (file)
@@ -3058,14 +3058,12 @@ static const gint gst_v4l2camsrc_flash_map[] = {
 };
 
 static const gint gst_v4l2camsrc_focus_map[] = {
-  CAM_FOCUS_MODE_AUTO,          /* GST_PHOTOGRAPHY_FOCUS_MODE_AUTO = 0 */
-  CAM_FOCUS_MODE_MACRO,         /* GST_PHOTOGRAPHY_FOCUS_MODE_MACRO */
-  CAM_FOCUS_MODE_TOUCH_AUTO,    /* GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT */
-  CAM_FOCUS_MODE_FULL,          /* GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY */
-  CAM_FOCUS_MODE_AUTO,          /* GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL */
-  CAM_FOCUS_MODE_FULL,          /* GST_PHOTOGRAPHY_FOCUS_MODE_EXTENDED */
-  CAM_FOCUS_MODE_CONTINUOUS,    /* GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL */
-  CAM_FOCUS_MODE_CONTINUOUS,    /* GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_EXTENDED */
+  CAM_FOCUS_MODE_AUTO,          /* AF_MODE_NONE = 0 */
+  CAM_FOCUS_MODE_HYPERFOCAL,    /* AF_MODE_PAN */
+  CAM_FOCUS_MODE_TOUCH_AUTO,    /* AF_MODE_AUTO */
+  CAM_FOCUS_MODE_MANUAL,        /* AF_MODE_MANUAL */
+  CAM_FOCUS_MODE_TOUCH_AUTO,    /* AF_TOUCH_AUTO */
+  CAM_FOCUS_MODE_CONTINUOUS     /* AF_CONTINUOUS */
   -1
 };
 
@@ -3248,12 +3246,6 @@ gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
     goto error;
   }
 
-  err = cam_feature_get (v4l2camsrc->video_fd, CAM_FOCUS_MODE, &focus);
-  if (err != CAM_ERR_NONE) {
-    GST_DEBUG ("CAM_FOCUS_MODE query failed: %s", cameralib_error_map[err]);
-    goto error;
-  }
-
   err =
       cam_feature_get (v4l2camsrc->video_fd, CAM_GENERAL_FLICKER_REDUCTION_MODE,
       &flicker);
@@ -3276,7 +3268,6 @@ gst_v4l2camsrc_read_settings (GstCameraSrc * camsrc,
   photoconf->tone_mode = find_item (gst_v4l2camsrc_effect_map, effect);
   photoconf->scene_mode = find_item (gst_v4l2camsrc_scene_map, scene);
   photoconf->flash_mode = find_item (gst_v4l2camsrc_flash_map, flash);
-  photoconf->focus_mode = find_item (gst_v4l2camsrc_focus_map, focus);
   photoconf->flicker_mode = find_item (gst_v4l2camsrc_flicker_map, flicker);
 
   photoconf->ev_compensation = (gfloat) ev;
@@ -3428,6 +3419,18 @@ error:
 }
 
 gboolean
+gst_v4l2camsrc_set_focus_state(GstCameraSrc *camsrc,
+     gint mode, gint range)
+{
+  cam_err_t err = CAM_ERR_NONE;
+  GST_DEBUG ("update focus mode and range");
+
+  err = cam_set_focus_mode(gst_v4l2camsrc_focus_map[mode], range);
+  return(err == CAM_ERR_NONE);
+}
+
+
+gboolean
 gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
     GstPhotoSettings * photoconf, gboolean scene_override)
 {
@@ -3472,9 +3475,6 @@ gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc,
     cam_feature_set (v4l2camsrc->video_fd, CAM_EXPOSURE_ISO_VALUE,
                gst_v4l2camsrc_libmfld_reverse_map_iso (photoconf->iso_speed));
 
-    cam_feature_set (v4l2camsrc->video_fd, CAM_FOCUS_MODE,
-        gst_v4l2camsrc_focus_map[photoconf->focus_mode]);
-
     cam_feature_set (v4l2camsrc->video_fd, CAM_GENERAL_FLICKER_REDUCTION_MODE,
         gst_v4l2camsrc_flicker_map[photoconf->flicker_mode]);
 
index b96c27c..7fe6d32 100644 (file)
@@ -1,3 +1,9 @@
+* Tue Apr 09 2013 Marko Ollonen <marko.ollonen@ixonos.com> accepted/tizen_2.0/20130307.195130@fc8a6d8
+- Add support for auto focus range.
+- cleanup lsc & dvs code.
+- [Author: Jussi, Saavalainen] Drop still shot resolution step requirement to 4/4
+- [Author: Yuan, Feng] compile: fix issue of different structure sizes between libs
+
 * Mon Apr 08 2013 Marko Ollonen <marko.ollonen@ixonos.com> accepted/tizen_2.0/20130307.195130@de1d55e
 - second pad on request.