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