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 <stdlib.h>
19 #include <vector>
20 #include "hcs_dm_parser.h"
21 #include "metadata_enum_map.h"
22 #define STRTOL_BASE 10
23
24 namespace OHOS::Camera {
HcsDeal(const std::string & pathName)25 HcsDeal::HcsDeal(const std::string &pathName) : sPathName(pathName), pDevResIns(nullptr), pRootNode(nullptr) {}
26
~HcsDeal()27 HcsDeal::~HcsDeal()
28 {
29 ReleaseHcsTree();
30 pDevResIns = nullptr;
31 pRootNode = nullptr;
32 }
33
SetHcsPathName(const std::string & pathName)34 void HcsDeal::SetHcsPathName(const std::string &pathName)
35 {
36 sPathName = pathName;
37 }
38
Init()39 RetCode HcsDeal::Init()
40 {
41 ReleaseHcsTree();
42 pDevResIns = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
43 if (pDevResIns == nullptr) {
44 CAMERA_LOGE("get hcs interface failed.");
45 return RC_ERROR;
46 }
47
48 CAMERA_LOGD("pathname = %{public}s", sPathName.c_str());
49 SetHcsBlobPath(sPathName.c_str());
50 pRootNode = pDevResIns->GetRootNode();
51 if (pRootNode == nullptr) {
52 CAMERA_LOGE("GetRootNode failed");
53 return RC_ERROR;
54 }
55 if (pRootNode->name != nullptr) {
56 CAMERA_LOGI("pRootNode = %{public}s", pRootNode->name);
57 }
58
59 DealHcsData();
60
61 return RC_OK;
62 }
63
DealHcsData()64 RetCode HcsDeal::DealHcsData()
65 {
66 const struct DeviceResourceNode *cameraHostConfig = pDevResIns->GetChildNode(pRootNode, "camera_host_config");
67 if (cameraHostConfig == nullptr) {
68 return RC_ERROR;
69 }
70 if (pRootNode->name != nullptr) {
71 CAMERA_LOGI("pRootNode = %{public}s", pRootNode->name);
72 }
73 if (cameraHostConfig->name == nullptr) {
74 CAMERA_LOGW("cameraHostConfig->name is null");
75 return RC_ERROR;
76 }
77 CAMERA_LOGD("cameraHostConfig = %{public}s", cameraHostConfig->name);
78
79 const struct DeviceResourceNode *childNodeTmp = nullptr;
80 DEV_RES_NODE_FOR_EACH_CHILD_NODE(cameraHostConfig, childNodeTmp)
81 {
82 if (childNodeTmp != nullptr && childNodeTmp->name != nullptr) {
83 std::string nodeName = std::string(childNodeTmp->name);
84 CAMERA_LOGI("cameraHostConfig subnode name = %{public}s", nodeName.c_str());
85 if (nodeName.find(std::string("ability"), 0) != std::string::npos) {
86 DealCameraAbility(*childNodeTmp);
87 }
88 }
89 }
90
91 return RC_OK;
92 }
93
DealCameraAbility(const struct DeviceResourceNode & node)94 RetCode HcsDeal::DealCameraAbility(const struct DeviceResourceNode &node)
95 {
96 CAMERA_LOGI("nodeName = %{public}s", node.name);
97
98 const char *cameraId = nullptr;
99 int32_t ret = pDevResIns->GetString(&node, "logicCameraId", &cameraId, nullptr);
100 if (ret != 0) {
101 CAMERA_LOGW("get logic cameraid failed");
102 return RC_ERROR;
103 }
104 CAMERA_LOGD("logic cameraid is %{public}s", cameraId);
105
106 std::vector<std::string> phyCameraIds;
107 (void)DealPhysicsCameraId(node, phyCameraIds);
108 if (!phyCameraIds.empty() && cameraId != nullptr) {
109 cameraIdMap_.insert(std::make_pair(std::string(cameraId), phyCameraIds));
110 }
111
112 const struct DeviceResourceNode *metadataNode = pDevResIns->GetChildNode(&node, "metadata");
113 if (metadataNode == nullptr || cameraId == nullptr) {
114 CAMERA_LOGW("metadataNode is null or cameraId is null");
115 return RC_ERROR;
116 }
117 RetCode rc = DealMetadata(cameraId, *metadataNode);
118 if (rc != RC_OK) {
119 CAMERA_LOGW("deal metadata failed");
120 return RC_ERROR;
121 }
122
123 for (CameraIdMap::iterator itr = cameraIdMap_.begin(); itr != cameraIdMap_.end(); ++itr) {
124 CAMERA_LOGD("cameraId = %{public}s", itr->first.c_str());
125 for (auto &str : itr->second) {
126 CAMERA_LOGD("phyCameraId = %{public}s", str.c_str());
127 }
128 }
129
130 return RC_OK;
131 }
132
DealPhysicsCameraId(const struct DeviceResourceNode & node,std::vector<std::string> & cameraIds)133 RetCode HcsDeal::DealPhysicsCameraId(const struct DeviceResourceNode &node, std::vector<std::string> &cameraIds)
134 {
135 const char *nodeValue = nullptr;
136 int32_t elemNum = pDevResIns->GetElemNum(&node, "physicsCameraIds");
137 for (int i = 0; i < elemNum; i++) {
138 pDevResIns->GetStringArrayElem(&node, "physicsCameraIds", i, &nodeValue, nullptr);
139 cameraIds.push_back(std::string(nodeValue));
140 }
141
142 return RC_OK;
143 }
144
DealMetadata(const std::string & cameraId,const struct DeviceResourceNode & node)145 RetCode HcsDeal::DealMetadata(const std::string &cameraId, const struct DeviceResourceNode &node)
146 {
147 struct DeviceResourceAttr *drAttr = nullptr;
148 DEV_RES_NODE_FOR_EACH_ATTR(&node, drAttr) {}
149
150 CAMERA_LOGD("metadata = %{public}s", node.name);
151 const int ENTRY_CAPACITY = 30;
152 const int DATA_CAPACITY = 2000;
153 std::shared_ptr<CameraMetadata> metadata = std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
154 if (metadata == nullptr) {
155 CAMERA_LOGE("metadata is nullptr cameraId: %{public}s, nodeName: %{public}s",
156 cameraId.c_str(), node.name);
157 return RC_ERROR;
158 }
159 DealAeAvailableAntiBandingModes(node, metadata);
160 DealAeAvailableModes(node, metadata);
161 DealAvailableFpsRange(node, metadata);
162 DealCameraPosition(node, metadata);
163 DealCameraType(node, metadata);
164 DealCameraConnectionType(node, metadata);
165 DealCameraMemoryType(node, metadata);
166 DealCameraFaceDetectMaxNum(node, metadata);
167 DealAeCompensationRange(node, metadata);
168 DealAeCompensationSteps(node, metadata);
169 DealAvailableAwbModes(node, metadata);
170 DealSensitivityRange(node, metadata);
171 DealFaceDetectMode(node, metadata);
172 DealFocalLength(node, metadata);
173 DealAvailableFocusModes(node, metadata);
174 DealAvailableExposureModes(node, metadata);
175 DealAvailableMetereModes(node, metadata);
176 DealAvalialbleFlashModes(node, metadata);
177 DealMirrorSupported(node, metadata);
178 DealAvaliableBasicConfigurations(node, metadata);
179 DealSensorOrientation(node, metadata);
180 DealAvalialbleVideoStabilizationModes(node, metadata);
181 DealAvalialbleFlash(node, metadata);
182 DealAvalialbleAutoFocus(node, metadata);
183 DealZoomRationRange(node, metadata);
184 DealJpegOrientation(node, metadata);
185 DealAvaliableExtendConfigurations(node, metadata);
186 DealJpegQuality(node, metadata);
187 #ifdef V4L2_EMULATOR
188 DealCameraFoldStatus(node, metadata);
189 DealCameraFoldScreenType(node, metadata);
190 #endif
191 cameraMetadataMap_.insert(std::make_pair(cameraId, metadata));
192 return RC_OK;
193 }
194
DealAeAvailableAntiBandingModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)195 RetCode HcsDeal::DealAeAvailableAntiBandingModes(
196 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
197 {
198 const char *nodeValue = nullptr;
199 std::vector<uint8_t> aeAvailableAntiBandingModeUint8s;
200 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeAvailableAntiBandingModes");
201 for (int i = 0; i < elemNum; i++) {
202 pDevResIns->GetStringArrayElem(&metadataNode, "aeAvailableAntiBandingModes", i, &nodeValue, nullptr);
203 aeAvailableAntiBandingModeUint8s.push_back(AeAntibandingModeMap[std::string(nodeValue)]);
204 CAMERA_LOGD("aeAvailableAntiBandingModes = %{public}s", nodeValue);
205 }
206 bool ret = metadata->addEntry(OHOS_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, aeAvailableAntiBandingModeUint8s.data(),
207 aeAvailableAntiBandingModeUint8s.size());
208 if (!ret) {
209 CAMERA_LOGE("aeAvailableAntiBandingModes add failed");
210 return RC_ERROR;
211 }
212 CAMERA_LOGD("aeAvailableAntiBandingModes add success");
213 return RC_OK;
214 }
215
DealAeAvailableModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)216 RetCode HcsDeal::DealAeAvailableModes(
217 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
218 {
219 int32_t hcbRet = -1;
220 const char *nodeValue = nullptr;
221 std::vector<uint8_t> aeAvailableModesU8;
222 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeAvailableModes");
223 for (int i = 0; i < elemNum; i++) {
224 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "aeAvailableModes", i, &nodeValue, nullptr);
225 if (hcbRet != 0) {
226 CAMERA_LOGD("get aeAvailableModes failed");
227 continue;
228 }
229 aeAvailableModesU8.push_back(AeModeMap[std::string(nodeValue)]);
230 CAMERA_LOGD("aeAvailableModes = %{public}s", nodeValue);
231 }
232 bool ret =
233 metadata->addEntry(OHOS_CONTROL_AE_AVAILABLE_MODES, aeAvailableModesU8.data(), aeAvailableModesU8.size());
234 if (!ret) {
235 CAMERA_LOGE("aeAvailableModes add failed");
236 return RC_ERROR;
237 }
238 CAMERA_LOGD("aeAvailableModes add success");
239 return RC_OK;
240 }
241
DealAvailableFpsRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)242 RetCode HcsDeal::DealAvailableFpsRange(
243 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
244 {
245 int32_t hcbRet = -1;
246 uint32_t nodeValue;
247 std::vector<int32_t> availableFpsRange;
248 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "availableFpsRange");
249 constexpr uint32_t groupLen = 2;
250
251 if (elemNum != groupLen) {
252 CAMERA_LOGE("availableFpsRange hcs file configuration error");
253 return RC_ERROR;
254 }
255
256 for (int i = 0; i < elemNum; i++) {
257 hcbRet = pDevResIns->GetUint32ArrayElem(&metadataNode, "availableFpsRange", i, &nodeValue, -1);
258 if (hcbRet != 0) {
259 CAMERA_LOGD("get availableFpsRange failed");
260 continue;
261 }
262 availableFpsRange.push_back(static_cast<int32_t>(nodeValue));
263 CAMERA_LOGD("get availableFpsRange:%{public}d", nodeValue);
264 }
265 bool ret = metadata->addEntry(OHOS_ABILITY_FPS_RANGES, availableFpsRange.data(), availableFpsRange.size());
266 if (!ret) {
267 CAMERA_LOGE("availableFpsRange add failed");
268 return RC_ERROR;
269 }
270 CAMERA_LOGD("availableFpsRange add success");
271 return RC_OK;
272 }
273
DealCameraPosition(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)274 RetCode HcsDeal::DealCameraPosition(
275 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
276 {
277 CAMERA_LOGD("cameraPosition in...");
278 const char *nodeValue = nullptr;
279 uint8_t cameraPosition = 0;
280
281 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraPosition", &nodeValue, nullptr);
282 if (rc != 0 || (nodeValue == nullptr)) {
283 CAMERA_LOGE("get cameraPosition failed");
284 return RC_ERROR;
285 }
286
287 cameraPosition = CameraPositionMap[std::string(nodeValue)];
288 CAMERA_LOGD("cameraPosition = %{public}d", cameraPosition);
289
290 bool ret = metadata->addEntry(
291 OHOS_ABILITY_CAMERA_POSITION, static_cast<const void *>(&cameraPosition), sizeof(cameraPosition));
292 if (!ret) {
293 CAMERA_LOGE("cameraPosition add failed");
294 return RC_ERROR;
295 }
296 CAMERA_LOGD("cameraPosition add success");
297 return RC_OK;
298 }
299
DealCameraType(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)300 RetCode HcsDeal::DealCameraType(
301 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
302 {
303 CAMERA_LOGD("cameraType in...");
304 const char *nodeValue = nullptr;
305 uint8_t cameraType = 0;
306
307 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraType", &nodeValue, nullptr);
308 if (rc != 0 || (nodeValue == nullptr)) {
309 CAMERA_LOGE("get cameraType failed");
310 return RC_ERROR;
311 }
312
313 cameraType = CameraTypeMap[std::string(nodeValue)];
314 CAMERA_LOGD("cameraType = %{public}d", cameraType);
315
316 bool ret = metadata->addEntry(OHOS_ABILITY_CAMERA_TYPE, static_cast<const void *>(&cameraType), sizeof(cameraType));
317 if (!ret) {
318 CAMERA_LOGE("cameraType add failed");
319 return RC_ERROR;
320 }
321 CAMERA_LOGD("cameraType add success");
322 return RC_OK;
323 }
324
DealCameraConnectionType(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)325 RetCode HcsDeal::DealCameraConnectionType(
326 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
327 {
328 CAMERA_LOGD("cameraConnectionType in...");
329 const char *nodeValue = nullptr;
330 uint8_t cameraConnectionType = 0;
331
332 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraConnectionType", &nodeValue, nullptr);
333 if (rc != 0 || (nodeValue == nullptr)) {
334 CAMERA_LOGE("get cameraConnectionType failed");
335 return RC_ERROR;
336 }
337
338 cameraConnectionType = cameraConnectionTypeMap[std::string(nodeValue)];
339 CAMERA_LOGD("cameraConnectionType = %{public}d", cameraConnectionType);
340
341 bool ret = metadata->addEntry(OHOS_ABILITY_CAMERA_CONNECTION_TYPE, static_cast<const void *>(&cameraConnectionType),
342 sizeof(cameraConnectionType));
343 if (!ret) {
344 CAMERA_LOGE("cameraConnectionType add failed");
345 return RC_ERROR;
346 }
347 CAMERA_LOGD("cameraConnectionType add success");
348 return RC_OK;
349 }
350
DealCameraMemoryType(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)351 RetCode HcsDeal::DealCameraMemoryType(
352 const struct DeviceResourceNode &metadataNode,
353 std::shared_ptr<CameraMetadata> &metadata)
354 {
355 CAMERA_LOGD("cameraMemoryType in...");
356 const char *nodeValue = nullptr;
357 uint8_t cameraMemoryType = 0;
358 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraMemoryType", &nodeValue, nullptr);
359 if (rc != 0 || (nodeValue == nullptr)) {
360 CAMERA_LOGE("get cameraMemoryType failed");
361 return RC_ERROR;
362 }
363 auto findIf = CameraMemoryTypeMap.find(std::string(nodeValue));
364 if (findIf == CameraMemoryTypeMap.end()) {
365 CAMERA_LOGE("value of cameraMemoryType err.[%{public}s]", nodeValue);
366 return RC_ERROR;
367 }
368 cameraMemoryType = CameraMemoryTypeMap[std::string(nodeValue)];
369 CAMERA_LOGD("cameraMemoryType = %{public}d", cameraMemoryType);
370 bool ret = metadata->addEntry(OHOS_ABILITY_MEMORY_TYPE,
371 static_cast<const void*>(&cameraMemoryType), sizeof(cameraMemoryType));
372 if (!ret) {
373 CAMERA_LOGE("cameraMemoryType add failed");
374 return RC_ERROR;
375 }
376 CAMERA_LOGD("cameraMemoryType add success");
377 return RC_OK;
378 }
379
DealCameraFaceDetectMaxNum(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)380 RetCode HcsDeal::DealCameraFaceDetectMaxNum(
381 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
382 {
383 const char *pNodeValue = nullptr;
384 uint8_t faceDetectMaxNum;
385
386 int32_t rc = pDevResIns->GetString(&metadataNode, "faceDetectMaxNum", &pNodeValue, nullptr);
387 if (rc != 0 || (pNodeValue == nullptr)) {
388 CAMERA_LOGE("get faceDetectMaxNum failed");
389 return RC_ERROR;
390 }
391
392 faceDetectMaxNum = (uint8_t)strtol(pNodeValue, NULL, STRTOL_BASE);
393 CAMERA_LOGD("faceDetectMaxNum = %{public}f", faceDetectMaxNum);
394
395 bool ret = metadata->addEntry(OHOS_STATISTICS_FACE_DETECT_MAX_NUM, static_cast<const void *>(&faceDetectMaxNum), 1);
396 if (!ret) {
397 CAMERA_LOGE("faceDetectMaxNum add failed");
398 return RC_ERROR;
399 }
400 CAMERA_LOGD("faceDetectMaxNum add success");
401 return RC_OK;
402 }
403
DealAeCompensationRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)404 RetCode HcsDeal::DealAeCompensationRange(
405 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
406 {
407 std::vector<int32_t> aeCompensationRange;
408 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "aeCompensationRange");
409 uint32_t nodeValue;
410 for (int i = 0; i < elemNum; i++) {
411 pDevResIns->GetUint32ArrayElem(&metadataNode, "aeCompensationRange", i, &nodeValue, -1);
412 aeCompensationRange.push_back(static_cast<int32_t>(nodeValue));
413 }
414
415 bool ret =
416 metadata->addEntry(OHOS_ABILITY_AE_COMPENSATION_RANGE, aeCompensationRange.data(), aeCompensationRange.size());
417 if (!ret) {
418 CAMERA_LOGD("aeCompensationRange add failed");
419 return RC_ERROR;
420 }
421 CAMERA_LOGI("aeCompensationRange add success");
422 return RC_OK;
423 }
424
DealAeCompensationSteps(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)425 RetCode HcsDeal::DealAeCompensationSteps(
426 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
427 {
428 constexpr const char *AE_COMPENSATION_STEPS = "aeCompensationSteps";
429 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, AE_COMPENSATION_STEPS);
430 uint32_t nodeValue;
431 camera_rational_t aeCompensationStep;
432 constexpr uint32_t groupLen = 2;
433
434 if (elemNum != groupLen) {
435 CAMERA_LOGE("aeCompensationSteps hcs file configuration error");
436 return RC_ERROR;
437 }
438
439 pDevResIns->GetUint32ArrayElem(&metadataNode, AE_COMPENSATION_STEPS, 0, &nodeValue, -1);
440 aeCompensationStep.numerator = (int32_t)nodeValue;
441 pDevResIns->GetUint32ArrayElem(&metadataNode, AE_COMPENSATION_STEPS, 1, &nodeValue, -1);
442 aeCompensationStep.denominator = (int32_t)nodeValue;
443
444 bool ret = metadata->addEntry(OHOS_ABILITY_AE_COMPENSATION_STEP, &aeCompensationStep, 1);
445 if (!ret) {
446 CAMERA_LOGE("aeCompensationSteps add failed");
447 return RC_ERROR;
448 }
449 CAMERA_LOGD("aeCompensationSteps add success");
450 return RC_OK;
451 }
452
DealAvailableAwbModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)453 RetCode HcsDeal::DealAvailableAwbModes(
454 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
455 {
456 int32_t hcbRet = -1;
457 const char *nodeValue = nullptr;
458 std::vector<uint8_t> availableAwbModes;
459 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "availableAwbModes");
460 for (int i = 0; i < elemNum; i++) {
461 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "availableAwbModes", i, &nodeValue, nullptr);
462 if (hcbRet != 0) {
463 CAMERA_LOGD("get availableAwbModes failed");
464 continue;
465 }
466 availableAwbModes.push_back(AwbModeMap[std::string(nodeValue)]);
467 }
468 bool ret = metadata->addEntry(OHOS_CONTROL_AWB_AVAILABLE_MODES, availableAwbModes.data(), availableAwbModes.size());
469 if (!ret) {
470 CAMERA_LOGE("availableAwbModes add failed");
471 return RC_ERROR;
472 }
473 CAMERA_LOGD("availableAwbModes add success");
474 return RC_OK;
475 }
476
DealSensitivityRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)477 RetCode HcsDeal::DealSensitivityRange(
478 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
479 {
480 std::vector<int32_t> sensitivityRange;
481 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "sensitivityRange");
482 CAMERA_LOGD("sensitivityRange elemNum = %{public}d", elemNum);
483 uint32_t nodeValue;
484 for (int i = 0; i < elemNum; i++) {
485 pDevResIns->GetUint32ArrayElem(&metadataNode, "sensitivityRange", i, &nodeValue, -1);
486 sensitivityRange.push_back(static_cast<int32_t>(nodeValue));
487 }
488
489 bool ret = metadata->addEntry(OHOS_SENSOR_INFO_SENSITIVITY_RANGE, sensitivityRange.data(), sensitivityRange.size());
490 if (!ret) {
491 CAMERA_LOGI("sensitivityRange add failed");
492 return RC_ERROR;
493 }
494 CAMERA_LOGD("sensitivityRange add success");
495 return RC_OK;
496 }
497
DealFaceDetectMode(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)498 RetCode HcsDeal::DealFaceDetectMode(
499 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
500 {
501 const char *pNodeValue = nullptr;
502 int32_t rc = pDevResIns->GetString(&metadataNode, "faceDetectMode", &pNodeValue, nullptr);
503 if (rc != 0) {
504 CAMERA_LOGI("get faceDetectMode failed");
505 return RC_ERROR;
506 }
507
508 bool ret = metadata->addEntry(OHOS_STATISTICS_FACE_DETECT_MODE, &(FaceDetectModeMap[std::string(pNodeValue)]), 1);
509 if (!ret) {
510 CAMERA_LOGI("faceDetectMode add failed");
511 return RC_ERROR;
512 }
513 CAMERA_LOGD("faceDetectMode add success");
514 return RC_OK;
515 }
516
DealAvailableResultKeys(const struct DeviceResourceNode & metadataNode,std::shared_ptr<CameraMetadata> & metadata)517 RetCode HcsDeal::DealAvailableResultKeys(
518 const struct DeviceResourceNode &metadataNode, std::shared_ptr<CameraMetadata> &metadata)
519 {
520 int32_t hcbRet = -1;
521 const char *nodeValue = nullptr;
522 std::vector<int32_t> availableResultKeys;
523 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "availableResultKeys");
524 for (int i = 0; i < elemNum; i++) {
525 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "availableResultKeys", i, &nodeValue, nullptr);
526 if (hcbRet != 0) {
527 CAMERA_LOGI("get availableResultKeys failed");
528 continue;
529 }
530 availableResultKeys.push_back(MetadataTagMap[std::string(nodeValue)]);
531 }
532 bool ret = metadata->addEntry(
533 OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, availableResultKeys.data(), availableResultKeys.size());
534 if (!ret) {
535 CAMERA_LOGI("availableResultKeys add failed");
536 return RC_ERROR;
537 }
538 CAMERA_LOGD("availableResultKeys add success");
539 return RC_OK;
540 }
541
DealFocalLength(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)542 RetCode HcsDeal::DealFocalLength(
543 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
544 {
545 const char *pNodeValue = nullptr;
546 float focalLength;
547
548 int32_t rc = pDevResIns->GetString(&metadataNode, "focalLength", &pNodeValue, nullptr);
549 if (rc != 0 || (pNodeValue == nullptr)) {
550 CAMERA_LOGE("get focalLength failed");
551 return RC_ERROR;
552 }
553
554 focalLength = (float)strtol(pNodeValue, NULL, STRTOL_BASE);
555 CAMERA_LOGD("focalLength = %{public}f", focalLength);
556
557 bool ret = metadata->addEntry(OHOS_ABILITY_FOCAL_LENGTH, static_cast<const void *>(&focalLength), 1);
558 if (!ret) {
559 CAMERA_LOGE("focalLength add failed");
560 return RC_ERROR;
561 }
562 CAMERA_LOGD("focalLength add success");
563 return RC_OK;
564 }
565
DealAvailableFocusModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)566 RetCode HcsDeal::DealAvailableFocusModes(
567 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
568 {
569 uint8_t hcbRet = 0;
570 const char *nodeValue = nullptr;
571 std::vector<uint8_t> focusAvailableModes;
572
573 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "focusAvailableModes");
574 CAMERA_LOGD("elemNum = %{public}d", elemNum);
575
576 for (int i = 0; i < elemNum; i++) {
577 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "focusAvailableModes", i, &nodeValue, nullptr);
578 if (hcbRet != 0) {
579 CAMERA_LOGE("get focusAvailableModes failed");
580 continue;
581 }
582 CAMERA_LOGD("nodeValue = %{public}s", nodeValue);
583 focusAvailableModes.push_back(FocusModeMap[std::string(nodeValue)]);
584 }
585 bool ret = metadata->addEntry(OHOS_ABILITY_FOCUS_MODES, focusAvailableModes.data(), focusAvailableModes.size());
586 if (!ret) {
587 CAMERA_LOGE("focusAvailableModes add failed");
588 return RC_ERROR;
589 }
590 CAMERA_LOGD("focusAvailableModes add success");
591 return RC_OK;
592 }
593
DealAvailableExposureModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)594 RetCode HcsDeal::DealAvailableExposureModes(
595 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
596 {
597 uint8_t hcbRet = 0;
598 const char *nodeValue = nullptr;
599 std::vector<uint8_t> exposureModeResult;
600
601 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "exposureAvailableModes");
602 CAMERA_LOGD("elemNum = %{public}d", elemNum);
603
604 for (int i = 0; i < elemNum; i++) {
605 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "exposureAvailableModes", i, &nodeValue, nullptr);
606 if (hcbRet != 0) {
607 CAMERA_LOGE("get exposureModeResult failed");
608 continue;
609 }
610 CAMERA_LOGD("nodeValue = %{public}s", nodeValue);
611 exposureModeResult.push_back(ExposureModeMap[std::string(nodeValue)]);
612 }
613 bool ret = metadata->addEntry(OHOS_ABILITY_EXPOSURE_MODES, exposureModeResult.data(), exposureModeResult.size());
614 if (!ret) {
615 CAMERA_LOGE("exposureModeResult add failed");
616 return RC_ERROR;
617 }
618 CAMERA_LOGD("exposureModeResult add success");
619 return RC_OK;
620 }
621
DealAvailableMetereModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)622 RetCode HcsDeal::DealAvailableMetereModes(
623 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
624 {
625 uint8_t hcbRet = 0;
626 const char *nodeValue = nullptr;
627 std::vector<uint8_t> meterModeResult;
628
629 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "meterAvailableModes");
630 CAMERA_LOGD("elemNum = %{public}d", elemNum);
631
632 for (int i = 0; i < elemNum; i++) {
633 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "meterAvailableModes", i, &nodeValue, nullptr);
634 if (hcbRet != 0) {
635 CAMERA_LOGE("get meterModeResult failed");
636 continue;
637 }
638 CAMERA_LOGD("nodeValue = %{public}s", nodeValue);
639 meterModeResult.push_back(meterModeMap[std::string(nodeValue)]);
640 }
641 bool ret = metadata->addEntry(OHOS_ABILITY_METER_MODES, meterModeResult.data(), meterModeResult.size());
642 if (!ret) {
643 CAMERA_LOGE("meterModeResult add failed");
644 return RC_ERROR;
645 }
646 CAMERA_LOGD("meterModeResult add success");
647 return RC_OK;
648 }
649
DealAvalialbleFlashModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)650 RetCode HcsDeal::DealAvalialbleFlashModes(
651 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
652 {
653 uint8_t hcbRet = 0;
654 const char *nodeValue = nullptr;
655 std::vector<uint8_t> flashAvailableModeUint8s;
656
657 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "flashAvailableModes");
658 CAMERA_LOGD("elemNum = %{public}d", elemNum);
659
660 for (int i = 0; i < elemNum; i++) {
661 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "flashAvailableModes", i, &nodeValue, nullptr);
662 if (hcbRet != 0) {
663 CAMERA_LOGE("get flashAvailableModes failed");
664 continue;
665 }
666 CAMERA_LOGD("nodeValue = %{public}s", nodeValue);
667 flashAvailableModeUint8s.push_back(FlashModeMap[std::string(nodeValue)]);
668 }
669 bool ret =
670 metadata->addEntry(OHOS_ABILITY_FLASH_MODES, flashAvailableModeUint8s.data(), flashAvailableModeUint8s.size());
671 if (!ret) {
672 CAMERA_LOGE("flashAvailableModes add failed");
673 return RC_ERROR;
674 }
675 CAMERA_LOGD("flashAvailableModes add success");
676 return RC_OK;
677 }
678
DealMirrorSupported(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)679 RetCode HcsDeal::DealMirrorSupported(
680 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
681 {
682 const char *nodeValue = nullptr;
683 uint8_t mirrorSupportU8;
684
685 int32_t rc = pDevResIns->GetString(&metadataNode, "mirrorSupported", &nodeValue, nullptr);
686 if (rc != 0 || (nodeValue == nullptr)) {
687 CAMERA_LOGE("get mirrorSupported failed");
688 return RC_ERROR;
689 }
690
691 mirrorSupportU8 = mirrorMap[std::string(nodeValue)];
692 CAMERA_LOGD("mirrorSupportU8 = %{public}d", mirrorSupportU8);
693
694 bool ret =
695 metadata->addEntry(OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED, static_cast<const void *>(&mirrorSupportU8), 1);
696 if (!ret) {
697 CAMERA_LOGE("mirrorSupported add failed");
698 return RC_ERROR;
699 }
700 CAMERA_LOGD("mirrorSupported add success");
701 return RC_OK;
702 }
703
DealAvaliableBasicConfigurations(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)704 RetCode HcsDeal::DealAvaliableBasicConfigurations(
705 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
706 {
707 uint32_t nodeValue;
708 std::vector<int32_t> basicConfigAvaliableInt32s;
709
710 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "basicAvailableConfigurations");
711 CAMERA_LOGD("elemNum = %{public}d", elemNum);
712
713 constexpr int STREAM_INFO_ITEM_LENGTH = 3;
714 for (int i = 0; i < elemNum; i++) {
715 pDevResIns->GetUint32ArrayElem(&metadataNode, "basicAvailableConfigurations", i, &nodeValue, -1);
716 CAMERA_LOGD("nodeValue = %{public}d", nodeValue);
717
718 if (i % STREAM_INFO_ITEM_LENGTH == 0) {
719 basicConfigAvaliableInt32s.push_back(formatArray[static_cast<int32_t>(nodeValue) - 1]);
720 } else {
721 basicConfigAvaliableInt32s.push_back(static_cast<int32_t>(nodeValue));
722 }
723 }
724
725 bool ret = metadata->addEntry(OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS, basicConfigAvaliableInt32s.data(),
726 basicConfigAvaliableInt32s.size());
727 if (!ret) {
728 CAMERA_LOGD("basicAvailableConfigurations add failed");
729 return RC_ERROR;
730 }
731 CAMERA_LOGI("basicAvailableConfigurations add success");
732 return RC_OK;
733 }
734
DealSensorOrientation(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)735 RetCode HcsDeal::DealSensorOrientation(
736 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
737 {
738 const char *nodeValue = nullptr;
739 int32_t sensorOrientation;
740
741 int32_t rc = pDevResIns->GetString(&metadataNode, "sensorOrientationSupported", &nodeValue, nullptr);
742 if (rc != 0 || (nodeValue == nullptr)) {
743 CAMERA_LOGE("get sensorOrientationSupported failed");
744 return RC_ERROR;
745 }
746
747 sensorOrientation = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE);
748 CAMERA_LOGI("sensorOrientation = %{public}d", sensorOrientation);
749
750 constexpr uint32_t DATA_COUNT = 1;
751 bool ret = metadata->addEntry(OHOS_SENSOR_ORIENTATION, static_cast<const void *>(&sensorOrientation), DATA_COUNT);
752 if (!ret) {
753 CAMERA_LOGE("sensorOrientationSupported add failed");
754 return RC_ERROR;
755 }
756 CAMERA_LOGI("sensorOrientationSupported add success");
757 return RC_OK;
758 }
759
DealAvalialbleVideoStabilizationModes(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)760 RetCode HcsDeal::DealAvalialbleVideoStabilizationModes(
761 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
762 {
763 uint8_t hcbRet = 0;
764 const char *nodeValue = nullptr;
765 std::vector<uint8_t> videoStabilizationAvailableModes;
766
767 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "videoStabilizationAvailableModes");
768 CAMERA_LOGI("elemNum = %{public}d", elemNum);
769 for (int i = 0; i < elemNum; i++) {
770 hcbRet =
771 pDevResIns->GetStringArrayElem(&metadataNode, "videoStabilizationAvailableModes", i, &nodeValue, nullptr);
772 if (hcbRet != 0) {
773 CAMERA_LOGE("get videoStabilizationAvailableModes failed");
774 continue;
775 }
776 CAMERA_LOGI("nodeValue = %{public}s", nodeValue);
777 videoStabilizationAvailableModes.push_back(videoStabilizationMap[std::string(nodeValue)]);
778 }
779 bool ret = metadata->addEntry(OHOS_ABILITY_VIDEO_STABILIZATION_MODES, videoStabilizationAvailableModes.data(),
780 videoStabilizationAvailableModes.size());
781 if (!ret) {
782 CAMERA_LOGE("videoStabilizationAvailableModes add failed");
783 return RC_ERROR;
784 }
785 CAMERA_LOGI("videoStabilizationAvailableModes add success");
786 return RC_OK;
787 }
788
DealAvalialbleFlash(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)789 RetCode HcsDeal::DealAvalialbleFlash(
790 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
791 {
792 const char *nodeValue = nullptr;
793 uint8_t flashAvailable;
794
795 int32_t rc = pDevResIns->GetString(&metadataNode, "flashAvailable", &nodeValue, nullptr);
796 if (rc != 0 || (nodeValue == nullptr)) {
797 CAMERA_LOGE("get flashAvailable failed");
798 return RC_ERROR;
799 }
800
801 if (flashAvailableMap.count(std::string(nodeValue)) == 0) {
802 CAMERA_LOGE("flashAvailable invalid argument");
803 return RC_ERROR;
804 }
805 flashAvailable = flashAvailableMap[std::string(nodeValue)];
806 CAMERA_LOGI("flashAvailable = %{public}d", flashAvailable);
807
808 constexpr uint32_t DATA_COUNT = 1;
809 bool ret = metadata->addEntry(OHOS_ABILITY_FLASH_AVAILABLE, static_cast<const void *>(&flashAvailable), DATA_COUNT);
810 if (!ret) {
811 CAMERA_LOGE("flashAvailable add failed");
812 return RC_ERROR;
813 }
814 CAMERA_LOGI("flashAvailable add success");
815 return RC_OK;
816 }
817
DealAvalialbleAutoFocus(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)818 RetCode HcsDeal::DealAvalialbleAutoFocus(
819 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
820 {
821 uint8_t hcbRet = 0;
822 const char *nodeValue = nullptr;
823 std::vector<uint8_t> afAvailable;
824
825 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "afAvailable");
826 CAMERA_LOGI("elemNum = %{public}d", elemNum);
827 for (int i = 0; i < elemNum; i++) {
828 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "afAvailable", i, &nodeValue, nullptr);
829 if (hcbRet != 0) {
830 CAMERA_LOGE("get afAvailable failed");
831 continue;
832 }
833 CAMERA_LOGI("nodeValue = %{public}s", nodeValue);
834 if (AfModeMap.count(std::string(nodeValue)) == 0) {
835 CAMERA_LOGE("afAvailable invalid argument");
836 return RC_ERROR;
837 }
838 afAvailable.push_back(AfModeMap[std::string(nodeValue)]);
839 }
840 bool ret = metadata->addEntry(OHOS_CONTROL_AF_AVAILABLE_MODES, afAvailable.data(), afAvailable.size());
841 if (!ret) {
842 CAMERA_LOGE("afAvailable add failed");
843 return RC_ERROR;
844 }
845 CAMERA_LOGI("afAvailable add success");
846 return RC_OK;
847 }
848
DealZoomRationRange(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)849 RetCode HcsDeal::DealZoomRationRange(
850 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
851 {
852 uint8_t hcbRet = 0;
853 const char *nodeValue = nullptr;
854 std::vector<float> zoomRatioRange;
855
856 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "zoomRatioRange");
857 CAMERA_LOGI("elemNum = %{public}d", elemNum);
858
859 constexpr uint32_t GROUP_LEN = 2;
860 if (elemNum % GROUP_LEN != 0) {
861 CAMERA_LOGE("zoomRatioRange hcs file configuration error");
862 return RC_ERROR;
863 }
864
865 for (int i = 0; i < elemNum; i++) {
866 hcbRet = pDevResIns->GetStringArrayElem(&metadataNode, "zoomRatioRange", i, &nodeValue, nullptr);
867 if (hcbRet != 0) {
868 CAMERA_LOGE("get zoomRatioRange failed");
869 continue;
870 }
871 CAMERA_LOGI("nodeValue = %{public}s", nodeValue);
872 zoomRatioRange.push_back((float)strtol(nodeValue, NULL, STRTOL_BASE));
873 }
874
875 for (int i = 0; i < elemNum - 1;) {
876 if (zoomRatioRange[i + 1] < zoomRatioRange[i]) {
877 CAMERA_LOGE("zoomRatioRange invalid argument");
878 return RC_ERROR;
879 }
880 constexpr uint32_t INDEX_INTERVAL = 2;
881 i = i + INDEX_INTERVAL;
882 }
883
884 bool ret = metadata->addEntry(OHOS_ABILITY_ZOOM_RATIO_RANGE, zoomRatioRange.data(), zoomRatioRange.size());
885 if (!ret) {
886 CAMERA_LOGE("zoomRatioRange add failed");
887 return RC_ERROR;
888 }
889 CAMERA_LOGI("zoomRatioRange add success");
890 return RC_OK;
891 }
892
DealJpegOrientation(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)893 RetCode HcsDeal::DealJpegOrientation(
894 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
895 {
896 const char *nodeValue = nullptr;
897 int32_t jpegOrientation;
898
899 int32_t rc = pDevResIns->GetString(&metadataNode, "jpegOrientation", &nodeValue, nullptr);
900 if (rc != 0 || (nodeValue == nullptr)) {
901 CAMERA_LOGE("get jpegOrientation failed");
902 return RC_ERROR;
903 }
904
905 jpegOrientation = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE);
906 CAMERA_LOGI("jpegOrientation = %{public}d", jpegOrientation);
907
908 if (jpegOrientation != OHOS_CAMERA_JPEG_ROTATION_0 && jpegOrientation != OHOS_CAMERA_JPEG_ROTATION_90 &&
909 jpegOrientation != OHOS_CAMERA_JPEG_ROTATION_180 && jpegOrientation != OHOS_CAMERA_JPEG_ROTATION_270) {
910 CAMERA_LOGE("jpegOrientation invalid argument");
911 return RC_ERROR;
912 }
913
914 constexpr uint32_t DATA_COUNT = 1;
915 bool ret = metadata->addEntry(OHOS_JPEG_ORIENTATION, static_cast<const void *>(&jpegOrientation), DATA_COUNT);
916 if (!ret) {
917 CAMERA_LOGE("jpegOrientation add failed");
918 return RC_ERROR;
919 }
920 CAMERA_LOGI("jpegOrientation add success");
921 return RC_OK;
922 }
923
DealJpegQuality(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)924 RetCode HcsDeal::DealJpegQuality(
925 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
926 {
927 const char *nodeValue = nullptr;
928 int32_t jpegQuality;
929
930 int32_t rc = pDevResIns->GetString(&metadataNode, "jpegQuality", &nodeValue, nullptr);
931 if (rc != 0 || (nodeValue == nullptr)) {
932 CAMERA_LOGE("get jpegQuality failed");
933 return RC_ERROR;
934 }
935
936 jpegQuality = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE);
937 CAMERA_LOGI("jpegQuality = %{public}d", jpegQuality);
938
939 if (jpegQuality != OHOS_CAMERA_JPEG_LEVEL_LOW && jpegQuality != OHOS_CAMERA_JPEG_LEVEL_MIDDLE &&
940 jpegQuality != OHOS_CAMERA_JPEG_LEVEL_HIGH) {
941 CAMERA_LOGE("jpegQuality invalid argument");
942 return RC_ERROR;
943 }
944
945 constexpr uint32_t DATA_COUNT = 1;
946 bool ret = metadata->addEntry(OHOS_JPEG_QUALITY, static_cast<const void *>(&jpegQuality), DATA_COUNT);
947 if (!ret) {
948 CAMERA_LOGE("jpegQuality add failed");
949 return RC_ERROR;
950 }
951 CAMERA_LOGI("jpegQuality add success");
952 return RC_OK;
953 }
954
GetMetadata(CameraMetadataMap & metadataMap) const955 RetCode HcsDeal::GetMetadata(CameraMetadataMap &metadataMap) const
956 {
957 metadataMap = cameraMetadataMap_;
958 return RC_OK;
959 }
960
GetCameraId(CameraIdMap & cameraIdMap) const961 RetCode HcsDeal::GetCameraId(CameraIdMap &cameraIdMap) const
962 {
963 cameraIdMap = cameraIdMap_;
964 return RC_OK;
965 }
966
DealAvaliableExtendConfigurations(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)967 RetCode HcsDeal::DealAvaliableExtendConfigurations(
968 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
969 {
970 int32_t elemNum = pDevResIns->GetElemNum(&metadataNode, "extendAvailableConfigurations");
971 CAMERA_LOGD("elemNum = %{public}d", elemNum);
972 if (elemNum <= 0) {
973 CAMERA_LOGD("elemNum <= 0");
974 return RC_ERROR;
975 }
976
977 int hcbRet;
978 uint32_t nodeValue;
979 std::vector<int32_t> extendConfigAvaliableInt32s;
980
981 for (int i = 0; i < elemNum; i++) {
982 hcbRet = pDevResIns->GetUint32ArrayElem(&metadataNode, "extendAvailableConfigurations", i, &nodeValue, -1);
983 if (hcbRet != 0 && nodeValue != UINT32_MAX) {
984 CAMERA_LOGE("get extendAvailableConfigurations failed");
985 continue;
986 }
987 extendConfigAvaliableInt32s.push_back(static_cast<int32_t>(nodeValue));
988 CAMERA_LOGD("nodeValue = %{public}u", nodeValue);
989 }
990
991 bool ret = metadata->addEntry(OHOS_ABILITY_STREAM_AVAILABLE_EXTEND_CONFIGURATIONS,
992 extendConfigAvaliableInt32s.data(), extendConfigAvaliableInt32s.size());
993 if (!ret) {
994 CAMERA_LOGD("extendAvailableConfigurations add failed");
995 return RC_ERROR;
996 }
997 CAMERA_LOGI("extendAvailableConfigurations add success");
998 return RC_OK;
999 }
1000
1001 #ifdef V4L2_EMULATOR
DealCameraFoldStatus(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)1002 RetCode HcsDeal::DealCameraFoldStatus(
1003 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
1004 {
1005 const char *nodeValue = nullptr;
1006 int32_t cameraFoldStatus;
1007
1008 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraFoldStatus", &nodeValue, nullptr);
1009 if (rc != 0 || (nodeValue == nullptr)) {
1010 CAMERA_LOGE("get cameraFoldStatus failed");
1011 return RC_ERROR;
1012 }
1013
1014 cameraFoldStatus = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE);
1015 CAMERA_LOGI("cameraFoldStatus = %{public}d", cameraFoldStatus);
1016
1017 constexpr uint32_t DATA_COUNT = 1;
1018 bool ret = metadata->addEntry(OHOS_ABILITY_CAMERA_FOLD_STATUS,
1019 static_cast<const void *>(&cameraFoldStatus), DATA_COUNT);
1020 if (!ret) {
1021 CAMERA_LOGE("cameraFoldStatus add failed");
1022 return RC_ERROR;
1023 }
1024 CAMERA_LOGI("cameraFoldStatus add success");
1025 return RC_OK;
1026 }
1027
DealCameraFoldScreenType(const struct DeviceResourceNode & metadataNode,std::shared_ptr<Camera::CameraMetadata> & metadata)1028 RetCode HcsDeal::DealCameraFoldScreenType(
1029 const struct DeviceResourceNode &metadataNode, std::shared_ptr<Camera::CameraMetadata> &metadata)
1030 {
1031 const char *nodeValue = nullptr;
1032 int32_t cameraFoldScreenType;
1033
1034 int32_t rc = pDevResIns->GetString(&metadataNode, "cameraFoldScreenType", &nodeValue, nullptr);
1035 if (rc != 0 || (nodeValue == nullptr)) {
1036 CAMERA_LOGE("get cameraFoldScreenType failed");
1037 return RC_ERROR;
1038 }
1039
1040 cameraFoldScreenType = (int32_t)strtol(nodeValue, NULL, STRTOL_BASE);
1041 CAMERA_LOGI("cameraFoldScreenType = %{public}d", cameraFoldScreenType);
1042
1043 constexpr uint32_t DATA_COUNT = 1;
1044 bool ret = metadata->addEntry(OHOS_ABILITY_CAMERA_FOLDSCREEN_TYPE,
1045 static_cast<const void *>(&cameraFoldScreenType), DATA_COUNT);
1046 if (!ret) {
1047 CAMERA_LOGE("cameraFoldScreenType add failed");
1048 return RC_ERROR;
1049 }
1050 CAMERA_LOGI("cameraFoldScreenType add success");
1051 return RC_OK;
1052 }
1053 #endif
1054 } // namespace OHOS::Camera
1055