prevent unnecessary 3A configurations.
[adaptation/intel_mfld/gst-plugins-atomisp.git] / gst-libs / atomisphal / mfld_cam.c
index 3aebe10..bd0d8aa 100644 (file)
@@ -167,7 +167,9 @@ static cam_err_t
 set_wb_mode (int wb_mode)
 {
 
-  if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+  if ( (mfld_driver.sensor_type == SENSOR_TYPE_RAW)  &&
+              (mfld_cam_settings.wb_mode != wb_mode)){
+    cam_driver_dbg ("%s mode %d\n", __func__, wb_mode);
     switch (wb_mode) {
       case CAM_AWB_MODE_AUTO:
         mfldadvci->AwbSetMode (advci_awb_mode_auto);
@@ -196,8 +198,8 @@ set_wb_mode (int wb_mode)
         cam_driver_dbg ("Not support awb mode\n");
         return CAM_ERR_UNSUPP;
     }
+   mfld_cam_settings.wb_mode = wb_mode;
   }
-  mfld_cam_settings.wb_mode = wb_mode;
   return CAM_ERR_NONE;
 }
 
@@ -251,12 +253,11 @@ set_tone_mode (int fd, int mode)
 {
   cam_err_t ret = CAM_ERR_NONE;
   enum v4l2_colorfx colorfx = mode;
-
-  cam_driver_dbg ("%s  mode %d\n", __func__, mode);
-
-  ret = cam_driver_set_tone_mode (fd, colorfx);
-  if (ret)
+  if(mfld_cam_settings.tone_mode != mode) {
+    cam_driver_dbg ("%s mode %d\n", __func__, mode);
+    ret = cam_driver_set_tone_mode (fd, colorfx);
     mfld_cam_settings.tone_mode = mode;
+  }
   return ret;
 }
 
@@ -274,6 +275,7 @@ set_scene_mode (int mode)
   advci_ae_exposure_program scene;
 
   if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+    cam_driver_dbg ("%s mode %d\n", __func__, mode);
     switch (mode) {
       case CAM_GENERAL_SCENE_MODE_PORTRAIT:
         scene = advci_ae_exposure_program_portrait;
@@ -318,6 +320,7 @@ set_iso_speed (int iso)
   float sv;
   mfld_cam_settings.iso_speed = iso;
   if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+    cam_driver_dbg ("%s iso %d\n", __func__, iso);
     if (iso <=0)
       return CAM_ERR_PARAM;
     sv = log10((float)iso / 3.125) / log10(2.0);
@@ -337,21 +340,21 @@ static cam_err_t
 set_flash_mode (int fd, int mode)
 {
   cam_err_t ret = CAM_ERR_NONE;
-  mfld_cam_settings.flash_mode = mode;
-
-  cam_driver_dbg ("set flash mode: %d\n",mode);
-  /* TODO check this when making auto modes etc.. */
-  switch (mode) {
-    case CAM_LIGHT_FLASH_MODE_AUTO:
-    case CAM_LIGHT_FLASH_MODE_ON:
-    case CAM_LIGHT_FLASH_MODE_FILL_IN:
-    case CAM_LIGHT_FLASH_MODE_RED_EYE:
-    case CAM_LIGHT_FLASH_MODE_OFF:
-      if(!mfld_driver.enable_torch)
-         ret = cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF);
-      break;
+  if(mfld_cam_settings.flash_mode != mode) {
+    cam_driver_dbg ("set flash mode: %d\n",mode);
+    switch (mode) {
+      case CAM_LIGHT_FLASH_MODE_AUTO:
+      case CAM_LIGHT_FLASH_MODE_ON:
+      case CAM_LIGHT_FLASH_MODE_FILL_IN:
+      case CAM_LIGHT_FLASH_MODE_RED_EYE:
+      case CAM_LIGHT_FLASH_MODE_OFF:
+        if(!mfld_driver.enable_torch)
+           ret = cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF);
+        break;
+    }
+    mfld_cam_settings.flash_mode = mode;
+    set_ae_flash_mode(fd,mode);
   }
-  set_ae_flash_mode(fd,mode);
   return ret;
 }
 
@@ -365,9 +368,11 @@ get_flash_mode (int *flash_mode)
 static cam_err_t
 set_flicker_mode (int mode)
 {
-  if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+  if ( (mfld_driver.sensor_type == SENSOR_TYPE_RAW) &&
+        (mfld_cam_settings.flicker_mode != mode) ) {
     /* Convert camera genreral flicker mode to AE flicker mode */
     switch (mode) {
+      cam_driver_dbg ("%s mode %d\n", __func__, mode);
       case CAM_GENERAL_FLICKER_REDUCTION_MODE_OFF:
         mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_off);
         break;
@@ -384,6 +389,7 @@ set_flicker_mode (int mode)
         cam_driver_dbg ("Not supported flicker mode\n");
         return CAM_ERR_UNSUPP;
     }
+    mfld_cam_settings.flicker_mode = mode;
   }
   return CAM_ERR_NONE;
 }
