1 /*
2 * rk_aiq_algo_camgroup_agamma_itf.cpp
3 *
4 * Copyright (c) 2019 Rockchip Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20 #include "rk_aiq_algo_camgroup_types.h"
21 #include "algos/agamma/rk_aiq_algo_agamma_itf.h"
22 #if RKAIQ_HAVE_GAMMA_V10
23 #include "agamma/rk_aiq_agamma_algo_v10.h"
24 #endif
25 #if RKAIQ_HAVE_GAMMA_V11
26 #include "agamma/rk_aiq_agamma_algo_v11.h"
27 #endif
28
29
30 RKAIQ_BEGIN_DECLARE
31
32
33 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)34 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
35 {
36 LOG1_AGAMMA("ENTER: %s \n", __func__);
37
38 XCamReturn ret = XCAM_RETURN_NO_ERROR;
39 AgammaHandle_t* pAgammaGrpCtx = NULL;
40 AlgoCtxInstanceCfgCamGroup* instanc_int = (AlgoCtxInstanceCfgCamGroup*)cfg;
41
42 ret = AgammaInit(&pAgammaGrpCtx, (CamCalibDbV2Context_t*)(instanc_int->s_calibv2));
43
44 *context = (RkAiqAlgoContext *)(pAgammaGrpCtx);
45
46 LOG1_AGAMMA("EXIT: %s \n", __func__);
47 return ret;
48 }
49
50 static XCamReturn
destroy_context(RkAiqAlgoContext * context)51 destroy_context(RkAiqAlgoContext *context)
52 {
53 LOG1_AGAMMA("ENTER: %s \n", __func__);
54 AgammaHandle_t* pAgammaGrpCtx = (AgammaHandle_t*)context;
55 XCamReturn ret = XCAM_RETURN_NO_ERROR;
56
57 ret = AgammaRelease(pAgammaGrpCtx);
58
59 LOG1_AGAMMA("EXIT: %s \n", __func__);
60 return ret;
61 }
62
63 static XCamReturn
prepare(RkAiqAlgoCom * params)64 prepare(RkAiqAlgoCom* params)
65 {
66 LOG1_AGAMMA("ENTER: %s \n", __func__);
67 XCamReturn ret = XCAM_RETURN_NO_ERROR;
68 AgammaHandle_t * pAgammaGrpCtx = (AgammaHandle_t *)params->ctx;
69 RkAiqAlgoCamGroupPrepare* pCfgParam = (RkAiqAlgoCamGroupPrepare*)params;
70 rk_aiq_gamma_cfg_t *agamma_config = &pAgammaGrpCtx->agamma_config;
71
72 if (!!(pCfgParam->gcom.com.u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
73 #if RKAIQ_HAVE_GAMMA_V10
74 CalibDbV2_gamma_v10_t* calibv2_agamma_calib =
75 (CalibDbV2_gamma_v10_t*)(CALIBDBV2_GET_MODULE_PTR((void*)(pCfgParam->s_calibv2),
76 agamma_calib));
77 memcpy(&pAgammaGrpCtx->agammaAttrV10.stAuto, calibv2_agamma_calib,
78 sizeof(CalibDbV2_gamma_v10_t)); // reload iq
79 #endif
80 #if RKAIQ_HAVE_GAMMA_V11
81 CalibDbV2_gamma_v11_t* calibv2_agamma_calib =
82 (CalibDbV2_gamma_v11_t*)(CALIBDBV2_GET_MODULE_PTR((void*)(pCfgParam->s_calibv2),
83 agamma_calib));
84 memcpy(&pAgammaGrpCtx->agammaAttrV11.stAuto, calibv2_agamma_calib,
85 sizeof(CalibDbV2_gamma_v11_t)); // reload iq
86 #endif
87 LOGI_AGAMMA("%s: Agamma Reload Para!!!\n", __FUNCTION__);
88 pAgammaGrpCtx->ifReCalcStAuto = true;
89 }
90
91 LOG1_AGAMMA("EXIT: %s \n", __func__);
92 return ret;
93 }
94
95 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)96 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
97 {
98 LOG1_AGAMMA("ENTER: %s \n", __func__);
99 XCamReturn ret = XCAM_RETURN_NO_ERROR;
100 AgammaHandle_t* pAgammaGrpCtx = (AgammaHandle_t *)inparams->ctx;
101 pAgammaGrpCtx->FrameID = inparams->frame_id;
102 RkAiqAlgoCamGroupProcOut* pAgammaGrpProcRes = (RkAiqAlgoCamGroupProcOut*)outparams;
103 bool bypass = true;
104
105 #if RKAIQ_HAVE_GAMMA_V10
106 if (pAgammaGrpCtx->FrameID <= INIT_CALC_PARAMS_NUM || inparams->u.proc.init)
107 bypass = false;
108 else if (pAgammaGrpCtx->agammaAttrV10.mode != pAgammaGrpCtx->CurrApiMode)
109 bypass = false;
110 else if (pAgammaGrpCtx->agammaAttrV10.mode == RK_AIQ_GAMMA_MODE_MANUAL)
111 bypass = !pAgammaGrpCtx->ifReCalcStManual;
112 else if (pAgammaGrpCtx->agammaAttrV10.mode == RK_AIQ_GAMMA_MODE_AUTO)
113 bypass = !pAgammaGrpCtx->ifReCalcStAuto;
114 #endif
115 #if RKAIQ_HAVE_GAMMA_V11
116 if (pAgammaGrpCtx->FrameID <= INIT_CALC_PARAMS_NUM || inparams->u.proc.init)
117 bypass = false;
118 else if (pAgammaGrpCtx->agammaAttrV11.mode != pAgammaGrpCtx->CurrApiMode)
119 bypass = false;
120 else if (pAgammaGrpCtx->agammaAttrV11.mode == RK_AIQ_GAMMA_MODE_MANUAL)
121 bypass = !pAgammaGrpCtx->ifReCalcStManual;
122 else if (pAgammaGrpCtx->agammaAttrV11.mode == RK_AIQ_GAMMA_MODE_AUTO)
123 bypass = !pAgammaGrpCtx->ifReCalcStAuto;
124 #endif
125
126 if (!bypass)
127 AgammaProcessing(pAgammaGrpCtx, pAgammaGrpProcRes->camgroupParmasArray[0]->_agammaConfig);
128
129 // set proc res
130 outparams->cfg_update = !bypass;
131 for (int i = 1; i < pAgammaGrpProcRes->arraySize; i++) {
132 if (outparams->cfg_update) {
133 memcpy(pAgammaGrpProcRes->camgroupParmasArray[i]->_agammaConfig,
134 pAgammaGrpProcRes->camgroupParmasArray[0]->_agammaConfig,
135 sizeof(AgammaProcRes_t));
136 }
137 IS_UPDATE_MEM((pAgammaGrpProcRes->camgroupParmasArray[i]->_agammaConfig), ((RkAiqAlgoCamGroupProcIn*)inparams)->_offset_is_update) =
138 outparams->cfg_update;
139 }
140
141 if (pAgammaGrpCtx->ifReCalcStAuto) pAgammaGrpCtx->ifReCalcStAuto = false;
142 if (pAgammaGrpCtx->ifReCalcStManual) pAgammaGrpCtx->ifReCalcStManual = false;
143
144 LOG1_AGAMMA("EXIT: %s \n", __func__);
145 return ret;
146 }
147
148 RkAiqAlgoDescription g_RkIspAlgoDescamgroupAgamma = {
149 .common = {
150 .version = RKISP_ALGO_AGAMMA_VERSION,
151 .vendor = RKISP_ALGO_AGAMMA_VENDOR,
152 .description = RKISP_ALGO_AGAMMA_DESCRIPTION,
153 .type = RK_AIQ_ALGO_TYPE_AGAMMA,
154 .id = 0,
155 .create_context = create_context,
156 .destroy_context = destroy_context,
157 },
158 .prepare = prepare,
159 .pre_process = NULL,
160 .processing = processing,
161 .post_process = NULL,
162 };
163
164 RKAIQ_END_DECLARE
165