xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/tools/j2s4b/src/j2s4b/RkAiqsceneManager.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "RkAiqsceneManager.h"
2 
3 #include <cstring>
4 
mergeSubMultiScene(cJSON * sub_scene_list,cJSON * full_param,bool skip)5 cJSON *RkAiqsceneManager::mergeSubMultiScene(cJSON *sub_scene_list,
6                                              cJSON *full_param, bool skip) {
7   cJSON *json_item = NULL;
8   cJSON *new_item = NULL;
9   int sub_scene_sum = 0;
10   int i = 0;
11 
12   if (!sub_scene_list || !full_param) {
13     printf("input base json is invalid!\n");
14     return NULL;
15   }
16 
17   // need skip first full param scene
18   if (cJSON_GetArraySize(sub_scene_list) <= skip) {
19     printf("%s %d only one sub scene, ignore!\n", __func__, __LINE__);
20     return NULL;
21   }
22 
23   json_item = sub_scene_list->child;
24 
25   sub_scene_sum = cJSON_GetArraySize(sub_scene_list);
26   for (i = 0; i < sub_scene_sum; i++) {
27     if (json_item) {
28       cJSON *temp_item = json_item;
29       json_item = json_item->next;
30       // skip the full param scene
31       if (i == 0 && skip) {
32         continue;
33       }
34       new_item = cJSON_Duplicate(full_param, 1);
35       new_item = cJSONUtils_MergePatch(new_item, temp_item);
36       cJSON_ReplaceItemInArray(sub_scene_list, i, new_item);
37     } else {
38       break;
39     }
40   }
41 
42   return sub_scene_list;
43 }
44 
mergeMainMultiScene(cJSON * main_scene_list)45 cJSON *RkAiqsceneManager::mergeMainMultiScene(cJSON *main_scene_list) {
46   cJSON *json_item = NULL;
47   cJSON *first_sub_scene_list = NULL;
48   cJSON *main_first = NULL;
49   cJSON *full_param = NULL;
50 
51   if (!main_scene_list) {
52     printf("input main scene list json is invalid!\n");
53     return NULL;
54   }
55 
56   if (cJSON_GetArraySize(main_scene_list) <= 0) {
57     printf("invalid main scene len!\n");
58     return NULL;
59   }
60 
61   main_first = cJSON_GetArrayItem(main_scene_list, 0);
62   first_sub_scene_list = cJSONUtils_GetPointer(main_first, "/sub_scene");
63 
64   if (cJSON_GetArraySize(first_sub_scene_list) <= 0) {
65     printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
66     return NULL;
67   }
68 
69   full_param = cJSON_GetArrayItem(first_sub_scene_list, 0);
70 
71   if (!full_param) {
72     printf("invalid full param scene!\n");
73     return NULL;
74   }
75 
76   json_item = main_scene_list->child;
77 
78   int main_scene_sum = cJSON_GetArraySize(main_scene_list);
79   for (int i = 0; i < main_scene_sum; i++) {
80     // need skip first main scene's sub scene
81     cJSON *sub_scene_list = cJSONUtils_GetPointer(json_item, "/sub_scene");
82     if (json_item && sub_scene_list) {
83       mergeSubMultiScene(sub_scene_list, full_param, i == 0);
84     }
85     json_item = json_item->next;
86   }
87 
88   return main_scene_list;
89 }
90 
mergeMultiSceneIQ(cJSON * base_json)91 cJSON *RkAiqsceneManager::mergeMultiSceneIQ(cJSON *base_json) {
92   cJSON *main_scene_list_json = NULL;
93 
94   // 1. foreach every sub scene.
95   // 2. merge every sub scene to base scene.
96   // 3. replace sub scene with new json.
97   if (!base_json) {
98     printf("input base json is invalid!\n");
99     return NULL;
100   }
101 
102   main_scene_list_json = cJSONUtils_GetPointer(base_json, "/main_scene");
103   if (!main_scene_list_json) {
104     printf("invalid main scene!\n");
105     return NULL;
106   }
107 
108   if (cJSON_GetArraySize(main_scene_list_json) <= 0) {
109     printf("invalid main scene len!\n");
110     return NULL;
111   }
112 
113   if (!mergeMainMultiScene(main_scene_list_json)) {
114     return NULL;
115   }
116 
117   return base_json;
118 }
119 
findMainScene(cJSON * base_json,const char * name)120 cJSON *RkAiqsceneManager::findMainScene(cJSON *base_json, const char *name) {
121   cJSON *json_item = NULL;
122   cJSON *found_main_json = NULL;
123   cJSON *main_scene_json = NULL;
124 
125   if (!base_json) {
126     printf("input base json is invalid!\n");
127     return NULL;
128   }
129 
130   main_scene_json = cJSONUtils_GetPointer(base_json, "/main_scene");
131   if (!main_scene_json) {
132     printf("invalid main scene!\n");
133     return NULL;
134   }
135 
136   int main_scene_sum = cJSON_GetArraySize(main_scene_json);
137   if (main_scene_sum <= 0) {
138     printf("invalid main scene len!\n");
139     return NULL;
140   }
141 
142   json_item = main_scene_json->child;
143 
144   for (int i = 0; i <= (main_scene_sum - 1); ++i) {
145     if (json_item) {
146       char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
147       if (name_str && strstr(name_str, name)) {
148         found_main_json = json_item;
149         break;
150       }
151     }
152     json_item = json_item->next;
153   }
154 
155   return found_main_json;
156 }
157 
findSubScene(cJSON * main_json,const char * name)158 cJSON *RkAiqsceneManager::findSubScene(cJSON *main_json, const char *name) {
159   cJSON *json_item = NULL;
160   cJSON *found_sub_json = NULL;
161   cJSON *sub_scene_json = NULL;
162 
163   if (!main_json) {
164     printf("input main scene json is invalid!\n");
165     return NULL;
166   }
167 
168   sub_scene_json = cJSONUtils_GetPointer(main_json, "/sub_scene");
169   if (!sub_scene_json) {
170     printf("invalid sub scene!\n");
171     return NULL;
172   }
173 
174   int sub_scene_sum = cJSON_GetArraySize(sub_scene_json);
175   if (sub_scene_sum <= 0) {
176     printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
177     return NULL;
178   }
179 
180   json_item = sub_scene_json->child;
181 
182   for (int i = 0; i < sub_scene_sum; ++i) {
183     if (json_item) {
184       char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
185       if (name_str && strstr(name_str, name)) {
186         found_sub_json = json_item;
187         break;
188       }
189     }
190     json_item = json_item->next;
191   }
192 
193   return found_sub_json;
194 }
195 
findSubScene(cJSON * json,const char * main_scene,const char * sub_scene)196 cJSON *RkAiqsceneManager::findSubScene(cJSON *json, const char *main_scene,
197                                        const char *sub_scene) {
198 
199   return findSubScene(findMainScene(json, main_scene), sub_scene);
200 }
201 
202 std::map<std::string, cJSON *>
getMainSceneList(cJSON * root_js)203 RkAiqsceneManager::getMainSceneList(cJSON *root_js) {
204   cJSON *json_item = NULL;
205   cJSON *main_scene_json = NULL;
206   std::map<std::string, cJSON *> mMap;
207 
208   if (!root_js) {
209     printf("input base json is invalid!\n");
210     return {};
211   }
212 
213   main_scene_json = cJSONUtils_GetPointer(root_js, "/main_scene");
214   if (!main_scene_json) {
215     printf("invalid main scene!\n");
216     return {};
217   }
218 
219   int main_scene_sum = cJSON_GetArraySize(main_scene_json);
220   if (main_scene_sum <= 0) {
221     printf("invalid main scene len!\n");
222     return {};
223   }
224 
225   json_item = main_scene_json->child;
226 
227   for (int i = 0; i <= (main_scene_sum - 1); ++i) {
228     if (json_item) {
229       char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
230       if (name_str && strlen(name_str) > 0) {
231         mMap[std::string(name_str)] = json_item;
232       }
233     }
234     json_item = json_item->next;
235   }
236 
237   return mMap;
238 }
239 
240 std::map<std::string, cJSON *>
getSubSceneList(cJSON * main_js,const std::string name)241 RkAiqsceneManager::getSubSceneList(cJSON *main_js, const std::string name) {
242   cJSON *json_item = NULL;
243   cJSON *sub_scene_json = NULL;
244   std::map<std::string, cJSON *> mMap;
245 
246   if (!main_js) {
247     printf("input main scene json is invalid!\n");
248     return {};
249   }
250 
251   sub_scene_json = cJSONUtils_GetPointer(main_js, "/sub_scene");
252   if (!sub_scene_json) {
253     printf("invalid sub scene!\n");
254     return {};
255   }
256 
257   int sub_scene_sum = cJSON_GetArraySize(sub_scene_json);
258   if (sub_scene_sum <= 0) {
259     printf("%s %d invalid sub scene len!\n", __func__, __LINE__);
260     return {};
261   }
262 
263   json_item = sub_scene_json->child;
264 
265   for (int i = 0; i < sub_scene_sum; ++i) {
266     if (json_item) {
267       char *name_str = cJSON_GetObjectItem(json_item, "name")->valuestring;
268       if (name_str && strlen(name_str) > 0) {
269         mMap[std::string(name + "/" + std::string(name_str))] = json_item;
270       }
271     }
272     json_item = json_item->next;
273   }
274 
275   return mMap;
276 }
277 
278 std::map<std::string, cJSON *>
expandAllScene(cJSON * root_js)279 RkAiqsceneManager::expandAllScene(cJSON *root_js) {
280   if (!root_js) {
281     return {};
282   }
283   return {};
284 }
285 
splitScene(cJSON * root_js,const char * main_scene,const char * sub_scene)286 cJSON *RkAiqsceneManager::splitScene(cJSON *root_js, const char *main_scene,
287                                      const char *sub_scene) {
288   cJSON *new_json = NULL;
289   std::string scene_index = "";
290 
291   if (!root_js || !main_scene || !sub_scene) {
292     printf("input is invalid argument!\n");
293     return NULL;
294   }
295 
296   scene_index = std::string(main_scene) + "/" + std::string(sub_scene);
297 
298   new_json = cJSON_Duplicate(root_js, 1);
299 
300   if (!new_json) {
301     printf("clone json failed!\n");
302     return NULL;
303   }
304 
305   std::map<std::string, cJSON *> main_scene_list = getMainSceneList(new_json);
306 
307   for (auto mScene : main_scene_list) {
308     // delete main scene witch we don't want.
309     if (0 != std::string(main_scene).compare(mScene.first) && mScene.second) {
310       cJSON_DetachItemViaPointer(new_json, mScene.second);
311       main_scene_list.erase(mScene.first);
312     }
313   }
314 
315   return new_json;
316 }
317 
318