/* * Copyright (c) 2019-2022 Rockchip Eletronics Co., Ltd. * * 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 "RkAiqAnrHandle.h" #include "RkAiqCore.h" namespace RkCam { DEFINE_HANDLE_REGISTER_TYPE(RkAiqAnrHandleInt); void RkAiqAnrHandleInt::init() { ENTER_ANALYZER_FUNCTION(); RkAiqHandle::deInit(); mConfig = (RkAiqAlgoCom*)(new RkAiqAlgoConfigAnr()); mPreInParam = (RkAiqAlgoCom*)(new RkAiqAlgoPreAnr()); mPreOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoPreResAnr()); mProcInParam = (RkAiqAlgoCom*)(new RkAiqAlgoProcAnr()); mProcOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoProcResAnr()); mPostInParam = (RkAiqAlgoCom*)(new RkAiqAlgoPostAnr()); mPostOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoPostResAnr()); EXIT_ANALYZER_FUNCTION(); } XCamReturn RkAiqAnrHandleInt::updateConfig(bool needSync) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (needSync) mCfgMutex.lock(); // if something changed if (updateAtt) { mCurAtt = mNewAtt; updateAtt = false; // TODO rk_aiq_uapi_anr_SetAttrib(mAlgoCtx, &mCurAtt, false); sendSignal(); } if (UpdateIQpara) { mCurIQpara = mNewIQpara; UpdateIQpara = false; rk_aiq_uapi_anr_SetIQPara(mAlgoCtx, &mCurIQpara, false); sendSignal(); } if (needSync) mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setAttrib(rk_aiq_nr_attrib_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); // TODO // check if there is different between att & mCurAtt // if something changed, set att to mNewAtt, and // the new params will be effective later when updateConfig // called by RkAiqCore // if something changed if (0 != memcmp(&mCurAtt, att, sizeof(rk_aiq_nr_attrib_t))) { RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; CalibDbV2_MFNR_t* mfnr = (CalibDbV2_MFNR_t*)CALIBDBV2_GET_MODULE_PTR((void*)(sharedCom->calibv2), mfnr_v1); if (mfnr && mfnr->TuningPara.enable && mfnr->TuningPara.motion_detect_en) { if ((att->eMode == ANR_OP_MODE_AUTO) && (!att->stAuto.mfnrEn)) { att->stAuto.mfnrEn = !att->stAuto.mfnrEn; LOGE("motion detect is running, operate not permit!"); goto EXIT; } else if ((att->eMode == ANR_OP_MODE_MANUAL) && (!att->stManual.mfnrEn)) { att->stManual.mfnrEn = !att->stManual.mfnrEn; LOGE("motion detect is running, operate not permit!"); goto EXIT; } } mNewAtt = *att; updateAtt = true; waitSignal(); } EXIT: mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getAttrib(rk_aiq_nr_attrib_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetAttrib(mAlgoCtx, att); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setIQPara(rk_aiq_nr_IQPara_t* para) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); // TODO // check if there is different between att & mCurAtt // if something changed, set att to mNewAtt, and // the new params will be effective later when updateConfig // called by RkAiqCore // if something changed if (0 != memcmp(&mCurIQpara, para, sizeof(rk_aiq_nr_IQPara_t))) { RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; CalibDbV2_MFNR_t* mfnr = (CalibDbV2_MFNR_t*)CALIBDBV2_GET_MODULE_PTR((void*)(sharedCom->calibv2), mfnr_v1); if (mfnr && mfnr->TuningPara.enable && mfnr->TuningPara.motion_detect_en) { if ((para->module_bits & (1 << ANR_MODULE_MFNR)) && !para->stMfnrPara.enable) { para->stMfnrPara.enable = !para->stMfnrPara.enable; LOGE("motion detect is running, disable mfnr is not permit!"); } } mNewIQpara = *para; UpdateIQpara = true; waitSignal(); } EXIT: mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getIQPara(rk_aiq_nr_IQPara_t* para) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetIQPara(mAlgoCtx, para); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setLumaSFStrength(float fPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_SetLumaSFStrength(mAlgoCtx, fPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setLumaTFStrength(float fPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_SetLumaTFStrength(mAlgoCtx, fPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getLumaSFStrength(float* pPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetLumaSFStrength(mAlgoCtx, pPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getLumaTFStrength(float* pPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetLumaTFStrength(mAlgoCtx, pPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setChromaSFStrength(float fPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_SetChromaSFStrength(mAlgoCtx, fPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setChromaTFStrength(float fPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_SetChromaTFStrength(mAlgoCtx, fPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getChromaSFStrength(float* pPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetChromaSFStrength(mAlgoCtx, pPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getChromaTFStrength(float* pPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetChromaTFStrength(mAlgoCtx, pPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::setRawnrSFStrength(float fPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_SetRawnrSFStrength(mAlgoCtx, fPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::getRawnrSFStrength(float* pPercent) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = rk_aiq_uapi_anr_GetRawnrSFStrength(mAlgoCtx, pPercent); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::prepare() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = RkAiqHandle::prepare(); RKAIQCORE_CHECK_RET(ret, "anr handle prepare failed"); RkAiqAlgoConfigAnr* anr_config_int = (RkAiqAlgoConfigAnr*)mConfig; RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; ret = des->prepare(mConfig); RKAIQCORE_CHECK_RET(ret, "anr algo prepare failed"); EXIT_ANALYZER_FUNCTION(); return XCAM_RETURN_NO_ERROR; } XCamReturn RkAiqAnrHandleInt::preProcess() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoPreAnr* anr_pre_int = (RkAiqAlgoPreAnr*)mPreInParam; RkAiqAlgoPreResAnr* anr_pre_res_int = (RkAiqAlgoPreResAnr*)mPreOutParam; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; ret = RkAiqHandle::preProcess(); if (ret) { RKAIQCORE_CHECK_RET(ret, "anr handle preProcess failed"); } RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; ret = des->pre_process(mPreInParam, mPreOutParam); RKAIQCORE_CHECK_RET(ret, "anr algo pre_process failed"); EXIT_ANALYZER_FUNCTION(); return XCAM_RETURN_NO_ERROR; } XCamReturn RkAiqAnrHandleInt::processing() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoProcAnr* anr_proc_int = (RkAiqAlgoProcAnr*)mProcInParam; RkAiqAlgoProcResAnr* anr_proc_res_int = (RkAiqAlgoProcResAnr*)mProcOutParam; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; static int anr_proc_framecnt = 0; anr_proc_framecnt++; ret = RkAiqHandle::processing(); if (ret) { RKAIQCORE_CHECK_RET(ret, "anr handle processing failed"); } // TODO: fill procParam anr_proc_int->iso = sharedCom->iso; anr_proc_int->hdr_mode = sharedCom->working_mode; LOGD("%s:%d anr hdr_mode:%d \n", __FUNCTION__, __LINE__, anr_proc_int->hdr_mode); RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; ret = des->processing(mProcInParam, mProcOutParam); RKAIQCORE_CHECK_RET(ret, "anr algo processing failed"); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::postProcess() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoPostAnr* anr_post_int = (RkAiqAlgoPostAnr*)mPostInParam; RkAiqAlgoPostResAnr* anr_post_res_int = (RkAiqAlgoPostResAnr*)mPostOutParam; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; ret = RkAiqHandle::postProcess(); if (ret) { RKAIQCORE_CHECK_RET(ret, "anr handle postProcess failed"); return ret; } RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; ret = des->post_process(mPostInParam, mPostOutParam); RKAIQCORE_CHECK_RET(ret, "anr algo post_process failed"); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAnrHandleInt::genIspResult(RkAiqFullParams* params, RkAiqFullParams* cur_params) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; RkAiqAlgoProcResAnr* anr_com = (RkAiqAlgoProcResAnr*)mProcOutParam; if (!anr_com /*|| !params->mIsppOtherParams.ptr()*/) { LOGD_ANALYZER("no anr result"); return XCAM_RETURN_NO_ERROR; } if (!this->getAlgoId()) { RkAiqAlgoProcResAnr* anr_rk = (RkAiqAlgoProcResAnr*)anr_com; LOGD_ANR("oyyf: %s:%d output isp param start\n", __FUNCTION__, __LINE__); rk_aiq_isp_rawnr_params_v20_t* rawnr_params = params->mRawnrParams->data().ptr(); rawnr_params->update_mask |= RKAIQ_ISPP_NR_ID; memcpy(&rawnr_params->result, &anr_rk->stAnrProcResult.stBayernrFix, sizeof(rk_aiq_isp_rawnr_t)); rk_aiq_isp_gain_params_v20_t* gain_params = params->mGainParams->data().ptr(); memcpy(&gain_params->result, &anr_rk->stAnrProcResult.stGainFix, sizeof(rk_aiq_isp_gain_t)); rk_aiq_isp_motion_params_v20_t* motion_params = params->mMotionParams->data().ptr(); memcpy(&motion_params->result, &anr_rk->stAnrProcResult.stMotion, sizeof(anr_rk->stAnrProcResult.stMotion)); LOGD_ANR("oyyf: %s:%d output isp param end \n", __FUNCTION__, __LINE__); LOGD_ANR("oyyf: %s:%d output ispp param start\n", __FUNCTION__, __LINE__); rk_aiq_isp_ynr_params_v20_t* ynr_params = params->mYnrParams->data().ptr(); memcpy(&ynr_params->result, &anr_rk->stAnrProcResult.stYnrFix, sizeof(RKAnr_Ynr_Fix_t)); rk_aiq_isp_uvnr_params_v20_t* uvnr_params = params->mUvnrParams->data().ptr(); uvnr_params->update_mask |= RKAIQ_ISPP_NR_ID; memcpy(&uvnr_params->result, &anr_rk->stAnrProcResult.stUvnrFix, sizeof(RKAnr_Uvnr_Fix_t)); rk_aiq_isp_tnr_params_v20_t* tnr_params = params->mTnrParams->data().ptr(); memcpy(&tnr_params->result, &anr_rk->stAnrProcResult.stMfnrFix, sizeof(RKAnr_Mfnr_Fix_t)); LOGD_ANR("oyyf: %s:%d output ispp param end \n", __FUNCTION__, __LINE__); if (sharedCom->init) { rawnr_params->frame_id = 0; gain_params->frame_id = 0; motion_params->frame_id = 0; ynr_params->frame_id = 0; uvnr_params->frame_id = 0; tnr_params->frame_id = 0; } else { rawnr_params->frame_id = shared->frameId; gain_params->frame_id = shared->frameId; motion_params->frame_id = shared->frameId; ynr_params->frame_id = shared->frameId; uvnr_params->frame_id = shared->frameId; tnr_params->frame_id = shared->frameId; } } cur_params->mRawnrParams = params->mRawnrParams; cur_params->mUvnrParams = params->mUvnrParams; cur_params->mYnrParams = params->mYnrParams; cur_params->mTnrParams = params->mTnrParams; cur_params->mYnrParams = params->mYnrParams; cur_params->mGainParams = params->mGainParams; cur_params->mMotionParams = params->mMotionParams; EXIT_ANALYZER_FUNCTION(); return ret; } }; // namespace RkCam