/* * Copyright (c) 2019-2021 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 "RkAiqCamGroupHandleInt.h" namespace RkCam { XCamReturn RkAiqCamGroupAwbHandleInt::updateConfig(bool needSync) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (needSync) mCfgMutex.lock(); // if something changed if (updateWbV21Attr) { mCurWbV21Attr = mNewWbV21Attr; rk_aiq_uapiV2_camgroup_awbV21_SetAttrib(mAlgoCtx, mCurWbV21Attr, false); updateWbV21Attr = false; sendSignal(mCurWbV21Attr.sync.sync_mode); } if (updateWbOpModeAttr) { mCurWbOpModeAttr = mNewWbOpModeAttr; rk_aiq_uapiV2_camgroup_awb_SetMwbMode(mAlgoCtx, mCurWbOpModeAttr.mode, false); updateWbOpModeAttr = false; sendSignal(mCurWbOpModeAttr.sync.sync_mode); } if (updateWbMwbAttr) { mCurWbMwbAttr = mNewWbMwbAttr; rk_aiq_uapiV2_camgroup_awb_SetMwbAttrib(mAlgoCtx, mCurWbMwbAttr, false); updateWbMwbAttr = false; sendSignal(mCurWbMwbAttr.sync.sync_mode); } if (updateWbAwbWbGainAdjustAttr) { mCurWbAwbWbGainAdjustAttr = mNewWbAwbWbGainAdjustAttr; rk_aiq_uapiV2_camgroup_awb_SetAwbGainAdjust(mAlgoCtx, mCurWbAwbWbGainAdjustAttr, false); updateWbAwbWbGainAdjustAttr = false; sendSignal(mCurWbAwbWbGainAdjustAttr.sync.sync_mode); } if (updateWbAwbWbGainOffsetAttr) { mCurWbAwbWbGainOffsetAttr = mNewWbAwbWbGainOffsetAttr; rk_aiq_uapiV2_camgroup_awb_SetAwbGainOffset(mAlgoCtx, mCurWbAwbWbGainOffsetAttr.gainOffset, false); updateWbAwbWbGainOffsetAttr = false; sendSignal(mCurWbAwbWbGainOffsetAttr.sync.sync_mode); } if (updateWbAwbMultiWindowAttr) { mCurWbAwbMultiWindowAttr = mNewWbAwbMultiWindowAttr; rk_aiq_uapiV2_camgroup_awb_SetAwbMultiwindow(mAlgoCtx, mCurWbAwbMultiWindowAttr.multiWindw, false); updateWbAwbMultiWindowAttr = false; sendSignal(mCurWbAwbMultiWindowAttr.sync.sync_mode); } if (needSync) mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setWbV21Attrib(rk_aiq_uapiV2_wbV21_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(&mCurWbV21Attr, &att, sizeof(rk_aiq_uapiV2_wbV21_attrib_t))) { mNewWbV21Attr = att; updateWbV21Attr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getWbV21Attrib(rk_aiq_uapiV2_wbV21_attrib_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awbV21_GetAttrib(mAlgoCtx, att); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbV21Attr) { memcpy(att, &mNewWbV21Attr, sizeof(mNewWbV21Attr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awbV21_GetAttrib(mAlgoCtx, att); att->sync.sync_mode = mNewWbV21Attr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getCct(rk_aiq_wb_cct_t* cct) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_GetCCT(mAlgoCtx, cct); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::queryWBInfo(rk_aiq_wb_querry_info_t* wb_querry_info) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_QueryWBInfo(mAlgoCtx, wb_querry_info); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::lock() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_Lock(mAlgoCtx); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::unlock() { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_Unlock(mAlgoCtx); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setWbOpModeAttrib(rk_aiq_uapiV2_wb_opMode_t att) { 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 (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewWbOpModeAttr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbOpModeAttr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbOpModeAttr = att; updateWbOpModeAttr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getWbOpModeAttrib(rk_aiq_uapiV2_wb_opMode_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awb_GetMwbMode(mAlgoCtx, &att->mode); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbOpModeAttr) { memcpy(att, &mNewWbOpModeAttr, sizeof(mNewWbOpModeAttr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awb_GetMwbMode(mAlgoCtx, &att->mode); att->sync.sync_mode = mNewWbOpModeAttr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setMwbAttrib(rk_aiq_wb_mwb_attrib_t att) { 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 (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewWbMwbAttr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbMwbAttr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbMwbAttr = att; updateWbMwbAttr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getMwbAttrib(rk_aiq_wb_mwb_attrib_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awb_GetMwbAttrib(mAlgoCtx, att); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbMwbAttr) { memcpy(att, &mNewWbMwbAttr, sizeof(mNewWbMwbAttr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awb_GetMwbAttrib(mAlgoCtx, att); att->sync.sync_mode = mNewWbMwbAttr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setWbAwbWbGainAdjustAttrib(rk_aiq_uapiV2_wb_awb_wbGainAdjust_t att) { 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 (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewWbAwbWbGainAdjustAttr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbAwbWbGainAdjustAttr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbAwbWbGainAdjustAttr = att; updateWbAwbWbGainAdjustAttr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getWbAwbWbGainAdjustAttrib(rk_aiq_uapiV2_wb_awb_wbGainAdjust_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awb_GetAwbGainAdjust(mAlgoCtx, att); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbAwbWbGainAdjustAttr) { memcpy(att, &mNewWbAwbWbGainAdjustAttr, sizeof(mNewWbAwbWbGainAdjustAttr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awb_GetAwbGainAdjust(mAlgoCtx, att); att->sync.sync_mode = mNewWbAwbWbGainAdjustAttr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setWbAwbWbGainOffsetAttrib(rk_aiq_uapiV2_wb_awb_wbGainOffset_t att) { 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 (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewWbAwbWbGainOffsetAttr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbAwbWbGainOffsetAttr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbAwbWbGainOffsetAttr = att; updateWbAwbWbGainOffsetAttr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getWbAwbWbGainOffsetAttrib(rk_aiq_uapiV2_wb_awb_wbGainOffset_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awb_GetAwbGainOffset(mAlgoCtx, &att->gainOffset); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbAwbWbGainOffsetAttr) { memcpy(att, &mNewWbAwbWbGainOffsetAttr, sizeof(mNewWbAwbWbGainOffsetAttr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awb_GetAwbGainOffset(mAlgoCtx, &att->gainOffset); att->sync.sync_mode = mNewWbAwbWbGainOffsetAttr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::setWbAwbMultiWindowAttrib(rk_aiq_uapiV2_wb_awb_mulWindow_t att) { 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 (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mNewWbAwbMultiWindowAttr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbAwbMultiWindowAttr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbAwbMultiWindowAttr = att; updateWbAwbMultiWindowAttr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getWbAwbMultiWindowAttrib(rk_aiq_uapiV2_wb_awb_mulWindow_t* att) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) { mCfgMutex.lock(); rk_aiq_uapiV2_camgroup_awb_GetAwbMultiwindow(mAlgoCtx, &att->multiWindw); att->sync.done = true; mCfgMutex.unlock(); } else { if (updateWbAwbMultiWindowAttr) { memcpy(att, &mNewWbAwbMultiWindowAttr, sizeof(mNewWbAwbMultiWindowAttr)); att->sync.done = false; } else { rk_aiq_uapiV2_camgroup_awb_GetAwbMultiwindow(mAlgoCtx, &att->multiWindw); att->sync.sync_mode = mNewWbAwbMultiWindowAttr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getAlgoStat(rk_tool_awb_stat_res_full_t *awb_stat_algo) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_GetAlgoStat(mAlgoCtx, awb_stat_algo); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqCamGroupAwbHandleInt::getStrategyResult(rk_tool_awb_strategy_result_t *awb_strategy_result) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; rk_aiq_uapiV2_camgroup_awb_GetStrategyResult(mAlgoCtx, awb_strategy_result); EXIT_ANALYZER_FUNCTION(); return ret; } }; // namespace RkCam