xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/RkAiqManager.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  Copyright (c) 2019 Rockchip Corporation
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  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifndef _RK_AIQ_MANAGER_H_
19*4882a593Smuzhiyun #define _RK_AIQ_MANAGER_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "ICamHw.h"
22*4882a593Smuzhiyun #include "RkAiqCore.h"
23*4882a593Smuzhiyun #include "RkAiqCalibDb.h"
24*4882a593Smuzhiyun #include "RkAiqCalibDbV2.h"
25*4882a593Smuzhiyun #include "RkLumaCore.h"
26*4882a593Smuzhiyun #include "rk_aiq.h"
27*4882a593Smuzhiyun #include <memory>
28*4882a593Smuzhiyun #include <list>
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun namespace RkCam {
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun class RkAiqManager;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun class RkAiqMngCmdThread
35*4882a593Smuzhiyun     : public Thread {
36*4882a593Smuzhiyun public:
RkAiqMngCmdThread(RkAiqManager * aiqMng)37*4882a593Smuzhiyun     RkAiqMngCmdThread(RkAiqManager* aiqMng)
38*4882a593Smuzhiyun         : Thread("RkAiqMngCmdThread")
39*4882a593Smuzhiyun         , mAiqMng(aiqMng) {};
~RkAiqMngCmdThread()40*4882a593Smuzhiyun     ~RkAiqMngCmdThread() {};
41*4882a593Smuzhiyun 
triger_stop()42*4882a593Smuzhiyun     void triger_stop() {
43*4882a593Smuzhiyun         mAiqCmdQueue.pause_pop ();
44*4882a593Smuzhiyun     };
45*4882a593Smuzhiyun 
triger_start()46*4882a593Smuzhiyun     void triger_start() {
47*4882a593Smuzhiyun         mAiqCmdQueue.resume_pop ();
48*4882a593Smuzhiyun     };
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun     enum MSG_CMD {
51*4882a593Smuzhiyun         MSG_CMD_SW_WORKING_MODE
52*4882a593Smuzhiyun     };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     typedef struct message_s {
55*4882a593Smuzhiyun         int cmd;
56*4882a593Smuzhiyun         union {
57*4882a593Smuzhiyun             struct {
58*4882a593Smuzhiyun                 rk_aiq_working_mode_t mode;
59*4882a593Smuzhiyun             } sw_wk_mode;
60*4882a593Smuzhiyun         } data;
61*4882a593Smuzhiyun         bool sync;
62*4882a593Smuzhiyun         SmartPtr<Mutex>             mutex;
63*4882a593Smuzhiyun         SmartPtr<XCam::Cond>        cond;
64*4882a593Smuzhiyun     } msg_t;
65*4882a593Smuzhiyun 
send_cmd(SmartPtr<msg_t> msg)66*4882a593Smuzhiyun     bool send_cmd(SmartPtr<msg_t> msg) {
67*4882a593Smuzhiyun         bool ret = true;
68*4882a593Smuzhiyun         if (msg->sync) {
69*4882a593Smuzhiyun             msg->mutex = new Mutex();
70*4882a593Smuzhiyun             msg->cond = new XCam::Cond();
71*4882a593Smuzhiyun             SmartLock lock (*msg->mutex.ptr());
72*4882a593Smuzhiyun             ret = mAiqCmdQueue.push(msg);
73*4882a593Smuzhiyun             msg->cond->wait(*msg->mutex.ptr());
74*4882a593Smuzhiyun         } else {
75*4882a593Smuzhiyun             ret = mAiqCmdQueue.push(msg);
76*4882a593Smuzhiyun         }
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun         return ret;
79*4882a593Smuzhiyun     };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun protected:
stopped()82*4882a593Smuzhiyun     virtual void stopped () {
83*4882a593Smuzhiyun         mAiqCmdQueue.clear ();
84*4882a593Smuzhiyun     };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun     virtual bool loop ();
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun private:
89*4882a593Smuzhiyun     RkAiqManager* mAiqMng;
90*4882a593Smuzhiyun     SafeList<msg_t>  mAiqCmdQueue;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun class RkAiqRstApplyThread
94*4882a593Smuzhiyun     : public Thread {
95*4882a593Smuzhiyun public:
RkAiqRstApplyThread(RkAiqManager * aiqMng)96*4882a593Smuzhiyun     RkAiqRstApplyThread(RkAiqManager* aiqMng)
97*4882a593Smuzhiyun         : Thread("RkAiqRstApplyThread")
98*4882a593Smuzhiyun         , mAiqMng(aiqMng) {};
~RkAiqRstApplyThread()99*4882a593Smuzhiyun     ~RkAiqRstApplyThread() {};
100*4882a593Smuzhiyun 
triger_stop()101*4882a593Smuzhiyun     void triger_stop() {
102*4882a593Smuzhiyun         mAiqRstQueue.pause_pop ();
103*4882a593Smuzhiyun     };
104*4882a593Smuzhiyun 
triger_start()105*4882a593Smuzhiyun     void triger_start() {
106*4882a593Smuzhiyun         mAiqRstQueue.clear ();
107*4882a593Smuzhiyun         mAiqRstQueue.resume_pop ();
108*4882a593Smuzhiyun     };
109*4882a593Smuzhiyun 
push_results(SmartPtr<RkAiqFullParamsProxy> aiqRst)110*4882a593Smuzhiyun     bool push_results (SmartPtr<RkAiqFullParamsProxy> aiqRst) {
111*4882a593Smuzhiyun         return mAiqRstQueue.push(aiqRst);
112*4882a593Smuzhiyun     };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun protected:
stopped()115*4882a593Smuzhiyun     virtual void stopped () {
116*4882a593Smuzhiyun         mAiqRstQueue.clear ();
117*4882a593Smuzhiyun     };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     virtual bool loop ();
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun private:
122*4882a593Smuzhiyun     RkAiqManager* mAiqMng;
123*4882a593Smuzhiyun     SafeList<RkAiqFullParamsProxy>  mAiqRstQueue;
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun class RkAiqManager
127*4882a593Smuzhiyun     :/* public IspStatsListener
128*4882a593Smuzhiyun     , public IsppStatsListener
129*4882a593Smuzhiyun     , public IspLumaListener
130*4882a593Smuzhiyun     , public IspEvtsListener
131*4882a593Smuzhiyun     ,*/ public HwResListener
132*4882a593Smuzhiyun     , public RkAiqAnalyzerCb
133*4882a593Smuzhiyun     , public RkLumaAnalyzerCb {
134*4882a593Smuzhiyun     friend RkAiqRstApplyThread;
135*4882a593Smuzhiyun     friend RkAiqMngCmdThread;
136*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
137*4882a593Smuzhiyun     friend class RkAiqCamGroupManager;
138*4882a593Smuzhiyun #endif
139*4882a593Smuzhiyun public:
140*4882a593Smuzhiyun     explicit RkAiqManager(const char* sns_ent_name,
141*4882a593Smuzhiyun                           rk_aiq_error_cb err_cb,
142*4882a593Smuzhiyun                           rk_aiq_metas_cb metas_cb);
143*4882a593Smuzhiyun     virtual ~RkAiqManager();
setHwEvtCb(rk_aiq_hwevt_cb hwevt_cb,void * evt_cb_ctx)144*4882a593Smuzhiyun     void setHwEvtCb(rk_aiq_hwevt_cb hwevt_cb, void* evt_cb_ctx) {
145*4882a593Smuzhiyun         mHwEvtCbCtx = evt_cb_ctx;
146*4882a593Smuzhiyun         mHwEvtCb = hwevt_cb;
147*4882a593Smuzhiyun     };
setTbInfo(rk_aiq_tb_info_t & info)148*4882a593Smuzhiyun     void setTbInfo(rk_aiq_tb_info_t& info) {
149*4882a593Smuzhiyun         mTbInfo = info;
150*4882a593Smuzhiyun     }
151*4882a593Smuzhiyun     void setCamHw(SmartPtr<ICamHw>& camhw);
setCamPhyId(int phyId)152*4882a593Smuzhiyun     void setCamPhyId(int phyId) {mCamPhyId = phyId;}
getCamPhyId()153*4882a593Smuzhiyun     int getCamPhyId() { return mCamPhyId;}
154*4882a593Smuzhiyun     void setAnalyzer(SmartPtr<RkAiqCore> analyzer);
155*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_PARSER_V1
156*4882a593Smuzhiyun     void setAiqCalibDb(const CamCalibDbContext_t* calibDb);
157*4882a593Smuzhiyun #endif
158*4882a593Smuzhiyun     void setAiqCalibDb(const CamCalibDbV2Context_t* calibDb);
159*4882a593Smuzhiyun     void unsetTuningCalibDb();
160*4882a593Smuzhiyun #if defined(ISP_HW_V20)
161*4882a593Smuzhiyun     void setLumaAnalyzer(SmartPtr<RkLumaCore> analyzer);
162*4882a593Smuzhiyun #endif
163*4882a593Smuzhiyun     XCamReturn init();
164*4882a593Smuzhiyun     XCamReturn prepare(uint32_t width, uint32_t height, rk_aiq_working_mode_t mode);
165*4882a593Smuzhiyun     XCamReturn start();
166*4882a593Smuzhiyun     XCamReturn stop(bool keep_ext_hw_st = false);
167*4882a593Smuzhiyun     XCamReturn deInit();
168*4882a593Smuzhiyun     XCamReturn updateCalibDb(const CamCalibDbV2Context_t* newCalibDb);
169*4882a593Smuzhiyun     #if 0
170*4882a593Smuzhiyun     // from IsppStatsListener
171*4882a593Smuzhiyun     XCamReturn isppStatsCb(SmartPtr<VideoBuffer>& isppStats);
172*4882a593Smuzhiyun     // from IspLumaListener
173*4882a593Smuzhiyun     XCamReturn ispLumaCb(SmartPtr<VideoBuffer>& ispLuma);
174*4882a593Smuzhiyun     // from IspStatsListener
175*4882a593Smuzhiyun     XCamReturn ispStatsCb(SmartPtr<VideoBuffer>& ispStats);
176*4882a593Smuzhiyun     // from IspEvtsListener
177*4882a593Smuzhiyun     XCamReturn ispEvtsCb(ispHwEvt_t* evt);
178*4882a593Smuzhiyun     #endif
179*4882a593Smuzhiyun     XCamReturn hwResCb(SmartPtr<VideoBuffer>& hwres);
180*4882a593Smuzhiyun     XCamReturn syncSofEvt(SmartPtr<VideoBuffer>& hwres);
181*4882a593Smuzhiyun     // from RkAiqAnalyzerCb
182*4882a593Smuzhiyun     void rkAiqCalcDone(SmartPtr<RkAiqFullParamsProxy>& results);
183*4882a593Smuzhiyun     void rkAiqCalcFailed(const char* msg);
184*4882a593Smuzhiyun     // from RkLumaAnalyzerCb
185*4882a593Smuzhiyun     void rkLumaCalcDone(rk_aiq_luma_params_t luma_params);
186*4882a593Smuzhiyun     void rkLumaCalcFailed(const char* msg);
187*4882a593Smuzhiyun     XCamReturn setModuleCtl(rk_aiq_module_id_t mId, bool mod_en);
188*4882a593Smuzhiyun     XCamReturn getModuleCtl(rk_aiq_module_id_t mId, bool& mod_en);
189*4882a593Smuzhiyun     XCamReturn enqueueRawBuffer(void *rawdata, bool sync);
190*4882a593Smuzhiyun     XCamReturn enqueueRawFile(const char *path);
191*4882a593Smuzhiyun     XCamReturn registRawdataCb(void (*callback)(void *));
192*4882a593Smuzhiyun     XCamReturn rawdataPrepare(rk_aiq_raw_prop_t prop);
193*4882a593Smuzhiyun     XCamReturn setSharpFbcRotation(rk_aiq_rotation_t rot);
194*4882a593Smuzhiyun     XCamReturn setMirrorFlip(bool mirror, bool flip, int skip_frm_cnt);
195*4882a593Smuzhiyun     XCamReturn getMirrorFlip(bool& mirror, bool& flip);
196*4882a593Smuzhiyun     void setDefMirrorFlip();
197*4882a593Smuzhiyun     XCamReturn swWorkingModeDyn_msg(rk_aiq_working_mode_t mode);
198*4882a593Smuzhiyun     void setMulCamConc(bool cc);
199*4882a593Smuzhiyun     CamCalibDbV2Context_t* getCurrentCalibDBV2(void);
200*4882a593Smuzhiyun     XCamReturn calibTuning(CamCalibDbV2Context_t* aiqCalib,
201*4882a593Smuzhiyun                            ModuleNameList& change_list);
202*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
setCamGroupManager(RkAiqCamGroupManager * cam_group_manager,bool isMain)203*4882a593Smuzhiyun     void setCamGroupManager(RkAiqCamGroupManager* cam_group_manager, bool isMain) {
204*4882a593Smuzhiyun         mCamGroupCoreManager = cam_group_manager;
205*4882a593Smuzhiyun         mIsMain = isMain;
206*4882a593Smuzhiyun     }
207*4882a593Smuzhiyun #endif
getWorkingMode()208*4882a593Smuzhiyun     rk_aiq_working_mode_t getWorkingMode() {
209*4882a593Smuzhiyun         return mWorkingMode;
210*4882a593Smuzhiyun     }
211*4882a593Smuzhiyun     uint32_t sensor_output_width;
212*4882a593Smuzhiyun     uint32_t sensor_output_height;
213*4882a593Smuzhiyun protected:
214*4882a593Smuzhiyun     XCamReturn applyAnalyzerResult(SmartPtr<RkAiqFullParamsProxy>& results, bool ignoreIsUpdate = false);
215*4882a593Smuzhiyun     XCamReturn swWorkingModeDyn(rk_aiq_working_mode_t mode);
216*4882a593Smuzhiyun private:
217*4882a593Smuzhiyun     enum aiq_state_e {
218*4882a593Smuzhiyun         AIQ_STATE_INVALID,
219*4882a593Smuzhiyun         AIQ_STATE_INITED,
220*4882a593Smuzhiyun         AIQ_STATE_PREPARED,
221*4882a593Smuzhiyun         AIQ_STATE_STARTED,
222*4882a593Smuzhiyun         AIQ_STATE_STOPED,
223*4882a593Smuzhiyun     };
224*4882a593Smuzhiyun     XCAM_DEAD_COPY (RkAiqManager);
225*4882a593Smuzhiyun private:
226*4882a593Smuzhiyun     SmartPtr<ICamHw> mCamHw;
227*4882a593Smuzhiyun     SmartPtr<RkAiqCore> mRkAiqAnalyzer;
228*4882a593Smuzhiyun     SmartPtr<RkAiqRstApplyThread> mAiqRstAppTh;
229*4882a593Smuzhiyun     SmartPtr<RkAiqMngCmdThread> mAiqMngCmdTh;
230*4882a593Smuzhiyun #if defined(ISP_HW_V20)
231*4882a593Smuzhiyun     SmartPtr<RkLumaCore> mRkLumaAnalyzer;
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun     rk_aiq_error_cb mErrCb;
234*4882a593Smuzhiyun     rk_aiq_metas_cb mMetasCb;
235*4882a593Smuzhiyun     rk_aiq_hwevt_cb mHwEvtCb;
236*4882a593Smuzhiyun     void* mHwEvtCbCtx;
237*4882a593Smuzhiyun     const char* mSnsEntName;
238*4882a593Smuzhiyun     rk_aiq_tb_info_t mTbInfo;
239*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_PARSER_V1
240*4882a593Smuzhiyun     const CamCalibDbContext_t* mCalibDb;
241*4882a593Smuzhiyun #endif
242*4882a593Smuzhiyun     CamCalibDbV2Context_t* mCalibDbV2;
243*4882a593Smuzhiyun     CamCalibDbV2Context_t* tuningCalib;
244*4882a593Smuzhiyun     rk_aiq_working_mode_t mWorkingMode;
245*4882a593Smuzhiyun     rk_aiq_working_mode_t mOldWkModeForGray;
246*4882a593Smuzhiyun     bool mWkSwitching;
247*4882a593Smuzhiyun     uint32_t mWidth;
248*4882a593Smuzhiyun     uint32_t mHeight;
249*4882a593Smuzhiyun     int _state;
250*4882a593Smuzhiyun     bool mCurMirror;
251*4882a593Smuzhiyun     bool mCurFlip;
252*4882a593Smuzhiyun     SmartPtr<RkAiqCpslParamsProxy> mDleayCpslParams;
253*4882a593Smuzhiyun     int mDelayCpslApplyFrmNum;
254*4882a593Smuzhiyun     int mCamPhyId;
255*4882a593Smuzhiyun #ifdef RKAIQ_ENABLE_CAMGROUP
256*4882a593Smuzhiyun     RkAiqCamGroupManager* mCamGroupCoreManager;
257*4882a593Smuzhiyun #endif
258*4882a593Smuzhiyun     bool mIsMain;
259*4882a593Smuzhiyun     int mTBStatsCnt {0};
260*4882a593Smuzhiyun };
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun } //namespace RkCam
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun #endif //_RK_AIQ_MANAGER_H_
265