xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/RkAiqCamGroupManager.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * RkAiqCamGroupManager.h
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2021 Rockchip Corporation
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
7*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
8*4882a593Smuzhiyun  * You may obtain a copy of the License at
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
13*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
14*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
16*4882a593Smuzhiyun  * limitations under the License.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef _RK_AIQ_CAM_GROUP_MANAGER_H_
21*4882a593Smuzhiyun #define _RK_AIQ_CAM_GROUP_MANAGER_H_
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include "rk_aiq_algo_camgroup_types.h"
24*4882a593Smuzhiyun #include "xcore/smartptr.h"
25*4882a593Smuzhiyun #include "xcore/safe_list.h"
26*4882a593Smuzhiyun #include "common/rk_aiq_pool.h"
27*4882a593Smuzhiyun #include "aiq_core/MessageBus.h"
28*4882a593Smuzhiyun #include "aiq_core/RkAiqCamgroupHandle.h"
29*4882a593Smuzhiyun #include "aiq_core/RkAiqCore.h"
30*4882a593Smuzhiyun #include "rk_aiq.h"
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun using namespace XCam;
33*4882a593Smuzhiyun namespace RkCam {
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun class RkAiqManager;
36*4882a593Smuzhiyun class RkAiqCore;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun typedef struct rk_aiq_singlecam_result_s {
39*4882a593Smuzhiyun     rk_aiq_singlecam_3a_result_t _3aResults;
40*4882a593Smuzhiyun     SmartPtr<RkAiqFullParamsProxy> _fullIspParam;
rk_aiq_singlecam_result_srk_aiq_singlecam_result_s41*4882a593Smuzhiyun     rk_aiq_singlecam_result_s () {
42*4882a593Smuzhiyun         memset(&_3aResults, 0, sizeof(_3aResults));
43*4882a593Smuzhiyun     }
resetrk_aiq_singlecam_result_s44*4882a593Smuzhiyun     void reset() {
45*4882a593Smuzhiyun         XCamVideoBuffer* stats_buf = _3aResults.awb._awbStats;
46*4882a593Smuzhiyun         if (stats_buf)
47*4882a593Smuzhiyun             stats_buf->unref(stats_buf);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun         stats_buf = _3aResults.awb._awbProcRes;
50*4882a593Smuzhiyun         if (stats_buf)
51*4882a593Smuzhiyun             stats_buf->unref(stats_buf);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun         stats_buf = _3aResults.aec._aecStats;
54*4882a593Smuzhiyun         if (stats_buf)
55*4882a593Smuzhiyun             stats_buf->unref(stats_buf);
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun         stats_buf = _3aResults.aec._aePreRes;
58*4882a593Smuzhiyun         if (stats_buf)
59*4882a593Smuzhiyun             stats_buf->unref(stats_buf);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun         memset(&_3aResults, 0, sizeof(_3aResults));
62*4882a593Smuzhiyun         _fullIspParam = NULL;
63*4882a593Smuzhiyun     }
64*4882a593Smuzhiyun } rk_aiq_singlecam_result_t;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun typedef struct rk_aiq_singlecam_result_status_s {
67*4882a593Smuzhiyun     rk_aiq_singlecam_result_t _singleCamResults;
68*4882a593Smuzhiyun     uint64_t _validAlgoResBits;
69*4882a593Smuzhiyun     uint64_t _validCoreMsgsBits;
70*4882a593Smuzhiyun     bool _ready;
resetrk_aiq_singlecam_result_status_s71*4882a593Smuzhiyun     void reset() {
72*4882a593Smuzhiyun         _validAlgoResBits = 0;
73*4882a593Smuzhiyun         _validCoreMsgsBits = 0;
74*4882a593Smuzhiyun         _ready = false;
75*4882a593Smuzhiyun         _singleCamResults.reset();
76*4882a593Smuzhiyun     }
77*4882a593Smuzhiyun } rk_aiq_singlecam_result_status_t;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun typedef struct rk_aiq_groupcam_result_s {
80*4882a593Smuzhiyun     rk_aiq_singlecam_result_status_t _singleCamResultsStatus[RK_AIQ_CAM_GROUP_MAX_CAMS];
81*4882a593Smuzhiyun     uint8_t _validCamResBits;
82*4882a593Smuzhiyun     uint32_t _frameId;
83*4882a593Smuzhiyun     bool _ready;
84*4882a593Smuzhiyun     uint32_t _refCnt;
resetrk_aiq_groupcam_result_s85*4882a593Smuzhiyun     void reset() {
86*4882a593Smuzhiyun         _validCamResBits = 0;
87*4882a593Smuzhiyun         _ready = false;
88*4882a593Smuzhiyun         _frameId = -1;
89*4882a593Smuzhiyun         _refCnt = 0;
90*4882a593Smuzhiyun         for (int i = 0; i < RK_AIQ_CAM_GROUP_MAX_CAMS; i++)
91*4882a593Smuzhiyun             _singleCamResultsStatus[i].reset();
92*4882a593Smuzhiyun     }
93*4882a593Smuzhiyun } rk_aiq_groupcam_result_t;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun typedef struct rk_aiq_groupcam_sofsync_s {
96*4882a593Smuzhiyun     SmartPtr<VideoBuffer> _singleCamSofEvt[RK_AIQ_CAM_GROUP_MAX_CAMS];
97*4882a593Smuzhiyun     uint8_t _validCamSofSyncBits;
rk_aiq_groupcam_sofsync_srk_aiq_groupcam_sofsync_s98*4882a593Smuzhiyun     rk_aiq_groupcam_sofsync_s() {
99*4882a593Smuzhiyun         _validCamSofSyncBits = 0;
100*4882a593Smuzhiyun     }
101*4882a593Smuzhiyun     uint32_t _refCnt;
resetrk_aiq_groupcam_sofsync_s102*4882a593Smuzhiyun     void reset() {
103*4882a593Smuzhiyun         _validCamSofSyncBits = 0;
104*4882a593Smuzhiyun         _refCnt = 0;
105*4882a593Smuzhiyun         for (int i = 0; i < RK_AIQ_CAM_GROUP_MAX_CAMS; i++)
106*4882a593Smuzhiyun             _singleCamSofEvt[i] = NULL;
107*4882a593Smuzhiyun     }
108*4882a593Smuzhiyun } rk_aiq_groupcam_sofsync_t;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun class RkAiqCamGroupManager;
111*4882a593Smuzhiyun class RkAiqCamGroupReprocTh
112*4882a593Smuzhiyun     : public Thread {
113*4882a593Smuzhiyun public:
RkAiqCamGroupReprocTh(RkAiqCamGroupManager * camGroupManager)114*4882a593Smuzhiyun     RkAiqCamGroupReprocTh(RkAiqCamGroupManager* camGroupManager)
115*4882a593Smuzhiyun         : Thread("RkAiqCamGroupReprocTh")
116*4882a593Smuzhiyun         , mCamGroupManager(camGroupManager) {};
~RkAiqCamGroupReprocTh()117*4882a593Smuzhiyun     ~RkAiqCamGroupReprocTh() {
118*4882a593Smuzhiyun     };
119*4882a593Smuzhiyun 
triger_stop()120*4882a593Smuzhiyun     void triger_stop() {
121*4882a593Smuzhiyun         mMsgQueue.pause_pop ();
122*4882a593Smuzhiyun     };
123*4882a593Smuzhiyun 
triger_start()124*4882a593Smuzhiyun     void triger_start() {
125*4882a593Smuzhiyun         mMsgQueue.clear ();
126*4882a593Smuzhiyun         mMsgQueue.resume_pop ();
127*4882a593Smuzhiyun     };
128*4882a593Smuzhiyun     typedef struct rk_aiq_groupcam_result_wrapper_s {
rk_aiq_groupcam_result_wrapper_srk_aiq_groupcam_result_wrapper_s129*4882a593Smuzhiyun         rk_aiq_groupcam_result_wrapper_s(rk_aiq_groupcam_result_t* gc_result)
130*4882a593Smuzhiyun             :_gc_result(gc_result){};
131*4882a593Smuzhiyun         rk_aiq_groupcam_result_t* _gc_result;
132*4882a593Smuzhiyun     } rk_aiq_groupcam_result_wrapper_t;
133*4882a593Smuzhiyun     bool sendFrame(rk_aiq_groupcam_result_t* gc_result);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun protected:
136*4882a593Smuzhiyun     //virtual bool started ();
stopped()137*4882a593Smuzhiyun     virtual void stopped () {
138*4882a593Smuzhiyun         mMsgQueue.clear ();
139*4882a593Smuzhiyun     };
140*4882a593Smuzhiyun     virtual bool loop ();
141*4882a593Smuzhiyun private:
142*4882a593Smuzhiyun     RkAiqCamGroupManager* mCamGroupManager;
143*4882a593Smuzhiyun     SafeList<rk_aiq_groupcam_result_wrapper_t>  mMsgQueue;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun typedef std::shared_ptr<std::list<std::string>> ModuleNameList;
147*4882a593Smuzhiyun class RkAiqCamgroupHandle;
148*4882a593Smuzhiyun class RkAiqCamGroupManager
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun     friend class RkAiqCamGroupReprocTh;
151*4882a593Smuzhiyun     friend class RkAiqCamgroupHandle;
152*4882a593Smuzhiyun     /* normal processing */
153*4882a593Smuzhiyun     // add cam's AIQ ctx to cam group
154*4882a593Smuzhiyun     // receive group cam's awb,ae stats
155*4882a593Smuzhiyun     // receive group cam's awb,ae pre/proc results
156*4882a593Smuzhiyun     // receive group cam's genIspxxx results
157*4882a593Smuzhiyun     // running group algos, and replace the params
158*4882a593Smuzhiyun     // send all cam's params to hwi
159*4882a593Smuzhiyun     /* special for init params */
160*4882a593Smuzhiyun     // called only once
161*4882a593Smuzhiyun public:
162*4882a593Smuzhiyun     RkAiqCamGroupManager();
163*4882a593Smuzhiyun     virtual ~RkAiqCamGroupManager();
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun     // folowing called by single RkAiq
166*4882a593Smuzhiyun     void processAiqCoreMsgs(RkAiqCore* src, RkAiqCoreVdBufMsg& msg);
167*4882a593Smuzhiyun     void RelayAiqCoreResults(RkAiqCore* src, SmartPtr<RkAiqFullParamsProxy> &results);
168*4882a593Smuzhiyun     XCamReturn sofSync(RkAiqManager* aiqManager, SmartPtr<VideoBuffer>& sof_evt);
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun     XCamReturn setCamgroupCalib(CamCalibDbCamgroup_t* camgroup_calib);
171*4882a593Smuzhiyun     // rk_aiq_camgroup_ctx_t
setContainerCtx(void * group_ctx)172*4882a593Smuzhiyun     void setContainerCtx(void* group_ctx) {
173*4882a593Smuzhiyun         mGroupCtx = group_ctx;
174*4882a593Smuzhiyun     };
getContainerCtx()175*4882a593Smuzhiyun     void* getContainerCtx() {
176*4882a593Smuzhiyun         return mGroupCtx;
177*4882a593Smuzhiyun     };
178*4882a593Smuzhiyun     // called after single cam aiq init
179*4882a593Smuzhiyun     XCamReturn init();
180*4882a593Smuzhiyun     // called only once
181*4882a593Smuzhiyun     XCamReturn deInit();
182*4882a593Smuzhiyun     // start analyze thread
183*4882a593Smuzhiyun     XCamReturn start();
184*4882a593Smuzhiyun     // stop analyze thread
185*4882a593Smuzhiyun     XCamReturn stop();
186*4882a593Smuzhiyun     // called before start(), get initial settings
187*4882a593Smuzhiyun     XCamReturn prepare();
188*4882a593Smuzhiyun     // if called, prepare should be re-called
189*4882a593Smuzhiyun     XCamReturn bind(RkAiqManager* ctx);
190*4882a593Smuzhiyun     XCamReturn unbind(int camId);
isRunningState()191*4882a593Smuzhiyun     bool isRunningState() {
192*4882a593Smuzhiyun         return mState == CAMGROUP_MANAGER_STARTED;
193*4882a593Smuzhiyun     }
194*4882a593Smuzhiyun     XCamReturn addAlgo(RkAiqAlgoDesComm& algo);
195*4882a593Smuzhiyun     XCamReturn enableAlgo(int algoType, int id, bool enable);
196*4882a593Smuzhiyun     XCamReturn rmAlgo(int algoType, int id);
197*4882a593Smuzhiyun     bool getAxlibStatus(int algoType, int id);
198*4882a593Smuzhiyun     RkAiqAlgoContext* getEnabledAxlibCtx(const int algo_type);
199*4882a593Smuzhiyun     RkAiqAlgoContext* getAxlibCtx(const int algo_type, const int lib_id);
200*4882a593Smuzhiyun     RkAiqCamgroupHandle* getAiqCamgroupHandle(const int algo_type, const int lib_id);
201*4882a593Smuzhiyun     XCamReturn calibTuning(const CamCalibDbV2Context_t* aiqCalib, ModuleNameList& change_name_list);
202*4882a593Smuzhiyun     XCamReturn updateCalibDb(const CamCalibDbV2Context_t* newCalibDb);
203*4882a593Smuzhiyun     XCamReturn rePrepare();
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun     void setVicapReady(rk_aiq_hwevt_t* hwevt);
206*4882a593Smuzhiyun     bool isAllVicapReady();
207*4882a593Smuzhiyun protected:
208*4882a593Smuzhiyun     const struct RkAiqAlgoDesCommExt* mGroupAlgosDesArray;
209*4882a593Smuzhiyun     /* key: camId*/
210*4882a593Smuzhiyun     std::map<uint8_t, RkAiqManager*> mBindAiqsMap;
211*4882a593Smuzhiyun     /* key: frameId */
212*4882a593Smuzhiyun     std::map<uint32_t, rk_aiq_groupcam_result_t*> mCamGroupResMap;
213*4882a593Smuzhiyun     /* key: frameId */
214*4882a593Smuzhiyun     std::map<uint32_t, rk_aiq_groupcam_sofsync_t*> mCamGroupSofsyncMap;
215*4882a593Smuzhiyun     Mutex mCamGroupResMutex;
216*4882a593Smuzhiyun     SmartPtr<RkAiqCamGroupReprocTh> mCamGroupReprocTh;
217*4882a593Smuzhiyun     /* */
218*4882a593Smuzhiyun     Mutex mCamGroupApiSyncMutex;
219*4882a593Smuzhiyun     Mutex mSofMutex;
220*4882a593Smuzhiyun     uint64_t mRequiredMsgsMask;
221*4882a593Smuzhiyun     uint64_t mRequiredAlgoResMask;
222*4882a593Smuzhiyun     uint8_t mRequiredCamsResMask;
223*4882a593Smuzhiyun     uint8_t mVicapReadyMask;
224*4882a593Smuzhiyun     AlgoCtxInstanceCfgCamGroup mGroupAlgoCtxCfg;
225*4882a593Smuzhiyun     // mDefAlgoHandleList and mDefAlgoHandleMap only contain default handlers(id == 0),
226*4882a593Smuzhiyun     // default handlers will be treated as root handler, and custom handlers as children.
227*4882a593Smuzhiyun     // Custom handlers located in mAlgoHandleMaps and nexthdl of default handlers.
228*4882a593Smuzhiyun     // ordered algo list
229*4882a593Smuzhiyun     std::list<SmartPtr<RkAiqCamgroupHandle>> mDefAlgoHandleList;
230*4882a593Smuzhiyun     // key: algo type
231*4882a593Smuzhiyun     // for fast access
232*4882a593Smuzhiyun     std::map<int, SmartPtr<RkAiqCamgroupHandle>> mDefAlgoHandleMap;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun     // key1: algo type
235*4882a593Smuzhiyun     // key2: algo id
236*4882a593Smuzhiyun     std::map<int, std::map<int, SmartPtr<RkAiqCamgroupHandle>>> mAlgoHandleMaps;
237*4882a593Smuzhiyun     // status transition
238*4882a593Smuzhiyun     /*   Typical transitions:
239*4882a593Smuzhiyun      *        CURRENT_STATE              NEXT_STATE                  OPERATION
240*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_INVALID -> CAMGROUP_MANAGER_BINDED          bind
241*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_BINDED-> CAMGROUP_MANAGER_INITED            init
242*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_INITED -> CAMGROUP_MANAGER_PREPARED         prepare
243*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_PREPARED -> CAMGROUP_MANAGER_STARTED        start
244*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_STARTED -> CAMGROUP_MANAGER_PREPARED        stop
245*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_PREPARED-> CAMGROUP_MANAGER_UNBINDED        unbind
246*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_UNBINDED -> CAMGROUP_MANAGER_INVALID        deinit
247*4882a593Smuzhiyun      *
248*4882a593Smuzhiyun      *   Others:
249*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_BINDED-> CAMGROUP_MANAGER_UNBINDED          unbind
250*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_INITED -> CAMGROUP_MANAGER_UNBINDED         unbind
251*4882a593Smuzhiyun      *   CAMGROUP_MANAGER_PREPARED -> CAMGROUP_MANAGER_UNBINDED       unbind
252*4882a593Smuzhiyun      */
253*4882a593Smuzhiyun     enum camgroup_manager_state_e {
254*4882a593Smuzhiyun         CAMGROUP_MANAGER_INVALID,
255*4882a593Smuzhiyun         CAMGROUP_MANAGER_BINDED,
256*4882a593Smuzhiyun         CAMGROUP_MANAGER_UNBINDED,
257*4882a593Smuzhiyun         CAMGROUP_MANAGER_INITED,
258*4882a593Smuzhiyun         CAMGROUP_MANAGER_PREPARED,
259*4882a593Smuzhiyun         CAMGROUP_MANAGER_STARTED,
260*4882a593Smuzhiyun     };
261*4882a593Smuzhiyun     int mState;
262*4882a593Smuzhiyun     bool mInit;
263*4882a593Smuzhiyun     CamCalibDbCamgroup_t* mCamgroupCalib;
264*4882a593Smuzhiyun     uint32_t mClearedSofId;
265*4882a593Smuzhiyun     uint32_t mClearedResultId;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun protected:
268*4882a593Smuzhiyun     XCamReturn reProcess(rk_aiq_groupcam_result_t* gc_res);
269*4882a593Smuzhiyun     rk_aiq_groupcam_result_t* getGroupCamResult(uint32_t frameId, bool query_ready = true);
270*4882a593Smuzhiyun     rk_aiq_groupcam_sofsync_t* getGroupCamSofsync(uint32_t frameId, bool query_ready = true);
271*4882a593Smuzhiyun     void setSingleCamStatusReady(rk_aiq_singlecam_result_status_t* status, rk_aiq_groupcam_result_t* gc_result);
272*4882a593Smuzhiyun     void relayToHwi(rk_aiq_groupcam_result_t* gc_res);
273*4882a593Smuzhiyun     void clearGroupCamResult(uint32_t frameId);
274*4882a593Smuzhiyun     void clearGroupCamResult_Locked(uint32_t frameId);
275*4882a593Smuzhiyun     void putGroupCamResult(rk_aiq_groupcam_result_t* gc_res);
276*4882a593Smuzhiyun     void clearGroupCamSofsync(uint32_t frameId);
277*4882a593Smuzhiyun     void clearGroupCamSofsync_Locked(uint32_t frameId);
278*4882a593Smuzhiyun     void putGroupCamSofsync(rk_aiq_groupcam_sofsync_t* syncSof);
279*4882a593Smuzhiyun     void addDefaultAlgos(const struct RkAiqAlgoDesCommExt* algoDes);
280*4882a593Smuzhiyun     virtual SmartPtr<RkAiqCamgroupHandle> newAlgoHandle(RkAiqAlgoDesComm* algo, int hw_ver);
281*4882a593Smuzhiyun     SmartPtr<RkAiqCamgroupHandle> getDefAlgoTypeHandle(int algo_type);
282*4882a593Smuzhiyun     XCamReturn syncSingleCamResultWithMaster(rk_aiq_groupcam_result_t* gc_res);
283*4882a593Smuzhiyun     std::map<int, SmartPtr<RkAiqCamgroupHandle>>* getAlgoTypeHandleMap(int algo_type);
284*4882a593Smuzhiyun     void* mGroupCtx;
285*4882a593Smuzhiyun private:
286*4882a593Smuzhiyun     CamCalibDbV2Context_t mCalibv2;
287*4882a593Smuzhiyun     bool needReprepare;
288*4882a593Smuzhiyun     XCam::Mutex _update_mutex;
289*4882a593Smuzhiyun     XCam::Cond _update_done_cond;
290*4882a593Smuzhiyun     std::atomic<bool> _sync_sof_running;
291*4882a593Smuzhiyun };
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun } //namespace
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #endif
296