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 "RkAiqAblcHandle.h"
17
18 #include "RkAiqCore.h"
19
20 extern XCamReturn
21 rk_aiq_uapi_ablc_GetProc(const RkAiqAlgoContext *ctx,
22 AblcProc_t *ProcRes);
23
24 namespace RkCam {
25
26 DEFINE_HANDLE_REGISTER_TYPE(RkAiqAblcHandleInt);
27
init()28 void RkAiqAblcHandleInt::init() {
29 ENTER_ANALYZER_FUNCTION();
30
31 RkAiqHandle::deInit();
32 mConfig = (RkAiqAlgoCom*)(new RkAiqAlgoConfigAblc());
33 mProcInParam = (RkAiqAlgoCom*)(new RkAiqAlgoProcAblc());
34 mProcOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoProcResAblc());
35
36 EXIT_ANALYZER_FUNCTION();
37 }
38
updateConfig(bool needSync)39 XCamReturn RkAiqAblcHandleInt::updateConfig(bool needSync) {
40 ENTER_ANALYZER_FUNCTION();
41
42 XCamReturn ret = XCAM_RETURN_NO_ERROR;
43 #ifndef DISABLE_HANDLE_ATTRIB
44 if (needSync) mCfgMutex.lock();
45 // if something changed
46 if (updateAtt) {
47 mCurAtt = mNewAtt;
48 rk_aiq_uapi_ablc_SetAttrib(mAlgoCtx, &mCurAtt, false);
49 sendSignal(mCurAtt.sync.sync_mode);
50 updateAtt = false;
51 }
52
53 if (needSync) mCfgMutex.unlock();
54 #endif
55
56 EXIT_ANALYZER_FUNCTION();
57 return ret;
58 }
59
setAttrib(const rk_aiq_blc_attrib_t * att)60 XCamReturn RkAiqAblcHandleInt::setAttrib(const rk_aiq_blc_attrib_t* att) {
61 ENTER_ANALYZER_FUNCTION();
62 XCamReturn ret = XCAM_RETURN_NO_ERROR;
63 mCfgMutex.lock();
64
65 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
66 // if something changed, set att to mNewAtt, and
67 // the new params will be effective later when updateConfig
68 // called by RkAiqCore
69 #ifdef DISABLE_HANDLE_ATTRIB
70 ret = rk_aiq_uapi_ablc_SetAttrib(mAlgoCtx, const_cast<rk_aiq_blc_attrib_t*>(att), false);
71 #else
72 bool isChanged = false;
73 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \
74 memcmp(&mNewAtt, att, sizeof(*att)))
75 isChanged = true;
76 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
77 memcmp(&mCurAtt, att, sizeof(*att)))
78 isChanged = true;
79
80 // if something changed
81 if (isChanged) {
82 mNewAtt = *att;
83 updateAtt = true;
84 waitSignal(att->sync.sync_mode);
85 }
86 #endif
87
88 mCfgMutex.unlock();
89
90 EXIT_ANALYZER_FUNCTION();
91 return ret;
92 }
93
getAttrib(rk_aiq_blc_attrib_t * att)94 XCamReturn RkAiqAblcHandleInt::getAttrib(rk_aiq_blc_attrib_t* att) {
95 ENTER_ANALYZER_FUNCTION();
96
97 XCamReturn ret = XCAM_RETURN_NO_ERROR;
98
99 #ifdef DISABLE_HANDLE_ATTRIB
100 mCfgMutex.lock();
101 rk_aiq_uapi_ablc_GetAttrib(mAlgoCtx, att);
102 mCfgMutex.unlock();
103 #else
104 if(att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
105 mCfgMutex.lock();
106 rk_aiq_uapi_ablc_GetAttrib(mAlgoCtx, att);
107 att->sync.done = true;
108 mCfgMutex.unlock();
109 } else {
110 if(updateAtt) {
111 memcpy(att, &mNewAtt, sizeof(mNewAtt));
112 att->sync.done = false;
113 } else {
114 rk_aiq_uapi_ablc_GetAttrib(mAlgoCtx, att);
115 att->sync.done = true;
116 }
117 }
118 #endif
119
120 EXIT_ANALYZER_FUNCTION();
121 return ret;
122 }
getProcRes(AblcProc_t * ProcRes)123 XCamReturn RkAiqAblcHandleInt::getProcRes(AblcProc_t *ProcRes) {
124 ENTER_ANALYZER_FUNCTION();
125
126 XCamReturn ret = XCAM_RETURN_NO_ERROR;
127
128 rk_aiq_uapi_ablc_GetProc(mAlgoCtx, ProcRes);
129
130 EXIT_ANALYZER_FUNCTION();
131 return ret;
132 }
133
getInfo(rk_aiq_ablc_info_t * pInfo)134 XCamReturn RkAiqAblcHandleInt::getInfo(rk_aiq_ablc_info_t *pInfo) {
135 ENTER_ANALYZER_FUNCTION();
136
137 XCamReturn ret = XCAM_RETURN_NO_ERROR;
138
139 if(pInfo->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
140 mCfgMutex.lock();
141 rk_aiq_uapi_ablc_GetInfo(mAlgoCtx, pInfo);
142 pInfo->sync.done = true;
143 mCfgMutex.unlock();
144 } else {
145 rk_aiq_uapi_ablc_GetInfo(mAlgoCtx, pInfo);
146 pInfo->sync.done = true;
147
148 }
149
150 EXIT_ANALYZER_FUNCTION();
151 return ret;
152 }
153
prepare()154 XCamReturn RkAiqAblcHandleInt::prepare() {
155 ENTER_ANALYZER_FUNCTION();
156
157 XCamReturn ret = XCAM_RETURN_NO_ERROR;
158
159 ret = RkAiqHandle::prepare();
160 RKAIQCORE_CHECK_RET(ret, "ablc handle prepare failed");
161
162 RkAiqAlgoConfigAblc* ablc_config_int = (RkAiqAlgoConfigAblc*)mConfig;
163 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
164 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
165
166 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
167 ret = des->prepare(mConfig);
168 RKAIQCORE_CHECK_RET(ret, "ablc algo prepare failed");
169
170 EXIT_ANALYZER_FUNCTION();
171 return XCAM_RETURN_NO_ERROR;
172 }
173
preProcess()174 XCamReturn RkAiqAblcHandleInt::preProcess() {
175 ENTER_ANALYZER_FUNCTION();
176
177 XCamReturn ret = XCAM_RETURN_NO_ERROR;
178 #if 0
179 RkAiqAlgoPreAblc* ablc_pre_int = (RkAiqAlgoPreAblc*)mPreInParam;
180 RkAiqAlgoPreResAblc* ablc_pre_res_int = (RkAiqAlgoPreResAblc*)mPreOutParam;
181 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
182 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
183 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
184
185 ret = RkAiqHandle::preProcess();
186 if (ret) {
187 RKAIQCORE_CHECK_RET(ret, "ablc handle preProcess failed");
188 }
189
190 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
191 ret = des->pre_process(mPreInParam, mPreOutParam);
192 RKAIQCORE_CHECK_RET(ret, "ablc algo pre_process failed");
193
194 EXIT_ANALYZER_FUNCTION();
195 #endif
196 return XCAM_RETURN_NO_ERROR;
197 }
198
processing()199 XCamReturn RkAiqAblcHandleInt::processing() {
200 ENTER_ANALYZER_FUNCTION();
201
202 XCamReturn ret = XCAM_RETURN_NO_ERROR;
203
204 RkAiqAlgoProcAblc* ablc_proc_int = (RkAiqAlgoProcAblc*)mProcInParam;
205
206 if (mDes->id == 0) {
207 mProcResShared = new RkAiqAlgoProcResAblcIntShared();
208 if (!mProcResShared.ptr()) {
209 LOGE("new BLC mProcResShared failed, bypass!");
210 return XCAM_RETURN_BYPASS;
211 }
212 }
213
214 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
215 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
216 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
217
218 mProcResShared->result.ablc_proc_res = &shared->fullParams->mBlcV21Params->data()->result.v0;
219
220 ret = RkAiqHandle::processing();
221 if (ret < 0) {
222 LOGE_ANALYZER("ablc handle processing failed ret %d", ret);
223 mProcResShared = NULL;
224 return ret;
225 } else if (ret == XCAM_RETURN_BYPASS) {
226 LOGW_ANALYZER("%s:%d bypass !", __func__, __LINE__);
227 mProcResShared = NULL;
228 return ret;
229 }
230
231 ablc_proc_int->iso = sharedCom->iso;
232 ablc_proc_int->hdr_mode = sharedCom->working_mode;
233
234 #ifdef DISABLE_HANDLE_ATTRIB
235 mCfgMutex.lock();
236 #endif
237 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
238 ret = des->processing(mProcInParam, (RkAiqAlgoResCom*)(&mProcResShared->result));
239 #ifdef DISABLE_HANDLE_ATTRIB
240 mCfgMutex.unlock();
241 #endif
242 if (ret < 0) {
243 LOGE_ANALYZER("ablc algo processing failed ret %d", ret);
244 mProcResShared = NULL;
245 return ret;
246 } else if (ret == XCAM_RETURN_BYPASS) {
247 LOGW_ANALYZER("%s:%d bypass !", __func__, __LINE__);
248 mProcResShared = NULL;
249 return ret;
250 }
251
252 if (!mProcResShared->result.res_com.cfg_update) {
253 mProcResShared->result.ablc_proc_res = mLatestparam;
254 LOGD_ABLC("[%d] copy results from latest !", shared->frameId);
255 }
256
257 if (mAiqCore->mAlogsComSharedParams.init) {
258 RkAiqCore::RkAiqAlgosGroupShared_t* grpShared = nullptr;
259 uint64_t grpMask = grpId2GrpMask(RK_AIQ_CORE_ANALYZE_AWB);
260 if (!mAiqCore->getGroupSharedParams(grpMask, grpShared)) {
261 if (grpShared)
262 grpShared->res_comb.ablc_proc_res = mProcResShared->result.ablc_proc_res;
263 }
264 grpMask = grpId2GrpMask(RK_AIQ_CORE_ANALYZE_GRP0);
265 if (!mAiqCore->getGroupSharedParams(grpMask, grpShared)) {
266 if (grpShared)
267 grpShared->res_comb.ablc_proc_res = mProcResShared->result.ablc_proc_res;
268 }
269 grpMask = grpId2GrpMask(RK_AIQ_CORE_ANALYZE_GRP1);
270 if (!mAiqCore->getGroupSharedParams(grpMask, grpShared)) {
271 if (grpShared)
272 grpShared->res_comb.ablc_proc_res = mProcResShared->result.ablc_proc_res;
273 }
274 grpMask = grpId2GrpMask(RK_AIQ_CORE_ANALYZE_DHAZ);
275 if (!mAiqCore->getGroupSharedParams(grpMask, grpShared)) {
276 if (grpShared)
277 grpShared->res_comb.ablc_proc_res = mProcResShared->result.ablc_proc_res;
278 }
279 } else if (mPostShared) {
280 mProcResShared->set_sequence(shared->frameId);
281 RkAiqCoreVdBufMsg msg(XCAM_MESSAGE_BLC_PROC_RES_OK, shared->frameId, mProcResShared);
282 mAiqCore->post_message(msg);
283 }
284
285 EXIT_ANALYZER_FUNCTION();
286 return ret;
287 }
288
postProcess()289 XCamReturn RkAiqAblcHandleInt::postProcess() {
290 ENTER_ANALYZER_FUNCTION();
291
292 XCamReturn ret = XCAM_RETURN_NO_ERROR;
293 #if 0
294 RkAiqAlgoPostAblc* ablc_post_int = (RkAiqAlgoPostAblc*)mPostInParam;
295 RkAiqAlgoPostResAblc* ablc_post_res_int = (RkAiqAlgoPostResAblc*)mPostOutParam;
296 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
297 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
298 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
299
300 ret = RkAiqHandle::postProcess();
301 if (ret) {
302 RKAIQCORE_CHECK_RET(ret, "ablc handle postProcess failed");
303 return ret;
304 }
305
306 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
307 ret = des->post_process(mPostInParam, mPostOutParam);
308 RKAIQCORE_CHECK_RET(ret, "ablc algo post_process failed");
309
310 EXIT_ANALYZER_FUNCTION();
311 #endif
312 return ret;
313 }
314
genIspResult(RkAiqFullParams * params,RkAiqFullParams * cur_params)315 XCamReturn RkAiqAblcHandleInt::genIspResult(RkAiqFullParams* params, RkAiqFullParams* cur_params) {
316 ENTER_ANALYZER_FUNCTION();
317
318 XCamReturn ret = XCAM_RETURN_NO_ERROR;
319 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
320 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
321 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
322 if (!mProcResShared.ptr())
323 return XCAM_RETURN_NO_ERROR;
324 RkAiqAlgoProcResAblc* ablc_com = (RkAiqAlgoProcResAblc*)&mProcResShared->result;
325
326 rk_aiq_isp_blc_params_v21_t* blc_param = params->mBlcV21Params->data().ptr();
327
328 if (!ablc_com) {
329 LOGD_ANALYZER("no ablc result");
330 mProcResShared = NULL;
331 return XCAM_RETURN_NO_ERROR;
332 }
333
334 if (!this->getAlgoId()) {
335 RkAiqAlgoProcResAblc* ablc_rk = (RkAiqAlgoProcResAblc*)ablc_com;
336
337 if (sharedCom->init) {
338 blc_param->frame_id = 0;
339 } else {
340 blc_param->frame_id = shared->frameId;
341 }
342
343 if (ablc_com->res_com.cfg_update) {
344 mSyncFlag = shared->frameId;
345 blc_param->sync_flag = mSyncFlag;
346 // copy from algo result
347 cur_params->mBlcV21Params = params->mBlcV21Params;
348 mLatestparam = &cur_params->mBlcV21Params->data()->result.v0;
349 blc_param->is_update = true;
350 LOGD_ABLC("[%d] params from algo", mSyncFlag);
351 } else if (mSyncFlag != blc_param->sync_flag) {
352 blc_param->sync_flag = mSyncFlag;
353 // copy from latest result
354 if (cur_params->mBlcV21Params.ptr()) {
355 blc_param->result = cur_params->mBlcV21Params->data()->result;
356 blc_param->is_update = true;
357 } else {
358 LOGD_ABLC("no latest params !");
359 blc_param->is_update = false;
360 }
361 LOGD_ABLC("[%d] params from latest [%d]", shared->frameId, mSyncFlag);
362 } else {
363 // do nothing, result in buf needn't update
364 blc_param->is_update = false;
365 LOGD_ABLC("[%d] params needn't update", shared->frameId);
366 }
367 }
368
369 mProcResShared = NULL;
370
371 EXIT_ANALYZER_FUNCTION();
372
373 return ret;
374 }
375
376 } // namespace RkCam
377