| /* | 
|  *  Copyright (c) 2021 Rockchip Corporation | 
|  * | 
|  * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  * you may not use this file except in compliance with the License. | 
|  * You may obtain a copy of the License at | 
|  * | 
|  *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  * | 
|  * Unless required by applicable law or agreed to in writing, software | 
|  * distributed under the License is distributed on an "AS IS" BASIS, | 
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  * See the License for the specific language governing permissions and | 
|  * limitations under the License. | 
|  * | 
|  */ | 
|   | 
| #include "scene_manager.h" | 
| #include "j2s.h" | 
| #include <fcntl.h> | 
| #include <sys/stat.h> | 
| #include <sys/types.h> | 
| #include <unistd.h> | 
|   | 
| namespace RkCam { | 
|   | 
| std::map<std::string, AiqScene> RkAiqSceneManager::sceneMap; | 
|   | 
| cJSON *RkAiqSceneManager::loadIQFile(const char *name) { | 
|   char *json_data = NULL; | 
|   size_t json_data_size = 0; | 
|   cJSON *out_json = NULL; | 
|   | 
|   json_data = (char *)j2s_read_file(name, &json_data_size); | 
|   out_json = cJSON_Parse(json_data); | 
|   if (json_data) { | 
|     free(json_data); | 
|   } | 
|   | 
|   return out_json; | 
| } | 
|   | 
| int RkAiqSceneManager::addScene(const char *name, const char *base, | 
|                                 const char *fragment) { | 
|   sceneMap[name] = std::make_pair(std::string(base), std::string(fragment)); | 
|   | 
|   return 0; | 
| } | 
|   | 
| int RkAiqSceneManager::addScene(const char *name, AiqScene scene) { | 
|   sceneMap[name] = scene; | 
|   return 0; | 
| } | 
|   | 
| AiqScene RkAiqSceneManager::matchScene(const char *name) { | 
|   auto search = sceneMap.find(std::string(name)); | 
|   | 
|   if (search != sceneMap.end()) { | 
|     return search->second; | 
|   } else { | 
|     std::cout << "Not found\n"; | 
|   } | 
|   | 
|   return AiqScene(); | 
| } | 
|   | 
| const char *RkAiqSceneManager::getSceneIQ(const char *base, | 
|                                           const char *fragment) { | 
|   cJSON *base_json = NULL; | 
|   cJSON *fragment_json = NULL; | 
|   cJSON *out_json = NULL; | 
|   | 
|   base_json = loadIQFile(base); | 
|   if (!base_json) { | 
|     printf("Error before: [%s]\n", cJSON_GetErrorPtr()); | 
|   } else { | 
|     char *out = cJSON_Print(base_json); | 
|     // printf("%s\n", out); | 
|     free(out); | 
|   } | 
|   | 
|   fragment_json = loadIQFile(fragment); | 
|   if (!fragment_json) { | 
|     printf("Error before: [%s]\n", cJSON_GetErrorPtr()); | 
|   } else { | 
|     char *out = cJSON_Print(fragment_json); | 
|     // printf("%s\n", out); | 
|     free(out); | 
|   } | 
|   | 
|   // foreach fragment json obj, if fragment first level son obj is not empty | 
|   // then override base json's same object | 
|   if (cJSON_Compare(base_json, fragment_json, 1)) { | 
|     printf("same iq files, do nothing!\n"); | 
|     char *out = cJSON_Print(base_json); | 
|     return out; | 
|   } | 
|   | 
|   for (int i = 0; i < cJSON_GetArraySize(base_json); i++) { | 
|     printf("[%d]:", i); | 
|     cJSON *item = cJSON_GetArrayItem(base_json, i); | 
|     if (cJSON_Invalid != item->type) { | 
|       printf("[%s]\n", item->string); | 
|       // printJson(item); | 
|     } | 
|   } | 
|   | 
|   out_json = cJSON_Duplicate(base_json, 1); | 
|   | 
|   // FIXME: memery leack issue | 
|   for (int i = 0; i < cJSON_GetArraySize(fragment_json); i++) { | 
|     printf("[%d]:", i); | 
|     cJSON *item = cJSON_GetArrayItem(fragment_json, i); | 
|     if (cJSON_Invalid != item->type) { | 
|       printf("[%s]\n", item->string); | 
|       // printJson(item); | 
|       cJSON_ReplaceItemInObjectCaseSensitive(out_json, item->string, | 
|                                              cJSON_Duplicate(item, 1)); | 
|     } | 
|   } | 
|   | 
|   printf("new json:>\n%s\n", cJSON_Print(out_json)); | 
|   | 
|   cJSON_Delete(base_json); | 
|   cJSON_Delete(fragment_json); | 
|   | 
|   return cJSON_Print(out_json); | 
| } | 
|   | 
| const char *RkAiqSceneManager::getSceneIQ(AiqScene scene) { | 
|   if (access(scene.first.c_str(), F_OK)) { | 
|     printf("[RkAiqSceneManager]: access %s failed\n", scene.first.c_str()); | 
|     return NULL; | 
|   } | 
|   | 
|   if (access(scene.second.c_str(), F_OK)) { | 
|     printf("[RkAiqSceneManager]: access %s failed\n", scene.first.c_str()); | 
|     return NULL; | 
|   } | 
|   | 
|   return getSceneIQ(scene.first.c_str(), scene.second.c_str()); | 
| } | 
|   | 
| const char *RkAiqSceneManager::getSceneIQ(const char *scene) { | 
|   return getSceneIQ(matchScene(scene)); | 
| } | 
|   | 
| int RkAiqSceneManager::addScene(CamCalibDbProj_t *calibproj, | 
|                                 const char *main_scene, const char *sub_scene, | 
|                                 CamCalibDbV2Context_t *calib) { | 
|   return 0; | 
| } | 
|   | 
| void* | 
| RkAiqSceneManager::refToScene(CamCalibDbProj_t *calibproj, | 
|                               const char *main_scene, const char *sub_scene) { | 
|   CamCalibMainSceneList_t *main_list = nullptr; | 
|   CamCalibSubSceneList_t *sub_list = nullptr; | 
|   void* dst_calib = nullptr; | 
|   int main_list_len = -1; | 
|   int sub_list_len = -1; | 
|   int curr_main_scene = 0; | 
|   int curr_sub_scene = 0; | 
|   | 
|   if (!calibproj) { | 
|     printf("No avaliable CamCalibDbProj loadded!\n"); | 
|     return nullptr; | 
|   } | 
|   | 
|   main_list = calibproj->main_scene; | 
|   main_list_len = calibproj->main_scene_len; | 
|   | 
|   if (!main_list || main_list_len < 1) { | 
|     printf("No avaliable main scene!\n"); | 
|     return nullptr; | 
|   } | 
|   | 
|   // Find main scene | 
|   for (curr_main_scene = 0; curr_main_scene < main_list_len; | 
|        curr_main_scene++) { | 
|     if (0 == strcmp(main_list[curr_main_scene].name, main_scene)) { | 
|       // Found what we want, and this must be the only one. | 
|       sub_list = main_list[curr_main_scene].sub_scene; | 
|       sub_list_len = main_list[curr_main_scene].sub_scene_len; | 
|       break; | 
|     } | 
|   } | 
|   | 
|   if (!sub_list || sub_list_len < 1) { | 
|     printf("No avaliable main scene!\n"); | 
|     return nullptr; | 
|   } | 
|   | 
|   // Find sub scene | 
|   for (curr_sub_scene = 0; curr_sub_scene < sub_list_len; curr_sub_scene++) { | 
|     if (0 != strcmp(sub_list[curr_sub_scene].name, sub_scene)) { | 
|       // Not what we want | 
|       continue; | 
|     } | 
|     dst_calib = calibdbv2_get_scene_ptr(&sub_list[curr_sub_scene]); | 
|     return dst_calib; | 
|   } | 
|   | 
|   printf("Can't find scene:[%s]/[%s]!\n", main_scene, sub_scene); | 
|   | 
|   return nullptr; | 
| } | 
|   | 
| } // namespace RkCam |