/*
|
* 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 "RkAiqCamGroupAgicHandle.h"
|
|
namespace RkCam {
|
|
XCamReturn RkAiqCamGroupAgicHandleInt::updateConfig(bool needSync) {
|
ENTER_ANALYZER_FUNCTION();
|
|
XCamReturn ret = XCAM_RETURN_NO_ERROR;
|
if (needSync) mCfgMutex.lock();
|
|
if (updateAttV1) {
|
mCurAttV1 = mNewAttV1;
|
rk_aiq_uapi_agic_v1_SetAttrib(mAlgoCtx, &mCurAttV1, false);
|
updateAtt = false;
|
sendSignal(mCurAttV1.sync.sync_mode);
|
}
|
|
if (updateAttV2) {
|
mCurAttV2 = mNewAttV2;
|
rk_aiq_uapi_agic_v2_SetAttrib(mAlgoCtx, &mCurAttV2, false);
|
updateAtt = false;
|
sendSignal(mCurAttV2.sync.sync_mode);
|
}
|
|
if (needSync) mCfgMutex.unlock();
|
|
EXIT_ANALYZER_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn RkAiqCamGroupAgicHandleInt::setAttribV1(const rkaiq_gic_v1_api_attr_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(&mNewAttV1, att, sizeof(*att)))
|
isChanged = true;
|
else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
|
memcmp(&mCurAttV1, att, sizeof(*att)))
|
isChanged = true;
|
|
// if something changed
|
if (isChanged) {
|
mNewAttV1 = *att;
|
updateAttV1 = true;
|
waitSignal(att->sync.sync_mode);
|
}
|
|
mCfgMutex.unlock();
|
|
EXIT_ANALYZER_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn RkAiqCamGroupAgicHandleInt::getAttribV1(rkaiq_gic_v1_api_attr_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_uapi_agic_v1_GetAttrib(mAlgoCtx, att);
|
att->sync.done = true;
|
mCfgMutex.unlock();
|
} else {
|
if (updateAttV1) {
|
memcpy(att, &mNewAttV1, sizeof(mNewAttV1));
|
att->sync.done = false;
|
} else {
|
rk_aiq_uapi_agic_v1_GetAttrib(mAlgoCtx, att);
|
att->sync.sync_mode = mNewAttV1.sync.sync_mode;
|
att->sync.done = true;
|
}
|
}
|
|
EXIT_ANALYZER_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn RkAiqCamGroupAgicHandleInt::setAttribV2(const rkaiq_gic_v2_api_attr_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(&mNewAttV2, att, sizeof(*att)))
|
isChanged = true;
|
else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
|
memcmp(&mCurAttV2, att, sizeof(*att)))
|
isChanged = true;
|
|
// if something changed
|
if (isChanged) {
|
mNewAttV2 = *att;
|
updateAttV2 = true;
|
waitSignal(att->sync.sync_mode);
|
}
|
|
mCfgMutex.unlock();
|
|
EXIT_ANALYZER_FUNCTION();
|
return ret;
|
}
|
|
XCamReturn RkAiqCamGroupAgicHandleInt::getAttribV2(rkaiq_gic_v2_api_attr_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_uapi_agic_v2_GetAttrib(mAlgoCtx, att);
|
att->sync.done = true;
|
mCfgMutex.unlock();
|
} else {
|
if (updateAttV2) {
|
memcpy(att, &mNewAttV2, sizeof(mNewAttV2));
|
att->sync.done = false;
|
} else {
|
rk_aiq_uapi_agic_v2_GetAttrib(mAlgoCtx, att);
|
att->sync.sync_mode = mNewAttV2.sync.sync_mode;
|
att->sync.done = true;
|
}
|
}
|
|
EXIT_ANALYZER_FUNCTION();
|
return ret;
|
}
|
|
|
}; // namespace RkCam
|