• 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 <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