1 /* Gstreamer MFLD camera source abstract Layer API
2 * Copyright (c) 2010 Intel Corporation
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include <sys/ioctl.h>
30 #include "mfld_driver.h"
35 #include <semaphore.h>
39 /* Focus Status Map */
40 static const int focus_status_map[][2] =
42 { CAM_FOCUS_STATUS_IDLE , advci_af_status_idle}, /* AF not running */
43 { CAM_FOCUS_STATUS_RUNNING, advci_af_status_busy}, /* Busy focusing */
44 { CAM_FOCUS_STATUS_SUCCESS, advci_af_status_success}, /* Successfully focussed */
45 { CAM_FOCUS_STATUS_FAIL, advci_af_status_error}, /* Cannot focus */
46 { CAM_FOCUS_STATUS_SUCCESS, advci_af_status_cancelled,},/* Canceled by user */
52 #define DIS_COMPOSITE_FRAMES 3
56 * Return mapping for item from given table. If @reverse is FALSE, @item is
57 * considered as a GstPhotography enumeration value and the function will
58 * return matching atomispcam value for it. If @reverse is TRUE, @item
59 * is considered as a atomispcam value and this function returns
60 * corresponding GstPhotography value. If mapping is not found, mapping
61 * for table index 0 is returned.
64 cam_find_item_new (const int table[][2], const int item, int reverse)
67 int index = reverse ? 1 : 0;
69 /* Shortcut didn't work, go through the whole table to find the item */
70 while (table[i][0] != -1) {
71 if (table[i][index] == item) {
72 return table[i][index ^ 1];
77 return table[0][index ^ 1];
81 /* The ISP mode set to the driver. Driver switch the binary according to the Mode
84 * Saving for the ISP status in the library */
91 int dis_enabled, dvs_enabled;
92 int af_enabled, ae_enabled, awb_enabled;
93 int af_result; // 0 means fail, it will be filled when captured finished.
94 int still_af_count, start_still_af;
95 struct timeval af_start_time;
102 unsigned int width, height, fourcc;
103 struct atomisp_dis_vector dvs_vector;
106 struct timeval timestamp;
108 gboolean enable_torch;
117 /* TODO: Check if this is needed anymore after focus works like it should.
118 * Hysteriss added to focus_done
119 * in some case when old focus is still in progress and appication
120 * ask new focus to be started might be a case that 3A returns false "focus ready"
121 * and status info is sent to app. -> for some reason it will crash to that.
123 #define FOCUS_REALLY_DONE 2
125 /* Maximum auto focus time */
126 static const int STILL_AF_MAX_TIME_IN_MS = 2200;
128 /* FIXME: Add lock to protec this global variable
130 static struct mfld_cam_settings_t mfld_cam_settings;
131 static struct mfld_driver_t mfld_driver;
132 static GstV4l2MFLDAdvCI *mfldadvci;
135 calculate_timediff(struct timeval *t0, struct timeval *t1)
137 return ((t1->tv_sec - t0->tv_sec) * 1000000 +
138 t1->tv_usec - t0->tv_usec) / 1000;
142 clear_bit (int nr, unsigned int *addr)
144 unsigned int mask = (1UL << (nr) % 32);
145 unsigned int *p = ((unsigned int *) addr) + nr / 32;
151 set_bit (int nr, unsigned int *addr)
153 unsigned int mask = (1UL << (nr) % 32);
154 unsigned int *p = ((unsigned int *) addr) + nr / 32;
159 /* Set the white balance Mode throught the 3A library */
161 set_wb_mode (int wb_mode)
165 case CAM_AWB_MODE_AUTO:
166 mfldadvci->AwbSetMode (advci_awb_mode_auto);
168 case CAM_AWB_MODE_DAYLIGHT:
169 mfldadvci->AwbSetMode (advci_awb_mode_manual);
170 mfldadvci->AwbSetLightSource (advci_awb_light_source_clear_sky);
172 case CAM_AWB_MODE_CLOUDY:
173 mfldadvci->AwbSetMode (advci_awb_mode_manual);
174 mfldadvci->AwbSetLightSource (advci_awb_light_source_cloudiness);
176 case CAM_AWB_MODE_SUNSET:
177 mfldadvci->AwbSetMode (advci_awb_mode_manual);
178 mfldadvci->AwbSetLightSource (advci_awb_light_source_shadow_area);
180 case CAM_AWB_MODE_TUNGSTEN:
181 mfldadvci->AwbSetMode (advci_awb_mode_manual);
182 mfldadvci->AwbSetLightSource (advci_awb_light_source_filament_lamp);
184 case CAM_AWB_MODE_FLUORESCENT:
185 mfldadvci->AwbSetMode (advci_awb_mode_manual);
186 mfldadvci->AwbSetLightSource (advci_awb_light_source_fluorlamp_w);
189 cam_driver_dbg ("Not support awb mode\n");
190 return CAM_ERR_UNSUPP;
192 mfld_cam_settings.wb_mode = wb_mode;
198 get_wb_mode (int *wb_mode)
200 advci_awb_light_source ls;
203 mfldadvci->AwbGetMode (&mode);
205 if (mode == advci_awb_mode_auto) {
206 *wb_mode = CAM_AWB_MODE_AUTO;
209 //Manual Mode, check the error?
210 mfldadvci->AwbGetLightSource (&ls);
212 case advci_awb_light_source_filament_lamp:
213 *wb_mode = CAM_AWB_MODE_TUNGSTEN;
215 case advci_awb_light_source_clear_sky:
216 *wb_mode = CAM_AWB_MODE_DAYLIGHT;
218 case advci_awb_light_source_cloudiness:
219 *wb_mode = CAM_AWB_MODE_CLOUDY;
221 case advci_awb_light_source_shadow_area:
222 *wb_mode = CAM_AWB_MODE_SUNSET;
224 case advci_awb_light_source_fluorlamp_w:
225 case advci_awb_light_source_fluorlamp_n:
226 case advci_awb_light_source_fluorlamp_d:
227 *wb_mode = CAM_AWB_MODE_FLUORESCENT;
230 //Use daylight as default
231 *wb_mode = CAM_AWB_MODE_DAYLIGHT;
238 set_tone_mode (int fd, int mode)
240 cam_err_t ret = CAM_ERR_NONE;
241 enum v4l2_colorfx colorfx = mode;
243 cam_driver_dbg ("%s mode %d\n", __func__, mode);
245 ret = cam_driver_set_tone_mode (fd, colorfx);
247 mfld_cam_settings.tone_mode = mode;
252 get_tone_mode (int fd, int *mode)
254 cam_err_t ret = CAM_ERR_NONE;
255 ret = cam_driver_get_tone_mode (fd, mode);
260 set_scene_mode (int mode)
262 advci_ae_exposure_program scene;
265 case CAM_GENERAL_SCENE_MODE_PORTRAIT:
266 scene = advci_ae_exposure_program_portrait;
268 case CAM_GENERAL_SCENE_MODE_LANDSCAPE:
269 scene = advci_ae_exposure_program_landscape;
271 case CAM_GENERAL_SCENE_MODE_SPORT:
272 scene = advci_ae_exposure_program_sports;
274 case CAM_GENERAL_SCENE_MODE_NIGHT:
275 scene = advci_ae_exposure_program_night;
277 case CAM_GENERAL_SCENE_MODE_AUTO:
278 scene = advci_ae_exposure_program_auto;
280 case CAM_GENERAL_SCENE_MODE_FIREWORKS:
281 scene = advci_ae_exposure_program_fireworks;
284 cam_driver_dbg ("%s Not supported Scene Mode %d\n", __func__, mode);
287 mfldadvci->AeSetExposureProgram (scene);
289 mfld_cam_settings.scene_mode = mode;
294 get_scene_mode (int *scene_mode)
296 *scene_mode = mfld_cam_settings.scene_mode;
301 set_iso_speed (int iso)
304 mfld_cam_settings.iso_speed = iso;
305 ret = mfldadvci->AeSetIso(mfld_cam_settings.iso_speed);
310 get_iso_speed(int *iso)
312 *iso = mfld_cam_settings.iso_speed;
317 set_flash_mode (int fd, int mode)
319 cam_err_t ret = CAM_ERR_NONE;
320 mfld_cam_settings.flash_mode = mode;
322 cam_driver_dbg ("set flash mode: %d\n",mode);
323 /* TODO check this when making auto modes etc.. */
325 case CAM_LIGHT_FLASH_MODE_AUTO:
326 case CAM_LIGHT_FLASH_MODE_ON:
327 case CAM_LIGHT_FLASH_MODE_FILL_IN:
328 case CAM_LIGHT_FLASH_MODE_RED_EYE:
329 case CAM_LIGHT_FLASH_MODE_OFF:
330 if(!mfld_driver.enable_torch)
331 ret = cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF);
334 set_ae_flash_mode(fd,mode);
339 get_flash_mode (int *flash_mode)
341 *flash_mode = mfld_cam_settings.flash_mode;
346 set_flicker_mode (int mode)
349 /* Convert camera genreral flicker mode to AE flicker mode */
351 case CAM_GENERAL_FLICKER_REDUCTION_MODE_OFF:
352 mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_off);
354 case CAM_GENERAL_FLICKER_REDUCTION_MODE_50HZ:
355 mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_50hz);
357 case CAM_GENERAL_FLICKER_REDUCTION_MODE_60HZ:
358 mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_60hz);
360 case CAM_GENERAL_FLICKER_REDUCTION_MODE_AUTO:
361 mfldadvci->AeSetFlickerMode (advci_ae_flicker_mode_auto);
364 cam_driver_dbg ("Not supported flicker mode\n");
365 return CAM_ERR_UNSUPP;
371 get_flicker_mode (int *mode)
374 advci_ae_flicker_mode flicker_mode;
376 mfldadvci->AeGetFlickerMode (&flicker_mode);
378 /* Convert AE flicker mode to camera general flicker mode */
379 switch (flicker_mode) {
380 case advci_ae_flicker_mode_off:
381 *mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_OFF;
383 case advci_ae_flicker_mode_50hz:
384 *mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_50HZ;
386 case advci_ae_flicker_mode_60hz:
387 *mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_60HZ;
389 case advci_ae_flicker_mode_auto:
390 *mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_AUTO;
393 cam_driver_dbg ("Not supported flicker mode\n");
394 return CAM_ERR_UNSUPP;
401 set_focus_mode (int mode)
404 if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
406 case CAM_FOCUS_MODE_AUTO:
407 mfldadvci->AfSetMode (advci_af_mode_auto);
409 case CAM_FOCUS_MODE_MACRO:
410 mfldadvci->AfSetMode (advci_af_mode_auto);
411 mfldadvci->AfSetRange (advci_af_range_macro);
413 case CAM_FOCUS_MODE_NORM:
414 mfldadvci->AfSetMode (advci_af_mode_auto);
415 mfldadvci->AfSetRange (advci_af_range_norm);
417 case CAM_FOCUS_MODE_FULL:
418 mfldadvci->AfSetMode (advci_af_mode_auto);
419 mfldadvci->AfSetRange (advci_af_range_full);
422 cam_driver_dbg ("Not supported mode\n");
423 return CAM_ERR_UNSUPP;
427 mfld_cam_settings.focus_mode = mode;
432 get_focus_mode (int *mode)
434 *mode = mfld_cam_settings.focus_mode;
438 /* Only update the noise that set by user */
440 set_noise_reduction (int fd, int mode)
442 cam_err_t ret = CAM_ERR_NONE;
443 /* Only update the mode changed */
444 int tmp_mode = mode ^ mfld_cam_settings.noise_reduction;
446 if (tmp_mode & (1 << CAM_NOISE_REDUCTION_EXTRA)) {
447 if (mode & (1 << CAM_NOISE_REDUCTION_EXTRA))
448 ret = cam_driver_set_xnr (fd, ON);
450 ret = cam_driver_set_xnr (fd, OFF);
453 if (tmp_mode & (1 << CAM_NOISE_REDUCTION_BAYER)) {
454 if (mode & (1 << CAM_NOISE_REDUCTION_BAYER))
455 ret = cam_driver_set_bnr (fd, ON);
457 ret = cam_driver_set_bnr (fd, OFF);
460 if (tmp_mode & (1 << CAM_NOISE_REDUCTION_YCC)) {
461 if (mode & (1 << CAM_NOISE_REDUCTION_YCC))
462 ret = cam_driver_set_ynr (fd, ON);
464 ret = cam_driver_set_ynr (fd, OFF);
467 if (tmp_mode & (1 << CAM_NOISE_REDUCTION_TEMPORAL)) {
468 if (mode & (1 << CAM_NOISE_REDUCTION_TEMPORAL))
469 ret = cam_driver_set_tnr (fd, ON);
471 ret = cam_driver_set_tnr (fd, OFF);
474 if (tmp_mode & (1 << CAM_NOISE_REDUCTION_FIXED_PATTERN)) {
475 if (mode & (1 << CAM_NOISE_REDUCTION_FIXED_PATTERN))
476 ret = cam_driver_set_fpn (fd, ON);
478 ret = cam_driver_set_fpn (fd, OFF);
480 //FIXME: Add false handling here
481 mfld_cam_settings.noise_reduction = mode;
486 get_noise_reduction (int *mode)
488 *mode = mfld_cam_settings.noise_reduction;
492 /* Only update the advanced features that set by user */
494 set_capture_correction (int fd, int mode)
497 /* Only update the mode changed */
498 int tmp_mode = mode ^ mfld_cam_settings.capture_correction;
499 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_GDC)) {
500 if (mode & (1 << CAM_CAPTURE_CORRECTION_GDC)) {
501 mfldadvci->load_gdc_table();
502 ret = cam_driver_set_gdc (fd, ON);
505 ret = cam_driver_set_gdc (fd, OFF);
508 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_RER)) {
509 if (mode & (1 << CAM_CAPTURE_CORRECTION_RER)) {
510 mfld_driver.rer_enabled = 1;
512 mfld_driver.rer_enabled = 0;
516 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_DIS)) {
517 if (mode & (1 << CAM_CAPTURE_CORRECTION_DIS)) {
518 mfld_driver.dis_enabled = 1;
520 mfld_driver.dis_enabled = 0;
524 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_DVS)) {
525 if (mode & (1 << CAM_CAPTURE_CORRECTION_DVS)) {
526 mfld_driver.dvs_enabled = 1;
527 ret = cam_driver_set_dvs (fd, ON);
529 mfld_driver.dvs_enabled = 0;
530 ret = cam_driver_set_dvs (fd, OFF);
534 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_CAC)) {
535 if (mode & (1 << CAM_CAPTURE_CORRECTION_CAC))
536 ret = cam_driver_set_cac (fd, ON);
538 ret = cam_driver_set_cac (fd, OFF);
541 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_EE)) {
542 if (mode & (1 << CAM_CAPTURE_CORRECTION_EE))
543 ret = cam_driver_set_ee (fd, ON);
545 ret = cam_driver_set_ee (fd, OFF);
548 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_SC)) {
549 if (mode & (1 << CAM_CAPTURE_CORRECTION_SC))
550 ret = cam_driver_set_sc (fd, ON);
552 ret = cam_driver_set_sc (fd, OFF);
555 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_BLC)) {
556 if (mode & (1 << CAM_CAPTURE_CORRECTION_BLC))
557 ret = cam_driver_set_blc (fd, ON);
559 ret = cam_driver_set_blc (fd, OFF);
562 if (tmp_mode & (1 << CAM_CAPTURE_CORRECTION_BPD)) {
563 if (mode & (1 << CAM_CAPTURE_CORRECTION_BPD))
564 ret = cam_driver_set_bpd (fd, ON);
566 ret = cam_driver_set_bpd (fd, OFF);
569 mfld_cam_settings.capture_correction = mode;
574 get_capture_correction (int *mode)
576 *mode = mfld_cam_settings.capture_correction;
580 /* set_capture_fmt: Tell the driver what format we want to produce, and
581 * driver tells us what format we should capture. This mechanism exists
582 * because the driver may want to capture some exotic RAW format from
583 * the sensor, process it and finally convert to desired format
584 * (in @preprocess function).
588 cam_driver_set_capture_fmt (GstCameraSrc * camerasrc,
589 guint32 output_fourcc, guint output_outsize,
590 guint32 * internal_fourcc, guint * internal_outsize)
593 cam_driver_dbg ("%s\n", __func__);
594 //Acutally, we don't plan to implement more than set format now
595 struct v4l2_format fmt;
596 memset (&fmt, 0, sizeof (fmt));
597 *internal_fourcc = V4L2_PIX_FMT_YUV420;
601 /* Tell the driver what resolution we want to capture.
604 cam_driver_set_capture_res (GstCameraSrc * camerasrc, guint width, guint height)
607 // Just set the capture format
608 struct v4l2_format fmt;
609 mfld_driver.height = height;
610 mfld_driver.width = width;
611 cam_driver_dbg ("%s: set res to width %u, height %u\n", __func__, width,
614 memset (&fmt, 0, sizeof (fmt));
615 fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
616 fmt.fmt.pix.width = width;
617 fmt.fmt.pix.height = height;
618 fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
619 ret = ioctl (mfld_driver.fd, VIDIOC_S_FMT, &fmt);
629 * What is this function used for ?
633 cam_set_capture_mode (int fd, cam_capture_mode_t mode)
635 cam_err_t ret = CAM_ERR_NONE;
636 cam_driver_dbg ("%s\n", __func__);
637 mfld_driver.first_frame = 1;
639 if (mfld_driver.sensor_type == SENSOR_TYPE_RAW){
641 case CAM_CAPTURE_MODE_VIEWFINDER:
642 mfldadvci->switch_mode (advci_isp_mode_preview, mfld_driver.frame_rate);
643 set_flash_mode(fd, mfld_cam_settings.flash_mode);
644 if (mfld_driver.ae_enabled)
645 mfld_driver.first_frame = 1;
646 cam_driver_dbg ("%s: VIEWFINDER Mode is set\n", __func__);
648 case CAM_CAPTURE_MODE_VIDEO_RECORD:
649 mfldadvci->switch_mode (advci_isp_mode_video, mfld_driver.frame_rate);
650 if (mfld_driver.ae_enabled)
651 mfld_driver.first_frame = 1;
652 cam_driver_dbg ("%s: VIDEO Mode is set\n", __func__);
654 case CAM_CAPTURE_MODE_STILL_CAPTURE:
655 mfldadvci->switch_mode (advci_isp_mode_capture, mfld_driver.frame_rate);
656 if (mfld_driver.ae_enabled)
657 mfld_driver.first_frame = 1;
658 cam_driver_dbg ("%s: STILL Mode is set\n", __func__);
661 mfldadvci->switch_mode (advci_isp_mode_preview, mfld_driver.frame_rate);
662 mfld_driver.first_frame = 1;
663 cam_driver_dbg ("%s: NULL Mode is set\n", __func__);
667 mfld_driver.mode = mode;
672 cam_set_capture_fmt (int fd, unsigned int width, unsigned int height,
675 mfld_driver.width = width;
676 mfld_driver.height = height;
677 mfld_driver.fourcc = fourcc;
679 mfldadvci->mode_spec_init ();
685 cam_set_zoom (int fd, float zoom)
687 cam_err_t ret = CAM_ERR_NONE;
688 unsigned int zoomval;
690 /* Map 1.0 - 10.0 to 1 - 64 */
691 zoomval = (unsigned int)((zoom - 1.0) * 63.0 / 9) + 1;
698 ret = cam_driver_set_zoom (fd, zoomval);
699 cam_driver_dbg ("%s\n set zoom to %u, return %d\n", __func__, zoomval, ret);
705 /* start: Called by v4l2camerasrc at startup (before STREAMON). Driver should
706 * start processing the frames now.
709 cam_driver_start (int fd)
711 cam_err_t ret = CAM_ERR_NONE;
712 cam_driver_dbg ("%s\n", __func__);
717 /* Called by v4l2camerasrc when stopping (before STREAMOFF). Driver
718 * must stop processing the frames.
721 cam_driver_stop (int fd)
723 cam_err_t ret = CAM_ERR_NONE;
724 cam_driver_dbg ("%s\n", __func__);
729 cam_set_autoexposure (int fd, int on)
731 enum v4l2_exposure_auto_type expo;
732 cam_err_t ret = CAM_ERR_NONE;
734 expo = V4L2_EXPOSURE_AUTO;
736 expo = V4L2_EXPOSURE_MANUAL;
737 cam_driver_set_autoexposure (fd, expo);
741 /* Start or stop autofocusing.
744 cam_set_autofocus (int on)
746 cam_driver_dbg ("%s\n", __func__);
748 mfld_driver.start_still_af = 1;
750 mfld_driver.start_still_af = 0;
755 /* Turn on / off the flash.
758 cam_set_flash (int fd, int on)
760 cam_driver_dbg ("%s\n", __func__);
761 cam_err_t ret = CAM_ERR_NONE;
762 mfld_driver.enable_torch = on;
763 if( cam_driver_set_torch(fd, on)== CAM_ERR_NONE)
764 mfld_driver.enable_torch = on;
766 mfld_driver.enable_torch = FALSE;
770 /* Ask the suggested flash intensity value.
773 cam_get_flash_intensity (int fd, int on)
775 cam_driver_dbg ("%s\n", __func__);
779 /* set_flash_intensity: Set flash intensity value.
782 cam_set_flash_intensity (int fd, int on)
784 cam_driver_dbg ("%s\n", __func__);
788 /* set_flash_duration: Set the flash timeout value.
791 cam_set_flash_duration (int fd, int duration)
793 cam_driver_dbg ("%s\n", __func__);
797 /* Turn on / off privacy light.
800 cam_set_privacy_light (int fd, int on)
802 cam_driver_dbg ("%s\n", __func__);
806 /* V4l2camerasrc uses this to query autofocusing status.
809 cam_checkfocus_status (cam_focus_status_t * status, int force_update)
811 advci_af_status af_status;
812 gboolean do_read = FALSE;
814 if (mfld_driver.focus_done >= FOCUS_REALLY_DONE) {
815 mfld_driver.focus_done = 0;
818 if ((do_read == TRUE) || (force_update == 1)) {
819 mfldadvci->AfGetStillAfStatus (&af_status);
820 *status = cam_find_item_new (focus_status_map, af_status, 1);
821 cam_driver_dbg ("%s *status : %d\n ", __func__, *status);
822 *status = CAM_FOCUS_STATUS_RUNNING;
828 /* V4l2camerasrc uses this to query the risk for image shaking.
831 cam_get_shake_risk (int fd, int risk)
833 cam_driver_dbg ("%s\n", __func__);
837 /* start_capture: Called by v4l2camerasrc when the HQ-image capture process starts */
839 cam_start_capture (int fd)
841 cam_err_t ret = CAM_ERR_NONE;
842 cam_driver_dbg ("%s\n", __func__);
844 if (mfld_driver.width <= 640 && mfld_driver.height <= 480)
845 ret = ci_isp_switch_binary (fd, IspModePreview);
847 ret = ci_isp_switch_binary (fd, IspModePrimary);
854 /* @stop_capture: Called by v4l2camerasrc when the HQ-image capture has
857 cam_stop_capture (int fd)
859 cam_driver_dbg ("%s\n", __func__);
863 /* capture: If driver implements this vmethod, v4l2camerasrc's built-in HQ image
864 * capture mechamism is skipped and this function is used to capture
866 * In MFLD implementation, we do the redeye reduction and DIS here
870 cam_driver_capture (GstCameraSrc * camerasrc, GstBuffer ** buf,
873 cam_driver_dbg ("%s\n", __func__);
874 //GstV4l2NewCamSrc *v4l2camsrc = (GstV4l2NewCamSrc *)user_data;
876 if (mfld_driver.rer_enabled == 1 || mfld_driver.dis_enabled == 1) {
877 //mfld_capture_frames(buf, v4l2camsrc);
885 /* process: Perform some image improvements for the given buffer. This
886 * vmethod is called after @stop_capture vmethod.
889 cam_post_process (int fd)
891 cam_err_t ret = CAM_ERR_NONE;
892 cam_driver_dbg ("%s\n", __func__);
897 /* get_makernote; Retrieve MakerNote data chunk from camera device.
900 cam_get_makernote (int fd, unsigned char *buf, unsigned size)
902 cam_driver_dbg ("%s, !!!!!!line:%d\n", __func__, __LINE__);
903 cam_err_t ret = CAM_ERR_NONE;
905 ret = cam_driver_get_makernote (fd, buf, size);
911 cam_set_capture_correction (int fd, cam_capture_correction_t mode, int on)
914 unsigned int capture_correction;
916 cam_feature_get (fd, CAM_CAPTURE_CORRECTION, &capture_correction);
919 set_bit (mode, &capture_correction);
921 clear_bit (mode, &capture_correction);
923 ret = cam_feature_set (fd, CAM_CAPTURE_CORRECTION, capture_correction);
928 cam_set_tone_control (int fd, cam_tone_control_t tone,
929 struct tone_control * value)
931 cam_err_t ret = CAM_ERR_NONE;
933 case CAM_GAMMA_VALUE:
934 if (mfld_cam_settings.tone.gamma != value->gamma) {
935 ret = cam_driver_set_gamma (fd, value->gamma);
936 mfld_cam_settings.tone.gamma = value->gamma;
939 case CAM_BRIGHTNESS_VALUE:
940 if (mfld_cam_settings.tone.brightness != value->brightness) {
941 ret = cam_driver_set_contrast (fd, mfld_cam_settings.tone.contrast,
943 mfld_cam_settings.tone.brightness = value->brightness;
946 case CAM_CONTRAST_VALUE:
947 if (mfld_cam_settings.tone.contrast != value->contrast) {
948 ret = cam_driver_set_contrast (fd, value->contrast,
949 mfld_cam_settings.tone.brightness);
950 mfld_cam_settings.tone.contrast = value->contrast;
954 cam_driver_dbg ("Unsupported tone control mode\n");
955 return CAM_ERR_UNSUPP;
961 cam_get_tone_control (int fd, struct tone_control * tone)
963 *tone = mfld_cam_settings.tone;
967 static const char *photo_features [] =
979 "noise reduction mode",
980 "capture correction",
983 /* write_settings: Called when some settings in v4l2camerasrc's #GstPhotoSettings
984 * structure has changed. Driver needs to forward the settings to device.
987 cam_feature_set (int fd, cam_photo_feature_t feature, int value)
989 cam_err_t ret = CAM_ERR_NONE;
992 cam_driver_dbg ("%s: feature %s, value %d\n", __func__,
993 photo_features[feature], value);
996 ret = set_wb_mode (value);
998 case CAM_GENERAL_EFFECT_TYPE:
999 ret = set_tone_mode (fd, value);
1001 case CAM_GENERAL_SCENE_MODE:
1002 ret = set_scene_mode (value);
1004 case CAM_LIGHT_FLASH_MODE:
1005 ret = set_flash_mode (fd, value);
1007 case CAM_EXPOSURE_MANUAL_TIME:
1008 ret = cam_driver_set_exposure (fd, value);
1010 case CAM_EXPOSURE_MANUAL_APERTURE:
1011 ret = cam_driver_set_aperture (fd, value);
1013 case CAM_EXPOSURE_COMPENSATION:
1018 bias = (int) ((double) value / 10 * 65536.0);
1019 ret = mfldadvci->AeSetBias (bias);
1021 case CAM_EXPOSURE_ISO_VALUE:
1022 ret = set_iso_speed (value);
1024 case CAM_FOCUS_MODE:
1025 ret = set_focus_mode (value);
1027 case CAM_GENERAL_FLICKER_REDUCTION_MODE:
1028 ret = set_flicker_mode (value);
1030 case CAM_NOISE_REDUCTION_MODE:
1031 ret = set_noise_reduction (fd, value);
1033 case CAM_CAPTURE_CORRECTION:
1034 ret = set_capture_correction (fd, value);
1037 cam_driver_dbg ("Not supported photography features\n");
1042 cam_err_print (ret);
1047 /* read_settings: V4l2camerasrc tells the driver to retrieve settings from
1048 * device and store them into #GstPhotoSettings structure.
1051 cam_feature_get (int fd, cam_photo_feature_t feature, int *value)
1056 cam_driver_dbg ("%s: feature %s, \n", __func__,
1057 photo_features[feature]);
1058 if (value == NULL) {
1059 cam_driver_dbg ("%s value is NULL\n", __func__);
1060 return CAM_ERR_PARAM;
1065 ret = get_wb_mode (value);
1067 case CAM_GENERAL_EFFECT_TYPE:
1068 ret = get_tone_mode (fd, value);
1070 case CAM_GENERAL_SCENE_MODE:
1071 ret = get_scene_mode(value);
1073 case CAM_LIGHT_FLASH_MODE:
1074 ret = get_flash_mode (value);
1076 case CAM_EXPOSURE_MANUAL_TIME:
1077 ret = cam_driver_get_exposure (fd, value);
1079 case CAM_EXPOSURE_MANUAL_APERTURE:
1080 ret = cam_driver_get_aperture (fd, value);
1082 case CAM_EXPOSURE_COMPENSATION:
1083 ret = mfldadvci->AeGetBias (&bias);
1084 *value = (int) (((double) bias / 65536.0) * 10);
1086 case CAM_EXPOSURE_ISO_VALUE:
1087 ret = get_iso_speed (value);
1089 case CAM_FOCUS_MODE:
1090 ret = get_focus_mode (value);
1092 case CAM_GENERAL_FLICKER_REDUCTION_MODE:
1093 ret = get_flicker_mode (value);
1095 case CAM_NOISE_REDUCTION_MODE:
1096 ret = get_noise_reduction (value);
1098 case CAM_CAPTURE_CORRECTION:
1099 ret = get_capture_correction (value);
1102 cam_driver_dbg ("Not supported photography features\n");
1103 ret = CAM_ERR_UNSUPP;
1107 cam_err_print (ret);
1112 /* init: Initialize the driver. V4l2camerasrc calls this immediately after
1113 * the camera device has been opened and registers the device file
1114 * descriptor to the driver.
1117 /* Do the basic init here */
1119 libmfld_cam_init (GstV4l2MFLDAdvCI * advci)
1121 /* Initialize the driver structure */
1122 cam_driver_dbg ("%s\n", __func__);
1124 if (sem_init(&g_sem_3a, 0, 0) < 0) {
1125 cam_driver_dbg("Init g_sem_3a failed\n");
1128 memset (&mfld_cam_settings, 0, sizeof (mfld_cam_settings));
1130 /* These modes are on by default */
1131 mfld_cam_settings.noise_reduction =
1132 CAM_NOISE_REDUCTION_YCC | CAM_NOISE_REDUCTION_BAYER;
1133 mfld_cam_settings.capture_correction =
1134 (1 << CAM_CAPTURE_CORRECTION_EE) | (1 << CAM_CAPTURE_CORRECTION_SC) |
1135 (1 << CAM_CAPTURE_CORRECTION_BPD);
1137 mfld_cam_settings.zoom = 1.0; //Zoom i in feature set 2
1138 mfld_cam_settings.ev_compensation = 0.0;
1139 mfld_cam_settings.exposure = 0; // Auto
1140 mfld_cam_settings.aperture = 0;
1141 mfld_cam_settings.iso_speed = 0;
1143 mfld_cam_settings.tone.gamma = 2.2;
1144 mfld_cam_settings.tone.brightness = 0;
1145 mfld_cam_settings.tone.contrast = 256;
1147 mfld_cam_settings.wb_mode = CAM_AWB_MODE_AUTO;
1148 mfld_cam_settings.scene_mode = CAM_GENERAL_SCENE_MODE_AUTO;
1149 mfld_cam_settings.flash_mode = CAM_LIGHT_FLASH_MODE_AUTO;
1150 mfld_cam_settings.tone_mode = CAM_GENERAL_EFFECT_TYPE_NORMAL;
1151 mfld_cam_settings.flicker_mode = CAM_GENERAL_FLICKER_REDUCTION_MODE_50HZ;
1152 mfld_cam_settings.focus_mode = CAM_FOCUS_MODE_AUTO;
1154 mfld_driver.ae_enabled = 0;
1155 mfld_driver.af_enabled = 0;
1156 mfld_driver.awb_enabled = 0;
1157 mfld_driver.dis_enabled = 0;
1158 mfld_driver.dvs_enabled = 0;
1159 mfld_driver.rer_enabled = 0;
1160 mfld_driver.start_still_af = 0;
1161 mfld_driver.still_af_count = 0;
1163 mfld_driver.first_frame = 1;
1165 mfld_driver.mmap = 1;
1166 mfld_driver.g_3a_started = 0;
1168 mfld_driver.dvs_vector.x = 0;
1169 mfld_driver.dvs_vector.y = 0;
1170 mfld_driver.focus_done = 0;
1172 mfld_driver.enable_torch = FALSE;
1175 /* Initalize the 3A library */
1180 libmfld_cam_dispose (void)
1182 if (mfld_driver.g_3a_started) {
1183 pthread_cancel (mfld_driver.thread);
1184 mfld_driver.thread = 0;
1186 mfld_driver.g_3a_started = 0;
1187 mfldadvci->uninit ();
1192 cam_driver_init (int fd, const char *sensor_id)
1194 cam_driver_dbg ("%s\n", __func__);
1196 mfld_driver.fd = fd;
1198 mfld_driver.sensor_type = mfldadvci->isp_set_fd (fd, sensor_id);
1200 cam_driver_init_gamma (fd);
1202 /* FixMe Need to get the ISO speed , apture when use need to read these
1205 mfld_driver.initflag = 1; /* We are ready to call the dz_zoom */
1206 /* Do other driver related init here */
1208 mfld_driver.thread = 0;
1209 mfld_driver.frame_rate = 15.0f;
1211 return CAM_ERR_NONE;
1214 /* deinit: Deinitialize the driver. V4l2camerasrc tells the driver to stop
1215 * using the camera device, because after this call it is not valid anymore.
1218 cam_driver_deinit (int fd)
1220 cam_driver_dbg ("%s\n", __func__);
1221 /* Initialize the driver structure */
1222 //GstCameraSrcClass *camera_class = GST_CAMERA_SRC_GET_CLASS (camerasrc);
1223 mfld_driver.initflag = 0;
1224 if (mfld_driver.g_3a_started) {
1225 pthread_cancel (mfld_driver.thread);
1226 mfld_driver.g_3a_started = 0;
1228 /* Do other driver related deinit here */
1230 return CAM_ERR_NONE;
1234 cam_set_frame_rate( float frame_rate)
1236 mfld_driver.frame_rate = frame_rate;
1237 return CAM_ERR_NONE;
1241 * For Red Eye Reduction and Still Image Stabilization
1244 cam_copy_v4l2buf_to_user (advci_frame_t *user, struct v4l2_buffer *buf)
1247 if (mfld_driver.mmap) {
1248 addr = mmap (NULL, buf->length, PROT_READ | PROT_WRITE, MAP_SHARED,
1249 mfld_driver.fd, buf->m.offset);
1250 if (MAP_FAILED == addr) {
1251 cam_driver_dbg ("Mapped failed\n");
1255 addr = (void *) buf->m.userptr;
1258 user->length = buf->length;
1259 user->addr = malloc (buf->length);
1260 if (user->addr == NULL) {
1261 cam_driver_dbg ("Malloc buf->lenth %d failed\n", buf->length);
1262 if (mfld_driver.mmap)
1263 munmap (addr, buf->length);
1266 memcpy (user->addr, addr, buf->length);
1267 if (mfld_driver.mmap)
1268 munmap (addr, buf->length);
1272 cam_free_bufs (advci_frame_t *bufs)
1275 for (i = 0; i < DIS_COMPOSITE_FRAMES; i++) {
1276 if (bufs[i].addr != NULL)
1277 free (bufs[i].addr);
1278 bufs[i].addr = NULL;
1284 cam_still_compose (struct v4l2_buffer *buf, advci_frame_t bufs[],
1285 int frame_dis, struct atomisp_dis_vector vectors[])
1287 advci_frame_t com_buf;
1289 cam_driver_dbg ("Still Compose Phase 1: Begin\n");
1290 com_buf.length = buf->length;
1292 if (mfld_driver.mmap)
1293 com_buf.addr = mmap (NULL, buf->length, PROT_READ | PROT_WRITE, MAP_SHARED,
1294 mfld_driver.fd, buf->m.offset);
1296 com_buf.addr = (void *) buf->m.userptr;
1297 com_buf.width = mfld_driver.width;
1298 com_buf.height = mfld_driver.height;
1300 mfldadvci->still_compose (&com_buf, bufs, frame_dis, vectors);
1302 if (mfld_driver.mmap)
1303 munmap (com_buf.addr, com_buf.length);
1307 cam_do_redeye_removal (struct v4l2_buffer *buf)
1311 advci_frame_t user_buf;
1312 user_buf.length = buf->length;
1313 if (mfld_driver.mmap)
1314 user_buf.addr = mmap (NULL, buf->length, PROT_READ | PROT_WRITE, MAP_SHARED,
1315 mfld_driver.fd, buf->m.offset);
1317 user_buf.addr = (void *) buf->m.userptr;
1318 user_buf.width = mfld_driver.width;
1319 user_buf.height = mfld_driver.height;
1320 mfldadvci->do_redeye_removal (&user_buf);
1322 if (mfld_driver.mmap)
1323 munmap (user_buf.addr, user_buf.length);
1327 write_image(const void *data, const int size)
1330 static unsigned int count = 0;
1334 snprintf(filename, 50, "dump_image_%d_%d_00%u.%s", mfld_driver.width, mfld_driver.height,
1337 fp = fopen (filename, "w+");
1339 cam_driver_dbg ("open file %s failed %s\n", filename, strerror (errno));
1343 cam_driver_dbg ("Begin write image %s\n", filename);
1344 if ((bytes = fwrite (data, size, 1, fp)) < size)
1345 cam_driver_dbg ("Write less bytes to %s: %d, %d\n", filename,
1353 dump_v4l2_buffer(struct v4l2_buffer *buffer)
1356 static unsigned int i = 0;
1357 if (mfld_driver.mmap)
1358 data = mmap (NULL, buffer->length, PROT_READ | PROT_WRITE, MAP_SHARED,
1359 mfld_driver.fd, buffer->m.offset);
1361 data = (void *) buffer->m.userptr;
1363 write_image(data, buffer->length);
1365 if (mfld_driver.mmap)
1366 munmap(data, buffer->length);
1370 #define PAGE_ALIGN(x) ((x + 0xfff) & 0xfffff000)
1372 dump_raw_image (int fd, struct cam_capture_settings *st)
1377 struct buffer raw_buffer;
1378 static unsigned int fn_count = 0;
1384 cam_driver_dbg ("%s, output_size %d\n", __func__, st->raw_output_size);
1386 raw_buffer.length = st->raw_output_size;
1387 raw_buffer.start = mmap (NULL /* start anywhere */ ,
1388 PAGE_ALIGN (st->raw_output_size), PROT_READ | PROT_WRITE /* required */ ,
1389 MAP_SHARED /* recommended */ ,
1391 if (MAP_FAILED == raw_buffer.start) {
1392 cam_driver_dbg ("mmap raw image failed");
1395 cam_driver_dbg ("MMAP raw address from kernel 0x%x\n", raw_buffer.start);
1396 buf = (char *) raw_buffer.start;
1398 memset (fn_buf, 0, sizeof (char) * 100);
1399 snprintf (fn_buf, 200, "%s/%d_%d_%u.%s", filename, mfld_driver.width,
1400 mfld_driver.height, fn_count++, "rawoutput.raw");
1401 fp = fopen (fn_buf, "w+");
1403 cam_driver_dbg ("open file %s failed %s\n", fn_buf, strerror (errno));
1407 cam_driver_dbg ("The size of raw image %d\n", st->raw_output_size);
1409 if ((bytes = fwrite (buf, st->raw_output_size, 1, fp)) < st->raw_output_size)
1410 cam_driver_dbg ("Write less bytes to %s: %d, %d\n", fn_buf,
1411 st->raw_output_size, bytes);
1417 mfldcam_3a_process (gpointer data)
1420 sem_wait(&g_sem_3a);
1421 /* Read 3A statistics */
1422 if ((mfld_driver.ae_enabled || mfld_driver.af_enabled
1423 || mfld_driver.awb_enabled || mfld_driver.dis_enabled
1424 || mfld_driver.dvs_enabled) && (mfld_driver.sensor_type == SENSOR_TYPE_RAW) )
1426 mfldadvci->get_statistics ();
1428 /* AE, AWB and AF Process */
1429 mfldadvci->AeAfAwb_process(&mfld_driver.timestamp);
1432 if (mfld_driver.awb_enabled)
1433 mfldadvci->awb_apply_results ();
1435 if (mfld_driver.ae_enabled)
1436 mfldadvci->ae_apply_results ();
1443 mfldcam_3a_start (void)
1445 if (!mfld_driver.g_3a_started) {
1446 mfld_driver.g_3a_started = 1;
1447 if (pthread_create (&mfld_driver.thread, NULL, mfldcam_3a_process,
1449 mfld_driver.g_3a_started = 0;
1450 cam_driver_dbg ("Create thread failed %s\n", __func__);;
1456 mfldcam_3a_stop (void)
1458 if (mfld_driver.g_3a_started)
1459 pthread_cancel (mfld_driver.thread);
1460 mfld_driver.g_3a_started = 0;
1464 run_flash_sequence (int fd, struct v4l2_buffer *buffer)
1468 mfldadvci->ae_calc_for_flash ();
1469 mfldadvci->ae_apply_results ();
1470 if (-1 == ioctl (fd, VIDIOC_DQBUF, buffer)) {
1471 cam_driver_dbg ("%s: Error dqbuf %d\n", __func__, 0);
1474 mfldadvci->get_statistics ();
1477 mfldadvci->ae_calc_without_flash ();
1478 mfldadvci->ae_apply_results ();
1479 led_flash_trigger (fd, 0, 0);
1480 mfldadvci->awb_apply_results ();
1481 if (-1 == ioctl (fd, VIDIOC_QBUF, buffer)) {
1482 cam_driver_dbg ("%s: Error qbuf %d\n", __func__, 1);
1485 if (-1 == ioctl (fd, VIDIOC_DQBUF, buffer)) {
1486 cam_driver_dbg ("%s: Error dqbuf %d\n", __func__, 1);
1489 mfldadvci->get_statistics ();
1492 mfldadvci->ae_calc_with_flash ();
1493 mfldadvci->ae_apply_results ();
1494 mfldadvci->awb_calc_flash ();
1495 led_flash_trigger (fd, 0, 15);
1496 mfldadvci->awb_apply_results ();
1497 if (-1 == ioctl (fd, VIDIOC_QBUF, buffer)) {
1498 cam_driver_dbg ("%s: Error qbuf %d\n", __func__, 2);
1501 if (-1 == ioctl (fd, VIDIOC_DQBUF, buffer)) {
1502 cam_driver_dbg ("%s: Error dqbuf %d\n", __func__, 2);
1506 return CAM_ERR_NONE;
1509 /* Discard the first two frames because of the first frame
1510 * from the driver is black. */
1512 discard_first_frame(int fd, struct v4l2_buffer *buffer, int count)
1515 for (i = 0; i < count; i++) {
1516 if (-1 == ioctl (fd, VIDIOC_DQBUF, buffer)) {
1517 cam_driver_dbg ("%s: Error dqbuf %d\n", __func__, count);
1520 if (-1 == ioctl (fd, VIDIOC_QBUF, buffer)) {
1521 cam_driver_dbg ("%s: Error qbuf %d\n", __func__, count);
1525 return CAM_ERR_NONE;
1529 cam_capture_init (int fd, struct v4l2_buffer *buffer,
1530 struct cam_capture_settings *capture_settings)
1534 mfld_driver.mmap = capture_settings->mmap;
1535 mfld_driver.ae_enabled = capture_settings->ae;
1536 mfld_driver.af_enabled = capture_settings->af;
1537 mfld_driver.awb_enabled = capture_settings->awb;
1539 /* Discard the first two frames */
1540 if (mfld_driver.first_frame) {
1541 discard_first_frame(fd, buffer, 2);
1542 mfld_driver.first_frame = 0;
1544 /* Still AF start */
1545 if (mfld_driver.start_still_af) {
1546 if (mfld_driver.af_enabled && mfld_driver.still_af_count > 0)
1547 mfldadvci->af_stop ();
1548 mfld_driver.focus_done = 0;
1549 mfld_driver.start_still_af = 0;
1550 mfld_driver.still_af_count = 1;
1551 mfld_driver.af_start_time = mfld_driver.timestamp;
1553 if (mfldadvci->af_assist_light_needed()) {
1554 mfld_driver.enable_torch = TRUE;
1555 cam_driver_set_torch(fd, TRUE);
1557 if (mfld_driver.af_enabled)
1558 mfldadvci->af_start ();
1563 get_flash_status(void)
1565 int cur_flash_mode = CAM_LIGHT_FLASH_MODE_OFF;
1566 gboolean flash_en = FALSE;
1568 get_flash_mode(&cur_flash_mode);
1570 switch (cur_flash_mode) {
1571 case CAM_LIGHT_FLASH_MODE_ON:
1574 case CAM_LIGHT_FLASH_MODE_AUTO:
1575 case CAM_LIGHT_FLASH_MODE_RED_EYE:
1576 mfldadvci->ae_is_flash_needed(&flash_en);
1580 /* other mode, turn flash off */
1587 cam_dis_dvs_processing (struct atomisp_dis_vector *vectors, advci_frame_t *bufs,
1588 struct v4l2_buffer *buffer, int frame_cnt, int dis_enabled)
1590 struct atomisp_dis_vector *dvs_vector;
1592 cam_driver_dbg ("Begin cam_dis_get_statices\n");
1593 mfldadvci->dis_read_statistics (); //read_dis_stats_from_xmem();
1595 cam_driver_dbg ("Begin cam_dis_still_process\n");
1597 if (mfld_driver.mode == advci_isp_mode_video)
1598 dvs_vector = &mfld_driver.dvs_vector;
1601 // TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
1602 // mfldadvci->dis_process (dvs_vector); /* dis_vector only valid in video mode */
1605 mfldadvci->dis_calc_still (&vectors[frame_cnt], frame_cnt);
1606 cam_copy_v4l2buf_to_user (&bufs[frame_cnt], buffer);
1609 cam_driver_dbg ("Update DIS results\n");
1610 mfldadvci->update_dis_results();
1614 run_normal_sequence(int fd, struct v4l2_buffer *buffer)
1616 int frame_cnt, frame_dis;
1617 struct atomisp_dis_vector vectors[DIS_COMPOSITE_FRAMES];
1618 advci_frame_t bufs[DIS_COMPOSITE_FRAMES];
1621 int dis_enabled = mfld_driver.dis_enabled &&
1622 (mfld_driver.fourcc == V4L2_PIX_FMT_YUV420);
1624 for (frame_cnt = 0; frame_cnt < DIS_COMPOSITE_FRAMES; frame_cnt++) {
1625 bufs[frame_cnt].addr = NULL;
1626 bufs[frame_cnt].width = mfld_driver.width;
1627 bufs[frame_cnt].height = mfld_driver.height;
1631 frame_dis = DIS_COMPOSITE_FRAMES;
1635 for (frame_cnt = 0; frame_cnt < frame_dis; frame_cnt++) {
1636 if (-1 == ioctl (fd, VIDIOC_DQBUF, buffer)) {
1637 cam_driver_dbg ("%s: Error dqbuf %d\n", __func__, frame_cnt);
1641 mfld_driver.timestamp = buffer->timestamp;
1642 sem_post(&g_sem_3a);
1644 /* DIS and DVS processing */
1645 if (dis_enabled || mfld_driver.dvs_enabled)
1646 cam_dis_dvs_processing(vectors, bufs, buffer, frame_cnt, dis_enabled);
1648 /* Qbuffer for the DIS */
1650 if (-1 == ioctl (fd, VIDIOC_QBUF, buffer)) {
1651 cam_driver_dbg ("%s: Error qbuf %d\n", __func__, frame_cnt);
1657 cam_driver_dbg ("Do the still image compose\n");
1658 cam_still_compose (buffer, bufs, frame_dis, vectors);
1661 cam_free_bufs (bufs);
1663 /* Still AF processing */
1664 if (mfld_driver.still_af_count) {
1665 gboolean complete = TRUE; /* AF status */
1667 if (mfld_driver.af_enabled)
1668 complete = mfldadvci->af_is_complete ();
1671 (calculate_timediff(&mfld_driver.af_start_time, &mfld_driver.timestamp)
1672 > STILL_AF_MAX_TIME_IN_MS) ) {
1673 mfld_driver.focus_done ++;
1674 if(mfld_driver.focus_done >= FOCUS_REALLY_DONE) {
1675 mfld_driver.still_af_count = 0;
1676 if (complete == 0) {
1677 mfldadvci->af_stop();
1678 cam_driver_dbg ("AF: Focus Failed %s\n", __func__);
1679 if(mfld_driver.enable_torch) {
1680 mfld_driver.enable_torch= FALSE;
1681 cam_driver_set_torch(fd, FALSE);
1686 mfld_driver.still_af_count++;
1688 mfld_driver.still_af_count++;
1691 return CAM_ERR_NONE;
1695 cam_capture_frames (int fd, struct v4l2_buffer *buffer,
1696 struct cam_capture_settings *capture_settings)
1699 int frame_dis = 1, frame_cnt;
1701 gboolean flash_en = FALSE;
1703 cam_capture_init (fd, buffer, capture_settings);
1705 if ((mfld_driver.mode == CAM_CAPTURE_MODE_STILL_CAPTURE ) &&
1706 (mfld_driver.sensor_type == SENSOR_TYPE_RAW) ) {
1707 /* check flash here not in always when capturing frames */
1708 flash_en = get_flash_status ();
1709 // stop still AF processing if running
1710 if (mfld_driver.still_af_count) {
1711 mfldadvci->af_stop();
1712 if(mfld_driver.enable_torch) {
1713 mfld_driver.enable_torch= FALSE;
1714 cam_driver_set_torch(fd, FALSE);
1716 mfld_driver.still_af_count = 0;
1718 if ((flash_en == TRUE) && (mfld_driver.enable_torch == FALSE)){
1719 run_flash_sequence (fd, buffer);
1723 //cam_driver_set_indication_intensity(fd, INDICATOR_INTENSITY);
1724 //cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_INDICATOR);
1725 ret = run_normal_sequence(fd, buffer);
1726 /* restore flash mode */
1727 if (mfld_driver.enable_torch == FALSE)
1728 cam_driver_set_flash_mode(fd,ATOMISP_FLASH_MODE_OFF);
1731 ret = run_normal_sequence(fd, buffer);
1737 if (mfld_driver.rer_enabled && (mfld_driver.fourcc == V4L2_PIX_FMT_YUV420))
1738 cam_do_redeye_removal (buffer);
1740 if (capture_settings->dump_raw)
1741 dump_raw_image (fd, capture_settings);
1743 if (capture_settings->dump_image)
1744 dump_v4l2_buffer(buffer);
1746 return CAM_ERR_NONE;
1749 cam_err_t get_ae_windows_num(int fd, int * num)
1751 if(ci_adv_Success != mfldadvci->AeGetWindowsNum(num))
1754 return CAM_ERR_NONE;
1757 void get_awb_version(int fd, int * major, int * minor)
1759 mfldadvci->AwbVersion(major, minor);
1762 void get_ae_version(int fd, int * major, int * minor)
1764 mfldadvci->AeVersion(major, minor);
1767 void get_af_version(int fd, int * major, int * minor)
1769 mfldadvci->AfVersion(major, minor);
1772 cam_err_t cam_get_focus_posi(int fd, unsigned * posi)
1774 return cam_driver_get_focus_posi(fd, posi);
1777 void get_af_result(int fd, unsigned * result)
1779 *result = mfld_driver.af_result; // 0 means fail, it will be filled when captured finished.
1782 cam_err_t get_af_status(int fd, unsigned * status)
1787 mfldadvci->AfGetStillAfStatus(&st);
1789 if(advci_af_status_success == st)
1794 return CAM_ERR_NONE;
1797 cam_err_t get_exp_mode(int fd, cam_scene_mode_t *expmode)
1799 advci_ae_exposure_program mode;
1801 mfldadvci->AeGetExposureProgram(&mode);
1803 /* Convert AE flicker mode to camera general flicker mode */
1805 case advci_ae_exposure_program_auto:
1806 *expmode = CAM_GENERAL_SCENE_MODE_AUTO;
1808 case advci_ae_exposure_program_portrait:
1809 *expmode = CAM_GENERAL_SCENE_MODE_PORTRAIT;
1811 case advci_ae_exposure_program_sports:
1812 *expmode = CAM_GENERAL_SCENE_MODE_SPORT;
1814 case advci_ae_exposure_program_landscape:
1815 *expmode = CAM_GENERAL_SCENE_MODE_LANDSCAPE;
1817 case advci_ae_exposure_program_night:
1818 *expmode = CAM_GENERAL_SCENE_MODE_NIGHT;
1820 case advci_ae_exposure_program_fireworks:
1821 *expmode = CAM_GENERAL_SCENE_MODE_FIREWORKS;
1824 cam_driver_dbg ("Not supported exposure mode\n");
1825 return CAM_ERR_UNSUPP;
1828 return CAM_ERR_NONE;
1831 void get_ae_bias(int fd, int * bias)
1833 mfldadvci->AeGetBias(bias);
1836 void get_rer_status(int fd, int * status)
1838 *status = mfld_driver.rer_enabled;
1841 void get_rer_version(int fd, int * major, int * minor)
1843 mfldadvci->RerVersion(major, minor);
1846 cam_err_t get_ae_manual_shutter(int fd, int * time)
1848 if(ci_adv_Success != mfldadvci->AeGetManualShutter(time))
1851 return CAM_ERR_NONE;
1854 cam_err_t get_awb_data(int fd, unsigned * num_p, unsigned * avg_r,
1855 unsigned * avg_gr, unsigned * avg_b, unsigned * avg_gb)
1857 mfldadvci->Awbdata(num_p, avg_r, avg_gr, avg_b, avg_gb);
1858 return CAM_ERR_NONE;
1861 cam_err_t get_ae_manual_aperture(int fd, int *aperture)
1864 mfldadvci->AeGetManualAperture(aperture);
1866 return CAM_ERR_NONE;
1869 cam_err_t get_ae_flash_mode(int fd, cam_flash_mode_t *mode)
1871 cam_flash_mode_t ci_mode;
1873 mfldadvci->AeGetFlashMode(&ci_mode);
1877 case advci_ae_flash_mode_auto:
1878 *mode = CAM_LIGHT_FLASH_MODE_AUTO;
1880 case advci_ae_flash_mode_off:
1881 *mode = CAM_LIGHT_FLASH_MODE_OFF;
1883 case advci_ae_flash_mode_on:
1884 *mode = CAM_LIGHT_FLASH_MODE_ON;
1886 case advci_ae_flash_mode_day_sync:
1887 *mode = CAM_LIGHT_FLASH_MODE_AUTO;
1889 case advci_ae_flash_mode_slow_sync:
1890 *mode = CAM_LIGHT_FLASH_MODE_AUTO;
1893 *mode = CAM_LIGHT_FLASH_MODE_AUTO;
1896 return CAM_ERR_NONE;
1898 cam_err_t set_ae_flash_mode(int fd, cam_flash_mode_t mode)
1900 advci_ae_flash_mode flash_mode;
1904 case CAM_LIGHT_FLASH_MODE_AUTO:
1905 flash_mode = advci_ae_flash_mode_auto;
1907 case CAM_LIGHT_FLASH_MODE_OFF:
1908 flash_mode = advci_ae_flash_mode_off;
1910 case CAM_LIGHT_FLASH_MODE_ON:
1911 flash_mode = advci_ae_flash_mode_on;
1914 flash_mode = advci_ae_flash_mode_auto;
1918 mfldadvci->AeSetFlashMode(flash_mode);
1920 return CAM_ERR_NONE;
1924 cam_err_t get_awb_manual_color_temperature(int fd, int *ctemp)
1926 mfldadvci->AwbGetManualColorTemperature(ctemp);
1927 return CAM_ERR_NONE;
1930 void get_awb_matrix(int fd, int msqWbGain[3],
1931 int msqCcMtrx[9], unsigned short *shift)
1933 //int msqWbGain[3]; /* White balance Gain [0]:R [1]:G [2]:B */
1934 //int msqCcMtrx[9]; /* Color adjustment Matrix */
1935 mfldadvci->Awbmatrix(msqWbGain, msqCcMtrx, shift);
1938 struct sh_css_grid_info_maker_note {
1939 /* 3A statistics grid: */
1940 unsigned int s3a_width;
1941 unsigned int s3a_height;
1942 unsigned int s3a_bqs_per_grid_cell;
1944 unsigned int dis_width; /* also used for vertical projections */
1945 unsigned int dis_height; /* also used for horizontal projections */
1946 unsigned int dis_bqs_per_grid_cell;
1947 unsigned int dis_hor_coef_num;
1948 unsigned int dis_ver_coef_num;
1951 void get_grid_info(int fd, unsigned * width, unsigned * height)
1953 struct sh_css_grid_info_maker_note grid;
1955 mfldadvci->GetGridInfo(&grid);
1956 *width = grid.s3a_width;
1957 *height = grid.s3a_height;