1 /*
2 * Copyright (c) 2019-2022 Rockchip Eletronics Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "algos/agic/rk_aiq_algo_agic_itf.h"
17
18 #include "algos/agic/rk_aiq_types_algo_agic_prvt.h"
19 #include "algos/rk_aiq_algo_types.h"
20
21 RKAIQ_BEGIN_DECLARE
22
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)23 static XCamReturn create_context(RkAiqAlgoContext** context, const AlgoCtxInstanceCfg* cfg) {
24 LOG1_AGIC("enter!");
25
26 RkAiqAlgoContext* ctx = new RkAiqAlgoContext();
27 if (ctx == NULL) {
28 LOGE_AGIC("Create gic context fail!");
29 return XCAM_RETURN_ERROR_MEM;
30 }
31 CamCalibDbV2Context_t* calibv2 = cfg->calibv2;
32 AgicInit(&ctx->agicCtx, calibv2);
33
34 *context = ctx;
35 LOG1_AGIC("exit!");
36 return XCAM_RETURN_NO_ERROR;
37 }
38
destroy_context(RkAiqAlgoContext * context)39 static XCamReturn destroy_context(RkAiqAlgoContext* context) {
40 LOG1_AGIC("enter!");
41
42 AgicContext_t* pAgicCtx = (AgicContext_t*)&context->agicCtx;
43 AgicRelease(pAgicCtx);
44 delete context;
45
46 LOG1_AGIC("exit!");
47 return XCAM_RETURN_NO_ERROR;
48 }
49
prepare(RkAiqAlgoCom * params)50 static XCamReturn prepare(RkAiqAlgoCom* params) {
51 LOG1_AGIC("enter!");
52
53 AgicContext_t* pAgicCtx = (AgicContext_t*)¶ms->ctx->agicCtx;
54 RkAiqAlgoConfigAgic* pCfgParam = (RkAiqAlgoConfigAgic*)params;
55 CamCalibDbV2Context_t* calibv2 = pCfgParam->com.u.prepare.calibv2;
56
57 if (!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
58 LOGD_AGIC("%s: Agic Reload Para!\n", __FUNCTION__);
59
60 #if RKAIQ_HAVE_GIC_V1
61 CalibDbV2_Gic_V20_t* calibv2_agic_calib_V20 =
62 (CalibDbV2_Gic_V20_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, agic_calib_v20));
63 pAgicCtx->full_param.gic_v20 = calibv2_agic_calib_V20;
64 GicV1CalibToAttr(calibv2_agic_calib_V20, &pAgicCtx->attr.v1);
65 #endif
66 #if RKAIQ_HAVE_GIC_V2
67 CalibDbV2_Gic_V21_t* calibv2_agic_calib_V21 =
68 (CalibDbV2_Gic_V21_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, agic_calib_v21));
69 pAgicCtx->full_param.gic_v21 = calibv2_agic_calib_V21;
70 GicV2CalibToAttr(calibv2_agic_calib_V21, &pAgicCtx->attr.v2);
71 #endif
72
73 pAgicCtx->calib_changed = true;
74 }
75
76 pAgicCtx->working_mode = pCfgParam->com.u.prepare.working_mode;
77
78 LOG1_AGIC("exit!");
79 return XCAM_RETURN_NO_ERROR;
80 }
81 #if 0
82 static XCamReturn pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) {
83 LOG1_AGIC("enter!");
84
85 RkAiqAlgoConfigAgic* config = (RkAiqAlgoConfigAgic*)inparams;
86 RkAiqAlgoPreResAgic* pAgicPreResParams = (RkAiqAlgoPreResAgic*)outparams;
87 AgicContext_t* pAgicCtx = (AgicContext_t*)&inparams->ctx->agicCtx;
88
89 if (config->com.u.proc.gray_mode)
90 pAgicCtx->Gic_Scene_mode = GIC_NIGHT;
91 else if (GIC_NORMAL == pAgicCtx->working_mode)
92 pAgicCtx->Gic_Scene_mode = GIC_NORMAL;
93 else
94 pAgicCtx->Gic_Scene_mode = GIC_HDR;
95
96 LOG1_AGIC("exit!");
97 return XCAM_RETURN_NO_ERROR;
98 }
99 #endif
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)100 static XCamReturn processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) {
101 LOG1_AGIC("enter!");
102 RkAiqAlgoProcAgic* pAgicProcParams = (RkAiqAlgoProcAgic*)inparams;
103 RkAiqAlgoProcResAgic* pAgicProcResParams = (RkAiqAlgoProcResAgic*)outparams;
104 AgicContext_t* pAgicCtx = (AgicContext_t*)&inparams->ctx->agicCtx;
105 int iso = pAgicProcParams->iso;
106
107 if (inparams->u.proc.gray_mode)
108 pAgicCtx->Gic_Scene_mode = GIC_NIGHT;
109 else if (GIC_NORMAL == pAgicCtx->working_mode)
110 pAgicCtx->Gic_Scene_mode = GIC_NORMAL;
111 else
112 pAgicCtx->Gic_Scene_mode = GIC_HDR;
113
114 pAgicCtx->raw_bits = pAgicProcParams->raw_bits;
115 pAgicCtx->Gic_Scene_mode = 0;
116 if (pAgicCtx->last_iso != iso || pAgicCtx->calib_changed) {
117 AgicProcess(pAgicCtx, iso, pAgicCtx->Gic_Scene_mode);
118 pAgicCtx->calib_changed = false;
119 AgicGetProcResult(pAgicCtx, pAgicProcResParams->gicRes);
120 outparams->cfg_update = true;
121 pAgicCtx->last_iso = iso;
122 } else {
123 outparams->cfg_update = false;
124 }
125
126 LOG1_AGIC("enter!");
127 return XCAM_RETURN_NO_ERROR;
128 }
129
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)130 static XCamReturn post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) {
131 (void)(inparams);
132 (void)(outparams);
133
134 return XCAM_RETURN_NO_ERROR;
135 }
136
137 RkAiqAlgoDescription g_RkIspAlgoDescAgic = {
138 .common =
139 {
140 .version = RKISP_ALGO_AGIC_VERSION,
141 .vendor = RKISP_ALGO_AGIC_VENDOR,
142 .description = RKISP_ALGO_AGIC_DESCRIPTION,
143 .type = RK_AIQ_ALGO_TYPE_AGIC,
144 .id = 0,
145 .create_context = create_context,
146 .destroy_context = destroy_context,
147 },
148 .prepare = prepare,
149 .pre_process = NULL,
150 .processing = processing,
151 .post_process = NULL,
152 };
153
154 RKAIQ_END_DECLARE
155