/* 
 | 
 * 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 <string.h> 
 | 
#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 
 |