xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/agamma/rk_aiq_algo_agamma_itf.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * rk_aiq_algo_agamma_itf.c
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 "agamma/rk_aiq_algo_agamma_itf.h"
21 #if RKAIQ_HAVE_GAMMA_V10
22 #include "agamma/rk_aiq_agamma_algo_v10.h"
23 #endif
24 #if RKAIQ_HAVE_GAMMA_V11
25 #include "agamma/rk_aiq_agamma_algo_v11.h"
26 #endif
27 #include "rk_aiq_algo_types.h"
28 
29 RKAIQ_BEGIN_DECLARE
30 
31 typedef struct _RkAiqAlgoContext {
32     AgammaHandle_t AgammaHandle;
33 } RkAiqAlgoContext;
34 
35 
36 
37 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)38 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
39 {
40     LOG1_AGAMMA("ENTER: %s \n", __func__);
41     XCamReturn ret = XCAM_RETURN_NO_ERROR;
42     AgammaHandle_t* pAgammaHandle = NULL;
43 
44     ret = AgammaInit(&pAgammaHandle, (CamCalibDbV2Context_t*)(cfg->calibv2));
45 
46     *context = (RkAiqAlgoContext *)(pAgammaHandle);
47 
48     LOG1_AGAMMA("EXIT: %s \n", __func__);
49     return ret;
50 }
51 
52 static XCamReturn
destroy_context(RkAiqAlgoContext * context)53 destroy_context(RkAiqAlgoContext *context)
54 {
55     LOG1_AGAMMA("ENTER: %s \n", __func__);
56     AgammaHandle_t* pAgammaHandle = (AgammaHandle_t*)context;
57     XCamReturn ret = XCAM_RETURN_NO_ERROR;
58 
59     ret = AgammaRelease(pAgammaHandle);
60 
61     LOG1_AGAMMA("EXIT: %s \n", __func__);
62     return ret;
63 }
64 
65 static XCamReturn
prepare(RkAiqAlgoCom * params)66 prepare(RkAiqAlgoCom* params)
67 {
68     LOG1_AGAMMA("ENTER: %s \n", __func__);
69     XCamReturn ret = XCAM_RETURN_NO_ERROR;
70     AgammaHandle_t * pAgammaHandle = (AgammaHandle_t *)params->ctx;
71     RkAiqAlgoConfigAgamma* pCfgParam = (RkAiqAlgoConfigAgamma*)params;
72 
73     if (!!(pCfgParam->com.u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
74         LOGI_AGAMMA("%s: Agamma Reload Para!!!\n", __FUNCTION__);
75 #if RKAIQ_HAVE_GAMMA_V10
76         CalibDbV2_gamma_v10_t* calibv2_agamma_calib =
77             (CalibDbV2_gamma_v10_t*)(CALIBDBV2_GET_MODULE_PTR(
78                 (void*)(pCfgParam->com.u.prepare.calibv2), agamma_calib));
79         memcpy(&pAgammaHandle->agammaAttrV10.stAuto, calibv2_agamma_calib,
80                sizeof(CalibDbV2_gamma_v10_t));  // reload iq
81 #endif
82 #if RKAIQ_HAVE_GAMMA_V11
83         CalibDbV2_gamma_v11_t* calibv2_agamma_calib =
84             (CalibDbV2_gamma_v11_t*)(CALIBDBV2_GET_MODULE_PTR(
85                 (void*)(pCfgParam->com.u.prepare.calibv2), agamma_calib));
86         memcpy(&pAgammaHandle->agammaAttrV11.stAuto, calibv2_agamma_calib,
87                sizeof(CalibDbV2_gamma_v11_t));  // reload iq
88 #endif
89         pAgammaHandle->ifReCalcStAuto = true;
90     }
91 
92     LOG1_AGAMMA("EXIT: %s \n", __func__);
93     return ret;
94 }
95 
96 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)97 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
98 {
99     LOG1_AGAMMA("ENTER: %s \n", __func__);
100     XCamReturn ret = XCAM_RETURN_NO_ERROR;
101     AgammaHandle_t* pAgammaHandle = (AgammaHandle_t *)inparams->ctx;
102     pAgammaHandle->FrameID                 = inparams->frame_id;
103     RkAiqAlgoProcResAgamma* pAgammaProcRes = (RkAiqAlgoProcResAgamma*)outparams;
104     AgammaProcRes_t* pProcRes = pAgammaProcRes->GammaProcRes;
105     bool bypass                            = true;
106 
107 #if RKAIQ_HAVE_GAMMA_V10
108     if (pAgammaHandle->FrameID <= INIT_CALC_PARAMS_NUM || inparams->u.proc.init)
109         bypass = false;
110     else if (pAgammaHandle->agammaAttrV10.mode != pAgammaHandle->CurrApiMode)
111         bypass = false;
112     else if (pAgammaHandle->agammaAttrV10.mode == RK_AIQ_GAMMA_MODE_MANUAL)
113         bypass = !pAgammaHandle->ifReCalcStManual;
114     else if (pAgammaHandle->agammaAttrV10.mode == RK_AIQ_GAMMA_MODE_AUTO)
115         bypass = !pAgammaHandle->ifReCalcStAuto;
116 #endif
117 #if RKAIQ_HAVE_GAMMA_V11
118     if (pAgammaHandle->FrameID <= INIT_CALC_PARAMS_NUM || inparams->u.proc.init)
119         bypass = false;
120     else if (pAgammaHandle->agammaAttrV11.mode != pAgammaHandle->CurrApiMode)
121         bypass = false;
122     else if (pAgammaHandle->agammaAttrV11.mode == RK_AIQ_GAMMA_MODE_MANUAL)
123         bypass = !pAgammaHandle->ifReCalcStManual;
124     else if (pAgammaHandle->agammaAttrV11.mode == RK_AIQ_GAMMA_MODE_AUTO)
125         bypass = !pAgammaHandle->ifReCalcStAuto;
126 #endif
127 
128     if (!bypass) AgammaProcessing(pAgammaHandle, pProcRes);
129 
130     outparams->cfg_update = !bypass;
131 
132     if (pAgammaHandle->ifReCalcStAuto) pAgammaHandle->ifReCalcStAuto = false;
133     if (pAgammaHandle->ifReCalcStManual) pAgammaHandle->ifReCalcStManual = false;
134 
135     LOG1_AGAMMA("EXIT: %s \n", __func__);
136     return ret;
137 }
138 
139 RkAiqAlgoDescription g_RkIspAlgoDescAgamma = {
140     .common = {
141         .version = RKISP_ALGO_AGAMMA_VERSION,
142         .vendor  = RKISP_ALGO_AGAMMA_VENDOR,
143         .description = RKISP_ALGO_AGAMMA_DESCRIPTION,
144         .type    = RK_AIQ_ALGO_TYPE_AGAMMA,
145         .id      = 0,
146         .create_context  = create_context,
147         .destroy_context = destroy_context,
148     },
149     .prepare = prepare,
150     .pre_process = NULL,
151     .processing = processing,
152     .post_process = NULL,
153 };
154 
155 RKAIQ_END_DECLARE
156