xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkisp_demo/demo/sample/sample_agamma_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 #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