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 "RkAiqAgicHandle.h"
17
18 #include "RkAiqCore.h"
19
20 namespace RkCam {
21
22 DEFINE_HANDLE_REGISTER_TYPE(RkAiqAgicHandleInt);
23
init()24 void RkAiqAgicHandleInt::init() {
25 ENTER_ANALYZER_FUNCTION();
26
27 RkAiqHandle::deInit();
28 mConfig = (RkAiqAlgoCom*)(new RkAiqAlgoConfigAgic());
29 mProcInParam = (RkAiqAlgoCom*)(new RkAiqAlgoProcAgic());
30 mProcOutParam = (RkAiqAlgoResCom*)(new RkAiqAlgoProcResAgic());
31
32 EXIT_ANALYZER_FUNCTION();
33 }
34
updateConfig(bool needSync)35 XCamReturn RkAiqAgicHandleInt::updateConfig(bool needSync) {
36 ENTER_ANALYZER_FUNCTION();
37
38 XCamReturn ret = XCAM_RETURN_NO_ERROR;
39 #ifndef DISABLE_HANDLE_ATTRIB
40 if (needSync) mCfgMutex.lock();
41 // if something changed
42 if (updateAttV1) {
43 mCurAttV1 = mNewAttV1;
44 rk_aiq_uapi_agic_v1_SetAttrib(mAlgoCtx, &mCurAttV1, false);
45 updateAttV1 = false;
46 sendSignal(mCurAttV1.sync.sync_mode);
47 }
48 if (updateAttV2) {
49 mCurAttV2 = mNewAttV2;
50 rk_aiq_uapi_agic_v2_SetAttrib(mAlgoCtx, &mCurAttV2, false);
51 updateAttV2 = false;
52 sendSignal(mCurAttV2.sync.sync_mode);
53 }
54 if (needSync) mCfgMutex.unlock();
55 #endif
56 EXIT_ANALYZER_FUNCTION();
57 return ret;
58 }
59
setAttribV1(const rkaiq_gic_v1_api_attr_t * att)60 XCamReturn RkAiqAgicHandleInt::setAttribV1(const rkaiq_gic_v1_api_attr_t* att) {
61 ENTER_ANALYZER_FUNCTION();
62
63 XCamReturn ret = XCAM_RETURN_NO_ERROR;
64 mCfgMutex.lock();
65
66 #ifdef DISABLE_HANDLE_ATTRIB
67 ret = rk_aiq_uapi_agic_v1_SetAttrib(mAlgoCtx, att, false);
68 #else
69 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
70 // if something changed, set att to mNewAtt, and
71 // the new params will be effective later when updateConfig
72 // called by RkAiqCore
73 bool isChanged = false;
74 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \
75 memcmp(&mNewAttV1, att, sizeof(*att)))
76 isChanged = true;
77 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
78 memcmp(&mCurAttV1, att, sizeof(*att)))
79 isChanged = true;
80
81 // if something changed
82 if (isChanged) {
83 mNewAttV1 = *att;
84 updateAttV1 = true;
85 waitSignal(att->sync.sync_mode);
86 }
87 #endif
88
89 mCfgMutex.unlock();
90
91 EXIT_ANALYZER_FUNCTION();
92 return ret;
93 }
94
getAttribV1(rkaiq_gic_v1_api_attr_t * att)95 XCamReturn RkAiqAgicHandleInt::getAttribV1(rkaiq_gic_v1_api_attr_t* att) {
96 ENTER_ANALYZER_FUNCTION();
97
98 XCamReturn ret = XCAM_RETURN_NO_ERROR;
99
100 #ifdef DISABLE_HANDLE_ATTRIB
101 mCfgMutex.lock();
102 rk_aiq_uapi_agic_v1_GetAttrib(mAlgoCtx, att);
103 att->sync.done = true;
104 mCfgMutex.unlock();
105 #else
106 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
107 mCfgMutex.lock();
108 rk_aiq_uapi_agic_v1_GetAttrib(mAlgoCtx, att);
109 att->sync.done = true;
110 mCfgMutex.unlock();
111 } else {
112 if (updateAttV1) {
113 memcpy(att, &mNewAttV1, sizeof(mNewAttV1));
114 att->sync.done = false;
115 } else {
116 rk_aiq_uapi_agic_v1_GetAttrib(mAlgoCtx, att);
117 att->sync.sync_mode = mNewAttV1.sync.sync_mode;
118 att->sync.done = true;
119 }
120 }
121 #endif
122
123 EXIT_ANALYZER_FUNCTION();
124 return ret;
125 }
126
setAttribV2(const rkaiq_gic_v2_api_attr_t * att)127 XCamReturn RkAiqAgicHandleInt::setAttribV2(const rkaiq_gic_v2_api_attr_t* att) {
128 ENTER_ANALYZER_FUNCTION();
129
130 XCamReturn ret = XCAM_RETURN_NO_ERROR;
131 mCfgMutex.lock();
132
133 #ifdef DISABLE_HANDLE_ATTRIB
134 ret = rk_aiq_uapi_agic_v2_SetAttrib(mAlgoCtx, att, false);
135 #else
136 // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
137 // if something changed, set att to mNewAtt, and
138 // the new params will be effective later when updateConfig
139 // called by RkAiqCore
140 bool isChanged = false;
141 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \
142 memcmp(&mNewAttV2, att, sizeof(*att)))
143 isChanged = true;
144 else if (att->sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
145 memcmp(&mCurAttV2, att, sizeof(*att)))
146 isChanged = true;
147
148 // if something changed
149 if (isChanged) {
150 mNewAttV2 = *att;
151 updateAttV2 = true;
152 waitSignal(att->sync.sync_mode);
153 }
154 #endif
155
156 mCfgMutex.unlock();
157
158 EXIT_ANALYZER_FUNCTION();
159 return ret;
160 }
161
getAttribV2(rkaiq_gic_v2_api_attr_t * att)162 XCamReturn RkAiqAgicHandleInt::getAttribV2(rkaiq_gic_v2_api_attr_t* att) {
163 ENTER_ANALYZER_FUNCTION();
164
165 XCamReturn ret = XCAM_RETURN_NO_ERROR;
166
167 #ifdef DISABLE_HANDLE_ATTRIB
168 mCfgMutex.lock();
169 rk_aiq_uapi_agic_v2_GetAttrib(mAlgoCtx, att);
170 att->sync.done = true;
171 mCfgMutex.unlock();
172 #else
173 if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
174 mCfgMutex.lock();
175 rk_aiq_uapi_agic_v2_GetAttrib(mAlgoCtx, att);
176 att->sync.done = true;
177 mCfgMutex.unlock();
178 } else {
179 if (updateAttV2) {
180 memcpy(att, &mNewAttV2, sizeof(mNewAttV2));
181 att->sync.done = false;
182 } else {
183 rk_aiq_uapi_agic_v2_GetAttrib(mAlgoCtx, att);
184 att->sync.sync_mode = mNewAttV2.sync.sync_mode;
185 att->sync.done = true;
186 }
187 }
188 #endif
189
190 EXIT_ANALYZER_FUNCTION();
191 return ret;
192 }
193
prepare()194 XCamReturn RkAiqAgicHandleInt::prepare() {
195 ENTER_ANALYZER_FUNCTION();
196
197 XCamReturn ret = XCAM_RETURN_NO_ERROR;
198
199 ret = RkAiqHandle::prepare();
200 RKAIQCORE_CHECK_RET(ret, "agic handle prepare failed");
201
202 RkAiqAlgoConfigAgic* agic_config_int = (RkAiqAlgoConfigAgic*)mConfig;
203 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
204 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
205
206 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
207 ret = des->prepare(mConfig);
208 RKAIQCORE_CHECK_RET(ret, "agic algo prepare failed");
209
210 EXIT_ANALYZER_FUNCTION();
211 return XCAM_RETURN_NO_ERROR;
212 }
213
preProcess()214 XCamReturn RkAiqAgicHandleInt::preProcess() {
215 ENTER_ANALYZER_FUNCTION();
216
217 XCamReturn ret = XCAM_RETURN_NO_ERROR;
218 #if 0
219 RkAiqAlgoPreAgic* agic_pre_int = (RkAiqAlgoPreAgic*)mPreInParam;
220 RkAiqAlgoPreResAgic* agic_pre_res_int = (RkAiqAlgoPreResAgic*)mPreOutParam;
221 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
222 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
223 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
224
225 ret = RkAiqHandle::preProcess();
226 if (ret) {
227 RKAIQCORE_CHECK_RET(ret, "agic handle preProcess failed");
228 }
229
230 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
231 ret = des->pre_process(mPreInParam, mPreOutParam);
232 RKAIQCORE_CHECK_RET(ret, "agic algo pre_process failed");
233
234 EXIT_ANALYZER_FUNCTION();
235 #endif
236 return XCAM_RETURN_NO_ERROR;
237 }
238
processing()239 XCamReturn RkAiqAgicHandleInt::processing() {
240 ENTER_ANALYZER_FUNCTION();
241
242 XCamReturn ret = XCAM_RETURN_NO_ERROR;
243
244 RkAiqAlgoProcAgic* agic_proc_int = (RkAiqAlgoProcAgic*)mProcInParam;
245 RkAiqAlgoProcResAgic* agic_proc_res_int = (RkAiqAlgoProcResAgic*)mProcOutParam;
246 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
247 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
248 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
249
250 if (!shared->fullParams || !shared->fullParams->mGicParams.ptr()) {
251 LOGE_ALSC("[%d]: no gic buf !", shared->frameId);
252 return XCAM_RETURN_BYPASS;
253 }
254
255 agic_proc_res_int->gicRes = &shared->fullParams->mGicParams->data()->result;
256
257 ret = RkAiqHandle::processing();
258 if (ret) {
259 RKAIQCORE_CHECK_RET(ret, "agic handle processing failed");
260 }
261
262 agic_proc_int->hdr_mode = sharedCom->working_mode;
263 switch (sharedCom->snsDes.sensor_pixelformat) {
264 case V4L2_PIX_FMT_SBGGR14:
265 case V4L2_PIX_FMT_SGBRG14:
266 case V4L2_PIX_FMT_SGRBG14:
267 case V4L2_PIX_FMT_SRGGB14:
268 agic_proc_int->raw_bits = 14;
269 break;
270 case V4L2_PIX_FMT_SBGGR12:
271 case V4L2_PIX_FMT_SGBRG12:
272 case V4L2_PIX_FMT_SGRBG12:
273 case V4L2_PIX_FMT_SRGGB12:
274 agic_proc_int->raw_bits = 12;
275 break;
276 case V4L2_PIX_FMT_SBGGR10:
277 case V4L2_PIX_FMT_SGBRG10:
278 case V4L2_PIX_FMT_SGRBG10:
279 case V4L2_PIX_FMT_SRGGB10:
280 agic_proc_int->raw_bits = 10;
281 break;
282 default:
283 agic_proc_int->raw_bits = 8;
284 }
285
286 RKAiqAecExpInfo_t* aeCurExp = &shared->curExp;
287 if (aeCurExp != NULL) {
288 if((rk_aiq_working_mode_t)sharedCom->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
289 agic_proc_int->iso = aeCurExp->LinearExp.exp_real_params.analog_gain * aeCurExp->LinearExp.exp_real_params.isp_dgain * 50;
290 LOGD_AGIC("%s:NORMAL:iso=%d,again=%f\n", __FUNCTION__, agic_proc_int->iso,
291 aeCurExp->LinearExp.exp_real_params.analog_gain);
292 } else if ((rk_aiq_working_mode_t)sharedCom->working_mode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
293 agic_proc_int->iso = aeCurExp->HdrExp[1].exp_real_params.analog_gain * 50;
294 LOGD_AGIC("%s:HDR2:iso=%d,again=%f\n", __FUNCTION__, agic_proc_int->iso,
295 aeCurExp->HdrExp[1].exp_real_params.analog_gain);
296 } else if ((rk_aiq_working_mode_t)sharedCom->working_mode == RK_AIQ_WORKING_MODE_ISP_HDR3) {
297 agic_proc_int->iso = aeCurExp->HdrExp[2].exp_real_params.analog_gain * 50;
298 LOGD_AGIC("%s:HDR3:iso=%d,again=%f\n", __FUNCTION__, agic_proc_int->iso,
299 aeCurExp->HdrExp[2].exp_real_params.analog_gain);
300 }
301 } else {
302 agic_proc_int->iso = 50;
303 LOGE_AGIC("%s: pAEPreRes is NULL, so use default instead \n", __FUNCTION__);
304 }
305
306 #ifdef DISABLE_HANDLE_ATTRIB
307 mCfgMutex.lock();
308 #endif
309 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
310 ret = des->processing(mProcInParam, mProcOutParam);
311 #ifdef DISABLE_HANDLE_ATTRIB
312 mCfgMutex.unlock();
313 #endif
314 RKAIQCORE_CHECK_RET(ret, "agic algo processing failed");
315
316 EXIT_ANALYZER_FUNCTION();
317 return ret;
318 }
319
postProcess()320 XCamReturn RkAiqAgicHandleInt::postProcess() {
321 ENTER_ANALYZER_FUNCTION();
322
323 XCamReturn ret = XCAM_RETURN_NO_ERROR;
324 #if 0
325 RkAiqAlgoPostAgic* agic_post_int = (RkAiqAlgoPostAgic*)mPostInParam;
326 RkAiqAlgoPostResAgic* agic_post_res_int = (RkAiqAlgoPostResAgic*)mPostOutParam;
327 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
328 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
329 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
330
331 ret = RkAiqHandle::postProcess();
332 if (ret) {
333 RKAIQCORE_CHECK_RET(ret, "agic handle postProcess failed");
334 return ret;
335 }
336
337 RkAiqAlgoDescription* des = (RkAiqAlgoDescription*)mDes;
338 ret = des->post_process(mPostInParam, mPostOutParam);
339 RKAIQCORE_CHECK_RET(ret, "agic algo post_process failed");
340
341 EXIT_ANALYZER_FUNCTION();
342 #endif
343 return ret;
344 }
345
genIspResult(RkAiqFullParams * params,RkAiqFullParams * cur_params)346 XCamReturn RkAiqAgicHandleInt::genIspResult(RkAiqFullParams* params, RkAiqFullParams* cur_params) {
347 ENTER_ANALYZER_FUNCTION();
348
349 XCamReturn ret = XCAM_RETURN_NO_ERROR;
350 RkAiqCore::RkAiqAlgosGroupShared_t* shared =
351 (RkAiqCore::RkAiqAlgosGroupShared_t*)(getGroupShared());
352 RkAiqCore::RkAiqAlgosComShared_t* sharedCom = &mAiqCore->mAlogsComSharedParams;
353 RkAiqAlgoProcResAgic* agic_com = (RkAiqAlgoProcResAgic*)mProcOutParam;
354 rk_aiq_isp_gic_params_v20_t* gic_param = params->mGicParams->data().ptr();
355
356 if (!agic_com) {
357 LOGD_ANALYZER("no agic result");
358 return XCAM_RETURN_NO_ERROR;
359 }
360
361 if (!this->getAlgoId()) {
362 RkAiqAlgoProcResAgic* agic_rk = (RkAiqAlgoProcResAgic*)agic_com;
363 if (sharedCom->init) {
364 gic_param->frame_id = 0;
365 } else {
366 gic_param->frame_id = shared->frameId;
367 }
368
369 if (agic_com->res_com.cfg_update) {
370 mSyncFlag = shared->frameId;
371 gic_param->sync_flag = mSyncFlag;
372 // copy from algo result
373 // set as the latest result
374 cur_params->mGicParams = params->mGicParams;
375 gic_param->is_update = true;
376 LOGD_AGIC("[%d] params from algo", mSyncFlag);
377 } else if (mSyncFlag != gic_param->sync_flag) {
378 gic_param->sync_flag = mSyncFlag;
379 // copy from latest result
380 if (cur_params->mGicParams.ptr()) {
381 gic_param->result = cur_params->mGicParams->data()->result;
382 gic_param->is_update = true;
383 } else {
384 LOGE_AGIC("no latest params !");
385 gic_param->is_update = false;
386 }
387 LOGD_AGIC("[%d] params from latest [%d]", shared->frameId, mSyncFlag);
388 } else {
389 // do nothing, result in buf needn't update
390 gic_param->is_update = false;
391 LOGD_AGIC("[%d] params needn't update", shared->frameId);
392 }
393 #if 0//moved to processing out params
394 memcpy(&gic_param->result, &agic_rk->gicRes, sizeof(AgicProcResult_t));
395 #endif
396 }
397
398 EXIT_ANALYZER_FUNCTION();
399
400 return ret;
401 }
402
403 } // namespace RkCam
404