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