From a928c92f2ed2e6c0659a4ab18a4a60f9ecb869dc Mon Sep 17 00:00:00 2001 From: Marko Ollonen Date: Fri, 25 Jan 2013 13:40:08 +0200 Subject: [PATCH] af window configuration update. Change-Id: Ifca8a4a75f0488f69b9d112458182259b0ae9f0a --- gst-libs/atomisphal/mfld_cam.c | 57 +++++++++++++++++++++----------------- gst-libs/atomisphal/mfld_cam.h | 2 ++ gst/mfldv4l2cam/gstv4l2camsrc.c | 29 ++----------------- gst/mfldv4l2cam/v4l2camsrc_calls.c | 56 +++++++++++++++++++++++-------------- 4 files changed, 71 insertions(+), 73 deletions(-) diff --git a/gst-libs/atomisphal/mfld_cam.c b/gst-libs/atomisphal/mfld_cam.c index cc988da..7f6277a 100644 --- a/gst-libs/atomisphal/mfld_cam.c +++ b/gst-libs/atomisphal/mfld_cam.c @@ -87,12 +87,13 @@ cam_find_item_new (const int table[][2], const int item, int reverse) struct mfld_driver_t { int fd; - advci_isp_mode mode; + cam_capture_mode_t capture_mode; int rer_enabled; int dis_enabled, dvs_enabled; int af_enabled, ae_enabled, awb_enabled; int af_result; // 0 means fail, it will be filled when captured finished. int still_af_count, start_still_af; + advci_window window; struct timeval af_start_time; int initflag; int mmap; @@ -696,7 +697,7 @@ cam_set_capture_mode (int fd, cam_capture_mode_t mode) else mfld_driver.first_frame = 1; - mfld_driver.mode = mode; + mfld_driver.capture_mode = mode; return ret; } @@ -1227,7 +1228,6 @@ libmfld_cam_dispose (void) cam_err_t cam_driver_init (int fd, const char *sensor_id) { - advci_window window; cam_driver_dbg ("%s\n", __func__); mfld_driver.fd = fd; @@ -1242,23 +1242,20 @@ cam_driver_init (int fd, const char *sensor_id) mfldadvci->AfEnable(TRUE); mfldadvci->AfLock(FALSE); - window.x_left = 0; - window.x_right = 0, - window.y_top = 0; - window.y_bottom = 0; - window.weight = 0; - mfldadvci->AeSetWindow(&window); - - mfldadvci->AeSetExposureProgram(advci_ae_exposure_program_auto); - mfldadvci->AeSetMode(advci_ae_mode_auto); - mfldadvci->AeSetMeteringMode(advci_ae_metering_mode_center); - mfldadvci->AfSetRange (advci_af_range_full); - mfldadvci->AwbSetMode(advci_awb_mode_auto); - mfldadvci->AfSetMode(advci_af_mode_auto); - mfldadvci->AfSetMeteringMode (advci_af_metering_mode_auto); - - - + mfld_driver.window.x_left = 0; + mfld_driver.window.x_right = 0, + mfld_driver.window.y_top = 0; + mfld_driver.window.y_bottom = 0; + mfld_driver.window.weight = 0; + mfldadvci->AeSetWindow(&mfld_driver.window); + + mfldadvci->AeSetExposureProgram(advci_ae_exposure_program_auto); + mfldadvci->AeSetMode(advci_ae_mode_auto); + mfldadvci->AeSetMeteringMode(advci_ae_metering_mode_center); + mfldadvci->AfSetRange (advci_af_range_full); + mfldadvci->AwbSetMode(advci_awb_mode_auto); + mfldadvci->AfSetMode(advci_af_mode_auto); + mfldadvci->AfSetMeteringMode (advci_af_metering_mode_auto); } else mfld_driver.sensor_type = SENSOR_TYPE_SOC; @@ -1417,7 +1414,6 @@ static void dump_v4l2_buffer(struct v4l2_buffer *buffer) { void *data; - static unsigned int i = 0; if (mfld_driver.mmap) data = mmap (NULL, buffer->length, PROT_READ | PROT_WRITE, MAP_SHARED, mfld_driver.fd, buffer->m.offset); @@ -1582,7 +1578,6 @@ static void cam_capture_init (int fd, struct v4l2_buffer *buffer, struct cam_capture_settings *capture_settings) { - int i; gboolean need_assist = FALSE; mfld_driver.mmap = capture_settings->mmap; mfld_driver.ae_enabled = capture_settings->ae; @@ -1607,8 +1602,13 @@ cam_capture_init (int fd, struct v4l2_buffer *buffer, mfld_driver.enable_torch = TRUE; cam_driver_set_torch(fd, TRUE); } - if (mfld_driver.af_enabled) + if (mfld_driver.af_enabled) { mfldadvci->af_start (); + if(mfld_cam_settings.focus_mode == CAM_FOCUS_MODE_TOUCH_AUTO) { + mfldadvci->AfSetWindows (1, &mfld_driver.window ); + mfldadvci->AeSetWindow(&mfld_driver.window ); + } + } } } @@ -1647,7 +1647,7 @@ cam_dis_dvs_processing (struct atomisp_dis_vector *vectors, advci_frame_t *bufs, cam_driver_dbg ("Begin cam_dis_still_process\n"); - if (mfld_driver.mode == advci_isp_mode_video) + if (mfld_driver.capture_mode == CAM_CAPTURE_MODE_VIDEO_RECORD) dvs_vector = &mfld_driver.dvs_vector; else dvs_vector = NULL; @@ -1781,7 +1781,7 @@ cam_capture_frames (int fd, struct v4l2_buffer *buffer, cam_capture_init (fd, buffer, capture_settings); - if ((mfld_driver.mode == CAM_CAPTURE_MODE_STILL_CAPTURE ) && + if ((mfld_driver.capture_mode == CAM_CAPTURE_MODE_STILL_CAPTURE ) && (mfld_driver.sensor_type == SENSOR_TYPE_RAW) ) { /* check flash here not in always when capturing frames */ flash_en = get_flash_status (); @@ -1852,6 +1852,13 @@ cam_err_t cam_get_focus_posi(int fd, unsigned * posi) return cam_driver_get_focus_posi(fd, posi); } +void cam_set_af_ae_window(advci_window *window) +{ + mfldadvci->AfSetWindows (1, window); + mfldadvci->AeSetWindow(window); + mfld_driver.window = *window; +} + void get_af_result(int fd, unsigned * result) { *result = mfld_driver.af_result; // 0 means fail, it will be filled when captured finished. diff --git a/gst-libs/atomisphal/mfld_cam.h b/gst-libs/atomisphal/mfld_cam.h index d8d56cd..240f5ad 100644 --- a/gst-libs/atomisphal/mfld_cam.h +++ b/gst-libs/atomisphal/mfld_cam.h @@ -290,6 +290,8 @@ void get_af_version(int fd, int * major, int * minor); cam_err_t cam_get_focus_posi(int fd, unsigned * posi); void get_af_result(int fd, unsigned * result); cam_err_t get_af_status(int fd, unsigned * status); +void cam_set_af_ae_window(advci_window *window); + cam_err_t get_exp_mode(int fd, cam_scene_mode_t *expmode); void get_ae_bias(int fd, int * bias); cam_err_t get_ae_manual_shutter(int fd, float *time); diff --git a/gst/mfldv4l2cam/gstv4l2camsrc.c b/gst/mfldv4l2cam/gstv4l2camsrc.c index dd346bd..eeba13e 100644 --- a/gst/mfldv4l2cam/gstv4l2camsrc.c +++ b/gst/mfldv4l2cam/gstv4l2camsrc.c @@ -69,7 +69,6 @@ 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_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window); static gboolean gst_v4l2camsrc_set_ae_mode (GstCameraSrc * camsrc, int mode); static gboolean gst_v4l2camsrc_get_ae_mode (GstCameraSrc * camsrc, int *mode); @@ -756,6 +755,8 @@ gst_v4l2camsrc_read_exif (GstCameraSrc *camsrc, gboolean gst_v4l2camsrc_set_strobe_state (GstCameraSrc *camsrc, gboolean state); +gboolean +gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window); /* * gst_v4l2camsrc_class_init: @@ -1368,7 +1369,6 @@ gst_v4l2camsrc_set_property (GObject * object, v4l2camsrc->mfldadvci->AfSetWindows (1, (advci_window *) (&(v4l2camsrc->af_window))); - v4l2camsrc->mfldadvci->AeSetWindow((advci_window *) (&(v4l2camsrc->af_window))); gst_structure_free (af_window_param); g_free (ctmp); @@ -1741,31 +1741,6 @@ gst_v4l2camsrc_set_zoom (GstCameraSrc * camsrc, gfloat zoom) return ret; } static gboolean -gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window) -{ - GstMFLDV4l2CamSrc *v4l2camsrc; - gboolean ret = TRUE; - - v4l2camsrc = GST_V4L2CAMSRC (camsrc); - - GST_DEBUG_OBJECT(v4l2camsrc,"ae-af-window-setting: x_left:%d, x_right:%d," - "y_bottom:%d, y_top:%d, weight:%d.\n", - window.x_left,window.x_right, - window.y_bottom, window.y_top, - window.weight); - - v4l2camsrc->af_window = v4l2camsrc->ae_window = *(GstCameraWindow*)&window; - - if (v4l2camsrc->is_active) { - g_mutex_lock (v4l2camsrc->device_mutex); - v4l2camsrc->mfldadvci->AfSetWindows (1, (advci_window *) (&(v4l2camsrc->af_window))); - v4l2camsrc->mfldadvci->AeSetWindow((advci_window *) (&(v4l2camsrc->af_window))); - g_mutex_unlock (v4l2camsrc->device_mutex); - } - - return ret; -} -static gboolean gst_v4l2camsrc_set_ae_mode(GstCameraSrc * camsrc, int mode) { GstMFLDV4l2CamSrc *v4l2camsrc; diff --git a/gst/mfldv4l2cam/v4l2camsrc_calls.c b/gst/mfldv4l2cam/v4l2camsrc_calls.c index b328ec8..8fc5cfe 100644 --- a/gst/mfldv4l2cam/v4l2camsrc_calls.c +++ b/gst/mfldv4l2cam/v4l2camsrc_calls.c @@ -1084,7 +1084,6 @@ gst_v4l2camsrc_set_attribute (GstCameraSrc * camsrc, int attribute_num, const int value) { GstMFLDV4l2CamSrc *v4l2camsrc = GST_V4L2CAMSRC (camsrc); - cam_err_t err; struct v4l2_control control; GST_DEBUG_OBJECT (v4l2camsrc, "setting value of attribute %d to %d", @@ -1885,7 +1884,7 @@ static GList *build_caps_list(GstMFLDV4l2CamSrc * v4l2camsrc, { GstStructure *tmp = NULL; GList *res = NULL; - long w,h,wl,wh,hl,hh,ws,hs; + long wl,wh,hl,hh,ws,hs; wl = size->stepwise.min_width; wh = size->stepwise.max_width; ws = size->stepwise.step_width; hl = size->stepwise.min_height; hh = size->stepwise.max_height; hs = size->stepwise.step_height; @@ -2194,17 +2193,17 @@ gst_v4l2camsrc_grab_frame (GstCameraSrc * camsrc, GstBuffer ** buf, gst_camerasrc_send_capture_stop_message (camsrc); } else { /* Send the CAF status message */ - GstCameraFocusStatus s; + GstCameraFocusStatus focus_status; gboolean lret; - lret = gst_v4l2camsrc_check_focus_status(v4l2camsrc, &s, FALSE); + lret = gst_v4l2camsrc_check_focus_status(v4l2camsrc, &focus_status, FALSE); if (lret) { - GST_LOG_OBJECT (v4l2camsrc, "CAF status: %d", s.status); - if (s.status == GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS ) + GST_LOG_OBJECT (v4l2camsrc, "CAF status: %d", focus_status.status); + if (focus_status.status == GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS ) gst_camerasrc_send_af_status(GST_CAMERA_SRC (v4l2camsrc) ,CAMERASRC_AUTO_FOCUS_RESULT_FOCUSED); - else if (s.status == GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL ) + else if (focus_status.status == GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL ) gst_camerasrc_send_af_status(GST_CAMERA_SRC (v4l2camsrc) ,CAMERASRC_AUTO_FOCUS_RESULT_FAILED); else { - GST_WARNING_OBJECT (v4l2camsrc, "CAF status erronous: %d send as failed", s.status); + GST_WARNING_OBJECT (v4l2camsrc, "CAF status erronous: %d send as failed", focus_status.status); gst_camerasrc_send_af_status(GST_CAMERA_SRC (v4l2camsrc) ,CAMERASRC_AUTO_FOCUS_RESULT_FAILED); } } @@ -3159,7 +3158,6 @@ gst_v4l2camsrc_read_exif (GstCameraSrc * camsrc, GstCameraControlExifInfo *exif_info) { GstMFLDV4l2CamSrc *v4l2camsrc; - int focal_len; cam_err_t err; struct atomisp_makernote_info maker_note; unsigned char *buf; @@ -3333,6 +3331,31 @@ gst_v4l2camsrc_write_settings (GstCameraSrc * camsrc, } gboolean +gst_v4l2camsrc_set_AeAafwindow (GstCameraSrc * camsrc, GstCameraSrc3a_window window) +{ + GstMFLDV4l2CamSrc *v4l2camsrc; + gboolean ret = TRUE; + + v4l2camsrc = GST_V4L2CAMSRC (camsrc); + + GST_DEBUG_OBJECT(v4l2camsrc,"ae-af-window-setting: x_left:%d, x_right:%d," + "y_bottom:%d, y_top:%d, weight:%d.\n", + window.x_left,window.x_right, + window.y_bottom, window.y_top, + window.weight); + + v4l2camsrc->af_window = v4l2camsrc->ae_window = *(GstCameraWindow*)&window; + + if (v4l2camsrc->is_active) { + g_mutex_lock (v4l2camsrc->device_mutex); + cam_set_af_ae_window((advci_window *) (&v4l2camsrc->af_window)); + g_mutex_unlock (v4l2camsrc->device_mutex); + } + + return ret; +} + +gboolean gst_v4l2camsrc_set_autofocus (GstCameraSrc * camsrc, gboolean on) { GstMFLDV4l2CamSrc *v4l2camsrc; @@ -3344,8 +3367,8 @@ gst_v4l2camsrc_set_autofocus (GstCameraSrc * camsrc, gboolean on) cam_err_t err = CAM_ERR_NONE; - err= cam_set_autofocus(on); - v4l2camsrc->af_enabled = on; + err= cam_set_autofocus(on); + v4l2camsrc->af_enabled = on; ret = (err == CAM_ERR_NONE); @@ -3415,7 +3438,6 @@ gst_v4l2camsrc_check_focus_status (GstMFLDV4l2CamSrc * v4l2camsrc, { gboolean ret = FALSE; cam_focus_status_t status; - cam_err_t err; gboolean update; GST_DEBUG_OBJECT (v4l2camsrc, "Retrieving focus status"); @@ -3427,14 +3449,6 @@ gst_v4l2camsrc_check_focus_status (GstMFLDV4l2CamSrc * v4l2camsrc, ret = TRUE; GST_DEBUG_OBJECT (v4l2camsrc, "Focus status: %d", fs->status); - - if (detailed && fs->status == CAM_FOCUS_STATUS_SUCCESS) { - fs->windows = g_malloc (sizeof (guint)); - fs->num_windows = 1; - fs->focus_rows = 1; - fs->focus_columns = 1; - fs->coverage = 0; - } } return ret; } @@ -3468,7 +3482,7 @@ gst_v4l2camsrc_set_capture_mode (GstCameraSrc * camsrc, parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; err = ioctl(fd, VIDIOC_G_PARM, &parm); if (err < 0) { - GST_DEBUG(stderr,"Unable to get frame rate: %s (%d).\n", + GST_DEBUG("Unable to get frame rate: %s (%d).\n", strerror(errno), errno); goto done; } -- 2.7.4