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