1 #include "third_party_af_algo.h"
2 #include "rk_aiq_user_api2_sysctl.h"
3
set_af_manual_meascfg(const rk_aiq_sys_ctx_t * ctx)4 static void set_af_manual_meascfg(const rk_aiq_sys_ctx_t* ctx)
5 {
6 rk_aiq_af_attrib_t attr;
7 uint16_t gamma_y[RKAIQ_RAWAF_GAMMA_NUM] =
8 {0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023};
9
10 rk_aiq_user_api2_af_GetAttrib(ctx, &attr);
11 attr.AfMode = RKAIQ_AF_MODE_FIXED;
12 printf("AfHwVer %d\n", attr.AfHwVer);
13 if (attr.AfHwVer == RKAIQ_AF_HW_V20) {
14 // rv1126/rv1109 rk356x
15 memset(&attr.manual_meascfg, 0, sizeof(attr.manual_meascfg));
16 attr.manual_meascfg.contrast_af_en = 1;
17 attr.manual_meascfg.rawaf_sel = 0; // normal = 0; hdr = 1
18
19 attr.manual_meascfg.window_num = 2;
20 attr.manual_meascfg.wina_h_offs = 2;
21 attr.manual_meascfg.wina_v_offs = 2;
22 attr.manual_meascfg.wina_h_size = 2580;
23 attr.manual_meascfg.wina_v_size = 1935;
24
25 attr.manual_meascfg.winb_h_offs = 500;
26 attr.manual_meascfg.winb_v_offs = 600;
27 attr.manual_meascfg.winb_h_size = 300;
28 attr.manual_meascfg.winb_v_size = 300;
29
30 attr.manual_meascfg.gamma_flt_en = 1;
31 memcpy(attr.manual_meascfg.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
32
33 attr.manual_meascfg.gaus_flt_en = 1;
34 attr.manual_meascfg.gaus_h0 = 0x20;
35 attr.manual_meascfg.gaus_h1 = 0x10;
36 attr.manual_meascfg.gaus_h2 = 0x08;
37
38 attr.manual_meascfg.afm_thres = 4;
39
40 attr.manual_meascfg.lum_var_shift[0] = 0;
41 attr.manual_meascfg.afm_var_shift[0] = 0;
42 attr.manual_meascfg.lum_var_shift[1] = 4;
43 attr.manual_meascfg.afm_var_shift[1] = 4;
44
45 attr.manual_meascfg.sp_meas.enable = true;
46 attr.manual_meascfg.sp_meas.ldg_xl = 10;
47 attr.manual_meascfg.sp_meas.ldg_yl = 28;
48 attr.manual_meascfg.sp_meas.ldg_kl = (255-28)*256/45;
49 attr.manual_meascfg.sp_meas.ldg_xh = 118;
50 attr.manual_meascfg.sp_meas.ldg_yh = 8;
51 attr.manual_meascfg.sp_meas.ldg_kh = (255-8)*256/15;
52 attr.manual_meascfg.sp_meas.highlight_th = 245;
53 attr.manual_meascfg.sp_meas.highlight2_th = 200;
54 } else if (attr.AfHwVer == RKAIQ_AF_HW_V30) {
55 // rk3588
56 memset(&attr.manual_meascfg_v30, 0, sizeof(attr.manual_meascfg_v30));
57 attr.manual_meascfg_v30.af_en = 1;
58 attr.manual_meascfg_v30.rawaf_sel = 0; // normal = 0; hdr = 1
59 attr.manual_meascfg_v30.accu_8bit_mode = 1;
60 attr.manual_meascfg_v30.ae_mode = 1;
61
62 attr.manual_meascfg_v30.window_num = 2;
63 attr.manual_meascfg_v30.wina_h_offs = 2;
64 attr.manual_meascfg_v30.wina_v_offs = 2;
65 attr.manual_meascfg_v30.wina_h_size = 2580;
66 attr.manual_meascfg_v30.wina_v_size = 1935;
67
68 attr.manual_meascfg_v30.winb_h_offs = 500;
69 attr.manual_meascfg_v30.winb_v_offs = 600;
70 attr.manual_meascfg_v30.winb_h_size = 300;
71 attr.manual_meascfg_v30.winb_v_size = 300;
72
73 attr.manual_meascfg_v30.gamma_en = 1;
74 memcpy(attr.manual_meascfg_v30.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
75
76 // param for winb
77 attr.manual_meascfg_v30.thres = 4;
78 attr.manual_meascfg_v30.shift_sum_a = 0;
79 attr.manual_meascfg_v30.shift_y_a = 0;
80 attr.manual_meascfg_v30.shift_sum_b = 1;
81 attr.manual_meascfg_v30.shift_y_b = 1;
82
83 // Vertical filter
84 // face [0.025, 0.06], max=0.5
85 int ver_flt_face[6] =
86 { 503, 8, 9, -1997, 0, 1997 };
87
88 // lowlit [0.025, 0.075], max=0.5
89 int ver_flt_lowlit[6] =
90 { 503, 8, 9, -1997, 0, 1997 };
91
92 // normal [0.042, 0.14], max=0.5
93 int ver_flt_normal[6] =
94 { 483, 28, 28, -1186, 0, 1186 };
95
96 // high [0.055, 0.125], max=0.5
97 int ver_flt_high[6] =
98 { 483, 27, 28, -1212, 0, 1212 };
99
100 // dotlight [0.1 0.175], max=0.5
101 int ver_flt_dotlight[6] =
102 { 445, 63, 64, -531, 0, 531 };
103
104 // full [0.025, 0.175], max=0.5
105 int ver_flt_full[6] =
106 { 476, 33, 34, -985, 0, 985 };
107
108 attr.manual_meascfg_v30.gaus_en = 1;
109 attr.manual_meascfg_v30.v1_fir_sel = 1; // 0:old 1:new
110 attr.manual_meascfg_v30.viir_en = 1;
111 attr.manual_meascfg_v30.v1_fv_outmode = 0; // 0 square, 1 absolute
112 attr.manual_meascfg_v30.v2_fv_outmode = 0; // 0 square, 1 absolute
113 attr.manual_meascfg_v30.v1_fv_shift = 1; //only for sel1
114 attr.manual_meascfg_v30.v2_fv_shift = 1;
115 attr.manual_meascfg_v30.v_fv_thresh = 0;
116 attr.manual_meascfg_v30.v1_iir_coe[1] = ver_flt_lowlit[0];
117 attr.manual_meascfg_v30.v1_iir_coe[4] = ver_flt_lowlit[1];
118 attr.manual_meascfg_v30.v1_iir_coe[7] = ver_flt_lowlit[2];
119 for (int i = 0; i < 3; i++) {
120 attr.manual_meascfg_v30.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
121 attr.manual_meascfg_v30.v2_iir_coe[i] = ver_flt_normal[i];
122 attr.manual_meascfg_v30.v2_fir_coe[i] = ver_flt_normal[i + 3];
123 }
124
125 // Horizontal filter
126 // low [0.0125, 0.03], max=0.5
127 int hor_flt_low[2][6] =
128 {
129 { 31, 960, -462, 546, 0, -546 },
130 { 17, 994, -486, 665, 0, -665 },
131 };
132 // face [0.025, 0.06], max=0.5
133 int hor_flt_face[2][6] =
134 {
135 { 117, 877, -417, 805, 0, -805 },
136 { 23, 957, -460, 334, 0, -334 },
137 };
138 // lowlit [0.025, 0.075], max=0.5
139 int hor_flt_lowlit[2][6] =
140 {
141 { 203, 811, -375, 673, 0, -673 },
142 { 31, 945, -448, 323, 0, -323 },
143 };
144 // normal [0.042, 0.14], max=0.5
145 int hor_flt_normal[2][6] =
146 {
147 { 512, 557, -276, 460, 0, -460 },
148 { 100, 870, -399, 191, 0, -191 },
149 };
150 // high [0.055, 0.125], max=0.5
151 int hor_flt_high[2][6] =
152 {
153 { 415, 648, -344, 403, 0, -403 },
154 { 96, 854, -409, 156, 0, -156 },
155 };
156 // dotlight [0.1 0.175], max=0.5
157 int hor_flt_dotlight[2][6] =
158 {
159 { 512, 447, -349, 319, 0, -319 },
160 { 181, 698, -386, 96, 0, -96 },
161 };
162 // full [0.025, 0.175], max=0.5
163 int hor_flt_full[2][6] =
164 {
165 { 512, 362, -171, 512, 0, -512 },
166 { 114, 915, -417, 302, 0, -302 },
167 };
168 attr.manual_meascfg_v30.hiir_en = 1;
169 attr.manual_meascfg_v30.h1_fv_outmode = 0; // 0 square, 1 absolute
170 attr.manual_meascfg_v30.h2_fv_outmode = 0; // 0 square, 1 absolute
171 attr.manual_meascfg_v30.h1_fv_shift = 1;
172 attr.manual_meascfg_v30.h2_fv_shift = 1;
173 attr.manual_meascfg_v30.h_fv_thresh = 0;
174 for (int i = 0; i < 6; i++) {
175 attr.manual_meascfg_v30.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
176 attr.manual_meascfg_v30.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
177 attr.manual_meascfg_v30.h2_iir1_coe[i] = hor_flt_normal[0][i];
178 attr.manual_meascfg_v30.h2_iir2_coe[i] = hor_flt_normal[1][i];
179 }
180
181 // level depended gain
182 attr.manual_meascfg_v30.ldg_en = 0;
183 attr.manual_meascfg_v30.h_ldg_lumth[0] = 64;
184 attr.manual_meascfg_v30.h_ldg_gain[0] = 28;
185 attr.manual_meascfg_v30.h_ldg_gslp[0] = (255-28)*255/45;
186 attr.manual_meascfg_v30.h_ldg_lumth[1] = 185;
187 attr.manual_meascfg_v30.h_ldg_gain[1] = 8;
188 attr.manual_meascfg_v30.h_ldg_gslp[1] = (255-8)*255/45;
189 attr.manual_meascfg_v30.v_ldg_lumth[0] = 64;
190 attr.manual_meascfg_v30.v_ldg_gain[0] = 28;
191 attr.manual_meascfg_v30.v_ldg_gslp[0] = (255-28)*255/45;
192 attr.manual_meascfg_v30.v_ldg_lumth[1] = 185;
193 attr.manual_meascfg_v30.v_ldg_gain[1] = 8;
194 attr.manual_meascfg_v30.v_ldg_gslp[1] = (255-8)*255/45;
195
196 // High light
197 attr.manual_meascfg_v30.highlit_thresh = 912;
198 } else if (attr.AfHwVer == RKAIQ_AF_HW_V31) {
199 // rk1106
200 memset(&attr.manual_meascfg_v31, 0, sizeof(attr.manual_meascfg_v31));
201 attr.manual_meascfg_v31.af_en = 1;
202 attr.manual_meascfg_v31.rawaf_sel = 0; // normal = 0; hdr = 1
203 attr.manual_meascfg_v31.accu_8bit_mode = 1;
204 attr.manual_meascfg_v31.ae_mode = 1;
205 attr.manual_meascfg_v31.v_dnscl_mode = 1;
206
207 attr.manual_meascfg_v31.window_num = 2;
208 attr.manual_meascfg_v31.wina_h_offs = 2;
209 attr.manual_meascfg_v31.wina_v_offs = 2;
210 attr.manual_meascfg_v31.wina_h_size = 2550;
211 attr.manual_meascfg_v31.wina_v_size = 1425;
212
213 attr.manual_meascfg_v31.winb_h_offs = 500;
214 attr.manual_meascfg_v31.winb_v_offs = 600;
215 attr.manual_meascfg_v31.winb_h_size = 300;
216 attr.manual_meascfg_v31.winb_v_size = 300;
217
218 attr.manual_meascfg_v31.gamma_en = 1;
219 memcpy(attr.manual_meascfg_v31.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
220
221 // param for winb
222 attr.manual_meascfg_v31.thres = 4;
223 attr.manual_meascfg_v31.shift_sum_a = 0;
224 attr.manual_meascfg_v31.shift_y_a = 0;
225 attr.manual_meascfg_v31.shift_sum_b = 1;
226 attr.manual_meascfg_v31.shift_y_b = 1;
227
228 // Vertical filter
229 // face [0.025, 0.06], max=0.5
230 int ver_flt_face[6] =
231 { -410, 895, 330, -79, 0, 79 };
232
233 // lowlit [0.025, 0.075], max=0.5
234 int ver_flt_lowlit[6] =
235 { -372, 851, 465, -77, 0, 77 };
236
237 // normal [0.042, 0.14], max=0.5
238 int ver_flt_normal[6] =
239 { -265, 686, 512, -124, 0, 124 };
240
241 // high [0.055, 0.125], max=0.5
242 int ver_flt_high[6] =
243 { -325, 724, 512, -94, 0, 94 };
244
245 // dotlight [0.1 0.175], max=0.5
246 int ver_flt_dotlight[6] =
247 { -314, 552, 512, -99, 0, 99 };
248
249 // full [0.025, 0.175], max=0.5
250 int ver_flt_full[6] =
251 { -166, 616, 512, -173, 0, 173 };
252
253 attr.manual_meascfg_v31.gaus_en = 1;
254 attr.manual_meascfg_v31.gaus_coe[1] = 64;
255 attr.manual_meascfg_v31.gaus_coe[4] = 64;
256 attr.manual_meascfg_v31.v1_fir_sel = 1; // 0:old 1:new
257 attr.manual_meascfg_v31.viir_en = 1;
258 attr.manual_meascfg_v31.v1_fv_outmode = 0; // 0 square, 1 absolute
259 attr.manual_meascfg_v31.v2_fv_outmode = 0; // 0 square, 1 absolute
260 attr.manual_meascfg_v31.v1_fv_shift = 1; //only for sel1
261 attr.manual_meascfg_v31.v2_fv_shift = 1;
262 attr.manual_meascfg_v31.v_fv_thresh = 0;
263 for (int i = 0; i < 3; i++) {
264 attr.manual_meascfg_v31.v1_iir_coe[i] = ver_flt_lowlit[i];
265 attr.manual_meascfg_v31.v1_fir_coe[i] = ver_flt_lowlit[i + 3];
266 attr.manual_meascfg_v31.v2_iir_coe[i] = ver_flt_normal[i];
267 attr.manual_meascfg_v31.v2_fir_coe[i] = ver_flt_normal[i + 3];
268 }
269
270 // Horizontal filter
271 // low [0.0125, 0.03], max=0.5
272 int hor_flt_low[2][6] =
273 {
274 { 31, 960, -462, 491, 0, -491 },
275 { 19, 994, -486, 665, 0, -665 },
276 };
277 // face [0.025, 0.06], max=0.5
278 int hor_flt_face[2][6] =
279 {
280 { 117, 877, -417, 805, 0, -805 },
281 { 23, 957, -460, 334, 0, -334 },
282 };
283 // lowlit [0.025, 0.075], max=0.5
284 int hor_flt_lowlit[2][6] =
285 {
286 { 203, 811, -375, 673, 0, -673 },
287 { 31, 945, -448, 323, 0, -323 },
288 };
289 // normal [0.042, 0.14], max=0.5
290 int hor_flt_normal[2][6] =
291 {
292 { 512, 557, -276, 460, 0, -460 },
293 { 100, 870, -399, 191, 0, -191 },
294 };
295 // high [0.055, 0.125], max=0.5
296 int hor_flt_high[2][6] =
297 {
298 { 415, 648, -344, 403, 0, -403 },
299 { 96, 854, -409, 156, 0, -156 },
300 };
301 // dotlight [0.1 0.175], max=0.5
302 int hor_flt_dotlight[2][6] =
303 {
304 { 512, 447, -349, 319, 0, -319 },
305 { 181, 698, -386, 96, 0, -96 },
306 };
307 // full [0.025, 0.175], max=0.5
308 int hor_flt_full[2][6] =
309 {
310 { 512, 362, -171, 512, 0, -512 },
311 { 114, 915, -417, 302, 0, -302 },
312 };
313 attr.manual_meascfg_v31.hiir_en = 1;
314 attr.manual_meascfg_v31.h1_fv_outmode = 0; // 0 square, 1 absolute
315 attr.manual_meascfg_v31.h2_fv_outmode = 0; // 0 square, 1 absolute
316 attr.manual_meascfg_v31.h1_fv_shift = 1;
317 attr.manual_meascfg_v31.h2_fv_shift = 1;
318 attr.manual_meascfg_v31.h_fv_thresh = 0;
319 for (int i = 0; i < 6; i++) {
320 attr.manual_meascfg_v31.h1_iir1_coe[i] = hor_flt_lowlit[0][i];
321 attr.manual_meascfg_v31.h1_iir2_coe[i] = hor_flt_lowlit[1][i];
322 attr.manual_meascfg_v31.h2_iir1_coe[i] = hor_flt_normal[0][i];
323 attr.manual_meascfg_v31.h2_iir2_coe[i] = hor_flt_normal[1][i];
324 }
325
326 // level depended gain
327 attr.manual_meascfg_v31.ldg_en = 0;
328 attr.manual_meascfg_v31.h_ldg_lumth[0] = 64;
329 attr.manual_meascfg_v31.h_ldg_gain[0] = 28;
330 attr.manual_meascfg_v31.h_ldg_gslp[0] = (255-28)*255/45;
331 attr.manual_meascfg_v31.h_ldg_lumth[1] = 185;
332 attr.manual_meascfg_v31.h_ldg_gain[1] = 8;
333 attr.manual_meascfg_v31.h_ldg_gslp[1] = (255-8)*255/45;
334 attr.manual_meascfg_v31.v_ldg_lumth[0] = 64;
335 attr.manual_meascfg_v31.v_ldg_gain[0] = 28;
336 attr.manual_meascfg_v31.v_ldg_gslp[0] = (255-28)*255/45;
337 attr.manual_meascfg_v31.v_ldg_lumth[1] = 185;
338 attr.manual_meascfg_v31.v_ldg_gain[1] = 8;
339 attr.manual_meascfg_v31.v_ldg_gslp[1] = (255-8)*255/45;
340
341 // High light
342 attr.manual_meascfg_v31.highlit_thresh = 912;
343 } else if (attr.AfHwVer == RKAIQ_AF_HW_V32_LITE) {
344 // rk3562
345 memset(&attr.manual_meascfg_v32, 0, sizeof(attr.manual_meascfg_v32));
346 attr.manual_meascfg_v32.af_en = 1;
347 attr.manual_meascfg_v32.rawaf_sel = 0; // normal = 0; hdr = 1
348 attr.manual_meascfg_v32.accu_8bit_mode = 1;
349 attr.manual_meascfg_v32.ae_mode = 1;
350 attr.manual_meascfg_v32.ae_sel = 1;
351 attr.manual_meascfg_v32.v_dnscl_mode = 1;
352
353 attr.manual_meascfg_v32.window_num = 2;
354 attr.manual_meascfg_v32.wina_h_offs = 51;
355 attr.manual_meascfg_v32.wina_v_offs = 51;
356 attr.manual_meascfg_v32.wina_h_size = 2550;
357 attr.manual_meascfg_v32.wina_v_size = 1425;
358
359 attr.manual_meascfg_v32.winb_h_offs = 500;
360 attr.manual_meascfg_v32.winb_v_offs = 600;
361 attr.manual_meascfg_v32.winb_h_size = 300;
362 attr.manual_meascfg_v32.winb_v_size = 300;
363
364 attr.manual_meascfg_v32.gamma_en = 1;
365 memcpy(attr.manual_meascfg_v32.gamma_y, gamma_y, RKAIQ_RAWAF_GAMMA_NUM * sizeof(uint16_t));
366
367 // param for winb
368 attr.manual_meascfg_v32.thres = 4;
369 attr.manual_meascfg_v32.shift_sum_a = 0;
370 attr.manual_meascfg_v32.shift_y_a = 0;
371 attr.manual_meascfg_v32.shift_sum_b = 1;
372 attr.manual_meascfg_v32.shift_y_b = 1;
373
374 // Vertical filter
375 // face [0.025, 0.06], max=0.5
376 int ver_flt_face[6] =
377 { -410, 895, 330, -79, 0, 79 };
378
379 // lowlit [0.025, 0.075], max=0.5
380 int ver_flt_lowlit[6] =
381 { -372, 851, 465, -77, 0, 77 };
382
383 // normal [0.042, 0.14], max=0.5
384 int ver_flt_normal[6] =
385 { -265, 686, 512, -124, 0, 124 };
386
387 // high [0.055, 0.125], max=0.5
388 int ver_flt_high[6] =
389 { -325, 724, 512, -94, 0, 94 };
390
391 // dotlight [0.1 0.175], max=0.5
392 int ver_flt_dotlight[6] =
393 { -314, 552, 512, -99, 0, 99 };
394
395 // full [0.025, 0.175], max=0.5
396 int ver_flt_full[6] =
397 { -166, 616, 512, -173, 0, 173 };
398
399 attr.manual_meascfg_v32.gaus_en = 1;
400 attr.manual_meascfg_v32.gaus_coe[1] = 64;
401 attr.manual_meascfg_v32.gaus_coe[4] = 64;
402 attr.manual_meascfg_v32.v1_fir_sel = 1; // 0:old 1:new
403 attr.manual_meascfg_v32.viir_en = 1;
404 attr.manual_meascfg_v32.v1_fv_outmode = 0; // 0 square, 1 absolute
405 attr.manual_meascfg_v32.v1_fv_shift = 1; //only for sel1
406 attr.manual_meascfg_v32.v_fv_thresh = 0;
407 attr.manual_meascfg_v32.v_fv_limit = 1023;
408 attr.manual_meascfg_v32.v_fv_slope = 256;
409 for (int i = 0; i < 3; i++) {
410 attr.manual_meascfg_v32.v1_iir_coe[i] = ver_flt_normal[i];
411 attr.manual_meascfg_v32.v1_fir_coe[i] = ver_flt_normal[i + 3];
412 }
413
414 // Horizontal filter
415 // low [0.0125, 0.03], max=0.5
416 int hor_flt_low[2][6] =
417 {
418 { 256, 958, -460, 202, 0, -202 },
419 { 45, 994, -485, 87, 0, -87 },
420 };
421 // face [0.025, 0.06], max=0.5
422 int hor_flt_face[2][6] =
423 {
424 { 512, 877, -417, 184, 0, -184 },
425 { 181, 957, -460, 42, 0, -42 },
426 };
427 // lowlit [0.025, 0.075], max=0.5
428 int hor_flt_lowlit[2][6] =
429 {
430 { 512, 811, -375, 266, 0, -266 },
431 { 249, 945, -448, 41, 0, -41 },
432 };
433 // normal [0.042, 0.14], max=0.5
434 int hor_flt_normal[2][6] =
435 {
436 { 512, 557, -276, 460, 0, -460 },
437 { 512, 870, -399, 37, 0, -37 },
438 };
439 // high [0.055, 0.125], max=0.5
440 int hor_flt_high[2][6] =
441 {
442 { 512, 648, -344, 327, 0, -327 },
443 { 512, 854, -409, 29, 0, -29 },
444 };
445 // dotlight [0.1 0.175], max=0.5
446 int hor_flt_dotlight[2][6] =
447 {
448 { 512, 447, -349, 319, 0, -319 },
449 { 512, 698, -386, 34, 0, -34 },
450 };
451 // full [0.025, 0.175], max=0.5
452 int hor_flt_full[2][6] =
453 {
454 { 512, 362, -171, 512, 0, -512 },
455 { 512, 915, -417, 67, 0, -67 },
456 };
457 attr.manual_meascfg_v32.hiir_en = 1;
458 attr.manual_meascfg_v32.h1_fv_outmode = 0; // 0 square, 1 absolute
459 attr.manual_meascfg_v32.h1_fv_shift = 1;
460 attr.manual_meascfg_v32.h_fv_thresh = 0;
461 attr.manual_meascfg_v32.h_fv_limit = 1023;
462 attr.manual_meascfg_v32.h_fv_slope = 256;
463 for (int i = 0; i < 6; i++) {
464 attr.manual_meascfg_v32.h1_iir1_coe[i] = hor_flt_normal[0][i];
465 attr.manual_meascfg_v32.h1_iir2_coe[i] = hor_flt_normal[1][i];
466 }
467
468 // level depended gain
469 attr.manual_meascfg_v32.ldg_en = 0;
470 attr.manual_meascfg_v32.h_ldg_lumth[0] = 64;
471 attr.manual_meascfg_v32.h_ldg_gain[0] = 28;
472 attr.manual_meascfg_v32.h_ldg_gslp[0] = (255-28)*255/45;
473 attr.manual_meascfg_v32.h_ldg_lumth[1] = 185;
474 attr.manual_meascfg_v32.h_ldg_gain[1] = 8;
475 attr.manual_meascfg_v32.h_ldg_gslp[1] = (255-8)*255/45;
476 attr.manual_meascfg_v32.v_ldg_lumth[0] = 64;
477 attr.manual_meascfg_v32.v_ldg_gain[0] = 28;
478 attr.manual_meascfg_v32.v_ldg_gslp[0] = (255-28)*255/45;
479 attr.manual_meascfg_v32.v_ldg_lumth[1] = 185;
480 attr.manual_meascfg_v32.v_ldg_gain[1] = 8;
481 attr.manual_meascfg_v32.v_ldg_gslp[1] = (255-8)*255/45;
482 attr.manual_meascfg_v32.hldg_dilate_num = 0;
483
484 // High light
485 attr.manual_meascfg_v32.highlit_thresh = 912;
486
487 // bls
488 attr.manual_meascfg_v32.bls_en = 0;
489 attr.manual_meascfg_v32.bls_offset = 0;
490 }
491
492 attr.sync.sync_mode = RK_AIQ_UAPI_MODE_SYNC;
493 rk_aiq_user_api2_af_SetAttrib(ctx, &attr);
494 printf("setFocusMeasCfg\n");
495 }
496
print_af_stats(rk_aiq_isp_stats_t * stats_ref)497 static void print_af_stats(rk_aiq_isp_stats_t *stats_ref)
498 {
499 unsigned long sof_time;
500
501 // show af stats every 30 frames
502 if (stats_ref->frame_id % 30 != 0)
503 return;
504
505 if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V20) {
506 // rv1126/rv1109 rk356x
507 sof_time = stats_ref->af_stats.sof_tim / 1000000LL;
508 printf("sof_tim %ld, sharpness roia: 0x%llx-0x%08x roib: 0x%x-0x%08x\n",
509 sof_time,
510 stats_ref->af_stats.roia_sharpness,
511 stats_ref->af_stats.roia_luminance,
512 stats_ref->af_stats.roib_sharpness,
513 stats_ref->af_stats.roib_luminance);
514
515 printf("global_sharpness\n");
516 for (int i = 0; i < 15; i++) {
517 for (int j = 0; j < 15; j++) {
518 printf("0x%08x, ", stats_ref->af_stats.global_sharpness[15 * i + j]);
519 }
520 printf("\n");
521 }
522 printf("lowpass_fv4_4\n");
523 for (int i = 0; i < 15; i++) {
524 for (int j = 0; j < 15; j++) {
525 printf("0x%08x, ", stats_ref->af_stats.lowpass_fv4_4[15 * i + j]);
526 }
527 printf("\n");
528 }
529 printf("lowpass_fv8_8\n");
530 for (int i = 0; i < 15; i++) {
531 for (int j = 0; j < 15; j++) {
532 printf("0x%08x, ", stats_ref->af_stats.lowpass_fv8_8[15 * i + j]);
533 }
534 printf("\n");
535 }
536 printf("lowpass_highlht\n");
537 for (int i = 0; i < 15; i++) {
538 for (int j = 0; j < 15; j++) {
539 printf("0x%08x, ", stats_ref->af_stats.lowpass_highlht[15 * i + j]);
540 }
541 printf("\n");
542 }
543 printf("lowpass_highlht2\n");
544 for (int i = 0; i < 15; i++) {
545 for (int j = 0; j < 15; j++) {
546 printf("0x%08x, ", stats_ref->af_stats.lowpass_highlht2[15 * i + j]);
547 }
548 printf("\n");
549 }
550 } else if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V30 || stats_ref->af_hw_ver == RKAIQ_AF_HW_V31) {
551 // rk3588 & rk1106
552 sof_time = stats_ref->af_stats_v3x.sof_tim / 1000000LL;
553 printf("wnda_fv_h1\n");
554 for (int i = 0; i < 15; i++) {
555 for (int j = 0; j < 15; j++) {
556 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h1[15 * i + j]);
557 }
558 printf("\n");
559 }
560 printf("wnda_fv_h2\n");
561 for (int i = 0; i < 15; i++) {
562 for (int j = 0; j < 15; j++) {
563 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h2[15 * i + j]);
564 }
565 printf("\n");
566 }
567 printf("wnda_fv_v1\n");
568 for (int i = 0; i < 15; i++) {
569 for (int j = 0; j < 15; j++) {
570 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v1[15 * i + j]);
571 }
572 printf("\n");
573 }
574 printf("wnda_fv_v2\n");
575 for (int i = 0; i < 15; i++) {
576 for (int j = 0; j < 15; j++) {
577 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v2[15 * i + j]);
578 }
579 printf("\n");
580 }
581 printf("wnda_luma\n");
582 for (int i = 0; i < 15; i++) {
583 for (int j = 0; j < 15; j++) {
584 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_luma[15 * i + j]);
585 }
586 printf("\n");
587 }
588 printf("wina_highlit_cnt\n");
589 for (int i = 0; i < 15; i++) {
590 for (int j = 0; j < 15; j++) {
591 printf("0x%08x, ", stats_ref->af_stats_v3x.wina_highlit_cnt[15 * i + j]);
592 }
593 printf("\n");
594 }
595 } else if (stats_ref->af_hw_ver == RKAIQ_AF_HW_V32_LITE) {
596 // rk3562
597 sof_time = stats_ref->af_stats_v3x.sof_tim / 1000000LL;
598 printf("wnda_fv_h1\n");
599 for (int i = 0; i < 5; i++) {
600 for (int j = 0; j < 5; j++) {
601 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_h1[5 * i + j]);
602 }
603 printf("\n");
604 }
605 printf("wnda_fv_v1\n");
606 for (int i = 0; i < 5; i++) {
607 for (int j = 0; j < 5; j++) {
608 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_fv_v1[5 * i + j]);
609 }
610 printf("\n");
611 }
612 printf("wnda_luma\n");
613 for (int i = 0; i < 5; i++) {
614 for (int j = 0; j < 5; j++) {
615 printf("0x%08x, ", stats_ref->af_stats_v3x.wnda_luma[5 * i + j]);
616 }
617 printf("\n");
618 }
619 printf("wina_highlit_cnt\n");
620 for (int i = 0; i < 5; i++) {
621 for (int j = 0; j < 5; j++) {
622 printf("0x%08x, ", stats_ref->af_stats_v3x.wina_highlit_cnt[5 * i + j]);
623 }
624 printf("\n");
625 }
626 }
627 }
628
custom_af_algo(rk_aiq_isp_stats_t * stats_ref)629 static void custom_af_algo(rk_aiq_isp_stats_t *stats_ref)
630 {
631 // show af stats
632 print_af_stats(stats_ref);
633
634 // run af algo
635
636 // move zoom/focus motor
637
638 }
639
af_thread(void * args)640 static void* af_thread(void* args) {
641 rk_aiq_sys_ctx_t* ctx = (rk_aiq_sys_ctx_t*)args;
642 XCamReturn ret;
643 pthread_detach (pthread_self());
644 printf("begin af thread\n");
645
646 // set af meas config
647 set_af_manual_meascfg(ctx);
648 while(1) {
649 rk_aiq_isp_stats_t *stats_ref = NULL;
650 // get 3a stats
651 ret = rk_aiq_uapi2_sysctl_get3AStatsBlk(ctx, &stats_ref, -1);
652 if (ret == XCAM_RETURN_NO_ERROR && stats_ref != NULL) {
653 printf("get one stats frame id %d \n", stats_ref->frame_id);
654 custom_af_algo(stats_ref);
655 // release 3a stats
656 rk_aiq_uapi2_sysctl_release3AStatsRef(ctx, stats_ref);
657 } else {
658 if (ret == XCAM_RETURN_NO_ERROR) {
659 printf("aiq has stopped !\n");
660 break;
661 } else if (ret == XCAM_RETURN_ERROR_TIMEOUT) {
662 printf("aiq timeout!\n");
663 continue;
664 } else if (ret == XCAM_RETURN_ERROR_FAILED) {
665 printf("aiq failed!\n");
666 break;
667 }
668 }
669 }
670 printf("end stats thread\n");
671 return 0;
672 }
673
custom_af_run(rk_aiq_sys_ctx_t * ctx)674 int32_t custom_af_run(rk_aiq_sys_ctx_t* ctx)
675 {
676 pthread_t af_tid;
677 pthread_create(&af_tid, NULL, af_thread, ctx);
678
679 return 0;
680 }
681