/* 
 | 
 *  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 "CamHwIsp21.h" 
 | 
//#include "isp20/Isp20PollThread.h" 
 | 
#ifdef ANDROID_OS 
 | 
#include <cutils/properties.h> 
 | 
#endif 
 | 
  
 | 
namespace RkCam { 
 | 
  
 | 
CamHwIsp21::CamHwIsp21() 
 | 
    : CamHwIsp20() 
 | 
{ 
 | 
    mNoReadBack = true; 
 | 
#ifndef ANDROID_OS 
 | 
    char* valueStr = getenv("normal_no_read_back"); 
 | 
    if (valueStr) { 
 | 
        mNoReadBack = atoi(valueStr) > 0 ? true : false; 
 | 
    } 
 | 
#else 
 | 
    char property_value[PROPERTY_VALUE_MAX] = {'\0'}; 
 | 
  
 | 
    property_get("persist.vendor.rkisp_no_read_back", property_value, "-1"); 
 | 
    int val = atoi(property_value); 
 | 
    if (val != -1) 
 | 
        mNoReadBack = atoi(property_value) > 0 ? true : false; 
 | 
#endif 
 | 
} 
 | 
  
 | 
CamHwIsp21::~CamHwIsp21() 
 | 
{} 
 | 
  
 | 
XCamReturn 
 | 
CamHwIsp21::init(const char* sns_ent_name) 
 | 
{ 
 | 
    xcam_mem_clear (_full_active_isp21_params); 
 | 
  
 | 
    XCamReturn ret = CamHwIsp20::init(sns_ent_name); 
 | 
  
 | 
    //SmartPtr<Isp20PollThread> isp20Pollthread = 
 | 
    //    mPollthread.dynamic_cast_ptr<Isp20PollThread>(); 
 | 
    //isp20Pollthread->set_need_luma_rd_info(false); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
CamHwIsp21::stop() 
 | 
{ 
 | 
  
 | 
    XCamReturn ret = CamHwIsp20::stop(); 
 | 
    xcam_mem_clear (_full_active_isp21_params); 
 | 
  
 | 
    return ret; 
 | 
} 
 | 
  
 | 
bool CamHwIsp21::isOnlineByWorkingMode() 
 | 
{ 
 | 
    return false; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
CamHwIsp21::dispatchResult(cam3aResultList& list) 
 | 
{ 
 | 
    cam3aResultList isp_result_list; 
 | 
    for (auto& result : list) { 
 | 
        switch (result->getType()) { 
 | 
        case RESULT_TYPE_FLASH_PARAM: 
 | 
        case RESULT_TYPE_CPSL_PARAM: 
 | 
        case RESULT_TYPE_IRIS_PARAM: 
 | 
        case RESULT_TYPE_FOCUS_PARAM: 
 | 
        case RESULT_TYPE_EXPOSURE: 
 | 
            CamHwIsp20::dispatchResult(result); 
 | 
            break; 
 | 
        default: 
 | 
            isp_result_list.push_back(result); 
 | 
            break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if (isp_result_list.size() > 0) { 
 | 
        handleIsp3aReslut(isp_result_list); 
 | 
    } 
 | 
  
 | 
    return XCAM_RETURN_NO_ERROR; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
CamHwIsp21::dispatchResult(SmartPtr<cam3aResult> result) 
 | 
{ 
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    if (!result.ptr()) 
 | 
        return XCAM_RETURN_ERROR_PARAM; 
 | 
  
 | 
    LOGD("%s enter, msg type(0x%x)", __FUNCTION__, result->getType()); 
 | 
    switch (result->getType()) 
 | 
    { 
 | 
    case RESULT_TYPE_FLASH_PARAM: 
 | 
    case RESULT_TYPE_CPSL_PARAM: 
 | 
    case RESULT_TYPE_IRIS_PARAM: 
 | 
    case RESULT_TYPE_FOCUS_PARAM: 
 | 
    case RESULT_TYPE_EXPOSURE: 
 | 
        return CamHwIsp20::dispatchResult(result); 
 | 
    default: 
 | 
        handleIsp3aReslut(result); 
 | 
        break; 
 | 
    } 
 | 
    return ret; 
 | 
    LOGD("%s exit", __FUNCTION__); 
 | 
} 
 | 
  
 | 
void 
 | 
CamHwIsp21::gen_full_isp_params(const struct isp21_isp_params_cfg* update_params, 
 | 
                                struct isp21_isp_params_cfg* full_params, 
 | 
                                uint64_t* module_en_update_partial, 
 | 
                                uint64_t* module_cfg_update_partial) 
 | 
{ 
 | 
    XCAM_ASSERT (update_params); 
 | 
    XCAM_ASSERT (full_params); 
 | 
    int i = 0; 
 | 
  
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
    for (; i <= RK_ISP2X_MAX_ID; i++) 
 | 
        if (update_params->module_en_update & (1LL << i)) { 
 | 
            if ((full_params->module_ens & (1LL << i)) != 
 | 
                    (update_params->module_ens & (1LL << i))) 
 | 
                *module_en_update_partial |= 1LL << i; 
 | 
            full_params->module_en_update |= 1LL << i; 
 | 
            // clear old bit value 
 | 
            full_params->module_ens &= ~(1LL << i); 
 | 
            // set new bit value 
 | 
            full_params->module_ens |= update_params->module_ens & (1LL << i); 
 | 
        } 
 | 
  
 | 
    for (i = 0; i <= RK_ISP2X_MAX_ID; i++) { 
 | 
        if (update_params->module_cfg_update & (1LL << i)) { 
 | 
  
 | 
#define CHECK_UPDATE_PARAMS(dst, src) \ 
 | 
            if (memcmp(&dst, &src, sizeof(dst)) == 0 && \ 
 | 
                full_params->frame_id > ISP_PARAMS_EFFECT_DELAY_CNT) { \ 
 | 
                continue; \ 
 | 
            } \ 
 | 
            *module_cfg_update_partial |= 1LL << i; \ 
 | 
            dst = src; \ 
 | 
  
 | 
            full_params->module_cfg_update |= 1LL << i; 
 | 
            switch (i) { 
 | 
            case RK_ISP2X_RAWAE_BIG1_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawae0, update_params->meas.rawae0); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWAE_BIG2_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawae1, update_params->meas.rawae1); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWAE_BIG3_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawae2, update_params->meas.rawae2); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWAE_LITE_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawae3, update_params->meas.rawae3); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWHIST_BIG1_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawhist0, update_params->meas.rawhist0); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWHIST_BIG2_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawhist1, update_params->meas.rawhist1); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWHIST_BIG3_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawhist2, update_params->meas.rawhist2); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWHIST_LITE_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawhist3, update_params->meas.rawhist3); 
 | 
                break; 
 | 
            case RK_ISP2X_YUVAE_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.yuvae, update_params->meas.yuvae); 
 | 
                break; 
 | 
            case RK_ISP2X_SIHST_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.sihst, update_params->meas.sihst); 
 | 
                break; 
 | 
            case RK_ISP2X_SIAWB_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.siawb, update_params->meas.siawb); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWAWB_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawawb, update_params->meas.rawawb); 
 | 
                break; 
 | 
            case RK_ISP2X_AWB_GAIN_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.awb_gain_cfg, update_params->others.awb_gain_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_RAWAF_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->meas.rawaf, update_params->meas.rawaf); 
 | 
                break; 
 | 
            case RK_ISP2X_HDRMGE_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.hdrmge_cfg, update_params->others.hdrmge_cfg); 
 | 
                break; 
 | 
            /* case RK_ISP2X_HDRTMO_ID: */ 
 | 
            /*     full_params->others.hdrtmo_cfg = update_params->others.hdrtmo_cfg; */ 
 | 
            /*     break; */ 
 | 
            case RK_ISP2X_CTK_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.ccm_cfg, update_params->others.ccm_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_LSC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.lsc_cfg, update_params->others.lsc_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_GOC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.gammaout_cfg, update_params->others.gammaout_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_3DLUT_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.isp3dlut_cfg, update_params->others.isp3dlut_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_DPCC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.dpcc_cfg, update_params->others.dpcc_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_BLS_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.bls_cfg, update_params->others.bls_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_DEBAYER_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.debayer_cfg, update_params->others.debayer_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_DHAZ_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.dhaz_cfg, update_params->others.dhaz_cfg); 
 | 
                break; 
 | 
            /* case RK_ISP2X_RAWNR_ID: */ 
 | 
            /*     full_params->others.rawnr_cfg = update_params->others.rawnr_cfg; */ 
 | 
            /*     break; */ 
 | 
            /* case RK_ISP2X_GAIN_ID: */ 
 | 
            /*     full_params->others.gain_cfg = update_params->others.gain_cfg; */ 
 | 
            /*     break; */ 
 | 
            case RK_ISP2X_LDCH_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.ldch_cfg, update_params->others.ldch_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_GIC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.gic_cfg, update_params->others.gic_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_CPROC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.cproc_cfg, update_params->others.cproc_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_BAYNR_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.baynr_cfg, update_params->others.baynr_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_BAY3D_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.bay3d_cfg, update_params->others.bay3d_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_YNR_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.ynr_cfg, update_params->others.ynr_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_CNR_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.cnr_cfg, update_params->others.cnr_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_SHARP_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.sharp_cfg, update_params->others.sharp_cfg); 
 | 
                break; 
 | 
            case Rk_ISP21_DRC_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.drc_cfg, update_params->others.drc_cfg); 
 | 
                break; 
 | 
            case RK_ISP2X_SDG_ID: 
 | 
                CHECK_UPDATE_PARAMS(full_params->others.sdg_cfg, update_params->others.sdg_cfg); 
 | 
                break; 
 | 
            default: 
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
} 
 | 
  
 | 
