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 deviceManager->SetHotplugDevCallBack([this](const std::shared_ptr<CameraAbility> &meta,
80 const bool &status, const CameraId &cameraId) {
81 CameraStatus cameraStatus = status ? AVAILABLE : UN_AVAILABLE;
82 OnCameraStatus(cameraId, cameraStatus, meta);
83 });
84 return NO_ERROR;
85 }
86
SetCallback(const OHOS::sptr<ICameraHostCallback> & callback)87 CamRetCode CameraHostImpl::SetCallback(const OHOS::sptr<ICameraHostCallback> &callback)
88 {
89 DFX_LOCAL_HITRACE_BEGIN;
90
91 if (callback == nullptr) {
92 CAMERA_LOGW("host callback is null.");
93 return INVALID_ARGUMENT;
94 }
95
96 cameraHostCallback_ = callback;
97
98 DFX_LOCAL_HITRACE_END;
99 return NO_ERROR;
100 }
101
GetCameraIds(std::vector<std::string> & cameraIds)102 CamRetCode CameraHostImpl::GetCameraIds(std::vector<std::string> &cameraIds)
103 {
104 DFX_LOCAL_HITRACE_BEGIN;
105
106 CameraHostConfig *config = CameraHostConfig::GetInstance();
107 if (config == nullptr) {
108 return INVALID_ARGUMENT;
109 }
110 RetCode rc = config->GetCameraIds(cameraIds);
111 if (rc != RC_OK) {
112 return INVALID_ARGUMENT;
113 }
114
115 DFX_LOCAL_HITRACE_END;
116 return NO_ERROR;
117 }
118
GetCameraAbility(const std::string & cameraId,std::shared_ptr<CameraAbility> & ability)119 CamRetCode CameraHostImpl::GetCameraAbility(const std::string &cameraId,
120 std::shared_ptr<CameraAbility> &ability)
121 {
122 DFX_LOCAL_HITRACE_BEGIN;
123 CameraHostConfig *config = CameraHostConfig::GetInstance();
124 if (config == nullptr) {
125 return INVALID_ARGUMENT;
126 }
127 RetCode rc = config->GetCameraAbility(cameraId, ability);
128 if (rc != RC_OK) {
129 return INVALID_ARGUMENT;
130 }
131 DFX_LOCAL_HITRACE_END;
132 return NO_ERROR;
133 }
134
OpenCamera(const std::string & cameraId,const OHOS::sptr<ICameraDeviceCallback> & callback,OHOS::sptr<ICameraDevice> & device)135 CamRetCode CameraHostImpl::OpenCamera(const std::string &cameraId,
136 const OHOS::sptr<ICameraDeviceCallback> &callback,
137 OHOS::sptr<ICameraDevice> &device)
138 {
139 CAMERA_LOGD("OpenCamera entry");
140 DFX_LOCAL_HITRACE_BEGIN;
141 if (CameraIdInvalid(cameraId) != RC_OK || callback == nullptr) {
142 CAMERA_LOGW("open camera id is empty or callback is null.");
143 return INVALID_ARGUMENT;
144 }
145
146 auto itr = cameraDeviceMap_.find(cameraId);
147 if (itr == cameraDeviceMap_.end()) {
148 CAMERA_LOGE("camera device not found.");
149 return INSUFFICIENT_RESOURCES;
150 }
151 CAMERA_LOGD("OpenCamera cameraId find success.");
152
153 std::shared_ptr<CameraDeviceImpl> cameraDevice =
154 std::static_pointer_cast<CameraDeviceImpl>(itr->second);
155 if (cameraDevice == nullptr) {
156 CAMERA_LOGE("camera device is null.");
157 return INSUFFICIENT_RESOURCES;
158 }
159
160 CamRetCode ret = cameraDevice->SetCallback(callback);
161 CHECK_IF_NOT_EQUAL_RETURN_VALUE(ret, NO_ERROR, ret);
162
163 CameraHostConfig *config = CameraHostConfig::GetInstance();
164 CHECK_IF_PTR_NULL_RETURN_VALUE(config, INVALID_ARGUMENT);
165
166 std::vector<std::string> phyCameraIds;
167 RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds);
168 if (rc != RC_OK) {
169 CAMERA_LOGE("get physic cameraId failed.");
170 return DEVICE_ERROR;
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 #ifdef CAMERA_BUILT_ON_OHOS_LITE
181 deviceBackup_[cameraId] = cameraDevice;
182 #else
183 deviceBackup_[cameraId] = cameraDevice.get();
184 #endif
185 }
186 device = deviceBackup_[cameraId];
187 cameraDevice->SetStatus(true);
188 CAMERA_LOGD("open camera success.");
189 DFX_LOCAL_HITRACE_END;
190 return NO_ERROR;
191 }
192
CameraIdInvalid(const std::string & cameraId)193 RetCode CameraHostImpl::CameraIdInvalid(const std::string &cameraId)
194 {
195 if (cameraId.empty()) {
196 return RC_ERROR;
197 }
198
199 CameraHostConfig *config = CameraHostConfig::GetInstance();
200 if (config == nullptr) {
201 return RC_ERROR;
202 }
203 std::vector<std::string> cameraIds;
204 RetCode ret = config->GetCameraIds(cameraIds);
205 if (ret != RC_OK || cameraIds.empty()) {
206 return RC_ERROR;
207 }
208
209 auto itr = std::find(cameraIds.begin(), cameraIds.end(), cameraId);
210 if (itr == cameraIds.end()) {
211 return RC_ERROR;
212 }
213
214 return RC_OK;
215 }
216
CameraPowerUp(const std::string & cameraId,const std::vector<std::string> & phyCameraIds)217 RetCode CameraHostImpl::CameraPowerUp(const std::string &cameraId,
218 const std::vector<std::string> &phyCameraIds)
219 {
220 FlashlightStatus flashlightStatus = FLASHLIGHT_UNAVAILABLE;
221 RetCode rc = SetFlashlight(phyCameraIds, false, flashlightStatus);
222 if (rc != RC_OK) {
223 CAMERA_LOGW("flash light close failed. [cameraId = %{public}s]", cameraId.c_str());
224 }
225 if (cameraHostCallback_ != nullptr) {
226 cameraHostCallback_->OnFlashlightStatus(cameraId, flashlightStatus);
227 }
228
229 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
230 if (deviceManager == nullptr) {
231 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
232 return RC_ERROR;
233 }
234
235 for (auto &phyCameraId : phyCameraIds) {
236 auto itr = CameraHostConfig::enumCameraIdMap_.find(phyCameraId);
237 if (itr == CameraHostConfig::enumCameraIdMap_.end()) {
238 CAMERA_LOGW("config phyCameraId undefined in device manager.");
239 continue;
240 }
241 rc = deviceManager->PowerUp(itr->second);
242 if (rc != RC_OK) {
243 CAMERA_LOGE("physic camera powerup failed [phyCameraId = %{public}s].", phyCameraId.c_str());
244 return RC_ERROR;
245 }
246 }
247 CAMERA_LOGD("camera powerup success.");
248
249 return RC_OK;
250 }
251
CameraPowerDown(const std::vector<std::string> & phyCameraIds)252 void CameraHostImpl::CameraPowerDown(const std::vector<std::string> &phyCameraIds)
253 {
254 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
255 if (deviceManager == nullptr) {
256 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
257 return;
258 }
259
260 RetCode ret = RC_OK;
261 for (auto &cameraId : phyCameraIds) {
262 auto itr = CameraHostConfig::enumCameraIdMap_.find(cameraId);
263 if (itr == CameraHostConfig::enumCameraIdMap_.end()) {
264 CAMERA_LOGW("config cameraId undefined in device manager.");
265 continue;
266 }
267
268 ret = deviceManager->PowerDown(itr->second);
269 if (ret != RC_OK) {
270 CAMERA_LOGE("physic camera powerdown failed [cameraId = %{public}s].", cameraId.c_str());
271 continue;
272 }
273 CAMERA_LOGD("[cameraId = %{public}s] powerdown success.", cameraId.c_str());
274 }
275 }
276
SetFlashlight(const std::string & cameraId,bool & isEnable)277 CamRetCode CameraHostImpl::SetFlashlight(const std::string &cameraId, bool &isEnable)
278 {
279 DFX_LOCAL_HITRACE_BEGIN;
280 if (CameraIdInvalid(cameraId) != RC_OK) {
281 CAMERA_LOGE("camera id is not found [cameraId = %{public}s].", cameraId.c_str());
282 return INVALID_ARGUMENT;
283 }
284
285 for (auto &itr : cameraDeviceMap_) {
286 if (itr.second->IsOpened()) {
287 CAMERA_LOGE("camera id opend [cameraId = %{public}s].", itr.first.c_str());
288 return METHOD_NOT_SUPPORTED;
289 }
290 }
291
292 CameraHostConfig *config = CameraHostConfig::GetInstance();
293 if (config == nullptr) {
294 return INVALID_ARGUMENT;
295 }
296 std::vector<std::string> phyCameraIds;
297 RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds);
298 if (rc != RC_OK) {
299 CAMERA_LOGE("get physic cameraIds failed.");
300 return DEVICE_ERROR;
301 }
302
303 FlashlightStatus flashlightStatus = FLASHLIGHT_UNAVAILABLE;
304 rc = SetFlashlight(phyCameraIds, isEnable, flashlightStatus);
305 if (rc == RC_OK && flashlightStatus != FLASHLIGHT_UNAVAILABLE) {
306 if (cameraHostCallback_ != nullptr) {
307 cameraHostCallback_->OnFlashlightStatus(cameraId, flashlightStatus);
308 }
309 return NO_ERROR;
310 } else {
311 return DEVICE_ERROR;
312 }
313 DFX_LOCAL_HITRACE_END;
314 }
315
SetFlashlight(const std::vector<std::string> & phyCameraIds,bool isEnable,FlashlightStatus & flashlightStatus)316 RetCode CameraHostImpl::SetFlashlight(const std::vector<std::string> &phyCameraIds,
317 bool isEnable, FlashlightStatus &flashlightStatus)
318 {
319 std::shared_ptr<IDeviceManager> deviceManager = IDeviceManager::GetInstance();
320 (void)phyCameraIds;
321 if (deviceManager == nullptr) {
322 CAMERA_LOGW("device manager is null [dm name MpiDeviceManager].");
323 return RC_ERROR;
324 }
325
326 RetCode rc = deviceManager->SetFlashlight(FLASH_TORCH, isEnable);
327 if (rc == RC_OK) {
328 if (isEnable) {
329 flashlightStatus = FLASHLIGHT_OFF;
330 } else {
331 flashlightStatus = FLASHLIGHT_ON;
332 }
333 }
334
335 return rc;
336 }
337
OnCameraStatus(CameraId cameraId,CameraStatus status,const std::shared_ptr<CameraAbility> ability)338 void CameraHostImpl::OnCameraStatus(CameraId cameraId,
339 CameraStatus status, const std::shared_ptr<CameraAbility> ability)
340 {
341 CameraHostConfig *config = CameraHostConfig::GetInstance();
342 if (config == nullptr) {
343 CAMERA_LOGE("config is nullptr");
344 return;
345 }
346 if (cameraId < 0 && cameraId > CAMERA_MAX) {
347 CAMERA_LOGE("dvice manager callback cameraId error.");
348 return;
349 }
350 std::vector<std::string> physicalCameraIds;
351 std::string physicalCameraId = config->ReturnPhysicalCameraIdToString(cameraId);
352 if (physicalCameraId.size() == 0) {
353 CAMERA_LOGE("config cameraId undefined in device manager.");
354 return;
355 }
356 physicalCameraIds.push_back(physicalCameraId);
357
358 if (status == AVAILABLE) {
359 std::string logicalCameraId = config->ReturnEnableLogicalCameraId();
360 RetCode rc = config->AddCameraId(logicalCameraId, physicalCameraIds, ability);
361 if (rc == RC_OK && logicalCameraId.size() > 0) {
362 CAMERA_LOGI("add physicalCameraIds %{public}d logicalCameraId %{public}s",
363 static_cast<int>(cameraId), logicalCameraId.c_str());
364 if (cameraHostCallback_ != nullptr) {
365 cameraHostCallback_->OnCameraStatus(logicalCameraId, status);
366 }
367 }
368 std::shared_ptr<CameraDevice> cameraDevice =
369 CameraDevice::CreateCameraDevice(logicalCameraId);
370 if (cameraDevice != nullptr) {
371 cameraDeviceMap_[logicalCameraId] = cameraDevice;
372 }
373 } else {
374 std::string logicalCameraId =
375 config->ReturnLogicalCameraIdToString(physicalCameraIds[0]);
376 if (logicalCameraId.size() > 0) {
377 CAMERA_LOGI("physicalCameraIds %{public}d logicalCameraId %{public}s",
378 static_cast<int>(cameraId), logicalCameraId.c_str());
379 if (cameraHostCallback_ != nullptr) {
380 cameraHostCallback_->OnCameraStatus(logicalCameraId, status);
381 }
382 }
383 logicalCameraId = config->SubtractCameraId(physicalCameraIds);
384 }
385 }
386 } // end namespace OHOS::Camera
387