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