• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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