/* 
 | 
 * some module(HDR/TNR) parameters are related to the next frame exposure 
 | 
 * and can only be easily obtained at the hwi layer, 
 | 
 * so these parameters are calculated at hwi and the result is overwritten. 
 | 
 */ 
 | 
XCamReturn 
 | 
CamHwIsp21::overrideExpRatioToAiqResults(const sint32_t frameId, 
 | 
        int module_id, 
 | 
        cam3aResultList &results, 
 | 
        int hdr_mode) 
 | 
{ 
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
    SmartPtr<RkAiqExpParamsProxy> curFrameExpParam; 
 | 
    SmartPtr<RkAiqExpParamsProxy> nextFrameExpParam; 
 | 
    SmartPtr<BaseSensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<BaseSensorHw>(); 
 | 
  
 | 
    if (mSensorSubdev.ptr()) { 
 | 
        if (mSensorSubdev->getEffectiveExpParams(curFrameExpParam, frameId) < 0) { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n", 
 | 
                            module_id, 
 | 
                            frameId); 
 | 
            return ret; 
 | 
        } 
 | 
  
 | 
        if (mSensorSubdev->getEffectiveExpParams(nextFrameExpParam, frameId + 1) < 0) { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n", 
 | 
                            module_id, 
 | 
                            frameId + 1); 
 | 
            return ret; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    LOGD_CAMHW_SUBM(ISP20HW_SUBM, "exp-sync: module_id: 0x%x, rx id: %d\n" 
 | 
                    "curFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n" 
 | 
                    "nextFrame(%d): lexp: %f-%f, mexp: %f-%f, sexp: %f-%f\n", 
 | 
                    module_id, 
 | 
                    frameId, 
 | 
                    frameId, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain, 
 | 
                    curFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time, 
 | 
                    frameId + 1, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.analog_gain, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[2].exp_real_params.integration_time, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain, 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time); 
 | 
  
 | 
    //calc expo 
 | 
    float nextLExpo = 0; 
 | 
    float nextMExpo = 0; 
 | 
    float nextSExpo = 0; 
 | 
    float nextRatioLS = 1.0; 
 | 
    if(hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) { 
 | 
        nextLExpo = nextFrameExpParam->data()->aecExpInfo.LinearExp.exp_real_params.analog_gain * \ 
 | 
                    nextFrameExpParam->data()->aecExpInfo.LinearExp.exp_real_params.integration_time; 
 | 
        nextMExpo = nextLExpo; 
 | 
        nextSExpo = nextLExpo; 
 | 
    } 
 | 
    else if(hdr_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2) { 
 | 
        nextLExpo = nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.analog_gain * \ 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[1].exp_real_params.integration_time; 
 | 
        nextMExpo = nextLExpo; 
 | 
        nextSExpo = nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.analog_gain * \ 
 | 
                    nextFrameExpParam->data()->aecExpInfo.HdrExp[0].exp_real_params.integration_time; 
 | 
    } 
 | 
    else { 
 | 
        LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get wrong hdr mode\n"); 
 | 
        return ret; 
 | 
    } 
 | 
  
 | 
    nextRatioLS = nextLExpo / nextSExpo; 
 | 
    nextRatioLS = nextRatioLS >= 1 ? nextRatioLS : 1; 
 | 
  
 | 
    switch (module_id) { 
 | 
    case Rk_ISP21_DRC_ID: 
 | 
    { 
 | 
        SmartPtr<cam3aResult> drc_res = get_3a_module_result(results, RESULT_TYPE_DRC_PARAM); 
 | 
        SmartPtr<RkAiqIspDrcParamsProxyV21> drcParamsProxy; 
 | 
        if (drc_res.ptr()) { 
 | 
            drcParamsProxy = drc_res.dynamic_cast_ptr<RkAiqIspDrcParamsProxyV21>(); 
 | 
        } else { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get drc params from 3a result failed!\n"); 
 | 
            return ret; 
 | 
        } 
 | 
        rk_aiq_isp_drc_v21_t& drc = drcParamsProxy->data()->result; 
 | 
  
 | 
        if(!drc.bTmoEn) 
 | 
            break; 
 | 
  
 | 
        if (drc.LongFrameMode) 
 | 
            nextRatioLS = 1.0; 
 | 
  
 | 
        //get sw_drc_compres_scl 
 | 
        float MFHDR_LOG_Q_BITS = 11; 
 | 
        float adrc_gain = drc.DrcProcRes.sw_drc_adrc_gain; 
 | 
        float log_ratio2 = log(nextRatioLS * adrc_gain) / log(2.0f) + 12; 
 | 
        float offsetbits_int = (float)(drc.DrcProcRes.sw_drc_offset_pow2); 
 | 
        float offsetbits = offsetbits_int * pow(2, MFHDR_LOG_Q_BITS); 
 | 
        float hdrbits = log_ratio2 * pow(2, MFHDR_LOG_Q_BITS); 
 | 
        float hdrvalidbits = hdrbits - offsetbits; 
 | 
        float compres_scl = (12 * pow(2, MFHDR_LOG_Q_BITS * 2)) / hdrvalidbits; 
 | 
        drc.DrcProcRes.sw_drc_compres_scl = (int)(compres_scl); 
 | 
  
 | 
        //get sw_drc_min_ogain 
 | 
        if(drc.DrcProcRes.sw_drc_min_ogain == 1) 
 | 
            drc.DrcProcRes.sw_drc_min_ogain = 1 << 15; 
 | 
        else { 
 | 
            float sw_drc_min_ogain = 1 / (nextRatioLS * adrc_gain); 
 | 
            drc.DrcProcRes.sw_drc_min_ogain = (int)(sw_drc_min_ogain * pow(2, 15) + 0.5); 
 | 
        } 
 | 
  
 | 
        //get sw_drc_compres_y 
 | 
        if(drc.CompressMode == COMPRESS_AUTO) { 
 | 
            float curveparam, curveparam2, curveparam3, tmp; 
 | 
            float luma2[17] = { 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 10240, 12288, 14336, 16384, 18432, 20480, 22528, 24576 }; 
 | 
            float curveTable[17]; 
 | 
            float ISP_RAW_BIT = 12; 
 | 
            float dstbits = ISP_RAW_BIT * pow(2, MFHDR_LOG_Q_BITS); 
 | 
            float validbits = dstbits - offsetbits; 
 | 
            for(int i = 0; i < ISP21_DRC_Y_NUM; ++i) 
 | 
            { 
 | 
                curveparam = (float)(validbits - 0) / (hdrvalidbits - validbits + pow(2, -6)); 
 | 
                curveparam2 = validbits * (1 + curveparam); 
 | 
                curveparam3 = hdrvalidbits * curveparam; 
 | 
                tmp = luma2[i] * hdrvalidbits / 24576; 
 | 
                curveTable[i] = (tmp * curveparam2 / (tmp + curveparam3)); 
 | 
                drc.DrcProcRes.sw_drc_compres_y[i] = (int)(curveTable[i]) ; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "nextRatioLS:%f sw_drc_compres_scl:%d sw_drc_min_ogain:%d\n", 
 | 
                        nextRatioLS, drc.DrcProcRes.sw_drc_compres_scl, drc.DrcProcRes.sw_drc_min_ogain); 
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "CompressMode:%d\n", drc.CompressMode); 
 | 
        for(int i = 0; i < ISP21_DRC_Y_NUM; ++i) 
 | 
            LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sw_drc_compres_y[%d]:%d\n", i, drc.DrcProcRes.sw_drc_compres_y[i]); 
 | 
  
 | 
        break; 
 | 
    } 
 | 
    case RK_ISP2X_HDRMGE_ID: 
 | 
    { 
 | 
        SmartPtr<cam3aResult> merge_res = get_3a_module_result(results, RESULT_TYPE_MERGE_PARAM); 
 | 
        SmartPtr<RkAiqIspMergeParamsProxy> mergeParamsProxy; 
 | 
  
 | 
        if (merge_res.ptr()) { 
 | 
            mergeParamsProxy = merge_res.dynamic_cast_ptr<RkAiqIspMergeParamsProxy>(); 
 | 
        } else { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "get drc params from 3a result failed!\n"); 
 | 
            return ret; 
 | 
        } 
 | 
        RkAiqAmergeProcResult_t& merge = mergeParamsProxy->data()->result; 
 | 
  
 | 
        if(merge.Res.sw_hdrmge_mode == 0) 
 | 
            break; 
 | 
  
 | 
        //get sw_hdrmge_gain0 
 | 
        merge.Res.sw_hdrmge_gain0 = (int)(64 * nextRatioLS); 
 | 
        if(nextRatioLS == 1) 
 | 
            merge.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS) - 1); 
 | 
        else 
 | 
            merge.Res.sw_hdrmge_gain0_inv = (int)(4096 * (1 / nextRatioLS)); 
 | 
  
 | 
        //get sw_hdrmge_gain1 
 | 
        merge.Res.sw_hdrmge_gain1 = 0x40; 
 | 
        merge.Res.sw_hdrmge_gain1_inv = 0xfff; 
 | 
  
 | 
        //get sw_hdrmge_gain2 
 | 
        merge.Res.sw_hdrmge_gain2 = 0x40; 
 | 
  
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "sw_hdrmge_gain0:%d sw_hdrmge_gain0_inv:%d\n", 
 | 
                        merge.Res.sw_hdrmge_gain0, merge.Res.sw_hdrmge_gain0_inv); 
 | 
  
 | 
        break; 
 | 
    } 
 | 
    default: 
 | 
        LOGW_CAMHW_SUBM(ISP20HW_SUBM, "unkown module id: 0x%x!\n", module_id); 
 | 
        break; 
 | 
    } 
 | 
  
 | 
    return ret; 
 | 
} 
 | 
  
 | 
