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 #include "uAPI2/rk_aiq_user_api2_agamma.h"
20
21 #define LIMIT_VALUE(value,max_value,min_value) (value > max_value? max_value : value < min_value ? min_value : value)
22
23
sample_agamma_usage()24 static void sample_agamma_usage()
25 {
26 printf("Usage : \n");
27 printf("\t 0) AGAMMA: test rk_aiq_user_api2_agamma_v10_SetAttrib stManual Sync.\n");
28 printf("\t 1) AGAMMA: test rk_aiq_user_api2_agamma_v10_SetAttrib stManual Async.\n");
29 printf("\t 2) AGAMMA: test rk_aiq_user_api2_agamma_v10_GetAttrib.\n");
30 printf("\t 3) AGAMMA: test rk_aiq_uapi2_setGammaCoef.\n");
31 printf("\t 4) AGAMMA: test rk_aiq_user_api2_agamma_v11_SetAttrib stManual Sync.\n");
32 printf("\t 5) AGAMMA: test rk_aiq_user_api2_agamma_v11_SetAttrib stManual Async.\n");
33 printf("\t 6) AGAMMA: test rk_aiq_user_api2_agamma_v11_GetAttrib.\n");
34 printf("\t 7) AGAMMA: test rk_aiq_user_api2_agamma_SetAttrib stManual Sync.\n");
35 printf("\t 8) AGAMMA: test rk_aiq_user_api2_agamma_SetAttrib stManual Async.\n");
36 printf("\t 9) AGAMMA: test rk_aiq_user_api2_agamma_SetAttrib stFast Sync.\n");
37 printf("\t a) AGAMMA: test rk_aiq_user_api2_agamma_SetAttrib stFast Async.\n");
38 printf("\t b) AGAMMA: test rk_aiq_user_api2_agamma_GetAttrib.\n");
39 printf("\t q) AGAMMA: return to main sample screen.\n");
40
41 printf("\n");
42 printf("\t please press the key: ");
43
44 return;
45 }
46
sample_print_agamma_info(const void * arg)47 void sample_print_agamma_info(const void *arg)
48 {
49 printf ("enter AGAMMA modult test!\n");
50 }
51
sample_agamma_module(const void * arg)52 XCamReturn sample_agamma_module(const void *arg)
53 {
54 int key = -1;
55 CLEAR();
56
57 rk_aiq_gamma_v10_attr_t attr_v10;
58 rk_aiq_gamma_v11_attr_t attr_v11;
59 rk_aiq_gamma_attrib_V2_t attr_v2;
60 float X_v10[CALIBDB_AGAMMA_KNOTS_NUM_V10] = {
61 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24,
62 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,
63 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792, 2048, 2560, 3072, 3584, 4095};
64 float Y_v10 = 0.0;
65 float X_v11[CALIBDB_AGAMMA_KNOTS_NUM_V11] = {
66 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16,
67 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160,
68 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536,
69 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4095};
70 float Y_v11 = 0.0;
71
72 const demo_context_t *demo_ctx = (demo_context_t *)arg;
73 const rk_aiq_sys_ctx_t* ctx ;
74 if (demo_ctx->camGroup) {
75 ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->camgroup_ctx);
76 } else {
77 ctx = (rk_aiq_sys_ctx_t*)(demo_ctx->aiq_ctx);
78 }
79
80 do {
81 sample_agamma_usage ();
82
83 key = getchar ();
84 while (key == '\n' || key == '\r')
85 key = getchar();
86 printf ("\n");
87
88
89 switch (key)
90 {
91 case '0': {
92 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v10_SetAttrib stManual Sync\n\n");
93 attr_v10.sync.sync_mode = RK_AIQ_UAPI_MODE_DEFAULT;
94 attr_v10.sync.done = false;
95 attr_v10.mode = RK_AIQ_GAMMA_MODE_MANUAL;
96 attr_v10.stManual.Gamma_en = true;
97 attr_v10.stManual.Gamma_out_segnum = GAMMATYPE_LOG;
98 attr_v10.stManual.Gamma_out_offset = 0;
99 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V10; i++) {
100 Y_v10 = 4095 * pow(X_v10[i] / 4095, 1 / 1 + 0.0);
101 Y_v10 = LIMIT_VALUE(Y_v10, 4095, 0);
102 attr_v10.stManual.Gamma_curve[i] = (int)(Y_v10 + 0.5);
103 }
104 rk_aiq_user_api2_agamma_v10_SetAttrib(ctx, &attr_v10);
105 break;
106 }
107 case '1': {
108 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v10_SetAttrib stManual Async\n\n");
109 attr_v10.sync.sync_mode = RK_AIQ_UAPI_MODE_ASYNC;
110 attr_v10.sync.done = false;
111 attr_v10.mode = RK_AIQ_GAMMA_MODE_MANUAL;
112 attr_v10.stManual.Gamma_en = true;
113 attr_v10.stManual.Gamma_out_segnum = GAMMATYPE_LOG;
114 attr_v10.stManual.Gamma_out_offset = 1024;
115
116 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V10; i++) {
117 Y_v10 = 4095 * pow(X_v10[i] / 4095, 1 / 2.2 + 0.0);
118 Y_v10 = LIMIT_VALUE(Y_v10, 4095, 0);
119 attr_v10.stManual.Gamma_curve[i] = (int)(Y_v10 + 0.5);
120 }
121 rk_aiq_user_api2_agamma_v10_SetAttrib(ctx, &attr_v10);
122 break;
123 }
124 case '2': {
125 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v10_GetAttrib\n\n");
126 rk_aiq_user_api2_agamma_v10_GetAttrib(ctx, &attr_v10);
127 printf("\t sync = %d, done = %d\n", attr_v10.sync.sync_mode, attr_v10.sync.done);
128 printf("\t attr_v11.mode:%d stManual.Gamma_en:%d stManual.Gamma_out_offset:%d\n\n",
129 attr_v10.mode, attr_v10.stManual.Gamma_en, attr_v10.stManual.Gamma_out_offset);
130 printf("\t stManual.Gamma_curve:%d %d %d %d %d %d\n\n",
131 attr_v10.stManual.Gamma_curve[0], attr_v10.stManual.Gamma_curve[1],
132 attr_v10.stManual.Gamma_curve[2], attr_v10.stManual.Gamma_curve[3],
133 attr_v10.stManual.Gamma_curve[4], attr_v10.stManual.Gamma_curve[5]);
134 break;
135 }
136 case '3': {
137 printf("\t AGAMMA test rk_aiq_uapi2_setGammaCoef\n\n");
138 rk_aiq_uapi2_setGammaCoef(ctx, 5, 0);
139 break;
140 }
141 case '4': {
142 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v11_SetAttrib stManual Sync\n\n");
143 attr_v11.sync.sync_mode = RK_AIQ_UAPI_MODE_DEFAULT;
144 attr_v11.sync.done = false;
145 attr_v11.mode = RK_AIQ_GAMMA_MODE_MANUAL;
146 attr_v11.stManual.Gamma_en = true;
147 attr_v11.stManual.Gamma_out_offset = 0;
148 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V11; i++) {
149 Y_v11 = 4095 * pow(X_v11[i] / 4095, 1 / 1 + 0.0);
150 Y_v11 = LIMIT_VALUE(Y_v11, 4095, 0);
151 attr_v11.stManual.Gamma_curve[i] = (int)(Y_v11 + 0.5);
152 }
153 rk_aiq_user_api2_agamma_v11_SetAttrib(ctx, &attr_v11);
154 break;
155 }
156 case '5': {
157 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v11_SetAttrib stManual Async\n\n");
158 attr_v11.sync.sync_mode = RK_AIQ_UAPI_MODE_ASYNC;
159 attr_v11.sync.done = false;
160 attr_v11.mode = RK_AIQ_GAMMA_MODE_MANUAL;
161 attr_v11.stManual.Gamma_en = true;
162 attr_v11.stManual.Gamma_out_offset = 1024;
163 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V11; i++) {
164 Y_v11 = 4095 * pow(X_v11[i] / 4095, 1 / 2.2 + 0.0);
165 Y_v11 = LIMIT_VALUE(Y_v11, 4095, 0);
166 attr_v11.stManual.Gamma_curve[i] = (int)(Y_v11 + 0.5);
167 }
168 rk_aiq_user_api2_agamma_v11_SetAttrib(ctx, &attr_v11);
169 break;
170 }
171 case '6': {
172 printf("\t AGAMMA test rk_aiq_user_api2_agamma_v11_GetAttrib\n\n");
173 rk_aiq_user_api2_agamma_v11_GetAttrib(ctx, &attr_v11);
174 printf("\t sync = %d, done = %d\n", attr_v11.sync.sync_mode, attr_v11.sync.done);
175 printf("\t attr_v11.mode:%d stManual.Gamma_en:%d stManual.Gamma_out_offset:%d\n\n",
176 attr_v11.mode, attr_v11.stManual.Gamma_en, attr_v11.stManual.Gamma_out_offset);
177 printf("\t stManual.Gamma_curve:%d %d %d %d %d %d\n\n",
178 attr_v11.stManual.Gamma_curve[0], attr_v11.stManual.Gamma_curve[1],
179 attr_v11.stManual.Gamma_curve[2], attr_v11.stManual.Gamma_curve[3],
180 attr_v11.stManual.Gamma_curve[4], attr_v11.stManual.Gamma_curve[5]);
181 break;
182 }
183 case '7': {
184 printf("\t AGAMMA test rk_aiq_user_api2_agamma_SetAttrib stManual Sync\n\n");
185 attr_v2.sync.sync_mode = RK_AIQ_UAPI_MODE_DEFAULT;
186 attr_v2.sync.done = false;
187 attr_v2.atrrV30.mode = GAMMA_MODE_MANUAL;
188 attr_v2.atrrV30.stManual.Gamma_en = true;
189 attr_v2.atrrV30.stManual.Gamma_out_offset = 0;
190 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V11; i++) {
191 Y_v11 = 4095 * pow(X_v11[i] / 4095, 1 / 1 + 0.0);
192 Y_v11 = LIMIT_VALUE(Y_v11, 4095, 0);
193 attr_v2.atrrV30.stManual.Gamma_curve[i] = (int)(Y_v11 + 0.5);
194 }
195 rk_aiq_user_api2_agamma_SetAttrib(ctx, attr_v2);
196 break;
197 }
198 case '8': {
199 printf("\t AGAMMA test rk_aiq_user_api2_agamma_SetAttrib stManual Async\n\n");
200 attr_v2.sync.sync_mode = RK_AIQ_UAPI_MODE_ASYNC;
201 attr_v2.sync.done = false;
202 attr_v2.atrrV30.mode = GAMMA_MODE_MANUAL;
203 attr_v2.atrrV30.stManual.Gamma_en = true;
204 attr_v2.atrrV30.stManual.Gamma_out_offset = 1024;
205 for (int i = 0; i < CALIBDB_AGAMMA_KNOTS_NUM_V11; i++) {
206 Y_v11 = 4095 * pow(X_v11[i] / 4095, 1 / 2.2 + 0.0);
207 Y_v11 = LIMIT_VALUE(Y_v11, 4095, 0);
208 attr_v2.atrrV30.stManual.Gamma_curve[i] = (int)(Y_v11 + 0.5);
209 }
210 rk_aiq_user_api2_agamma_SetAttrib(ctx, attr_v2);
211 break;
212 }
213 case '9': {
214 printf("\t AGAMMA test rk_aiq_user_api2_agamma_SetAttrib stFast Sync\n\n");
215 attr_v2.sync.sync_mode = RK_AIQ_UAPI_MODE_DEFAULT;
216 attr_v2.sync.done = false;
217 attr_v2.atrrV30.mode = GAMMA_MODE_FAST;
218 attr_v2.atrrV30.stFast.GammaCoef = 1.0;
219 attr_v2.atrrV30.stFast.SlopeAtZero = 0;
220 rk_aiq_user_api2_agamma_SetAttrib(ctx, attr_v2);
221 break;
222 }
223 case 'a': {
224 printf("\t AGAMMA test rk_aiq_user_api2_agamma_SetAttrib stFast Async\n\n");
225 attr_v2.sync.sync_mode = RK_AIQ_UAPI_MODE_ASYNC;
226 attr_v2.sync.done = false;
227 attr_v2.atrrV30.mode = GAMMA_MODE_FAST;
228 attr_v2.atrrV30.stFast.GammaCoef = 2.2;
229 attr_v2.atrrV30.stFast.SlopeAtZero = 0;
230 rk_aiq_user_api2_agamma_SetAttrib(ctx, attr_v2);
231 break;
232 }
233 case 'b': {
234 printf("\t AGAMMA test rk_aiq_user_api2_agamma_GetAttrib\n\n");
235 rk_aiq_user_api2_agamma_GetAttrib(ctx, &attr_v2);
236 printf("\t sync = %d, done = %d\n", attr_v2.sync.sync_mode, attr_v2.sync.done);
237 printf("\t attr_v11.mode:%d stManual.Gamma_en:%d stManual.Gamma_out_offset:%d\n\n",
238 attr_v2.atrrV30.mode, attr_v2.atrrV30.stManual.Gamma_en,
239 attr_v2.atrrV30.stManual.Gamma_out_offset);
240 printf("\t stManual.Gamma_curve:%d %d %d %d %d %d\n\n",
241 attr_v2.atrrV30.stManual.Gamma_curve[0], attr_v2.atrrV30.stManual.Gamma_curve[1],
242 attr_v2.atrrV30.stManual.Gamma_curve[2], attr_v2.atrrV30.stManual.Gamma_curve[3],
243 attr_v2.atrrV30.stManual.Gamma_curve[4],
244 attr_v2.atrrV30.stManual.Gamma_curve[5]);
245 break;
246 }
247 default:
248 break;
249 }
250 } while (key != 'q' && key != 'Q');
251
252 return XCAM_RETURN_NO_ERROR;
253 }
254