@@ -426,9 +432,10 @@ static cam_err_t
 set_focus_mode (int mode)
 {
 
-  cam_driver_dbg ("set_focus_mode: %d\n", mode);
+  if ( (mfld_driver.sensor_type == SENSOR_TYPE_RAW) &&
+             (mfld_cam_settings.focus_mode != mode) ) {
 
-  if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
+    cam_driver_dbg ("%s mode %d\n", __func__, mode);
     switch (mode) {
       case CAM_FOCUS_MODE_AUTO:
         mfldadvci->AfSetMode (advci_af_mode_manual);
@@ -463,9 +470,8 @@ set_focus_mode (int mode)
         cam_driver_dbg ("Not supported mode\n");
         return CAM_ERR_UNSUPP;
     }
-  }
-
   mfld_cam_settings.focus_mode = mode;
+  }
   return CAM_ERR_NONE;
 }
 
@@ -480,6 +486,8 @@ get_focus_mode (int *mode)
 static cam_err_t
 set_noise_reduction (int fd, int mode)
 {
+  cam_driver_dbg ("%s mode %d\n", __func__, mode);
+
   cam_err_t ret = CAM_ERR_NONE;
   /* Only update the mode changed */
   int tmp_mode = mode ^ mfld_cam_settings.noise_reduction;
@@ -536,6 +544,8 @@ set_capture_correction (int fd, int mode)
 {
   cam_err_t ret = 0;
   /* Only update the mode changed */
+  cam_driver_dbg ("%s mode %d\n", __func__, mode);
+
   int tmp_mode = mode ^ mfld_cam_settings.capture_correction;
   if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_GDC)) {
     if (mode & (1 << CAM_CAPTURE_CORRECTION_GDC)) {
@@ -678,6 +688,7 @@ cam_set_capture_mode (int fd, cam_capture_mode_t mode)
 
   if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
     switch (mode) {
+      cam_driver_dbg ("%s mode %d\n", __func__, mode);
       case CAM_CAPTURE_MODE_VIEWFINDER:
         mfldadvci->switch_mode (advci_isp_mode_preview, mfld_driver.frame_rate);
         set_flash_mode(fd, mfld_cam_settings.flash_mode);
@@ -723,13 +734,13 @@ cam_set_zoom (int fd, float zoom)
   cam_err_t ret = CAM_ERR_NONE;
   unsigned int zoomval;
 
-  /* Map 1.0 - 10.0 to 1 - 64 */
+  /* Map 1.0 - 10.0 to 1 - 63 */
   zoomval = (unsigned int)((zoom - 1.0) * 63.0 / 9) + 1;
 
   if (zoomval < 1 )
     zoomval = 1;
-  if (zoomval > 64)
-    zoomval = 64;
+  if (zoomval > 63)
+    zoomval = 63;
 
   ret = cam_driver_set_zoom (fd, zoomval);
   cam_driver_dbg ("%s\n set zoom to %u, return %d\n", __func__, zoomval, ret);
@@ -1053,6 +1064,7 @@ cam_feature_set (int fd, cam_photo_feature_t feature, int value)
       break;
     case CAM_EXPOSURE_COMPENSATION:
       if (value > 8) value = 8;
+      if (value < 0) value = 0;
       if (mfld_cam_settings.ev_compensation != value &&
               mfld_driver.sensor_type == SENSOR_TYPE_RAW){
         bias = bias_map[value];
@@ -1188,7 +1200,7 @@ libmfld_cam_init (GstV4l2MFLDAdvCI * advci)
 
   mfld_cam_settings.wb_mode = CAM_AWB_MODE_AUTO;
   mfld_cam_settings.scene_mode = CAM_GENERAL_SCENE_MODE_AUTO;
-  mfld_cam_settings.flash_mode = CAM_LIGHT_FLASH_MODE_AUTO;
+  mfld_cam_settings.flash_mode = CAM_LIGHT_FLASH_MODE_OFF;
   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;
@@ -1260,6 +1272,7 @@ cam_driver_init (int fd, const char *sensor_id)
     mfldadvci->AwbSetMode(advci_awb_mode_auto);
     mfldadvci->AfSetMode(advci_af_mode_auto);
     mfldadvci->AfSetMeteringMode (advci_af_metering_mode_auto);
+    mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_50hz);
   }
   else{
     mfld_driver.sensor_type =  SENSOR_TYPE_SOC;
@@ -1856,6 +1869,8 @@ cam_err_t cam_get_focus_posi(int fd, unsigned * posi)
 
 void cam_set_af_ae_window(advci_window *window)
 {
+  cam_driver_dbg ("%s\n", __func__);
+
   mfldadvci->AfSetWindows (1, window);
   mfldadvci->AeSetWindow(window);
   mfld_driver.window = *window;
@@ -1990,6 +2005,7 @@ cam_err_t set_ae_flash_mode(int fd, cam_flash_mode_t mode)
   advci_ae_flash_mode flash_mode;
 
   if (mfld_driver.sensor_type == SENSOR_TYPE_RAW) {
+    cam_driver_dbg ("%s mode %d\n", __func__, mode);
     switch(mode)
     {
       case CAM_LIGHT_FLASH_MODE_AUTO: