xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkisp_demo/demo/sample/sample_af_module.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Copyright (c) 2019 Rockchip Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 #include "sample_comm.h"
19 
sample_af_usage()20 static void sample_af_usage()
21 {
22     printf("\n\nUsage : \n");
23     printf("\t 0) AF:         setFocusMode-OP_AUTO.\n");
24     printf("\t 1) AF:         setFocusMode-OP_MANUAL.\n");
25     printf("\t 2) AF:         setFocusMode-OP_SEMI_AUTO.\n");
26     printf("\t 3) AF:         getFocusMode.\n");
27     printf("\t 4) AF:         setFocusWin.\n");
28     printf("\t 5) AF:         setFocusWin to defalut.\n");
29     printf("\t 6) AF:         getFocusWin.\n");
30     printf("\t 7) AF:         lockFocus.\n");
31     printf("\t 8) AF:         unlockFocus.\n");
32     printf("\t 9) AF:         oneshotFocus.\n");
33     printf("\t a) AF:         manualTrigerFocus.\n");
34     printf("\t b) AF:         trackingFocus.\n");
35     printf("\t c) AF:         startZoomCalib.\n");
36     printf("\t d) AF:         resetZoom.\n");
37     printf("\t e) AF:         setAngleZ.\n");
38     printf("\t f) AF:         + ZoomPosition.\n");
39     printf("\t g) AF:         - ZoomPosition.\n");
40     printf("\t i) AF:         + FocusPosition.\n");
41     printf("\t j) AF:         - FocusPosition.\n");
42     printf("\t k) AF:         getSearchResult.\n");
43     printf("\t l) AF:         setFocusMeasCfg sync.\n");
44     printf("\t m) AF:         setFocusMeasCfg async.\n");
45     printf("\t n) AF:         getAfAttrib.\n");
46     printf("\t q) AF:         return to main sample screen.\n");
47 
48     printf("\n");
49     printf("\t please press the key: ");
50 
51     return;
52 }
53 
sample_set_focus_automode(const rk_aiq_sys_ctx_t * ctx)54 void sample_set_focus_automode(const rk_aiq_sys_ctx_t* ctx)
55 {
56     rk_aiq_uapi2_setFocusMode(ctx, OP_AUTO);
57     printf("setFocusMode auto\n");
58 }
59 
sample_set_focus_manualmode(const rk_aiq_sys_ctx_t * ctx)60 void sample_set_focus_manualmode(const rk_aiq_sys_ctx_t* ctx)
61 {
62     rk_aiq_uapi2_setFocusMode(ctx, OP_MANUAL);
63     printf("setFocusMode manual\n");
64 }
65 
sample_set_focus_semiautomode(const rk_aiq_sys_ctx_t * ctx)66 void sample_set_focus_semiautomode(const rk_aiq_sys_ctx_t* ctx)
67 {
68     rk_aiq_uapi2_setFocusMode(ctx, OP_SEMI_AUTO);
69     printf("setFocusMode semi-auto\n");
70 }
71 
sample_get_focus_mode(const rk_aiq_sys_ctx_t * ctx)72 void sample_get_focus_mode(const rk_aiq_sys_ctx_t* ctx)
73 {
74     opMode_t mode;
75 
76     rk_aiq_uapi2_getFocusMode(ctx, &mode);
77     if (mode == OP_AUTO) {
78         printf("getFocusMode auto\n");
79     } else if (mode == OP_MANUAL) {
80         printf("getFocusMode manual\n");
81     } else if (mode == OP_SEMI_AUTO) {
82         printf("getFocusMode semi-auto\n");
83     } else {
84         printf("getFocusMode unknow mode %d\n", mode);
85     }
86 }
87 
sample_set_focus_win(const rk_aiq_sys_ctx_t * ctx)88 void sample_set_focus_win(const rk_aiq_sys_ctx_t* ctx)
89 {
90     paRect_t rect;
91 
92     rect.x = 4;
93     rect.y = 4;
94     rect.w = 800;
95     rect.h = 600;
96     rk_aiq_uapi2_setFocusWin(ctx, &rect);
97     printf("setFocusWin rect: x %d, y %d, w %d, h %d\n", rect.x, rect.y, rect.w, rect.h);
98 }
99 
sample_set_focus_defwin(const rk_aiq_sys_ctx_t * ctx)100 void sample_set_focus_defwin(const rk_aiq_sys_ctx_t* ctx)
101 {
102     paRect_t rect;
103 
104     memset(&rect, 0, sizeof(rect));
105     rk_aiq_uapi2_setFocusWin(ctx, &rect);
106     printf("setFocusWin rect to default value\n");
107 }
108 
sample_get_focus_win(const rk_aiq_sys_ctx_t * ctx)109 void sample_get_focus_win(const rk_aiq_sys_ctx_t* ctx)
110 {
111     paRect_t rect;
112 
113     memset(&rect, 0, sizeof(rect));
114     rk_aiq_uapi2_getFocusWin(ctx, &rect);
115     printf("getFocusWin rect: x %d, y %d, w %d, h %d\n", rect.x, rect.y, rect.w, rect.h);
116 }
117 
sample_lock_focus(const rk_aiq_sys_ctx_t * ctx)118 void sample_lock_focus(const rk_aiq_sys_ctx_t* ctx)
119 {
120     rk_aiq_uapi2_lockFocus(ctx);
121     printf("lockFocus\n");
122 }
123 
sample_unlock_focus(const rk_aiq_sys_ctx_t * ctx)124 void sample_unlock_focus(const rk_aiq_sys_ctx_t* ctx)
125 {
126     rk_aiq_uapi2_unlockFocus(ctx);
127     printf("unlockFocus\n");
128 }
129 
sample_oneshot_focus(const rk_aiq_sys_ctx_t * ctx)130 void sample_oneshot_focus(const rk_aiq_sys_ctx_t* ctx)
131 {
132     rk_aiq_uapi2_oneshotFocus(ctx);
133     printf("oneshotFocus\n");
134 }
135 
sample_manual_triger_focus(const rk_aiq_sys_ctx_t * ctx)136 void sample_manual_triger_focus(const rk_aiq_sys_ctx_t* ctx)
137 {
138     rk_aiq_uapi2_manualTrigerFocus(ctx);
139     printf("manualTrigerFocus\n");
140 }
141 
sample_tracking_focus(const rk_aiq_sys_ctx_t * ctx)142 void sample_tracking_focus(const rk_aiq_sys_ctx_t* ctx)
143 {
144     rk_aiq_uapi2_trackingFocus(ctx);
145     printf("trackingFocus\n");
146 }
147 
sample_start_zoomcalib(const rk_aiq_sys_ctx_t * ctx)148 void sample_start_zoomcalib(const rk_aiq_sys_ctx_t* ctx)
149 {
150     rk_aiq_uapi2_startZoomCalib(ctx);
151     printf("startZoomCalib\n");
152 }
153 
sample_reset_zoom(const rk_aiq_sys_ctx_t * ctx)154 void sample_reset_zoom(const rk_aiq_sys_ctx_t* ctx)
155 {
156     rk_aiq_uapi2_resetZoom(ctx);
157     printf("resetZoom\n");
158 }
159 
sample_set_anglez(const rk_aiq_sys_ctx_t * ctx)160 void sample_set_anglez(const rk_aiq_sys_ctx_t* ctx)
161 {
162     float angleZ = 90;
163     rk_aiq_uapi2_setAngleZ(ctx, angleZ);
164     printf("setAngleZ %f degree\n", angleZ);
165 }
166 
167 
168 
sample_add_zoom_position(const rk_aiq_sys_ctx_t * ctx)169 void sample_add_zoom_position(const rk_aiq_sys_ctx_t* ctx)
170 {
171     rk_aiq_af_zoomrange range;
172     int code;
173 
174     rk_aiq_uapi2_getZoomRange(ctx, &range);
175     printf("zoom.min_pos %d, zoom.max_pos %d\n", range.min_pos, range.max_pos);
176 
177     rk_aiq_uapi2_getOpZoomPosition(ctx, &code);
178     printf("getOpZoomPosition code %d\n", code);
179 
180     code += 20;
181     if (code > range.max_pos)
182         code = range.max_pos;
183     rk_aiq_uapi2_setOpZoomPosition(ctx, code);
184     rk_aiq_uapi2_endOpZoomChange(ctx);
185     printf("setOpZoomPosition %d\n", code);
186 }
187 
sample_sub_zoom_position(const rk_aiq_sys_ctx_t * ctx)188 void sample_sub_zoom_position(const rk_aiq_sys_ctx_t* ctx)
189 {
190     rk_aiq_af_zoomrange range;
191     int code;
192 
193     rk_aiq_uapi2_getZoomRange(ctx, &range);
194     printf("zoom.min_pos %d, zoom.max_pos %d\n", range.min_pos, range.max_pos);
195 
196     rk_aiq_uapi2_getOpZoomPosition(ctx, &code);
197     printf("getOpZoomPosition code %d\n", code);
198 
199     code -= 20;
200     if (code < range.min_pos)
201         code = range.min_pos;
202     rk_aiq_uapi2_setOpZoomPosition(ctx, code);
203     rk_aiq_uapi2_endOpZoomChange(ctx);
204     printf("setOpZoomPosition %d\n", code);
205 }
206 
sample_add_focus_position(const rk_aiq_sys_ctx_t * ctx)207 void sample_add_focus_position(const rk_aiq_sys_ctx_t* ctx)
208 {
209     rk_aiq_af_focusrange range;
210     short code;
211 
212     rk_aiq_uapi2_getFocusRange(ctx, &range);
213     printf("focus.min_pos %d, focus.max_pos %d\n", range.min_pos, range.max_pos);
214 
215     rk_aiq_uapi2_getFocusPosition(ctx, &code);
216 
217     code++;
218     if (code > range.max_pos)
219         code = range.max_pos;
220     rk_aiq_uapi2_setFocusPosition(ctx, code);
221     printf("set Focus Code %d\n", code);
222 }
223 
sample_sub_focus_position(const rk_aiq_sys_ctx_t * ctx)224 void sample_sub_focus_position(const rk_aiq_sys_ctx_t* ctx)
225 {
226     rk_aiq_af_focusrange range;
227     short code;
228 
229     rk_aiq_uapi2_getFocusRange(ctx, &range);
230     printf("focus.min_pos %d, focus.max_pos %d\n", range.min_pos, range.max_pos);
231 
232     rk_aiq_uapi2_getFocusPosition(ctx, &code);
233 
234     code--;
235     if (code < range.min_pos)
236         code = range.min_pos;
237     rk_aiq_uapi2_setFocusPosition(ctx, code);
238     printf("set Focus Code %d\n", code);
239 }
240 
sample_get_af_search_result(const rk_aiq_sys_ctx_t * ctx)241 void sample_get_af_search_result(const rk_aiq_sys_ctx_t* ctx)
242 {
243     rk_aiq_af_result_t result;
244     rk_aiq_uapi2_getSearchResult(ctx, &result);
245     printf("get search result, stat: %d, final_pos: %d\n", result.stat, result.final_pos);
246 }
247 
sample_set_af_manual_meascfg(const rk_aiq_sys_ctx_t * ctx,rk_aiq_uapi_mode_sync_e sync_mode)248 void sample_set_af_manual_meascfg(const rk_aiq_sys_ctx_t* ctx, rk_aiq_uapi_mode_sync_e sync_mode)
249 {
250     rk_aiq_af_attrib_t attr;
251     uint16_t gamma_y[RKAIQ_RAWAF_GAMMA_NUM] =
252         {0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023};
253 
254     rk_aiq_user_api2_af_GetAttrib(ctx, &attr);
255     attr.AfMode = RKAIQ_AF_MODE_FIXED;
256     if (CHECK_ISP_HW_V20() || CHECK_ISP_HW_V21()) {
257         memset(&attr.manual_meascfg, 0, sizeof(attr.manual_meascfg));
258         attr.manual_meascfg.contrast_af_en = 1;
259         attr.manual_meascfg.rawaf_sel = 0; // normal = 0; hdr = 1
260 
261         attr.manual_meascfg.window_num = 2;
262         attr.manual_meascfg.wina_h_offs = 2;
263         attr.manual_meascfg.wina_v_offs = 2;
264         attr.manual_meascfg.wina_h_size = 2580;
265         attr.manual_meascfg.wina_v_size = 1935;
266 
267         attr.manual_meascfg.winb_h_offs = 500;
268         attr.manual_meascfg.winb_v_offs = 600;
269         attr.manual_meascfg.winb_h_size = 300;
270         attr.manual_meascfg.winb_v_size = 300;
271 
272         attr.manual_meascfg.gamma_flt_en = 1;
273         memcpy(attr.manual_meascfg.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
274 
275         attr.manual_meascfg.gaus_flt_en = 1;
276         attr.manual_meascfg.gaus_h0 = 0x20;
277         attr.manual_meascfg.gaus_h1 = 0x10;
278         attr.manual_meascfg.gaus_h2 = 0x08;
279 
280         attr.manual_meascfg.afm_thres = 4;
281 
282         attr.manual_meascfg.lum_var_shift[0] = 0;
283         attr.manual_meascfg.afm_var_shift[0] = 0;
284         attr.manual_meascfg.lum_var_shift[1] = 4;
285         attr.manual_meascfg.afm_var_shift[1] = 4;
286 
287         attr.manual_meascfg.sp_meas.enable = true;
288         attr.manual_meascfg.sp_meas.ldg_xl = 10;
289         attr.manual_meascfg.sp_meas.ldg_yl = 28;
290         attr.manual_meascfg.sp_meas.ldg_kl = (255-28)*256/45;
291         attr.manual_meascfg.sp_meas.ldg_xh = 118;
292         attr.manual_meascfg.sp_meas.ldg_yh = 8;
293         attr.manual_meascfg.sp_meas.ldg_kh = (255-8)*256/15;
294         attr.manual_meascfg.sp_meas.highlight_th = 245;
295         attr.manual_meascfg.sp_meas.highlight2_th = 200;
296     } else if (CHECK_ISP_HW_V30()) {
297         memset(&attr.manual_meascfg_v30, 0, sizeof(attr.manual_meascfg_v30));
298         attr.manual_meascfg_v30.af_en = 1;
299         attr.manual_meascfg_v30.rawaf_sel = 0; // normal = 0; hdr = 1
300         attr.manual_meascfg_v30.accu_8bit_mode = 1;
301         attr.manual_meascfg_v30.ae_mode = 1;
302 
303         attr.manual_meascfg_v30.window_num = 2;
304         attr.manual_meascfg_v30.wina_h_offs = 2;
305         attr.manual_meascfg_v30.wina_v_offs = 2;
306         attr.manual_meascfg_v30.wina_h_size = 2580;
307         attr.manual_meascfg_v30.wina_v_size = 1935;
308 
309         attr.manual_meascfg_v30.winb_h_offs = 500;
310         attr.manual_meascfg_v30.winb_v_offs = 600;
311         attr.manual_meascfg_v30.winb_h_size = 300;
312         attr.manual_meascfg_v30.winb_v_size = 300;
313 
314         attr.manual_meascfg_v30.gamma_en = 1;
315         memcpy(attr.manual_meascfg_v30.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
316 
317         // param for winb
318         attr.manual_meascfg_v30.thres = 4;
319         attr.manual_meascfg_v30.shift_sum_a = 0;
320         attr.manual_meascfg_v30.shift_y_a = 0;
321         attr.manual_meascfg_v30.shift_sum_b = 1;
322         attr.manual_meascfg_v30.shift_y_b = 1;
323 
324         // Vertical filter
325         // lowlit [0.025, 0.075], max=0.5
326         int ver_flt_lowlit[6] =
327             { 503, 8, 9, -1997, 0, 1997 };
328 
329         // normal [0.042, 0.14], max=0.5
330         int ver_flt_normal[6] =
331             { 483, 28, 28, -1186, 0, 1186 };
332 
333         attr.manual_meascfg_v30.gaus_en = 1;
334         attr.manual_meascfg_v30.v1_fir_sel = 1; // 0:old 1:new
335         attr.manual_meascfg_v30.viir_en = 1;
336         attr.manual_meascfg_v30.v1_fv_outmode = 0; // 0 square, 1 absolute
337         attr.manual_meascfg_v30.v2_fv_outmode = 0; // 0 square, 1 absolute
338         attr.manual_meascfg_v30.v1_fv_shift = 1; //only for sel1
339         attr.manual_meascfg_v30.v2_fv_shift = 1;
340         attr.manual_meascfg_v30.v_fv_thresh = 0;
341         attr.manual_meascfg_v30.v1_iir_coe[1] = ver_flt_lowlit[0];
342         attr.manual_meascfg_v30.v1_iir_coe[4] = ver_flt_lowlit[1];
343         attr.manual_meascfg_v30.v1_iir_coe[7] = ver_flt_lowlit[2];
344         for (int i = 0; i < 3; i++) {
345             attr.manual_meascfg_v30.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
346             attr.manual_meascfg_v30.v2_iir_coe[i] = ver_flt_normal[i];
347             attr.manual_meascfg_v30.v2_fir_coe[i] = ver_flt_normal[i + 3];
348         }
349 
350         // Horizontal filter
351         // lowlit [0.025, 0.075], max=0.5
352         int hor_flt_lowlit[2][6] =
353         {
354             { 203, 811, -375, 673, 0, -673 },
355             { 31,  945, -448, 323, 0, -323 },
356         };
357         // normal [0.042, 0.14], max=0.5
358         int hor_flt_normal[2][6] =
359         {
360             { 512, 557, -276, 460, 0, -460 },
361             { 100, 870, -399, 191, 0, -191 },
362         };
363 
364         attr.manual_meascfg_v30.hiir_en = 1;
365         attr.manual_meascfg_v30.h1_fv_outmode = 0; // 0 square, 1 absolute
366         attr.manual_meascfg_v30.h2_fv_outmode = 0; // 0 square, 1 absolute
367         attr.manual_meascfg_v30.h1_fv_shift = 1;
368         attr.manual_meascfg_v30.h2_fv_shift = 1;
369         attr.manual_meascfg_v30.h_fv_thresh = 0;
370         for (int i = 0; i < 6; i++) {
371             attr.manual_meascfg_v30.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
372             attr.manual_meascfg_v30.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
373             attr.manual_meascfg_v30.h2_iir1_coe[i] = hor_flt_normal[0][i];
374             attr.manual_meascfg_v30.h2_iir2_coe[i] = hor_flt_normal[1][i];
375         }
376 
377         // level depended gain
378         attr.manual_meascfg_v30.ldg_en = 0;
379         attr.manual_meascfg_v30.h_ldg_lumth[0] = 64;
380         attr.manual_meascfg_v30.h_ldg_gain[0]  = 28;
381         attr.manual_meascfg_v30.h_ldg_gslp[0]  = (255-28)*255/45;
382         attr.manual_meascfg_v30.h_ldg_lumth[1] = 185;
383         attr.manual_meascfg_v30.h_ldg_gain[1]  = 8;
384         attr.manual_meascfg_v30.h_ldg_gslp[1]  = (255-8)*255/45;
385         attr.manual_meascfg_v30.v_ldg_lumth[0] = 64;
386         attr.manual_meascfg_v30.v_ldg_gain[0]  = 28;
387         attr.manual_meascfg_v30.v_ldg_gslp[0]  = (255-28)*255/45;
388         attr.manual_meascfg_v30.v_ldg_lumth[1] = 185;
389         attr.manual_meascfg_v30.v_ldg_gain[1]  = 8;
390         attr.manual_meascfg_v30.v_ldg_gslp[1]  = (255-8)*255/45;
391 
392         // High light
393         attr.manual_meascfg_v30.highlit_thresh = 912;
394     } else if (CHECK_ISP_HW_V32()) {
395         // rk1106
396         memset(&attr.manual_meascfg_v31, 0, sizeof(attr.manual_meascfg_v31));
397         attr.manual_meascfg_v31.af_en = 1;
398         attr.manual_meascfg_v31.rawaf_sel = 0; // normal = 0; hdr = 1
399         attr.manual_meascfg_v31.accu_8bit_mode = 1;
400         attr.manual_meascfg_v31.ae_mode = 1;
401         attr.manual_meascfg_v31.v_dnscl_mode = 1;
402 
403         attr.manual_meascfg_v31.window_num = 2;
404         attr.manual_meascfg_v31.wina_h_offs = 2;
405         attr.manual_meascfg_v31.wina_v_offs = 2;
406         attr.manual_meascfg_v31.wina_h_size = 2580;
407         attr.manual_meascfg_v31.wina_v_size = 1935;
408 
409         attr.manual_meascfg_v31.winb_h_offs = 500;
410         attr.manual_meascfg_v31.winb_v_offs = 600;
411         attr.manual_meascfg_v31.winb_h_size = 300;
412         attr.manual_meascfg_v31.winb_v_size = 300;
413 
414         attr.manual_meascfg_v31.gamma_en = 1;
415         memcpy(attr.manual_meascfg_v31.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
416 
417         // param for winb
418         attr.manual_meascfg_v31.thres = 4;
419         attr.manual_meascfg_v31.shift_sum_a = 0;
420         attr.manual_meascfg_v31.shift_y_a = 0;
421         attr.manual_meascfg_v31.shift_sum_b = 1;
422         attr.manual_meascfg_v31.shift_y_b = 1;
423 
424         // Vertical filter
425         // lowlit [0.025, 0.075], max=0.5
426         int ver_flt_lowlit[6] =
427             { -372, 851, 465, -77, 0, 77 };
428 
429         // normal [0.042, 0.14], max=0.5
430         int ver_flt_normal[6] =
431             { -265, 686, 512, -124, 0, 124 };
432 
433         attr.manual_meascfg_v31.gaus_en = 1;
434         attr.manual_meascfg_v31.gaus_coe[1] = 64;
435         attr.manual_meascfg_v31.gaus_coe[4] = 64;
436         attr.manual_meascfg_v31.v1_fir_sel = 1; // 0:old 1:new
437         attr.manual_meascfg_v31.viir_en = 1;
438         attr.manual_meascfg_v31.v1_fv_outmode = 0; // 0 square, 1 absolute
439         attr.manual_meascfg_v31.v2_fv_outmode = 0; // 0 square, 1 absolute
440         attr.manual_meascfg_v31.v1_fv_shift = 1; //only for sel1
441         attr.manual_meascfg_v31.v2_fv_shift = 1;
442         attr.manual_meascfg_v31.v_fv_thresh = 0;
443         for (int i = 0; i < 3; i++) {
444             attr.manual_meascfg_v31.v1_iir_coe[i] = ver_flt_lowlit[i];
445             attr.manual_meascfg_v31.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
446             attr.manual_meascfg_v31.v2_iir_coe[i] = ver_flt_normal[i];
447             attr.manual_meascfg_v31.v2_fir_coe[i] = ver_flt_normal[i + 3];
448         }
449 
450         // Horizontal filter
451         // lowlit [0.025, 0.075], max=0.5
452         int hor_flt_lowlit[2][6] =
453         {
454             { 203, 811, -375, 673, 0, -673 },
455             { 31,  945, -448, 323, 0, -323 },
456         };
457         // normal [0.042, 0.14], max=0.5
458         int hor_flt_normal[2][6] =
459         {
460             { 512, 557, -276, 460, 0, -460 },
461             { 100, 870, -399, 191, 0, -191 },
462         };
463         attr.manual_meascfg_v31.hiir_en = 1;
464         attr.manual_meascfg_v31.h1_fv_outmode = 0; // 0 square, 1 absolute
465         attr.manual_meascfg_v31.h2_fv_outmode = 0; // 0 square, 1 absolute
466         attr.manual_meascfg_v31.h1_fv_shift = 1;
467         attr.manual_meascfg_v31.h2_fv_shift = 1;
468         attr.manual_meascfg_v31.h_fv_thresh = 0;
469         for (int i = 0; i < 6; i++) {
470             attr.manual_meascfg_v31.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
471             attr.manual_meascfg_v31.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
472             attr.manual_meascfg_v31.h2_iir1_coe[i] = hor_flt_normal[0][i];
473             attr.manual_meascfg_v31.h2_iir2_coe[i] = hor_flt_normal[1][i];
474         }
475 
476         // level depended gain
477         attr.manual_meascfg_v31.ldg_en = 0;
478         attr.manual_meascfg_v31.h_ldg_lumth[0] = 64;
479         attr.manual_meascfg_v31.h_ldg_gain[0]  = 28;
480         attr.manual_meascfg_v31.h_ldg_gslp[0]  = (255-28)*255/45;
481         attr.manual_meascfg_v31.h_ldg_lumth[1] = 185;
482         attr.manual_meascfg_v31.h_ldg_gain[1]  = 8;
483         attr.manual_meascfg_v31.h_ldg_gslp[1]  = (255-8)*255/45;
484         attr.manual_meascfg_v31.v_ldg_lumth[0] = 64;
485         attr.manual_meascfg_v31.v_ldg_gain[0]  = 28;
486         attr.manual_meascfg_v31.v_ldg_gslp[0]  = (255-28)*255/45;
487         attr.manual_meascfg_v31.v_ldg_lumth[1] = 185;
488         attr.manual_meascfg_v31.v_ldg_gain[1]  = 8;
489         attr.manual_meascfg_v31.v_ldg_gslp[1]  = (255-8)*255/45;
490 
491         // High light
492         attr.manual_meascfg_v31.highlit_thresh = 912;
493     } else {
494         // rk3562
495         memset(&attr.manual_meascfg_v32, 0, sizeof(attr.manual_meascfg_v32));
496         attr.manual_meascfg_v32.af_en = 1;
497         attr.manual_meascfg_v32.rawaf_sel = 0; // normal = 0; hdr = 1
498         attr.manual_meascfg_v32.accu_8bit_mode = 1;
499         attr.manual_meascfg_v32.ae_mode = 1;
500         attr.manual_meascfg_v32.ae_sel = 1;
501         attr.manual_meascfg_v32.v_dnscl_mode = 1;
502 
503         attr.manual_meascfg_v32.window_num = 2;
504         attr.manual_meascfg_v32.wina_h_offs = 2;
505         attr.manual_meascfg_v32.wina_v_offs = 2;
506         attr.manual_meascfg_v32.wina_h_size = 2580;
507         attr.manual_meascfg_v32.wina_v_size = 1935;
508 
509         attr.manual_meascfg_v32.winb_h_offs = 500;
510         attr.manual_meascfg_v32.winb_v_offs = 600;
511         attr.manual_meascfg_v32.winb_h_size = 300;
512         attr.manual_meascfg_v32.winb_v_size = 300;
513 
514         attr.manual_meascfg_v32.gamma_en = 1;
515         memcpy(attr.manual_meascfg_v32.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
516 
517         // param for winb
518         attr.manual_meascfg_v32.thres = 4;
519         attr.manual_meascfg_v32.shift_sum_a = 0;
520         attr.manual_meascfg_v32.shift_y_a = 0;
521         attr.manual_meascfg_v32.shift_sum_b = 1;
522         attr.manual_meascfg_v32.shift_y_b = 1;
523 
524         // Vertical filter
525         // lowlit [0.025, 0.075], max=0.5
526         int ver_flt_lowlit[6] =
527             { -372, 851, 465, -77, 0, 77 };
528 
529         // normal [0.042, 0.14], max=0.5
530         int ver_flt_normal[6] =
531             { -265, 686, 512, -124, 0, 124 };
532 
533         attr.manual_meascfg_v32.gaus_en = 1;
534         attr.manual_meascfg_v32.gaus_coe[1] = 64;
535         attr.manual_meascfg_v32.gaus_coe[4] = 64;
536         attr.manual_meascfg_v32.v1_fir_sel = 1; // 0:old 1:new
537         attr.manual_meascfg_v32.viir_en = 1;
538         attr.manual_meascfg_v32.v1_fv_outmode = 0; // 0 square, 1 absolute
539         attr.manual_meascfg_v32.v1_fv_shift = 1; //only for sel1
540         attr.manual_meascfg_v32.v_fv_thresh = 0;
541         attr.manual_meascfg_v32.v_fv_limit = 1023;
542         attr.manual_meascfg_v32.v_fv_slope = 256;
543         for (int i = 0; i < 3; i++) {
544             attr.manual_meascfg_v32.v1_iir_coe[i] = ver_flt_normal[i];
545             attr.manual_meascfg_v32.v1_fir_coe[i] = ver_flt_normal[i + 3];
546         }
547 
548         // Horizontal filter
549         // lowlit [0.025, 0.075], max=0.5
550         int hor_flt_lowlit[2][6] =
551         {
552             { 512,   811,  -375,   266,     0,  -266 },
553             { 249,   945,  -448,    41,     0,   -41 },
554         };
555         // normal [0.042, 0.14], max=0.5
556         int hor_flt_normal[2][6] =
557         {
558             { 512,   557,  -276,   460,     0,  -460 },
559             { 512,   870,  -399,    37,     0,   -37 },
560         };
561         attr.manual_meascfg_v32.hiir_en = 1;
562         attr.manual_meascfg_v32.h1_fv_outmode = 0; // 0 square, 1 absolute
563         attr.manual_meascfg_v32.h1_fv_shift = 1;
564         attr.manual_meascfg_v32.h_fv_thresh = 0;
565         attr.manual_meascfg_v32.h_fv_limit = 1023;
566         attr.manual_meascfg_v32.h_fv_slope = 256;
567         for (int i = 0; i < 6; i++) {
568             attr.manual_meascfg_v32.h1_iir1_coe[i] = hor_flt_normal[0][i];
569             attr.manual_meascfg_v32.h1_iir2_coe[i] = hor_flt_normal[1][i];
570         }
571 
572         // level depended gain
573         attr.manual_meascfg_v32.ldg_en = 0;
574         attr.manual_meascfg_v32.h_ldg_lumth[0] = 64;
575         attr.manual_meascfg_v32.h_ldg_gain[0]  = 28;
576         attr.manual_meascfg_v32.h_ldg_gslp[0]  = (255-28)*255/45;
577         attr.manual_meascfg_v32.h_ldg_lumth[1] = 185;
578         attr.manual_meascfg_v32.h_ldg_gain[1]  = 8;
579         attr.manual_meascfg_v32.h_ldg_gslp[1]  = (255-8)*255/45;
580         attr.manual_meascfg_v32.v_ldg_lumth[0] = 64;
581         attr.manual_meascfg_v32.v_ldg_gain[0]  = 28;
582         attr.manual_meascfg_v32.v_ldg_gslp[0]  = (255-28)*255/45;
583         attr.manual_meascfg_v32.v_ldg_lumth[1] = 185;
584         attr.manual_meascfg_v32.v_ldg_gain[1]  = 8;
585         attr.manual_meascfg_v32.v_ldg_gslp[1]  = (255-8)*255/45;
586         attr.manual_meascfg_v32.hldg_dilate_num = 0;
587 
588         // High light
589         attr.manual_meascfg_v32.highlit_thresh = 912;
590         // bls
591         attr.manual_meascfg_v32.bls_en = 0;
592         attr.manual_meascfg_v32.bls_offset = 0;
593     }
594 
595     attr.sync.sync_mode = sync_mode;
596     rk_aiq_user_api2_af_SetAttrib(ctx, &attr);
597     printf("setFocusMeasCfg\n");
598 }
599 
sample_get_af_attrib(const rk_aiq_sys_ctx_t * ctx)600 void sample_get_af_attrib(const rk_aiq_sys_ctx_t* ctx)
601 {
602     rk_aiq_af_attrib_t attr;
603 
604     rk_aiq_user_api2_af_GetAttrib(ctx, &attr);
605     printf("get sync.done %d, sync_mode %d\n", attr.sync.done, attr.sync.sync_mode);
606 }
607 
sample_print_af_info(const void * arg)608 void sample_print_af_info(const void *arg)
609 {
610     printf ("enter AF modult test!\n");
611 }
612 
sample_af_module(const void * arg)613 XCamReturn sample_af_module(const void *arg)
614 {
615     int key = -1;
616     CLEAR();
617     rk_aiq_wb_scene_t scene;
618     rk_aiq_wb_gain_t gain;
619     rk_aiq_wb_cct_t ct;
620     opMode_t mode;
621     const demo_context_t *demo_ctx = (demo_context_t *)arg;
622     const rk_aiq_sys_ctx_t* ctx = (const rk_aiq_sys_ctx_t*)(demo_ctx->aiq_ctx);
623     if (ctx == nullptr) {
624         ERR ("%s, ctx is nullptr\n", __FUNCTION__);
625         return XCAM_RETURN_ERROR_PARAM;
626     }
627 
628     do {
629         sample_af_usage();
630 
631         key = getchar ();
632         while (key == '\n' || key == '\r')
633             key = getchar();
634         printf ("\n\n");
635 
636         switch (key)
637         {
638             case 'h':
639                 sample_af_usage();
640                 break;
641             case '0':
642                 sample_set_focus_automode(ctx);
643                 break;
644             case '1':
645                 sample_set_focus_manualmode(ctx);
646                 break;
647             case '2':
648                 sample_set_focus_semiautomode(ctx);
649                 break;
650             case '3':
651                 sample_get_focus_mode(ctx);
652                 break;
653             case '4':
654                 sample_set_focus_win(ctx);
655                 break;
656             case '5':
657                 sample_set_focus_defwin(ctx);
658                 break;
659             case '6':
660                 sample_get_focus_win(ctx);
661                 break;
662             case '7':
663                 sample_lock_focus(ctx);
664                 break;
665             case '8':
666                 sample_unlock_focus(ctx);
667                 break;
668             case '9':
669                 sample_oneshot_focus(ctx);
670                 break;
671             case 'a':
672                 sample_manual_triger_focus(ctx);
673                 break;
674             case 'b':
675                 sample_tracking_focus(ctx);
676                 break;
677             case 'c':
678                 sample_start_zoomcalib(ctx);
679                 break;
680             case 'd':
681                 sample_reset_zoom(ctx);
682                 break;
683             case 'e':
684                 sample_set_anglez(ctx);
685                 break;
686             case 'f':
687                 sample_add_zoom_position(ctx);
688                 break;
689             case 'g':
690                 sample_sub_zoom_position(ctx);
691                 break;
692             case 'i':
693                 sample_add_focus_position(ctx);
694                 break;
695             case 'j':
696                 sample_sub_focus_position(ctx);
697                 break;
698             case 'k':
699                 sample_get_af_search_result(ctx);
700                 break;
701             case 'l':
702                 sample_set_af_manual_meascfg(ctx, RK_AIQ_UAPI_MODE_SYNC);
703                 break;
704             case 'm':
705                 sample_set_af_manual_meascfg(ctx, RK_AIQ_UAPI_MODE_ASYNC);
706                 break;
707             case 'n':
708                 sample_get_af_attrib(ctx);
709                 break;
710             default:
711                 break;
712         }
713     } while (key != 'q' && key != 'Q');
714 
715     return XCAM_RETURN_NO_ERROR;
716 }
717 
718 
719