/* 
 | 
 * rk_aiq_algo_agamma_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 "rk_aiq_algo_types_int.h" 
 | 
#include "adegamma/rk_aiq_algo_adegamma_itf.h" 
 | 
#include "adegamma/rk_aiq_adegamma_algo.h" 
 | 
RKAIQ_BEGIN_DECLARE 
 | 
  
 | 
typedef struct _RkAiqAlgoContext { 
 | 
    void* place_holder[0]; 
 | 
} RkAiqAlgoContext; 
 | 
  
 | 
  
 | 
static XCamReturn 
 | 
create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
  
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    AdegammaHandle_t*AdegammaHandle = NULL; 
 | 
    AlgoCtxInstanceCfgInt* instanc_int = (AlgoCtxInstanceCfgInt*)cfg; 
 | 
    CamCalibDbV2Context_t* calib = instanc_int->calibv2; 
 | 
    ret = AdegammaInit(&AdegammaHandle, calib); 
 | 
    *context = (RkAiqAlgoContext *)(AdegammaHandle); 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
destroy_context(RkAiqAlgoContext *context) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
    AdegammaHandle_t*AdegammaHandle = (AdegammaHandle_t*)context; 
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
  
 | 
    ret = AdegammaRelease(AdegammaHandle); 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
prepare(RkAiqAlgoCom* params) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    AdegammaHandle_t * AdegammaHandle = (AdegammaHandle_t *)params->ctx; 
 | 
    RkAiqAlgoConfigAdegammaInt* pCfgParam = (RkAiqAlgoConfigAdegammaInt*)params; 
 | 
    rk_aiq_degamma_cfg_t *adegamma_config = &AdegammaHandle->adegamma_config; 
 | 
    AdegammaHandle->working_mode = pCfgParam->adegamma_config_com.com.u.prepare.working_mode; 
 | 
    AdegammaHandle->prepare_type = pCfgParam->adegamma_config_com.com.u.prepare.conf_type; 
 | 
  
 | 
    if(!!(AdegammaHandle->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) { 
 | 
        CalibDbV2_Adegmma_t* adegamma_calib = 
 | 
                (CalibDbV2_Adegmma_t*)(CALIBDBV2_GET_MODULE_PTR(pCfgParam->rk_com.u.prepare.calibv2, adegamma_calib)); 
 | 
        AdegammaHandle->pCalibDb = adegamma_calib;//reload iq 
 | 
        LOGD_ADEGAMMA("%s: Adegamma Reload Para!!!\n", __FUNCTION__); 
 | 
    } 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
    RkAiqAlgoPreAdegammaInt* pAdegammaPreParams = (RkAiqAlgoPreAdegammaInt*)inparams; 
 | 
    AdegammaHandle_t * AdegammaHandle = (AdegammaHandle_t *)inparams->ctx; 
 | 
    rk_aiq_degamma_cfg_t *adegamma_config = &AdegammaHandle->adegamma_config; 
 | 
  
 | 
    if (pAdegammaPreParams->rk_com.u.proc.gray_mode) 
 | 
        AdegammaHandle->Scene_mode = DEGAMMA_OUT_NIGHT; 
 | 
    else if (DEGAMMA_OUT_NORMAL == AdegammaHandle->working_mode) 
 | 
        AdegammaHandle->Scene_mode = DEGAMMA_OUT_NORMAL; 
 | 
    else 
 | 
        AdegammaHandle->Scene_mode = DEGAMMA_OUT_HDR; 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
  
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    AdegammaHandle_t * AdegammaHandle = (AdegammaHandle_t *)inparams->ctx; 
 | 
    RkAiqAlgoProcResAdegamma* procResPara = (RkAiqAlgoProcResAdegamma*)outparams; 
 | 
    AdegammaProcRes_t* AdegammaProcRes = (AdegammaProcRes_t*)&procResPara->adegamma_proc_res; 
 | 
  
 | 
    AdegammaProcessing(AdegammaHandle); 
 | 
    //set proc res 
 | 
    AdegammaSetProcRes(AdegammaProcRes, &AdegammaHandle->adegamma_config); 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    LOG1_ADEGAMMA("ENTER: %s \n", __func__); 
 | 
  
 | 
    LOG1_ADEGAMMA("EXIT: %s \n", __func__); 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
RkAiqAlgoDescription g_RkIspAlgoDescAdegamma = { 
 | 
    .common = { 
 | 
        .version = RKISP_ALGO_ADEGAMMA_VERSION, 
 | 
        .vendor  = RKISP_ALGO_ADEGAMMA_VENDOR, 
 | 
        .description = RKISP_ALGO_ADEGAMMA_DESCRIPTION, 
 | 
        .type    = RK_AIQ_ALGO_TYPE_ADEGAMMA, 
 | 
        .id      = 0, 
 | 
        .create_context  = create_context, 
 | 
        .destroy_context = destroy_context, 
 | 
    }, 
 | 
    .prepare = prepare, 
 | 
    .pre_process = pre_process, 
 | 
    .processing = processing, 
 | 
    .post_process = post_process, 
 | 
}; 
 | 
  
 | 
RKAIQ_END_DECLARE 
 |