/*
|
* rk_aiq_algo_ae_itf.c
|
*
|
* Copyright (c) 2019 Rockchip Corporation
|
*
|
* 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 "rk_aiq_algo_types_int.h"
|
#include "amerge/rk_aiq_algo_amerge_itf.h"
|
#include "xcam_log.h"
|
#include "amerge/rk_aiq_amerge_algo.h"
|
#include "amerge/rk_aiq_types_amerge_algo_prvt.h"
|
|
|
|
RKAIQ_BEGIN_DECLARE
|
|
|
|
static XCamReturn AmergeCreateCtx(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
|
{
|
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
|
AlgoCtxInstanceCfgInt* instanc_int = (AlgoCtxInstanceCfgInt*)cfg;
|
if (ctx == NULL) {
|
LOGE_AMERGE( "%s: create amerge context fail!\n", __FUNCTION__);
|
return XCAM_RETURN_ERROR_MEM;
|
}
|
memset(&ctx->AmergeInstConfig, 0x00, sizeof(AmergeInstanceConfig_t));
|
ret = AmergeInit(&ctx->AmergeInstConfig, instanc_int->calibv2);
|
|
if (ret != AMERGE_RET_SUCCESS) {
|
LOGE_AMERGE("%s Amerge Init failed: %d", __FUNCTION__, ret);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
|
*context = ctx;
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
static XCamReturn AmergeDestroyCtx(RkAiqAlgoContext *context)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
|
if(context != NULL) {
|
AmergeHandle_t pAmergeCtx = (AmergeHandle_t)context->AmergeInstConfig.hAmerge;
|
ret = AmergeRelease(pAmergeCtx);
|
if (ret != AMERGE_RET_SUCCESS) {
|
LOGE_AMERGE("%s Amerge Release failed: %d", __FUNCTION__, ret);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
delete context;
|
context = NULL;
|
}
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
static XCamReturn AmergePrepare(RkAiqAlgoCom* params)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
|
AmergeHandle_t pAmergeCtx = params->ctx->AmergeInstConfig.hAmerge;
|
RkAiqAlgoConfigAmergeInt* AhdrCfgParam = (RkAiqAlgoConfigAmergeInt*)params; //come from params in html
|
const CamCalibDbV2Context_t* pCalibDb = AhdrCfgParam->rk_com.u.prepare.calibv2;
|
pAmergeCtx->width = AhdrCfgParam->rawWidth;
|
pAmergeCtx->height = AhdrCfgParam->rawHeight;
|
|
if (AhdrCfgParam->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR2)
|
pAmergeCtx->FrameNumber = 1;
|
else if (AhdrCfgParam->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR3 &&
|
AhdrCfgParam->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2)
|
pAmergeCtx->FrameNumber = 2;
|
else
|
pAmergeCtx->FrameNumber = 3;
|
|
|
CalibDbV2_merge_t* calibv2_amerge_calib =
|
(CalibDbV2_merge_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDb, amerge_calib));
|
|
if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
|
LOGD_AMERGE("%s: Amerge Reload Para!\n", __FUNCTION__);
|
memcpy(&pAmergeCtx->pCalibDB, calibv2_amerge_calib, sizeof(CalibDbV2_merge_t));//load iq paras
|
}
|
|
if(/* !params->u.prepare.reconfig*/true) {
|
AmergeStop(pAmergeCtx); // stop firstly for re-preapre
|
ret = AmergeStart(pAmergeCtx);
|
if (ret != AMERGE_RET_SUCCESS) {
|
LOGE_AMERGE("%s Amerge Start failed: %d\n", __FUNCTION__, ret);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
}
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
static XCamReturn AmergePreProcess(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
|
AmergeHandle_t pAmergeCtx = inparams->ctx->AmergeInstConfig.hAmerge;
|
RkAiqAlgoConfigAmergeInt* AhdrCfgParam = (RkAiqAlgoConfigAmergeInt*)inparams;
|
|
if(pAmergeCtx->mergeAttr.opMode == MERGE_OPMODE_TOOL) {
|
MergeNewMalloc(&pAmergeCtx->Config, &pAmergeCtx->mergeAttr.stTool);
|
AmergeUpdateConfig(pAmergeCtx, &pAmergeCtx->mergeAttr.stTool);
|
}
|
else {
|
MergeNewMalloc(&pAmergeCtx->Config, &pAmergeCtx->pCalibDB);
|
AmergeUpdateConfig(pAmergeCtx, &pAmergeCtx->pCalibDB);
|
}
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
static XCamReturn AmergeProcess(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
bool bypass = false;
|
|
AmergeHandle_t pAmergeCtx = (AmergeHandle_t)inparams->ctx->AmergeInstConfig.hAmerge;
|
RkAiqAlgoProcAmergeInt* AmergeParams = (RkAiqAlgoProcAmergeInt*)inparams;
|
RkAiqAlgoProcResAmergeInt* AmergeProcResParams = (RkAiqAlgoProcResAmergeInt*)outparams;
|
// pAmergeCtx->frameCnt = inparams->frame_id;
|
|
//get Sensor Info
|
XCamVideoBuffer* xCamAeProcRes = AmergeParams->rk_com.u.proc.res_comb->ae_proc_res;
|
RkAiqAlgoProcResAeInt* pAEProcRes = NULL;
|
if (xCamAeProcRes) {
|
pAEProcRes = (RkAiqAlgoProcResAeInt*)xCamAeProcRes->map(xCamAeProcRes);
|
AmergeGetSensorInfo(pAmergeCtx, pAEProcRes->ae_proc_res_rk);
|
}
|
else {
|
AecProcResult_t AeProcResult;
|
memset(&AeProcResult, 0x0, sizeof(AecProcResult_t));
|
LOGE_AMERGE("%s: Ae Proc result is null!!!\n", __FUNCTION__);
|
AmergeGetSensorInfo(pAmergeCtx, AeProcResult);
|
}
|
|
//get ae pre res and proc
|
XCamVideoBuffer* xCamAePreRes = AmergeParams->rk_com.u.proc.res_comb->ae_pre_res;
|
RkAiqAlgoPreResAeInt* pAEPreRes = NULL;
|
if (xCamAePreRes) {
|
pAEPreRes = (RkAiqAlgoPreResAeInt*)xCamAePreRes->map(xCamAePreRes);
|
bypass = AmergeByPassProcessing(pAmergeCtx, pAEPreRes->ae_pre_res_rk);
|
}
|
else {
|
AecPreResult_t AecHdrPreResult;
|
memset(&AecHdrPreResult, 0x0, sizeof(AecPreResult_t));
|
bypass = AmergeByPassProcessing(pAmergeCtx, AecHdrPreResult);
|
bypass = false;
|
LOGE_AMERGE("%s: ae Pre result is null!!!\n", __FUNCTION__);
|
}
|
|
if(!bypass)
|
AmergeProcessing(pAmergeCtx);
|
|
pAmergeCtx->frameCnt++;
|
pAmergeCtx->PrevData.CtrlData.ApiMode = pAmergeCtx->mergeAttr.opMode;
|
pAmergeCtx->ProcRes.Res.update = !bypass;
|
pAmergeCtx->ProcRes.LongFrameMode = pAmergeCtx->SensorInfo.LongFrmMode;
|
AmergeProcResParams->AmergeProcRes.LongFrameMode = pAmergeCtx->ProcRes.LongFrameMode;
|
memcpy(&AmergeProcResParams->AmergeProcRes.Res, &pAmergeCtx->ProcRes.Res, sizeof(MgeProcRes_t));
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
static XCamReturn AmergePostProcess(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_AMERGE("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = AMERGE_RET_SUCCESS;
|
|
//TODO
|
|
LOG1_AMERGE("%s:Exit!\n", __FUNCTION__);
|
return(XCAM_RETURN_NO_ERROR);
|
}
|
|
RkAiqAlgoDescription g_RkIspAlgoDescAmerge = {
|
.common = {
|
.version = RKISP_ALGO_AMERGE_VERSION,
|
.vendor = RKISP_ALGO_AMERGE_VENDOR,
|
.description = RKISP_ALGO_AMERGE_DESCRIPTION,
|
.type = RK_AIQ_ALGO_TYPE_AMERGE,
|
.id = 0,
|
.create_context = AmergeCreateCtx,
|
.destroy_context = AmergeDestroyCtx,
|
},
|
.prepare = AmergePrepare,
|
.pre_process = AmergePreProcess,
|
.processing = AmergeProcess,
|
.post_process = AmergePostProcess,
|
};
|
|
RKAIQ_END_DECLARE
|