/* * 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 "RkAiqAwbV21Handle.h" #include "RkAiqCore.h" namespace RkCam { DEFINE_HANDLE_REGISTER_TYPE(RkAiqAwbV21HandleInt); XCamReturn RkAiqAwbV21HandleInt::updateConfig(bool needSync) { ENTER_ANALYZER_FUNCTION(); XCamReturn ret = XCAM_RETURN_NO_ERROR; if (needSync) mCfgMutex.lock(); // if something changed if (updateAtt) { mCurAtt = mNewAtt; rk_aiq_uapi_awb_SetAttrib(mAlgoCtx, mCurAtt, false); updateAtt = false; sendSignal(); } if (updateWbV21Attr) { mCurWbV21Attr = mNewWbV21Attr; rk_aiq_uapiV2_awbV21_SetAttrib(mAlgoCtx, mCurWbV21Attr, false); updateWbV21Attr = false; sendSignal(mCurWbV21Attr.sync.sync_mode); } if (updateWbOpModeAttr) { mCurWbOpModeAttr = mNewWbOpModeAttr; rk_aiq_uapiV2_awb_SetMwbMode(mAlgoCtx, mCurWbOpModeAttr.mode, false); updateWbOpModeAttr = false; sendSignal(mCurWbOpModeAttr.sync.sync_mode); } if (updateWbMwbAttr) { mCurWbMwbAttr = mNewWbMwbAttr; rk_aiq_uapiV2_awb_SetMwbAttrib(mAlgoCtx, mCurWbMwbAttr, false); updateWbMwbAttr = false; sendSignal(mCurWbMwbAttr.sync.sync_mode); } if (updateWbAwbAttr) { mCurWbAwbAttr = mNewWbAwbAttr; rk_aiq_uapiV2_awbV20_SetAwbAttrib(mAlgoCtx, mCurWbAwbAttr, false); updateWbAwbAttr = false; sendSignal(); } if (updateWbAwbWbGainAdjustAttr) { mCurWbAwbWbGainAdjustAttr = mNewWbAwbWbGainAdjustAttr; rk_aiq_uapiV2_awb_SetAwbGainAdjust(mAlgoCtx, mCurWbAwbWbGainAdjustAttr, false); updateWbAwbWbGainAdjustAttr = false; sendSignal(mCurWbAwbWbGainAdjustAttr.sync.sync_mode); } if (updateWbAwbWbGainOffsetAttr) { mCurWbAwbWbGainOffsetAttr = mNewWbAwbWbGainOffsetAttr; rk_aiq_uapiV2_awb_SetAwbGainOffset(mAlgoCtx, mCurWbAwbWbGainOffsetAttr.gainOffset, false); updateWbAwbWbGainOffsetAttr = false; sendSignal(mCurWbAwbWbGainOffsetAttr.sync.sync_mode); } if (updateWbAwbMultiWindowAttr) { mCurWbAwbMultiWindowAttr = mNewWbAwbMultiWindowAttr; rk_aiq_uapiV2_awb_SetAwbMultiwindow(mAlgoCtx, mCurWbAwbMultiWindowAttr.multiWindw, false); updateWbAwbMultiWindowAttr = false; sendSignal(mCurWbAwbMultiWindowAttr.sync.sync_mode); } if (needSync) mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAwbV21HandleInt::setWbV21Attrib(rk_aiq_uapiV2_wbV21_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(&mNewWbV21Attr, &att, sizeof(att))) isChanged = true; else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \ memcmp(&mCurWbV21Attr, &att, sizeof(att))) isChanged = true; // if something changed if (isChanged) { mNewWbV21Attr = att; updateWbV21Attr = true; waitSignal(att.sync.sync_mode); } mCfgMutex.unlock(); EXIT_ANALYZER_FUNCTION(); return ret; } XCamReturn RkAiqAwbV21HandleInt::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_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_awbV21_GetAttrib(mAlgoCtx, att); att->sync.sync_mode = mNewWbV21Attr.sync.sync_mode; att->sync.done = true; } } EXIT_ANALYZER_FUNCTION(); return ret; } }; // namespace RkCam