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