support for redeye removal functionality added.
authorMarko Ollonen <marko.ollonen@ixonos.com>
Thu, 23 May 2013 07:40:55 +0000 (10:40 +0300)
committerMarko Ollonen <marko.ollonen@ixonos.com>
Fri, 24 May 2013 10:39:50 +0000 (13:39 +0300)
This is more for development domain. Postprocessing
needs to be designed and code refactored.

Change-Id: I8327bccee7d7ba386556b3a7e5fba1e5d68df0e7

gst-libs/atomisphal/gstv4l2mfldadvci.c
gst-libs/atomisphal/gstv4l2mfldadvci.h
gst-libs/atomisphal/mfld_cam.c
packaging/gst-plugins-atomisp.changes

index 9886d19..b08bdbe 100644 (file)
@@ -345,12 +345,12 @@ lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci,  GModule *mod)
   g_module_symbol (mod, "ci_adv_focus_pos_to_distance", (gpointer) &mfldadvci->FocusPosToDisctance);
   g_module_symbol (mod, "ci_adv_ae_set_backlight_correction", (gpointer) &mfldadvci->AeSetBacklightCorrection);
 
+  g_module_symbol (mod, "ia_redeye_correct", (gpointer) &mfldadvci->DoRedeyeRemoval);
 
   mfldadvci->initialized = 0;
   // TODO
   mfldadvci->init = wrapper_default_init;
   mfldadvci->mode_spec_init = wrapper_default_int_void;
-  mfldadvci->do_redeye_removal = wrapper_default_do_redeye_removal;
   mfldadvci->load_gdc_table = wrapper_default_void;
   mfldadvci->AeGetIso = wrapper_default_AeGetManualIso;
   mfldadvci->RerVersion = wrapper_default_RerVersion;
@@ -380,7 +380,7 @@ wrapper_default_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci)
   mfldadvci->af_start = wrapper_default_af_start;
   mfldadvci->af_stop = wrapper_default_af_stop;
 
-  mfldadvci->do_redeye_removal = wrapper_default_do_redeye_removal;
+  mfldadvci->DoRedeyeRemoval = wrapper_default_do_redeye_removal;
   mfldadvci->load_gdc_table = wrapper_default_void;
 
   mfldadvci->AeSetBias = wrapper_default_int_int;
index e0c5101..f83949e 100644 (file)
@@ -161,13 +161,12 @@ typedef enum {
 } advci_af_mode;
 
 typedef enum {
-        advci_ae_mode_auto,             /* Automatic */
-        advci_ae_mode_manual,           /* Manual */
-        advci_ae_mode_shutter_priority, /* Shutter priority */
-        advci_ae_mode_aperture_priority /* Aperture priority */
+  advci_ae_mode_auto,             /* Automatic */
+  advci_ae_mode_manual,           /* Manual */
+  advci_ae_mode_shutter_priority, /* Shutter priority */
+  advci_ae_mode_aperture_priority /* Aperture priority */
 } advci_ae_mode;
 
-
 typedef enum {
   advci_af_status_error,     /* Cannot focus */
   advci_af_status_success,   /* Successfully focussed */
@@ -177,12 +176,20 @@ typedef enum {
 } advci_af_status;
 
 typedef enum {
-        advci_flash_stage_none,
-        advci_flash_stage_pre,
-        advci_flash_stage_main
+  advci_flash_stage_none,
+  advci_flash_stage_pre,
+  advci_flash_stage_main
 } advci_flash_stage;
 
 
+typedef enum {
+  advci_frame_format_nv12,   /* 12 bit YUV 420, Y, UV plane */
+  advci_frame_format_yuv420, /* 12 bit YUV 420, Y, U, V plane */
+  advci_frame_format_yuv444, /* 24 bit YUV 444, Y, U, V plane */
+  advci_frame_format_raw,    /* RAW, 1 plane */
+} advci_frame_format;
+
+
 typedef struct _GstV4l2MFLDAdvCI GstV4l2MFLDAdvCI;
 /**
  * GstV4l2MFLDAdvCI
@@ -210,7 +217,7 @@ struct _GstV4l2MFLDAdvCI
   void (*af_stop)(void);
   void (*af_assist_light_needed)(gboolean *needed);
 
-  void (*do_redeye_removal) (advci_frame_t *user_buf);
+  void (*DoRedeyeRemoval) (advci_frame_t *user_buf);
 
   void (*load_gdc_table)(void);
 
index 8a3c295..02ff1a4 100644 (file)
@@ -1391,9 +1391,10 @@ cam_still_compose (struct v4l2_buffer *buf, advci_frame_t bufs[],
 static void
 cam_do_redeye_removal (struct v4l2_buffer *buf)
 {
+  advci_frame_t user_buf;
 
+  cam_driver_dbg ("%s\n", __func__);
 
-  advci_frame_t user_buf;
   user_buf.length = buf->length;
   if (mfld_driver.mmap)
     user_buf.addr = mmap (NULL, buf->length, PROT_READ | PROT_WRITE, MAP_SHARED,
@@ -1402,8 +1403,22 @@ cam_do_redeye_removal (struct v4l2_buffer *buf)
     user_buf.addr = (void *) buf->m.userptr;
   user_buf.width = mfld_driver.width;
   user_buf.height = mfld_driver.height;
-  mfldadvci->do_redeye_removal (&user_buf);
 
+  switch (mfld_driver.fourcc) {
+    case V4L2_PIX_FMT_NV12:
+      user_buf.format = advci_frame_format_nv12;
+      break;
+    case V4L2_PIX_FMT_YUV420:
+      user_buf.format = advci_frame_format_yuv420;
+      break;
+    default:
+      cam_driver_dbg("%s unsupported frame format: %d", __func__,
+                       mfld_driver.fourcc);
+      goto release;
+  }
+  mfldadvci->DoRedeyeRemoval(&user_buf);
+
+release:
   if (mfld_driver.mmap)
     munmap (user_buf.addr, user_buf.length);
 }
@@ -1807,6 +1822,8 @@ cam_capture_frames (int fd, struct v4l2_buffer *buffer,
   int frame_dis = 1, frame_cnt;
   cam_err_t ret  = 0;
   gboolean flash_en = FALSE;
+  int cur_flash_mode = CAM_LIGHT_FLASH_MODE_OFF;
+
 
   cam_capture_init (fd, buffer, capture_settings);
 
@@ -1835,16 +1852,16 @@ cam_capture_frames (int fd, struct v4l2_buffer *buffer,
         if (mfld_driver.enable_torch == FALSE)
           cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF);
        }
+       get_flash_mode(&cur_flash_mode);
+
+       if (mfld_driver.rer_enabled  || (cur_flash_mode == CAM_LIGHT_FLASH_MODE_RED_EYE))
+         cam_do_redeye_removal (buffer);
   } else {
     ret = run_normal_sequence(fd, buffer);
   }
   if (ret)
     return ret;
 
-
-  if (mfld_driver.rer_enabled && (mfld_driver.fourcc == V4L2_PIX_FMT_YUV420))
-    cam_do_redeye_removal (buffer);
-
   if (capture_settings->dump_raw)
     dump_raw_image (fd, capture_settings);
 
index e504099..ac28bfa 100644 (file)
@@ -1,3 +1,6 @@
+* Thu May 23 2013 Marko Ollonen <marko.ollonen@ixonos.com> accepted/tizen_2.0/20130307.195130@d46c8f4
+- support for redeye removal functionality added.
+
 * Wed May 22 2013 Marko Ollonen <marko.ollonen@ixonos.com> accepted/tizen_2.0/20130307.195130@d028212
 - backlight correction added to scene modes.