From: Marko Ollonen Date: Fri, 30 Nov 2012 13:54:13 +0000 (+0200) Subject: atom isp strobe light control added. X-Git-Tag: 2.1b_release~6^2~36 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=caef1901ec7c3a1d2914bff15bf8e3c51fe05da8;p=adaptation%2Fintel_mfld%2Fgst-plugins-atomisp.git atom isp strobe light control added. Change-Id: Ica4bc4c1ff1d78196d17f236b57c01b34b06ee9e --- diff --git a/gst-libs/atomisphal/gstv4l2mfldadvci.c b/gst-libs/atomisphal/gstv4l2mfldadvci.c index 5e2d5b7..48596ae 100644 --- a/gst-libs/atomisphal/gstv4l2mfldadvci.c +++ b/gst-libs/atomisphal/gstv4l2mfldadvci.c @@ -52,11 +52,6 @@ static void wrapper_default_void (void) return; } -static void wrapper_default_int (int a) -{ - return; -} - static int wrapper_default_int_void (void) { return 0; @@ -155,11 +150,13 @@ wrapper_default_AwbGetLightSource(advci_awb_light_source *ls) static ci_adv_Err wrapper_default_int_int (int i) { + return 0; } static ci_adv_Err wrapper_default_intp (int *p) { + return 0; } static int @@ -315,6 +312,11 @@ wrapper_default_is_flash_needed(gboolean *useflash) { } +static gboolean +wrapper_default_af_assist_light_needed(void) +{ +return FALSE; +} static ci_adv_Err wrapper_default_AeSetManualIso(int sensitivity) { @@ -350,13 +352,6 @@ lib_3a_void (void) return; } -static void -lib_3a_int (int a) -{ - cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); - return; -} - static int lib_3a_int_void (void) { @@ -440,7 +435,7 @@ static void lib_3a_AeGetExposureProgram(advci_ae_exposure_program *program) { cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); - ci_adv_ae_get_exposure_program(program); + ci_adv_ae_get_exposure_program((ia_3a_ae_exposure_program *)program); } static void @@ -516,7 +511,7 @@ static int lib_3a_isp_set_fd (int fd, const char *sensor_id) { int sensor_type; - advci_window window; + ia_3a_window window; cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); if (ci_adv_init(sensor_id, fd, NULL) == 0) { @@ -596,19 +591,19 @@ static void lib_3a_AfGetStillAfStatus(advci_af_status *status) static gboolean lib_3a_af_is_complete(void) { - ia_3a_af_status status; + advci_af_status status; gboolean completed = FALSE; lib_3a_AfGetStillAfStatus(&status); - if (status == ia_3a_af_status_error) { + if (status == advci_af_status_error) { cam_lib_3a_dbg("==== still AF failed \n"); completed = TRUE; } - else if (status == ia_3a_af_status_success) { + else if (status == advci_af_status_success) { cam_lib_3a_dbg("==== still AF success"); completed = TRUE; - } else if (status == ia_3a_af_status_cancelled) { + } else if (status == advci_af_status_cancelled) { cam_lib_3a_dbg("==== still AF cancelled \n"); completed = TRUE; } @@ -701,14 +696,14 @@ static void lib_3a_AfGetMeteringMode(advci_af_metering_mode *mode) { cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); - ci_adv_af_get_metering_mode(mode); + ci_adv_af_get_metering_mode((ia_3a_af_metering_mode *)mode); } static void lib_3a_Ae_Af_GetWindow(advci_window *window) { cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); - ia_3a_ae_get_window(window); + ia_3a_ae_get_window((ia_3a_window *)window); } static void @@ -718,8 +713,8 @@ lib_3a_Ae_Af_SetWindow( advci_window *window) __func__, window->x_left,window->x_right, window->y_top , window->y_bottom, window->weight); - ci_adv_ae_set_window(window); - ci_adv_af_set_windows(1, window); + ci_adv_ae_set_window((ia_3a_window *)window); + ci_adv_af_set_windows(1, (ia_3a_window *)window); } static void @@ -760,7 +755,7 @@ static void lib_3a_AeAfAwb_process( struct timeval *frame_timestamp) { int status; - //cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); + // cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__); status = ci_adv_process_frame(TRUE,frame_timestamp); } static void @@ -804,7 +799,7 @@ lib_3a_AwbGetImageEffect(advci_image_effect *effect) static void lib_ae_is_flash_needed(gboolean *useflash) { - ci_adv_ae_is_flash_necessary(useflash); + ci_adv_ae_is_flash_necessary((_Bool *)useflash); cam_lib_3a_dbg("%s:%d useflash: %d\n", __func__, __LINE__, *useflash); } @@ -844,7 +839,7 @@ lib_3a_AeGetManualIso(int *sensitivity) static void lib_3a_GetMakerNote(advci_mknote_mode mknMode, advci_mknote *note) { - note = ci_adv_get_maker_note(mknMode); + note = (advci_mknote *)ci_adv_get_maker_note((ia_3a_mknote_mode)mknMode); } static void @@ -852,7 +847,7 @@ lib_3a_PutMakerNote(advci_mknote *mknData) { if (mknData != NULL) { - ci_adv_put_maker_note(mknData); + ci_adv_put_maker_note((ia_3a_mknote *)mknData); } } @@ -862,6 +857,15 @@ lib_3a_ResetMakerNote(void) ci_adv_reset_maker_note(); } +static gboolean +lib_3a_af_assist_light_needed(void) +{ + bool bNeed = FALSE; + ci_adv_err ret = ci_adv_af_need_assist_light(&bNeed); + cam_lib_3a_dbg("%s:%d assist_light_needed: %d\n", __func__, __LINE__, bNeed); + + return bNeed; +} void lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci) @@ -882,6 +886,7 @@ lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci) mfldadvci->ae_calc_with_flash = lib_3a_calc_with_flash; mfldadvci->ae_is_flash_needed = lib_ae_is_flash_needed; + mfldadvci->af_assist_light_needed = lib_3a_af_assist_light_needed; mfldadvci->ae_apply_results = lib_3a_ae; @@ -968,6 +973,7 @@ wrapper_default_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci) mfldadvci->ae_calc_with_flash = wrapper_default_calc_with_flash; mfldadvci->ae_is_flash_needed = wrapper_default_is_flash_needed; + mfldadvci->af_assist_light_needed = wrapper_default_af_assist_light_needed; mfldadvci->ae_apply_results = wrapper_default_ae; diff --git a/gst-libs/atomisphal/gstv4l2mfldadvci.h b/gst-libs/atomisphal/gstv4l2mfldadvci.h index 7491119..32e546c 100644 --- a/gst-libs/atomisphal/gstv4l2mfldadvci.h +++ b/gst-libs/atomisphal/gstv4l2mfldadvci.h @@ -206,6 +206,7 @@ struct _GstV4l2MFLDAdvCI void (*af_start)(void); void (*af_stop)(void); gboolean (*af_is_complete)(void); + gboolean (*af_assist_light_needed)(void); void (*awb_apply_results)(void); void (*awb_calc_flash)(void); @@ -279,10 +280,8 @@ struct _GstV4l2MFLDAdvCI void (*GetMakerNote) (advci_mknote_mode mknMode, advci_mknote * note); void (*PutMakerNote)(advci_mknote *mknData); void (*ResetMakerNote)(void); - int fd; }; - void lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci); void wrapper_default_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci); diff --git a/gst-libs/atomisphal/mfld_cam.c b/gst-libs/atomisphal/mfld_cam.c index eadd327..e75723b 100644 --- a/gst-libs/atomisphal/mfld_cam.c +++ b/gst-libs/atomisphal/mfld_cam.c @@ -105,6 +105,7 @@ struct mfld_driver_t int sensor_type; struct timeval timestamp; int focus_done; + gboolean enable_torch; }; struct buffer @@ -326,7 +327,8 @@ set_flash_mode (int fd, int mode) case CAM_LIGHT_FLASH_MODE_FILL_IN: case CAM_LIGHT_FLASH_MODE_RED_EYE: case CAM_LIGHT_FLASH_MODE_OFF: - ret = cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF); + if(!mfld_driver.enable_torch) + ret = cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF); break; } set_ae_flash_mode(fd,mode); @@ -756,7 +758,13 @@ cam_err_t cam_set_flash (int fd, int on) { cam_driver_dbg ("%s\n", __func__); - return CAM_ERR_NONE; + cam_err_t ret = CAM_ERR_NONE; + mfld_driver.enable_torch = on; + if( cam_driver_set_torch(fd, on)== CAM_ERR_NONE) + mfld_driver.enable_torch = on; + else + mfld_driver.enable_torch = FALSE; + return ret; } /* Ask the suggested flash intensity value. @@ -1161,6 +1169,7 @@ libmfld_cam_init (GstV4l2MFLDAdvCI * advci) mfld_driver.dvs_vector.y = 0; mfld_driver.focus_done = 0; + mfld_driver.enable_torch = FALSE; mfldadvci = advci; /* Initalize the 3A library */ @@ -1216,8 +1225,8 @@ cam_driver_deinit (int fd) pthread_cancel (mfld_driver.thread); mfld_driver.g_3a_started = 0; } - /* Do other driver related deinit here */ + led_flash_off(fd); return CAM_ERR_NONE; } @@ -1532,7 +1541,6 @@ cam_capture_init (int fd, struct v4l2_buffer *buffer, discard_first_frame(fd, buffer, 2); mfld_driver.first_frame = 0; } - /* Still AF start */ if (mfld_driver.start_still_af) { if (mfld_driver.af_enabled && mfld_driver.still_af_count > 0) @@ -1542,6 +1550,10 @@ cam_capture_init (int fd, struct v4l2_buffer *buffer, mfld_driver.still_af_count = 1; mfld_driver.af_start_time = mfld_driver.timestamp; + if (mfldadvci->af_assist_light_needed()) { + mfld_driver.enable_torch = TRUE; + cam_driver_set_torch(fd, TRUE); + } if (mfld_driver.af_enabled) mfldadvci->af_start (); } @@ -1664,6 +1676,10 @@ run_normal_sequence(int fd, struct v4l2_buffer *buffer) if (complete == 0) { mfldadvci->af_stop(); cam_driver_dbg ("AF: Focus Failed %s\n", __func__); + if(mfld_driver.enable_torch) { + mfld_driver.enable_torch= FALSE; + cam_driver_set_torch(fd, FALSE); + } } } else @@ -1693,17 +1709,23 @@ cam_capture_frames (int fd, struct v4l2_buffer *buffer, // stop still AF processing if running if (mfld_driver.still_af_count) { mfldadvci->af_stop(); + if(mfld_driver.enable_torch) { + mfld_driver.enable_torch= FALSE; + cam_driver_set_torch(fd, FALSE); + } mfld_driver.still_af_count = 0; } - if (flash_en == TRUE){ + if ((flash_en == TRUE) && (mfld_driver.enable_torch == FALSE)){ run_flash_sequence (fd, buffer); + led_flash_off(fd); } else{ //cam_driver_set_indication_intensity(fd, INDICATOR_INTENSITY); //cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_INDICATOR); ret = run_normal_sequence(fd, buffer); /* restore flash mode */ - cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF); + if (mfld_driver.enable_torch == FALSE) + cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF); } } else { ret = run_normal_sequence(fd, buffer); diff --git a/gst-libs/atomisphal/mfld_driver.c b/gst-libs/atomisphal/mfld_driver.c index 995df3a..bbffd18 100644 --- a/gst-libs/atomisphal/mfld_driver.c +++ b/gst-libs/atomisphal/mfld_driver.c @@ -744,14 +744,12 @@ led_flash_trigger (int fd, int duration, int intensity) void led_flash_off (int fd) { - cam_err_t ret; - cam_driver_dbg("%s\n",__func__); + cam_driver_dbg("%s\n",__func__); + cam_driver_set_attribute(fd, V4L2_CID_FLASH_MODE, ATOMISP_FLASH_MODE_OFF, "Flash mode"); + cam_driver_set_attribute (fd, V4L2_CID_FLASH_INDICATOR_INTENSITY, 0, "indication intensity"); + cam_driver_set_attribute (fd, V4L2_CID_FLASH_TORCH_INTENSITY, 0, "Torch intensity"); + cam_driver_set_led_flash (fd, V4L2_CID_FLASH_STROBE, 0); - ret = cam_driver_set_led_flash (fd, V4L2_CID_FLASH_STROBE, 0); - if (ret != CAM_ERR_NONE) - { - cam_driver_dbg ("%s: Error flash ioctl %d\n", __func__, 0); - } } cam_err_t @@ -769,3 +767,22 @@ cam_driver_set_indication_intensity (int fd,int intensity) return cam_driver_set_attribute (fd, V4L2_CID_FLASH_INDICATOR_INTENSITY, intensity, "indication intensity"); } + +cam_err_t +cam_driver_set_torch(int fd, int on) +{ + cam_driver_dbg ("%s: state %d\n", __func__, on); + cam_err_t ret; + if (on) { + ret = cam_driver_set_attribute(fd, V4L2_CID_FLASH_MODE, ATOMISP_FLASH_MODE_TORCH, "Flash mode"); + if (ret == CAM_ERR_NONE) + ret = cam_driver_set_attribute (fd, V4L2_CID_FLASH_TORCH_INTENSITY, TORCH_INTENSITY, "Torch intensity"); + } + else { + ret = cam_driver_set_attribute(fd, V4L2_CID_FLASH_MODE, ATOMISP_FLASH_MODE_OFF, "Flash mode"); + if(ret == CAM_ERR_NONE) + ret = cam_driver_set_attribute (fd, V4L2_CID_FLASH_TORCH_INTENSITY, 0, "Torch intensity"); + } + cam_driver_dbg ("%s: ret %d\n", __func__, ret); + return ret; +} diff --git a/gst-libs/atomisphal/mfld_driver.h b/gst-libs/atomisphal/mfld_driver.h index 1e261b0..7264f8e 100644 --- a/gst-libs/atomisphal/mfld_driver.h +++ b/gst-libs/atomisphal/mfld_driver.h @@ -26,6 +26,8 @@ #define OFF 0 #define INDICATOR_INTENSITY 10 /* 10% */ +#define TORCH_INTENSITY 20 /* 20% */ + void cam_err_print (cam_err_t err); @@ -114,6 +116,7 @@ cam_err_t cam_driver_set_flash_mode(int fd,int mode); cam_err_t cam_driver_set_mipi_interrupt(int fd, int enable); cam_err_t cam_driver_set_indication_intensity (int fd,int intensity); +cam_err_t cam_driver_set_torch(int fd, int on); #endif /* _MFLD_DRIVER_H */ diff --git a/gst-libs/gst/camera/gstmfldcameracontroliface.c b/gst-libs/gst/camera/gstmfldcameracontroliface.c index 53d4361..e7dad65 100644 --- a/gst-libs/gst/camera/gstmfldcameracontroliface.c +++ b/gst-libs/gst/camera/gstmfldcameracontroliface.c @@ -265,8 +265,9 @@ gst_camerasrc_camera_control_set_strobe( GstCameraSrc* camerasrc, camerasrc->enable_torch = value; else camerasrc->enable_torch = FALSE; + if (bclass->set_strobe_state) - bclass->set_strobe_state(camerasrc, camerasrc->enable_torch); + ret = bclass->set_strobe_state(camerasrc, camerasrc->enable_torch); GST_OBJECT_UNLOCK (camerasrc); } diff --git a/gst/mfldv4l2cam/v4l2camsrc_calls.c b/gst/mfldv4l2cam/v4l2camsrc_calls.c index eda27c2..eebb770 100644 --- a/gst/mfldv4l2cam/v4l2camsrc_calls.c +++ b/gst/mfldv4l2cam/v4l2camsrc_calls.c @@ -982,11 +982,12 @@ gst_v4l2camsrc_close (GstCameraSrc * camsrc) GST_V4L2CAMSRC_CHECK_NOT_ACTIVE (v4l2camsrc); /* close device */ + gst_v4l2camsrc_libmfldcam_deinit (v4l2camsrc); + close (v4l2camsrc->video_fd); pollfd.fd = v4l2camsrc->video_fd; gst_poll_remove_fd (v4l2camsrc->poll, &pollfd); v4l2camsrc->video_fd = -1; - gst_v4l2camsrc_libmfldcam_deinit (v4l2camsrc); return TRUE; } @@ -3511,11 +3512,13 @@ gboolean gst_v4l2camsrc_set_strobe_state (GstCameraSrc * camsrc, { GstMFLDV4l2CamSrc *v4l2camsrc; gint fd; + cam_err_t err = CAM_ERR_NONE; v4l2camsrc = GST_V4L2CAMSRC (camsrc); fd = v4l2camsrc->video_fd; - cam_set_flash (fd, state); + err = cam_set_flash (fd, state); + return(err == CAM_ERR_NONE); } gboolean gst_libmfldcam_capture_correction_update (GstMFLDV4l2CamSrc * v4l2camsrc) diff --git a/packaging/mfldv4l2camsrc.changes b/packaging/mfldv4l2camsrc.changes index 3f60fe4..ce05ccc 100644 --- a/packaging/mfldv4l2camsrc.changes +++ b/packaging/mfldv4l2camsrc.changes @@ -1,3 +1,6 @@ +* Fri Nov 30 2012 Marko Ollonen submit/trunk/20121129.125759@70ce86b +- atom isp strobe light control added. + * Fri Nov 30 2012 Marko Ollonen submit/trunk/20121129.125759@9854069 - strobe light control added to camera control interface.