xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/hwi/isp3x/CamHwIsp3x.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *  Copyright (c) 2021 Rockchip Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 #include "CamHwIsp3x.h"
19 #ifdef ANDROID_OS
20 #include <cutils/properties.h>
21 #endif
22 
23 #include "IspParamsSplitter.h"
24 
25 namespace RkCam {
26 
CamHwIsp3x()27 CamHwIsp3x::CamHwIsp3x()
28     : CamHwIsp21()
29 {
30     mVicapIspPhyLinkSupported = true;
31 }
32 
~CamHwIsp3x()33 CamHwIsp3x::~CamHwIsp3x()
34 {}
35 
36 XCamReturn
init(const char * sns_ent_name)37 CamHwIsp3x::init(const char* sns_ent_name)
38 {
39     XCamReturn ret = CamHwIsp21::init(sns_ent_name);
40 
41     return ret;
42 }
43 
44 XCamReturn
stop()45 CamHwIsp3x::stop()
46 {
47     XCamReturn ret = CamHwIsp21::stop();
48 
49     return ret;
50 }
51 
52 void
updateEffParams(void * params,void * ori_params)53 CamHwIsp3x::updateEffParams(void* params, void* ori_params) {
54 #if defined(ISP_HW_V30)
55     struct isp3x_isp_params_cfg* isp_params = (struct isp3x_isp_params_cfg*)params;
56     uint32_t effFrmId = isp_params->frame_id;
57 
58     rkisp_effect_params_v20 latestIspParams;
59     bool is_got_latest_params = false;
60     uint32_t latest_id = effFrmId == 0 ? 0 : effFrmId - 1;
61 
62     if (XCAM_RETURN_NO_ERROR == getEffectiveIspParams(latestIspParams, latest_id))
63         is_got_latest_params = true;
64 
65     SmartLock locker(_isp_params_cfg_mutex);
66 
67     if (getParamsForEffMap(effFrmId)) {
68         if (mAwbParams) {
69             RkAiqIspAwbParamsProxyV3x* awbParams =
70                 dynamic_cast<RkAiqIspAwbParamsProxyV3x*>(mAwbParams);
71             _effecting_ispparam_map[effFrmId]->data()->result.awb_cfg_v3x = awbParams->data()->result;
72         }
73 
74         if (mBlcResult) {
75             RkAiqIspBlcParamsProxyV21* blcParams =
76                 dynamic_cast<RkAiqIspBlcParamsProxyV21*>(mBlcResult);
77             _effecting_ispparam_map[effFrmId]->data()->result.blc_cfg = blcParams->data()->result;
78         }
79 
80         struct isp3x_isp_params_cfg* dst_isp_params = NULL;
81         struct isp3x_isp_params_cfg* lates_isp_params_ptr = NULL;
82         struct isp3x_isp_params_cfg* new_isp_params = NULL;
83 
84 #define UPDATE_MODULE_EFF_PARAMS(mask, new_param, latest_param, dst_param) \
85         if (isp_params->module_cfg_update & (mask)) { \
86             dst_param = new_param; \
87         } else { \
88            if (!is_got_latest_params) { \
89                 LOGE_CAMHW_SUBM(ISP20HW_SUBM, "impossible, no effect isp params!"); \
90            } else { \
91                 dst_param = latest_param; \
92            } \
93         } \
94 
95 #define UPDATE_EFF_PARAMS() \
96         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE0, new_isp_params->meas.rawae0, \
97                                  lates_isp_params_ptr->meas.rawae0, dst_isp_params->meas.rawae0); \
98         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE1, new_isp_params->meas.rawae1, \
99                                  lates_isp_params_ptr->meas.rawae1, dst_isp_params->meas.rawae1); \
100         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE2, new_isp_params->meas.rawae2, \
101                                  lates_isp_params_ptr->meas.rawae2, dst_isp_params->meas.rawae2); \
102         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAE3, new_isp_params->meas.rawae3, \
103                                  lates_isp_params_ptr->meas.rawae3, dst_isp_params->meas.rawae3); \
104         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST0, new_isp_params->meas.rawhist0, \
105                                  lates_isp_params_ptr->meas.rawhist0, dst_isp_params->meas.rawhist0); \
106         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST1, new_isp_params->meas.rawhist1, \
107                                  lates_isp_params_ptr->meas.rawhist1, dst_isp_params->meas.rawhist1); \
108         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST2, new_isp_params->meas.rawhist2, \
109                                  lates_isp_params_ptr->meas.rawhist2, dst_isp_params->meas.rawhist2); \
110         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWHIST3, new_isp_params->meas.rawhist3, \
111                                  lates_isp_params_ptr->meas.rawhist3, dst_isp_params->meas.rawhist3); \
112         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAWB, new_isp_params->meas.rawawb, \
113                                  lates_isp_params_ptr->meas.rawawb, dst_isp_params->meas.rawawb); \
114         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_RAWAF, new_isp_params->meas.rawaf, \
115                                  lates_isp_params_ptr->meas.rawaf, dst_isp_params->meas.rawaf);\
116         UPDATE_MODULE_EFF_PARAMS(ISP2X_MODULE_BLS, new_isp_params->others.bls_cfg, \
117                                  lates_isp_params_ptr->others.bls_cfg, dst_isp_params->others.bls_cfg); \
118 
119         if (mIsMultiIspMode) {
120             _effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[0] = *((struct isp3x_isp_params_cfg*)ori_params);
121             _effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[1] = isp_params[0];
122             _effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[2] = isp_params[1];
123 
124             dst_isp_params = &_effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[0];
125             if (is_got_latest_params)
126                 lates_isp_params_ptr = &latestIspParams.isp_params_v3x[0];
127             new_isp_params = (struct isp3x_isp_params_cfg*)ori_params;
128             UPDATE_EFF_PARAMS();
129 
130             dst_isp_params = &_effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[1];
131             if (is_got_latest_params)
132                 lates_isp_params_ptr = &latestIspParams.isp_params_v3x[1];
133             new_isp_params = &isp_params[0];
134             UPDATE_EFF_PARAMS();
135 
136             dst_isp_params = &_effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[2];
137             if (is_got_latest_params)
138                 lates_isp_params_ptr = &latestIspParams.isp_params_v3x[2];
139             new_isp_params = &isp_params[1];
140             UPDATE_EFF_PARAMS();
141         } else {
142             dst_isp_params = &_effecting_ispparam_map[effFrmId]->data()->result.isp_params_v3x[0];
143             if (is_got_latest_params)
144                 lates_isp_params_ptr = &latestIspParams.isp_params_v3x[0];
145             new_isp_params = isp_params;
146             UPDATE_EFF_PARAMS();
147         }
148     }
149 #endif
150 }
151 
152 bool
processTb(void * params)153 CamHwIsp3x::processTb(void* params) {
154     return false;
155 }
156 
157 }
158