/* * 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 "RkAiqAeHandle.h" #include "RkAiqCore.h" namespace RkCam { DEFINE_HANDLE_REGISTER_TYPE(RkAiqAeHandleInt); void RkAiqAeHandleInt::init() { ENTER_ANALYZER_FUNCTION(); RkAiqHandle::deInit(); mConfig = (RkAiqAlgoCom*)(new RkAiqAlgoConfigAe()); mPreInParam = (RkAiqAlgoCom*)(new RkAiqAlgoPreAe()); mPreOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoPreResAe()); mProcInParam = (RkAiqAlgoCom*)(new RkAiqAlgoProcAe()); mProcOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoProcResAe()); mPostInParam = (RkAiqAlgoCom*)(new RkAiqAlgoPostAe()); mPostOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoPostResAe()); EXIT_ANALYZER_FUNCTION(); } XCamReturn RkAiqAeHandleInt::updateConfig(bool needSync) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (needSync) mCfgMutex.lock(); // if something changed, api will modify aecCfg in mAlgoCtx if (updateExpSwAttr) { mCurExpSwAttr = mNewExpSwAttr; rk_aiq_uapi_ae_convExpSwAttr_v1Tov2(&mCurExpSwAttr, &mCurExpSwAttrV2); rk_aiq_uapi_ae_setExpSwAttr(mAlgoCtx, &mCurExpSwAttrV2, false, false); updateExpSwAttr = false; updateAttr |= UPDATE_EXPSWATTR; sendSignal(); } if (updateLinExpAttr) { mCurLinExpAttr = mNewLinExpAttr; rk_aiq_uapi_ae_convLinExpAttr_v1Tov2(&mCurLinExpAttr, &mCurLinExpAttrV2); rk_aiq_uapi_ae_setLinExpAttr(mAlgoCtx, &mCurLinExpAttrV2, false, false); updateLinExpAttr = false; updateAttr |= UPDATE_LINEXPATTR; sendSignal(); } if (updateHdrExpAttr) { mCurHdrExpAttr = mNewHdrExpAttr; rk_aiq_uapi_ae_convHdrExpAttr_v1Tov2(&mCurHdrExpAttr, &mCurHdrExpAttrV2); rk_aiq_uapi_ae_setHdrExpAttr(mAlgoCtx, &mCurHdrExpAttrV2, false, false); updateHdrExpAttr = false; updateAttr |= UPDATE_HDREXPATTR; sendSignal(); } // TODO: update v2 if (updateExpSwAttrV2) { mCurExpSwAttrV2 = mNewExpSwAttrV2; rk_aiq_uapi_ae_setExpSwAttr(mAlgoCtx, &mCurExpSwAttrV2, false, false); updateExpSwAttrV2 = false; updateAttr |= UPDATE_EXPSWATTR; sendSignal(mCurExpSwAttrV2.sync.sync_mode); } if (updateLinExpAttrV2) { mCurLinExpAttrV2 = mNewLinExpAttrV2; rk_aiq_uapi_ae_setLinExpAttr(mAlgoCtx, &mCurLinExpAttrV2, false, false); updateLinExpAttrV2 = false; updateAttr |= UPDATE_LINEXPATTR; sendSignal(mCurLinExpAttrV2.sync.sync_mode); } if (updateHdrExpAttrV2) { mCurHdrExpAttrV2 = mNewHdrExpAttrV2; rk_aiq_uapi_ae_setHdrExpAttr(mAlgoCtx, &mCurHdrExpAttrV2, false, false); updateHdrExpAttrV2 = false; updateAttr |= UPDATE_HDREXPATTR; sendSignal(mCurHdrExpAttrV2.sync.sync_mode); } if (updateLinAeRouteAttr) { mCurLinAeRouteAttr = mNewLinAeRouteAttr; rk_aiq_uapi_ae_setLinAeRouteAttr(mAlgoCtx, &mCurLinAeRouteAttr, false, false); updateLinAeRouteAttr = false; updateAttr |= UPDATE_LINAEROUTEATTR; sendSignal(mCurLinAeRouteAttr.sync.sync_mode); } if (updateHdrAeRouteAttr) { mCurHdrAeRouteAttr = mNewHdrAeRouteAttr; rk_aiq_uapi_ae_setHdrAeRouteAttr(mAlgoCtx, &mCurHdrAeRouteAttr, false, false); updateHdrAeRouteAttr = false; updateAttr |= UPDATE_HDRAEROUTEATTR; sendSignal(mCurHdrAeRouteAttr.sync.sync_mode); } if (updateIrisAttr) { mCurIrisAttr = mNewIrisAttr; rk_aiq_uapi_ae_setIrisAttr(mAlgoCtx, &mCurIrisAttr, false); updateIrisAttr = false; updateAttr |= UPDATE_IRISATTR; sendSignal(mCurIrisAttr.sync.sync_mode); } if (updateSyncTestAttr) { mCurAecSyncTestAttr = mNewAecSyncTestAttr; rk_aiq_uapi_ae_setSyncTest(mAlgoCtx, &mCurAecSyncTestAttr, false, false); updateSyncTestAttr = false; updateAttr |= UPDATE_SYNCTESTATTR; sendSignal(mCurAecSyncTestAttr.sync.sync_mode); } if (updateExpWinAttr) { mCurExpWinAttr = mNewExpWinAttr; rk_aiq_uapi_ae_setExpWinAttr(mAlgoCtx, &mCurExpWinAttr, false); updateExpWinAttr = false; updateAttr |= UPDATE_EXPWINATTR; sendSignal(mCurExpWinAttr.sync.sync_mode); } // once any params are changed, run reconfig to convert aecCfg to paectx AeInstanceConfig_t* pAeInstConfig = (AeInstanceConfig_t*)mAlgoCtx; AeConfig_t pAecCfg = pAeInstConfig->aecCfg; pAecCfg->IsReconfig |= updateAttr; updateAttr = 0; if (needSync) mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setExpSwAttr(Uapi_ExpSwAttr_t ExpSwAttr) { 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(&mCurExpSwAttr, &ExpSwAttr, sizeof(Uapi_ExpSwAttr_t))) { mNewExpSwAttr = ExpSwAttr; updateExpSwAttr = true; waitSignal(); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getExpSwAttr(Uapi_ExpSwAttr_t* pExpSwAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; Uapi_ExpSwAttrV2_t ExpSwAttrV2; rk_aiq_uapi_ae_getExpSwAttr(mAlgoCtx, &mCurExpSwAttrV2, false); rk_aiq_uapi_ae_convExpSwAttr_v2Tov1(&mCurExpSwAttrV2, pExpSwAttr); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setExpSwAttr(Uapi_ExpSwAttrV2_t ExpSwAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); // check if there is different between att & mCurAtt(sync)/mNewAtt(async) // if something changed, set att to mNewAtt, and // the new params will be effective later when updateConfig // called by RkAiqCore bool isChanged = false; if (ExpSwAttrV2.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewExpSwAttrV2, &ExpSwAttrV2, sizeof(ExpSwAttrV2))) isChanged = true; else if (ExpSwAttrV2.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurExpSwAttrV2, &ExpSwAttrV2, sizeof(ExpSwAttrV2))) isChanged = true; // if something changed if (isChanged) { mNewExpSwAttrV2 = ExpSwAttrV2; updateExpSwAttrV2 = true; waitSignal(ExpSwAttrV2.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getExpSwAttr(Uapi_ExpSwAttrV2_t* pExpSwAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pExpSwAttrV2->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getExpSwAttr(mAlgoCtx, pExpSwAttrV2, false); pExpSwAttrV2->sync.done = true; mCfgMutex.unlock(); } else { if (updateExpSwAttrV2) { memcpy(pExpSwAttrV2, &mNewExpSwAttrV2, sizeof(mNewExpSwAttrV2)); pExpSwAttrV2->sync.done = false; } else { rk_aiq_uapi_ae_getExpSwAttr(mAlgoCtx, pExpSwAttrV2, false); pExpSwAttrV2->sync.sync_mode = mNewExpSwAttrV2.sync.sync_mode; pExpSwAttrV2->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setLinExpAttr(Uapi_LinExpAttr_t LinExpAttr) { 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(& mCurLinExpAttr, &LinExpAttr, sizeof(Uapi_LinExpAttr_t))) { mNewLinExpAttr = LinExpAttr; updateLinExpAttr = true; waitSignal(); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getLinExpAttr(Uapi_LinExpAttr_t* pLinExpAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapi_ae_getLinExpAttr(mAlgoCtx, &mCurLinExpAttrV2, false); rk_aiq_uapi_ae_convLinExpAttr_v2Tov1(&mCurLinExpAttrV2, pLinExpAttr); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setLinExpAttr(Uapi_LinExpAttrV2_t LinExpAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); // check if there is different between att & mCurAtt(sync)/mNewAtt(async) // if something changed, set att to mNewAtt, and // the new params will be effective later when updateConfig // called by RkAiqCore bool isChanged = false; if (LinExpAttrV2.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewLinExpAttrV2, &LinExpAttrV2, sizeof(LinExpAttrV2))) isChanged = true; else if (LinExpAttrV2.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurLinExpAttrV2, &LinExpAttrV2, sizeof(LinExpAttrV2))) isChanged = true; // if something changed if (isChanged) { mNewLinExpAttrV2 = LinExpAttrV2; updateLinExpAttrV2 = true; waitSignal(LinExpAttrV2.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getLinExpAttr(Uapi_LinExpAttrV2_t* pLinExpAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pLinExpAttrV2->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getLinExpAttr(mAlgoCtx, pLinExpAttrV2, false); pLinExpAttrV2->sync.done = true; mCfgMutex.unlock(); } else { if (updateLinExpAttrV2) { memcpy(pLinExpAttrV2, &mNewLinExpAttrV2, sizeof(mNewLinExpAttrV2)); pLinExpAttrV2->sync.done = false; } else { rk_aiq_uapi_ae_getLinExpAttr(mAlgoCtx, pLinExpAttrV2, false); pLinExpAttrV2->sync.sync_mode = mNewLinExpAttrV2.sync.sync_mode; pLinExpAttrV2->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setHdrExpAttr(Uapi_HdrExpAttr_t HdrExpAttr) { 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(&mCurHdrExpAttr, &HdrExpAttr, sizeof(Uapi_HdrExpAttr_t))) { mNewHdrExpAttr = HdrExpAttr; updateHdrExpAttr = true; waitSignal(); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getHdrExpAttr(Uapi_HdrExpAttr_t* pHdrExpAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapi_ae_getHdrExpAttr(mAlgoCtx, &mCurHdrExpAttrV2, false); rk_aiq_uapi_ae_convHdrExpAttr_v2Tov1(&mCurHdrExpAttrV2, pHdrExpAttr); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setHdrExpAttr(Uapi_HdrExpAttrV2_t HdrExpAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (HdrExpAttrV2.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewHdrExpAttrV2, &HdrExpAttrV2, sizeof(HdrExpAttrV2))) isChanged = true; else if (HdrExpAttrV2.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurHdrExpAttrV2, &HdrExpAttrV2, sizeof(HdrExpAttrV2))) isChanged = true; // if something changed if (isChanged) { mNewHdrExpAttrV2 = HdrExpAttrV2; updateHdrExpAttrV2 = true; waitSignal(HdrExpAttrV2.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getHdrExpAttr(Uapi_HdrExpAttrV2_t* pHdrExpAttrV2) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pHdrExpAttrV2->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getHdrExpAttr(mAlgoCtx, pHdrExpAttrV2, false); pHdrExpAttrV2->sync.done = true; mCfgMutex.unlock(); } else { if (updateHdrExpAttrV2) { memcpy(pHdrExpAttrV2, &mNewHdrExpAttrV2, sizeof(mNewHdrExpAttrV2)); pHdrExpAttrV2->sync.done = false; } else { rk_aiq_uapi_ae_getHdrExpAttr(mAlgoCtx, pHdrExpAttrV2, false); pHdrExpAttrV2->sync.sync_mode = mNewHdrExpAttrV2.sync.sync_mode; pHdrExpAttrV2->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setLinAeRouteAttr(Uapi_LinAeRouteAttr_t LinAeRouteAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (LinAeRouteAttr.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewLinAeRouteAttr, &LinAeRouteAttr, sizeof(LinAeRouteAttr))) isChanged = true; else if (LinAeRouteAttr.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurLinAeRouteAttr, &LinAeRouteAttr, sizeof(LinAeRouteAttr))) isChanged = true; // if something changed if (isChanged) { mNewLinAeRouteAttr = LinAeRouteAttr; updateLinAeRouteAttr = true; waitSignal(LinAeRouteAttr.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getLinAeRouteAttr(Uapi_LinAeRouteAttr_t* pLinAeRouteAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pLinAeRouteAttr->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getLinAeRouteAttr(mAlgoCtx, pLinAeRouteAttr, false); pLinAeRouteAttr->sync.done = true; mCfgMutex.unlock(); } else { if (updateLinAeRouteAttr) { memcpy(pLinAeRouteAttr, &mNewLinAeRouteAttr, sizeof(mNewLinAeRouteAttr)); pLinAeRouteAttr->sync.done = false; } else { rk_aiq_uapi_ae_getLinAeRouteAttr(mAlgoCtx, pLinAeRouteAttr, false); pLinAeRouteAttr->sync.sync_mode = mNewLinAeRouteAttr.sync.sync_mode; pLinAeRouteAttr->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setHdrAeRouteAttr(Uapi_HdrAeRouteAttr_t HdrAeRouteAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (HdrAeRouteAttr.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewHdrAeRouteAttr, &HdrAeRouteAttr, sizeof(HdrAeRouteAttr))) isChanged = true; else if (HdrAeRouteAttr.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurHdrAeRouteAttr, &HdrAeRouteAttr, sizeof(HdrAeRouteAttr))) isChanged = true; // if something changed if (isChanged) { mNewHdrAeRouteAttr = HdrAeRouteAttr; updateHdrAeRouteAttr = true; waitSignal(HdrAeRouteAttr.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getHdrAeRouteAttr(Uapi_HdrAeRouteAttr_t* pHdrAeRouteAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pHdrAeRouteAttr->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getHdrAeRouteAttr(mAlgoCtx, pHdrAeRouteAttr, false); pHdrAeRouteAttr->sync.done = true; mCfgMutex.unlock(); } else { if (updateHdrAeRouteAttr) { memcpy(pHdrAeRouteAttr, &mNewHdrAeRouteAttr, sizeof(mNewHdrAeRouteAttr)); pHdrAeRouteAttr->sync.done = false; } else { rk_aiq_uapi_ae_getHdrAeRouteAttr(mAlgoCtx, pHdrAeRouteAttr, false); pHdrAeRouteAttr->sync.sync_mode = mNewHdrAeRouteAttr.sync.sync_mode; pHdrAeRouteAttr->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setIrisAttr(Uapi_IrisAttrV2_t IrisAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (IrisAttr.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewIrisAttr, &IrisAttr, sizeof(IrisAttr))) isChanged = true; else if (IrisAttr.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurIrisAttr, &IrisAttr, sizeof(IrisAttr))) isChanged = true; // if something changed if (isChanged) { mNewIrisAttr = IrisAttr; updateIrisAttr = true; waitSignal(IrisAttr.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getIrisAttr(Uapi_IrisAttrV2_t* pIrisAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pIrisAttr->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getIrisAttr(mAlgoCtx, pIrisAttr); pIrisAttr->sync.done = true; mCfgMutex.unlock(); } else { if (updateIrisAttr) { memcpy(pIrisAttr, &mNewIrisAttr, sizeof(mNewIrisAttr)); pIrisAttr->sync.done = false; } else { rk_aiq_uapi_ae_getIrisAttr(mAlgoCtx, pIrisAttr); pIrisAttr->sync.sync_mode = mNewIrisAttr.sync.sync_mode; pIrisAttr->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setSyncTestAttr(Uapi_AecSyncTest_t SyncTestAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (SyncTestAttr.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewAecSyncTestAttr, &SyncTestAttr, sizeof(SyncTestAttr))) isChanged = true; else if (SyncTestAttr.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurAecSyncTestAttr, &SyncTestAttr, sizeof(SyncTestAttr))) isChanged = true; // if something changed if (isChanged) { mNewAecSyncTestAttr = SyncTestAttr; updateSyncTestAttr = true; waitSignal(SyncTestAttr.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getSyncTestAttr(Uapi_AecSyncTest_t* pSyncTestAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pSyncTestAttr->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getSyncTest(mAlgoCtx, pSyncTestAttr, false); pSyncTestAttr->sync.done = true; mCfgMutex.unlock(); } else { if (updateSyncTestAttr) { memcpy(pSyncTestAttr, &mNewAecSyncTestAttr, sizeof(mNewAecSyncTestAttr)); pSyncTestAttr->sync.done = false; } else { rk_aiq_uapi_ae_getSyncTest(mAlgoCtx, pSyncTestAttr, false); pSyncTestAttr->sync.sync_mode = mNewAecSyncTestAttr.sync.sync_mode; pSyncTestAttr->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setExpWinAttr(Uapi_ExpWin_t ExpWinAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mCfgMutex.lock(); bool isChanged = false; if (ExpWinAttr.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewExpWinAttr, &ExpWinAttr, sizeof(ExpWinAttr))) isChanged = true; else if (ExpWinAttr.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurExpWinAttr, &ExpWinAttr, sizeof(ExpWinAttr))) isChanged = true; // if something changed if (isChanged) { mNewExpWinAttr = ExpWinAttr; updateExpWinAttr = true; waitSignal(ExpWinAttr.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::getExpWinAttr(Uapi_ExpWin_t* pExpWinAttr) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (pExpWinAttr->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapi_ae_getExpWinAttr(mAlgoCtx, pExpWinAttr); pExpWinAttr->sync.done = true; mCfgMutex.unlock(); } else { if (updateExpWinAttr) { memcpy(pExpWinAttr, &mNewExpWinAttr, sizeof(mNewExpWinAttr)); pExpWinAttr->sync.done = false; } else { rk_aiq_uapi_ae_getExpWinAttr(mAlgoCtx, pExpWinAttr); pExpWinAttr->sync.sync_mode = mNewExpWinAttr.sync.sync_mode; pExpWinAttr->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::queryExpInfo(Uapi_ExpQueryInfo_t* pExpQueryInfo) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapi_ae_queryExpInfo(mAlgoCtx, pExpQueryInfo, false); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::setLockAeForAf(bool lock_ae) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; mLockAebyAfMutex.lock(); lockaebyaf = lock_ae; mLockAebyAfMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::prepare() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; ret = RkAiqHandle::prepare(); RKAIQCORE_CHECK_RET(ret, "ae handle prepare failed"); RkAiqAlgoConfigAe* ae_config_int = (RkAiqAlgoConfigAe*)mConfig; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; // TODO config ae common params: /*****************AecConfig Sensor Exp related info*****************/ ae_config_int->LinePeriodsPerField = (float)sharedCom->snsDes.frame_length_lines; ae_config_int->PixelPeriodsPerLine = (float)sharedCom->snsDes.line_length_pck; ae_config_int->PixelClockFreqMHZ = (float)sharedCom->snsDes.pixel_clock_freq_mhz; /*****************AecConfig pic-info params*****************/ ae_config_int->RawWidth = sharedCom->snsDes.isp_acq_width; ae_config_int->RawHeight = sharedCom->snsDes.isp_acq_height; ae_config_int->nr_switch = sharedCom->snsDes.nr_switch; RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; ret = des->prepare(mConfig); RKAIQCORE_CHECK_RET(ret, "ae algo prepare failed"); EXIT_ANALYZER_FUNCTION(); return XCAM_RETURN_NO_ERROR; } XCamReturn RkAiqAeHandleInt::preProcess() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoPreAe* ae_pre_int = (RkAiqAlgoPreAe*)mPreInParam; bool postMsg = true; if (mDes->id == 0) { mPreResShared = new RkAiqAlgoPreResAeIntShared(); if (!mPreResShared.ptr()) { LOGE("new ae mPreOutParam failed, bypass!"); return XCAM_RETURN_BYPASS; } } RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; ret = RkAiqHandle::preProcess(); if (ret) { RKAIQCORE_CHECK_RET(ret, "ae handle preProcess failed"); } RkAiqAecStats* xAecStats = nullptr; if (shared->aecStatsBuf) { xAecStats = (RkAiqAecStats*)shared->aecStatsBuf->map(shared->aecStatsBuf); if (!xAecStats) LOGE_AEC("aec stats is null"); } else { LOGW_AEC("the xcamvideobuffer of aec stats is null"); } if ((!xAecStats || !xAecStats->aec_stats_valid) && !sharedCom->init) { LOGW("no aec stats, ignore!"); return XCAM_RETURN_BYPASS; } ae_pre_int->aecStatsBuf = shared->aecStatsBuf; RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; if (des->pre_process) ret = des->pre_process(mPreInParam, (RkAiqAlgoResCom*)(&mPreResShared->result)); RKAIQCORE_CHECK_RET(ret, "ae algo pre_process failed"); if (mPostShared && !mAiqCore->mAlogsComSharedParams.init) { SmartPtr msg_data = new BufferProxy(mPreResShared); msg_data->set_sequence(shared->frameId); SmartPtr msg = new RkAiqCoreVdBufMsg(XCAM_MESSAGE_AE_PRE_RES_OK, shared->frameId, msg_data); mAiqCore->post_message(msg); } EXIT_ANALYZER_FUNCTION(); return XCAM_RETURN_NO_ERROR; } XCamReturn RkAiqAeHandleInt::processing() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoProcAe* ae_proc_int = (RkAiqAlgoProcAe*)mProcInParam; bool postMsg = true; if (mDes->id == 0) { mProcResShared = new RkAiqAlgoProcResAeIntShared(); if (!mProcResShared.ptr()) { LOGE("new ae mProcOutParam failed, bypass!"); return XCAM_RETURN_BYPASS; } } RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; AeInstanceConfig_t* pAeInstConfig = (AeInstanceConfig_t*)mAlgoCtx; mLockAebyAfMutex.lock(); pAeInstConfig->lockaebyaf = lockaebyaf; mLockAebyAfMutex.unlock(); ret = RkAiqHandle::processing(); if (ret) { RKAIQCORE_CHECK_RET(ret, "ae handle processing failed"); } RkAiqAecStats* xAecStats = nullptr; if (shared->aecStatsBuf) { xAecStats = (RkAiqAecStats*)shared->aecStatsBuf->map(shared->aecStatsBuf); if (!xAecStats) LOGE_AEC("aec stats is null"); } else { LOGW_AEC("the xcamvideobuffer of aec stats is null"); } if ((!xAecStats || !xAecStats->aec_stats_valid) && !sharedCom->init) { LOGW("no aec stats, ignore!"); mProcResShared.release(); return XCAM_RETURN_BYPASS; } // TODO config common ae processing params ae_proc_int->aecStatsBuf = shared->aecStatsBuf; RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; if (des->processing) ret = des->processing(mProcInParam, (RkAiqAlgoResCom*)(&mProcResShared->result)); RKAIQCORE_CHECK_RET(ret, "ae algo processing failed"); if (mAiqCore->mAlogsComSharedParams.init) { RkAiqCore::RkAiqAlgosGroupShared_t* measGroupshared = nullptr; if (mAiqCore->getGroupSharedParams(RK_AIQ_CORE_ANALYZE_MEAS, measGroupshared) != XCAM_RETURN_NO_ERROR) LOGW("get the shared of meas failed"); if (measGroupshared) { measGroupshared->frameId = shared->frameId; } } else { if (mPostShared) { SmartPtr msg_data = new BufferProxy(mProcResShared); msg_data->set_sequence(shared->frameId); SmartPtr msg = new RkAiqCoreVdBufMsg(XCAM_MESSAGE_AE_PROC_RES_OK, shared->frameId, msg_data); mAiqCore->post_message(msg); } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::postProcess() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; RkAiqAlgoPostAe* ae_post_int = (RkAiqAlgoPostAe*)mPostInParam; RkAiqAlgoPostResAe* ae_post_res_int = (RkAiqAlgoPostResAe*)mPostOutParam; RkAiqCore::RkAiqAlgosGroupShared_t* shared = (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared()); RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams; ret = RkAiqHandle::postProcess(); if (ret) { RKAIQCORE_CHECK_RET(ret, "ae handle postProcess failed"); return ret; } RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes; if (des->post_process) ret = des->post_process(mPostInParam, mPostOutParam); RKAIQCORE_CHECK_RET(ret, "ae algo post_process failed"); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAeHandleInt::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; if (!mProcResShared.ptr()) return XCAM_RETURN_NO_ERROR; RkAiqAlgoProcResAe* ae_proc = &mProcResShared->result; RkAiqAlgoPostResAe* ae_post = (RkAiqAlgoPostResAe*)mPostOutParam; if (!ae_proc) { LOGD_ANALYZER("no ae_proc result"); return XCAM_RETURN_NO_ERROR; } if (!ae_post) { LOGD_ANALYZER("no ae_post result"); return XCAM_RETURN_NO_ERROR; } rk_aiq_isp_aec_params_v20_t* aec_param = params->mAecParams->data().ptr(); rk_aiq_isp_hist_params_v20_t* hist_param = params->mHistParams->data().ptr(); SmartPtr exp_param = params->mExposureParams->data(); SmartPtr iris_param = params->mIrisParams->data(); int algo_id = this->getAlgoId(); exp_param->aecExpInfo.LinearExp = ae_proc->new_ae_exp.LinearExp; memcpy(exp_param->aecExpInfo.HdrExp, ae_proc->new_ae_exp.HdrExp, sizeof(ae_proc->new_ae_exp.HdrExp)); exp_param->aecExpInfo.exp_i2c_params = ae_proc->new_ae_exp.exp_i2c_params; exp_param->aecExpInfo.frame_length_lines = ae_proc->new_ae_exp.frame_length_lines; exp_param->aecExpInfo.line_length_pixels = ae_proc->new_ae_exp.line_length_pixels; exp_param->aecExpInfo.pixel_clock_freq_mhz = ae_proc->new_ae_exp.pixel_clock_freq_mhz; exp_param->aecExpInfo.Iris.PIris = ae_proc->new_ae_exp.Iris.PIris; // TODO Merge // iris_param->IrisType = ae_proc->new_ae_exp.Iris.IrisType; iris_param->PIris.step = ae_proc->new_ae_exp.Iris.PIris.step; iris_param->PIris.update = ae_proc->new_ae_exp.Iris.PIris.update; #if 0 isp_param->aec_meas = ae_proc->ae_meas; isp_param->hist_meas = ae_proc->hist_meas; #else if (sharedCom->init) { aec_param->frame_id = 0; hist_param->frame_id = 0; exp_param->frame_id = 0; } else { aec_param->frame_id = shared->frameId; hist_param->frame_id = shared->frameId; exp_param->frame_id = shared->frameId; } aec_param->result = ae_proc->ae_meas; hist_param->result = ae_proc->hist_meas; #endif RkAiqAlgoProcResAe* ae_rk = (RkAiqAlgoProcResAe*)ae_proc; memcpy(exp_param->exp_tbl, ae_rk->ae_proc_res_rk.exp_set_tbl, sizeof(exp_param->exp_tbl)); exp_param->exp_tbl_size = ae_rk->ae_proc_res_rk.exp_set_cnt; exp_param->algo_id = algo_id; if (algo_id == 0) { RkAiqAlgoPostResAe* ae_post_rk = (RkAiqAlgoPostResAe*)ae_post; iris_param->DCIris.update = ae_post_rk->ae_post_res_rk.DCIris.update; iris_param->DCIris.pwmDuty = ae_post_rk->ae_post_res_rk.DCIris.pwmDuty; } cur_params->mExposureParams = params->mExposureParams; cur_params->mAecParams = params->mAecParams; cur_params->mHistParams = params->mHistParams; EXIT_ANALYZER_FUNCTION(); return ret; } }; // namespace RkCam