xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/adegamma/rk_aiq_algo_adegamma_itf.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * rk_aiq_algo_agamma_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 "adegamma/rk_aiq_algo_adegamma_itf.h"
21 #include "adegamma/rk_aiq_adegamma_algo.h"
22 #include "rk_aiq_algo_types.h"
23 
24 RKAIQ_BEGIN_DECLARE
25 
26 typedef struct _RkAiqAlgoContext {
27     AdegammaHandle_t AdegammaHandle;
28 } RkAiqAlgoContext;
29 
30 
31 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)32 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
33 {
34     LOG1_ADEGAMMA("ENTER: %s \n", __func__);
35 
36     XCamReturn ret = XCAM_RETURN_NO_ERROR;
37     AdegammaHandle_t*AdegammaHandle = NULL;
38     CamCalibDbV2Context_t* calib = cfg->calibv2;
39     ret = AdegammaInit(&AdegammaHandle, calib);
40     *context = (RkAiqAlgoContext *)(AdegammaHandle);
41 
42     LOG1_ADEGAMMA("EXIT: %s \n", __func__);
43     return ret;
44 }
45 
46 static XCamReturn
destroy_context(RkAiqAlgoContext * context)47 destroy_context(RkAiqAlgoContext *context)
48 {
49     LOG1_ADEGAMMA("ENTER: %s \n", __func__);
50     AdegammaHandle_t*AdegammaHandle = (AdegammaHandle_t*)context;
51     XCamReturn ret = XCAM_RETURN_NO_ERROR;
52 
53     ret = AdegammaRelease(AdegammaHandle);
54 
55     LOG1_ADEGAMMA("EXIT: %s \n", __func__);
56     return ret;
57 }
58 
59 static XCamReturn
prepare(RkAiqAlgoCom * params)60 prepare(RkAiqAlgoCom* params)
61 {
62     LOG1_ADEGAMMA("ENTER: %s \n", __func__);
63     XCamReturn ret = XCAM_RETURN_NO_ERROR;
64     AdegammaHandle_t * AdegammaHandle = (AdegammaHandle_t *)params->ctx;
65     RkAiqAlgoConfigAdegamma* pCfgParam = (RkAiqAlgoConfigAdegamma*)params;
66     AdegammaHandle->working_mode = pCfgParam->com.u.prepare.working_mode;
67     AdegammaHandle->prepare_type = pCfgParam->com.u.prepare.conf_type;
68 
69     if(!!(AdegammaHandle->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )) {
70         CalibDbV2_Adegmma_t* adegamma_calib =
71             (CalibDbV2_Adegmma_t*)(CALIBDBV2_GET_MODULE_PTR(pCfgParam->com.u.prepare.calibv2, adegamma_calib));
72         AdegammaHandle->pCalibDb = adegamma_calib;//reload iq
73         LOGD_ADEGAMMA("%s: Adegamma Reload Para!!!\n", __FUNCTION__);
74     }
75 
76     if (pCfgParam->com.u.proc.gray_mode)
77         AdegammaHandle->Scene_mode = DEGAMMA_OUT_NIGHT;
78     else if (DEGAMMA_OUT_NORMAL == AdegammaHandle->working_mode)
79         AdegammaHandle->Scene_mode = DEGAMMA_OUT_NORMAL;
80     else
81         AdegammaHandle->Scene_mode = DEGAMMA_OUT_HDR;
82 
83     AdegammaHandle->isReCal_ = true;
84 
85     LOG1_ADEGAMMA("EXIT: %s \n", __func__);
86     return ret;
87 }
88 
89 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)90 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
91 {
92     LOG1_ADEGAMMA("ENTER: %s \n", __func__);
93 
94     XCamReturn ret = XCAM_RETURN_NO_ERROR;
95     AdegammaHandle_t * AdegammaHandle = (AdegammaHandle_t *)inparams->ctx;
96     RkAiqAlgoProcResAdegamma* procResPara = (RkAiqAlgoProcResAdegamma*)outparams;
97     AdegammaProcRes_t* AdegammaProcRes = procResPara->adegamma_proc_res;
98 
99     if (inparams->u.proc.gray_mode)
100         AdegammaHandle->Scene_mode = DEGAMMA_OUT_NIGHT;
101     else if (DEGAMMA_OUT_NORMAL == AdegammaHandle->working_mode)
102         AdegammaHandle->Scene_mode = DEGAMMA_OUT_NORMAL;
103     else
104         AdegammaHandle->Scene_mode = DEGAMMA_OUT_HDR;
105 
106     if (AdegammaHandle->isReCal_) {
107         AdegammaProcessing(AdegammaHandle, AdegammaProcRes);
108         outparams->cfg_update = true;
109         AdegammaHandle->isReCal_ = false;
110     } else {
111         outparams->cfg_update = false;
112     }
113 
114     LOG1_ADEGAMMA("EXIT: %s \n", __func__);
115     return ret;
116 }
117 
118 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)119 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
120 {
121     LOG1_ADEGAMMA("ENTER: %s \n", __func__);
122 
123     LOG1_ADEGAMMA("EXIT: %s \n", __func__);
124     return XCAM_RETURN_NO_ERROR;
125 }
126 
127 RkAiqAlgoDescription g_RkIspAlgoDescAdegamma = {
128     .common = {
129         .version = RKISP_ALGO_ADEGAMMA_VERSION,
130         .vendor  = RKISP_ALGO_ADEGAMMA_VENDOR,
131         .description = RKISP_ALGO_ADEGAMMA_DESCRIPTION,
132         .type    = RK_AIQ_ALGO_TYPE_ADEGAMMA,
133         .id      = 0,
134         .create_context  = create_context,
135         .destroy_context = destroy_context,
136     },
137     .prepare = prepare,
138     .pre_process = NULL,
139     .processing = processing,
140     .post_process = NULL,
141 };
142 
143 RKAIQ_END_DECLARE
144