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