/* * Copyright (c) 2019-2021 Rockchip Eletronics Co., Ltd. * * 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 "rk_aiq_user_api_sysctl.h" #include "rk_aiq_api_private.h" #include "RkAiqManager.h" #include "socket_server.h" #include "RkAiqCalibDbV2.h" #include "scene/scene_manager.h" #include "rkaiq_ini.h" #ifdef RK_SIMULATOR_HW #include "simulator/CamHwSimulator.h" #else #include "isp20/CamHwIsp20.h" #include "fakecamera/FakeCamHwIsp20.h" #include "isp20/Isp20_module_dbg.h" #include "isp21/CamHwIsp21.h" #include "isp3x/CamHwIsp3x.h" #endif using namespace RkCam; using namespace XCam; #define RKAIQSYS_CHECK_RET(cond, ret, format, ...) \ if ((cond)) { \ LOGE(format, ##__VA_ARGS__); \ return ret; \ } #define RKAIQ_DEFAULT_IQ_PATH "/etc/iqfiles/" RKAIQ_BEGIN_DECLARE int g_rkaiq_isp_hw_ver = 0; rk_aiq_sys_ctx_t* get_next_ctx(const rk_aiq_sys_ctx_t* ctx) { if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) return nullptr; else return ctx->next_ctx; } rk_aiq_camgroup_ctx_t* get_binded_group_ctx(const rk_aiq_sys_ctx_t* ctx) { #ifdef RKAIQ_ENABLE_CAMGROUP if (ctx->_camGroupManager) return (rk_aiq_camgroup_ctx_t*)ctx->_camGroupManager->getContainerCtx(); else #endif return NULL; } void rk_aiq_ctx_set_tool_mode(const rk_aiq_sys_ctx_t* ctx, bool status) { if (!ctx) return; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) if(camCtx && camCtx->_socket) camCtx->_socket->tool_mode_set(status); #endif } else if(ctx->_socket) { ctx->_socket->tool_mode_set(status); } } bool is_ctx_need_bypass(const rk_aiq_sys_ctx_t* ctx) { if (!ctx) return true; /* TODO: remove the uapi enable check for the tool that configure the uapi in real time */ return false; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if(camCtx && camCtx->_socket) { if (camCtx->_socket->is_connected() && \ camCtx->ctx_type != CTX_TYPE_TOOL_SERVER) { return true; } } } } else { if(ctx->_socket) { if (ctx->_socket->is_connected() && \ ctx->ctx_type != CTX_TYPE_TOOL_SERVER) { return true; } } } return false; } typedef struct rk_aiq_sys_preinit_cfg_s { rk_aiq_working_mode_t mode; std::string force_iq_file; std::string main_scene; std::string sub_scene; rk_aiq_hwevt_cb hwevt_cb; void* hwevt_cb_ctx; rk_aiq_sys_preinit_cfg_s() { hwevt_cb = NULL; hwevt_cb_ctx = NULL; }; } rk_aiq_sys_preinit_cfg_t; static std::map g_rk_aiq_sys_preinit_cfg_map; XCamReturn rk_aiq_uapi_sysctl_preInit(const char* sns_ent_name, rk_aiq_working_mode_t mode, const char* force_iq_file) { std::string sns_ent_name_str(sns_ent_name); rk_aiq_sys_preinit_cfg_t cfg; cfg.mode = mode; if (force_iq_file) cfg.force_iq_file = force_iq_file; g_rk_aiq_sys_preinit_cfg_map[sns_ent_name_str] = cfg; return XCAM_RETURN_NO_ERROR; } XCamReturn rk_aiq_uapi_sysctl_preInit_scene(const char* sns_ent_name, const char *main_scene, const char *sub_scene) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if (!sns_ent_name || !main_scene || !sub_scene) { LOGE("Invalid input parameter"); return XCAM_RETURN_ERROR_PARAM; } std::string sns_ent_name_str(sns_ent_name); LOGI("main_scene: %s, sub_scene: %s", main_scene, sub_scene); g_rk_aiq_sys_preinit_cfg_map[sns_ent_name_str].main_scene = main_scene; g_rk_aiq_sys_preinit_cfg_map[sns_ent_name_str].sub_scene = sub_scene; return (ret); } static int rk_aiq_offline_init(rk_aiq_sys_ctx_t* ctx) { XCamReturn ret = XCAM_RETURN_NO_ERROR; char* use_as_fake_cam_env = getenv("USE_AS_FAKE_CAM"); ini_t* aiq_ini = rkaiq_ini_load(OFFLINE_INI_FILE); ENTER_XCORE_FUNCTION(); if (aiq_ini) { const char* raw_offline_str = rkaiq_ini_get(aiq_ini, "rkaiq", "offline"); const char* raw_w_str = rkaiq_ini_get(aiq_ini, "rkaiq", "width"); const char* raw_h_str = rkaiq_ini_get(aiq_ini, "rkaiq", "height"); const char* raw_fmt_str = rkaiq_ini_get(aiq_ini, "rkaiq", "format"); bool offline = atoi(raw_offline_str) > 0 ? true : false; int raw_w = atoi(raw_w_str); int raw_h = atoi(raw_h_str); // valid offline mode if (offline && raw_w && raw_h && raw_fmt_str) { ctx->_raw_prop.frame_width = raw_w; ctx->_raw_prop.frame_height = raw_h; ctx->_raw_prop.rawbuf_type = RK_AIQ_RAW_FILE; ctx->_use_fakecam = true; if (strcmp(raw_fmt_str, "BG10") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SBGGR10; else if (strcmp(raw_fmt_str, "GB10") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGBRG10; else if (strcmp(raw_fmt_str, "RG10") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SRGGB10; else if (strcmp(raw_fmt_str, "BA10") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGRBG10; else if (strcmp(raw_fmt_str, "BG12") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SBGGR12; else if (strcmp(raw_fmt_str, "GB12") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGBRG12; else if (strcmp(raw_fmt_str, "RG12") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SRGGB12; else if (strcmp(raw_fmt_str, "BA12") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGRBG12; else if (strcmp(raw_fmt_str, "BG14") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SBGGR14; else if (strcmp(raw_fmt_str, "GB14") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGBRG14; else if (strcmp(raw_fmt_str, "RG14") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SRGGB14; else if (strcmp(raw_fmt_str, "BA14") == 0) ctx->_raw_prop.format = RK_PIX_FMT_SGRBG14; else ctx->_raw_prop.format = RK_PIX_FMT_SBGGR10; } rkaiq_ini_free(aiq_ini); } if (use_as_fake_cam_env) ctx->_use_fakecam = atoi(use_as_fake_cam_env) > 0 ? true : false; EXIT_XCORE_FUNCTION(); return ret; } static void rk_aiq_uapi_sysctl_deinit_locked(rk_aiq_sys_ctx_t* ctx); rk_aiq_sys_ctx_t* rk_aiq_uapi_sysctl_init(const char* sns_ent_name, const char* config_file_dir, rk_aiq_error_cb err_cb, rk_aiq_metas_cb metas_cb) { XCamReturn ret = XCAM_RETURN_NO_ERROR; ENTER_XCORE_FUNCTION(); char config_file[256]; std::string main_scene; std::string sub_scene; XCAM_ASSERT(sns_ent_name); bool is_ent_name = true; if (sns_ent_name[0] != 'm' || sns_ent_name[3] != '_') is_ent_name = false; if (!is_ent_name) { if (config_file_dir && (strlen(config_file_dir) > 0)) sprintf(config_file, "%s/%s.xml", config_file_dir, sns_ent_name); else sprintf(config_file, "%s/%s.xml", RKAIQ_DEFAULT_IQ_PATH, sns_ent_name); } rk_aiq_sys_ctx_t* ctx = new rk_aiq_sys_ctx_t(); RKAIQSYS_CHECK_RET(!ctx, NULL, "malloc main ctx error !"); ctx->_apiMutex = new Mutex(); RKAIQ_API_SMART_LOCK(ctx); ctx->_sensor_entity_name = strndup(sns_ent_name, 128); RKAIQSYS_CHECK_RET(!ctx->_sensor_entity_name, NULL, "dup sensor name error !"); ctx->_rkAiqManager = new RkAiqManager(ctx->_sensor_entity_name, err_cb, metas_cb); std::map::iterator it = g_rk_aiq_sys_preinit_cfg_map.find(std::string(ctx->_sensor_entity_name)); if (it != g_rk_aiq_sys_preinit_cfg_map.end()) ctx->_rkAiqManager->setHwEvtCb(it->second.hwevt_cb, it->second.hwevt_cb_ctx); rk_aiq_static_info_t* s_info = CamHwIsp20::getStaticCamHwInfo(sns_ent_name); ctx->_rkAiqManager->setCamPhyId(s_info->sensor_info.phyId); ctx->_camPhyId = s_info->sensor_info.phyId; #ifdef RK_SIMULATOR_HW ctx->_camHw = new CamHwSimulator(); #else rk_aiq_offline_init(ctx); if (strstr(sns_ent_name, "FakeCamera") || ctx->_use_fakecam) { //ctx->_camHw = new FakeCamHwIsp20(); if (s_info->isp_hw_ver == 4) ctx->_camHw = new FakeCamHwIsp20 (); else if (s_info->isp_hw_ver == 5) ctx->_camHw = new FakeCamHwIsp21 (); else if (s_info->isp_hw_ver == 6) ctx->_camHw = new FakeCamHwIsp3x (); else { LOGE("do not support this isp hw version %d !", s_info->isp_hw_ver); goto error; } } else { if (s_info->isp_hw_ver == 4) ctx->_camHw = new CamHwIsp20(); else if (s_info->isp_hw_ver == 5) ctx->_camHw = new CamHwIsp21(); else if (s_info->isp_hw_ver == 6) ctx->_camHw = new CamHwIsp3x(); else { LOGE("do not support this isp hw version %d !", s_info->isp_hw_ver); goto error; } } // use user defined iq file { std::map::iterator it = g_rk_aiq_sys_preinit_cfg_map.find(std::string(ctx->_sensor_entity_name)); int user_hdr_mode = -1; bool user_spec_iq = false; if (it != g_rk_aiq_sys_preinit_cfg_map.end()) { if (!it->second.force_iq_file.empty()) { sprintf(config_file, "%s/%s", config_file_dir, it->second.force_iq_file.c_str()); LOGI("use user sepcified iq file %s", config_file); user_spec_iq = true; } else { user_hdr_mode = it->second.mode; LOGI("selected by user sepcified hdr mode %d", user_hdr_mode); } if (!it->second.main_scene.empty()) main_scene = it->second.main_scene; if (!it->second.sub_scene.empty()) sub_scene = it->second.sub_scene; } // use auto selected iq file if (is_ent_name && !user_spec_iq) { char iq_file[128] = {'\0'}; CamHwIsp20::selectIqFile(sns_ent_name, iq_file); char* hdr_mode = getenv("HDR_MODE"); int start = strlen(iq_file) - strlen(".xml"); if (hdr_mode) { iq_file[start] = '\0'; if (strstr(hdr_mode, "32")) strcat(iq_file, "-hdr3.xml"); else strcat(iq_file, "_normal.xml"); } if (config_file_dir) { sprintf(config_file, "%s/%s", config_file_dir, iq_file); } else { sprintf(config_file, "%s/%s", RKAIQ_DEFAULT_IQ_PATH, iq_file); } // use default iq file if (hdr_mode && access(config_file, F_OK)) { LOGW("%s not exist, will use the default !", config_file); if (strstr(hdr_mode, "32")) start = strlen(config_file) - strlen("-hdr3.xml"); else start = strlen(config_file) - strlen("_normal.xml"); config_file[start] = '\0'; strcat(config_file, ".xml"); } LOGI("use iq file %s", config_file); } } #endif ctx->_camHw->setCamPhyId(s_info->sensor_info.phyId); ctx->_rkAiqManager->setCamHw(ctx->_camHw); if (s_info->isp_hw_ver == 4) ctx->_analyzer = new RkAiqCore(0); else if (s_info->isp_hw_ver == 5) ctx->_analyzer = new RkAiqCore(1); else if (s_info->isp_hw_ver == 6) ctx->_analyzer = new RkAiqCore(3); #ifndef RK_SIMULATOR_HW ctx->_hw_info.fl_supported = s_info->has_fl; ctx->_hw_info.irc_supported = s_info->has_irc; ctx->_hw_info.lens_supported = s_info->has_lens_vcm; ctx->_hw_info.fl_strth_adj = s_info->fl_strth_adj_sup; ctx->_hw_info.fl_ir_strth_adj = s_info->fl_ir_strth_adj_sup; ctx->_hw_info.is_multi_isp_mode = s_info->is_multi_isp_mode; ctx->_hw_info.multi_isp_extended_pixel = s_info->multi_isp_extended_pixel; ctx->_hw_info.module_rotation = RK_PS_SrcOverlapPosition_0; #endif ctx->_analyzer->setHwInfos(ctx->_hw_info); ctx->_analyzer->setCamPhyId(s_info->sensor_info.phyId); if (is_ent_name && config_file_dir) { ctx->_analyzer->setResrcPath(config_file_dir); } else ctx->_analyzer->setResrcPath(RKAIQ_DEFAULT_IQ_PATH); ctx->_rkAiqManager->setAnalyzer(ctx->_analyzer); ctx->_lumaAnalyzer = new RkLumaCore(); ctx->_rkAiqManager->setLumaAnalyzer(ctx->_lumaAnalyzer); //ctx->_calibDb = RkAiqCalibDb::createCalibDb(config_file); ctx->_socket = new SocketServer(); //if (!ctx->_calibDb) // goto error; //ctx->_rkAiqManager->setAiqCalibDb(ctx->_calibDb); if (strstr(config_file, ".xml")) { LOGE("Should use json instead of xml"); strcpy(config_file + strlen(config_file) - strlen(".xml"), ".json"); } CamCalibDbV2Context_t calibdbv2_ctx; xcam_mem_clear (calibdbv2_ctx); ctx->_calibDbProj = RkAiqCalibDbV2::createCalibDbProj(config_file); if (!ctx->_calibDbProj) goto error; if (!main_scene.empty() && !sub_scene.empty()) calibdbv2_ctx = RkAiqSceneManager::refToScene(ctx->_calibDbProj, main_scene.c_str(), sub_scene.c_str()); if (!calibdbv2_ctx.calib_scene) { LOGE("Failed to find params of %s:%s scene in json, using default scene", main_scene.c_str(), sub_scene.c_str()); calibdbv2_ctx = RkAiqCalibDbV2::toDefaultCalibDb(ctx->_calibDbProj); } ctx->_rkAiqManager->setAiqCalibDb(&calibdbv2_ctx); ret = ctx->_rkAiqManager->init(); ctx->_socket->Process(ctx); if (ret) goto error; ctx->ctx_type = CTX_TYPE_USER_MAIN; ctx->next_ctx = new rk_aiq_sys_ctx_t(); RKAIQSYS_CHECK_RET(!ctx, NULL, "malloc toolserver ctx error !"); *(ctx->next_ctx) = *ctx; ctx->next_ctx->ctx_type = CTX_TYPE_TOOL_SERVER; ctx->next_ctx->next_ctx = NULL; ctx->cam_type = RK_AIQ_CAM_TYPE_SINGLE; EXIT_XCORE_FUNCTION(); return ctx; error: LOGE("_rkAiqManager init error!"); rk_aiq_uapi_sysctl_deinit_locked(ctx); return NULL; } void rk_aiq_uapi_sysctl_deinit_locked(rk_aiq_sys_ctx_t* ctx) { std::map::iterator it = g_rk_aiq_sys_preinit_cfg_map.find(std::string(ctx->_sensor_entity_name)); if (it != g_rk_aiq_sys_preinit_cfg_map.end()) { g_rk_aiq_sys_preinit_cfg_map.erase(it); LOGI("unset user specific iq file."); } if (ctx->_rkAiqManager.ptr()) ctx->_rkAiqManager->deInit(); ctx->_socket->Deinit(); delete(ctx->_socket); ctx->_analyzer.release(); ctx->_lumaAnalyzer.release(); ctx->_rkAiqManager.release(); ctx->_camHw.release(); if (ctx->_calibDbProj) { // TODO:public common resource release } if (ctx->next_ctx) { delete ctx->next_ctx; } if (ctx->_sensor_entity_name) xcam_free((void*)(ctx->_sensor_entity_name)); } void rk_aiq_uapi_sysctl_deinit(rk_aiq_sys_ctx_t* ctx) { ENTER_XCORE_FUNCTION(); { RKAIQ_API_SMART_LOCK(ctx); rk_aiq_uapi_sysctl_deinit_locked(ctx); } delete ctx; EXIT_XCORE_FUNCTION(); } XCamReturn rk_aiq_uapi_sysctl_prepare(const rk_aiq_sys_ctx_t* ctx, uint32_t width, uint32_t height, rk_aiq_working_mode_t mode) { ENTER_XCORE_FUNCTION(); XCAM_ASSERT(ctx != nullptr); if (ctx->_use_fakecam && ctx->_raw_prop.format && ctx->_raw_prop.frame_width && ctx->_raw_prop.frame_height && ctx->_raw_prop.rawbuf_type) { rk_aiq_uapi_sysctl_prepareRkRaw(ctx, ctx->_raw_prop); } RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = ctx->_rkAiqManager->prepare(width, height, mode); RKAIQSYS_CHECK_RET(ret, ret, "prepare failed !"); EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_start(const rk_aiq_sys_ctx_t* ctx) { ENTER_XCORE_FUNCTION(); RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = ctx->_rkAiqManager->start(); EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_stop(const rk_aiq_sys_ctx_t* ctx, bool keep_ext_hw_st) { ENTER_XCORE_FUNCTION(); RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = ctx->_rkAiqManager->stop(keep_ext_hw_st); EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_getStaticMetas(const char* sns_ent_name, rk_aiq_static_info_t* static_info) { if (!sns_ent_name || !static_info) return XCAM_RETURN_ERROR_FAILED; #ifdef RK_SIMULATOR_HW /* nothing to do now*/ static_info = NULL; #else memcpy(static_info, CamHwIsp20::getStaticCamHwInfo(sns_ent_name), sizeof(rk_aiq_static_info_t)); #endif return XCAM_RETURN_NO_ERROR; } XCamReturn rk_aiq_uapi_sysctl_enumStaticMetas(int index, rk_aiq_static_info_t* static_info) { if (!static_info) return XCAM_RETURN_ERROR_FAILED; #ifdef RK_SIMULATOR_HW /* nothing to do now*/ static_info = NULL; #else rk_aiq_static_info_t* tmp = CamHwIsp20::getStaticCamHwInfo(NULL, index); if (tmp) memcpy(static_info, tmp, sizeof(rk_aiq_static_info_t)); else return XCAM_RETURN_ERROR_OUTOFRANGE; #endif return XCAM_RETURN_NO_ERROR; } const char* rk_aiq_uapi_sysctl_getBindedSnsEntNmByVd(const char* vd) { #ifndef RK_SIMULATOR_HW return CamHwIsp20::getBindedSnsEntNmByVd(vd); #endif return NULL; } XCamReturn rk_aiq_uapi_sysctl_getMetaData(const rk_aiq_sys_ctx_t* ctx, uint32_t frame_id, rk_aiq_metas_t* metas) { // TODO return XCAM_RETURN_ERROR_FAILED; } XCamReturn rk_aiq_uapi_sysctl_regLib(const rk_aiq_sys_ctx_t* ctx, RkAiqAlgoDesComm* algo_lib_des) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->addAlgo(*algo_lib_des); #else return XCAM_RETURN_ERROR_FAILED; #endif } else return ctx->_analyzer->addAlgo(*algo_lib_des); } XCamReturn rk_aiq_uapi_sysctl_unRegLib(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->rmAlgo(algo_type, lib_id); #else return XCAM_RETURN_ERROR_FAILED; #endif } else return ctx->_analyzer->rmAlgo(algo_type, lib_id); } XCamReturn rk_aiq_uapi_sysctl_enableAxlib(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id, bool enable) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->enableAlgo(algo_type, lib_id, enable); #else return XCAM_RETURN_ERROR_FAILED; #endif } else { return ctx->_analyzer->enableAlgo(algo_type, lib_id, enable); } } bool rk_aiq_uapi_sysctl_getAxlibStatus(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->getAxlibStatus(algo_type, lib_id); #else return false; #endif } else return ctx->_analyzer->getAxlibStatus(algo_type, lib_id); } RkAiqAlgoContext* rk_aiq_uapi_sysctl_getEnabledAxlibCtx(const rk_aiq_sys_ctx_t* ctx, const int algo_type) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->getEnabledAxlibCtx(algo_type); #else return nullptr; #endif } else return ctx->_analyzer->getEnabledAxlibCtx(algo_type); } RkAiqAlgoContext* rk_aiq_uapi_sysctl_getAxlibCtx(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* group_ctx = (const rk_aiq_camgroup_ctx_t*)ctx; return group_ctx->cam_group_manager->getAxlibCtx(algo_type, lib_id); #else return nullptr; #endif } else return ctx->_analyzer->getAxlibCtx(algo_type, lib_id); } XCamReturn rk_aiq_uapi_sysctl_get3AStats(const rk_aiq_sys_ctx_t* ctx, rk_aiq_isp_stats_t *stats) { RKAIQ_API_SMART_LOCK(ctx); return ctx->_analyzer->get3AStatsFromCachedList(*stats); } XCamReturn rk_aiq_uapi_sysctl_get3AStatsBlk(const rk_aiq_sys_ctx_t* ctx, rk_aiq_isp_stats_t **stats, int timeout_ms) { // blocked API, add lock ? //RKAIQ_API_SMART_LOCK(ctx); return ctx->_analyzer->get3AStatsFromCachedList(stats, timeout_ms); } void rk_aiq_uapi_sysctl_release3AStatsRef(const rk_aiq_sys_ctx_t* ctx, rk_aiq_isp_stats_t *stats) { RKAIQ_API_SMART_LOCK(ctx); ctx->_analyzer->release3AStatsRef(stats); } RKAIQ_END_DECLARE template static T* algoHandle(const rk_aiq_sys_ctx_t* ctx, const int algo_type) { T* algo_handle = NULL; RkCam::RkAiqHandle* handle = const_cast(ctx->_analyzer->getAiqAlgoHandle(algo_type)); XCAM_ASSERT(handle); int algo_id = handle->getAlgoId(); if (algo_id == 0) algo_handle = dynamic_cast(handle); return algo_handle; } #ifdef RKAIQ_ENABLE_CAMGROUP template static T* camgroupAlgoHandle(const rk_aiq_sys_ctx_t* ctx, const int algo_type) { T* algo_handle = NULL; const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; RkCam::RkAiqCamgroupHandle* handle = const_cast(camgroup_ctx->cam_group_manager->getAiqCamgroupHandle(algo_type, 0)); if (!handle) return NULL; int algo_id = handle->getAlgoId(); if (algo_id == 0) algo_handle = dynamic_cast(handle); return algo_handle; } #endif #include "RkAiqVersion.h" #include "RkAiqCalibVersion.h" #include "rk_aiq_user_api_awb.cpp" #include "rk_aiq_user_api_adebayer.cpp" #include "rk_aiq_user_api2_adebayer.cpp" #include "rk_aiq_user_api_ahdr.cpp" #include "uAPI2/rk_aiq_user_api2_amerge.cpp" #include "uAPI2/rk_aiq_user_api2_atmo.cpp" #include "uAPI2/rk_aiq_user_api2_adrc.cpp" #include "rk_aiq_user_api_alsc.cpp" #include "rk_aiq_user_api_accm.cpp" #include "rk_aiq_user_api_a3dlut.cpp" #include "rk_aiq_user_api_adehaze.cpp" #include "uAPI2/rk_aiq_user_api2_adehaze.cpp" #include "uAPI2/rk_aiq_user_api2_adpcc.cpp" #include "rk_aiq_user_api_agamma.cpp" #include "uAPI2/rk_aiq_user_api2_agamma.cpp" #include "uAPI2/rk_aiq_user_api2_adegamma.cpp" #include "uAPI2/rk_aiq_user_api2_ablc.cpp" #include "rk_aiq_user_api_adpcc.cpp" #include "rk_aiq_user_api_ae.cpp" #include "uAPI2/rk_aiq_user_api2_ae.cpp" #include "rk_aiq_user_api_anr.cpp" #include "rk_aiq_user_api_asharp.cpp" #include "rk_aiq_user_api_imgproc.cpp" #include "uAPI2/rk_aiq_user_api2_imgproc.cpp" #include "rk_aiq_user_api_afec.cpp" #include "rk_aiq_user_api_af.cpp" #include "uAPI2/rk_aiq_user_api2_af.cpp" #include "rk_aiq_user_api_asd.cpp" #include "rk_aiq_user_api_aldch.cpp" #include "rk_aiq_user_api2_aldch.cpp" #include "rk_aiq_user_api_acp.cpp" #include "rk_aiq_user_api2_acp.cpp" #include "rk_aiq_user_api_aie.cpp" #include "rk_aiq_user_api2_aie.cpp" #include "rk_aiq_user_api_aeis.cpp" #include "rk_aiq_user_api_abayernr_v2.cpp" #include "rk_aiq_user_api_aynr_v2.cpp" #include "rk_aiq_user_api_acnr_v1.cpp" #include "rk_aiq_user_api_asharp_v3.cpp" #include "uAPI2/rk_aiq_user_api2_abayernr_v2.cpp" #include "uAPI2/rk_aiq_user_api2_aynr_v2.cpp" #include "uAPI2/rk_aiq_user_api2_acnr_v1.cpp" #include "uAPI2/rk_aiq_user_api2_asharp_v3.cpp" #include "uAPI2/rk_aiq_user_api2_anr.cpp" #include "uAPI2/rk_aiq_user_api2_awb.cpp" #include "uAPI2/rk_aiq_user_api2_alsc.cpp" #include "uAPI2/rk_aiq_user_api2_accm.cpp" #include "uAPI2/rk_aiq_user_api2_a3dlut.cpp" #include "rk_aiq_user_api2_afec.cpp" #include "uAPI/rk_aiq_user_api_agic.cpp" #include "uAPI2/rk_aiq_user_api2_camgroup.cpp" #include "uAPI2/rk_aiq_user_api2_agic.cpp" #include "rk_aiq_user_api2_custom_ae.cpp" #include "rk_aiq_user_api2_custom_awb.cpp" #include "uAPI2/rk_aiq_user_api2_aynr_v3.cpp" #include "rk_aiq_user_api_aynr_v3.cpp" #include "uAPI2/rk_aiq_user_api2_acnr_v2.cpp" #include "rk_aiq_user_api_acnr_v2.cpp" #include "uAPI2/rk_aiq_user_api2_asharp_v4.cpp" #include "rk_aiq_user_api_asharp_v4.cpp" #include "uAPI2/rk_aiq_user_api2_abayer2dnr_v2.cpp" #include "rk_aiq_user_api_abayer2dnr_v2.cpp" #include "uAPI2/rk_aiq_user_api2_abayertnr_v2.cpp" #include "rk_aiq_user_api_abayertnr_v2.cpp" #include "uAPI2/rk_aiq_user_api2_acsm.cpp" #include "uAPI2/rk_aiq_user_api2_again_v2.cpp" #include "rk_aiq_user_api_again_v2.cpp" #define RK_AIQ_ALGO_TYPE_MODULES (RK_AIQ_ALGO_TYPE_MAX + 1) XCamReturn rk_aiq_uapi_sysctl_setModuleCtl(const rk_aiq_sys_ctx_t* ctx, rk_aiq_module_id_t mId, bool mod_en) { ENTER_XCORE_FUNCTION(); CHECK_USER_API_ENABLE2(ctx); CHECK_USER_API_ENABLE(RK_AIQ_ALGO_TYPE_MODULES); RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (mId > RK_MODULE_INVAL && mId < RK_MODULE_MAX) { if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->setModuleCtl(mId, mod_en); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->setModuleCtl(mId, mod_en); } } EXIT_XCORE_FUNCTION(); return ret; } int32_t rk_aiq_uapi_sysctl_getModuleCtl(const rk_aiq_sys_ctx_t* ctx, rk_aiq_module_id_t mId, bool *mod_en) { ENTER_XCORE_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; bool en; ret = ctx->_rkAiqManager->getModuleCtl(mId, en); *mod_en = en; return ret; } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { NULL_RETURN_RET(ctx, -1); NULL_RETURN_RET(ctx->_rkAiqManager.ptr(), -1); bool en; ret = ctx->_rkAiqManager->getModuleCtl(mId, en); *mod_en = en; } EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_setCpsLtCfg(const rk_aiq_sys_ctx_t* ctx, rk_aiq_cpsl_cfg_t* cfg) { RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_analyzer->setCpsLtCfg(*cfg); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_analyzer->setCpsLtCfg(*cfg); } return ret; } XCamReturn rk_aiq_uapi_sysctl_getCpsLtInfo(const rk_aiq_sys_ctx_t* ctx, rk_aiq_cpsl_info_t* info) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; return camCtx->_analyzer->getCpsLtInfo(*info); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { return ctx->_analyzer->getCpsLtInfo(*info); } return XCAM_RETURN_ERROR_FAILED; } XCamReturn rk_aiq_uapi_sysctl_queryCpsLtCap(const rk_aiq_sys_ctx_t* ctx, rk_aiq_cpsl_cap_t* cap) { RKAIQ_API_SMART_LOCK(ctx); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; return camCtx->_analyzer->queryCpsLtCap(*cap); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { return ctx->_analyzer->queryCpsLtCap(*cap); } return XCAM_RETURN_ERROR_FAILED; } extern RkAiqAlgoDescription g_RkIspAlgoDescAe; extern RkAiqAlgoDescription g_RkIspAlgoDescAwb; extern RkAiqAlgoDescription g_RkIspAlgoDescAf; extern RkAiqAlgoDescription g_RkIspAlgoDescAmerge; extern RkAiqAlgoDescription g_RkIspAlgoDescAtmo; static void _print_versions() { LOGI("\n" "************************** VERSION INFOS **************************\n" "version release date: %s\n" " AIQ: %s\n" " IQ PARSER: %s\n" "************************ VERSION INFOS END ************************\n" , RK_AIQ_RELEASE_DATE , RK_AIQ_VERSION , RK_AIQ_CALIB_VERSION ); } void rk_aiq_uapi_get_version_info(rk_aiq_ver_info_t* vers) { uint32_t iq_parser_magic_code; xcam_mem_clear (*vers); const char* ver_str = RK_AIQ_CALIB_VERSION; const char* start = ver_str + strlen(RK_AIQ_CALIB_VERSION_HEAD); const char* stop = strstr(ver_str, RK_AIQ_CALIB_VERSION_MAGIC_JOINT); // TODO: use strncpy instead of memcpy, but has compile warning now memcpy(vers->iq_parser_ver, start, stop - start); start = strstr(ver_str, RK_AIQ_CALIB_VERSION_MAGIC_CODE_HEAD) + strlen(RK_AIQ_CALIB_VERSION_MAGIC_CODE_HEAD); vers->iq_parser_magic_code = atoi(start); ver_str = RK_AIQ_VERSION; start = ver_str + strlen(RK_AIQ_VERSION_HEAD); strcpy(vers->aiq_ver, start); strcpy(vers->awb_algo_ver, g_RkIspAlgoDescAwb.common.version); strcpy(vers->ae_algo_ver, g_RkIspAlgoDescAe.common.version); strcpy(vers->af_algo_ver, g_RkIspAlgoDescAf.common.version); strcpy(vers->ahdr_algo_ver, g_RkIspAlgoDescAmerge.common.version); strcpy(vers->ahdr_algo_ver, g_RkIspAlgoDescAtmo.common.version); LOGI("aiq ver %s, parser ver %s, magic code %d, awb ver %s\n" "ae ver %s, af ver %s, ahdr ver %s", vers->aiq_ver, vers->iq_parser_ver, vers->iq_parser_magic_code, vers->awb_algo_ver, vers->ae_algo_ver, vers->af_algo_ver, vers->ahdr_algo_ver); } static void rk_aiq_init_lib(void) __attribute__((constructor)); static void rk_aiq_init_lib(void) { xcam_get_log_level(); ENTER_XCORE_FUNCTION(); #ifdef RK_SIMULATOR_HW /* nothing to do now */ #else CamHwIsp20::initCamHwInfos(); rk_aiq_static_info_t* s_info = CamHwIsp20::getStaticCamHwInfo(NULL, 0); if (s_info != nullptr) { if (s_info->isp_hw_ver == 4) g_rkaiq_isp_hw_ver = 20; else if (s_info->isp_hw_ver == 5) g_rkaiq_isp_hw_ver = 21; else if (s_info->isp_hw_ver == 6) g_rkaiq_isp_hw_ver = 30; else LOGE("do not support isp hw ver %d now !", s_info->isp_hw_ver); } #endif #if defined(ISP_HW_V20) assert(g_rkaiq_isp_hw_ver == 20); #elif defined(ISP_HW_V21) assert(g_rkaiq_isp_hw_ver == 21); #elif defined(ISP_HW_V30) assert(g_rkaiq_isp_hw_ver == 30); #else #error "WRONG ISP_HW_VERSION, ONLY SUPPORT V20 AND V21 NOW !" #endif _print_versions(); EXIT_XCORE_FUNCTION(); } static void rk_aiq_deinit_lib(void) __attribute__((destructor)); static void rk_aiq_deinit_lib(void) { ENTER_XCORE_FUNCTION(); #ifdef RK_SIMULATOR_HW /* nothing to do now */ #else RkAiqCalibDbV2::releaseCalibDbProj(); #ifdef RKAIQ_ENABLE_PARSER_V1 RkAiqCalibDb::releaseCalibDb(); #endif CamHwIsp20::clearStaticCamHwInfo(); #endif EXIT_XCORE_FUNCTION(); } XCamReturn rk_aiq_uapi_sysctl_enqueueRkRawBuf(const rk_aiq_sys_ctx_t* ctx, void *rawdata, bool sync) { ENTER_XCORE_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->enqueueRawBuffer(rawdata, sync); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->enqueueRawBuffer(rawdata, sync); } EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_enqueueRkRawFile(const rk_aiq_sys_ctx_t* ctx, const char *path) { ENTER_XCORE_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->enqueueRawFile(path); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->enqueueRawFile(path); } EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_registRkRawCb(const rk_aiq_sys_ctx_t* ctx, void (*callback)(void*)) { ENTER_XCORE_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (callback == NULL) return XCAM_RETURN_ERROR_PARAM; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->registRawdataCb(callback); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->registRawdataCb(callback); } EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_prepareRkRaw(const rk_aiq_sys_ctx_t* ctx, rk_aiq_raw_prop_t prop) { ENTER_XCORE_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->rawdataPrepare(prop); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->rawdataPrepare(prop); } EXIT_XCORE_FUNCTION(); return ret; } XCamReturn rk_aiq_uapi_sysctl_setSharpFbcRotation(const rk_aiq_sys_ctx_t* ctx, rk_aiq_rotation_t rot) { ENTER_XCORE_FUNCTION(); RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_rkAiqManager->setSharpFbcRotation(rot); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = ctx->_rkAiqManager->setSharpFbcRotation(rot); } EXIT_XCORE_FUNCTION(); return ret; } /*! * \brief switch working mode dynamically * this aims to switch the isp pipeline working mode fast, and can be called on * streaming status. On non streaming status, should call rk_aiq_uapi_sysctl_prepare * instead of this to set working mode. */ XCamReturn rk_aiq_uapi_sysctl_swWorkingModeDyn(const rk_aiq_sys_ctx_t* ctx, rk_aiq_working_mode_t mode) { ENTER_XCORE_FUNCTION(); if (ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) return XCAM_RETURN_ERROR_FAILED; RKAIQ_API_SMART_LOCK(ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; /* ret = ctx->_rkAiqManager->swWorkingModeDyn(mode); */ ret = ctx->_rkAiqManager->swWorkingModeDyn_msg(mode); EXIT_XCORE_FUNCTION(); return ret; } void rk_aiq_uapi_sysctl_setMulCamConc(const rk_aiq_sys_ctx_t* ctx, bool cc) { ENTER_XCORE_FUNCTION(); RKAIQ_API_SMART_LOCK(ctx); ctx->_rkAiqManager->setMulCamConc(cc); EXIT_XCORE_FUNCTION(); } XCamReturn rk_aiq_uapi_sysctl_setCrop(const rk_aiq_sys_ctx_t* sys_ctx, rk_aiq_rect_t rect) { RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { #ifdef RKAIQ_ENABLE_CAMGROUP const rk_aiq_camgroup_ctx_t* camgroup_ctx = (rk_aiq_camgroup_ctx_t *)sys_ctx; for (auto camCtx : camgroup_ctx->cam_ctxs_array) { if (!camCtx) continue; ret = camCtx->_camHw->setSensorCrop(rect); } #else return XCAM_RETURN_ERROR_FAILED; #endif } else { ret = sys_ctx->_camHw->setSensorCrop(rect); } return ret; } XCamReturn rk_aiq_uapi_sysctl_getCrop(const rk_aiq_sys_ctx_t* sys_ctx, rk_aiq_rect_t* rect) { if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return XCAM_RETURN_ERROR_FAILED; } RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = sys_ctx->_camHw->getSensorCrop(*rect); return ret; } XCamReturn rk_aiq_uapi_sysctl_updateIq(rk_aiq_sys_ctx_t* sys_ctx, char* iqfile) { if (!sys_ctx) { LOGE("%s: sys_ctx is invalied\n", __func__); return XCAM_RETURN_ERROR_FAILED; } if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return XCAM_RETURN_ERROR_FAILED; } RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; LOGI("applying new iq file:%s\n", iqfile); auto calibDbProj = RkAiqCalibDbV2::createCalibDbProj(iqfile); if (!calibDbProj) { LOGE("failed to create CalibDbProj from iqfile\n"); return XCAM_RETURN_ERROR_PARAM; } CamCalibDbV2Context_t calibdbv2_ctx = RkAiqCalibDbV2::toDefaultCalibDb(calibDbProj); ret = sys_ctx->_rkAiqManager->updateCalibDb(&calibdbv2_ctx); if (ret) { LOGE("failed to update iqfile\n"); return ret; } sys_ctx->_calibDbProj = calibDbProj; return XCAM_RETURN_NO_ERROR; } XCamReturn rk_aiq_uapi_sysctl_tuning(const rk_aiq_sys_ctx_t* sys_ctx, char* param) { RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (!sys_ctx) { LOGE("%s: sys_ctx is invalied\n", __func__); return XCAM_RETURN_ERROR_FAILED; } if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return XCAM_RETURN_ERROR_FAILED; } // Find json patch std::string patch_str(param); size_t json_start = patch_str.find_first_of("["); size_t json_end = patch_str.find_last_of("]"); LOGI("patch is:%s\n", patch_str.c_str()); if (json_start >= patch_str.size() || json_end > patch_str.size() || json_start >= json_end) { LOGE("%s: patch is invalied\n", __func__); return XCAM_RETURN_ERROR_FAILED; } std::string json_str = patch_str.substr(json_start, json_end + 1); if (json_str.empty()) { LOGE("%s: patch is empty\n", __func__); return XCAM_RETURN_ERROR_FAILED; } auto last_calib = sys_ctx->_rkAiqManager->getCurrentCalibDBV2(); if (!last_calib) { *last_calib = RkAiqCalibDbV2::toDefaultCalibDb(sys_ctx->_calibDbProj); if (!last_calib) { LOGE("%s: default calib is invalied\n", __func__); return XCAM_RETURN_ERROR_FAILED; } } auto tuning_calib = RkCam::RkAiqCalibDbV2::analyzTuningCalib( last_calib, json_str.c_str()); ret = sys_ctx->_rkAiqManager->calibTuning(tuning_calib.calib, tuning_calib.ModuleNames); return ret; } char* rk_aiq_uapi_sysctl_readiq(const rk_aiq_sys_ctx_t* sys_ctx, char* param) { RKAIQ_API_SMART_LOCK(sys_ctx); cJSON* cmd_json = NULL; char* ret_str = NULL; if (!sys_ctx) { LOGE("%s: sys_ctx is invalied\n", __func__); return NULL; } if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return NULL; } // Find json patch std::string patch_str(param); size_t json_start = patch_str.find_first_of("["); size_t json_end = patch_str.find_first_of("]"); LOGI("request is:%s\n", patch_str.c_str()); if (json_start >= patch_str.size() || json_end > patch_str.size() || json_start >= json_end) { LOGE("%s: request is invalied\n", __func__); return NULL; } std::string json_str = patch_str.substr(json_start, json_end + 1); if (json_str.empty()) { LOGE("%s: request is empty\n", __func__); return NULL; } auto last_calib = sys_ctx->_rkAiqManager->getCurrentCalibDBV2(); if (!last_calib) { *last_calib = RkAiqCalibDbV2::toDefaultCalibDb(sys_ctx->_calibDbProj); if (!last_calib) { LOGE("%s: default calib is invalied\n", __func__); return NULL; } } ret_str = RkCam::RkAiqCalibDbV2::readIQNodeStrFromJstr(last_calib, json_str.c_str()); return ret_str; } XCamReturn rk_aiq_uapi_sysctl_regMemsSensorIntf(const rk_aiq_sys_ctx_t* sys_ctx, const rk_aiq_mems_sensor_intf_t* intf) { RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; assert(sys_ctx != nullptr); if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return XCAM_RETURN_ERROR_FAILED; } ret = sys_ctx->_analyzer->setMemsSensorIntf(intf); if (ret) { LOGE("failed to update iqfile\n"); ret = XCAM_RETURN_ERROR_FAILED; } return ret; } int rk_aiq_uapi_sysctl_switch_scene(const rk_aiq_sys_ctx_t* sys_ctx, const char* main_scene, const char* sub_scene) { RKAIQ_API_SMART_LOCK(sys_ctx); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (!sys_ctx) { LOGE("%s: sys_ctx is invalied\n", __func__); return XCAM_RETURN_ERROR_PARAM; } if (sys_ctx->cam_type == RK_AIQ_CAM_TYPE_GROUP) { LOGE("%s: not support for camgroup\n", __func__); return XCAM_RETURN_ERROR_FAILED; } if (!main_scene || !sub_scene) { LOGE("%s: request is invalied\n", __func__); return XCAM_RETURN_ERROR_PARAM; } auto new_calib = RkAiqSceneManager::refToScene(sys_ctx->_calibDbProj, main_scene, sub_scene); ret = sys_ctx->_rkAiqManager->updateCalibDb(&new_calib); if (ret) { LOGE("failed to switch scene\n"); return ret; } return XCAM_RETURN_NO_ERROR; }