xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/a3dlut/rk_aiq_algo_a3dlut_itf.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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