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 = ¶ms->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