/* * rk_aiq_algo_acprc_itf.c * * Copyright (c) 2019 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 #include "xcam_common.h" #include "rk_aiq_adegamma_algo.h" RKAIQ_BEGIN_DECLARE XCamReturn AdegammaInit(AdegammaHandle_t** para, CamCalibDbV2Context_t* calib) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); XCamReturn ret = XCAM_RETURN_NO_ERROR; AdegammaHandle_t* handle = (AdegammaHandle_t*)calloc(sizeof(AdegammaHandle_t), 1); if (NULL == handle) return XCAM_RETURN_ERROR_MEM; CalibDbV2_Adegmma_t* calibv2_adegamma_calib = (CalibDbV2_Adegmma_t*)(CALIBDBV2_GET_MODULE_PTR(calib, adegamma_calib)); if (!calibv2_adegamma_calib) { free(handle); return XCAM_RETURN_ERROR_MEM; } memcpy(&handle->adegammaAttr.stTool, calibv2_adegamma_calib, sizeof(CalibDbV2_Adegmma_t)); handle->pCalibDb = calibv2_adegamma_calib; //get adegmma paras from iq *para = handle; LOG1_ADEGAMMA("EXIT: %s \n", __func__); return(ret); } XCamReturn AdegammaRelease(AdegammaHandle_t* para) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (para) free(para); LOG1_ADEGAMMA("EXIT: %s \n", __func__); return(ret); } XCamReturn AdegammaPreProc(AdegammaHandle_t* para) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); XCamReturn ret = XCAM_RETURN_NO_ERROR; LOG1_ADEGAMMA("EXIT: %s \n", __func__); return(ret); } void AdegammaAutoProc(rk_aiq_degamma_cfg_t* pConfig, CalibDbV2_Adegmma_t* pAtuoPara) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); pConfig->degamma_en = pAtuoPara->DegammaTuningPara.degamma_en; //get X_axis int tmp[DEGAMMA_CRUVE_X_KNOTS]; for(int i = 0; i < DEGAMMA_CRUVE_X_KNOTS; i++) { tmp[i] = pAtuoPara->DegammaTuningPara.X_axis[i + 1] - pAtuoPara->DegammaTuningPara.X_axis[i]; tmp[i] = log(tmp[i]) / log(2) - DEGAMMA_CRUVE_X_NORMALIZE_FACTOR; pConfig->degamma_X[i] = tmp[i]; } for(int i = 0; i < DEGAMMA_CRUVE_Y_KNOTS; i++) { pConfig->degamma_tableR[i] = pAtuoPara->DegammaTuningPara.curve_R[i]; pConfig->degamma_tableG[i] = pAtuoPara->DegammaTuningPara.curve_G[i]; pConfig->degamma_tableB[i] = pAtuoPara->DegammaTuningPara.curve_B[i]; } LOGD_ADEGAMMA("%s X_axis:%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __func__, pAtuoPara->DegammaTuningPara.X_axis[0], pAtuoPara->DegammaTuningPara.X_axis[1], pAtuoPara->DegammaTuningPara.X_axis[2], pAtuoPara->DegammaTuningPara.X_axis[3], pAtuoPara->DegammaTuningPara.X_axis[4], pAtuoPara->DegammaTuningPara.X_axis[5], pAtuoPara->DegammaTuningPara.X_axis[6], pAtuoPara->DegammaTuningPara.X_axis[7], pAtuoPara->DegammaTuningPara.X_axis[8], pAtuoPara->DegammaTuningPara.X_axis[9], pAtuoPara->DegammaTuningPara.X_axis[10], pAtuoPara->DegammaTuningPara.X_axis[11], pAtuoPara->DegammaTuningPara.X_axis[12], pAtuoPara->DegammaTuningPara.X_axis[13], pAtuoPara->DegammaTuningPara.X_axis[14], pAtuoPara->DegammaTuningPara.X_axis[15], pAtuoPara->DegammaTuningPara.X_axis[16]); LOG1_ADEGAMMA("EXIT: %s \n", __func__); } void AdegammaApiManualProc(AdegammaHandle_t* para) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); para->adegamma_config.degamma_en = para->adegammaAttr.stManual.en ; //get X_axis int tmp[DEGAMMA_CRUVE_X_KNOTS]; for(int i = 0; i < DEGAMMA_CRUVE_X_KNOTS; i++) { tmp[i] = para->adegammaAttr.stManual.X_axis[i + 1] - para->adegammaAttr.stManual.X_axis[i]; tmp[i] = log(tmp[i]) / log(2) - DEGAMMA_CRUVE_X_NORMALIZE_FACTOR; para->adegamma_config.degamma_X[i] = tmp[i]; } for(int i = 0; i < DEGAMMA_CRUVE_Y_KNOTS; i++) { para->adegamma_config.degamma_tableR[i] = para->adegammaAttr.stManual.curve_R[i]; para->adegamma_config.degamma_tableG[i] = para->adegammaAttr.stManual.curve_G[i]; para->adegamma_config.degamma_tableB[i] = para->adegammaAttr.stManual.curve_B[i]; } LOG1_ADEGAMMA("EXIT: %s \n", __func__); } void AdegammaProcessing(AdegammaHandle_t* para) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); LOGD_ADEGAMMA("===============================Adegamma Start===============================\n", __func__); if(para->adegammaAttr.mode == RK_AIQ_DEGAMMA_MODE_OFF) { //run iq degamma LOGD_ADEGAMMA(" %s: Adegamma api off !!!\n", __func__); AdegammaAutoProc(¶->adegamma_config, para->pCalibDb); } else if(para->adegammaAttr.mode == RK_AIQ_DEGAMMA_MODE_MANUAL) { //run manual degamma, for client api LOGD_ADEGAMMA(" %s: Adegamma api on, Mode is Manual\n", __func__); AdegammaApiManualProc( para); } else if(para->adegammaAttr.mode == RK_AIQ_DEGAMMA_MODE_TOOL) { //run tool degamma,for tool LOGD_ADEGAMMA(" %s: Adegamma api on, Mode is Tool\n", __func__); AdegammaAutoProc(¶->adegamma_config, ¶->adegammaAttr.stTool); } else LOGE_ADEGAMMA(" %s: Wrong degamma mode !!!\n", __func__); //limit para for(int i = 0; i < DEGAMMA_CRUVE_X_KNOTS; i++) para->adegamma_config.degamma_X[i] = DEGAMMA_LIMIT_VALUE(para->adegamma_config.degamma_X[i], DEGAMMA_CRUVE_X_MAX, DEGAMMA_CRUVE_X_MIN); for(int i = 0; i < DEGAMMA_CRUVE_Y_KNOTS; i++) { para->adegamma_config.degamma_tableR[i] = DEGAMMA_LIMIT_VALUE(para->adegamma_config.degamma_tableR[i], DEGAMMA_CRUVE_Y_MAX, DEGAMMA_CRUVE_Y_MIN); para->adegamma_config.degamma_tableG[i] = DEGAMMA_LIMIT_VALUE(para->adegamma_config.degamma_tableG[i], DEGAMMA_CRUVE_Y_MAX, DEGAMMA_CRUVE_Y_MIN); para->adegamma_config.degamma_tableB[i] = DEGAMMA_LIMIT_VALUE(para->adegamma_config.degamma_tableB[i], DEGAMMA_CRUVE_Y_MAX, DEGAMMA_CRUVE_Y_MIN); } LOGD_ADEGAMMA(" %s: gamma_en:%d\n", __func__, para->adegamma_config.degamma_en); LOGD_ADEGAMMA("%s degamma_X:%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __func__, para->adegamma_config.degamma_X[0], para->adegamma_config.degamma_X[1], para->adegamma_config.degamma_X[2], para->adegamma_config.degamma_X[3], para->adegamma_config.degamma_X[4], para->adegamma_config.degamma_X[5], para->adegamma_config.degamma_X[6], para->adegamma_config.degamma_X[7], para->adegamma_config.degamma_X[8], para->adegamma_config.degamma_X[9], para->adegamma_config.degamma_X[10], para->adegamma_config.degamma_X[11], para->adegamma_config.degamma_X[12], para->adegamma_config.degamma_X[13], para->adegamma_config.degamma_X[14], para->adegamma_config.degamma_X[15]); //transfer scene mode to degamma api para->adegammaAttr.Scene_mode = para->Scene_mode; LOG1_ADEGAMMA("EXIT: %s \n", __func__); } void AdegammaSetProcRes(AdegammaProcRes_t* AdegammaProcRes, rk_aiq_degamma_cfg_t* adegamma_config) { LOG1_ADEGAMMA("ENTER: %s \n", __func__); AdegammaProcRes->degamma_en = adegamma_config->degamma_en; int tmp0 = 0, tmp1 = 0; for(int i = 0; i < 8; i++) { tmp0 |= ((adegamma_config->degamma_X[i]) << (4 * i)); tmp1 |= ((adegamma_config->degamma_X[i + 8]) << (4 * i)); } AdegammaProcRes->degamma_X_d0 = tmp0; AdegammaProcRes->degamma_X_d1 = tmp1; for(int i = 0; i < DEGAMMA_CRUVE_Y_KNOTS; i++) { AdegammaProcRes->degamma_tableR[i] = adegamma_config->degamma_tableR[i]; AdegammaProcRes->degamma_tableG[i] = adegamma_config->degamma_tableG[i]; AdegammaProcRes->degamma_tableB[i] = adegamma_config->degamma_tableB[i]; } LOGD_ADEGAMMA("%s DEGAMMA_DX0:%d GAMMA_DX1:%d\n", __func__, AdegammaProcRes->degamma_X_d0, AdegammaProcRes->degamma_X_d1); LOGD_ADEGAMMA("%s DEGAMMA_R_Y:%d %d %d %d %d %d %d %d\n", __func__, AdegammaProcRes->degamma_tableR[0], AdegammaProcRes->degamma_tableR[1], AdegammaProcRes->degamma_tableR[2], AdegammaProcRes->degamma_tableR[3], AdegammaProcRes->degamma_tableR[4], AdegammaProcRes->degamma_tableR[5], AdegammaProcRes->degamma_tableR[6], AdegammaProcRes->degamma_tableR[7]); LOGD_ADEGAMMA("%s DEGAMMA_G_Y:%d %d %d %d %d %d %d %d\n", __func__, AdegammaProcRes->degamma_tableG[0], AdegammaProcRes->degamma_tableG[1], AdegammaProcRes->degamma_tableG[2], AdegammaProcRes->degamma_tableG[3], AdegammaProcRes->degamma_tableG[4], AdegammaProcRes->degamma_tableG[5], AdegammaProcRes->degamma_tableG[6], AdegammaProcRes->degamma_tableG[7]); LOGD_ADEGAMMA("%s DEGAMMA_B_Y:%d %d %d %d %d %d %d %d\n", __func__, AdegammaProcRes->degamma_tableB[0], AdegammaProcRes->degamma_tableB[1], AdegammaProcRes->degamma_tableB[2], AdegammaProcRes->degamma_tableB[3], AdegammaProcRes->degamma_tableB[4], AdegammaProcRes->degamma_tableB[5], AdegammaProcRes->degamma_tableB[6], AdegammaProcRes->degamma_tableB[7]); LOGD_ADEGAMMA("===============================Adegamma Stop================================\n", __func__); LOG1_ADEGAMMA("EXIT: %s \n", __func__); } RKAIQ_END_DECLARE