xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/acp/rk_aiq_algo_acp_itf.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * rk_aiq_algo_acp_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 "acp/rk_aiq_algo_acp_itf.h"
21 #include "xcam_log.h"
22 #include "acp/rk_aiq_types_algo_acp_prvt.h"
23 #include "rk_aiq_algo_types.h"
24 #include "RkAiqCalibDbV2Helper.h"
25 
26 RKAIQ_BEGIN_DECLARE
27 
28 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)29 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
30 {
31     RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
32     if (ctx == NULL) {
33         LOGE_ACP( "%s: create acp context fail!\n", __FUNCTION__);
34         return XCAM_RETURN_ERROR_MEM;
35     }
36     ctx->acpCtx.calib = cfg->calib;
37     ctx->acpCtx.calibv2 = cfg->calibv2;
38     rk_aiq_acp_params_t* params = &ctx->acpCtx.params;
39 #if RKAIQ_HAVE_ACP_V10
40     if (ctx->acpCtx.calib) {
41         CalibDb_cProc_t *cproc =
42             (CalibDb_cProc_t*)(CALIBDB_GET_MODULE_PTR(ctx->acpCtx.calib, cProc));
43         params->enable = cproc->enable;
44         params->brightness = cproc->brightness;
45         params->hue = cproc->hue;
46         params->saturation = cproc->saturation;
47         params->contrast = cproc->contrast;
48     } else if (ctx->acpCtx.calibv2) {
49         Cproc_Param_t *cproc =
50             (Cproc_Param_t*)(CALIBDBV2_GET_MODULE_PTR(ctx->acpCtx.calibv2, cproc));
51         params->enable = cproc->enable;
52         params->brightness = cproc->brightness;
53         params->hue = cproc->hue;
54         params->saturation = cproc->saturation;
55         params->contrast = cproc->contrast;
56     }
57 #endif
58     *context = ctx;
59 
60     return XCAM_RETURN_NO_ERROR;
61 }
62 
63 static XCamReturn
destroy_context(RkAiqAlgoContext * context)64 destroy_context(RkAiqAlgoContext *context)
65 {
66     delete context;
67     return XCAM_RETURN_NO_ERROR;
68 }
69 
70 static XCamReturn
prepare(RkAiqAlgoCom * params)71 prepare(RkAiqAlgoCom* params)
72 {
73     rk_aiq_acp_params_t* acp_params = &params->ctx->acpCtx.params;
74     RkAiqAlgoConfigAcp* pCfgParam = (RkAiqAlgoConfigAcp*)params;
75 
76 	if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
77 #if RKAIQ_HAVE_ACP_V10
78         if (pCfgParam->com.u.prepare.calib) {
79             CalibDb_cProc_t *cproc =
80                 (CalibDb_cProc_t*)(CALIBDB_GET_MODULE_PTR(pCfgParam->com.u.prepare.calib, cProc));
81             acp_params->enable = cproc->enable;
82             acp_params->brightness = cproc->brightness;
83             acp_params->hue = cproc->hue;
84             acp_params->saturation = cproc->saturation;
85             acp_params->contrast = cproc->contrast;
86         } else if (pCfgParam->com.u.prepare.calibv2) {
87             CalibDbV2_Cproc_t* cproc =
88                 (CalibDbV2_Cproc_t*)(CALIBDBV2_GET_MODULE_PTR(pCfgParam->com.u.prepare.calibv2, cproc));
89 
90             acp_params->enable = cproc->param.enable;
91             acp_params->brightness = cproc->param.brightness;
92             acp_params->hue = cproc->param.hue;
93             acp_params->saturation = cproc->param.saturation;
94             acp_params->contrast = cproc->param.contrast;
95         }
96 #endif
97     }
98 
99     params->ctx->acpCtx.isReCal_ = true;
100 
101     return XCAM_RETURN_NO_ERROR;
102 }
103 
104 static XCamReturn
pre_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)105 pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
106 {
107     return XCAM_RETURN_NO_ERROR;
108 }
109 
110 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)111 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
112 {
113     RkAiqAlgoProcResAcp* res_com = (RkAiqAlgoProcResAcp*)outparams;
114     RkAiqAlgoContext* ctx = inparams->ctx;
115 
116     if (ctx->acpCtx.isReCal_) {
117         *res_com->acp_res = ctx->acpCtx.params;
118         outparams->cfg_update = true;
119         ctx->acpCtx.isReCal_ = false;
120     } else {
121         outparams->cfg_update = false;
122     }
123 
124     return XCAM_RETURN_NO_ERROR;
125 }
126 
127 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)128 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
129 {
130     return XCAM_RETURN_NO_ERROR;
131 }
132 
133 RkAiqAlgoDescription g_RkIspAlgoDescAcp = {
134     .common = {
135         .version = RKISP_ALGO_ACP_VERSION,
136         .vendor  = RKISP_ALGO_ACP_VENDOR,
137         .description = RKISP_ALGO_ACP_DESCRIPTION,
138         .type    = RK_AIQ_ALGO_TYPE_ACP,
139         .id      = 0,
140         .create_context  = create_context,
141         .destroy_context = destroy_context,
142     },
143     .prepare = prepare,
144     .pre_process = NULL,
145     .processing = processing,
146     .post_process = NULL,
147 };
148 
149 RKAIQ_END_DECLARE
150