1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8
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 #include "hcs_deal.h"
18 #include <vector>
19 #include <stdlib.h>
20 #include "hcs_dm_parser.h"
21 #include "metadata_enum_map.h"
22
23 namespace OHOS::Camera {
HcsDeal(const std::string & pathName)24 HcsDeal::HcsDeal(const std::string &pathName)
25 : sPathName(pathName), pDevResIns(nullptr), pRootNode(nullptr)
26 {
27 }
28
~HcsDeal()29 HcsDeal::~HcsDeal()
30 {
31 ReleaseHcsTree();
32 pDevResIns = nullptr;
33 pRootNode = nullptr;
34 }
35
SetHcsPathName(const std::string & pathName)36 void HcsDeal::SetHcsPathName(const std::string &pathName)
37 {
38 sPathName = pathName;
39 }
40
Init()41 RetCode HcsDeal::Init()
42 {
43 ReleaseHcsTree();
44 pDevResIns = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
45 if (pDevResIns == nullptr) {
46 CAMERA_LOGE("get hcs interface failed.");
47 return RC_ERROR;
48 }
49
50 CAMERA_LOGD("pathname = %{public}s", sPathName.c_str());
51 SetHcsBlobPath(sPathName.c_str());
52 pRootNode = pDevResIns->GetRootNode();
53 if (pRootNode == nullptr) {
54 CAMERA_LOGE("GetRootNode failed");
55 return RC_ERROR;
56 }
57 if (pRootNode->name != nullptr) {
58 CAMERA_LOGI("pRootNode = %{public}s", pRootNode->name);
59 }
60
61 DealHcsData();
62
63 return RC_OK;
64 }
65
DealHcsData()66 RetCode HcsDeal::DealHcsData()
67 {
68 const struct DeviceResourceNode *cameraHostConfig =
69 pDevResIns->GetChildNode(pRootNode, "camera_host_config");
70 if (cameraHostConfig == nullptr) {
71 return RC_ERROR;
72 }
73 if (pRootNode->name != nullptr) {
74 CAMERA_LOGI("pRootNode = %{public}s", pRootNode->name);
75 }
76 if (cameraHostConfig->name == nullptr) {
77 CAMERA_LOGW("cameraHostConfig->name is null");
78 return RC_ERROR;
79 }
80 CAMERA_LOGD("cameraHostConfig = %{public}s", cameraHostConfig->name);
81
82 const struct DeviceResourceNode *childNodeTmp = nullptr;
83 DEV_RES_NODE_FOR_EACH_CHILD_NODE(cameraHostConfig, childNodeTmp) {
84 if (childNodeTmp != nullptr && childNodeTmp->name != nullptr) {
85 std::string nodeName = std::string(childNodeTmp->name);
86 CAMERA_LOGI("cameraHostConfig subnode name = %{public}s", nodeName.c_str());
87 if (nodeName.find(std::string("ability"), 0) != std::string::npos) {
88 DealCameraAbility(*childNodeTmp);
89 }
90 }
91 }
92
93 return RC_OK;
94 }
95
DealCameraAbility(const struct DeviceResourceNode & node)96 RetCode HcsDeal::DealCameraAbility(const struct DeviceResourceNode &node)
97 {
98 CAMERA_LOGI("nodeName = %{public}s", node.name);
99
100 const char *cameraId = nullptr;
101 int32_t ret = pDevResIns->GetString(&node, "logicCameraId", &cameraId, nullptr);
102 if (ret != 0) {
103 CAMERA_LOGW("get logic cameraid failed");
104 return RC_ERROR;
105 }
106 CAMERA_LOGD("logic cameraid is %{public}s", cameraId);
107
108 std::vector<std::string> phyCameraIds;
109 (void)DealPhysicsCameraId(node, phyCameraIds);
110 if (!phyCameraIds.empty() && cameraId != nullptr) {
111 cameraIdMap_.insert(std::make_pair(std::string(cameraId), phyCameraIds));
112 }
113
114 const struct DeviceResourceNode *metadataNode = pDevResIns->GetChildNode(&node, "metadata");
115 if (metadataNode == nullptr || cameraId == nullptr) {
116 CAMERA_LOGW("metadataNode is null or cameraId is null");
117 return RC_ERROR;
118 }
119 RetCode rc = DealMetadata(cameraId, *metadataNode);
120 if (rc != RC_OK) {
121 CAMERA_LOGW("deal metadata failed");
122 return RC_ERROR;
123 }
124
125 for (CameraIdMap::iterator itr = cameraIdMap_.begin(); itr != cameraIdMap_.end(); ++itr) {
126 CAMERA_LOGD("cameraId = %{public}s", itr->first.c_str());
127 for (auto &str : itr->second) {
128 CAMERA_LOGD("phyCameraId = %{public}s", str.c_str());
129 }
130 }
131
132 return RC_OK;
133 }
134
DealPhysicsCameraId(const struct DeviceResourceNode & node,std::vector<std::string> & cameraIds)135 RetCode HcsDeal::DealPhysicsCameraId(const struct DeviceResourceNode &node, std::vector<std::string> &cameraIds)
136 {
137 const char *nodeValue = nullptr;
138 int32_t elemNum = pDevResIns->GetElemNum(&node, "physicsCameraIds");
139 for (int i = 0; i < elemNum; i++) {
140 pDevResIns->GetStringArrayElem(&node, "physicsCameraIds", i, &nodeValue, nullptr);
141 cameraIds.push_back(std::string(nodeValue));
142 }
143
144 return RC_OK;
145 }
146
DealMetadata(const std::string & cameraId,const struct DeviceResourceNode & node)147 RetCode HcsDeal::DealMetadata(const std::string &cameraId, const struct DeviceResourceNode &node)
148 {
149 struct DeviceResourceAttr *drAttr = nullptr;
150 DEV_RES_NODE_FOR_EACH_ATTR(&node, drAttr) {
151 }
152
153 CAMERA_LOGD("metadata = %{public}s", node.name);
154 std::string cmpTmp;
155 const int ENTRY_CAPACITY = 30;
156 const int DATA_CAPACITY = 2000;
157 std::shared_ptr<CameraMetadata> metadata = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
158 DealAeAvailableAntiBandingModes(node, metadata);
159 DealAeAvailableModes(node, metadata);
160 DealAvailableAeFpsTargets(node, metadata);
161 DealAeCompensationRange(node, metadata);
162 DealAeCompensationSteps(node, metadata);
163 DealAvailableAwbModes(node, metadata);
164 DealSensitivityRange(node, metadata);
165 DealFaceDetectMode(node, metadata);
166 DealAvailableResultKeys(node, metadata);
167 cameraMetadataMap_.insert(std::make_pair(cameraId, metadata));
168
169 return RC_OK;
170 }
171
DealAeAvailableAntiBandingModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)172 RetCode HcsDeal::DealAeAvailableAntiBandingModes(
173 const struct DeviceResourceNode &metadataNode,
174 std::shared_ptr<CameraMetadata> &metadata)
175 {
176 const char *nodeValue = nullptr;
177 std::vector<uint8_t> aeAvailableAntiBandingModeUint8s;
178 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeAvailableAntiBandingModes");
179 for (int i = 0; i < elemNum; i++) {
180 pDevResIns->GetStringArrayElem(&metadataNode, "aeAvailableAntiBandingModes", i, &nodeValue, nullptr);
181 aeAvailableAntiBandingModeUint8s.push_back(AeAntibandingModeMap[std::string(nodeValue)]);
182 CAMERA_LOGD("aeAvailableAntiBandingModes = %{public}s", nodeValue);
183 }
184 bool ret = metadata->addEntry(OHOS_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
185 aeAvailableAntiBandingModeUint8s.data(), aeAvailableAntiBandingModeUint8s.size());
186 if (!ret) {
187 CAMERA_LOGE("aeAvailableAntiBandingModes add failed");
188 return RC_ERROR;
189 }
190 CAMERA_LOGD("aeAvailableAntiBandingModes add success");
191 return RC_OK;
192 }
193
DealAeAvailableModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)194 RetCode HcsDeal::DealAeAvailableModes(
195 const struct DeviceResourceNode &metadataNode,
196 std::shared_ptr<CameraMetadata> &metadata)
197 {
198 int32_t hcbRet = -1;
199 const char *nodeValue = nullptr;
200 std::vector<uint8_t> aeAvailableModesU8;
201 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeAvailableModes");
202 for (int i = 0; i < elemNum; i++) {
203 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "aeAvailableModes", i, &nodeValue, nullptr);
204 if (hcbRet != 0) {
205 CAMERA_LOGD("get aeAvailableModes failed");
206 continue;
207 }
208 aeAvailableModesU8.push_back(AeModeMap[std::string(nodeValue)]);
209 CAMERA_LOGD("aeAvailableModes = %{public}s", nodeValue);
210 }
211 bool ret = metadata->addEntry(OHOS_CONTROL_AE_AVAILABLE_MODES,
212 aeAvailableModesU8.data(), aeAvailableModesU8.size());
213 if (!ret) {
214 CAMERA_LOGE("aeAvailableModes add failed");
215 return RC_ERROR;
216 }
217 CAMERA_LOGD("aeAvailableModes add success");
218 return RC_OK;
219 }
220
DealAvailableAeFpsTargets(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)221 RetCode HcsDeal::DealAvailableAeFpsTargets(
222 const struct DeviceResourceNode &metadataNode,
223 std::shared_ptr<CameraMetadata> &metadata)
224 {
225 int32_t hcbRet = -1;
226 uint32_t nodeValue;
227 std::vector<int32_t> availableAeFpsTargets;
228 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "availableAeFpsTargets");
229 for (int i = 0; i < elemNum; i++) {
230 hcbRet = pDevResIns->GetUint32ArrayElem(&metadataNode, "availableAeFpsTargets", i, &nodeValue, -1);
231 if (hcbRet != 0) {
232 CAMERA_LOGD("get availableAeFpsTargets failed");
233 continue;
234 }
235 availableAeFpsTargets.push_back(static_cast<int32_t>(nodeValue));
236 CAMERA_LOGD("get availableAeFpsTargets:%{public}d", nodeValue);
237 }
238 bool ret = metadata->addEntry(OHOS_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
239 availableAeFpsTargets.data(), availableAeFpsTargets.size());
240 if (!ret) {
241 CAMERA_LOGE("availableAeFpsTargets add failed");
242 return RC_ERROR;
243 }
244 CAMERA_LOGD("availableAeFpsTargets add success");
245 return RC_OK;
246 }
247
DealAeCompensationRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)248 RetCode HcsDeal::DealAeCompensationRange(
249 const struct DeviceResourceNode &metadataNode,
250 std::shared_ptr<CameraMetadata> &metadata)
251 {
252 std::vector<int32_t> aeCompensationRange;
253 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeCompensationRange");
254 uint32_t nodeValue;
255 for (int i = 0; i < elemNum; i++) {
256 pDevResIns->GetUint32ArrayElem(&metadataNode, "aeCompensationRange", i, &nodeValue, -1);
257 aeCompensationRange.push_back(static_cast<int32_t>(nodeValue));
258 }
259
260 bool ret = metadata->addEntry(OHOS_CONTROL_AE_COMPENSATION_RANGE,
261 aeCompensationRange.data(), aeCompensationRange.size());
262 if (!ret) {
263 CAMERA_LOGD("aeCompensationRange add failed");
264 return RC_ERROR;
265 }
266 CAMERA_LOGI("aeCompensationRange add success");
267 return RC_OK;
268 }
269
DealAeCompensationSteps(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)270 RetCode HcsDeal::DealAeCompensationSteps(
271 const struct DeviceResourceNode &metadataNode,
272 std::shared_ptr<CameraMetadata> &metadata)
273 {
274 constexpr const char *AE_COMPENSATION_STEPS = "aeCompensationSteps";
275 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, AE_COMPENSATION_STEPS);
276 uint32_t nodeValue;
277 camera_rational_t aeCompensationStep;
278 constexpr uint32_t groupLen = 2;
279
280 if (elemNum != groupLen) {
281 CAMERA_LOGE("aeCompensationSteps hcs file configuration error");
282 return RC_ERROR;
283 }
284
285 pDevResIns->GetUint32ArrayElem(&metadataNode, AE_COMPENSATION_STEPS, 0, &nodeValue, -1);
286 aeCompensationStep.numerator = (int32_t)nodeValue;
287 pDevResIns->GetUint32ArrayElem(&metadataNode, AE_COMPENSATION_STEPS, 1, &nodeValue, -1);
288 aeCompensationStep.denominator = (int32_t)nodeValue;
289
290 bool ret = metadata->addEntry(OHOS_CONTROL_AE_COMPENSATION_STEP, &aeCompensationStep, 1);
291 if (!ret) {
292 CAMERA_LOGE("aeCompensationSteps add failed");
293 return RC_ERROR;
294 }
295 CAMERA_LOGD("aeCompensationSteps add success");
296 return RC_OK;
297 }
298
DealAvailableAwbModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)299 RetCode HcsDeal::DealAvailableAwbModes(
300 const struct DeviceResourceNode &metadataNode,
301 std::shared_ptr<CameraMetadata> &metadata)
302 {
303 int32_t hcbRet = -1;
304 const char *nodeValue = nullptr;
305 std::vector<uint8_t> availableAwbModes;
306 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "availableAwbModes");
307 for (int i = 0; i < elemNum; i++) {
308 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "availableAwbModes", i, &nodeValue, nullptr);
309 if (hcbRet != 0) {
310 CAMERA_LOGD("get availableAwbModes failed");
311 continue;
312 }
313 availableAwbModes.push_back(AwbModeMap[std::string(nodeValue)]);
314 }
315 bool ret = metadata->addEntry(OHOS_CONTROL_AWB_AVAILABLE_MODES,
316 availableAwbModes.data(), availableAwbModes.size());
317 if (!ret) {
318 CAMERA_LOGE("availableAwbModes add failed");
319 return RC_ERROR;
320 }
321 CAMERA_LOGD("availableAwbModes add success");
322 return RC_OK;
323 }
324
DealSensitivityRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)325 RetCode HcsDeal::DealSensitivityRange(
326 const struct DeviceResourceNode &metadataNode,
327 std::shared_ptr<CameraMetadata> &metadata)
328 {
329 std::vector<int32_t> sensitivityRange;
330 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "sensitivityRange");
331 CAMERA_LOGD("sensitivityRange elemNum = %{public}d", elemNum);
332 uint32_t nodeValue;
333 for (int i = 0; i < elemNum; i++) {
334 pDevResIns->GetUint32ArrayElem(&metadataNode, "sensitivityRange", i, &nodeValue, -1);
335 sensitivityRange.push_back(static_cast<int32_t>(nodeValue));
336 }
337
338 bool ret = metadata->addEntry(OHOS_SENSOR_INFO_SENSITIVITY_RANGE,
339 sensitivityRange.data(), sensitivityRange.size());
340 if (!ret) {
341 CAMERA_LOGI("sensitivityRange add failed");
342 return RC_ERROR;
343 }
344 CAMERA_LOGD("sensitivityRange add success");
345 return RC_OK;
346 }
347
DealFaceDetectMode(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)348 RetCode HcsDeal::DealFaceDetectMode(
349 const struct DeviceResourceNode &metadataNode,
350 std::shared_ptr<CameraMetadata> &metadata)
351 {
352 const char *pNodeValue = nullptr;
353 int32_t rc = pDevResIns->GetString(&metadataNode, "faceDetectMode", &pNodeValue, nullptr);
354 if (rc != 0) {
355 CAMERA_LOGI("get faceDetectMode failed");
356 return RC_ERROR;
357 }
358
359 bool ret = metadata->addEntry(OHOS_STATISTICS_FACE_DETECT_MODE,
360 &(FaceDetectModeMap[std::string(pNodeValue)]), 1);
361 if (!ret) {
362 CAMERA_LOGI("faceDetectMode add failed");
363 return RC_ERROR;
364 }
365 CAMERA_LOGD("faceDetectMode add success");
366 return RC_OK;
367 }
368
DealAvailableResultKeys(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)369 RetCode HcsDeal::DealAvailableResultKeys(
370 const struct DeviceResourceNode &metadataNode,
371 std::shared_ptr<CameraMetadata> &metadata)
372 {
373 int32_t hcbRet = -1;
374 const char *nodeValue = nullptr;
375 std::vector<int32_t> availableResultKeys;
376 int32_t elemNum = pDevResIns->GetElemNum(
377 &metadataNode, "availableResultKeys");
378 for (int i = 0; i < elemNum; i++) {
379 hcbRet = pDevResIns->GetStringArrayElem(
380 &metadataNode, "availableResultKeys", i, &nodeValue, nullptr);
381 if (hcbRet != 0) {
382 CAMERA_LOGI("get availableResultKeys failed");
383 continue;
384 }
385 availableResultKeys.push_back(MetadataTagMap[std::string(nodeValue)]);
386 }
387 bool ret = metadata->addEntry(OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS,
388 availableResultKeys.data(), availableResultKeys.size());
389 if (!ret) {
390 CAMERA_LOGI("availableResultKeys add failed");
391 return RC_ERROR;
392 }
393 CAMERA_LOGD("availableResultKeys add success");
394 return RC_OK;
395 }
396
GetMetadata(CameraMetadataMap & metadataMap) const397 RetCode HcsDeal::GetMetadata(CameraMetadataMap &metadataMap) const
398 {
399 metadataMap = cameraMetadataMap_;
400 return RC_OK;
401 }
402
GetCameraId(CameraIdMap & cameraIdMap) const403 RetCode HcsDeal::GetCameraId(CameraIdMap &cameraIdMap) const
404 {
405 cameraIdMap = cameraIdMap_;
406 return RC_OK;
407 }
408 } // namespace OHOS::CameraHost