1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2019-2021 Rockchip Eletronics Co., Ltd.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun * You may obtain a copy of the License at
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun * limitations under the License.
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun #include "RkAiqManager.h"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <fcntl.h>
19*4882a593Smuzhiyun #include <unistd.h>
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
22*4882a593Smuzhiyun #include "RkAiqCamGroupManager.h"
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun #include "isp20/Isp20_module_dbg.h"
25*4882a593Smuzhiyun #include "isp20/CamHwIsp20.h"
26*4882a593Smuzhiyun #include "isp21/CamHwIsp21.h"
27*4882a593Smuzhiyun #include "isp3x/CamHwIsp3x.h"
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun using namespace XCam;
30*4882a593Smuzhiyun namespace RkCam {
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #define RKAIQMNG_CHECK_RET(ret, format, ...) \
33*4882a593Smuzhiyun if (ret) { \
34*4882a593Smuzhiyun LOGE(format, ##__VA_ARGS__); \
35*4882a593Smuzhiyun return ret; \
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define DISABLE_RESULT_APPLY_THREADS
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun bool
loop()41*4882a593Smuzhiyun RkAiqMngCmdThread::loop ()
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun const static int32_t timeout = -1;
46*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
47*4882a593Smuzhiyun SmartPtr<msg_t> msg = mAiqCmdQueue.pop (timeout);
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun if (!msg.ptr()) {
50*4882a593Smuzhiyun XCAM_LOG_WARNING("RkAiqMngCmdThread got empty result, stop thread");
51*4882a593Smuzhiyun return false;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun XCAM_ASSERT (mAiqMng);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun switch (msg->cmd) {
57*4882a593Smuzhiyun case MSG_CMD_SW_WORKING_MODE:
58*4882a593Smuzhiyun if (msg->sync)
59*4882a593Smuzhiyun msg->mutex->lock();
60*4882a593Smuzhiyun mAiqMng->swWorkingModeDyn(msg->data.sw_wk_mode.mode);
61*4882a593Smuzhiyun mAiqMng->mWkSwitching = false;
62*4882a593Smuzhiyun if (msg->sync) {
63*4882a593Smuzhiyun msg->cond->broadcast ();
64*4882a593Smuzhiyun msg->mutex->unlock();
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun break;
67*4882a593Smuzhiyun default:
68*4882a593Smuzhiyun break;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun // always true
71*4882a593Smuzhiyun return true;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun bool
loop()75*4882a593Smuzhiyun RkAiqRstApplyThread::loop ()
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun const static int32_t timeout = -1;
80*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
81*4882a593Smuzhiyun SmartPtr<RkAiqFullParamsProxy> results = mAiqRstQueue.pop (timeout);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun XCAM_ASSERT (mAiqMng);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun if (!results.ptr()) {
86*4882a593Smuzhiyun XCAM_LOG_WARNING("RkAiqRstApplyThread got empty result, stop thread");
87*4882a593Smuzhiyun return false;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #ifdef RUNTIME_MODULE_DEBUG
91*4882a593Smuzhiyun #ifndef RK_SIMULATOR_HW
92*4882a593Smuzhiyun if (g_apply_init_params_only)
93*4882a593Smuzhiyun goto out;
94*4882a593Smuzhiyun #endif
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun ret = mAiqMng->applyAnalyzerResult(results);
97*4882a593Smuzhiyun if (ret == XCAM_RETURN_NO_ERROR)
98*4882a593Smuzhiyun return true;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
101*4882a593Smuzhiyun out:
102*4882a593Smuzhiyun // always true
103*4882a593Smuzhiyun return true;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun
RkAiqManager(const char * sns_ent_name,rk_aiq_error_cb err_cb,rk_aiq_metas_cb metas_cb)106*4882a593Smuzhiyun RkAiqManager::RkAiqManager(const char* sns_ent_name,
107*4882a593Smuzhiyun rk_aiq_error_cb err_cb,
108*4882a593Smuzhiyun rk_aiq_metas_cb metas_cb)
109*4882a593Smuzhiyun : mCamHw(NULL)
110*4882a593Smuzhiyun , mRkAiqAnalyzer(NULL)
111*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
112*4882a593Smuzhiyun , mAiqRstAppTh(new RkAiqRstApplyThread(this))
113*4882a593Smuzhiyun #endif
114*4882a593Smuzhiyun , mAiqMngCmdTh(new RkAiqMngCmdThread(this))
115*4882a593Smuzhiyun #ifdef ISP_HW_V20
116*4882a593Smuzhiyun , mRkLumaAnalyzer(NULL)
117*4882a593Smuzhiyun #endif
118*4882a593Smuzhiyun , mErrCb(err_cb)
119*4882a593Smuzhiyun , mMetasCb(metas_cb)
120*4882a593Smuzhiyun , mHwEvtCb(NULL)
121*4882a593Smuzhiyun , mHwEvtCbCtx(NULL)
122*4882a593Smuzhiyun , mSnsEntName(sns_ent_name)
123*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_PARSER_V1
124*4882a593Smuzhiyun , mCalibDb(NULL)
125*4882a593Smuzhiyun #endif
126*4882a593Smuzhiyun , mCalibDbV2(NULL)
127*4882a593Smuzhiyun , tuningCalib(NULL)
128*4882a593Smuzhiyun , mWorkingMode(RK_AIQ_WORKING_MODE_NORMAL)
129*4882a593Smuzhiyun , mOldWkModeForGray(RK_AIQ_WORKING_MODE_NORMAL)
130*4882a593Smuzhiyun , mWkSwitching(false)
131*4882a593Smuzhiyun , _state(AIQ_STATE_INVALID)
132*4882a593Smuzhiyun , mCurMirror(false)
133*4882a593Smuzhiyun , mCurFlip(false)
134*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
135*4882a593Smuzhiyun , mCamGroupCoreManager(NULL)
136*4882a593Smuzhiyun #endif
137*4882a593Smuzhiyun , mIsMain(false)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
140*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
~RkAiqManager()143*4882a593Smuzhiyun RkAiqManager::~RkAiqManager()
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
146*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun void
setCamHw(SmartPtr<ICamHw> & camhw)150*4882a593Smuzhiyun RkAiqManager::setCamHw(SmartPtr<ICamHw>& camhw)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
153*4882a593Smuzhiyun XCAM_ASSERT (!mCamHw.ptr());
154*4882a593Smuzhiyun mCamHw = camhw;
155*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun void
setAnalyzer(SmartPtr<RkAiqCore> analyzer)159*4882a593Smuzhiyun RkAiqManager::setAnalyzer(SmartPtr<RkAiqCore> analyzer)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
162*4882a593Smuzhiyun XCAM_ASSERT (!mRkAiqAnalyzer.ptr());
163*4882a593Smuzhiyun mRkAiqAnalyzer = analyzer;
164*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun #ifdef ISP_HW_V20
168*4882a593Smuzhiyun void
setLumaAnalyzer(SmartPtr<RkLumaCore> analyzer)169*4882a593Smuzhiyun RkAiqManager::setLumaAnalyzer(SmartPtr<RkLumaCore> analyzer)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
172*4882a593Smuzhiyun XCAM_ASSERT (!mRkLumaAnalyzer.ptr());
173*4882a593Smuzhiyun mRkLumaAnalyzer = analyzer;
174*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun #endif
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_PARSER_V1
179*4882a593Smuzhiyun void
setAiqCalibDb(const CamCalibDbContext_t * calibDb)180*4882a593Smuzhiyun RkAiqManager::setAiqCalibDb(const CamCalibDbContext_t* calibDb)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
183*4882a593Smuzhiyun XCAM_ASSERT (!mCalibDb);
184*4882a593Smuzhiyun mCalibDb = calibDb;
185*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun #endif
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun void
setAiqCalibDb(const CamCalibDbV2Context_t * calibDb)190*4882a593Smuzhiyun RkAiqManager::setAiqCalibDb(const CamCalibDbV2Context_t* calibDb)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
193*4882a593Smuzhiyun XCAM_ASSERT (!mCalibDbV2);
194*4882a593Smuzhiyun mCalibDbV2 = new CamCalibDbV2Context_t();
195*4882a593Smuzhiyun *mCalibDbV2 = *calibDb;
196*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun XCamReturn
init()200*4882a593Smuzhiyun RkAiqManager::init()
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun XCAM_ASSERT (mSnsEntName);
207*4882a593Smuzhiyun XCAM_ASSERT (mRkAiqAnalyzer.ptr());
208*4882a593Smuzhiyun XCAM_ASSERT (mCamHw.ptr());
209*4882a593Smuzhiyun XCAM_ASSERT (mCalibDbV2);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun mRkAiqAnalyzer->setAnalyzeResultCb(this);
212*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_PARSER_V1
213*4882a593Smuzhiyun ret = mRkAiqAnalyzer->init(mSnsEntName, mCalibDb, mCalibDbV2);
214*4882a593Smuzhiyun #else
215*4882a593Smuzhiyun ret = mRkAiqAnalyzer->init(mSnsEntName, nullptr, mCalibDbV2);
216*4882a593Smuzhiyun #endif
217*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer init error %d !", ret);
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun #ifdef ISP_HW_V20
220*4882a593Smuzhiyun mRkLumaAnalyzer->setAnalyzeResultCb(this);
221*4882a593Smuzhiyun CalibDbV2_LUMA_DETECT_t *lumaDetect =
222*4882a593Smuzhiyun (CalibDbV2_LUMA_DETECT_t*)(CALIBDBV2_GET_MODULE_PTR((void*)mCalibDbV2, lumaDetect));
223*4882a593Smuzhiyun if (lumaDetect) {
224*4882a593Smuzhiyun ret = mRkLumaAnalyzer->init(lumaDetect);
225*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer init error %d !", ret);
226*4882a593Smuzhiyun } else {
227*4882a593Smuzhiyun mRkLumaAnalyzer.release();
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun #endif
230*4882a593Smuzhiyun mCamHw->setHwResListener(this);
231*4882a593Smuzhiyun ret = mCamHw->init(mSnsEntName);
232*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "camHw init error %d !", ret);
233*4882a593Smuzhiyun _state = AIQ_STATE_INITED;
234*4882a593Smuzhiyun isp_drv_share_mem_ops_t *mem_ops = NULL;
235*4882a593Smuzhiyun mCamHw->getShareMemOps(&mem_ops);
236*4882a593Smuzhiyun mRkAiqAnalyzer->setShareMemOps(mem_ops);
237*4882a593Smuzhiyun // set default mirror & flip
238*4882a593Smuzhiyun setDefMirrorFlip();
239*4882a593Smuzhiyun mAiqMngCmdTh->triger_start();
240*4882a593Smuzhiyun bool bret = mAiqMngCmdTh->start();
241*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
242*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "cmd thread start error");
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun mDleayCpslParams = NULL;
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun return ret;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun XCamReturn
prepare(uint32_t width,uint32_t height,rk_aiq_working_mode_t mode)252*4882a593Smuzhiyun RkAiqManager::prepare(uint32_t width, uint32_t height, rk_aiq_working_mode_t mode)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
257*4882a593Smuzhiyun rk_aiq_exposure_sensor_descriptor sensor_des;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun XCAM_ASSERT (mCalibDbV2);
260*4882a593Smuzhiyun #ifdef RUNTIME_MODULE_DEBUG
261*4882a593Smuzhiyun #ifndef RK_SIMULATOR_HW
262*4882a593Smuzhiyun get_dbg_force_disable_mods_env();
263*4882a593Smuzhiyun #endif
264*4882a593Smuzhiyun #endif
265*4882a593Smuzhiyun int working_mode_hw = RK_AIQ_WORKING_MODE_NORMAL;
266*4882a593Smuzhiyun if (mode == RK_AIQ_WORKING_MODE_NORMAL) {
267*4882a593Smuzhiyun working_mode_hw = mode;
268*4882a593Smuzhiyun } else {
269*4882a593Smuzhiyun if (mode == RK_AIQ_WORKING_MODE_ISP_HDR2)
270*4882a593Smuzhiyun working_mode_hw = RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR;
271*4882a593Smuzhiyun else if (mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
272*4882a593Smuzhiyun working_mode_hw = RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR;
273*4882a593Smuzhiyun else
274*4882a593Smuzhiyun LOGE_ANALYZER("Not supported HDR mode !");
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun mCamHw->setCalib(mCalibDbV2);
277*4882a593Smuzhiyun CalibDb_Sensor_ParaV2_t* sensor_calib =
278*4882a593Smuzhiyun (CalibDb_Sensor_ParaV2_t*)(CALIBDBV2_GET_MODULE_PTR(mCalibDbV2, sensor_calib));
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
281*4882a593Smuzhiyun mCamHw->setGroupMode(mCamGroupCoreManager ? true : false, mIsMain);
282*4882a593Smuzhiyun #endif
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun if(mode != RK_AIQ_WORKING_MODE_NORMAL)
285*4882a593Smuzhiyun ret = mCamHw->prepare(width, height, working_mode_hw,
286*4882a593Smuzhiyun sensor_calib->CISExpUpdate.Hdr.time_update,
287*4882a593Smuzhiyun sensor_calib->CISExpUpdate.Hdr.gain_update);
288*4882a593Smuzhiyun else
289*4882a593Smuzhiyun ret = mCamHw->prepare(width, height, working_mode_hw,
290*4882a593Smuzhiyun sensor_calib->CISExpUpdate.Linear.time_update,
291*4882a593Smuzhiyun sensor_calib->CISExpUpdate.Linear.gain_update);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "camhw prepare error %d", ret);
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun xcam_mem_clear(sensor_des);
296*4882a593Smuzhiyun ret = mCamHw->getSensorModeData(mSnsEntName, sensor_des);
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun sensor_output_width = sensor_des.sensor_output_width;
299*4882a593Smuzhiyun sensor_output_height = sensor_des.sensor_output_height;
300*4882a593Smuzhiyun int w, h, aligned_w, aligned_h;
301*4882a593Smuzhiyun ret = mCamHw->get_sp_resolution(w, h, aligned_w, aligned_h);
302*4882a593Smuzhiyun ret = mRkAiqAnalyzer->set_sp_resolution(w, h, aligned_w, aligned_h);
303*4882a593Smuzhiyun #ifdef ISP_HW_V20
304*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr())
305*4882a593Smuzhiyun ret = mRkLumaAnalyzer->prepare(working_mode_hw);
306*4882a593Smuzhiyun #endif
307*4882a593Smuzhiyun #if RKAIQ_HAVE_PDAF
308*4882a593Smuzhiyun ret = mRkAiqAnalyzer->set_pdaf_support(mCamHw->get_pdaf_support());
309*4882a593Smuzhiyun #endif
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "getSensorModeData error %d", ret);
312*4882a593Smuzhiyun mRkAiqAnalyzer->notifyIspStreamMode(mCamHw->getIspStreamMode());
313*4882a593Smuzhiyun ret = mRkAiqAnalyzer->prepare(&sensor_des, working_mode_hw);
314*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer prepare error %d", ret);
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun SmartPtr<RkAiqFullParamsProxy> initParams = mRkAiqAnalyzer->getAiqFullParams();
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun if (mTbInfo.is_pre_aiq) {
319*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
320*4882a593Smuzhiyun mAiqRstAppTh->triger_start();
321*4882a593Smuzhiyun #endif
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
324*4882a593Smuzhiyun if (!mCamGroupCoreManager) {
325*4882a593Smuzhiyun #endif
326*4882a593Smuzhiyun ret = applyAnalyzerResult(initParams, true);
327*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "set initial params error %d", ret);
328*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun #endif
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun mWorkingMode = mode;
333*4882a593Smuzhiyun mOldWkModeForGray = RK_AIQ_WORKING_MODE_NORMAL;
334*4882a593Smuzhiyun mWidth = width;
335*4882a593Smuzhiyun mHeight = height;
336*4882a593Smuzhiyun _state = AIQ_STATE_PREPARED;
337*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun return ret;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun XCamReturn
start()343*4882a593Smuzhiyun RkAiqManager::start()
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun // restart
350*4882a593Smuzhiyun if (_state == AIQ_STATE_STOPED) {
351*4882a593Smuzhiyun SmartPtr<RkAiqFullParamsProxy> initParams = mRkAiqAnalyzer->getAiqFullParams();
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun #if 0
354*4882a593Smuzhiyun if (initParams->data()->mIspMeasParams.ptr()) {
355*4882a593Smuzhiyun initParams->data()->mIspMeasParams->data()->frame_id = 0;
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun if (initParams->data()->mIsppMeasParams.ptr()) {
359*4882a593Smuzhiyun initParams->data()->mIsppMeasParams->data()->frame_id = 0;
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun #endif
362*4882a593Smuzhiyun applyAnalyzerResult(initParams, true);
363*4882a593Smuzhiyun } else if (_state == AIQ_STATE_STARTED) {
364*4882a593Smuzhiyun return ret;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun if (mTbInfo.is_pre_aiq) {
368*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
369*4882a593Smuzhiyun bool bret = mAiqRstAppTh->start();
370*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
371*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "apply result thread start error");
372*4882a593Smuzhiyun #endif
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun ret = mRkAiqAnalyzer->start();
376*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer start error %d", ret);
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun #ifdef ISP_HW_V20
379*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr()) {
380*4882a593Smuzhiyun ret = mRkLumaAnalyzer->start();
381*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer start error %d", ret);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun #endif
384*4882a593Smuzhiyun ret = mCamHw->start();
385*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "camhw start error %d", ret);
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun if (!mTbInfo.is_pre_aiq) {
388*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
389*4882a593Smuzhiyun mAiqRstAppTh->triger_start();
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun bool bret = mAiqRstAppTh->start();
392*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
393*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "apply result thread start error");
394*4882a593Smuzhiyun #endif
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun _state = AIQ_STATE_STARTED;
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun return ret;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun XCamReturn
stop(bool keep_ext_hw_st)405*4882a593Smuzhiyun RkAiqManager::stop(bool keep_ext_hw_st)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun if (_state == AIQ_STATE_STOPED) {
412*4882a593Smuzhiyun return ret;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
416*4882a593Smuzhiyun mAiqRstAppTh->triger_stop();
417*4882a593Smuzhiyun bool bret = mAiqRstAppTh->stop();
418*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
419*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "apply result thread stop error");
420*4882a593Smuzhiyun #endif
421*4882a593Smuzhiyun ret = mRkAiqAnalyzer->stop();
422*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer stop error %d", ret);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun #ifdef ISP_HW_V20
425*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr()) {
426*4882a593Smuzhiyun ret = mRkLumaAnalyzer->stop();
427*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer stop error %d", ret);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun #endif
430*4882a593Smuzhiyun mCamHw->keepHwStAtStop(keep_ext_hw_st);
431*4882a593Smuzhiyun ret = mCamHw->stop();
432*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "camhw stop error %d", ret);
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun mDleayCpslParams = NULL;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun _state = AIQ_STATE_STOPED;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun return ret;
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun XCamReturn
deInit()444*4882a593Smuzhiyun RkAiqManager::deInit()
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun // stop first in prepared status, some resources and process were
451*4882a593Smuzhiyun // done at prepare stage
452*4882a593Smuzhiyun if (_state == AIQ_STATE_PREPARED)
453*4882a593Smuzhiyun stop(false);
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun mAiqMngCmdTh->triger_stop();
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun bool bret = mAiqMngCmdTh->stop();
458*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
459*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "cmd thread stop error");
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun ret = mRkAiqAnalyzer->deInit();
462*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer deinit error %d", ret);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun #ifdef ISP_HW_V20
465*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr()) {
466*4882a593Smuzhiyun ret = mRkLumaAnalyzer->deInit();
467*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer deinit error %d", ret);
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun #endif
470*4882a593Smuzhiyun ret = mCamHw->deInit();
471*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "camhw deinit error %d", ret);
472*4882a593Smuzhiyun if (mCalibDbV2) {
473*4882a593Smuzhiyun delete mCalibDbV2;
474*4882a593Smuzhiyun mCalibDbV2 = NULL;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun if (tuningCalib) {
477*4882a593Smuzhiyun RkAiqCalibDbV2::FreeCalibByJ2S(tuningCalib);
478*4882a593Smuzhiyun mCalibDbV2 = NULL;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun _state = AIQ_STATE_INVALID;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun return ret;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun XCamReturn
updateCalibDb(const CamCalibDbV2Context_t * newCalibDb)489*4882a593Smuzhiyun RkAiqManager::updateCalibDb(const CamCalibDbV2Context_t* newCalibDb)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
492*4882a593Smuzhiyun auto update_list = std::make_shared<std::list<std::string>>();
493*4882a593Smuzhiyun update_list->push_back("colorAsGrey");
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun *mCalibDbV2 = *(CamCalibDbV2Context_t*)newCalibDb;
496*4882a593Smuzhiyun mCamHw->setCalib(newCalibDb);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun ret = mRkAiqAnalyzer->setCalib(mCalibDbV2);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun if (!mRkAiqAnalyzer->isRunningState()) {
501*4882a593Smuzhiyun mRkAiqAnalyzer->updateCalibDbBrutal(mCalibDbV2);
502*4882a593Smuzhiyun } else {
503*4882a593Smuzhiyun mRkAiqAnalyzer->calibTuning(mCalibDbV2, update_list);
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
507*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun XCamReturn
syncSofEvt(SmartPtr<VideoBuffer> & hwres)511*4882a593Smuzhiyun RkAiqManager::syncSofEvt(SmartPtr<VideoBuffer>& hwres)
512*4882a593Smuzhiyun {
513*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
514*4882a593Smuzhiyun
515*4882a593Smuzhiyun if (hwres->_buf_type == ISP_POLL_SOF) {
516*4882a593Smuzhiyun xcam_get_runtime_log_level();
517*4882a593Smuzhiyun SmartPtr<CamHwIsp20> mCamHwIsp20 = mCamHw.dynamic_cast_ptr<CamHwIsp20>();
518*4882a593Smuzhiyun mCamHwIsp20->notify_sof(hwres);
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun SmartPtr<SofEventBuffer> evtbuf = hwres.dynamic_cast_ptr<SofEventBuffer>();
521*4882a593Smuzhiyun SmartPtr<SofEventData> evtdata = evtbuf->get_data();
522*4882a593Smuzhiyun SmartPtr<ispHwEvt_t> hw_evt = mCamHwIsp20->make_ispHwEvt(evtdata->_frameid, V4L2_EVENT_FRAME_SYNC, evtdata->_timestamp);
523*4882a593Smuzhiyun mRkAiqAnalyzer->pushEvts(hw_evt);
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun // TODO: moved to aiq core ?
526*4882a593Smuzhiyun if (mMetasCb) {
527*4882a593Smuzhiyun rk_aiq_metas_t metas;
528*4882a593Smuzhiyun metas.frame_id = hwres->get_sequence();
529*4882a593Smuzhiyun #ifdef ANDROID_OS
530*4882a593Smuzhiyun mMetasCb(&metas);
531*4882a593Smuzhiyun #else
532*4882a593Smuzhiyun (*mMetasCb)(&metas);
533*4882a593Smuzhiyun #endif
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
538*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun XCamReturn
hwResCb(SmartPtr<VideoBuffer> & hwres)542*4882a593Smuzhiyun RkAiqManager::hwResCb(SmartPtr<VideoBuffer>& hwres)
543*4882a593Smuzhiyun {
544*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
545*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun if (hwres->_buf_type == ISP_POLL_3A_STATS) {
548*4882a593Smuzhiyun if (mTbInfo.is_pre_aiq) {
549*4882a593Smuzhiyun uint32_t seq = -1;
550*4882a593Smuzhiyun seq = hwres.dynamic_cast_ptr<VideoBuffer>()->get_sequence();
551*4882a593Smuzhiyun if (seq == 0 && mTBStatsCnt == 0) {
552*4882a593Smuzhiyun LOGE("<TB> tb hwResCb stats %d\n", seq);
553*4882a593Smuzhiyun struct timespec tp;
554*4882a593Smuzhiyun clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun SmartPtr<CamHwIsp20> mCamHwIsp20 =
557*4882a593Smuzhiyun mCamHw.dynamic_cast_ptr<CamHwIsp20>();
558*4882a593Smuzhiyun SmartPtr<ispHwEvt_t> hw_evt = mCamHwIsp20->make_ispHwEvt(
559*4882a593Smuzhiyun 0, V4L2_EVENT_FRAME_SYNC,
560*4882a593Smuzhiyun tp.tv_sec * 1000 * 1000 * 1000 + tp.tv_nsec);
561*4882a593Smuzhiyun LOGE("<TB> push sof %d\n", seq);
562*4882a593Smuzhiyun mRkAiqAnalyzer->pushEvts(hw_evt);
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun if (mTBStatsCnt == 0) ret = mRkAiqAnalyzer->pushStats(hwres);
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun mTBStatsCnt++;
568*4882a593Smuzhiyun } else {
569*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun #ifdef ISP_HW_V20
572*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_LUMA) {
573*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr())
574*4882a593Smuzhiyun ret = mRkLumaAnalyzer->pushStats(hwres);
575*4882a593Smuzhiyun #endif
576*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_PARAMS) {
577*4882a593Smuzhiyun rk_aiq_err_msg_t msg;
578*4882a593Smuzhiyun msg.err_code = XCAM_RETURN_BYPASS;
579*4882a593Smuzhiyun if (mTbInfo.is_pre_aiq && mErrCb)
580*4882a593Smuzhiyun (*mErrCb)(&msg);
581*4882a593Smuzhiyun } else if (hwres->_buf_type == ISPP_POLL_NR_STATS) {
582*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
583*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_SOF) {
584*4882a593Smuzhiyun SmartPtr<CamHwIsp20> mCamHwIsp20 = mCamHw.dynamic_cast_ptr<CamHwIsp20>();
585*4882a593Smuzhiyun mCamHwIsp20->notify_sof(hwres);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun SmartPtr<SofEventBuffer> evtbuf = hwres.dynamic_cast_ptr<SofEventBuffer>();
588*4882a593Smuzhiyun SmartPtr<SofEventData> evtdata = evtbuf->get_data();
589*4882a593Smuzhiyun SmartPtr<ispHwEvt_t> hw_evt = mCamHwIsp20->make_ispHwEvt(evtdata->_frameid, V4L2_EVENT_FRAME_SYNC, evtdata->_timestamp);
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun if (evtdata->_frameid % 100 == 0)
592*4882a593Smuzhiyun xcam_get_runtime_log_level();
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun if (mTbInfo.is_pre_aiq) {
595*4882a593Smuzhiyun LOGE("<TB> skip real sof %d\n", evtdata->_frameid);
596*4882a593Smuzhiyun return ret;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun mRkAiqAnalyzer->pushEvts(hw_evt);
599*4882a593Smuzhiyun // TODO: moved to aiq core ?
600*4882a593Smuzhiyun if (mMetasCb) {
601*4882a593Smuzhiyun rk_aiq_metas_t metas;
602*4882a593Smuzhiyun metas.frame_id = evtdata->_frameid;
603*4882a593Smuzhiyun #ifdef ANDROID_OS
604*4882a593Smuzhiyun mMetasCb(&metas);
605*4882a593Smuzhiyun #else
606*4882a593Smuzhiyun (*mMetasCb)(&metas);
607*4882a593Smuzhiyun #endif
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_TX) {
610*4882a593Smuzhiyun #if 0
611*4882a593Smuzhiyun XCamVideoBuffer* camVBuf = convert_to_XCamVideoBuffer(hwres);
612*4882a593Smuzhiyun LOGD_ANALYZER("raw: \n format: 0x%x\n color_bits: %d\n width: %d\n height: %d\n aligned_width: %d\naligned_height: %d\n"
613*4882a593Smuzhiyun "size: %d\n components: %d\n strides[0]: %d\n strides[1]: %d\n offset[0]: %d\n offset[1]: %d\n",
614*4882a593Smuzhiyun camVBuf->info.format, camVBuf->info.color_bits, camVBuf->info.width, camVBuf->info.height,
615*4882a593Smuzhiyun camVBuf->info.aligned_width, camVBuf->info.aligned_height, camVBuf->info.size, camVBuf->info.components,
616*4882a593Smuzhiyun camVBuf->info.strides[0], camVBuf->info.strides[1], camVBuf->info.offsets[0], camVBuf->info.offsets[1]);
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun camVBuf->unref(camVBuf);
619*4882a593Smuzhiyun #endif
620*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
621*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_SP) {
622*4882a593Smuzhiyun #if 0
623*4882a593Smuzhiyun XCamVideoBuffer* camVBuf = convert_to_XCamVideoBuffer(hwres);
624*4882a593Smuzhiyun LOGD_ANALYZER("spimg: frameid:%d \n format: 0x%x\n color_bits: %d\n width: %d\n height: %d\n aligned_width: %d\naligned_height: %d\n"
625*4882a593Smuzhiyun "size: %d\n components: %d\n strides[0]: %d\n strides[1]: %d\n offset[0]: %d\n offset[1]: %d\n", hwres->get_sequence(),
626*4882a593Smuzhiyun camVBuf->info.format, camVBuf->info.color_bits, camVBuf->info.width, camVBuf->info.height,
627*4882a593Smuzhiyun camVBuf->info.aligned_width, camVBuf->info.aligned_height, camVBuf->info.size, camVBuf->info.components,
628*4882a593Smuzhiyun camVBuf->info.strides[0], camVBuf->info.strides[1], camVBuf->info.offsets[0], camVBuf->info.offsets[1]);
629*4882a593Smuzhiyun camVBuf->unref(camVBuf);
630*4882a593Smuzhiyun #endif
631*4882a593Smuzhiyun LOGD_ANALYZER("ISP_IMG");
632*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
633*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_NR_IMG) {
634*4882a593Smuzhiyun #if 0
635*4882a593Smuzhiyun XCamVideoBuffer* camVBuf = convert_to_XCamVideoBuffer(hwres);
636*4882a593Smuzhiyun LOGD_ANALYZER("nrimg: \n format: 0x%x\n color_bits: %d\n width: %d\n height: %d\n aligned_width: %d\naligned_height: %d\n"
637*4882a593Smuzhiyun "size: %d\n components: %d\n strides[0]: %d\n strides[1]: %d\n offset[0]: %d\n offset[1]: %d\n",
638*4882a593Smuzhiyun camVBuf->info.format, camVBuf->info.color_bits, camVBuf->info.width, camVBuf->info.height,
639*4882a593Smuzhiyun camVBuf->info.aligned_width, camVBuf->info.aligned_height, camVBuf->info.size, camVBuf->info.components,
640*4882a593Smuzhiyun camVBuf->info.strides[0], camVBuf->info.strides[1], camVBuf->info.offsets[0], camVBuf->info.offsets[1]);
641*4882a593Smuzhiyun camVBuf->unref(camVBuf);
642*4882a593Smuzhiyun #endif
643*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
644*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_GAIN) {
645*4882a593Smuzhiyun LOGD_ANALYZER("ISP_GAIN");
646*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
647*4882a593Smuzhiyun } else if (hwres->_buf_type == ISPP_GAIN_WR) {
648*4882a593Smuzhiyun LOGD_ANALYZER("ISPP_GAIN_WR");
649*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
650*4882a593Smuzhiyun } else if (hwres->_buf_type == ISPP_GAIN_KG) {
651*4882a593Smuzhiyun LOGD_ANALYZER("ISPP_GAIN_KG");
652*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
653*4882a593Smuzhiyun #if RKAIQ_HAVE_PDAF
654*4882a593Smuzhiyun } else if (hwres->_buf_type == ISP_POLL_PDAF_STATS) {
655*4882a593Smuzhiyun LOGD_ANALYZER("ISP_POLL_PDAF_STATS");
656*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
657*4882a593Smuzhiyun #endif
658*4882a593Smuzhiyun } else if (hwres->_buf_type == VICAP_STREAM_ON_EVT) {
659*4882a593Smuzhiyun LOGD_ANALYZER("VICAP_STREAM_ON_EVT ... ");
660*4882a593Smuzhiyun if (mHwEvtCb) {
661*4882a593Smuzhiyun rk_aiq_hwevt_t hwevt;
662*4882a593Smuzhiyun memset(&hwevt, 0, sizeof(hwevt));
663*4882a593Smuzhiyun hwevt.cam_id = mCamHw->getCamPhyId();
664*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
665*4882a593Smuzhiyun if (mCamGroupCoreManager) {
666*4882a593Smuzhiyun mCamGroupCoreManager->setVicapReady(&hwevt);
667*4882a593Smuzhiyun if (mCamGroupCoreManager->isAllVicapReady())
668*4882a593Smuzhiyun hwevt.aiq_status = RK_AIQ_STATUS_VICAP_READY;
669*4882a593Smuzhiyun else
670*4882a593Smuzhiyun hwevt.aiq_status = 0;
671*4882a593Smuzhiyun } else
672*4882a593Smuzhiyun hwevt.aiq_status = RK_AIQ_STATUS_VICAP_READY;
673*4882a593Smuzhiyun #else
674*4882a593Smuzhiyun hwevt.aiq_status = RK_AIQ_STATUS_VICAP_READY;
675*4882a593Smuzhiyun #endif
676*4882a593Smuzhiyun hwevt.ctx = mHwEvtCbCtx;
677*4882a593Smuzhiyun (*mHwEvtCb)(&hwevt);
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun } else if (hwres->_buf_type == VICAP_RESET_EVT) {
680*4882a593Smuzhiyun LOGD_ANALYZER(" VICAP_RESET_EVT... ");
681*4882a593Smuzhiyun if (mHwEvtCb) {
682*4882a593Smuzhiyun rk_aiq_hwevt_t hwevt;
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun memset(&hwevt, 0, sizeof(hwevt));
685*4882a593Smuzhiyun hwevt.cam_id = mCamHw->getCamPhyId();
686*4882a593Smuzhiyun hwevt.aiq_status = RK_AIQ_STATUS_VICAP_RESET;
687*4882a593Smuzhiyun hwevt.ctx = mHwEvtCbCtx;
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun LOGE_ANALYZER("cam: %d, VICAP_RESET_EVT...", hwevt.cam_id);
690*4882a593Smuzhiyun (*mHwEvtCb)(&hwevt);
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun } else if (hwres->_buf_type == VICAP_WITH_RK1608_RESET_EVT) {
693*4882a593Smuzhiyun LOGD_ANALYZER(" VICAP_WITH_RK1608_RESET_EVT... ");
694*4882a593Smuzhiyun SmartPtr<CamHwIsp20> mCamHwIsp20 = mCamHw.dynamic_cast_ptr<CamHwIsp20>();
695*4882a593Smuzhiyun if (mHwEvtCb && mCamHwIsp20.ptr()) {
696*4882a593Smuzhiyun rk_aiq_hwevt_t hwevt;
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun memset(&hwevt, 0, sizeof(hwevt));
699*4882a593Smuzhiyun for(int id = 0; id < 8; id++)
700*4882a593Smuzhiyun hwevt.multi_cam.multi_cam_id[id] = -1;
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun int i = 0;
703*4882a593Smuzhiyun for(int camPhyId = 0; camPhyId < CAM_INDEX_FOR_1608; camPhyId++) {
704*4882a593Smuzhiyun if (CamHwIsp20::rk1608_share_inf.raw_proc_unit[camPhyId]) {
705*4882a593Smuzhiyun hwevt.multi_cam.multi_cam_id[i++] = camPhyId;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun }
708*4882a593Smuzhiyun hwevt.multi_cam.cam_count = i;
709*4882a593Smuzhiyun hwevt.cam_id = -1;
710*4882a593Smuzhiyun hwevt.aiq_status = RK_AIQ_STATUS_VICAP_WITH_MULTI_CAM_RESET;
711*4882a593Smuzhiyun hwevt.ctx = mHwEvtCbCtx;
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun for (i = 0; i < 8; i++) {
714*4882a593Smuzhiyun LOGV_ANALYZER("multi_cam_id[%d]: %d \n", i, hwevt.multi_cam.multi_cam_id[i]);
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun (*mHwEvtCb)(&hwevt);
718*4882a593Smuzhiyun }
719*4882a593Smuzhiyun } else if (hwres->_buf_type == VICAP_POLL_SCL) {
720*4882a593Smuzhiyun ret = mRkAiqAnalyzer->pushStats(hwres);
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun return ret;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun XCamReturn
applyAnalyzerResult(SmartPtr<RkAiqFullParamsProxy> & results,bool ignoreIsUpdate)729*4882a593Smuzhiyun RkAiqManager::applyAnalyzerResult(SmartPtr<RkAiqFullParamsProxy>& results, bool ignoreIsUpdate)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
732*4882a593Smuzhiyun //xcam_get_runtime_log_level();
733*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
734*4882a593Smuzhiyun RkAiqFullParams* aiqParams = NULL;
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun if (!results.ptr()) {
737*4882a593Smuzhiyun LOGW_ANALYZER("empty aiq params results!");
738*4882a593Smuzhiyun return ret;
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun aiqParams = results->data().ptr();
742*4882a593Smuzhiyun cam3aResultList results_list;
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun if (aiqParams->mExposureParams.ptr()) {
745*4882a593Smuzhiyun aiqParams->mExposureParams->setType(RESULT_TYPE_EXPOSURE_PARAM);
746*4882a593Smuzhiyun results_list.push_back(aiqParams->mExposureParams);
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun if (aiqParams->mIrisParams.ptr()) {
750*4882a593Smuzhiyun aiqParams->mIrisParams->setType(RESULT_TYPE_IRIS_PARAM);
751*4882a593Smuzhiyun results_list.push_back(aiqParams->mIrisParams);
752*4882a593Smuzhiyun }
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun if (aiqParams->mFocusParams.ptr() && (ignoreIsUpdate || aiqParams->mFocusParams->data()->is_update)) {
755*4882a593Smuzhiyun aiqParams->mFocusParams->setType(RESULT_TYPE_FOCUS_PARAM);
756*4882a593Smuzhiyun aiqParams->mFocusParams->data()->is_update = false;
757*4882a593Smuzhiyun results_list.push_back(aiqParams->mFocusParams);
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun #define APPLY_ANALYZER_RESULT(lc, BC) \
762*4882a593Smuzhiyun if (aiqParams->m##lc##Params.ptr() && (ignoreIsUpdate || aiqParams->m##lc##Params->data()->is_update)) { \
763*4882a593Smuzhiyun LOGD("new result type: %s", #BC);\
764*4882a593Smuzhiyun aiqParams->m##lc##Params->setType(RESULT_TYPE_##BC##_PARAM); \
765*4882a593Smuzhiyun aiqParams->m##lc##Params->setId(aiqParams->mFrmId); \
766*4882a593Smuzhiyun aiqParams->m##lc##Params->data()->is_update = false; \
767*4882a593Smuzhiyun results_list.push_back(aiqParams->m##lc##Params); \
768*4882a593Smuzhiyun } \
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun #if RKAIQ_HAVE_ASD_V10
771*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Cpsl, CPSL);
772*4882a593Smuzhiyun #endif
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun #if RKAIQ_HAVE_AE_V1
775*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Aec, AEC);
776*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Hist, HIST);
777*4882a593Smuzhiyun #endif
778*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V20
779*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Awb, AWB);
780*4882a593Smuzhiyun #endif
781*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AwbGain, AWBGAIN);
782*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V20 || RKAIQ_ONLY_AF_STATS_V20
783*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Af, AF);
784*4882a593Smuzhiyun #endif
785*4882a593Smuzhiyun #if RKAIQ_HAVE_DPCC_V1
786*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Dpcc, DPCC);
787*4882a593Smuzhiyun #endif
788*4882a593Smuzhiyun #if (RKAIQ_HAVE_MERGE_V10 | RKAIQ_HAVE_MERGE_V11 | RKAIQ_HAVE_MERGE_V12)
789*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Merge, MERGE);
790*4882a593Smuzhiyun #endif
791*4882a593Smuzhiyun #if RKAIQ_HAVE_TMO_V1
792*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Tmo, TMO);
793*4882a593Smuzhiyun #endif
794*4882a593Smuzhiyun #if RKAIQ_HAVE_CCM_V1
795*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Ccm, CCM);
796*4882a593Smuzhiyun #endif
797*4882a593Smuzhiyun #if RKAIQ_HAVE_BLC_V1
798*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Blc, BLC);
799*4882a593Smuzhiyun #endif
800*4882a593Smuzhiyun #if RKAIQ_HAVE_ANR_V1
801*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Rawnr, RAWNR);
802*4882a593Smuzhiyun #endif
803*4882a593Smuzhiyun #if (RKAIQ_HAVE_GIC_V1 || RKAIQ_HAVE_GIC_V2)
804*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Gic, GIC);
805*4882a593Smuzhiyun #endif
806*4882a593Smuzhiyun #if RKAIQ_HAVE_DEBAYER_V1
807*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Debayer, DEBAYER);
808*4882a593Smuzhiyun #endif
809*4882a593Smuzhiyun #if RKAIQ_HAVE_LDCH_V10
810*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Ldch, LDCH);
811*4882a593Smuzhiyun #endif
812*4882a593Smuzhiyun #if RKAIQ_HAVE_3DLUT_V1
813*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Lut3d, LUT3D);
814*4882a593Smuzhiyun #endif
815*4882a593Smuzhiyun #if (RKAIQ_HAVE_DEHAZE_V10 | RKAIQ_HAVE_DEHAZE_V11 | RKAIQ_HAVE_DEHAZE_V11_DUO | RKAIQ_HAVE_DEHAZE_V12)
816*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Dehaze, DEHAZE);
817*4882a593Smuzhiyun #endif
818*4882a593Smuzhiyun #if (RKAIQ_HAVE_GAMMA_V10 | RKAIQ_HAVE_GAMMA_V11)
819*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Agamma, AGAMMA);
820*4882a593Smuzhiyun #endif
821*4882a593Smuzhiyun #if RKAIQ_HAVE_DEGAMMA_V1
822*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Adegamma, ADEGAMMA);
823*4882a593Smuzhiyun #endif
824*4882a593Smuzhiyun #if RKAIQ_HAVE_WDR_V1
825*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Wdr, WDR);
826*4882a593Smuzhiyun #endif
827*4882a593Smuzhiyun #if RKAIQ_HAVE_CSM_V1
828*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Csm, CSM);
829*4882a593Smuzhiyun #endif
830*4882a593Smuzhiyun #if RKAIQ_HAVE_CGC_V1
831*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Cgc, CGC);
832*4882a593Smuzhiyun #endif
833*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Conv422, CONV422);
834*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Yuvconv, YUVCONV);
835*4882a593Smuzhiyun #if RKAIQ_HAVE_GAIN_V1
836*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Gain, GAIN);
837*4882a593Smuzhiyun #endif
838*4882a593Smuzhiyun #if RKAIQ_HAVE_ACP_V10
839*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Cp, CP);
840*4882a593Smuzhiyun #endif
841*4882a593Smuzhiyun #if RKAIQ_HAVE_AIE_V10
842*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Ie, IE);
843*4882a593Smuzhiyun #endif
844*4882a593Smuzhiyun #if RKAIQ_HAVE_AMD_V1
845*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Motion, MOTION);
846*4882a593Smuzhiyun #endif
847*4882a593Smuzhiyun #if RKAIQ_HAVE_ANR_V1
848*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Tnr, TNR);
849*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Ynr, YNR);
850*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Uvnr, UVNR);
851*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Sharpen, SHARPEN);
852*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Edgeflt, EDGEFLT);
853*4882a593Smuzhiyun #endif
854*4882a593Smuzhiyun #if RKAIQ_HAVE_FEC_V10
855*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Fec, FEC);
856*4882a593Smuzhiyun #endif
857*4882a593Smuzhiyun #if RKAIQ_HAVE_ORB_V1
858*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Orb, ORB);
859*4882a593Smuzhiyun #endif
860*4882a593Smuzhiyun #if RKAIQ_HAVE_TMO_V1
861*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Tmo, TMO);
862*4882a593Smuzhiyun #endif
863*4882a593Smuzhiyun // ispv21
864*4882a593Smuzhiyun #if (RKAIQ_HAVE_DRC_V10 || RKAIQ_HAVE_DRC_V11 || RKAIQ_HAVE_DRC_V12 || RKAIQ_HAVE_DRC_V12_LITE)
865*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Drc, DRC);
866*4882a593Smuzhiyun #endif
867*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V21
868*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AwbV21, AWB);
869*4882a593Smuzhiyun #endif
870*4882a593Smuzhiyun #if RKAIQ_HAVE_YNR_V2
871*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(YnrV21, YNR);
872*4882a593Smuzhiyun #endif
873*4882a593Smuzhiyun #if RKAIQ_HAVE_CNR_V1
874*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CnrV21, UVNR);
875*4882a593Smuzhiyun #endif
876*4882a593Smuzhiyun #if RKAIQ_HAVE_SHARP_V3
877*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(SharpenV21, SHARPEN);
878*4882a593Smuzhiyun #endif
879*4882a593Smuzhiyun #if RKAIQ_HAVE_BAYERNR_V2
880*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(BaynrV21, RAWNR);
881*4882a593Smuzhiyun #endif
882*4882a593Smuzhiyun // ispv3x
883*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V21
884*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AwbV3x, AWB);
885*4882a593Smuzhiyun #endif
886*4882a593Smuzhiyun #if RKAIQ_HAVE_BLC_V1
887*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(BlcV21, BLC);
888*4882a593Smuzhiyun #endif
889*4882a593Smuzhiyun #if (RKAIQ_HAVE_LSC_V1 | RKAIQ_HAVE_LSC_V2 | RKAIQ_HAVE_LSC_V3)
890*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Lsc, LSC);
891*4882a593Smuzhiyun #endif
892*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V30 || RKAIQ_ONLY_AF_STATS_V30
893*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AfV3x, AF);
894*4882a593Smuzhiyun #endif
895*4882a593Smuzhiyun #if RKAIQ_HAVE_BAYER2DNR_V2
896*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(BaynrV3x, RAWNR);
897*4882a593Smuzhiyun #endif
898*4882a593Smuzhiyun #if RKAIQ_HAVE_YNR_V3
899*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(YnrV3x, YNR);
900*4882a593Smuzhiyun #endif
901*4882a593Smuzhiyun #if RKAIQ_HAVE_CNR_V2
902*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CnrV3x, UVNR);
903*4882a593Smuzhiyun #endif
904*4882a593Smuzhiyun #if RKAIQ_HAVE_SHARP_V4
905*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(SharpenV3x, SHARPEN);
906*4882a593Smuzhiyun #endif
907*4882a593Smuzhiyun #if RKAIQ_HAVE_CAC_V03
908*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CacV3x, CAC);
909*4882a593Smuzhiyun #endif
910*4882a593Smuzhiyun #if RKAIQ_HAVE_GAIN_V2
911*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(GainV3x, GAIN);
912*4882a593Smuzhiyun #endif
913*4882a593Smuzhiyun #if RKAIQ_HAVE_BAYERTNR_V2
914*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(TnrV3x, TNR);
915*4882a593Smuzhiyun #endif
916*4882a593Smuzhiyun // ispv32
917*4882a593Smuzhiyun #if RKAIQ_HAVE_BLC_V32
918*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(BlcV32, BLC);
919*4882a593Smuzhiyun #endif
920*4882a593Smuzhiyun #if (RKAIQ_HAVE_BAYERTNR_V23 || RKAIQ_HAVE_BAYERTNR_V23_LITE)
921*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(TnrV32, TNR);
922*4882a593Smuzhiyun #endif
923*4882a593Smuzhiyun #if RKAIQ_HAVE_BAYER2DNR_V23
924*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(BaynrV32, RAWNR);
925*4882a593Smuzhiyun #endif
926*4882a593Smuzhiyun #if RKAIQ_HAVE_CAC_V11
927*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CacV32, CAC);
928*4882a593Smuzhiyun #endif
929*4882a593Smuzhiyun #if RKAIQ_HAVE_DEBAYER_V2 || RKAIQ_HAVE_DEBAYER_V2_LITE
930*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(DebayerV32, DEBAYER);
931*4882a593Smuzhiyun #endif
932*4882a593Smuzhiyun #if RKAIQ_HAVE_CCM_V2
933*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CcmV32, CCM);
934*4882a593Smuzhiyun #endif
935*4882a593Smuzhiyun // APPLY_ANALYZER_RESULT(DehazeV32, DEHAZE);
936*4882a593Smuzhiyun #if RKAIQ_HAVE_LDCH_V21
937*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(LdchV32, LDCH);
938*4882a593Smuzhiyun #endif
939*4882a593Smuzhiyun #if RKAIQ_HAVE_YNR_V22
940*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(YnrV32, YNR);
941*4882a593Smuzhiyun #endif
942*4882a593Smuzhiyun #if (RKAIQ_HAVE_CNR_V30 || RKAIQ_HAVE_CNR_V30_LITE)
943*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(CnrV32, UVNR);
944*4882a593Smuzhiyun #endif
945*4882a593Smuzhiyun #if (RKAIQ_HAVE_SHARP_V33 || RKAIQ_HAVE_SHARP_V33_LITE)
946*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(SharpV32, SHARPEN);
947*4882a593Smuzhiyun #endif
948*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V32
949*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AwbV32, AWB);
950*4882a593Smuzhiyun #endif
951*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V31 || RKAIQ_ONLY_AF_STATS_V31
952*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AfV32, AF);
953*4882a593Smuzhiyun #endif
954*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V32
955*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AwbGainV32, AWBGAIN);
956*4882a593Smuzhiyun #endif
957*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V32_LITE || RKAIQ_ONLY_AF_STATS_V32_LITE
958*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(AfV32Lite, AF);
959*4882a593Smuzhiyun #endif
960*4882a593Smuzhiyun #if RKAIQ_HAVE_AFD_V1 || RKAIQ_HAVE_AFD_V2
961*4882a593Smuzhiyun APPLY_ANALYZER_RESULT(Afd, AFD);
962*4882a593Smuzhiyun #endif
963*4882a593Smuzhiyun mCamHw->applyAnalyzerResult(results_list);
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
966*4882a593Smuzhiyun
967*4882a593Smuzhiyun return ret;
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun void
rkAiqCalcDone(SmartPtr<RkAiqFullParamsProxy> & results)971*4882a593Smuzhiyun RkAiqManager::rkAiqCalcDone(SmartPtr<RkAiqFullParamsProxy> &results)
972*4882a593Smuzhiyun {
973*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
976*4882a593Smuzhiyun XCAM_ASSERT (mAiqRstAppTh.ptr());
977*4882a593Smuzhiyun mAiqRstAppTh->push_results(results);
978*4882a593Smuzhiyun #else
979*4882a593Smuzhiyun applyAnalyzerResult(results);
980*4882a593Smuzhiyun #endif
981*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun void
rkAiqCalcFailed(const char * msg)985*4882a593Smuzhiyun RkAiqManager::rkAiqCalcFailed(const char* msg)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
988*4882a593Smuzhiyun // TODO
989*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
990*4882a593Smuzhiyun return ;
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun void
rkLumaCalcDone(rk_aiq_luma_params_t luma_params)994*4882a593Smuzhiyun RkAiqManager::rkLumaCalcDone(rk_aiq_luma_params_t luma_params)
995*4882a593Smuzhiyun {
996*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
997*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
998*4882a593Smuzhiyun ret = mCamHw->setHdrProcessCount(luma_params);
999*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1000*4882a593Smuzhiyun }
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun void
rkLumaCalcFailed(const char * msg)1003*4882a593Smuzhiyun RkAiqManager::rkLumaCalcFailed(const char* msg)
1004*4882a593Smuzhiyun {
1005*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1006*4882a593Smuzhiyun // TODO
1007*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1008*4882a593Smuzhiyun return ;
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun XCamReturn
setModuleCtl(rk_aiq_module_id_t mId,bool mod_en)1012*4882a593Smuzhiyun RkAiqManager::setModuleCtl(rk_aiq_module_id_t mId, bool mod_en)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1015*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1016*4882a593Smuzhiyun ret = mCamHw->setModuleCtl(mId, mod_en);
1017*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1018*4882a593Smuzhiyun return ret;
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun XCamReturn
getModuleCtl(rk_aiq_module_id_t mId,bool & mod_en)1022*4882a593Smuzhiyun RkAiqManager::getModuleCtl(rk_aiq_module_id_t mId, bool& mod_en)
1023*4882a593Smuzhiyun {
1024*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1025*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1026*4882a593Smuzhiyun ret = mCamHw->getModuleCtl(mId, mod_en);
1027*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1028*4882a593Smuzhiyun return ret;
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun XCamReturn
rawdataPrepare(rk_aiq_raw_prop_t prop)1032*4882a593Smuzhiyun RkAiqManager::rawdataPrepare(rk_aiq_raw_prop_t prop)
1033*4882a593Smuzhiyun {
1034*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1035*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1036*4882a593Smuzhiyun ret = mCamHw->rawdataPrepare(prop);
1037*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1038*4882a593Smuzhiyun return ret;
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun XCamReturn
enqueueRawBuffer(void * rawdata,bool sync)1042*4882a593Smuzhiyun RkAiqManager::enqueueRawBuffer(void *rawdata, bool sync)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1045*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1046*4882a593Smuzhiyun ret = mCamHw->enqueueRawBuffer(rawdata, sync);
1047*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1048*4882a593Smuzhiyun return ret;
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun XCamReturn
enqueueRawFile(const char * path)1052*4882a593Smuzhiyun RkAiqManager::enqueueRawFile(const char *path)
1053*4882a593Smuzhiyun {
1054*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1055*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1056*4882a593Smuzhiyun ret = mCamHw->enqueueRawFile(path);
1057*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1058*4882a593Smuzhiyun return ret;
1059*4882a593Smuzhiyun }
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun XCamReturn
registRawdataCb(void (* callback)(void *))1062*4882a593Smuzhiyun RkAiqManager::registRawdataCb(void (*callback)(void *))
1063*4882a593Smuzhiyun {
1064*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1065*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1066*4882a593Smuzhiyun ret = mCamHw->registRawdataCb(callback);
1067*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1068*4882a593Smuzhiyun return ret;
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun
setSharpFbcRotation(rk_aiq_rotation_t rot)1071*4882a593Smuzhiyun XCamReturn RkAiqManager::setSharpFbcRotation(rk_aiq_rotation_t rot)
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun #ifndef RK_SIMULATOR_HW
1074*4882a593Smuzhiyun SmartPtr<CamHwIsp20> camHwIsp20 = mCamHw.dynamic_cast_ptr<CamHwIsp20>();
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun if (camHwIsp20.ptr())
1077*4882a593Smuzhiyun return camHwIsp20->setSharpFbcRotation(rot);
1078*4882a593Smuzhiyun else
1079*4882a593Smuzhiyun return XCAM_RETURN_ERROR_FAILED;
1080*4882a593Smuzhiyun #else
1081*4882a593Smuzhiyun return XCAM_RETURN_ERROR_FAILED;
1082*4882a593Smuzhiyun #endif
1083*4882a593Smuzhiyun }
1084*4882a593Smuzhiyun
setMirrorFlip(bool mirror,bool flip,int skip_frm_cnt)1085*4882a593Smuzhiyun XCamReturn RkAiqManager::setMirrorFlip(bool mirror, bool flip, int skip_frm_cnt)
1086*4882a593Smuzhiyun {
1087*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1088*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1089*4882a593Smuzhiyun if (_state == AIQ_STATE_INVALID) {
1090*4882a593Smuzhiyun LOGE_ANALYZER("wrong aiq state !");
1091*4882a593Smuzhiyun return XCAM_RETURN_ERROR_FAILED;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun ret = mCamHw->setSensorFlip(mirror, flip, skip_frm_cnt);
1094*4882a593Smuzhiyun if (ret == XCAM_RETURN_NO_ERROR) {
1095*4882a593Smuzhiyun // notify aiq sensor flip is changed
1096*4882a593Smuzhiyun mRkAiqAnalyzer->setSensorFlip(mirror, flip);
1097*4882a593Smuzhiyun mCurMirror = mirror;
1098*4882a593Smuzhiyun mCurFlip = flip;
1099*4882a593Smuzhiyun } else {
1100*4882a593Smuzhiyun LOGW_ANALYZER("set mirror %d, flip %d error", mirror, flip);
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun return ret;
1103*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1104*4882a593Smuzhiyun }
1105*4882a593Smuzhiyun
getMirrorFlip(bool & mirror,bool & flip)1106*4882a593Smuzhiyun XCamReturn RkAiqManager::getMirrorFlip(bool& mirror, bool& flip)
1107*4882a593Smuzhiyun {
1108*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1109*4882a593Smuzhiyun if (_state == AIQ_STATE_INVALID) {
1110*4882a593Smuzhiyun LOGE_ANALYZER("wrong aiq state !");
1111*4882a593Smuzhiyun return XCAM_RETURN_ERROR_FAILED;
1112*4882a593Smuzhiyun }
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun mirror = mCurMirror;
1115*4882a593Smuzhiyun flip = mCurFlip;
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1118*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
1119*4882a593Smuzhiyun }
1120*4882a593Smuzhiyun
setDefMirrorFlip()1121*4882a593Smuzhiyun void RkAiqManager::setDefMirrorFlip()
1122*4882a593Smuzhiyun {
1123*4882a593Smuzhiyun /* set defalut mirror & flip from iq*/
1124*4882a593Smuzhiyun CalibDb_Sensor_ParaV2_t* sensor =
1125*4882a593Smuzhiyun (CalibDb_Sensor_ParaV2_t*)(CALIBDBV2_GET_MODULE_PTR(mCalibDbV2, sensor_calib));
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun if (mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_DOORLOCK ||
1128*4882a593Smuzhiyun mTbInfo.prd_type == RK_AIQ_PRD_TYPE_TB_BATIPC) {
1129*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun ret = mCamHw->getSensorFlip(mCurMirror, mCurFlip);
1132*4882a593Smuzhiyun if (ret == XCAM_RETURN_NO_ERROR) {
1133*4882a593Smuzhiyun sensor->CISFlip = 0x0;
1134*4882a593Smuzhiyun if (mCurMirror) {
1135*4882a593Smuzhiyun sensor->CISFlip |= 0x1;
1136*4882a593Smuzhiyun }
1137*4882a593Smuzhiyun if (mCurFlip) {
1138*4882a593Smuzhiyun sensor->CISFlip |= 0x2;
1139*4882a593Smuzhiyun }
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun LOGI_ANALYZER("get mirror %d, flip %d from sensor driver", mCurMirror, mCurFlip);
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun // notify aiq sensor flip is changed
1144*4882a593Smuzhiyun mRkAiqAnalyzer->setSensorFlip(mCurMirror, mCurFlip);
1145*4882a593Smuzhiyun if (updateCalibDb(mCalibDbV2) < 0) {
1146*4882a593Smuzhiyun LOGW_ANALYZER("Failed to updateCalibDb for update sensor mirror/flip");
1147*4882a593Smuzhiyun }
1148*4882a593Smuzhiyun } else {
1149*4882a593Smuzhiyun LOGW_ANALYZER("Failed to get mirror/flip from sensor driver");
1150*4882a593Smuzhiyun }
1151*4882a593Smuzhiyun } else {
1152*4882a593Smuzhiyun bool def_mirr = sensor->CISFlip & 0x1 ? true : false;
1153*4882a593Smuzhiyun bool def_flip = sensor->CISFlip & 0x2 ? true : false;
1154*4882a593Smuzhiyun setMirrorFlip(def_mirr, def_flip, 0);
1155*4882a593Smuzhiyun }
1156*4882a593Smuzhiyun }
1157*4882a593Smuzhiyun
swWorkingModeDyn_msg(rk_aiq_working_mode_t mode)1158*4882a593Smuzhiyun XCamReturn RkAiqManager::swWorkingModeDyn_msg(rk_aiq_working_mode_t mode) {
1159*4882a593Smuzhiyun SmartPtr<RkAiqMngCmdThread::msg_t> msg = new RkAiqMngCmdThread::msg_t();
1160*4882a593Smuzhiyun msg->cmd = RkAiqMngCmdThread::MSG_CMD_SW_WORKING_MODE;
1161*4882a593Smuzhiyun msg->sync = true;
1162*4882a593Smuzhiyun msg->data.sw_wk_mode.mode = mode;
1163*4882a593Smuzhiyun mAiqMngCmdTh->send_cmd(msg);
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun
swWorkingModeDyn(rk_aiq_working_mode_t mode)1168*4882a593Smuzhiyun XCamReturn RkAiqManager::swWorkingModeDyn(rk_aiq_working_mode_t mode)
1169*4882a593Smuzhiyun {
1170*4882a593Smuzhiyun ENTER_XCORE_FUNCTION();
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun SmartPtr<RkAiqFullParamsProxy> initParams;
1173*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1174*4882a593Smuzhiyun if (mode == mWorkingMode)
1175*4882a593Smuzhiyun return ret;
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun if (_state != AIQ_STATE_STARTED) {
1178*4882a593Smuzhiyun LOGW_ANALYZER("should be called at STARTED state");
1179*4882a593Smuzhiyun return ret;
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun // 1. stop analyzer, re-preapre with the new mode
1182*4882a593Smuzhiyun // 2. stop luma analyzer, re-preapre with the new mode
1183*4882a593Smuzhiyun LOGI_ANALYZER("stop analyzer ...");
1184*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
1185*4882a593Smuzhiyun mAiqRstAppTh->triger_stop();
1186*4882a593Smuzhiyun bool bret = mAiqRstAppTh->stop();
1187*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
1188*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "apply result thread stop error");
1189*4882a593Smuzhiyun #endif
1190*4882a593Smuzhiyun ret = mRkAiqAnalyzer->stop();
1191*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer stop error %d", ret);
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun #ifdef ISP_HW_V20
1194*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr()) {
1195*4882a593Smuzhiyun ret = mRkLumaAnalyzer->stop();
1196*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer stop error %d", ret);
1197*4882a593Smuzhiyun }
1198*4882a593Smuzhiyun #endif
1199*4882a593Smuzhiyun // 3. pause hwi
1200*4882a593Smuzhiyun LOGI_ANALYZER("pause hwi ...");
1201*4882a593Smuzhiyun ret = mCamHw->pause();
1202*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "pause hwi error %d", ret);
1203*4882a593Smuzhiyun
1204*4882a593Smuzhiyun int working_mode_hw = RK_AIQ_WORKING_MODE_NORMAL;
1205*4882a593Smuzhiyun if (mode == RK_AIQ_WORKING_MODE_ISP_HDR2)
1206*4882a593Smuzhiyun working_mode_hw = RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR;
1207*4882a593Smuzhiyun else if (mode == RK_AIQ_WORKING_MODE_ISP_HDR3)
1208*4882a593Smuzhiyun working_mode_hw = RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR;
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun // 4. set new mode to hwi
1211*4882a593Smuzhiyun ret = mCamHw->swWorkingModeDyn(working_mode_hw);
1212*4882a593Smuzhiyun if (ret) {
1213*4882a593Smuzhiyun LOGE_ANALYZER("hwi swWorkingModeDyn error ...");
1214*4882a593Smuzhiyun goto restart;
1215*4882a593Smuzhiyun }
1216*4882a593Smuzhiyun
1217*4882a593Smuzhiyun // 5. re-prepare analyzer
1218*4882a593Smuzhiyun LOGI_ANALYZER("reprepare analyzer ...");
1219*4882a593Smuzhiyun rk_aiq_exposure_sensor_descriptor sensor_des;
1220*4882a593Smuzhiyun ret = mCamHw->getSensorModeData(mSnsEntName, sensor_des);
1221*4882a593Smuzhiyun mRkAiqAnalyzer->notifyIspStreamMode(mCamHw->getIspStreamMode());
1222*4882a593Smuzhiyun ret = mRkAiqAnalyzer->prepare(&sensor_des, working_mode_hw);
1223*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer prepare error %d", ret);
1224*4882a593Smuzhiyun
1225*4882a593Smuzhiyun initParams = mRkAiqAnalyzer->getAiqFullParams();
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun ret = applyAnalyzerResult(initParams);
1228*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "set initial params error %d", ret);
1229*4882a593Smuzhiyun
1230*4882a593Smuzhiyun restart:
1231*4882a593Smuzhiyun // 6. resume hwi
1232*4882a593Smuzhiyun LOGI_ANALYZER("resume hwi");
1233*4882a593Smuzhiyun ret = mCamHw->resume();
1234*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "pause hwi error %d", ret);
1235*4882a593Smuzhiyun
1236*4882a593Smuzhiyun // 7. restart analyzer
1237*4882a593Smuzhiyun #ifndef DISABLE_RESULT_APPLY_THREADS
1238*4882a593Smuzhiyun LOGI_ANALYZER("restart analyzer");
1239*4882a593Smuzhiyun mAiqRstAppTh->triger_start();
1240*4882a593Smuzhiyun bret = mAiqRstAppTh->start();
1241*4882a593Smuzhiyun ret = bret ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FAILED;
1242*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "apply result thread start error");
1243*4882a593Smuzhiyun #endif
1244*4882a593Smuzhiyun ret = mRkAiqAnalyzer->start();
1245*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "analyzer start error %d", ret);
1246*4882a593Smuzhiyun
1247*4882a593Smuzhiyun #ifdef ISP_HW_V20
1248*4882a593Smuzhiyun if (mRkLumaAnalyzer.ptr()) {
1249*4882a593Smuzhiyun ret = mRkLumaAnalyzer->start();
1250*4882a593Smuzhiyun RKAIQMNG_CHECK_RET(ret, "luma analyzer start error %d", ret);
1251*4882a593Smuzhiyun }
1252*4882a593Smuzhiyun #endif
1253*4882a593Smuzhiyun /* // 7. resume hwi */
1254*4882a593Smuzhiyun /* LOGI_ANALYZER("resume hwi"); */
1255*4882a593Smuzhiyun /* ret = mCamHw->resume(); */
1256*4882a593Smuzhiyun /* RKAIQMNG_CHECK_RET(ret, "pause hwi error %d", ret); */
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyun mWorkingMode = mode;
1259*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1260*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
1261*4882a593Smuzhiyun }
1262*4882a593Smuzhiyun
setMulCamConc(bool cc)1263*4882a593Smuzhiyun void RkAiqManager::setMulCamConc(bool cc)
1264*4882a593Smuzhiyun {
1265*4882a593Smuzhiyun #ifndef RK_SIMULATOR_HW
1266*4882a593Smuzhiyun SmartPtr<CamHwIsp20> camHwIsp20 = mCamHw.dynamic_cast_ptr<CamHwIsp20>();
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun if (camHwIsp20.ptr())
1269*4882a593Smuzhiyun camHwIsp20->setMulCamConc(cc);
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun mRkAiqAnalyzer->setMulCamConc(cc);
1272*4882a593Smuzhiyun #endif
1273*4882a593Smuzhiyun }
1274*4882a593Smuzhiyun
getCurrentCalibDBV2()1275*4882a593Smuzhiyun CamCalibDbV2Context_t* RkAiqManager::getCurrentCalibDBV2()
1276*4882a593Smuzhiyun {
1277*4882a593Smuzhiyun return mCalibDbV2;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun
calibTuning(CamCalibDbV2Context_t * aiqCalib,ModuleNameList & change_list)1280*4882a593Smuzhiyun XCamReturn RkAiqManager::calibTuning(CamCalibDbV2Context_t* aiqCalib,
1281*4882a593Smuzhiyun ModuleNameList& change_list)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
1284*4882a593Smuzhiyun
1285*4882a593Smuzhiyun mCamHw->setCalib(aiqCalib);
1286*4882a593Smuzhiyun ret = mRkAiqAnalyzer->setCalib(aiqCalib);
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun if (change_list != nullptr)
1289*4882a593Smuzhiyun std::for_each(
1290*4882a593Smuzhiyun std::begin(*change_list), std::end(*change_list),
1291*4882a593Smuzhiyun [](const std::string & name) {
1292*4882a593Smuzhiyun std::cout << "tuning : " << name << std::endl;
1293*4882a593Smuzhiyun });
1294*4882a593Smuzhiyun mRkAiqAnalyzer->calibTuning(aiqCalib, change_list);
1295*4882a593Smuzhiyun
1296*4882a593Smuzhiyun // Won't free calib witch from iqfiles
1297*4882a593Smuzhiyun RkAiqCalibDbV2::FreeCalibByJ2S(tuningCalib);
1298*4882a593Smuzhiyun *mCalibDbV2 = *aiqCalib;
1299*4882a593Smuzhiyun tuningCalib = const_cast<CamCalibDbV2Context_t*>(aiqCalib);
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun change_list.reset();
1302*4882a593Smuzhiyun
1303*4882a593Smuzhiyun EXIT_XCORE_FUNCTION();
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun return ret;
1306*4882a593Smuzhiyun }
1307*4882a593Smuzhiyun
unsetTuningCalibDb()1308*4882a593Smuzhiyun void RkAiqManager::unsetTuningCalibDb()
1309*4882a593Smuzhiyun {
1310*4882a593Smuzhiyun tuningCalib = NULL;
1311*4882a593Smuzhiyun }
1312*4882a593Smuzhiyun
1313*4882a593Smuzhiyun } //namespace RkCam
1314*4882a593Smuzhiyun
1315