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