• 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 "mpi_device_manager.h"
17 #include "venc_manager.h"
18 #include "vi_manager.h"
19 #include "vo_manager.h"
20 #include "vpss_manager.h"
21 #include "project_hardware.h"
22 
23 namespace OHOS {
24 namespace Camera {
IMPLEMENT_DEVICEMANAGER(MpiDeviceManager)25 IMPLEMENT_DEVICEMANAGER(MpiDeviceManager)
26 MpiDeviceManager::MpiDeviceManager()
27     :sysInitFlag(false)
28 {
29 }
30 
~MpiDeviceManager()31 MpiDeviceManager::~MpiDeviceManager()
32 {
33 }
34 
Init()35 RetCode MpiDeviceManager::Init()
36 {
37     RetCode rc = RC_ERROR;
38 
39     for (auto iter = hardware.cbegin(); iter != hardware.cend(); iter++) {
40         hardwareList_.push_back(*iter);
41     }
42 
43     rc = CreateManager();
44     if (rc != RC_OK) {
45         CAMERA_LOGE("CreateManager fail");
46         return rc;
47     }
48 
49     sysObject_ = ISysObject::CreateSysObject();
50     if (sysObject_ == nullptr) {
51         CAMERA_LOGE("Create SysObject fail");
52         return RC_ERROR;
53     }
54 
55     rc = sysObject_->InitSys();
56     if (rc != RC_OK) {
57         CAMERA_LOGE("InitSys fail");
58     }
59 
60     return rc;
61 }
62 
GetCameraId()63 std::vector<CameraId> MpiDeviceManager::GetCameraId()
64 {
65     std::vector<CameraId> sensor_list;
66     for (auto iter = hardwareList_.cbegin(); iter != hardwareList_.cend(); iter++) {
67         if ((*iter).controllerId == DM_C_SENSOR) {
68             sensor_list.push_back((*iter).cameraId);
69         }
70     }
71     return sensor_list;
72 };
73 
PowerUp(CameraId cameraId)74 RetCode MpiDeviceManager::PowerUp(CameraId cameraId)
75 {
76     if (sysInitFlag == false) {
77         sysObject_->StartSys();
78         sysInitFlag = true;
79     }
80     if (CheckCameraIdList(cameraId) == false) {
81         return RC_ERROR;
82     }
83     RetCode rc = RC_OK;
84     for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
85         rc = (*iter)->PowerUp(cameraId);
86         if (rc == RC_ERROR) {
87             return RC_ERROR;
88         }
89     }
90     return rc;
91 }
92 
PowerDown(CameraId cameraId)93 RetCode MpiDeviceManager::PowerDown(CameraId cameraId)
94 {
95     RetCode rc = RC_OK;
96     if (CheckCameraIdList(cameraId) == false) {
97         return RC_ERROR;
98     }
99     for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
100         rc = (*iter)->PowerDown(cameraId);
101         if (rc == RC_ERROR) {
102             return RC_ERROR;
103         }
104     }
105     if (sysObject_ != nullptr) {
106         sysObject_->StopSys();
107         sysInitFlag = false;
108     }
109     return rc;
110 }
111 
GetSensor(CameraId cameraId)112 std::shared_ptr<ISensor> MpiDeviceManager::GetSensor(CameraId cameraId)
113 {
114     for (auto iter = hardwareList_.cbegin(); iter != hardwareList_.cend(); iter++) {
115         if ((*iter).controllerId == DM_C_SENSOR && (*iter).managerId == DM_M_VI && (*iter).cameraId == cameraId) {
116             return (std::static_pointer_cast<ViManager>(GetManager(DM_M_VI)))->GetSensor((*iter).hardwareName);
117         }
118     }
119     return nullptr;
120 }
121 
GetManager(ManagerId managerId)122 std::shared_ptr<IManager> MpiDeviceManager::GetManager(ManagerId managerId)
123 {
124     for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
125         if ((*iter)->GetManagerId() == managerId) {
126             return (*iter);
127         }
128     }
129     return nullptr;
130 }
CreateManager()131 RetCode MpiDeviceManager::CreateManager()
132 {
133     RetCode rc = RC_OK;
134     for (auto iter = hardwareList_.cbegin(); iter != hardwareList_.cend(); iter++) {
135         if (CheckManagerList((*iter).managerId) == false) {
136             std::shared_ptr<IManager> manager = nullptr;
137             switch ((*iter).managerId) {
138                 case DM_M_VENC:
139                     manager = std::make_shared<VencManager>(DM_M_VENC);
140                     CHECK_IF_PTR_NULL_RETURN_VALUE(manager, RC_ERROR);
141                     rc = CreateController(manager, DM_M_VENC);
142                     break;
143                 case DM_M_VI:
144                     manager = std::make_shared<ViManager>(DM_M_VI);
145                     CHECK_IF_PTR_NULL_RETURN_VALUE(manager, RC_ERROR);
146                     rc = CreateController(manager, DM_M_VI);
147                     break;
148                 case DM_M_VO:
149                     manager = std::make_shared<VoManager>(DM_M_VO);
150                     CHECK_IF_PTR_NULL_RETURN_VALUE(manager, RC_ERROR);
151                     rc = CreateController(manager, DM_M_VO);
152                     break;
153                 case DM_M_VPSS:
154                     manager = std::make_shared<VpssManager>(DM_M_VPSS);
155                     CHECK_IF_PTR_NULL_RETURN_VALUE(manager, RC_ERROR);
156                     rc = CreateController(manager, DM_M_VPSS);
157                     break;
158                 default:
159                     break;
160             }
161             managerList_.push_back(manager);
162             manager = nullptr;
163         }
164         if (rc == RC_ERROR) {
165             return RC_ERROR;
166         }
167     }
168     return rc;
169 }
DestroyManager()170 RetCode MpiDeviceManager::DestroyManager()
171 {
172     return RC_OK;
173 }
GetController(ManagerId managerId,ControllerId controllerId)174 std::shared_ptr<IController> MpiDeviceManager::GetController(ManagerId managerId, ControllerId controllerId)
175 {
176     for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
177         if ((*iter)->GetManagerId() == managerId) {
178             return (*iter)->GetController(controllerId);
179         }
180     }
181     return nullptr;
182 }
CreateController(std::shared_ptr<IManager> manager,ManagerId managerId)183 RetCode MpiDeviceManager::CreateController(std::shared_ptr<IManager> manager, ManagerId managerId)
184 {
185     RetCode rc = RC_OK;
186     for (auto iter = hardwareList_.cbegin(); iter != hardwareList_.cend(); iter++) {
187         if ((*iter).managerId == managerId) {
188             switch (managerId) {
189                 case DM_M_VENC:
190                     rc = (std::static_pointer_cast<VencManager>(manager))
191                              ->CreateController((*iter).controllerId, (*iter).hardwareName);
192                     break;
193                 case DM_M_VI:
194                     rc = (std::static_pointer_cast<ViManager>(manager))
195                              ->CreateController((*iter).controllerId, (*iter).hardwareName);
196                     break;
197                 case DM_M_VO:
198                     rc = (std::static_pointer_cast<VoManager>(manager))
199                              ->CreateController((*iter).controllerId, (*iter).hardwareName);
200                     break;
201                 case DM_M_VPSS:
202                     rc = (std::static_pointer_cast<VpssManager>(manager))
203                              ->CreateController((*iter).controllerId, (*iter).hardwareName);
204                     break;
205                 default:
206                     break;
207             }
208         }
209         if (rc == RC_ERROR) {
210             return RC_ERROR;
211         }
212     }
213     return rc;
214 }
DestroyController()215 RetCode MpiDeviceManager::DestroyController()
216 {
217     return RC_OK;
218 }
219 
CheckCameraIdList(CameraId cameraId)220 bool MpiDeviceManager::CheckCameraIdList(CameraId cameraId)
221 {
222     if (hardwareList_.empty()) {
223         return false;
224     }
225     for (auto iter = hardwareList_.cbegin(); iter != hardwareList_.cend(); iter++) {
226         if ((*iter).cameraId == cameraId) {
227             return true;
228         }
229     }
230     return false;
231 }
232 
CheckManagerList(ManagerId managerId)233 bool MpiDeviceManager::CheckManagerList(ManagerId managerId)
234 {
235     if (managerList_.size() == 0) {
236         return false;
237     }
238     for (auto it = managerList_.cbegin(); it != managerList_.cend(); it++) {
239         if ((*it)->GetManagerId() == managerId) {
240             return true;
241         }
242     }
243     return false;
244 }
245 
CheckControllerId(std::string controllerName)246 ControllerId MpiDeviceManager::CheckControllerId(std::string controllerName)
247 {
248     if (controllerName.find("vi") != controllerName.npos && GetController(DM_M_VI, DM_C_VI) != nullptr) {
249         return DM_C_VI;
250     }
251     if (controllerName.find("vo") != controllerName.npos && GetController(DM_M_VO, DM_C_VO) != nullptr) {
252         return DM_C_VO;
253     }
254     if (controllerName.find("vpss") != controllerName.npos && GetController(DM_M_VPSS, DM_C_VPSS) != nullptr) {
255         return DM_C_VPSS;
256     }
257     if (controllerName.find("venc") != controllerName.npos && GetController(DM_M_VENC, DM_C_VENC) != nullptr) {
258         return DM_C_VENC;
259     }
260     return DM_C_MAX;
261 }
262 
Connect(std::string controller,std::string portNum,std::string connectController,std::string connectPortNum)263 RetCode MpiDeviceManager::Connect(std::string controller,
264                                   std::string portNum,
265                                   std::string connectController,
266                                   std::string connectPortNum)
267 {
268     ControllerId controllerId = CheckControllerId(controller);
269     int32_t port = CheckNodePortNum(portNum);
270     ControllerId connectControllerId = CheckControllerId(connectController);
271     int32_t connectPort = CheckNodePortNum(connectPortNum);
272     if (controllerId == DM_C_MAX || connectControllerId == DM_C_MAX) {
273         CAMERA_LOGW("controller is not hardware device");
274         return RC_OK;
275     }
276     RetCode rc = RC_ERROR;
277     constexpr uint32_t coefficient = 2;
278     switch (static_cast<uint32_t>(controllerId) << (coefficient + connectControllerId)) {
279         case DM_C_VI << (coefficient + DM_C_VPSS): {
280             std::shared_ptr<VpssController> vpss =
281                 std::static_pointer_cast<VpssController>(GetController(DM_M_VPSS,
282                                                                        DM_C_VPSS));
283             if (vpss != nullptr) {
284                 if (vpss->GetStartVpssState() != true) {
285                     CHECK_IF_EQUAL_RETURN_VALUE(StartNode(DM_C_VPSS), RC_ERROR, RC_ERROR);
286                 }
287                 sysObject_->ViBindVpss(port, port, connectPort, connectPort);
288                 rc = RC_OK;
289             }
290             break;
291         }
292         case DM_C_VI << (coefficient + DM_C_VO): {
293             std::shared_ptr<VoController> vo = std::static_pointer_cast<VoController>(GetController(DM_M_VO, DM_C_VO));
294             if (vo != nullptr) {
295                 if (vo->GetStartVoState() != true) {
296                     CHECK_IF_EQUAL_RETURN_VALUE(StartNode(DM_C_VO), RC_ERROR, RC_ERROR);
297                 }
298                 rc = RC_OK;
299             }
300             break;
301         }
302         case DM_C_VI << (coefficient + DM_C_VENC): {
303             std::shared_ptr<VencController> venc =
304                 std::static_pointer_cast<VencController>(GetController(DM_M_VENC,
305                                                                        DM_C_VENC));
306             if (venc != nullptr) {
307                 if (venc->GetStartVencState() != true) {
308                     CHECK_IF_EQUAL_RETURN_VALUE(StartNode(DM_C_VENC), RC_ERROR, RC_ERROR);
309                 }
310                 rc = RC_OK;
311             }
312             break;
313         }
314         case DM_C_VPSS << (coefficient + DM_C_VO): {
315             std::shared_ptr<VoController> vo = std::static_pointer_cast<VoController>(GetController(DM_M_VO, DM_C_VO));
316             if (vo != nullptr) {
317                 if (vo->GetStartVoState() != true) {
318                     CHECK_IF_EQUAL_RETURN_VALUE(StartNode(DM_C_VO), RC_ERROR, RC_ERROR);
319                 }
320                 sysObject_->VpssBindVo(port, port, connectPort, connectPort);
321                 rc = RC_OK;
322             }
323             break;
324         }
325         case DM_C_VPSS << (coefficient + DM_C_VENC): {
326             std::shared_ptr<VencController> venc =
327                 std::static_pointer_cast<VencController>(GetController(DM_M_VENC,
328                                                                        DM_C_VENC));
329             if (venc != nullptr) {
330                 if ((std::static_pointer_cast<VencController>(GetController(DM_M_VENC,
331                     DM_C_VENC)))->GetStartVencState() != true) {
332                     CHECK_IF_EQUAL_RETURN_VALUE(StartNode(DM_C_VENC), RC_ERROR, RC_ERROR);
333                 }
334                 rc = RC_OK;
335             }
336             break;
337         }
338         default: {
339             return RC_ERROR;
340         }
341     }
342     return rc;
343 }
344 
UnConnect(std::string controller,std::string portNum,std::string connectController,std::string connectPortNum)345 RetCode MpiDeviceManager::UnConnect(std::string controller,
346                                     std::string portNum,
347                                     std::string connectController,
348                                     std::string connectPortNum)
349 {
350     ControllerId unControllerId = CheckControllerId(controller);
351     int32_t unPort = CheckNodePortNum(portNum);
352     ControllerId unConnectControllerId = CheckControllerId(connectController);
353     int32_t unConnectPort = CheckNodePortNum(connectPortNum);
354     if (unControllerId == DM_C_MAX || unConnectControllerId == DM_C_MAX) {
355         CAMERA_LOGW("controller is not hardware device");
356         return RC_OK;
357     }
358     RetCode rc = RC_ERROR;
359     constexpr uint32_t unCoefficient = 2;
360     switch (static_cast<uint32_t>(unControllerId) << (unCoefficient + unConnectControllerId)) {
361         case DM_C_VI << (unCoefficient + DM_C_VPSS): {
362             sysObject_->ViUnBindVpss(unPort, unPort, unConnectPort, unConnectPort);
363             rc = RC_OK;
364             break;
365         }
366         case DM_C_VI << (unCoefficient + DM_C_VO): {
367             rc = RC_OK;
368             break;
369         }
370         case DM_C_VI << (unCoefficient + DM_C_VENC): {
371             rc = RC_OK;
372             break;
373         }
374         case DM_C_VPSS << (unCoefficient + DM_C_VO): {
375             sysObject_->VpssUnBindVo(unPort, unPort, unConnectPort, unConnectPort);
376             rc = RC_OK;
377             break;
378         }
379         case DM_C_VPSS << (unCoefficient + DM_C_VENC): {
380             rc = RC_OK;
381             break;
382         }
383         default: {
384             return RC_ERROR;
385         }
386     }
387     return rc;
388 }
389 
StartNode(ControllerId controllerId)390 RetCode MpiDeviceManager::StartNode(ControllerId controllerId)
391 {
392     RetCode rc = RC_OK;
393     switch (controllerId) {
394         case DM_C_VI: {
395             rc = std::static_pointer_cast<ViController>(GetController(DM_M_VI, DM_C_VI))->ConfigVi();
396             if (rc == RC_ERROR) {
397                 return rc;
398             }
399             rc = std::static_pointer_cast<ViController>(GetController(DM_M_VI, DM_C_VI))->StartVi();
400             if (rc == RC_ERROR) {
401                 return rc;
402             }
403             break;
404         }
405         case DM_C_VO: {
406             rc = std::static_pointer_cast<VoController>(GetController(DM_M_VO, DM_C_VO))->ConfigVo();
407             if (rc == RC_ERROR) {
408                 return rc;
409             }
410             rc = std::static_pointer_cast<VoController>(GetController(DM_M_VO, DM_C_VO))->StartVo();
411             if (rc == RC_ERROR) {
412                 return rc;
413             }
414             break;
415         }
416         case DM_C_VPSS: {
417             rc = std::static_pointer_cast<VpssController>(GetController(DM_M_VPSS, DM_C_VPSS))->ConfigVpss();
418             if (rc == RC_ERROR) {
419                 return rc;
420             }
421             rc = std::static_pointer_cast<VpssController>(GetController(DM_M_VPSS, DM_C_VPSS))->StartVpss();
422             if (rc == RC_ERROR) {
423                 return rc;
424             }
425             break;
426         }
427         case DM_C_VENC: {
428             rc = std::static_pointer_cast<VencController>(GetController(DM_M_VENC, DM_C_VENC))->ConfigVenc();
429             if (rc == RC_ERROR) {
430                 return rc;
431             }
432             rc = std::static_pointer_cast<VencController>(GetController(DM_M_VENC, DM_C_VENC))->StartVenc();
433             if (rc == RC_ERROR) {
434                 return rc;
435             }
436             break;
437         }
438         default:
439             break;
440         }
441     return rc;
442 }
443 
CheckNodePortNum(std::string controllerName)444 int32_t MpiDeviceManager::CheckNodePortNum(std::string controllerName)
445 {
446     if (controllerName.length() == 0) {
447         CAMERA_LOGW("controllerName length is 0");
448         return 0;
449     }
450     std::string num = controllerName.substr((controllerName.find("#")) + 1);
451     if (num.length() == 0) {
452         CAMERA_LOGW("num length is 0");
453         return 0;
454     }
455 
456     return static_cast<int32_t>(strtol(num.c_str(), nullptr, 10)); // 10:decimal
457 }
458 
SetAbilityMetaDataTag(std::vector<int32_t> abilityMetaDataTag)459 void MpiDeviceManager::SetAbilityMetaDataTag(std::vector<int32_t> abilityMetaDataTag)
460 {
461     if (managerList_.size() != 0) {
462         for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
463             (*iter)->SetAbilityMetaDataTag(abilityMetaDataTag);
464         }
465     }
466 }
467 
GetAbilityMetaData(std::shared_ptr<CameraMetadata> meta,bool & sendFlag)468 RetCode MpiDeviceManager::GetAbilityMetaData(std::shared_ptr<CameraMetadata> meta, bool &sendFlag)
469 {
470     if (managerList_.size() != 0) {
471         for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
472             RetCode rc = (*iter)->GetAbilityMetaData(meta);
473             if (rc == RC_ERROR) {
474                 CAMERA_LOGE("Get %{public}d AbilityMetaData fail", (*iter)->GetManagerId());
475                 return rc;
476             }
477             if ((*iter)->GetMetaDataFlag()) {
478                 sendFlag = true;
479                 (*iter)->SetMetaDataFlag(false);
480             }
481         }
482     }
483     return RC_OK;
484 }
485 
SetSendflag(bool flag)486 void MpiDeviceManager::SetSendflag(bool flag)
487 {
488     metaSendflag_ = flag;
489 }
490 
BufferCallback(std::shared_ptr<FrameSpec> buffer)491 void MpiDeviceManager::BufferCallback(std::shared_ptr<FrameSpec> buffer)
492 {
493     CAMERA_LOGE("MpiDeviceManager::BufferCallback %{public}p enter", &nodeBufferCb_);
494     nodeBufferCb_(buffer);
495 
496     const int ENTRY_CAPACITY = 30;
497     const int DATA_CAPACITY = 2000;
498     std::shared_ptr<CameraMetadata> meta =
499         std::make_shared<CameraMetadata>(ENTRY_CAPACITY, DATA_CAPACITY);
500     RetCode rc;
501     bool sendFlag = metaSendflag_;
502     rc = GetAbilityMetaData(meta, sendFlag);
503     if (rc == RC_OK && sendFlag == true) {
504         metaDataCb_(meta);
505     } else {
506         if (rc == RC_ERROR) {
507             CAMERA_LOGE("GetAbilityMetaData error");
508         } else {
509             CAMERA_LOGI("no send");
510         }
511     }
512 
513     CAMERA_LOGE("MpiDeviceManager::BufferCallback exit");
514 }
515 
SendFrameBuffer(std::shared_ptr<FrameSpec> buffer,CameraId cameraId)516 RetCode MpiDeviceManager::SendFrameBuffer(std::shared_ptr<FrameSpec> buffer, CameraId cameraId)
517 {
518     (void)cameraId;
519     return sysObject_->RequestBuffer(buffer);
520 }
521 
SetNodeCallBack(const NodeBufferCb cb,CameraId cameraId)522 void MpiDeviceManager::SetNodeCallBack(const NodeBufferCb cb, CameraId cameraId)
523 {
524     CAMERA_LOGI("entry");
525     (void)cameraId;
526     nodeBufferCb_ = cb;
527     sysObject_->SetCallback([&](std::shared_ptr<FrameSpec> buffer) {
528         BufferCallback(buffer);
529     });
530     sysObject_->SetDevStatusCallback([&]() {
531         deviceStatusCb_();
532     });
533 }
534 
Configure(std::shared_ptr<CameraMetadata> meta)535 void MpiDeviceManager::Configure(std::shared_ptr<CameraMetadata> meta)
536 {
537     if (managerList_.size() != 0) {
538         for (auto iter = managerList_.cbegin(); iter != managerList_.cend(); iter++) {
539             (*iter)->Configure(meta);
540         }
541     }
542 }
543 
SetMetaDataCallBack(const MetaDataCb cb,CameraId cameraId)544 void MpiDeviceManager::SetMetaDataCallBack(const MetaDataCb cb, CameraId cameraId)
545 {
546     (void)cameraId;
547     metaDataCb_ = cb;
548 }
549 
SetDevStatusCallBack(const DeviceStatusCb cb)550 void MpiDeviceManager::SetDevStatusCallBack(const DeviceStatusCb cb)
551 {
552     deviceStatusCb_ = cb;
553 }
554 
SetFlashlight(FlashMode flashMode,bool enable,CameraId cameraId)555 RetCode MpiDeviceManager::SetFlashlight(FlashMode flashMode, bool enable, CameraId cameraId)
556 {
557     (void)cameraId;
558     return std::static_pointer_cast<ViController>(GetController(DM_M_VI, DM_C_VI))->SetFlashlight(flashMode, enable);
559 }
560 
PreConfig(const ModeMeta & meta,const std::vector<DeviceStreamSetting> & settings)561 RetCode MpiDeviceManager::PreConfig(const ModeMeta& meta, const std::vector<DeviceStreamSetting>& settings)
562 {
563     return sysObject_->PreConfig(meta, settings);
564 }
565 
Flush(int32_t streamId)566 RetCode MpiDeviceManager::Flush(int32_t streamId)
567 {
568     return sysObject_->Flush(streamId);
569 }
570 
StartRecvFrame(int32_t streamId)571 RetCode MpiDeviceManager::StartRecvFrame(int32_t streamId)
572 {
573     return sysObject_->StartRecvFrame(streamId);
574 }
575 
StopRecvFrame(int32_t streamId)576 RetCode MpiDeviceManager::StopRecvFrame(int32_t streamId)
577 {
578     return sysObject_->StopRecvFrame(streamId);
579 }
580 } // namespace Camera
581 } // namespace OHOS
582