1 /*
2 * Copyright (c) 2022 Rockchip Electronics 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 * Author: Cody Xie <cody.xie@rock-chips.com>
17 */
18
19 #include "algos/acac/rk_aiq_algo_acac_itf.h"
20
21 #include "algos/acac/cac_adaptor.h"
22 #include "algos/acac/rk_aiq_types_acac_algo_prvt.h"
23 #include "algos/rk_aiq_algo_types.h"
24 #include "iq_parser_v2/RkAiqCalibDbV2Helper.h"
25
26 using RkCam::CacAlgoAdaptor;
27
28 RKAIQ_BEGIN_DECLARE
29
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)30 static XCamReturn create_context(RkAiqAlgoContext** context, const AlgoCtxInstanceCfg* cfg) {
31 auto* ctx = new RkAiqAlgoContext();
32 if (ctx == nullptr) {
33 LOGE_ACAC("create acac context fail!");
34 return XCAM_RETURN_ERROR_MEM;
35 }
36
37 auto* adaptor = new CacAlgoAdaptor();
38 if (adaptor == nullptr) {
39 LOGE_ACAC("create acac handle fail!");
40 delete ctx;
41 return XCAM_RETURN_ERROR_MEM;
42 }
43
44 #if RKAIQ_HAVE_CAC_V03
45 auto* calib_cac =
46 (CalibDbV2_Cac_V03_t*)(CALIBDBV2_GET_MODULE_PTR(cfg->calibv2, cac_v03));
47 XCAM_ASSERT(calib_cac != nullptr);
48 adaptor->Config(cfg, calib_cac);
49 #elif RKAIQ_HAVE_CAC_V10
50 auto* calib_cac =
51 (CalibDbV2_Cac_V10_t*)(CALIBDBV2_GET_MODULE_PTR(cfg->calibv2, cac_v10));
52 XCAM_ASSERT(calib_cac != nullptr);
53 adaptor->Config(cfg, calib_cac);
54 #elif RKAIQ_HAVE_CAC_V11
55 auto* calib_cac =
56 (CalibDbV2_Cac_V11_t*)(CALIBDBV2_GET_MODULE_PTR(cfg->calibv2, cac_v11));
57 XCAM_ASSERT(calib_cac != nullptr);
58 adaptor->Config(cfg, calib_cac);
59 #endif
60
61 ctx->handle = static_cast<void*>(adaptor);
62 *context = ctx;
63
64 return XCAM_RETURN_NO_ERROR;
65 }
66
destroy_context(RkAiqAlgoContext * context)67 static XCamReturn destroy_context(RkAiqAlgoContext* context) {
68 if (context != nullptr) {
69 if (context->handle != nullptr) {
70 auto* adaptor = static_cast<CacAlgoAdaptor*>(context->handle);
71 delete adaptor;
72 context->handle = nullptr;
73 }
74 delete context;
75 }
76 return XCAM_RETURN_NO_ERROR;
77 }
78
prepare(RkAiqAlgoCom * params)79 static XCamReturn prepare(RkAiqAlgoCom* params) {
80 auto* adaptor = static_cast<CacAlgoAdaptor*>(params->ctx->handle);
81 RkAiqAlgoConfigAcac* config = (RkAiqAlgoConfigAcac*)params;
82 auto* calibv2 = config->com.u.prepare.calibv2;
83
84 if (!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
85 auto* cfg = adaptor->GetConfig();
86 const_cast<AlgoCtxInstanceCfg*>(cfg)->calibv2 = calibv2;
87 LOGD_ACAC("Re-config");
88 #if RKAIQ_HAVE_CAC_V03
89 auto* calib_cac =
90 (CalibDbV2_Cac_V03_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, cac_v03));
91 if (calib_cac) {
92 adaptor->Config(cfg, calib_cac);
93 }
94 #elif RKAIQ_HAVE_CAC_V10
95 auto* calib_cac = (CalibDbV2_Cac_V10_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, cac_v10));
96 if (calib_cac) {
97 adaptor->Config(cfg, calib_cac);
98 }
99 #elif RKAIQ_HAVE_CAC_V11
100 auto* calib_cac = (CalibDbV2_Cac_V11_t*)(CALIBDBV2_GET_MODULE_PTR(calibv2, cac_v11));
101 if (calib_cac) {
102 adaptor->Config(cfg, calib_cac);
103 }
104 #endif
105 }
106
107 // prepare maybe called before hw prepared, may just intend to
108 // update calib params before real prepare.
109 if (config->width != 0 && config->height != 0)
110 return adaptor->Prepare(config);
111 else
112 return XCAM_RETURN_NO_ERROR;
113 }
114
pre_process(const RkAiqAlgoCom *,RkAiqAlgoResCom *)115 static XCamReturn pre_process(const RkAiqAlgoCom* /* inparams */, RkAiqAlgoResCom* /* outparams */) {
116 return XCAM_RETURN_NO_ERROR;
117 }
118
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)119 static XCamReturn processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) {
120 RkAiqAlgoProcAcac* input = (RkAiqAlgoProcAcac*)(inparams);
121 RkAiqAlgoProcResAcac* output = (RkAiqAlgoProcResAcac*)outparams;
122 auto* adaptor = static_cast<CacAlgoAdaptor*>(inparams->ctx->handle);
123
124 adaptor->OnFrameEvent(input, output);
125
126 return XCAM_RETURN_NO_ERROR;
127 }
128
post_process(const RkAiqAlgoCom *,RkAiqAlgoResCom *)129 static XCamReturn post_process(const RkAiqAlgoCom* /* inparams */, RkAiqAlgoResCom* /* outparams */) {
130 return XCAM_RETURN_NO_ERROR;
131 }
132
133 RkAiqAlgoDescription g_RkIspAlgoDescAcac = {
134 .common =
135 {
136 .version = RKISP_ALGO_ACAC_VERSION,
137 .vendor = RKISP_ALGO_ACAC_VENDOR,
138 .description = RKISP_ALGO_ACAC_DESCRIPTION,
139 .type = RK_AIQ_ALGO_TYPE_ACAC,
140 .id = 0,
141 .create_context = create_context,
142 .destroy_context = destroy_context,
143 },
144 .prepare = prepare,
145 .pre_process = NULL,
146 .processing = processing,
147 .post_process = NULL,
148 };
149
150 RKAIQ_END_DECLARE
151