xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/aiq_core/algo_handlers/RkAiqAwbV21Handle.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (c) 2019-2022 Rockchip Eletronics Co., Ltd.
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 #include "RkAiqAwbV21Handle.h"
17 
18 #include "RkAiqCore.h"
19 
20 namespace RkCam {
21 
22 DEFINE_HANDLE_REGISTER_TYPE(RkAiqAwbV21HandleInt);
23 
updateConfig(bool needSync)24 XCamReturn RkAiqAwbV21HandleInt::updateConfig(bool needSync) {
25     ENTER_ANALYZER_FUNCTION();
26 
27     XCamReturn ret = XCAM_RETURN_NO_ERROR;
28 #ifndef DISABLE_HANDLE_ATTRIB
29     if (needSync) mCfgMutex.lock();
30     // if something changed
31     if (updateAtt) {
32         mCurAtt   = mNewAtt;
33         rk_aiq_uapi_awb_SetAttrib(mAlgoCtx, mCurAtt, false);
34         updateAtt = false;
35         sendSignal();
36     }
37     if (updateWbV21Attr) {
38         rk_aiq_uapiV2_wb_awb_wbGainAdjust_t wbGainAdjustBK = mCurWbV21Attr.stAuto.wbGainAdjust;
39         mCurWbV21Attr = mNewWbV21Attr;
40         mCurWbV21Attr.stAuto.wbGainAdjust = wbGainAdjustBK;
41         mallocAndCopyWbGainAdjustAttrib(&mCurWbV21Attr.stAuto.wbGainAdjust,&mNewWbV21Attr.stAuto.wbGainAdjust);
42         rk_aiq_uapiV2_awbV21_SetAttrib(mAlgoCtx, mCurWbV21Attr, false);
43         updateWbV21Attr = false;
44         sendSignal(mCurWbV21Attr.sync.sync_mode);
45     }
46     if (updateWbOpModeAttr) {
47         mCurWbOpModeAttr   = mNewWbOpModeAttr;
48         rk_aiq_uapiV2_awb_SetMwbMode(mAlgoCtx, mCurWbOpModeAttr.mode, false);
49         updateWbOpModeAttr = false;
50         sendSignal(mCurWbOpModeAttr.sync.sync_mode);
51     }
52     if (updateWbMwbAttr) {
53         mCurWbMwbAttr   = mNewWbMwbAttr;
54         rk_aiq_uapiV2_awb_SetMwbAttrib(mAlgoCtx, mCurWbMwbAttr, false);
55         updateWbMwbAttr = false;
56         sendSignal(mCurWbMwbAttr.sync.sync_mode);
57     }
58     if (updateWbAwbAttr) {
59         rk_aiq_uapiV2_wb_awb_wbGainAdjust_t wbGainAdjustBK = mCurWbAwbAttr.wbGainAdjust;
60         mCurWbAwbAttr   = mNewWbAwbAttr;
61         mCurWbAwbAttr.wbGainAdjust = wbGainAdjustBK;
62         mallocAndCopyWbGainAdjustAttrib(&mCurWbAwbAttr.wbGainAdjust,&mNewWbAwbAttr.wbGainAdjust);
63         rk_aiq_uapiV2_awbV20_SetAwbAttrib(mAlgoCtx, mCurWbAwbAttr, false);
64         updateWbAwbAttr = false;
65         sendSignal();
66     }
67     if (updateWbAwbWbGainAdjustAttr) {
68         mallocAndCopyWbGainAdjustAttrib(&mCurWbAwbWbGainAdjustAttr,&mNewWbAwbWbGainAdjustAttr);
69         rk_aiq_uapiV2_awb_SetAwbGainAdjust(mAlgoCtx, mCurWbAwbWbGainAdjustAttr, false);
70         updateWbAwbWbGainAdjustAttr = false;
71         sendSignal(mCurWbAwbWbGainAdjustAttr.sync.sync_mode);
72     }
73     if (updateWbAwbWbGainOffsetAttr) {
74         mCurWbAwbWbGainOffsetAttr   = mNewWbAwbWbGainOffsetAttr;
75         rk_aiq_uapiV2_awb_SetAwbGainOffset(mAlgoCtx, mCurWbAwbWbGainOffsetAttr.gainOffset, false);
76         updateWbAwbWbGainOffsetAttr = false;
77         sendSignal(mCurWbAwbWbGainOffsetAttr.sync.sync_mode);
78     }
79     if (updateWbAwbMultiWindowAttr) {
80         mCurWbAwbMultiWindowAttr   = mNewWbAwbMultiWindowAttr;
81         rk_aiq_uapiV2_awb_SetAwbMultiwindow(mAlgoCtx, mCurWbAwbMultiWindowAttr.multiWindw, false);
82         updateWbAwbMultiWindowAttr = false;
83         sendSignal(mCurWbAwbMultiWindowAttr.sync.sync_mode);
84     }
85     if (updateFFWbgainAttr) {
86         mCurFFWbgainAttr   = mNewFFWbgainAttr;
87         rk_aiq_uapiV2_awb_SetFstFrWbgain(mAlgoCtx, mCurFFWbgainAttr.wggain, false);
88         updateFFWbgainAttr = false;
89         sendSignal(mCurFFWbgainAttr.sync.sync_mode);
90     }
91     if (needSync) mCfgMutex.unlock();
92 #endif
93 
94     EXIT_ANALYZER_FUNCTION();
95     return ret;
96 }
97 
setWbV21Attrib(rk_aiq_uapiV2_wbV21_attrib_t att)98 XCamReturn RkAiqAwbV21HandleInt::setWbV21Attrib(rk_aiq_uapiV2_wbV21_attrib_t att) {
99     ENTER_ANALYZER_FUNCTION();
100 
101     XCamReturn ret = XCAM_RETURN_NO_ERROR;
102     mCfgMutex.lock();
103 
104 #ifdef DISABLE_HANDLE_ATTRIB
105     ret = rk_aiq_uapiV2_awbV21_SetAttrib(mAlgoCtx, att, false);
106 #else
107     // check if there is different between att & mCurAtt(sync)/mNewAtt(async)
108     // if something changed, set att to mNewAtt, and
109     // the new params will be effective later when updateConfig
110     // called by RkAiqCore
111     bool isChanged = false;
112     if (att.sync.sync_mode == RK_AIQ_UAPI_MODE_ASYNC && \
113         memcmp(&mNewWbV21Attr, &att, sizeof(att)))
114         isChanged = true;
115     else if (att.sync.sync_mode != RK_AIQ_UAPI_MODE_ASYNC && \
116              memcmp(&mCurWbV21Attr, &att, sizeof(att)))
117         isChanged = true;
118 
119     // if something changed
120     if (isChanged) {
121         rk_aiq_uapiV2_wb_awb_wbGainAdjust_t wbGainAdjustBK = mNewWbV21Attr.stAuto.wbGainAdjust;
122         mNewWbV21Attr = att;
123         mNewWbV21Attr.stAuto.wbGainAdjust = wbGainAdjustBK;
124         mallocAndCopyWbGainAdjustAttrib(&mNewWbV21Attr.stAuto.wbGainAdjust,&att.stAuto.wbGainAdjust);
125         updateWbV21Attr = true;
126         waitSignal(att.sync.sync_mode);
127     }
128 #endif
129 
130     mCfgMutex.unlock();
131 
132     EXIT_ANALYZER_FUNCTION();
133     return ret;
134 }
135 
getWbV21Attrib(rk_aiq_uapiV2_wbV21_attrib_t * att)136 XCamReturn RkAiqAwbV21HandleInt::getWbV21Attrib(rk_aiq_uapiV2_wbV21_attrib_t* att) {
137     ENTER_ANALYZER_FUNCTION();
138 
139     XCamReturn ret = XCAM_RETURN_NO_ERROR;
140 
141 #ifdef DISABLE_HANDLE_ATTRIB
142     mCfgMutex.lock();
143     rk_aiq_uapiV2_awbV21_GetAttrib(mAlgoCtx, att);
144     mCfgMutex.unlock();
145 #else
146     if (att->sync.sync_mode == RK_AIQ_UAPI_MODE_SYNC) {
147         mCfgMutex.lock();
148         rk_aiq_uapiV2_awbV21_GetAttrib(mAlgoCtx, att);
149         att->sync.done = true;
150         mCfgMutex.unlock();
151     } else {
152         if (updateWbV21Attr) {
153             rk_aiq_uapiV2_wb_awb_wbGainAdjust_t wbGainAdjustBK = att->stAuto.wbGainAdjust;
154             memcpy(att, &mNewWbV21Attr, sizeof(mNewWbV21Attr));
155             att->stAuto.wbGainAdjust = wbGainAdjustBK;
156             mallocAndCopyWbGainAdjustAttrib(&att->stAuto.wbGainAdjust,&mNewWbV21Attr.stAuto.wbGainAdjust);
157             att->sync.done = false;
158         } else {
159             mCfgMutex.lock();
160             rk_aiq_uapiV2_awbV21_GetAttrib(mAlgoCtx, att);
161             mCfgMutex.unlock();
162             att->sync.sync_mode = mNewWbV21Attr.sync.sync_mode;
163             att->sync.done = true;
164         }
165     }
166 #endif
167 
168     EXIT_ANALYZER_FUNCTION();
169     return ret;
170 }
171 
172 }  // namespace RkCam
173