1 /* GStreamer MFLD ADVIC API
2 * Copyright (C) 2010 Intel Corporation <www.intel.com>
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.
20 #include "gstv4l2mfldadvci.h"
21 #include <linux/videodev2.h>
23 #include <sys/ioctl.h>
25 #include "ci_adv_pub.h"
27 void cam_lib_3a_dbg(const char *format, ...);
29 int __android_log_print(int prio, const char *tag, const char *fmt, ...)
34 /* for debug message and error message output
37 static bool use_3A_debug = FALSE;
40 cam_lib_3a_dbg (const char *format, ...)
44 va_start (ap, format);
45 vfprintf (stdout, format, ap);
60 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
65 lib_3a_int_void (void)
80 use_3A_debug= ((env = getenv ("LIBMFLDCAM_DEBUG")) && strstr (env, "verbose"));
81 cam_lib_3a_dbg("%s:%d", __func__, __LINE__);
87 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
92 lib_3a_dis_process (struct atomisp_dis_statistics *stats,
93 struct atomisp_dis_vector *motion_vector)
95 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
100 lib_3a_dis_calc_still (struct atomisp_dis_vector * vector, int frame_number)
102 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
107 lib_3a_do_redeye_removal (ia_frame *ia_frame)
109 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
113 lib_3a_still_compose (ia_frame *com_buf,
116 struct atomisp_dis_vector vectors[])
118 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
123 lib_3a_AeSetFlickerMode(ia_3a_ae_flicker_mode mode)
125 cam_lib_3a_dbg("%s:%d mode:%d\n", __func__, __LINE__,mode);
126 ci_adv_ae_set_flicker_mode(mode);
130 lib_3a_AeGetFlickerMode(ia_3a_ae_flicker_mode *mode)
132 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
133 *mode= ia_3a_ae_get_flicker_mode();
137 lib_3a_AeSetExposureProgram(ia_3a_ae_exposure_program program)
139 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
140 ci_adv_ae_set_exposure_program(program);
144 lib_3a_AeGetExposureProgram(ia_3a_ae_exposure_program *program)
146 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
147 ci_adv_ae_get_exposure_program(program);
151 lib_3a_AfSetMode(ia_3a_af_mode mode)
153 cam_lib_3a_dbg("%s:%d mode:%d\n", __func__, __LINE__,mode);
154 ci_adv_af_set_mode(mode);
158 lib_3a_AfGetMode(ia_3a_af_mode *mode)
160 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
161 *mode = ia_3a_af_get_focus_mode();
165 lib_3a_AfSetRange(ia_3a_af_range range)
167 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
168 ci_adv_af_set_range(range);
172 lib_3a_AfGetRange(ia_3a_af_range *range)
174 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
175 *range = ia_3a_af_get_focus_range();
179 lib_3a_AwbSetMode(ia_3a_awb_mode mode)
181 cam_lib_3a_dbg("%s:%d mode:%d\n" , __func__, __LINE__,mode);
182 ci_adv_awb_set_mode(mode);
186 lib_3a_AwbGetMode(ia_3a_awb_mode *mode)
188 *mode = ia_3a_awb_get_mode();
192 lib_3a_AwbSetLightSource(ia_3a_awb_light_source ls)
194 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
195 ci_adv_awb_set_light_source(ls);
199 lib_3a_AwbGetLightSource(ia_3a_awb_light_source *ls)
201 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
202 *ls = ia_3a_awb_get_light_source();
206 lib_3a_int_int (int i)
208 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
209 return ci_adv_Success;
215 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
216 return ci_adv_Success;
220 lib_3a_isp_set_fd (int fd, const char *sensor_id)
225 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
226 if (ci_adv_init(sensor_id, fd, NULL) == 0) {
227 sensor_type = SENSOR_TYPE_RAW;
229 sensor_type = SENSOR_TYPE_SOC;
232 if (sensor_type == SENSOR_TYPE_RAW) {
233 cam_lib_3a_dbg("SENSOR_TYPE_RAW");
234 ci_adv_awb_enable(TRUE);
235 ci_adv_awb_lock(FALSE);
237 ci_adv_ae_enable(TRUE);
238 ci_adv_ae_lock(FALSE);
240 ci_adv_af_enable(TRUE);
241 ci_adv_af_lock(FALSE);
249 ci_adv_ae_set_window(&window);
251 ci_adv_ae_set_exposure_program(ia_3a_ae_exposure_program_auto);
252 ci_adv_ae_set_mode(ia_3a_ae_mode_auto);
253 ci_adv_ae_set_metering_mode(ia_3a_ae_metering_mode_center);
254 ci_adv_af_set_range (ia_3a_af_range_full);
255 ci_adv_awb_set_mode(ia_3a_awb_mode_auto);
256 ci_adv_af_set_mode(ia_3a_af_mode_auto);
257 ci_adv_af_set_metering_mode (ia_3a_af_metering_mode_auto);
265 lib_3a_switch_mode (ia_3a_isp_mode mode, float frame_rate)
267 cam_lib_3a_dbg("%s:%d mode:%d frame_rate:%f\n", __func__, __LINE__, mode,frame_rate);
268 ci_adv_configure(mode, frame_rate);
271 static ci_adv_Err lib_3a_AeGetWindowsNum(int *num)
273 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
274 return ci_adv_Success;
277 static void lib_3a_AwbVersion(int * major, int * minor)
279 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
280 ci_adv_awb_version(major,minor);
283 static void lib_3a_AeVersion(int * major, int * minor)
285 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
286 ci_adv_ae_version(major,minor);
289 static void lib_3a_AfVersion(int * major, int * minor)
291 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
292 ci_adv_af_version(major,minor);
295 static void lib_3a_AfGetStillAfStatus(ia_3a_af_status *status)
297 *status = ci_adv_af_get_status();
300 static bool lib_3a_af_is_complete(void)
303 ia_3a_af_status status;
304 bool completed = FALSE;
306 lib_3a_AfGetStillAfStatus(&status);
308 if (status == ia_3a_af_status_error) {
309 cam_lib_3a_dbg("==== still AF failed \n");
312 else if (status == ia_3a_af_status_success) {
313 cam_lib_3a_dbg("==== still AF success");
315 } else if (status == ia_3a_af_status_cancelled) {
316 cam_lib_3a_dbg("==== still AF cancelled \n");
320 cam_lib_3a_dbg("==== still AF continue %d \n", status);
326 static void lib_3a_RerVersion(int * major, int * minor)
328 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
332 static ci_adv_Err lib_3a_AeGetManualShutter(int *time)
334 /* TODO time is float */
335 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
336 ci_adv_ae_set_manual_shutter((float)*time);
337 return ci_adv_Success;
340 static void lib_3a_Awbdata(unsigned * num_p, unsigned * avg_r, unsigned * avg_gr,
341 unsigned * avg_b, unsigned * avg_gb)
343 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
347 static void lib_3a_AeGetManualAperture(int *aperture)
349 // TODO returns float
350 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
351 *aperture = (int)ia_3a_ae_get_manual_aperture();
354 static void lib_3a_AeGetFlashMode(ia_3a_ae_flash_mode *mode)
356 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
357 *mode= ia_3a_ae_get_flash_mode();
360 static void lib_3a_AeSetFlashMode(ia_3a_ae_flash_mode mode)
362 cam_lib_3a_dbg("%s:%d mode:%d \n", __func__, __LINE__, mode);
363 ci_adv_ae_set_flash_mode(mode);
366 static void lib_3a_AwbGetManualColorTemperature(int *ctemp)
368 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
369 *ctemp = ia_3a_awb_get_manual_color_temperature();
373 lib_3a_Awbmatrix(int msqWbGain[3], int msqCcMtrx[9], unsigned short * shift)
375 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
378 static void lib_3a_GetGridInfo(void * grid_info)
380 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
384 lib_3a_AeSetMeteringMode(ia_3a_ae_metering_mode mode)
386 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
387 ci_adv_ae_set_metering_mode(mode);
391 lib_3a_AeGetMeteringMode(ia_3a_ae_metering_mode *mode)
393 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
394 *mode = ia_3a_ae_get_metering_mode();
398 lib_3a_AfSetMeteringMode(ia_3a_af_metering_mode mode)
400 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
401 ci_adv_af_set_metering_mode(mode);
405 lib_3a_AfGetMeteringMode(ia_3a_af_metering_mode *mode)
407 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
408 ci_adv_af_get_metering_mode(mode);
412 lib_3a_Ae_Af_GetWindow(ia_3a_window *window)
414 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
415 ia_3a_ae_get_window(window);
419 lib_3a_Ae_Af_SetWindow( ia_3a_window *window)
421 cam_lib_3a_dbg("%s:window....%d:%d:%d:%d:%d\n",
422 __func__, window->x_left,window->x_right,
423 window->y_top , window->y_bottom, window->weight);
425 ci_adv_ae_set_window(window);
426 ci_adv_af_set_windows(1, window);
432 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
439 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
444 lib_3a_ae_calc_for_flash( )
446 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
447 ci_adv_process_for_flash(ia_3a_flash_stage_none);
450 lib_3a_calc_without_flash( )
452 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
453 ci_adv_process_for_flash(ia_3a_flash_stage_pre);
457 lib_3a_calc_with_flash( )
459 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
460 ci_adv_process_for_flash(ia_3a_flash_stage_main);
464 lib_3a_AeAfAwb_process( struct timeval *frame_timestamp)
467 //cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
468 status = ci_adv_process_frame(TRUE,frame_timestamp);
471 lib_3a_get_statistics( )
473 // cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
474 ci_adv_3a_stat cur_stat;
475 ci_adv_get_3a_stat (&cur_stat);
476 /* cam_lib_3a_dbg("%8.3f, %8.3f, %8.3f, %8.3f, %8d, %8.3f, %8.3f, %8.3f\n",
489 lib_3a_awb_apply_results( )
493 lib_3a_AwbSetImageEffect(ia_3a_image_effect effect)
495 cam_lib_3a_dbg("%s:%d effect %d\n", __func__, __LINE__, effect);
497 ci_adv_isp_set_image_effect(effect);
501 lib_3a_AwbGetImageEffect(ia_3a_image_effect *effect)
503 *effect = ci_adv_isp_get_image_effect();
504 cam_lib_3a_dbg("%s:%d effect: %d\n", __func__, __LINE__, *effect);
509 lib_ae_is_flash_needed(bool *useflash)
511 ci_adv_ae_is_flash_necessary(useflash);
512 cam_lib_3a_dbg("%s:%d useflash: %d\n", __func__, __LINE__, *useflash);
517 lib_3a_AeSetManualIso(int sensitivity)
522 cam_lib_3a_dbg("error in get log2 math computation in line %d; sensitivity: %d\n", __LINE__, sensitivity);
523 return ci_adv_InvalidArgument;
526 sv = log10((float)sensitivity / 3.125) / log10(2.0);
527 ci_adv_err ret = ci_adv_ae_set_manual_iso(sv);
528 if(ci_adv_success != ret)
531 cam_lib_3a_dbg(" *** manual set iso in EV: %f\n", sv);
533 return ci_adv_success;
537 lib_3a_AeGetManualIso(int *sensitivity)
540 ci_adv_err ret = ci_adv_ae_get_manual_iso(&sv);
541 if(ci_adv_success != ret)
543 *sensitivity = (int)(3.125 * pow(2, sv));
545 return ci_adv_success;
549 lib_3a_GetMakerNote(ia_3a_mknote_mode mknMode, ia_3a_mknote *note)
551 note = ci_adv_get_maker_note(mknMode);
555 lib_3a_AddMakerNoteRecord(ia_3a_mknote_field_type mkn_format_id,
556 ia_3a_mknote_field_name mkn_name_id,
558 unsigned short record_size)
560 ci_adv_add_maker_note_record(mkn_format_id, mkn_name_id, record, record_size);
564 lib_3a_PutMakerNote(ia_3a_mknote *mknData)
568 ci_adv_put_maker_note(mknData);
573 lib_3a_ResetMakerNote(void)
575 ci_adv_reset_maker_note();
580 lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci)
583 mfldadvci->initialized = 0;
584 mfldadvci->init = lib_3a_init;
585 mfldadvci->uninit = lib_3a_uninit;
586 mfldadvci->isp_set_fd = lib_3a_isp_set_fd;
587 mfldadvci->mode_spec_init = lib_3a_int_void; /* TODO */
588 mfldadvci->switch_mode = lib_3a_switch_mode;
590 mfldadvci->AeAfAwb_process = lib_3a_AeAfAwb_process;
591 mfldadvci->get_statistics = lib_3a_get_statistics; /* TODO atomisp_dis_statistics ? */
593 mfldadvci->ae_calc_for_flash = lib_3a_ae_calc_for_flash;
594 mfldadvci->ae_calc_without_flash = lib_3a_calc_without_flash;
595 mfldadvci->ae_calc_with_flash = lib_3a_calc_with_flash;
597 mfldadvci->ae_is_flash_needed = lib_ae_is_flash_needed;
599 mfldadvci->ae_apply_results = lib_3a_ae;
601 mfldadvci->af_start = lib_3a_af_start;
602 mfldadvci->af_stop = lib_3a_af_stop;
603 mfldadvci->af_is_complete = lib_3a_af_is_complete;
604 mfldadvci->awb_apply_results = lib_3a_awb_apply_results;
605 mfldadvci->awb_calc_flash = lib_3a_void;
607 mfldadvci->dis_read_statistics = lib_3a_void;
608 mfldadvci->update_dis_results = lib_3a_void;
609 mfldadvci->dis_process = lib_3a_dis_process;
610 mfldadvci->dis_calc_still = lib_3a_dis_calc_still;
612 mfldadvci->do_redeye_removal = lib_3a_do_redeye_removal;
613 mfldadvci->still_compose = lib_3a_still_compose;
614 mfldadvci->load_gdc_table = lib_3a_void;
616 mfldadvci->AeSetBias = lib_3a_int_int;
617 mfldadvci->AeGetBias = lib_3a_intp;
618 mfldadvci->AeSetFlickerMode = lib_3a_AeSetFlickerMode;
619 mfldadvci->AeGetFlickerMode = lib_3a_AeGetFlickerMode;
620 mfldadvci->AeSetExposureProgram = lib_3a_AeSetExposureProgram;
621 mfldadvci->AeGetExposureProgram = lib_3a_AeGetExposureProgram;
622 mfldadvci->AeSetMeteringMode = lib_3a_AeSetMeteringMode;
623 mfldadvci->AeGetMeteringMode = lib_3a_AeGetMeteringMode;
624 mfldadvci->AeGetWindow = lib_3a_Ae_Af_GetWindow;
625 mfldadvci->AeSetWindow = lib_3a_Ae_Af_SetWindow;
626 mfldadvci->AeSetIso = lib_3a_AeSetManualIso;
627 mfldadvci->AeGetIso = lib_3a_AeGetManualIso;
630 mfldadvci->AfSetMode = lib_3a_AfSetMode;
631 mfldadvci->AfGetMode = lib_3a_AfGetMode;
632 mfldadvci->AfSetRange = lib_3a_AfSetRange;
633 mfldadvci->AfGetRange = lib_3a_AfGetRange;
634 mfldadvci->AfSetMeteringMode = lib_3a_AfSetMeteringMode;
635 mfldadvci->AfGetMeteringMode = lib_3a_AfGetMeteringMode;
636 mfldadvci->AfGetWindow = lib_3a_Ae_Af_GetWindow;
637 mfldadvci->AfSetWindow = lib_3a_Ae_Af_SetWindow;
639 mfldadvci->AwbSetMode = lib_3a_AwbSetMode;
640 mfldadvci->AwbGetMode = lib_3a_AwbGetMode;
641 mfldadvci->AwbSetLightSource = lib_3a_AwbSetLightSource;
642 mfldadvci->AwbGetLightSource = lib_3a_AwbGetLightSource;
643 mfldadvci->AwbSetImageEffect = lib_3a_AwbSetImageEffect;
644 mfldadvci->AwbGetImageEffect = lib_3a_AwbGetImageEffect;
646 mfldadvci->AeGetWindowsNum = lib_3a_AeGetWindowsNum;
647 mfldadvci->AwbVersion = lib_3a_AwbVersion;
648 mfldadvci->AeVersion = lib_3a_AeVersion;
649 mfldadvci->AfVersion = lib_3a_AfVersion;
650 mfldadvci->AfGetStillAfStatus = lib_3a_AfGetStillAfStatus;
651 mfldadvci->RerVersion = lib_3a_RerVersion;
652 mfldadvci->AeGetManualShutter = lib_3a_AeGetManualShutter;
653 mfldadvci->Awbdata = lib_3a_Awbdata;
654 mfldadvci->AeGetManualAperture = lib_3a_AeGetManualAperture;
655 mfldadvci->AeSetFlashMode = lib_3a_AeSetFlashMode;
656 mfldadvci->AeGetFlashMode = lib_3a_AeGetFlashMode;
657 mfldadvci->AwbGetManualColorTemperature = lib_3a_AwbGetManualColorTemperature;
658 mfldadvci->Awbmatrix = lib_3a_Awbmatrix;
659 mfldadvci->GetGridInfo = lib_3a_GetGridInfo;
660 mfldadvci->GetMakerNote = lib_3a_GetMakerNote;
661 mfldadvci->AddMakerNoteRecord = lib_3a_AddMakerNoteRecord;
662 mfldadvci->PutMakerNote = lib_3a_PutMakerNote;
663 mfldadvci->ResetMakerNote = lib_3a_ResetMakerNote;