/* 
 | 
 * rk_aiq_algo_acp_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 "acp/rk_aiq_algo_acp_itf.h" 
 | 
#include "xcam_log.h" 
 | 
#include "acp/rk_aiq_types_algo_acp_prvt.h" 
 | 
RKAIQ_BEGIN_DECLARE 
 | 
  
 | 
static XCamReturn 
 | 
create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg) 
 | 
{ 
 | 
    const AlgoCtxInstanceCfgInt* cfg_int = (const AlgoCtxInstanceCfgInt*)cfg; 
 | 
    RkAiqAlgoContext *ctx = new RkAiqAlgoContext(); 
 | 
    if (ctx == NULL) { 
 | 
        LOGE_ACP( "%s: create acp context fail!\n", __FUNCTION__); 
 | 
        return XCAM_RETURN_ERROR_MEM; 
 | 
    } 
 | 
    ctx->acpCtx.calib = cfg_int->calib; 
 | 
    ctx->acpCtx.calibv2 = cfg_int->calibv2; 
 | 
    rk_aiq_acp_params_t* params = &ctx->acpCtx.params; 
 | 
    if (ctx->acpCtx.calib) { 
 | 
        CalibDb_cProc_t *cproc = 
 | 
            (CalibDb_cProc_t*)(CALIBDB_GET_MODULE_PTR(ctx->acpCtx.calib, cProc)); 
 | 
        params->enable = cproc->enable; 
 | 
        params->brightness = cproc->brightness; 
 | 
        params->hue = cproc->hue; 
 | 
        params->saturation = cproc->saturation; 
 | 
        params->contrast = cproc->contrast; 
 | 
    } else if (ctx->acpCtx.calibv2) { 
 | 
        Cproc_Param_t *cproc = 
 | 
            (Cproc_Param_t*)(CALIBDBV2_GET_MODULE_PTR(ctx->acpCtx.calibv2, cproc)); 
 | 
        params->enable = cproc->enable; 
 | 
        params->brightness = cproc->brightness; 
 | 
        params->hue = cproc->hue; 
 | 
        params->saturation = cproc->saturation; 
 | 
        params->contrast = cproc->contrast; 
 | 
    } 
 | 
  
 | 
    *context = ctx; 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
destroy_context(RkAiqAlgoContext *context) 
 | 
{ 
 | 
    delete context; 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
prepare(RkAiqAlgoCom* params) 
 | 
{ 
 | 
    rk_aiq_acp_params_t* acp_params = ¶ms->ctx->acpCtx.params; 
 | 
    RkAiqAlgoConfigAdebayerInt* pCfgParam = (RkAiqAlgoConfigAdebayerInt*)params; 
 | 
  
 | 
    if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){ 
 | 
        if (pCfgParam->rk_com.u.prepare.calib) { 
 | 
            CalibDb_cProc_t *cproc = 
 | 
                (CalibDb_cProc_t*)(CALIBDB_GET_MODULE_PTR(pCfgParam->rk_com.u.prepare.calib, cProc)); 
 | 
                acp_params->enable = cproc->enable; 
 | 
                acp_params->brightness = cproc->brightness; 
 | 
                acp_params->hue = cproc->hue; 
 | 
                acp_params->saturation = cproc->saturation; 
 | 
                acp_params->contrast = cproc->contrast; 
 | 
        } else if (pCfgParam->rk_com.u.prepare.calibv2) { 
 | 
                CalibDbV2_Cproc_t* cproc = 
 | 
                    (CalibDbV2_Cproc_t*)(CALIBDBV2_GET_MODULE_PTR(pCfgParam->rk_com.u.prepare.calibv2, cproc)); 
 | 
  
 | 
                acp_params->enable = cproc->param.enable; 
 | 
                acp_params->brightness = cproc->param.brightness; 
 | 
                acp_params->hue = cproc->param.hue; 
 | 
                acp_params->saturation = cproc->param.saturation; 
 | 
                acp_params->contrast = cproc->param.contrast; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    RkAiqAlgoProcResAcp* res_com = (RkAiqAlgoProcResAcp*)outparams; 
 | 
    RkAiqAlgoProcResAcpInt* res_int = (RkAiqAlgoProcResAcpInt*)outparams; 
 | 
    RkAiqAlgoContext* ctx = inparams->ctx; 
 | 
  
 | 
    res_com->acp_res = ctx->acpCtx.params; 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
static XCamReturn 
 | 
post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) 
 | 
{ 
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
RkAiqAlgoDescription g_RkIspAlgoDescAcp = { 
 | 
    .common = { 
 | 
        .version = RKISP_ALGO_ACP_VERSION, 
 | 
        .vendor  = RKISP_ALGO_ACP_VENDOR, 
 | 
        .description = RKISP_ALGO_ACP_DESCRIPTION, 
 | 
        .type    = RK_AIQ_ALGO_TYPE_ACP, 
 | 
        .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 
 |