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 "RkAiqAdrcHandle.h"
17
18 #include "RkAiqCore.h"
19
20 namespace RkCam {
21
22 DEFINE_HANDLE_REGISTER_TYPE(RkAiqAdrcHandleInt);
23
prepare()24 XCamReturn RkAiqAdrcHandleInt::prepare() {
25 ENTER_ANALYZER_FUNCTION();
26
27 XCamReturn ret = XCAM_RETURN_NO_ERROR;
28
29 ret = RkAiqHandle::prepare();
30 RKAIQCORE_CHECK_RET(ret, "adrc handle prepare failed");
31
32 RkAiqAlgoConfigAdrc* adrc_config_int = (RkAiqAlgoConfigAdrc*)mConfig;
33 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
34
35 adrc_config_int->rawHeight = sharedCom->snsDes.isp_acq_height;
36 adrc_config_int->rawWidth = sharedCom->snsDes.isp_acq_width;
37 adrc_config_int->working_mode = sharedCom->working_mode;
38
39 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
40 ret = des->prepare(mConfig);
41 RKAIQCORE_CHECK_RET(ret, "adrc algo prepare failed");
42
43 EXIT_ANALYZER_FUNCTION();
44 return XCAM_RETURN_NO_ERROR;
45 }
46
init()47 void RkAiqAdrcHandleInt::init() {
48 ENTER_ANALYZER_FUNCTION();
49
50 RkAiqHandle::deInit();
51 mConfig = (RkAiqAlgoCom*)(new RkAiqAlgoConfigAdrc());
52 mProcInParam = (RkAiqAlgoCom*)(new RkAiqAlgoProcAdrc());
53 mProcOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoProcResAdrc());
54
55 EXIT_ANALYZER_FUNCTION();
56 }
57
updateConfig(bool needSync)58 XCamReturn RkAiqAdrcHandleInt::updateConfig(bool needSync) {
59 ENTER_ANALYZER_FUNCTION();
60
61 XCamReturn ret = XCAM_RETURN_NO_ERROR;
62 #ifndef DISABLE_HANDLE_ATTRIB
63 if (needSync) mCfgMutex.lock();
64 // if something changed
65 if (updateAtt) {
66 #if RKAIQ_HAVE_DRC_V10
67 mCurAttV10 = mNewAttV10;
68 rk_aiq_uapi_adrc_v10_SetAttrib(mAlgoCtx, &mCurAttV10, true);
69 updateAtt = false;
70 sendSignal(mCurAttV10.sync.sync_mode);
71 #endif
72 #if RKAIQ_HAVE_DRC_V11
73 mCurAttV11 = mNewAttV11;
74 rk_aiq_uapi_adrc_v11_SetAttrib(mAlgoCtx, &mCurAttV11, true);
75 updateAtt = false;
76 sendSignal(mCurAttV11.sync.sync_mode);
77 #endif
78 #if RKAIQ_HAVE_DRC_V12
79 mCurAttV12 = mNewAttV12;
80 rk_aiq_uapi_adrc_v12_SetAttrib(mAlgoCtx, &mCurAttV12, true);
81 updateAtt = false;
82 sendSignal(mCurAttV12.sync.sync_mode);
83 #endif
84 #if RKAIQ_HAVE_DRC_V12_LITE
85 mCurAttV12Lite = mNewAttV12Lite;
86 rk_aiq_uapi_adrc_v12_lite_SetAttrib(mAlgoCtx, &mCurAttV12Lite, true);
87 updateAtt = false;
88 sendSignal(mCurAttV12Lite.sync.sync_mode);
89 #endif
90 }
91
92 if (needSync) mCfgMutex.unlock();
93 #endif
94
95 EXIT_ANALYZER_FUNCTION();
96 return ret;
97 }
98
99 #if RKAIQ_HAVE_DRC_V10
setAttribV10(const drcAttrV10_t * att)100 XCamReturn RkAiqAdrcHandleInt::setAttribV10(const drcAttrV10_t* att) {
101 ENTER_ANALYZER_FUNCTION();
102
103 XCamReturn ret = XCAM_RETURN_NO_ERROR;
104 mCfgMutex.lock();
105
106 #ifdef DISABLE_HANDLE_ATTRIB
107 ret = rk_aiq_uapi_adrc_v10_SetAttrib(mAlgoCtx, att, true);
108 #else
109 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
110 // if something changed, set att to mNewAtt, and
111 // the new params will be effective later when updateConfig
112 // called by RkAiqCore
113 bool isChanged = false;
114 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC &&
115 memcmp(&mNewAttV10, att, sizeof(drcAttrV10_t)))
116 isChanged = true;
117 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC &&
118 memcmp(&mCurAttV10, att, sizeof(drcAttrV10_t)))
119 isChanged = true;
120
121 // if something changed
122 if (isChanged) {
123 mNewAttV10 = *att;
124 updateAtt = true;
125 waitSignal(att->sync.sync_mode);
126 }
127 #endif
128 mCfgMutex.unlock();
129
130 EXIT_ANALYZER_FUNCTION();
131 return ret;
132 }
getAttribV10(drcAttrV10_t * att)133 XCamReturn RkAiqAdrcHandleInt::getAttribV10(drcAttrV10_t* att) {
134 ENTER_ANALYZER_FUNCTION();
135
136 XCamReturn ret = XCAM_RETURN_NO_ERROR;
137
138 #ifdef DISABLE_HANDLE_ATTRIB
139 mCfgMutex.lock();
140 rk_aiq_uapi_adrc_v10_GetAttrib(mAlgoCtx, att);
141 att->sync.done = true;
142 mCfgMutex.unlock();
143 #else
144 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
145 mCfgMutex.lock();
146 rk_aiq_uapi_adrc_v10_GetAttrib(mAlgoCtx, att);
147 att->sync.done = true;
148 mCfgMutex.unlock();
149 } else {
150 if (updateAtt) {
151 memcpy(att, &mNewAttV10, sizeof(drcAttrV10_t));
152 att->sync.done = false;
153 } else {
154 rk_aiq_uapi_adrc_v10_GetAttrib(mAlgoCtx, att);
155 att->sync.sync_mode = mNewAttV10.sync.sync_mode;
156 att->sync.done = true;
157 }
158 }
159 #endif
160 EXIT_ANALYZER_FUNCTION();
161 return ret;
162 }
163 #endif
164 #if RKAIQ_HAVE_DRC_V11
setAttribV11(const drcAttrV11_t * att)165 XCamReturn RkAiqAdrcHandleInt::setAttribV11(const drcAttrV11_t* att) {
166 ENTER_ANALYZER_FUNCTION();
167
168 XCamReturn ret = XCAM_RETURN_NO_ERROR;
169 mCfgMutex.lock();
170
171 #ifdef DISABLE_HANDLE_ATTRIB
172 ret = rk_aiq_uapi_adrc_v11_SetAttrib(mAlgoCtx, att, true);
173 #else
174 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
175 // if something changed, set att to mNewAtt, and
176 // the new params will be effective later when updateConfig
177 // called by RkAiqCore
178 bool isChanged = false;
179 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC &&
180 memcmp(&mNewAttV11, att, sizeof(drcAttrV11_t)))
181 isChanged = true;
182 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC &&
183 memcmp(&mCurAttV11, att, sizeof(drcAttrV11_t)))
184 isChanged = true;
185
186 // if something changed
187 if (isChanged) {
188 mNewAttV11 = *att;
189 updateAtt = true;
190 waitSignal(att->sync.sync_mode);
191 }
192 #endif
193 mCfgMutex.unlock();
194
195 EXIT_ANALYZER_FUNCTION();
196 return ret;
197 }
getAttribV11(drcAttrV11_t * att)198 XCamReturn RkAiqAdrcHandleInt::getAttribV11(drcAttrV11_t* att) {
199 ENTER_ANALYZER_FUNCTION();
200
201 XCamReturn ret = XCAM_RETURN_NO_ERROR;
202
203 #ifdef DISABLE_HANDLE_ATTRIB
204 mCfgMutex.lock();
205 rk_aiq_uapi_adrc_v11_GetAttrib(mAlgoCtx, att);
206 att->sync.done = true;
207 mCfgMutex.unlock();
208 #else
209 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
210 mCfgMutex.lock();
211 rk_aiq_uapi_adrc_v11_GetAttrib(mAlgoCtx, att);
212 att->sync.done = true;
213 mCfgMutex.unlock();
214 } else {
215 if (updateAtt) {
216 memcpy(att, &mNewAttV11, sizeof(drcAttrV11_t));
217 att->sync.done = false;
218 } else {
219 rk_aiq_uapi_adrc_v11_GetAttrib(mAlgoCtx, att);
220 att->sync.sync_mode = mNewAttV11.sync.sync_mode;
221 att->sync.done = true;
222 }
223 }
224 #endif
225 EXIT_ANALYZER_FUNCTION();
226 return ret;
227 }
228 #endif
229 #if RKAIQ_HAVE_DRC_V12
setAttribV12(const drcAttrV12_t * att)230 XCamReturn RkAiqAdrcHandleInt::setAttribV12(const drcAttrV12_t* att) {
231 ENTER_ANALYZER_FUNCTION();
232
233 XCamReturn ret = XCAM_RETURN_NO_ERROR;
234 mCfgMutex.lock();
235
236 #ifdef DISABLE_HANDLE_ATTRIB
237 ret = rk_aiq_uapi_adrc_v12_SetAttrib(mAlgoCtx, att, true);
238 #else
239 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
240 // if something changed, set att to mNewAtt, and
241 // the new params will be effective later when updateConfig
242 // called by RkAiqCore
243 bool isChanged = false;
244 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC &&
245 memcmp(&mNewAttV12, att, sizeof(drcAttrV12_t)))
246 isChanged = true;
247 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC &&
248 memcmp(&mCurAttV12, att, sizeof(drcAttrV12_t)))
249 isChanged = true;
250
251 // if something changed
252 if (isChanged) {
253 mNewAttV12 = *att;
254 updateAtt = true;
255 waitSignal(att->sync.sync_mode);
256 }
257 #endif
258 mCfgMutex.unlock();
259
260 EXIT_ANALYZER_FUNCTION();
261 return ret;
262 }
getAttribV12(drcAttrV12_t * att)263 XCamReturn RkAiqAdrcHandleInt::getAttribV12(drcAttrV12_t* att) {
264 ENTER_ANALYZER_FUNCTION();
265
266 XCamReturn ret = XCAM_RETURN_NO_ERROR;
267
268 #ifdef DISABLE_HANDLE_ATTRIB
269 mCfgMutex.lock();
270 rk_aiq_uapi_adrc_v12_GetAttrib(mAlgoCtx, att);
271 att->sync.done = true;
272 mCfgMutex.unlock();
273 #else
274 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
275 mCfgMutex.lock();
276 rk_aiq_uapi_adrc_v12_GetAttrib(mAlgoCtx, att);
277 att->sync.done = true;
278 mCfgMutex.unlock();
279 } else {
280 if (updateAtt) {
281 memcpy(att, &mNewAttV12, sizeof(drcAttrV12_t));
282 att->sync.done = false;
283 } else {
284 rk_aiq_uapi_adrc_v12_GetAttrib(mAlgoCtx, att);
285 att->sync.sync_mode = mNewAttV12.sync.sync_mode;
286 att->sync.done = true;
287 }
288 }
289 #endif
290 EXIT_ANALYZER_FUNCTION();
291 return ret;
292 }
293 #endif
294 #if RKAIQ_HAVE_DRC_V12_LITE
setAttribV12Lite(const drcAttrV12Lite_t * att)295 XCamReturn RkAiqAdrcHandleInt::setAttribV12Lite(const drcAttrV12Lite_t* att) {
296 ENTER_ANALYZER_FUNCTION();
297
298 XCamReturn ret = XCAM_RETURN_NO_ERROR;
299 mCfgMutex.lock();
300
301 #ifdef DISABLE_HANDLE_ATTRIB
302 ret = rk_aiq_uapi_adrc_v12_lite_SetAttrib(mAlgoCtx, att, true);
303 #else
304 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
305 // if something changed, set att to mNewAtt, and
306 // the new params will be effective later when updateConfig
307 // called by RkAiqCore
308 bool isChanged = false;
309 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC &&
310 memcmp(&mNewAttV12Lite, att, sizeof(drcAttrV12Lite_t)))
311 isChanged = true;
312 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC &&
313 memcmp(&mCurAttV12Lite, att, sizeof(drcAttrV12Lite_t)))
314 isChanged = true;
315
316 // if something changed
317 if (isChanged) {
318 mNewAttV12Lite = *att;
319 updateAtt = true;
320 waitSignal(att->sync.sync_mode);
321 }
322 #endif
323 mCfgMutex.unlock();
324
325 EXIT_ANALYZER_FUNCTION();
326 return ret;
327 }
getAttribV12Lite(drcAttrV12Lite_t * att)328 XCamReturn RkAiqAdrcHandleInt::getAttribV12Lite(drcAttrV12Lite_t* att) {
329 ENTER_ANALYZER_FUNCTION();
330
331 XCamReturn ret = XCAM_RETURN_NO_ERROR;
332
333 #ifdef DISABLE_HANDLE_ATTRIB
334 mCfgMutex.lock();
335 rk_aiq_uapi_adrc_v12_lite_GetAttrib(mAlgoCtx, att);
336 att->sync.done = true;
337 mCfgMutex.unlock();
338 #else
339 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
340 mCfgMutex.lock();
341 rk_aiq_uapi_adrc_v12_lite_GetAttrib(mAlgoCtx, att);
342 att->sync.done = true;
343 mCfgMutex.unlock();
344 } else {
345 if (updateAtt) {
346 memcpy(att, &mNewAttV12Lite, sizeof(drcAttrV12Lite_t));
347 att->sync.done = false;
348 } else {
349 rk_aiq_uapi_adrc_v12_lite_GetAttrib(mAlgoCtx, att);
350 att->sync.sync_mode = mNewAttV12Lite.sync.sync_mode;
351 att->sync.done = true;
352 }
353 }
354 #endif
355
356 EXIT_ANALYZER_FUNCTION();
357 return ret;
358 }
359 #endif
360
preProcess()361 XCamReturn RkAiqAdrcHandleInt::preProcess() {
362 ENTER_ANALYZER_FUNCTION();
363
364 XCamReturn ret = XCAM_RETURN_NO_ERROR;
365 #if 0
366 RkAiqAlgoPreAdrc* adrc_pre_int = (RkAiqAlgoPreAdrc*)mPreInParam;
367 RkAiqAlgoPreResAdrc* adrc_pre_res_int = (RkAiqAlgoPreResAdrc*)mPreOutParam;
368 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
369 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
370 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
371
372 ret = RkAiqHandle::preProcess();
373 if (ret) {
374 RKAIQCORE_CHECK_RET(ret, "adrc handle preProcess failed");
375 }
376
377 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
378 ret = des->pre_process(mPreInParam, mPreOutParam);
379 RKAIQCORE_CHECK_RET(ret, "adrc algo pre_process failed");
380
381 EXIT_ANALYZER_FUNCTION();
382 #endif
383 return XCAM_RETURN_NO_ERROR;
384 }
385
processing()386 XCamReturn RkAiqAdrcHandleInt::processing() {
387 ENTER_ANALYZER_FUNCTION();
388
389 XCamReturn ret = XCAM_RETURN_NO_ERROR;
390
391 RkAiqAlgoProcAdrc* adrc_proc_int = (RkAiqAlgoProcAdrc*)mProcInParam;
392 RkAiqAlgoProcResAdrc* adrc_proc_res_int = (RkAiqAlgoProcResAdrc*)mProcOutParam;
393 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
394 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
395 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
396
397 adrc_proc_res_int->AdrcProcRes = &shared->fullParams->mDrcParams->data()->result;
398 adrc_proc_int->LongFrmMode = mAeProcRes.LongFrmMode;
399
400 #if RKAIQ_HAVE_DRC_V12 || RKAIQ_HAVE_DRC_V12_LITE
401 adrc_proc_int->ablcV32_proc_res.blc_ob_enable = shared->res_comb.ablcV32_proc_res->blc_ob_enable;
402 adrc_proc_int->ablcV32_proc_res.isp_ob_predgain =
403 shared->res_comb.ablcV32_proc_res->isp_ob_predgain;
404 #endif
405
406 ret = RkAiqHandle::processing();
407 if (ret) {
408 RKAIQCORE_CHECK_RET(ret, "adrc handle processing failed");
409 }
410
411 #ifdef DISABLE_HANDLE_ATTRIB
412 mCfgMutex.lock();
413 #endif
414 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
415 ret = des->processing(mProcInParam, mProcOutParam);
416 #ifdef DISABLE_HANDLE_ATTRIB
417 mCfgMutex.unlock();
418 #endif
419 RKAIQCORE_CHECK_RET(ret, "adrc algo processing failed");
420
421 EXIT_ANALYZER_FUNCTION();
422 return ret;
423 }
424
postProcess()425 XCamReturn RkAiqAdrcHandleInt::postProcess() {
426 ENTER_ANALYZER_FUNCTION();
427
428 XCamReturn ret = XCAM_RETURN_NO_ERROR;
429 #if 0
430 RkAiqAlgoPostAdrc* adrc_post_int = (RkAiqAlgoPostAdrc*)mPostInParam;
431 RkAiqAlgoPostResAdrc* adrc_post_res_int = (RkAiqAlgoPostResAdrc*)mPostOutParam;
432 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
433 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
434 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
435
436 ret = RkAiqHandle::postProcess();
437 if (ret) {
438 RKAIQCORE_CHECK_RET(ret, "adrc handle postProcess failed");
439 return ret;
440 }
441
442 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
443 ret = des->post_process(mPostInParam, mPostOutParam);
444 RKAIQCORE_CHECK_RET(ret, "adrc algo post_process failed");
445
446 EXIT_ANALYZER_FUNCTION();
447 #endif
448 return ret;
449 }
450
genIspResult(RkAiqFullParams * params,RkAiqFullParams * cur_params)451 XCamReturn RkAiqAdrcHandleInt::genIspResult(RkAiqFullParams* params, RkAiqFullParams* cur_params) {
452 ENTER_ANALYZER_FUNCTION();
453
454 XCamReturn ret = XCAM_RETURN_NO_ERROR;
455 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
456 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
457 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
458 RkAiqAlgoProcResAdrc* adrc_com = (RkAiqAlgoProcResAdrc*)mProcOutParam;
459
460 if (!adrc_com) {
461 LOGD_ANALYZER("no adrc result");
462 return XCAM_RETURN_NO_ERROR;
463 }
464
465 RkAiqAlgoProcResAdrc* adrc_rk = (RkAiqAlgoProcResAdrc*)adrc_com;
466 if (!this->getAlgoId()) {
467 RkAiqAlgoProcResAdrc* ahdr_rk = (RkAiqAlgoProcResAdrc*)adrc_com;
468
469 rk_aiq_isp_drc_params_v21_t* drc_param = params->mDrcParams->data().ptr();
470 if (sharedCom->init) {
471 drc_param->frame_id = 0;
472 } else {
473 drc_param->frame_id = shared->frameId;
474 }
475
476 if (adrc_com->res_com.cfg_update) {
477 mSyncFlag = shared->frameId;
478 drc_param->sync_flag = mSyncFlag;
479 // copy from algo result
480 // set as the latest result
481 cur_params->mDrcParams = params->mDrcParams;
482 drc_param->is_update = true;
483 LOGD_ATMO("[%d] params from algo", mSyncFlag);
484 } else if (mSyncFlag != drc_param->sync_flag) {
485 drc_param->sync_flag = mSyncFlag;
486 // copy from latest result
487 if (cur_params->mDrcParams.ptr()) {
488 drc_param->result = cur_params->mDrcParams->data()->result;
489 drc_param->is_update = true;
490 } else {
491 LOGE_ATMO("no latest params !");
492 drc_param->is_update = false;
493 }
494 LOGD_ATMO("[%d] params from latest [%d]", shared->frameId, mSyncFlag);
495 } else {
496 // do nothing, result in buf needn't update
497 drc_param->is_update = false;
498 LOGD_ATMO("[%d] params needn't update", shared->frameId);
499 }
500 }
501
502 EXIT_ANALYZER_FUNCTION();
503
504 return ret;
505
506 }
507
508 } // namespace RkCam
509