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