1 /*
2 * Copyright (c) 2023 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 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_host_config.h"
17 #include "hcs_deal.h"
18
19 namespace {
20 #ifdef CAMERA_BUILT_ON_OHOS_LITE
21 const std::string CONFIG_PATH_NAME = HDF_ETC_DIR"/camera/camera_host_config.hcb";
22 #else
23 const std::string CONFIG_PATH_NAME = HDF_CONFIG_DIR"/camera_host_config.hcb";
24 #endif
25 }
26
27 namespace OHOS::Camera {
28 std::map<std::string, CameraId> CameraHostConfig::enumCameraIdMap_ = {
29 { "CAMERA_FIRST", CAMERA_FIRST },
30 { "CAMERA_SECOND", CAMERA_SECOND },
31 { "CAMERA_THIRD", CAMERA_THIRD },
32 { "CAMERA_FOURTH", CAMERA_FOURTH },
33 { "CAMERA_FIFTH", CAMERA_FIFTH },
34 { "CAMERA_SIXTH", CAMERA_SIXTH },
35 };
36 CameraHostConfig *CameraHostConfig::instance_ = nullptr;
37 CameraHostConfig::AutoRelease CameraHostConfig::autoRelease_;
38
GetInstance()39 CameraHostConfig *CameraHostConfig::GetInstance()
40 {
41 if (instance_ == nullptr) {
42 instance_ = new (std::nothrow) CameraHostConfig();
43 if (instance_ != nullptr) {
44 instance_->ReadConfigFile();
45 }
46 }
47 return instance_;
48 }
49
CameraHostConfig()50 CameraHostConfig::CameraHostConfig()
51 {
52 }
53
~CameraHostConfig()54 CameraHostConfig::~CameraHostConfig()
55 {
56 }
57
ReadConfigFile()58 RetCode CameraHostConfig::ReadConfigFile()
59 {
60 std::unique_ptr<HcsDeal> hcsDeal = std::make_unique<HcsDeal>(CONFIG_PATH_NAME);
61 if (hcsDeal == nullptr) {
62 CAMERA_LOGE("make HcsDeal failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
63 return RC_ERROR;
64 }
65
66 RetCode rc = hcsDeal->Init();
67 if (rc != RC_OK) {
68 CAMERA_LOGE("hcs deal init failed. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
69 return rc;
70 }
71
72 rc = hcsDeal->GetCameraId(cameraIdMap_);
73 if (rc != RC_OK || cameraIdMap_.empty()) {
74 CAMERA_LOGE("config camera id not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
75 return rc;
76 }
77
78 rc = hcsDeal->GetMetadata(cameraAbilityMap_);
79 if (rc != RC_OK || cameraAbilityMap_.empty()) {
80 CAMERA_LOGE("config camera ability not found. [pathname = %{public}s]", CONFIG_PATH_NAME.c_str());
81 return rc;
82 }
83
84 return RC_OK;
85 }
86
GetCameraIds(std::vector<std::string> & cameraIds)87 RetCode CameraHostConfig::GetCameraIds(std::vector<std::string> &cameraIds)
88 {
89 auto itr = cameraAbilityMap_.begin();
90 for (; itr != cameraAbilityMap_.end(); itr++) {
91 cameraIds.push_back(itr->first);
92 }
93
94 return RC_OK;
95 }
96
GetPhysicCameraIds(const std::string & lCameraId,std::vector<std::string> & pCameraIds)97 RetCode CameraHostConfig::GetPhysicCameraIds(const std::string &lCameraId, std::vector<std::string> &pCameraIds)
98 {
99 auto itr = cameraIdMap_.find(lCameraId);
100 if (itr != cameraIdMap_.end()) {
101 pCameraIds = itr->second;
102 return RC_OK;
103 }
104 return RC_ERROR;
105 }
106
GetCameraAbility(const std::string & cameraId,std::shared_ptr<CameraAbility> & ability)107 RetCode CameraHostConfig::GetCameraAbility(
108 const std::string &cameraId, std::shared_ptr<CameraAbility> &ability)
109 {
110 auto itr = cameraAbilityMap_.find(cameraId);
111 if (itr != cameraAbilityMap_.end()) {
112 ability = itr->second;
113 return RC_OK;
114 }
115
116 return RC_ERROR;
117 }
118
AddCameraId(const std::string & logicalCameraId,const std::vector<std::string> & physicalCameraIds,const std::shared_ptr<CameraAbility> ability)119 RetCode CameraHostConfig::AddCameraId(const std::string &logicalCameraId,
120 const std::vector<std::string> &physicalCameraIds, const std::shared_ptr<CameraAbility> ability)
121 {
122 auto itrCameraId = cameraIdMap_.find(logicalCameraId);
123 auto itrCameraAbility = cameraAbilityMap_.find(logicalCameraId);
124 if (itrCameraId != cameraIdMap_.end() || itrCameraAbility != cameraAbilityMap_.end()) {
125 CAMERA_LOGE("logicalCameraId %{public}s Add Error", logicalCameraId.c_str());
126 return RC_ERROR;
127 } else {
128 cameraIdMap_.insert(std::make_pair(logicalCameraId, physicalCameraIds));
129 cameraAbilityMap_.insert(std::make_pair(logicalCameraId, ability));
130 return RC_OK;
131 }
132 }
133
SubtractCameraId(const std::vector<std::string> & physicalCameraIds)134 std::string CameraHostConfig::SubtractCameraId(const std::vector<std::string> &physicalCameraIds)
135 {
136 if (physicalCameraIds.size() > 1) {
137 CAMERA_LOGE("physicalCameraIds %{public}d >1 Error", physicalCameraIds.size());
138 }
139 std::string logicalCameraId = ReturnLogicalCameraIdToString(physicalCameraIds[0]);
140 if (logicalCameraId.size() == 0) {
141 return std::string("");
142 }
143 auto itrCameraId = cameraIdMap_.find(logicalCameraId);
144 auto itrCameraAbility = cameraAbilityMap_.find(logicalCameraId);
145 if (itrCameraId == cameraIdMap_.end() || itrCameraAbility == cameraAbilityMap_.end()) {
146 CAMERA_LOGE("physicalCameraIds %{public}s Subtract Error", physicalCameraIds[0].c_str());
147 return std::string("");
148 } else {
149 cameraIdMap_.erase(itrCameraId);
150 cameraAbilityMap_.erase(itrCameraAbility);
151 return logicalCameraId;
152 }
153 }
154
ReturnEnableLogicalCameraId()155 std::string CameraHostConfig::ReturnEnableLogicalCameraId()
156 {
157 std::string logicalCameraId;
158 bool logicalCameraIdStatus = false;
159 for (int32_t id = 1; id < CAMERA_MAX+1; id++) {
160 logicalCameraId = "lcam00";
161 logicalCameraId = logicalCameraId + std::to_string(id);
162 auto itr = cameraIdMap_.find(logicalCameraId);
163 if (itr != cameraIdMap_.end()) {
164 logicalCameraIdStatus = true;
165 break;
166 }
167 }
168 if (logicalCameraIdStatus) {
169 return logicalCameraId;
170 } else {
171 return std::string("");
172 }
173 }
174
GenerateNewLogicalCameraId()175 std::string CameraHostConfig::GenerateNewLogicalCameraId()
176 {
177 for (int32_t id = 1; id < CAMERA_MAX + 1; id++) {
178 std::string logicalCameraId = "lcam00" + std::to_string(id);
179 auto itr = cameraIdMap_.find(logicalCameraId);
180 if (itr == cameraIdMap_.end()) {
181 return logicalCameraId;
182 }
183 }
184 return std::string("");
185 }
186
ReturnPhysicalCameraIdToString(const CameraId & physicalCameraId)187 std::string CameraHostConfig::ReturnPhysicalCameraIdToString(const CameraId &physicalCameraId)
188 {
189 for (auto iter = enumCameraIdMap_.begin(); iter != enumCameraIdMap_.end(); iter++) {
190 if (iter->second == physicalCameraId) {
191 return iter->first;
192 }
193 }
194 return std::string("");
195 }
196
ReturnLogicalCameraIdToString(const std::string & physicalCameraId)197 std::string CameraHostConfig::ReturnLogicalCameraIdToString(const std::string &physicalCameraId)
198 {
199 for (auto iter = cameraIdMap_.begin(); iter != cameraIdMap_.end(); iter++) {
200 if (iter->second[0] == physicalCameraId) {
201 return iter->first;
202 }
203 }
204 return std::string("");
205 }
206
AddUsbCameraId(std::string cameraId)207 void CameraHostConfig::AddUsbCameraId(std::string cameraId)
208 {
209 usbCameraIdVector_.push_back(cameraId);
210 }
211
SearchUsbCameraId(std::string cameraId)212 bool CameraHostConfig::SearchUsbCameraId(std::string cameraId)
213 {
214 auto iter = std::find(usbCameraIdVector_.begin(), usbCameraIdVector_.end(), cameraId);
215 if (iter != usbCameraIdVector_.end()) {
216 return true;
217 }
218 return false;
219 }
220 } // end namespace OHOS::Camera
221