XCamReturn 
 | 
CamHwIsp21::setIspConfig() 
 | 
{ 
 | 
    XCamReturn ret = XCAM_RETURN_NO_ERROR; 
 | 
  
 | 
    ENTER_CAMHW_FUNCTION(); 
 | 
  
 | 
    SmartPtr<V4l2Buffer> v4l2buf; 
 | 
    uint32_t frameId = -1; 
 | 
  
 | 
    { 
 | 
        SmartLock locker (_isp_params_cfg_mutex); 
 | 
        while (_effecting_ispparam_map.size() > 4) 
 | 
            _effecting_ispparam_map.erase(_effecting_ispparam_map.begin()); 
 | 
    } 
 | 
    if (mIspParamsDev.ptr()) { 
 | 
        ret = mIspParamsDev->get_buffer(v4l2buf); 
 | 
        if (ret) { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Can not get isp params buffer\n"); 
 | 
            return XCAM_RETURN_ERROR_PARAM; 
 | 
        } 
 | 
    } else 
 | 
        return XCAM_RETURN_BYPASS; 
 | 
  
 | 
    cam3aResultList ready_results; 
 | 
    ret = mParamsAssembler->deQueOne(ready_results, frameId); 
 | 
    if (ret != XCAM_RETURN_NO_ERROR) { 
 | 
        LOGI_CAMHW_SUBM(ISP20HW_SUBM, "deque isp ready parameter failed\n"); 
 | 
        mIspParamsDev->return_buffer_to_pool (v4l2buf); 
 | 
        return XCAM_RETURN_ERROR_PARAM; 
 | 
    } 
 | 
  
 | 
    LOGD_ANALYZER("----------%s, start config id(%d)'s isp params", __FUNCTION__, frameId); 
 | 
  
 | 
    struct isp21_isp_params_cfg update_params; 
 | 
  
 | 
    update_params.module_en_update = 0; 
 | 
    update_params.module_ens = 0; 
 | 
    update_params.module_cfg_update = 0; 
 | 
    if (_state == CAM_HW_STATE_STOPPED || _state == CAM_HW_STATE_PREPARED || _state == CAM_HW_STATE_PAUSED) { 
 | 
        // update all ens 
 | 
        _full_active_isp21_params.module_en_update = ~0; 
 | 
        // just re-config the enabled moddules 
 | 
        _full_active_isp21_params.module_cfg_update = _full_active_isp21_params.module_ens; 
 | 
    } else { 
 | 
        _full_active_isp21_params.module_en_update = 0; 
 | 
        // use module_ens to store module status, so we can use it to restore 
 | 
        // the init params for re-start and re-prepare 
 | 
        /* _full_active_isp21_params.module_ens = 0; */ 
 | 
        _full_active_isp21_params.module_cfg_update = 0; 
 | 
    } 
 | 
  
 | 
    ret = overrideExpRatioToAiqResults(frameId, Rk_ISP21_DRC_ID, ready_results, _hdr_mode); 
 | 
    if (ret < 0) { 
 | 
        LOGE_CAMHW_SUBM(ISP20HW_SUBM, "DRC convertExpRatioToAiqResults error!\n"); 
 | 
    } 
 | 
  
 | 
    ret = overrideExpRatioToAiqResults(frameId, RK_ISP2X_HDRMGE_ID, ready_results, _hdr_mode); 
 | 
    if (ret < 0) { 
 | 
        LOGE_CAMHW_SUBM(ISP20HW_SUBM, "Merge convertExpRatioToAiqResults error!\n"); 
 | 
    } 
 | 
  
 | 
    if (frameId >= 0) { 
 | 
        SmartPtr<cam3aResult> awb_res = get_3a_module_result(ready_results, RESULT_TYPE_AWB_PARAM); 
 | 
        SmartPtr<RkAiqIspAwbParamsProxyV21> awbParams; 
 | 
        if (awb_res.ptr()) { 
 | 
            awbParams = awb_res.dynamic_cast_ptr<RkAiqIspAwbParamsProxyV21>(); 
 | 
            { 
 | 
                SmartLock locker (_isp_params_cfg_mutex); 
 | 
                _effecting_ispparam_map[frameId].awb_cfg_v201 = awbParams->data()->result; 
 | 
  
 | 
            } 
 | 
        } else { 
 | 
            /* use the latest */ 
 | 
            SmartLock locker (_isp_params_cfg_mutex); 
 | 
            if (!_effecting_ispparam_map.empty()) { 
 | 
                _effecting_ispparam_map[frameId].awb_cfg_v201 = (_effecting_ispparam_map.rbegin())->second.awb_cfg_v201; 
 | 
                LOGW_CAMHW_SUBM(ISP20HW_SUBM, "use frame %d awb params for frame %d !\n", 
 | 
                                frameId, (_effecting_ispparam_map.rbegin())->first); 
 | 
            } else { 
 | 
                LOGW_CAMHW_SUBM(ISP20HW_SUBM, "get awb params from 3a result failed for frame %d !\n", frameId); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // TODO: merge_isp_results would cause the compile warning: reference to ‘merge_isp_results’ is ambiguous 
 | 
    // now use Isp21Params::merge_isp_results instead 
 | 
    if (Isp21Params::merge_isp_results(ready_results, &update_params) != XCAM_RETURN_NO_ERROR) 
 | 
        LOGE_CAMHW_SUBM(ISP20HW_SUBM, "ISP parameter translation error\n"); 
 | 
  
 | 
    uint64_t module_en_update_partial = 0; 
 | 
    uint64_t module_cfg_update_partial = 0; 
 | 
    gen_full_isp_params(&update_params, &_full_active_isp21_params, 
 | 
                        &module_en_update_partial, &module_cfg_update_partial); 
 | 
  
 | 
    if (_state == CAM_HW_STATE_STOPPED) 
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx", 
 | 
                        _full_active_isp21_params.module_ens, 
 | 
                        _full_active_isp21_params.module_en_update, 
 | 
                        _full_active_isp21_params.module_cfg_update); 
 | 
#ifdef RUNTIME_MODULE_DEBUG 
 | 
    _full_active_isp21_params.module_en_update &= ~g_disable_isp_modules_en; 
 | 
    _full_active_isp21_params.module_ens |= g_disable_isp_modules_en; 
 | 
    _full_active_isp21_params.module_cfg_update &= ~g_disable_isp_modules_cfg_update; 
 | 
    module_en_update_partial = _full_active_isp21_params.module_en_update; 
 | 
    module_cfg_update_partial = _full_active_isp21_params.module_cfg_update; 
 | 
#endif 
 | 
  
 | 
    { 
 | 
        SmartLock locker (_isp_params_cfg_mutex); 
 | 
        if (frameId < 0) { 
 | 
            _effecting_ispparam_map[0].isp_params_v21 = _full_active_isp21_params; 
 | 
        } else { 
 | 
            _effecting_ispparam_map[frameId].isp_params_v21 = _full_active_isp21_params; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    if (v4l2buf.ptr()) { 
 | 
        struct isp21_isp_params_cfg* isp_params; 
 | 
        int buf_index = v4l2buf->get_buf().index; 
 | 
  
 | 
        isp_params = (struct isp21_isp_params_cfg*)v4l2buf->get_buf().m.userptr; 
 | 
        *isp_params = _full_active_isp21_params; 
 | 
        isp_params->module_en_update = module_en_update_partial; 
 | 
        isp_params->module_cfg_update = module_cfg_update_partial; 
 | 
        //TODO: isp driver has bug now, lsc cfg_up should be set along with 
 | 
        //en_up 
 | 
        if (isp_params->module_cfg_update & ISP2X_MODULE_LSC) 
 | 
            isp_params->module_en_update |= ISP2X_MODULE_LSC; 
 | 
        isp_params->frame_id = frameId; 
 | 
  
 | 
#if 0 //TODO: isp21 params has no exposure info field 
 | 
        SmartPtr<SensorHw> mSensorSubdev = mSensorDev.dynamic_cast_ptr<SensorHw>(); 
 | 
        if (mSensorSubdev.ptr()) { 
 | 
            memset(&isp_params->exposure, 0, sizeof(isp_params->exposure)); 
 | 
            SmartPtr<RkAiqExpParamsProxy> expParam; 
 | 
  
 | 
            if (mSensorSubdev->getEffectiveExpParams(expParam, frameId) < 0) { 
 | 
                LOGE_CAMHW_SUBM(ISP20HW_SUBM, "frame_id(%d), get exposure failed!!!\n", frameId); 
 | 
            } else { 
 | 
                if (RK_AIQ_HDR_GET_WORKING_MODE(_hdr_mode) == RK_AIQ_WORKING_MODE_NORMAL) { 
 | 
                    isp_params->exposure.linear_exp.analog_gain_code_global = \ 
 | 
                            expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.analog_gain_code_global; 
 | 
                    isp_params->exposure.linear_exp.coarse_integration_time = \ 
 | 
                            expParam->data()->aecExpInfo.LinearExp.exp_sensor_params.coarse_integration_time; 
 | 
                } else { 
 | 
                    isp_params->exposure.hdr_exp[0].analog_gain_code_global = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.analog_gain_code_global; 
 | 
                    isp_params->exposure.hdr_exp[0].coarse_integration_time = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[0].exp_sensor_params.coarse_integration_time; 
 | 
                    isp_params->exposure.hdr_exp[1].analog_gain_code_global = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.analog_gain_code_global; 
 | 
                    isp_params->exposure.hdr_exp[1].coarse_integration_time = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[1].exp_sensor_params.coarse_integration_time; 
 | 
                    isp_params->exposure.hdr_exp[2].analog_gain_code_global = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.analog_gain_code_global; 
 | 
                    isp_params->exposure.hdr_exp[2].coarse_integration_time = \ 
 | 
                            expParam->data()->aecExpInfo.HdrExp[2].exp_sensor_params.coarse_integration_time; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
#endif 
 | 
        if (mIspParamsDev->queue_buffer (v4l2buf) != 0) { 
 | 
            LOGE_CAMHW_SUBM(ISP20HW_SUBM, "RKISP1: failed to ioctl VIDIOC_QBUF for index %d, %d %s.\n", 
 | 
                            buf_index, errno, strerror(errno)); 
 | 
            mIspParamsDev->return_buffer_to_pool (v4l2buf); 
 | 
            return XCAM_RETURN_ERROR_IOCTL; 
 | 
        } 
 | 
  
 | 
        ispModuleEns = _full_active_isp21_params.module_ens; 
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "ispparam ens 0x%llx, en_up 0x%llx, cfg_up 0x%llx", 
 | 
                        _full_active_isp21_params.module_ens, 
 | 
                        isp_params->module_en_update, 
 | 
                        isp_params->module_cfg_update); 
 | 
  
 | 
        LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) queue buffer index %d, queue cnt %d, check exit status again[exit: %d]", 
 | 
                        XCAM_STR (mIspParamsDev->get_device_name()), 
 | 
                        buf_index, mIspParamsDev->get_queued_bufcnt(), _is_exit); 
 | 
        if (_is_exit) 
 | 
            return XCAM_RETURN_BYPASS; 
 | 
    } else 
 | 
        return XCAM_RETURN_BYPASS; 
 | 
  
 | 
    EXIT_CAMHW_FUNCTION(); 
 | 
    return ret; 
 | 
} 
 | 
  
 | 
  
 | 
}; 
 |