1 /*
2 * rk_aiq_algo_a3dlut_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 "a3dlut/rk_aiq_algo_a3dlut_itf.h"
21 #include "a3dlut/rk_aiq_a3dlut_algo.h"
22 #include "rk_aiq_algo_types.h"
23 #include "xcam_log.h"
24
25 RKAIQ_BEGIN_DECLARE
26
27
28 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)29 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
30 {
31 XCamReturn ret = XCAM_RETURN_NO_ERROR;
32
33 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
34 RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
35 if (ctx == NULL) {
36 LOGE_A3DLUT( "%s: create 3dlut context fail!\n", __FUNCTION__);
37 return XCAM_RETURN_ERROR_MEM;
38 }
39
40 ret = Alut3dInit(&ctx->a3dlut_para, cfg->calibv2);
41
42 *context = ctx;
43
44 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
45 return ret;
46 }
47
48 static XCamReturn
destroy_context(RkAiqAlgoContext * context)49 destroy_context(RkAiqAlgoContext *context)
50 {
51 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
52
53 Alut3dRelease((alut3d_handle_t)context->a3dlut_para);
54 delete context;
55 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
56 return XCAM_RETURN_NO_ERROR;
57 }
58
59 static XCamReturn
prepare(RkAiqAlgoCom * params)60 prepare(RkAiqAlgoCom* params)
61 {
62 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
63 alut3d_handle_t hAlut3d = (alut3d_handle_t)(params->ctx->a3dlut_para);
64 RkAiqAlgoConfigA3dlut *para = (RkAiqAlgoConfigA3dlut*)params;
65 hAlut3d->prepare_type = params->u.prepare.conf_type;
66 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
67 #if RKAIQ_HAVE_3DLUT_V1
68 hAlut3d->calibV2_lut3d =
69 (CalibDbV2_Lut3D_Para_V2_t*)(CALIBDBV2_GET_MODULE_PTR((void*)(para->com.u.prepare.calibv2), lut3d_calib));
70 #endif
71 }
72 Alut3dPrepare((alut3d_handle_t)(params->ctx->a3dlut_para));
73
74 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
75 return XCAM_RETURN_NO_ERROR;
76 }
77
78 static XCamReturn
pre_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)79 pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
80 {
81 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
82
83 Alut3dPreProc((alut3d_handle_t)(inparams->ctx->a3dlut_para));
84
85 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
86 return XCAM_RETURN_NO_ERROR;
87 }
88
89 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)90 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
91 {
92 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
93
94 RkAiqAlgoProcA3dlut *procAlut3d = (RkAiqAlgoProcA3dlut*)inparams;
95 RkAiqAlgoProcResA3dlut *proResAlut3d = (RkAiqAlgoProcResA3dlut*)outparams;
96 alut3d_handle_t hAlut3d = (alut3d_handle_t)(inparams->ctx->a3dlut_para);
97
98 hAlut3d->swinfo.sensorGain = procAlut3d->sensorGain;
99 hAlut3d->swinfo.awbGain[0] = procAlut3d->awbGain[0];
100 hAlut3d->swinfo.awbGain[1] = procAlut3d->awbGain[1];
101 hAlut3d->swinfo.awbIIRDampCoef = procAlut3d->awbIIRDampCoef;
102 hAlut3d->swinfo.awbConverged = procAlut3d->awbConverged;
103
104 Alut3dConfig(hAlut3d);
105 if (hAlut3d->lut3d_hw_conf.enable || !hAlut3d->lut3d_hw_conf.bypass_en) {
106 LOGD_A3DLUT("update:%d, updateAtt: %d, converge: %d\n",
107 hAlut3d->update, hAlut3d->updateAtt, hAlut3d->swinfo.lut3dConverged);
108 proResAlut3d->res_com.cfg_update = hAlut3d->update || hAlut3d->updateAtt || (!hAlut3d->swinfo.lut3dConverged);
109 } else {
110 proResAlut3d->res_com.cfg_update = hAlut3d->updateAtt || hAlut3d->calib_update;
111 }
112
113 hAlut3d->calib_update = false;
114 hAlut3d->updateAtt = false;
115 if (proResAlut3d->res_com.cfg_update)
116 memcpy(proResAlut3d->lut3d_hw_conf, &hAlut3d->lut3d_hw_conf, sizeof(rk_aiq_lut3d_cfg_t));
117
118 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
119 return XCAM_RETURN_NO_ERROR;
120 }
121
122 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)123 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
124 {
125 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
126
127 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
128 return XCAM_RETURN_NO_ERROR;
129
130 }
131
132 RkAiqAlgoDescription g_RkIspAlgoDescA3dlut = {
133 .common = {
134 .version = RKISP_ALGO_A3DLUT_VERSION,
135 .vendor = RKISP_ALGO_A3DLUT_VENDOR,
136 .description = RKISP_ALGO_A3DLUT_DESCRIPTION,
137 .type = RK_AIQ_ALGO_TYPE_A3DLUT,
138 .id = 0,
139 .create_context = create_context,
140 .destroy_context = destroy_context,
141 },
142 .prepare = prepare,
143 .pre_process = NULL,
144 .processing = processing,
145 .post_process = NULL,
146 };
147
148 RKAIQ_END_DECLARE
149