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 * 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_impl.h"
17 #include <algorithm>
18 #include "idevice_manager.h"
19 #include "camera_host_config.h"
20 #include "camera_device_impl.h"
21
22 #include "idevice_manager.h"
23 #include "icamera_host_callback.h"
24 #include "icamera_device.h"
25
26 namespace OHOS::Camera {
27
CameraHostImpl()28 CameraHostImpl::CameraHostImpl()
29 {
30 CAMERA_LOGD("ctor, instance = %{public}p", this);
31 }
32
~CameraHostImpl()33 CameraHostImpl::~CameraHostImpl()
34 {
35 CAMERA_LOGD("dtor, instance = %{public}p", this);
36 }
37
Init()38 CamRetCode CameraHostImpl::Init()
39 {
40 std::shared_ptr<IDeviceManager> deviceManager =
41 IDeviceManager::GetInstance();
42 if (deviceManager == nullptr) {
43 return INVALID_ARGUMENT;
44 }
45
46 RetCode ret = RC_OK;
47 ret = deviceManager->Init();
48 if (ret == RC_ERROR) {
49 return INVALID_ARGUMENT;
50 }
51
52 CameraHostConfig *config = CameraHostConfig::GetInstance();
53 if (config == nullptr) {
54 return INVALID_ARGUMENT;
55 }
56
57 std::vector<std::string> cameraIds;
58 RetCode rc = config->GetCameraIds(cameraIds);
59 if (rc != RC_OK) {
60 CAMERA_LOGE("host get camera id failed.");
61 return INVALID_ARGUMENT;
62 }
63
64 for (auto &cameraId : cameraIds) {
65 std::vector<std::string> phyCameraIds;
66 rc = config->GetPhysicCameraIds(cameraId, phyCameraIds);
67 if (rc != RC_OK) {
68 continue;
69 }
70 std::shared_ptr<CameraDevice> cameraDevice =
71 CameraDevice::CreateCameraDevice(cameraId);
72 if (cameraDevice != nullptr) {
73 cameraDeviceMap_.insert(std::make_pair(cameraId, cameraDevice));
74 } else {
75 CAMERA_LOGW("host implement new device failed [cameraid = %{public}s].", cameraId.c_str());
76 }
77 }
78
79 return NO_ERROR;
80 }
81
SetCallback(const OHOS::sptr<ICameraHostCallback> & callback)82 CamRetCode CameraHostImpl::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback)
83 {
84 DFX_LOCAL_HITRACE_BEGIN;
85
86 if (callback == nullptr) {
87 CAMERA_LOGW("host callback is null.");
88 return INVALID_ARGUMENT;
89 }
90
91 cameraHostCallback_ = callback;
92
93 DFX_LOCAL_HITRACE_END;
94 return NO_ERROR;
95 }
96
GetCameraIds(std::vector<std::string> & cameraIds)97 CamRetCode CameraHostImpl::GetCameraIds(std::vector<std::string> &cameraIds)
98 {
99 DFX_LOCAL_HITRACE_BEGIN;
100
101 CameraHostConfig *config = CameraHostConfig::GetInstance();
102 if (config == nullptr) {
103 return INVALID_ARGUMENT;
104 }
105 RetCode rc = config->GetCameraIds(cameraIds);
106 if (rc != RC_OK) {
107 return INVALID_ARGUMENT;
108 }
109
110 DFX_LOCAL_HITRACE_END;
111 return NO_ERROR;
112 }
113
GetCameraAbility(const std::string & cameraId,std::shared_ptr<CameraAbility> & ability)114 CamRetCode CameraHostImpl::GetCameraAbility(const std::string &cameraId,
115 std::shared_ptr<CameraAbility> &ability)
116 {
117 DFX_LOCAL_HITRACE_BEGIN;
118 CameraHostConfig *config = CameraHostConfig::GetInstance();
119 if (config == nullptr) {
120 return INVALID_ARGUMENT;
121 }
122 RetCode rc = config->GetCameraAbility(cameraId, ability);
123 if (rc != RC_OK) {
124 return INVALID_ARGUMENT;
125 }
126 DFX_LOCAL_HITRACE_END;
127 return NO_ERROR;
128 }
129
OpenCamera(const std::string & cameraId,const OHOS::sptr<ICameraDeviceCallback> & callback,OHOS::sptr<ICameraDevice> & device)130 CamRetCode CameraHostImpl::OpenCamera(const std::string &cameraId,
131 const OHOS::sptr<ICameraDeviceCallback> &callback,
132 OHOS::sptr<ICameraDevice> &device)
133 {
134 CAMERA_LOGD("OpenCamera entry");
135 DFX_LOCAL_HITRACE_BEGIN;
136 if (CameraIdInvalid(cameraId) != RC_OK || callback == nullptr) {
137 CAMERA_LOGW("open camera id is empty or callback is null.");
138 return INVALID_ARGUMENT;
139 }
140
141 auto itr = cameraDeviceMap_.find(cameraId);
142 if (itr == cameraDeviceMap_.end()) {
143 CAMERA_LOGE("camera device not found.");
144 return INSUFFICIENT_RESOURCES;
145 }
146 CAMERA_LOGD("OpenCamera cameraId find success.");
147
148 std::shared_ptr<CameraDeviceImpl> cameraDevice =
149 std::static_pointer_cast<CameraDeviceImpl>(itr->second);
150 if (cameraDevice == nullptr) {
151 CAMERA_LOGE("camera device is null.");
152 return INSUFFICIENT_RESOURCES;
153 }
154
155 CamRetCode ret = cameraDevice->SetCallback(callback);
156 if (ret != NO_ERROR) {
157 CAMERA_LOGW("set camera device callback faild.");
158 return ret;
159 }
160
161 CameraHostConfig *config = CameraHostConfig::GetInstance();
162 if (config == nullptr) {
163 return INVALID_ARGUMENT;
164 }
165 std::vector<std::string> phyCameraIds;
166 RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds);
167 if (rc != RC_OK) {
168 CAMERA_LOGE("get physic cameraId failed.");
169 return DEVICE_ERROR;
170 }
171
172 if (CameraPowerUp(cameraId, phyCameraIds) != RC_OK) {
173 CAMERA_LOGE("camera powerup failed.");
174 CameraPowerDown(phyCameraIds);
175 return DEVICE_ERROR;
176 }
177
178 auto sptrDevice = deviceBackup_.find(cameraId);
179 if (sptrDevice == deviceBackup_.end()) {
180 deviceBackup_[cameraId] = cameraDevice.get();
181 }
182 device = deviceBackup_[cameraId];
183
184 cameraDevice->SetStatus(true);
185 CAMERA_LOGD("open camera success.");
186 DFX_LOCAL_HITRACE_END;
187 return NO_ERROR;
188 }
189
CameraIdInvalid(const std::string & cameraId)190 RetCode CameraHostImpl::CameraIdInvalid(const std::string &cameraId)
191 {
192 if (cameraId.empty()) {
193 return RC_ERROR;
194 }
195
196 CameraHostConfig *config = CameraHostConfig::GetInstance();
197 if (config == nullptr) {
198 return RC_ERROR;
199 }
200 std::vector<std::string> cameraIds;
201 RetCode ret = config->GetCameraIds(cameraIds);
202 if (ret != RC_OK || cameraIds.empty()) {
203 return RC_ERROR;
204 }
205
206 auto itr = std::find(cameraIds.begin(), cameraIds.end(), cameraId);
207 if (itr == cameraIds.end()) {
208 return RC_ERROR;
209 }
210
211 return RC_OK;
212 }
213
CameraPowerUp(const std::string & cameraId,const std::vector<std::string> & phyCameraIds)214 RetCode CameraHostImpl::CameraPowerUp(const std::string &cameraId,
215 const std::vector<std::string> &phyCameraIds)
216 {
217 FlashlightStatus flashlightStatus = FLASHLIGHT_UNAVAILABLE;
218 RetCode rc = SetFlashlight(phyCameraIds, false, flashlightStatus);
219 if (rc != RC_OK) {
220 CAMERA_LOGW("flash light close failed. [cameraId = %{public}s]", cameraId.c_str());
221 }
222 if (cameraHostCallback_ != nullptr) {
223 cameraHostCallback_->OnFlashlightStatus(cameraId, flashlightStatus);
224 }
225
226 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
227 if (deviceManager == nullptr) {
228 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
229 return RC_ERROR;
230 }
231
232 for (auto &phyCameraId : phyCameraIds) {
233 auto itr = CameraHostConfig::enumCameraIdMap_.find(phyCameraId);
234 if (itr == CameraHostConfig::enumCameraIdMap_.end()) {
235 CAMERA_LOGW("config phyCameraId undefined in device manager.");
236 continue;
237 }
238 rc = deviceManager->PowerUp(itr->second);
239 if (rc != RC_OK) {
240 CAMERA_LOGE("physic camera powerup failed [phyCameraId = %{public}s].", phyCameraId.c_str());
241 return RC_ERROR;
242 }
243 }
244 CAMERA_LOGD("camera powerup success.");
245
246 return RC_OK;
247 }
248
CameraPowerDown(const std::vector<std::string> & phyCameraIds)249 void CameraHostImpl::CameraPowerDown(const std::vector<std::string> &phyCameraIds)
250 {
251 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
252 if (deviceManager == nullptr) {
253 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
254 return;
255 }
256
257 RetCode ret = RC_OK;
258 for (auto &cameraId : phyCameraIds) {
259 auto itr = CameraHostConfig::enumCameraIdMap_.find(cameraId);
260 if (itr == CameraHostConfig::enumCameraIdMap_.end()) {
261 CAMERA_LOGW("config cameraId undefined in device manager.");
262 continue;
263 }
264
265 ret = deviceManager->PowerDown(itr->second);
266 if (ret != RC_OK) {
267 CAMERA_LOGE("physic camera powerdown failed [cameraId = %{public}s].", cameraId.c_str());
268 continue;
269 }
270 CAMERA_LOGD("[cameraId = %{public}s] powerdown success.", cameraId.c_str());
271 }
272 }
273
SetFlashlight(const std::string & cameraId,bool & isEnable)274 CamRetCode CameraHostImpl::SetFlashlight(const std::string &cameraId, bool &isEnable)
275 {
276 DFX_LOCAL_HITRACE_BEGIN;
277 if (CameraIdInvalid(cameraId) != RC_OK) {
278 CAMERA_LOGE("camera id is not found [cameraId = %{public}s].", cameraId.c_str());
279 return INVALID_ARGUMENT;
280 }
281
282 for (auto &itr : cameraDeviceMap_) {
283 if (itr.second->IsOpened()) {
284 CAMERA_LOGE("camera id opend [cameraId = %{public}s].", itr.first.c_str());
285 return METHOD_NOT_SUPPORTED;
286 }
287 }
288
289 CameraHostConfig *config = CameraHostConfig::GetInstance();
290 if (config == nullptr) {
291 return INVALID_ARGUMENT;
292 }
293 std::vector<std::string> phyCameraIds;
294 RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds);
295 if (rc != RC_OK) {
296 CAMERA_LOGE("get physic cameraIds failed.");
297 return DEVICE_ERROR;
298 }
299
300 FlashlightStatus flashlightStatus = FLASHLIGHT_UNAVAILABLE;
301 rc = SetFlashlight(phyCameraIds, isEnable, flashlightStatus);
302 if (rc == RC_OK && flashlightStatus != FLASHLIGHT_UNAVAILABLE) {
303 return NO_ERROR;
304 } else {
305 if (cameraHostCallback_ != nullptr) {
306 cameraHostCallback_->OnFlashlightStatus(cameraId, flashlightStatus);
307 }
308 return DEVICE_ERROR;
309 }
310 DFX_LOCAL_HITRACE_END;
311 }
312
SetFlashlight(const std::vector<std::string> & phyCameraIds,bool isEnable,FlashlightStatus & flashlightStatus)313 RetCode CameraHostImpl::SetFlashlight(const std::vector<std::string> &phyCameraIds,
314 bool isEnable, FlashlightStatus &flashlightStatus)
315 {
316 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
317 if (deviceManager == nullptr) {
318 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
319 return RC_ERROR;
320 }
321
322 RetCode rc = deviceManager->SetFlashlight(FLASH_TORCH, isEnable);
323 if (rc == RC_OK) {
324 if (isEnable) {
325 flashlightStatus = FLASHLIGHT_OFF;
326 } else {
327 flashlightStatus = FLASHLIGHT_ON;
328 }
329 }
330
331 return rc;
332 }
333
OnCameraStatusCallBack(const std::shared_ptr<CameraStandard::CameraMetadata> & meta,const bool & status,const CameraId & cameraId)334 void CameraHostImpl::OnCameraStatusCallBack(const std::shared_ptr<CameraStandard::CameraMetadata> &meta,
335 const bool &status, const CameraId &cameraId)
336 {
337 CameraStatus cameraStatus;
338 if (status) {
339 cameraStatus = AVAILABLE;
340 } else {
341 cameraStatus = UN_AVAILABLE;
342 }
343 OnCameraStatus(cameraId, cameraStatus, meta);
344 }
345
OnCameraStatus(CameraId cameraId,CameraStatus status,const std::shared_ptr<CameraAbility> ability)346 void CameraHostImpl::OnCameraStatus(CameraId cameraId,
347 CameraStatus status, const std::shared_ptr<CameraAbility> ability)
348 {
349 CameraHostConfig *config = CameraHostConfig::GetInstance();
350 if (config == nullptr) {
351 CAMERA_LOGE("config is nullptr");
352 return;
353 }
354 if (cameraId < 0 && cameraId > CAMERA_MAX) {
355 CAMERA_LOGE("dvice manager callback cameraId error.");
356 return;
357 }
358 std::vector<std::string> physicalCameraIds;
359 std::string logicalCameraId;
360 if (status == AVAILABLE) {
361 logicalCameraId = config->ReturnEnableLogicalCameraId();
362 std::string physicalCameraId = config->ReturnPhysicalCameraIdToString(cameraId);
363 if (physicalCameraId.size() == 0) {
364 CAMERA_LOGE("config cameraId undefined in device manager.");
365 return;
366 }
367 physicalCameraIds.push_back(physicalCameraId);
368 RetCode rc = config->AddCameraId(logicalCameraId, physicalCameraIds, ability);
369 if (rc == RC_OK && logicalCameraId.size() > 0) {
370 CAMERA_LOGI("add physicalCameraIds %{public}d logicalCameraId %{public}s",
371 static_cast<int>(cameraId), logicalCameraId.c_str());
372 if (cameraHostCallback_ != nullptr) {
373 cameraHostCallback_->OnCameraStatus(logicalCameraId, status);
374 }
375 } else {
376 CAMERA_LOGE("add camera id %{public}d Error", static_cast<int>(cameraId));
377 return;
378 }
379 } else {
380 std::vector<std::string> physicalCameraIds;
381 std::string physicalCameraId = config->ReturnPhysicalCameraIdToString(cameraId);
382 if (physicalCameraId.size() == 0) {
383 CAMERA_LOGE("config cameraId undefined in device manager.");
384 return;
385 }
386 physicalCameraIds.push_back(physicalCameraId);
387 logicalCameraId = config->SubtractCameraId(physicalCameraIds);
388 if (logicalCameraId.size() > 0) {
389 CAMERA_LOGI("Subtract physicalCameraIds %{public}d logicalCameraId %{public}s",
390 static_cast<int>(cameraId), logicalCameraId.c_str());
391 if (cameraHostCallback_ != nullptr) {
392 cameraHostCallback_->OnCameraStatus(logicalCameraId, status);
393 }
394 } else {
395 CAMERA_LOGE("Subtract camera id %{public}d Error", static_cast<int>(cameraId));
396 return;
397 }
398 }
399 }
400 } // end namespace OHOS::Camera
401