xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/uAPI2/rk_aiq_user_api2_helper.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Copyright (c) 2021 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 "uAPI2/rk_aiq_user_api2_helper.h"
19 #include "uAPI/rk_aiq_api_private.h"
20 #include "RkAiqCalibDbV2.h"
21 #include "RkAiqUapitypes.h"
22 #include "cJSON.h"
23 #include "cJSON_Utils.h"
24 #include "j2s.h"
25 #include "stdlib.h"
26 #include "string.h"
27 #include "rk_aiq_user_api_sysctl.h"
28 #include "uAPI2/rk_aiq_user_api2_ae.h"
29 #include "uAPI2/rk_aiq_user_api2_imgproc.h"
30 #include "uAPI2/rk_aiq_user_api2_wrapper.h"
31 #include "uAPI2/rk_aiq_user_api2_agic.h"
32 #include "uAPI2/rk_aiq_user_api2_wrapper.h"
33 
34 #include "rk_aiq_tool_api.h"
35 
36 #if defined(__GNUC__) && !defined(__clang__)
37 #pragma GCC diagnostic push
38 #pragma GCC diagnostic ignored "-Wcast-function-type"
39 #endif
40 // json cmd example {
41 //    "op":"replace",
42 //    "path":"/uapi/0/system/crop"
43 //    "value":"{
44 //      "x":0,
45 //      "y":0,
46 //      "w":1280,
47 //      "h":720
48 //    }"
49 // }
50 //
51 // json cmd example {
52 //    "op":"replace",
53 //    "path":"/uapi/0/ae_uapi/opmode"
54 //    "value":"{
55 //      1
56 //    }"
57 // }
58 //
59 
60 /*****************Add UAPI wrapper here if necessary*****************/
61 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_ae_setExpSwAttr, Uapi_ExpSwAttrV2_t);
62 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_aie_SetAttrib, aie_attrib_t*);
63 __RKAIQUAPI_SET_WRAPPER(rk_aiq_user_api2_acp_SetAttrib, acp_attrib_t*);
64 
65 /********************** Add Attr caller here ************************/
66 __RKAIQUAPI_CALLER(uapi_expsw_attr_t);
67 __RKAIQUAPI_CALLER(uapi_expinfo_t);
68 __RKAIQUAPI_CALLER(aiq_scene_t);
69 __RKAIQUAPI_CALLER(work_mode_t);
70 __RKAIQUAPI_CALLER(uapi_wb_gain_t);
71 __RKAIQUAPI_CALLER(uapi_wb_mode_t);
72 __RKAIQUAPI_CALLER(uapiMergeCurrCtlData_t);
73 #if RKAIQ_HAVE_MERGE_V10
74 __RKAIQUAPI_CALLER(mMergeAttrV10_t);
75 #endif
76 #if RKAIQ_HAVE_MERGE_V11
77 __RKAIQUAPI_CALLER(mMergeAttrV11_t);
78 #endif
79 #if RKAIQ_HAVE_MERGE_V12
80 __RKAIQUAPI_CALLER(mMergeAttrV12_t);
81 #endif
82 #if RKAIQ_HAVE_DRC_V10
83 __RKAIQUAPI_CALLER(DrcInfoV10_t);
84 __RKAIQUAPI_CALLER(mdrcAttr_V10_t);
85 #endif
86 #if RKAIQ_HAVE_DRC_V11
87 __RKAIQUAPI_CALLER(DrcInfoV11_t);
88 __RKAIQUAPI_CALLER(mdrcAttr_V11_t);
89 #endif
90 #if RKAIQ_HAVE_DRC_V12
91 __RKAIQUAPI_CALLER(DrcInfoV12_t);
92 __RKAIQUAPI_CALLER(mdrcAttr_V12_t);
93 #endif
94 #if RKAIQ_HAVE_DRC_V12_LITE
95 __RKAIQUAPI_CALLER(DrcInfoV12Lite_t);
96 __RKAIQUAPI_CALLER(mdrcAttr_v12_lite_t);
97 #endif
98 #if RKAIQ_HAVE_GAMMA_V10
99 __RKAIQUAPI_CALLER(AgammaApiManualV10_t);
100 #endif
101 #if RKAIQ_HAVE_GAMMA_V11
102 __RKAIQUAPI_CALLER(AgammaApiManualV11_t);
103 #endif
104 __RKAIQUAPI_CALLER(mDehazeAttrInfoV11_t);
105 #if RKAIQ_HAVE_DEHAZE_V10
106 #endif
107 #if RKAIQ_HAVE_DEHAZE_V11
108 __RKAIQUAPI_CALLER(mDehazeAttrV11_t);
109 #endif
110 #if RKAIQ_HAVE_DEHAZE_V12
111 __RKAIQUAPI_CALLER(mDehazeAttrV12_t);
112 #endif
113 __RKAIQUAPI_CALLER(uapi_ae_hwstats_t);
114 #if defined(ISP_HW_V21)
115 __RKAIQUAPI_CALLER(rk_aiq_awb_stat_res2_v201_t);
116 #elif defined(ISP_HW_V30)
117 __RKAIQUAPI_CALLER(rk_tool_awb_stat_res2_v30_t);
118 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
119 __RKAIQUAPI_CALLER(rk_tool_isp_awb_stats_v32_t);
120 #endif
121 __RKAIQUAPI_CALLER(rk_tool_awb_stat_res_full_t);
122 __RKAIQUAPI_CALLER(rk_tool_awb_strategy_result_t);
123 __RKAIQUAPI_CALLER(rk_aiq_ccm_querry_info_t);
124 #if defined(ISP_HW_V21) || defined(ISP_HW_V30)
125 __RKAIQUAPI_CALLER(rk_aiq_ccm_mccm_attrib_t);
126 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
127 __RKAIQUAPI_CALLER(rk_aiq_ccm_mccm_attrib_v2_t);
128 #endif
129 __RKAIQUAPI_CALLER(Cgc_Param_t);
130 __RKAIQUAPI_CALLER(Csm_Param_t);
131 __RKAIQUAPI_CALLER(Adpcc_Manual_Attr_t);
132 
133 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE) || defined(ISP_HW_V30)
134 __RKAIQUAPI_CALLER(ablc_uapi_manual_t);
135 __RKAIQUAPI_CALLER(asharp_uapi_manual_t);
136 __RKAIQUAPI_CALLER(abayer2dnr_uapi_manual_t);
137 __RKAIQUAPI_CALLER(abayertnr_uapi_manual_t);
138 __RKAIQUAPI_CALLER(aynr_uapi_manual_t);
139 __RKAIQUAPI_CALLER(acnr_uapi_manual_t);
140 __RKAIQUAPI_CALLER(again_uapi_manual_t);
141 __RKAIQUAPI_CALLER(ablc_uapi_info_t);
142 __RKAIQUAPI_CALLER(abayertnr_uapi_info_t);
143 __RKAIQUAPI_CALLER(abayer2dnr_uapi_info_t);
144 __RKAIQUAPI_CALLER(aynr_uapi_info_t);
145 __RKAIQUAPI_CALLER(acnr_uapi_info_t);
146 __RKAIQUAPI_CALLER(asharp_uapi_info_t);
147 __RKAIQUAPI_CALLER(again_uapi_info_t);
148 #endif
149 
150 __RKAIQUAPI_CALLER(rk_aiq_lut3d_mlut3d_attrib_t);
151 __RKAIQUAPI_CALLER(rkaiq_gic_v2_api_attr_t);
152 __RKAIQUAPI_CALLER(aie_attrib_t);
153 __RKAIQUAPI_CALLER(acp_attrib_t);
154 __RKAIQUAPI_CALLER(rk_aiq_lsc_table_t);
155 __RKAIQUAPI_CALLER(camgroup_uapi_t);
156 __RKAIQUAPI_CALLER(adebayer_attrib_t);
157 
158 RkAiqUapiDesc_t rkaiq_uapidesc_list[] = {
159     __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expsw_attr", uapi_expsw_attr_t,
160                          __RKAIQUAPI_SET_WRAPPER_NAME(rk_aiq_user_api2_ae_setExpSwAttr),
161                          rk_aiq_user_api2_ae_getExpSwAttr),
162     __RKAIQUAPI_DESC_DEF("/uapi/0/ae_uapi/expinfo", uapi_expinfo_t, NULL,
163                          rk_aiq_user_api2_ae_queryExpResInfo),
164     __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/wbgain", uapi_wb_gain_t, rk_aiq_uapi2_setMWBGain,
165                          rk_aiq_uapi2_getWBGain),
166     __RKAIQUAPI_DESC_DEF("/uapi/0/awb_uapi/mode", uapi_wb_mode_t, rk_aiq_uapi2_setWBMode2,
167                          rk_aiq_uapi2_getWBMode2),
168 
169 #if RKAIQ_HAVE_MERGE_V10
170     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
171                          rk_aiq_user_api2_amerge_v10_queryinfo),
172     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV10_t,
173                          rk_aiq_set_amerge_v10_manual_attr, rk_aiq_get_amerge_v10_manual_attr),
174 #endif
175 #if RKAIQ_HAVE_MERGE_V11
176     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
177                          rk_aiq_user_api2_amerge_v11_queryinfo),
178     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV11_t,
179                          rk_aiq_set_amerge_v11_manual_attr, rk_aiq_get_amerge_v11_manual_attr),
180 #endif
181 #if RKAIQ_HAVE_MERGE_V12
182     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/Info", uapiMergeCurrCtlData_t, NULL,
183                          rk_aiq_user_api2_amerge_v12_queryinfo),
184     __RKAIQUAPI_DESC_DEF("/uapi/0/amerge_uapi/stManual", mMergeAttrV12_t,
185                          rk_aiq_set_amerge_v12_manual_attr, rk_aiq_get_amerge_v12_manual_attr),
186 #endif
187 #if RKAIQ_HAVE_DRC_V10
188     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV10_t, NULL,
189                          rk_aiq_user_api2_adrc_v10_queryinfo),
190     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V10_t,
191                          rk_aiq_set_adrc_v10_manual_attr, rk_aiq_get_adrc_v10_manual_attr),
192 #endif
193 #if RKAIQ_HAVE_DRC_V11
194     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV11_t, NULL,
195                          rk_aiq_user_api2_adrc_v11_queryinfo),
196     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V11_t,
197                          rk_aiq_set_adrc_v11_manual_attr, rk_aiq_get_adrc_v11_manual_attr),
198 #endif
199 #if RKAIQ_HAVE_DRC_V12
200     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV12_t, NULL,
201                          rk_aiq_user_api2_adrc_v12_queryinfo),
202     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_V12_t,
203                          rk_aiq_set_adrc_v12_manual_attr, rk_aiq_get_adrc_v12_manual_attr),
204 #endif
205 #if RKAIQ_HAVE_DRC_V12_LITE
206     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/Info", DrcInfoV12Lite_t, NULL,
207                          rk_aiq_user_api2_adrc_v12_lite_queryinfo),
208     __RKAIQUAPI_DESC_DEF("/uapi/0/adrc_uapi/stManual", mdrcAttr_v12_lite_t,
209                          rk_aiq_set_adrc_v12_lite_manual_attr,
210                          rk_aiq_get_adrc_v12_lite_manual_attr),
211 #endif
212 #if RKAIQ_HAVE_GAMMA_V10
213     __RKAIQUAPI_DESC_DEF("/uapi/0/agamma_uapi/stManual", AgammaApiManualV10_t,
214                          rk_aiq_set_agamma_v10_manual_attr, rk_aiq_get_agamma_v10_manual_attr),
215 #endif
216 #if RKAIQ_HAVE_GAMMA_V11
217     __RKAIQUAPI_DESC_DEF("/uapi/0/agamma_uapi/stManual", AgammaApiManualV11_t,
218                          rk_aiq_set_agamma_v11_manual_attr, rk_aiq_get_agamma_v11_manual_attr),
219 #endif
220 #if RKAIQ_HAVE_DEHAZE_V10
221 #endif
222 #if RKAIQ_HAVE_DEHAZE_V11
223     __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/Info", mDehazeAttrInfoV11_t, NULL,
224                          rk_aiq_user_api2_adehaze_v11_queryinfo),
225     __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/stManual", mDehazeAttrV11_t,
226                          rk_aiq_set_adehaze_v11_manual_attr, rk_aiq_get_adehaze_v11_manual_attr),
227 #endif
228 #if RKAIQ_HAVE_DEHAZE_V12
229     __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/Info", mDehazeAttrInfoV11_t, NULL,
230                          rk_aiq_user_api2_adehaze_v12_queryinfo),
231     __RKAIQUAPI_DESC_DEF("/uapi/0/adehaze_uapi/stManual", mDehazeAttrV12_t,
232                          rk_aiq_set_adehaze_v12_manual_attr, rk_aiq_get_adehaze_v12_manual_attr),
233 #endif
234     __RKAIQUAPI_DESC_DEF("/uapi/0/system/work_mode", work_mode_t,
235                          rk_aiq_uapi_sysctl_swWorkingModeDyn2,
236                          rk_aiq_uapi_sysctl_getWorkingModeDyn),
237     __RKAIQUAPI_DESC_DEF("/uapi/0/system/scene", aiq_scene_t, rk_aiq_user_api2_set_scene,
238                          rk_aiq_user_api2_get_scene),
239     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/ae_hwstats", uapi_ae_hwstats_t, NULL,
240                          rk_aiq_uapi_get_ae_hwstats),
241 #if defined(ISP_HW_V21)
242     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_aiq_awb_stat_res2_v201_t,
243                          NULL, rk_aiq_uapi_get_awbV21_stat),
244 #elif defined(ISP_HW_V30)
245     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_tool_awb_stat_res2_v30_t,
246                          NULL, rk_aiq_uapi_get_awb_stat),
247 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
248     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat", rk_tool_isp_awb_stats_v32_t,
249                          NULL, rk_aiq_uapi_get_awbV32_stat),
250 #endif
251     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_stat_algo",
252                          rk_tool_awb_stat_res_full_t, NULL, rk_aiq_user_api2_awb_getAlgoSta),
253     __RKAIQUAPI_DESC_DEF("/uapi/0/measure_info/wb_log/info/awb_strategy_result",
254                          rk_tool_awb_strategy_result_t, NULL,
255                          rk_aiq_user_api2_awb_getStrategyResult),
256     __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/mode", uapi_wb_mode_t, rk_aiq_set_tool_accm_mode,
257                          rk_aiq_get_accm_mode),
258 #if defined(ISP_HW_V21) || defined(ISP_HW_V30)
259     __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/Info", rk_aiq_ccm_querry_info_t, NULL,
260                          rk_aiq_user_api2_accm_QueryCcmInfo),
261     __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/stManual", rk_aiq_ccm_mccm_attrib_t,
262                          rk_aiq_set_accm_v1_manual_attr, rk_aiq_get_accm_v1_manual_attr),
263 #elif defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
264     __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/Info", rk_aiq_ccm_querry_info_t, NULL,
265                          rk_aiq_user_api2_accm_QueryCcmInfo),
266     __RKAIQUAPI_DESC_DEF("/uapi/0/accm_uapi/stManual", rk_aiq_ccm_mccm_attrib_v2_t,
267                          rk_aiq_set_accm_v2_manual_attr, rk_aiq_get_accm_v2_manual_attr),
268 #endif
269     __RKAIQUAPI_DESC_DEF("/uapi/0/acgc_uapi/manual", Cgc_Param_t, rk_aiq_set_acgc_manual_attr,
270                          rk_aiq_get_acgc_manual_attr),
271     __RKAIQUAPI_DESC_DEF("/uapi/0/acsm_uapi/manual", Csm_Param_t, rk_aiq_set_acsm_manual_attr,
272                          rk_aiq_get_acsm_manual_attr),
273     __RKAIQUAPI_DESC_DEF("/uapi/0/a3dlut_uapi/mode", uapi_wb_mode_t, rk_aiq_set_tool_3dlut_mode,
274                          rk_aiq_get_a3dlut_mode),
275     __RKAIQUAPI_DESC_DEF("/uapi/0/a3dlut_uapi/manual", rk_aiq_lut3d_mlut3d_attrib_t,
276                          rk_aiq_set_a3dlut_manual_attr, rk_aiq_get_a3dlut_manual_attr),
277 
278 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
279     __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_uapi/manual", ablc_uapi_manual_t,
280                          rk_aiq_set_ablc_manual_attr, rk_aiq_get_ablc_manual_attr),
281     __RKAIQUAPI_DESC_DEF("/uapi/0/asharp_uapi/manual", asharp_uapi_manual_t,
282                          rk_aiq_set_asharp_manual_attr, rk_aiq_get_asharp_manual_attr),
283     __RKAIQUAPI_DESC_DEF("/uapi/0/abayer2dnr_uapi/manual", abayer2dnr_uapi_manual_t,
284                          rk_aiq_set_abayer2dnr_manual_attr, rk_aiq_get_abayer2dnr_manual_attr),
285     __RKAIQUAPI_DESC_DEF("/uapi/0/abayertnr_uapi/manual", abayertnr_uapi_manual_t,
286                          rk_aiq_set_abayertnr_manual_attr, rk_aiq_get_abayertnr_manual_attr),
287     __RKAIQUAPI_DESC_DEF("/uapi/0/aynr_uapi/manual", aynr_uapi_manual_t,
288                          rk_aiq_set_aynr_manual_attr, rk_aiq_get_aynr_manual_attr),
289     __RKAIQUAPI_DESC_DEF("/uapi/0/acnr_uapi/manual", acnr_uapi_manual_t,
290                          rk_aiq_set_acnr_manual_attr, rk_aiq_get_acnr_manual_attr),
291     __RKAIQUAPI_DESC_DEF("/uapi/0/again_uapi/manual", again_uapi_manual_t,
292                          rk_aiq_set_again_manual_attr, rk_aiq_get_again_manual_attr),
293 
294     __RKAIQUAPI_DESC_DEF("/uapi/0/ablc_uapi/info", ablc_uapi_info_t, NULL, rk_aiq_get_ablc_info),
295 
296     __RKAIQUAPI_DESC_DEF("/uapi/0/abayertnr_uapi/info", abayertnr_uapi_info_t, NULL,
297                          rk_aiq_get_abayertnr_info),
298 
299     __RKAIQUAPI_DESC_DEF("/uapi/0/abayer2dnr_uapi/info", abayer2dnr_uapi_info_t, NULL,
300                          rk_aiq_get_abayer2dnr_info),
301 
302     __RKAIQUAPI_DESC_DEF("/uapi/0/aynr_uapi/info", aynr_uapi_info_t, NULL, rk_aiq_get_aynr_info),
303 
304     __RKAIQUAPI_DESC_DEF("/uapi/0/acnr_uapi/info", acnr_uapi_info_t, NULL, rk_aiq_get_acnr_info),
305 
306     __RKAIQUAPI_DESC_DEF("/uapi/0/asharp_uapi/info", asharp_uapi_info_t, NULL,
307                          rk_aiq_get_asharp_info),
308 
309     __RKAIQUAPI_DESC_DEF("/uapi/0/again_uapi/info", again_uapi_info_t, NULL, rk_aiq_get_again_info),
310 
311 #endif
312 
313 };
314 /***********************END OF CUSTOM AREA**************************/
315 
rkaiq_uapi_rpc_response(const char * cmd_path,cJSON * root_js,const char * sub_node)316 char *rkaiq_uapi_rpc_response(const char *cmd_path, cJSON *root_js,
317                               const char *sub_node) {
318     char *ret_str = NULL;
319     cJSON *ret_json = NULL;
320     cJSON *node_json = NULL;
321     cJSON *node_json_clone = NULL;
322     ret_json = cJSON_CreateArray();
323 
324     if (!root_js || !sub_node) {
325         XCAM_LOG_ERROR("invalid json argument for sysctl!");
326         return NULL;
327     }
328 
329     if (0 == strcmp(sub_node, "/")) {
330         node_json = root_js;
331     } else {
332         node_json = cJSONUtils_GetPointer(root_js, sub_node);
333     }
334 
335     node_json_clone = cJSON_Duplicate(node_json, 1);
336 
337     if (root_js) {
338         cJSON *ret_item = cJSON_CreateObject();
339         cJSON_AddStringToObject(ret_item, JSON_PATCH_PATH, cmd_path);
340         cJSON_AddItemToObject(ret_item, JSON_PATCH_VALUE, node_json_clone);
341         cJSON_AddItemToArray(ret_json, ret_item);
342     }
343 
344     ret_str = cJSON_Print(ret_json);
345 
346     if (ret_json)
347         cJSON_Delete(ret_json);
348 
349     return ret_str;
350 }
351 
rkaiq_uapi_best_match(const char * cmd_path_str)352 int rkaiq_uapi_best_match(const char *cmd_path_str) {
353     int i = 0;
354     int list_len = -1;
355     int beset_match = -1;
356     int max_length = -1;
357 
358     list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t);
359     if (list_len <= 0) {
360         return -1;
361     }
362 
363     // Find most match uapi
364     for (i = 0; i < list_len; i++) {
365         RkAiqUapiDesc_t *temp_uapi_desc = &rkaiq_uapidesc_list[i];
366         if (strstr(cmd_path_str, temp_uapi_desc->arg_path)) {
367             int path_length = std::string(temp_uapi_desc->arg_path).length();
368             if (path_length < max_length) {
369                 continue;
370             }
371             max_length = path_length;
372             beset_match = i;
373         }
374     }
375 
376     return beset_match;
377 }
378 
rkaiq_uapi_unified_ctl(rk_aiq_sys_ctx_t * sys_ctx,const char * js_str,char ** ret_str,int op_mode)379 int rkaiq_uapi_unified_ctl(rk_aiq_sys_ctx_t *sys_ctx, const char *js_str,
380                            char **ret_str, int op_mode) {
381     RkAiqUapiDesc_t *uapi_desc = NULL;
382     std::string cmd_path_str;
383     std::string final_path = "/";
384     cJSON *cmd_js = NULL;
385     cJSON *ret_js = NULL;
386     cJSON *arr_item = NULL;
387     int list_len = -1;
388     int change_sum = -1;
389     int max_length = -1;
390     int i = 0;
391     rk_aiq_sys_ctx_t* msys_ctx = NULL;
392     *ret_str = NULL;
393 
394     list_len = sizeof(rkaiq_uapidesc_list) / sizeof(RkAiqUapiDesc_t);
395     if (list_len <= 0) {
396         return -1;
397     }
398 
399     cmd_js = cJSON_Parse(js_str);
400     change_sum = cJSON_GetArraySize(cmd_js);
401 
402     if (change_sum <= 0) {
403         XCAM_LOG_ERROR("can't find json patch operation\n");
404         return -1;
405     }
406 
407     arr_item = cmd_js->child;
408 
409     for (int i = 0; i <= (change_sum - 1); ++i) {
410         if (arr_item) {
411             if (cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring) {
412                 cmd_path_str = std::string(
413                                    cJSON_GetObjectItem(arr_item, JSON_PATCH_PATH)->valuestring);
414                 int desc_i = rkaiq_uapi_best_match(cmd_path_str.c_str());
415                 if (desc_i >= 0) {
416                     uapi_desc = &rkaiq_uapidesc_list[desc_i];
417                     if (0 == std::string(uapi_desc->arg_path).compare(cmd_path_str)) {
418                         final_path = "/";
419                     } else {
420                         final_path = cmd_path_str.substr(
421                                          std::string(uapi_desc->arg_path).length());
422                     }
423                     cJSON_ReplaceItemInObject(arr_item, JSON_PATCH_PATH,
424                                               cJSON_CreateString(final_path.c_str()));
425                 }
426             }
427         }
428         arr_item = arr_item->next;
429     }
430 
431     if (!uapi_desc) {
432         XCAM_LOG_ERROR("can't find uapi for %s\n", cmd_path_str.c_str());
433         return -1;
434     }
435 
436 #if RKAIQ_ENABLE_CAMGROUP
437     msys_ctx = rk_aiq_get_last_sysctx(sys_ctx);
438     if (!msys_ctx) {
439         XCAM_LOG_ERROR("can't find valid ctx\n");
440         return -1;
441     }
442 #else
443     msys_ctx = sys_ctx;
444 #endif
445 
446     uapi_desc->uapi_caller(uapi_desc, msys_ctx, cmd_js,
447                            (void **)&ret_js, op_mode);
448 
449     if (op_mode == RKAIQUAPI_OPMODE_SET) {
450         *ret_str = NULL;
451     } else if (op_mode == RKAIQUAPI_OPMODE_GET) {
452         if (ret_js) {
453             *ret_str = rkaiq_uapi_rpc_response(cmd_path_str.c_str(), ret_js,
454                                                final_path.c_str());
455             cJSON_Delete(ret_js);
456         }
457     }
458 
459     cJSON_Delete(cmd_js);
460 
461     return 0;
462 }
463 
464 #if defined(__GNUC__) && !defined(__clang__)
465 #pragma GCC diagnostic pop
466 #endif
467