/* * 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 #include #include #include namespace RkCam { std::map 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