/*
|
* rk_aiq_algo_adrc_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 "adrc/rk_aiq_algo_adrc_itf.h"
|
#include "xcam_log.h"
|
#include "adrc/rk_aiq_adrc_algo.h"
|
#include "adrc/rk_aiq_types_adrc_algo_prvt.h"
|
|
RKAIQ_BEGIN_DECLARE
|
|
|
static XCamReturn
|
create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
|
{
|
LOG1_ATMO(" %s:Enter!\n", __FUNCTION__);
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
|
AlgoCtxInstanceCfgInt* instanc_int = (AlgoCtxInstanceCfgInt*)cfg;
|
if (ctx == NULL) {
|
LOGE_ATMO( "%s: create adrc context fail!\n", __FUNCTION__);
|
return XCAM_RETURN_ERROR_MEM;
|
}
|
memset(&ctx->AdrcInstConfig, 0x00, sizeof(AdrcInstanceConfig_t));
|
result = AdrcInit(&ctx->AdrcInstConfig, instanc_int->calibv2);
|
|
if (result != XCAM_RETURN_NO_ERROR) {
|
LOGE_ATMO("%s Adrc Init failed: %d", __FUNCTION__, result);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
|
*context = ctx;
|
|
LOG1_ATMO(" %s:Exit!\n", __FUNCTION__);
|
return result;
|
}
|
|
static XCamReturn
|
destroy_context(RkAiqAlgoContext *context)
|
{
|
LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
|
if(context != NULL) {
|
|
AdrcHandle_t pAdrcCtx = (AdrcHandle_t)context->AdrcInstConfig.hAdrc;
|
result = AdrcRelease(pAdrcCtx);
|
if (result != XCAM_RETURN_NO_ERROR) {
|
LOGE_ATMO("%s Adrc Release failed: %d", __FUNCTION__, result);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
delete context;
|
context = NULL;
|
}
|
|
LOG1_ATMO("%s:Exit!\n", __FUNCTION__);
|
return result;
|
}
|
|
static XCamReturn
|
prepare(RkAiqAlgoCom* params)
|
{
|
LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
|
AdrcHandle_t pAdrcCtx = params->ctx->AdrcInstConfig.hAdrc;
|
RkAiqAlgoConfigAdrcInt* AdrcCfgParam = (RkAiqAlgoConfigAdrcInt*)params; //come from params in html
|
const CamCalibDbV2Context_t* pCalibDb = AdrcCfgParam->rk_com.u.prepare.calibv2;
|
//pAdrcCtx->width = AdrcCfgParam->rawWidth;
|
//pAdrcCtx->height = AdrcCfgParam->rawHeight;
|
|
if (AdrcCfgParam->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR2)
|
pAdrcCtx->FrameNumber = 1;
|
else if (AdrcCfgParam->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR3 &&
|
AdrcCfgParam->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2)
|
pAdrcCtx->FrameNumber = 2;
|
else
|
pAdrcCtx->FrameNumber = 3;
|
|
if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
|
LOGD_ATMO("%s: Adrc Reload Para!\n", __FUNCTION__);
|
CalibDbV2_drc_t* calibv2_adrc_calib =
|
(CalibDbV2_drc_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDb, adrc_calib));
|
|
memcpy(&pAdrcCtx->pCalibDB, calibv2_adrc_calib, sizeof(CalibDbV2_drc_t)); //reload iq paras
|
|
LOGE_ATMO("%s:Mode:%d \n", __FUNCTION__, calibv2_adrc_calib->DrcTuningPara.CompressSetting.Mode);
|
for(int i = 0; i < 17; i++)
|
LOGE_ATMO("%s:Manual_curve[%d]:%d \n", __FUNCTION__, i, calibv2_adrc_calib->DrcTuningPara.CompressSetting.Manual_curve[i]);
|
}
|
|
if(/* !params->u.prepare.reconfig*/true) {
|
AdrcStop(pAdrcCtx); // stop firstly for re-preapre
|
result = AdrcStart(pAdrcCtx);
|
if (result != XCAM_RETURN_NO_ERROR) {
|
LOGE_ATMO("%s Adrc Start failed: %d", __FUNCTION__, result);
|
return(XCAM_RETURN_ERROR_FAILED);
|
}
|
}
|
LOG1_ATMO("%s:Exit!\n", __FUNCTION__);
|
return result;
|
}
|
|
static XCamReturn
|
pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
|
RESULT ret = XCAM_RETURN_NO_ERROR;
|
|
AdrcHandle_t pAdrcCtx = inparams->ctx->AdrcInstConfig.hAdrc;
|
RkAiqAlgoConfigAdrcInt* AdrcCfgParam = (RkAiqAlgoConfigAdrcInt*)inparams;
|
|
//update
|
DrcNewMalloc(&pAdrcCtx->Config, &pAdrcCtx->pCalibDB);
|
AdrcUpdateConfig(pAdrcCtx, &pAdrcCtx->pCalibDB);
|
|
|
LOG1_ATMO("%s:Exit!\n", __FUNCTION__);
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
static XCamReturn
|
processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
|
XCamReturn result = XCAM_RETURN_NO_ERROR;
|
bool bypass = false;
|
|
AdrcHandle_t pAdrcCtx = (AdrcHandle_t)inparams->ctx->AdrcInstConfig.hAdrc;
|
RkAiqAlgoProcAdrcInt* AdrcParams = (RkAiqAlgoProcAdrcInt*)inparams;
|
RkAiqAlgoProcResAdrcInt* AdrcProcResParams = (RkAiqAlgoProcResAdrcInt*)outparams;
|
// pAdrcCtx->frameCnt = inparams->frame_id;
|
|
//get Sensor Info
|
XCamVideoBuffer* xCamAeProcRes = AdrcParams->rk_com.u.proc.res_comb->ae_proc_res;
|
RkAiqAlgoProcResAeInt* pAEProcRes = NULL;
|
if (xCamAeProcRes) {
|
pAEProcRes = (RkAiqAlgoProcResAeInt*)xCamAeProcRes->map(xCamAeProcRes);
|
AdrcGetSensorInfo(pAdrcCtx, pAEProcRes->ae_proc_res_rk);
|
}
|
else {
|
AecProcResult_t AeProcResult;
|
memset(&AeProcResult, 0x0, sizeof(AecProcResult_t));
|
LOGE_ATMO("%s: Ae Proc result is null!!!\n", __FUNCTION__);
|
AdrcGetSensorInfo(pAdrcCtx, AeProcResult);
|
}
|
|
//get ae pre res and proc
|
XCamVideoBuffer* xCamAePreRes = AdrcParams->rk_com.u.proc.res_comb->ae_pre_res;
|
RkAiqAlgoPreResAeInt* pAEPreRes = NULL;
|
if (xCamAePreRes) {
|
pAEPreRes = (RkAiqAlgoPreResAeInt*)xCamAePreRes->map(xCamAePreRes);
|
bypass = AdrcByPassProcessing(pAdrcCtx, pAEPreRes->ae_pre_res_rk);
|
}
|
else {
|
AecPreResult_t AecHdrPreResult;
|
memset(&AecHdrPreResult, 0x0, sizeof(AecPreResult_t));
|
bypass = AdrcByPassProcessing(pAdrcCtx, AecHdrPreResult);
|
bypass = false;
|
LOGE_ATMO("%s: ae Pre result is null!!!\n", __FUNCTION__);
|
}
|
|
if(!bypass)
|
AdrcProcessing(pAdrcCtx);
|
|
pAdrcCtx->frameCnt++;
|
pAdrcCtx->PrevData.ApiMode = pAdrcCtx->drcAttr.opMode;
|
//output ProcRes
|
AdrcProcResParams->AdrcProcRes.update = !bypass ;
|
AdrcProcResParams->AdrcProcRes.CompressMode = pAdrcCtx->AdrcProcRes.CompressMode;
|
AdrcProcResParams->AdrcProcRes.LongFrameMode = pAdrcCtx->AdrcProcRes.LongFrameMode;
|
AdrcProcResParams->AdrcProcRes.isHdrGlobalTmo = pAdrcCtx->AdrcProcRes.isHdrGlobalTmo;
|
AdrcProcResParams->AdrcProcRes.bTmoEn = pAdrcCtx->AdrcProcRes.bTmoEn;
|
AdrcProcResParams->AdrcProcRes.isLinearTmo = pAdrcCtx->AdrcProcRes.isLinearTmo;
|
memcpy(&AdrcProcResParams->AdrcProcRes.DrcProcRes, &pAdrcCtx->AdrcProcRes.DrcProcRes, sizeof(DrcProcRes_t));
|
|
LOG1_ATMO("%s:Exit!\n", __FUNCTION__);
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
static XCamReturn
|
post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
|
{
|
LOG1_ATMO("%s:Enter!\n", __FUNCTION__);
|
LOG1_ATMO("%s:Exit!\n", __FUNCTION__);
|
return XCAM_RETURN_NO_ERROR;
|
}
|
|
RkAiqAlgoDescription g_RkIspAlgoDescAdrc = {
|
.common = {
|
.version = RKISP_ALGO_ADRC_VERSION,
|
.vendor = RKISP_ALGO_ADRC_VENDOR,
|
.description = RKISP_ALGO_ADRC_DESCRIPTION,
|
.type = RK_AIQ_ALGO_TYPE_ADRC,
|
.id = 0,
|
.create_context = create_context,
|
.destroy_context = destroy_context,
|
},
|
.prepare = prepare,
|
.pre_process = pre_process,
|
.processing = processing,
|
.post_process = post_process,
|
};
|
|
RKAIQ_END_DECLARE
|