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