xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp20/Isp20Params.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 _CAM_HW_ISP20_PARAMS_H_
19*4882a593Smuzhiyun #define _CAM_HW_ISP20_PARAMS_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "rk_aiq_pool.h"
22*4882a593Smuzhiyun #include "rkisp2-config.h"
23*4882a593Smuzhiyun #include "rkispp-config.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun namespace RkCam {
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define ISP20PARAM_SUBM (0x2)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define DISABLE_PARAMS_ASSEMBLER
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun typedef struct AntiTmoFlicker_s {
32*4882a593Smuzhiyun     int preFrameNum;
33*4882a593Smuzhiyun     bool FirstChange;
34*4882a593Smuzhiyun     int FirstChangeNum;
35*4882a593Smuzhiyun     bool FirstChangeDone;
36*4882a593Smuzhiyun     int FirstChangeDoneNum;
37*4882a593Smuzhiyun } AntiTmoFlicker_t;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun enum params_type {
41*4882a593Smuzhiyun     ISP_PARAMS,
42*4882a593Smuzhiyun     ISPP_PARAMS,
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #ifndef DISABLE_PARAMS_ASSEMBLER
46*4882a593Smuzhiyun class IspParamsAssembler {
47*4882a593Smuzhiyun public:
48*4882a593Smuzhiyun     explicit IspParamsAssembler(const char* name);
49*4882a593Smuzhiyun     virtual ~IspParamsAssembler();
50*4882a593Smuzhiyun     void addReadyCondition(uint32_t cond);
51*4882a593Smuzhiyun     void rmReadyCondition(uint32_t cond);
52*4882a593Smuzhiyun     XCamReturn queue(cam3aResultList& results);
53*4882a593Smuzhiyun     XCamReturn queue(SmartPtr<cam3aResult>& result);
54*4882a593Smuzhiyun     XCamReturn deQueOne(cam3aResultList& results, uint32_t& frame_id);
55*4882a593Smuzhiyun     void forceReady(uint32_t frame_id);
56*4882a593Smuzhiyun     bool ready();
57*4882a593Smuzhiyun     void reset();
58*4882a593Smuzhiyun     XCamReturn start();
59*4882a593Smuzhiyun     void stop();
setCamPhyId(int phyId)60*4882a593Smuzhiyun     void setCamPhyId(int phyId) {
61*4882a593Smuzhiyun         mCamPhyId = phyId;
62*4882a593Smuzhiyun     }
63*4882a593Smuzhiyun protected:
64*4882a593Smuzhiyun     int mCamPhyId;
65*4882a593Smuzhiyun private:
66*4882a593Smuzhiyun     XCAM_DEAD_COPY(IspParamsAssembler);
67*4882a593Smuzhiyun     XCamReturn queue_locked(SmartPtr<cam3aResult>& result);
68*4882a593Smuzhiyun     void reset_locked();
69*4882a593Smuzhiyun     typedef struct {
70*4882a593Smuzhiyun         bool ready;
71*4882a593Smuzhiyun         uint64_t flags;
72*4882a593Smuzhiyun         cam3aResultList params;
73*4882a593Smuzhiyun     } params_t;
74*4882a593Smuzhiyun     // <frameId, result lists>
75*4882a593Smuzhiyun     std::map<uint32_t, params_t> mParamsMap;
76*4882a593Smuzhiyun     Mutex mParamsMutex;
77*4882a593Smuzhiyun     uint32_t mLatestReadyFrmId;
78*4882a593Smuzhiyun     uint64_t mReadyMask;
79*4882a593Smuzhiyun     uint32_t mReadyNums;
80*4882a593Smuzhiyun     std::string mName;
81*4882a593Smuzhiyun     // <result_type, maskId>
82*4882a593Smuzhiyun     std::map<uint32_t, uint64_t> mCondMaskMap;
83*4882a593Smuzhiyun     uint8_t mCondNum;
84*4882a593Smuzhiyun     static uint32_t MAX_PENDING_PARAMS;
85*4882a593Smuzhiyun     cam3aResultList mInitParamsList;
86*4882a593Smuzhiyun     bool started;
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun class Isp20Params {
91*4882a593Smuzhiyun public:
Isp20Params()92*4882a593Smuzhiyun     explicit Isp20Params() : _last_pp_module_init_ens(0)
93*4882a593Smuzhiyun         , _force_isp_module_ens(0)
94*4882a593Smuzhiyun         , _force_ispp_module_ens(0)
95*4882a593Smuzhiyun         , _force_module_flags(0)
96*4882a593Smuzhiyun     {   AntiTmoFlicker.preFrameNum = 0;
97*4882a593Smuzhiyun         AntiTmoFlicker.FirstChange = false;
98*4882a593Smuzhiyun         AntiTmoFlicker.FirstChangeNum = 0;
99*4882a593Smuzhiyun         AntiTmoFlicker.FirstChangeDone = false;
100*4882a593Smuzhiyun         AntiTmoFlicker.FirstChangeDoneNum = 0;
101*4882a593Smuzhiyun         _working_mode = RK_AIQ_WORKING_MODE_ISP_HDR3;
102*4882a593Smuzhiyun     };
~Isp20Params()103*4882a593Smuzhiyun     virtual ~Isp20Params() {};
setCamPhyId(int phyId)104*4882a593Smuzhiyun     virtual void setCamPhyId(int phyId) {
105*4882a593Smuzhiyun         _CamPhyId = phyId;
106*4882a593Smuzhiyun     }
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     virtual XCamReturn checkIsp20Params(struct isp2x_isp_params_cfg& isp_cfg);
109*4882a593Smuzhiyun     void set_working_mode(int mode);
110*4882a593Smuzhiyun     void setModuleStatus(rk_aiq_module_id_t mId, bool en);
111*4882a593Smuzhiyun     void getModuleStatus(rk_aiq_module_id_t mId, bool& en);
112*4882a593Smuzhiyun     void hdrtmoGetLumaInfo(rk_aiq_luma_params_t * Next, rk_aiq_luma_params_t *Cur,
113*4882a593Smuzhiyun                            s32 frameNum, s32 PixelNumBlock, float blc, float *luma);
114*4882a593Smuzhiyun     void hdrtmoGetAeInfo(RKAiqAecExpInfo_t* Next, RKAiqAecExpInfo_t* Cur, s32 frameNum, float* expo);
115*4882a593Smuzhiyun     s32 hdrtmoPredictK(float* luma, float* expo, s32 frameNum, PredictKPara_t *TmoPara);
116*4882a593Smuzhiyun     bool hdrtmoSceneStable(uint32_t frameId, int IIRMAX, int IIR, int SetWeight, s32 frameNum, float *LumaDeviation, float StableThr);
117*4882a593Smuzhiyun #if 0
118*4882a593Smuzhiyun     void forceOverwriteAiqIsppCfg(struct rkispp_params_cfg& pp_cfg,
119*4882a593Smuzhiyun                                   SmartPtr<RkAiqIspParamsProxy> aiq_meas_results,
120*4882a593Smuzhiyun                                   SmartPtr<RkAiqIspParamsProxy> aiq_other_results);
121*4882a593Smuzhiyun     void forceOverwriteAiqIspCfg(struct isp2x_isp_params_cfg& isp_cfg,
122*4882a593Smuzhiyun                                  SmartPtr<RkAiqIspParamsProxy> aiq_results,
123*4882a593Smuzhiyun                                  SmartPtr<RkAiqIspParamsProxy> aiq_other_results);
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun     template<typename T>
126*4882a593Smuzhiyun     XCamReturn merge_results(cam3aResultList &results, T &isp_cfg);
127*4882a593Smuzhiyun     XCamReturn get_tnr_cfg_params(cam3aResultList &results, struct rkispp_params_tnrcfg &tnr_cfg);
128*4882a593Smuzhiyun     //XCamReturn get_nr_cfg_params(cam3aResultList &results, struct rkispp_params_nrcfg &nr_cfg);
129*4882a593Smuzhiyun     XCamReturn get_fec_cfg_params(cam3aResultList &results, struct rkispp_params_feccfg &fec_cfg);
130*4882a593Smuzhiyun     virtual XCamReturn merge_isp_results(cam3aResultList &results, void* isp_cfg, bool is_multi_isp = false);
131*4882a593Smuzhiyun protected:
132*4882a593Smuzhiyun     XCAM_DEAD_COPY(Isp20Params);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun     template<class T>
135*4882a593Smuzhiyun     void convertAiqAeToIsp20Params(T& isp_cfg,
136*4882a593Smuzhiyun                                    const rk_aiq_isp_aec_meas_t& aec_meas);
137*4882a593Smuzhiyun     template<class T>
138*4882a593Smuzhiyun     void convertAiqHistToIsp20Params(T& isp_cfg,
139*4882a593Smuzhiyun                                      const rk_aiq_isp_hist_meas_t& hist_meas);
140*4882a593Smuzhiyun #if RKAIQ_HAVE_AWB_V20
141*4882a593Smuzhiyun     template<class T>
142*4882a593Smuzhiyun     void convertAiqAwbToIsp20Params(T& isp_cfg,
143*4882a593Smuzhiyun                                     const rk_aiq_awb_stat_cfg_v200_t& awb_meas,
144*4882a593Smuzhiyun                                     bool awb_cfg_udpate);
145*4882a593Smuzhiyun #endif
146*4882a593Smuzhiyun     template<class T>
147*4882a593Smuzhiyun     void convertAiqAwbGainToIsp20Params(T& isp_cfg,
148*4882a593Smuzhiyun                                         const rk_aiq_wb_gain_t& awb_gain, const rk_aiq_isp_blc_t &blc,
149*4882a593Smuzhiyun                                         bool awb_gain_update);
150*4882a593Smuzhiyun #if RKAIQ_HAVE_MERGE_V10
151*4882a593Smuzhiyun     template<class T>
152*4882a593Smuzhiyun     void convertAiqMergeToIsp20Params(T& isp_cfg,
153*4882a593Smuzhiyun                                       const rk_aiq_isp_merge_t& amerge_data);
154*4882a593Smuzhiyun #endif
155*4882a593Smuzhiyun     template<class T>
156*4882a593Smuzhiyun     void convertAiqTmoToIsp20Params(T& isp_cfg,
157*4882a593Smuzhiyun                                     const rk_aiq_isp_tmo_t& atmo_data);
158*4882a593Smuzhiyun #if RKAIQ_HAVE_DEHAZE_V10
159*4882a593Smuzhiyun     template<class T>
160*4882a593Smuzhiyun     void convertAiqAdehazeToIsp20Params(T& isp_cfg,
161*4882a593Smuzhiyun                                         const rk_aiq_isp_dehaze_t& dhaze);
162*4882a593Smuzhiyun #endif
163*4882a593Smuzhiyun #if RKAIQ_HAVE_GAMMA_V10
164*4882a593Smuzhiyun     template<class T>
165*4882a593Smuzhiyun     void convertAiqAgammaToIsp20Params(T& isp_cfg,
166*4882a593Smuzhiyun                                        const AgammaProcRes_t& gamma_out_cfg);
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun     template<class T>
169*4882a593Smuzhiyun     void convertAiqAdegammaToIsp20Params(T& isp_cfg,
170*4882a593Smuzhiyun                                          const AdegammaProcRes_t& degamma_cfg);
171*4882a593Smuzhiyun     template<class T>
172*4882a593Smuzhiyun     void convertAiqAdemosaicToIsp20Params(T& isp_cfg, rk_aiq_isp_debayer_t &demosaic);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun     template<class T>
175*4882a593Smuzhiyun     void convertAiqLscToIsp20Params(T& isp_cfg,
176*4882a593Smuzhiyun                                     const rk_aiq_lsc_cfg_t& lsc);
177*4882a593Smuzhiyun     template<class T>
178*4882a593Smuzhiyun     void convertAiqBlcToIsp20Params(T& isp_cfg, rk_aiq_isp_blc_t &blc);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     template<class T>
181*4882a593Smuzhiyun     void convertAiqDpccToIsp20Params(T& isp_cfg, rk_aiq_isp_dpcc_t &dpcc);
182*4882a593Smuzhiyun #if RKAIQ_HAVE_CCM_V1
183*4882a593Smuzhiyun     template<class T>
184*4882a593Smuzhiyun     void convertAiqCcmToIsp20Params(T& isp_cfg,
185*4882a593Smuzhiyun                                     const rk_aiq_ccm_cfg_t& ccm);
186*4882a593Smuzhiyun #endif
187*4882a593Smuzhiyun #if RKAIQ_HAVE_3DLUT_V1
188*4882a593Smuzhiyun     template<class T>
189*4882a593Smuzhiyun     void convertAiqA3dlutToIsp20Params(T& isp_cfg,
190*4882a593Smuzhiyun                                        const rk_aiq_lut3d_cfg_t& lut3d_cfg);
191*4882a593Smuzhiyun #endif
192*4882a593Smuzhiyun #if RKAIQ_HAVE_ACP_V10
193*4882a593Smuzhiyun     template<class T>
194*4882a593Smuzhiyun     void convertAiqCpToIsp20Params(T& isp_cfg,
195*4882a593Smuzhiyun                                    const rk_aiq_acp_params_t& lut3d_cfg);
196*4882a593Smuzhiyun #endif
197*4882a593Smuzhiyun #if RKAIQ_HAVE_AIE_V10
198*4882a593Smuzhiyun     template<class T>
199*4882a593Smuzhiyun     void convertAiqIeToIsp20Params(T& isp_cfg,
200*4882a593Smuzhiyun                                    const rk_aiq_isp_ie_t& ie_cfg);
201*4882a593Smuzhiyun #endif
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #if RKAIQ_HAVE_ANR_V1
204*4882a593Smuzhiyun     template<class T>
205*4882a593Smuzhiyun     void convertAiqRawnrToIsp20Params(T& isp_cfg,
206*4882a593Smuzhiyun                                       rk_aiq_isp_rawnr_t& rawnr);
207*4882a593Smuzhiyun     template<typename T>
208*4882a593Smuzhiyun     void convertAiqTnrToIsp20Params(T& pp_cfg,
209*4882a593Smuzhiyun                                     rk_aiq_isp_tnr_t& tnr);
210*4882a593Smuzhiyun     template<typename T>
211*4882a593Smuzhiyun     void convertAiqUvnrToIsp20Params(T& pp_cfg,
212*4882a593Smuzhiyun                                      rk_aiq_isp_uvnr_t& uvnr);
213*4882a593Smuzhiyun     template<typename T>
214*4882a593Smuzhiyun     void convertAiqYnrToIsp20Params(T& pp_cfg,
215*4882a593Smuzhiyun                                     rk_aiq_isp_ynr_t& ynr);
216*4882a593Smuzhiyun     template<typename T>
217*4882a593Smuzhiyun     void convertAiqSharpenToIsp20Params(T& pp_cfg,
218*4882a593Smuzhiyun                                     rk_aiq_isp_sharpen_t& sharp, rk_aiq_isp_edgeflt_t& edgeflt);
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun #if RKAIQ_HAVE_AF_V20 || RKAIQ_ONLY_AF_STATS_V20
221*4882a593Smuzhiyun     template<class T>
222*4882a593Smuzhiyun     void convertAiqAfToIsp20Params(T& isp_cfg,
223*4882a593Smuzhiyun                                    const rk_aiq_isp_af_meas_t& af_data, bool af_cfg_udpate);
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun     template<class T>
226*4882a593Smuzhiyun     void convertAiqGainToIsp20Params(T& isp_cfg,
227*4882a593Smuzhiyun                                      rk_aiq_isp_gain_t& gain);
228*4882a593Smuzhiyun     template<class T>
229*4882a593Smuzhiyun     void convertAiqAldchToIsp20Params(T& isp_cfg,
230*4882a593Smuzhiyun                                       const rk_aiq_isp_ldch_t& ldch_cfg);
231*4882a593Smuzhiyun     template<typename T>
232*4882a593Smuzhiyun     void convertAiqFecToIsp20Params(T& pp_cfg,
233*4882a593Smuzhiyun                                     rk_aiq_isp_fec_t& fec);
234*4882a593Smuzhiyun     template<class T>
235*4882a593Smuzhiyun     void convertAiqGicToIsp20Params(T& isp_cfg,
236*4882a593Smuzhiyun                                     const rk_aiq_isp_gic_t& gic_cfg);
237*4882a593Smuzhiyun     template<typename T>
238*4882a593Smuzhiyun     void convertAiqOrbToIsp20Params(T& pp_cfg,
239*4882a593Smuzhiyun                                     rk_aiq_isp_orb_t& orb);
240*4882a593Smuzhiyun     bool getModuleForceFlag(int module_id);
241*4882a593Smuzhiyun     void setModuleForceFlagInverse(int module_id);
242*4882a593Smuzhiyun     bool getModuleForceEn(int module_id);
243*4882a593Smuzhiyun     void updateIspModuleForceEns(u64 module_ens);
244*4882a593Smuzhiyun     void updateIsppModuleForceEns(u32 module_ens);
245*4882a593Smuzhiyun     uint32_t _last_pp_module_init_ens;
246*4882a593Smuzhiyun     u64 _force_isp_module_ens;
247*4882a593Smuzhiyun     u32 _force_ispp_module_ens;
248*4882a593Smuzhiyun     u64 _force_module_flags;
249*4882a593Smuzhiyun     int _working_mode;
250*4882a593Smuzhiyun     int _CamPhyId;
251*4882a593Smuzhiyun     AntiTmoFlicker_t AntiTmoFlicker;
252*4882a593Smuzhiyun     Mutex _mutex;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     virtual bool convert3aResultsToIspCfg(SmartPtr<cam3aResult> &result, void* isp_cfg_p, bool is_multi_isp = false);
255*4882a593Smuzhiyun     SmartPtr<cam3aResult> get_3a_result (cam3aResultList &results, int32_t type);
256*4882a593Smuzhiyun     // std::map<int, std::list<SmartPtr<cam3aResult>>> _cam3aConfig;
257*4882a593Smuzhiyun     cam3aResult* mBlcResult{NULL};
258*4882a593Smuzhiyun     cam3aResult* mAwbParams{NULL};
259*4882a593Smuzhiyun     cam3aResult* mAfParams{NULL};
260*4882a593Smuzhiyun     bool _lsc_en{false};
261*4882a593Smuzhiyun #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
262*4882a593Smuzhiyun 	struct isp32_isp_meas_cfg mLatestMeasCfg;
263*4882a593Smuzhiyun 	struct isp32_bls_cfg mLatestBlsCfg;
264*4882a593Smuzhiyun 	struct isp32_awb_gain_cfg mLatestWbGainCfg;
265*4882a593Smuzhiyun #endif
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun #endif
269