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>
22 #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__);
103 void (*dis_calc_still)(vector,frame_number);
108 lib_3a_do_redeye_removal (ia_frame *ia_frame)
110 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
111 ia_redeye_correct(ia_frame);
115 lib_3a_still_compose (ia_frame *com_buf,
118 struct atomisp_dis_vector vectors[])
120 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
121 ia_dis_still_compose(com_buf, bufs, frame_dis, vectors);
126 lib_3a_AeSetFlickerMode(ia_3a_ae_flicker_mode mode)
128 cam_lib_3a_dbg("%s:%d mode:%d\n", __func__, __LINE__,mode);
129 ci_adv_ae_set_flicker_mode(mode);
133 lib_3a_AeGetFlickerMode(ia_3a_ae_flicker_mode *mode)
135 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
136 *mode= ia_3a_ae_get_flicker_mode();
140 lib_3a_AeSetExposureProgram(ia_3a_ae_exposure_program program)
142 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
143 ci_adv_ae_set_exposure_program(program);
147 lib_3a_AeGetExposureProgram(ia_3a_ae_exposure_program *program)
149 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
150 ci_adv_ae_get_exposure_program(program);
154 lib_3a_AfSetMode(ia_3a_af_mode mode)
156 cam_lib_3a_dbg("%s:%d mode:%d\n", __func__, __LINE__,mode);
157 ci_adv_af_set_mode(mode);
161 lib_3a_AfGetMode(ia_3a_af_mode *mode)
163 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
164 *mode = ia_3a_af_get_focus_mode();
168 lib_3a_AfSetRange(ia_3a_af_range range)
170 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
171 ci_adv_af_set_range(range);
175 lib_3a_AfGetRange(ia_3a_af_range *range)
177 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
178 *range = ia_3a_af_get_focus_range();
182 lib_3a_AwbSetMode(ia_3a_awb_mode mode)
184 cam_lib_3a_dbg("%s:%d mode:%d\n" , __func__, __LINE__,mode);
185 ci_adv_awb_set_mode(mode);
189 lib_3a_AwbGetMode(ia_3a_awb_mode *mode)
191 *mode = ia_3a_awb_get_mode();
195 lib_3a_AwbSetLightSource(ia_3a_awb_light_source ls)
197 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
198 ci_adv_awb_set_light_source(ls);
202 lib_3a_AwbGetLightSource(ia_3a_awb_light_source *ls)
204 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
205 *ls = ia_3a_awb_get_light_source();
209 lib_3a_int_int (int i)
211 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
212 return ci_adv_Success;
218 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
219 return ci_adv_Success;
223 lib_3a_isp_set_fd (int fd, const char *sensor_id)
228 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
229 if (ci_adv_init(sensor_id, fd, NULL) == 0) {
230 sensor_type = SENSOR_TYPE_RAW;
232 sensor_type = SENSOR_TYPE_SOC;
235 if (sensor_type == SENSOR_TYPE_RAW) {
236 cam_lib_3a_dbg("SENSOR_TYPE_RAW");
237 ci_adv_awb_enable(TRUE);
238 ci_adv_awb_lock(FALSE);
240 ci_adv_ae_enable(TRUE);
241 ci_adv_ae_lock(FALSE);
243 ci_adv_af_enable(TRUE);
244 ci_adv_af_lock(FALSE);
252 ci_adv_ae_set_window(&window);
254 ci_adv_ae_set_exposure_program(ia_3a_ae_exposure_program_auto);
255 ci_adv_ae_set_mode(ia_3a_ae_mode_auto);
256 ci_adv_af_set_range (ia_3a_af_range_full);
257 ci_adv_awb_set_mode(ia_3a_awb_mode_auto);
258 ci_adv_af_set_mode(ia_3a_af_mode_auto);
259 ci_adv_af_set_metering_mode (ia_3a_af_metering_mode_auto);
267 lib_3a_switch_mode (ia_3a_isp_mode mode, float frame_rate)
269 cam_lib_3a_dbg("%s:%d mode:%d frame_rate:%f\n", __func__, __LINE__, mode,frame_rate);
270 ci_adv_configure(mode, frame_rate);
273 static ci_adv_Err lib_3a_AeGetWindowsNum(int *num)
275 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
276 return ci_adv_Success;
279 static void lib_3a_AwbVersion(int * major, int * minor)
281 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
282 ci_adv_awb_version(major,minor);
285 static void lib_3a_AeVersion(int * major, int * minor)
287 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
288 ci_adv_ae_version(major,minor);
291 static void lib_3a_AfVersion(int * major, int * minor)
293 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
294 ci_adv_af_version(major,minor);
297 static void lib_3a_AfGetStillAfStatus(ia_3a_af_status *status)
299 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
300 *status = ci_adv_af_get_status();
303 static void lib_3a_RerVersion(int * major, int * minor)
305 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
309 static ci_adv_Err lib_3a_AeGetManualShutter(int *time)
311 /* TODO time is float */
312 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
313 ci_adv_ae_set_manual_shutter((float)*time);
314 return ci_adv_Success;
317 static void lib_3a_Awbdata(unsigned * num_p, unsigned * avg_r, unsigned * avg_gr,
318 unsigned * avg_b, unsigned * avg_gb)
320 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
324 static void lib_3a_AeGetManualAperture(int *aperture)
326 // TODO returns float
327 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
328 *aperture = (int)ia_3a_ae_get_manual_aperture();
331 static void lib_3a_AeGetFlashMode(ia_3a_ae_flash_mode *mode)
333 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
334 *mode= ia_3a_ae_get_flash_mode();
337 static void lib_3a_AeSetFlashMode(ia_3a_ae_flash_mode mode)
339 cam_lib_3a_dbg("%s:%d mode:%d \n", __func__, __LINE__, mode);
340 ci_adv_ae_set_flash_mode(mode);
343 static void lib_3a_AwbGetManualColorTemperature(int *ctemp)
345 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
346 *ctemp = ia_3a_awb_get_manual_color_temperature();
350 lib_3a_Awbmatrix(int msqWbGain[3], int msqCcMtrx[9], unsigned short * shift)
352 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
355 static void lib_3a_GetGridInfo(void * grid_info)
357 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
361 lib_3a_AeSetMeteringMode(ia_3a_ae_metering_mode mode)
363 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
364 ci_adv_ae_set_metering_mode(mode);
368 lib_3a_AeGetMeteringMode(ia_3a_ae_metering_mode *mode)
370 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
371 *mode = ia_3a_ae_get_metering_mode();
375 lib_3a_AfSetMeteringMode(ia_3a_af_metering_mode mode)
377 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
378 ci_adv_ae_set_metering_mode(mode);
382 lib_3a_AfGetMeteringMode(ia_3a_af_metering_mode *mode)
384 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
385 ci_adv_ae_get_metering_mode(mode);
389 lib_3a_Ae_Af_GetWindow(ia_3a_window *window)
391 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
392 ia_3a_ae_get_window(window);
396 lib_3a_Ae_Af_SetWindow( ia_3a_window *window)
398 cam_lib_3a_dbg("%s:window....%d:%d:%d:%d:%d\n",
399 __func__, window->x_left,window->x_right,
400 window->y_top , window->y_bottom, window->weight);
402 ci_adv_ae_set_window(window);
403 ci_adv_af_set_windows(1, window);
409 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
416 cam_lib_3a_dbg ("%s:%d\n", __func__, __LINE__);
421 lib_3a_ae_calc_for_flash( )
423 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
424 ci_adv_process_for_flash(ia_3a_flash_stage_none);
427 lib_3a_calc_without_flash( )
429 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
430 ci_adv_process_for_flash(ia_3a_flash_stage_pre);
434 lib_3a_calc_with_flash( )
436 cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
437 ci_adv_process_for_flash(ia_3a_flash_stage_main);
441 lib_3a_AeAfAwb_process( struct timeval *frame_timestamp)
444 //cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
445 status = ci_adv_process_frame(TRUE,frame_timestamp);
448 lib_3a_get_statistics( )
450 // cam_lib_3a_dbg("%s:%d\n", __func__, __LINE__);
451 ci_adv_3a_stat cur_stat;
452 ci_adv_get_3a_stat (&cur_stat);
453 /* cam_lib_3a_dbg("%8.3f, %8.3f, %8.3f, %8.3f, %8d, %8.3f, %8.3f, %8.3f\n",
466 lib_3a_awb_apply_results( )
470 lib_3a_AwbSetImageEffect(ia_3a_image_effect effect)
472 cam_lib_3a_dbg("%s:%d effect %d\n", __func__, __LINE__, effect);
474 ci_adv_isp_set_image_effect(effect);
478 lib_3a_AwbGetImageEffect(ia_3a_image_effect *effect)
480 *effect = ci_adv_isp_get_image_effect();
481 cam_lib_3a_dbg("%s:%d effect: %d\n", __func__, __LINE__);
486 lib_3a_link_functions_init (GstV4l2MFLDAdvCI *mfldadvci)
489 mfldadvci->initialized = 0;
490 mfldadvci->init = lib_3a_init;
491 mfldadvci->uninit = lib_3a_uninit;
492 mfldadvci->isp_set_fd = lib_3a_isp_set_fd;
493 mfldadvci->mode_spec_init = lib_3a_int_void; /* TODO */
494 mfldadvci->switch_mode = lib_3a_switch_mode;
496 mfldadvci->AeAfAwb_process = lib_3a_AeAfAwb_process;
497 mfldadvci->get_statistics = lib_3a_get_statistics; /* TODO atomisp_dis_statistics ? */
499 mfldadvci->ae_calc_for_flash = lib_3a_ae_calc_for_flash;
500 mfldadvci->ae_calc_without_flash = lib_3a_calc_without_flash;
501 mfldadvci->ae_calc_with_flash = lib_3a_calc_with_flash;
502 mfldadvci->ae_apply_results = lib_3a_ae;
504 mfldadvci->af_start = lib_3a_af_start;
505 mfldadvci->af_stop = lib_3a_af_stop;
506 mfldadvci->af_is_complete = lib_3a_int_void;
507 mfldadvci->awb_apply_results = lib_3a_awb_apply_results;
508 mfldadvci->awb_calc_flash = lib_3a_void;
510 mfldadvci->dis_read_statistics = lib_3a_void;
511 mfldadvci->update_dis_results = lib_3a_void;
512 mfldadvci->dis_process = lib_3a_dis_process;
513 mfldadvci->dis_calc_still = lib_3a_dis_calc_still;
515 mfldadvci->do_redeye_removal = lib_3a_do_redeye_removal;
516 mfldadvci->still_compose = lib_3a_still_compose;
517 mfldadvci->load_gdc_table = lib_3a_void;
519 mfldadvci->AeSetBias = lib_3a_int_int;
520 mfldadvci->AeGetBias = lib_3a_intp;
521 mfldadvci->AeSetFlickerMode = lib_3a_AeSetFlickerMode;
522 mfldadvci->AeGetFlickerMode = lib_3a_AeGetFlickerMode;
523 mfldadvci->AeSetExposureProgram = lib_3a_AeSetExposureProgram;
524 mfldadvci->AeGetExposureProgram = lib_3a_AeGetExposureProgram;
525 mfldadvci->AeSetMeteringMode = lib_3a_AeSetMeteringMode;
526 mfldadvci->AeGetMeteringMode = lib_3a_AeGetMeteringMode;
527 mfldadvci->AeGetWindow = lib_3a_Ae_Af_GetWindow;
528 mfldadvci->AeSetWindow = lib_3a_Ae_Af_SetWindow;
531 mfldadvci->AfSetMode = lib_3a_AfSetMode;
532 mfldadvci->AfGetMode = lib_3a_AfGetMode;
533 mfldadvci->AfSetRange = lib_3a_AfSetRange;
534 mfldadvci->AfGetRange = lib_3a_AfGetRange;
535 mfldadvci->AfSetMeteringMode = lib_3a_AfSetMeteringMode;
536 mfldadvci->AfGetMeteringMode = lib_3a_AfGetMeteringMode;
537 mfldadvci->AfGetWindow = lib_3a_Ae_Af_GetWindow;
538 mfldadvci->AfSetWindow = lib_3a_Ae_Af_SetWindow;
540 mfldadvci->AwbSetMode = lib_3a_AwbSetMode;
541 mfldadvci->AwbGetMode = lib_3a_AwbGetMode;
542 mfldadvci->AwbSetLightSource = lib_3a_AwbSetLightSource;
543 mfldadvci->AwbGetLightSource = lib_3a_AwbGetLightSource;
544 mfldadvci->AwbSetImageEffect = lib_3a_AwbSetImageEffect;
545 mfldadvci->AwbGetImageEffect = lib_3a_AwbGetImageEffect;
547 mfldadvci->AeGetWindowsNum = lib_3a_AeGetWindowsNum;
548 mfldadvci->AwbVersion = lib_3a_AwbVersion;
549 mfldadvci->AeVersion = lib_3a_AeVersion;
550 mfldadvci->AfVersion = lib_3a_AfVersion;
551 mfldadvci->AfGetStillAfStatus = lib_3a_AfGetStillAfStatus;
552 mfldadvci->RerVersion = lib_3a_RerVersion;
553 mfldadvci->AeGetManualShutter = lib_3a_AeGetManualShutter;
554 mfldadvci->Awbdata = lib_3a_Awbdata;
555 mfldadvci->AeGetManualAperture = lib_3a_AeGetManualAperture;
556 mfldadvci->AeSetFlashMode = lib_3a_AeSetFlashMode;
557 mfldadvci->AeGetFlashMode = lib_3a_AeGetFlashMode;
558 mfldadvci->AwbGetManualColorTemperature = lib_3a_AwbGetManualColorTemperature;
559 mfldadvci->Awbmatrix = lib_3a_Awbmatrix;
560 mfldadvci->GetGridInfo = lib_3a_GetGridInfo;