10a5c7a17Sopenharmony_ci/* 20a5c7a17Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 30a5c7a17Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40a5c7a17Sopenharmony_ci * you may not use this file except in compliance with the License. 50a5c7a17Sopenharmony_ci * You may obtain a copy of the License at 60a5c7a17Sopenharmony_ci * 70a5c7a17Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80a5c7a17Sopenharmony_ci * 90a5c7a17Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100a5c7a17Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110a5c7a17Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120a5c7a17Sopenharmony_ci * See the License for the specific language governing permissions and 130a5c7a17Sopenharmony_ci * limitations under the License. 140a5c7a17Sopenharmony_ci */ 150a5c7a17Sopenharmony_ci#include "camera_manager.h" 160a5c7a17Sopenharmony_ci#include "camera_impl.h" 170a5c7a17Sopenharmony_ci#include "camera_service_client.h" 180a5c7a17Sopenharmony_ci#include "camera_service_callback.h" 190a5c7a17Sopenharmony_ci#include "media_log.h" 200a5c7a17Sopenharmony_ci 210a5c7a17Sopenharmony_ci#include <cstdio> 220a5c7a17Sopenharmony_ci#include <map> 230a5c7a17Sopenharmony_ci 240a5c7a17Sopenharmony_ciusing namespace std; 250a5c7a17Sopenharmony_cinamespace OHOS { 260a5c7a17Sopenharmony_cinamespace Media { 270a5c7a17Sopenharmony_ciclass CameraManagerImpl : public CameraManager, public CameraServiceCallback { 280a5c7a17Sopenharmony_cipublic: 290a5c7a17Sopenharmony_ci CameraManagerImpl() 300a5c7a17Sopenharmony_ci { 310a5c7a17Sopenharmony_ci cameraServiceClient_ = CameraServiceClient::GetInstance(); 320a5c7a17Sopenharmony_ci cameraServiceClient_->InitCameraServiceClient(this); 330a5c7a17Sopenharmony_ci } 340a5c7a17Sopenharmony_ci ~CameraManagerImpl() 350a5c7a17Sopenharmony_ci { 360a5c7a17Sopenharmony_ci for (const auto &i : cameraMapCache_) { 370a5c7a17Sopenharmony_ci delete i.second; 380a5c7a17Sopenharmony_ci } 390a5c7a17Sopenharmony_ci } 400a5c7a17Sopenharmony_ci 410a5c7a17Sopenharmony_ci void OnCameraServiceInitialized(list<string> &availCameraIdList) override 420a5c7a17Sopenharmony_ci { 430a5c7a17Sopenharmony_ci /* cameraService_ cannot be nullptr as OnCameraServiceInitialized is a callback of cameraService_ */ 440a5c7a17Sopenharmony_ci for (auto &cameraId : availCameraIdList) { 450a5c7a17Sopenharmony_ci InitCameraAbility(cameraId); 460a5c7a17Sopenharmony_ci } 470a5c7a17Sopenharmony_ci } 480a5c7a17Sopenharmony_ci 490a5c7a17Sopenharmony_ci void OnCameraStatusChange(string &cameraId, CameraStatus status) override 500a5c7a17Sopenharmony_ci { 510a5c7a17Sopenharmony_ci auto p = cameraMapCache_.find(cameraId); 520a5c7a17Sopenharmony_ci switch (status) { 530a5c7a17Sopenharmony_ci case CAMERA_STATUS_UNAVAIL: 540a5c7a17Sopenharmony_ci if (p != cameraMapCache_.end()) { 550a5c7a17Sopenharmony_ci for (auto &i : deviceCbList_) { 560a5c7a17Sopenharmony_ci i.second->Post( 570a5c7a17Sopenharmony_ci [i, cameraId]() { i.first->OnCameraStatus(cameraId, CAMERA_DEVICE_STATE_UNAVAILABLE); }); 580a5c7a17Sopenharmony_ci } 590a5c7a17Sopenharmony_ci // User may still using icamera now 600a5c7a17Sopenharmony_ci delete p->second; 610a5c7a17Sopenharmony_ci cameraMapCache_.erase(p); 620a5c7a17Sopenharmony_ci } 630a5c7a17Sopenharmony_ci break; 640a5c7a17Sopenharmony_ci case CAMERA_STATUS_AVAIL: 650a5c7a17Sopenharmony_ci InitCameraAbility(cameraId); 660a5c7a17Sopenharmony_ci if (p == cameraMapCache_.end()) { 670a5c7a17Sopenharmony_ci for (auto &i : deviceCbList_) { 680a5c7a17Sopenharmony_ci i.second->Post( 690a5c7a17Sopenharmony_ci [i, cameraId]() { i.first->OnCameraStatus(cameraId, CAMERA_DEVICE_STATE_AVAILABLE); }); 700a5c7a17Sopenharmony_ci } 710a5c7a17Sopenharmony_ci } 720a5c7a17Sopenharmony_ci break; 730a5c7a17Sopenharmony_ci case CAMERA_STATUS_CREATED: 740a5c7a17Sopenharmony_ci if (p != cameraMapCache_.end()) { 750a5c7a17Sopenharmony_ci p->second->OnCreate(cameraId); 760a5c7a17Sopenharmony_ci } 770a5c7a17Sopenharmony_ci break; 780a5c7a17Sopenharmony_ci case CAMERA_STATUS_CREATE_FAILED: 790a5c7a17Sopenharmony_ci if (p != cameraMapCache_.end()) { 800a5c7a17Sopenharmony_ci p->second->OnCreateFailed(); 810a5c7a17Sopenharmony_ci } 820a5c7a17Sopenharmony_ci break; 830a5c7a17Sopenharmony_ci default: 840a5c7a17Sopenharmony_ci break; 850a5c7a17Sopenharmony_ci } 860a5c7a17Sopenharmony_ci } 870a5c7a17Sopenharmony_ci 880a5c7a17Sopenharmony_ci void RegisterCameraDeviceCallback(CameraDeviceCallback &callback, EventHandler &handler) override 890a5c7a17Sopenharmony_ci { 900a5c7a17Sopenharmony_ci deviceCbList_.emplace_back(make_pair(&callback, &handler)); 910a5c7a17Sopenharmony_ci for (const auto &i : cameraMapCache_) { 920a5c7a17Sopenharmony_ci string cameraId = i.first; 930a5c7a17Sopenharmony_ci handler.Post([&callback, cameraId]() { callback.OnCameraStatus(cameraId, CAMERA_DEVICE_STATE_AVAILABLE); }); 940a5c7a17Sopenharmony_ci } 950a5c7a17Sopenharmony_ci } 960a5c7a17Sopenharmony_ci 970a5c7a17Sopenharmony_ci void UnregisterCameraDeviceCallback(CameraDeviceCallback &callback) override 980a5c7a17Sopenharmony_ci { 990a5c7a17Sopenharmony_ci for (auto p = deviceCbList_.begin(); p != deviceCbList_.end(); p++) { 1000a5c7a17Sopenharmony_ci if (p->first == &callback) { 1010a5c7a17Sopenharmony_ci deviceCbList_.erase(p); 1020a5c7a17Sopenharmony_ci break; 1030a5c7a17Sopenharmony_ci } 1040a5c7a17Sopenharmony_ci } 1050a5c7a17Sopenharmony_ci } 1060a5c7a17Sopenharmony_ci 1070a5c7a17Sopenharmony_ci uint8_t GetCameraModeNum() override 1080a5c7a17Sopenharmony_ci { 1090a5c7a17Sopenharmony_ci return cameraServiceClient_->GetCameraModeNum(); 1100a5c7a17Sopenharmony_ci } 1110a5c7a17Sopenharmony_ci 1120a5c7a17Sopenharmony_ci int32_t SetCameraMode(uint8_t modeIndex) override 1130a5c7a17Sopenharmony_ci { 1140a5c7a17Sopenharmony_ci return cameraServiceClient_->SetCameraMode(modeIndex); 1150a5c7a17Sopenharmony_ci } 1160a5c7a17Sopenharmony_ci 1170a5c7a17Sopenharmony_ci list<string> GetCameraIds() override 1180a5c7a17Sopenharmony_ci { 1190a5c7a17Sopenharmony_ci list<string> cameraList; 1200a5c7a17Sopenharmony_ci for (auto &i : cameraMapCache_) { 1210a5c7a17Sopenharmony_ci MEDIA_DEBUG_LOG("%s", i.first.c_str()); 1220a5c7a17Sopenharmony_ci cameraList.emplace_back(i.first); 1230a5c7a17Sopenharmony_ci } 1240a5c7a17Sopenharmony_ci return cameraList; 1250a5c7a17Sopenharmony_ci } 1260a5c7a17Sopenharmony_ci 1270a5c7a17Sopenharmony_ci const CameraAbility *GetCameraAbility(const string &cameraId) override 1280a5c7a17Sopenharmony_ci { 1290a5c7a17Sopenharmony_ci auto camera = cameraMapCache_.find(cameraId); 1300a5c7a17Sopenharmony_ci if (camera == cameraMapCache_.end()) { 1310a5c7a17Sopenharmony_ci return nullptr; 1320a5c7a17Sopenharmony_ci } 1330a5c7a17Sopenharmony_ci return camera->second->GetAbility(); 1340a5c7a17Sopenharmony_ci } 1350a5c7a17Sopenharmony_ci 1360a5c7a17Sopenharmony_ci const CameraInfo *GetCameraInfo(const string &cameraId) override 1370a5c7a17Sopenharmony_ci { 1380a5c7a17Sopenharmony_ci auto camera = cameraMapCache_.find(cameraId); 1390a5c7a17Sopenharmony_ci if (camera == cameraMapCache_.end()) { 1400a5c7a17Sopenharmony_ci return nullptr; 1410a5c7a17Sopenharmony_ci } 1420a5c7a17Sopenharmony_ci return camera->second->GetInfo(); 1430a5c7a17Sopenharmony_ci } 1440a5c7a17Sopenharmony_ci 1450a5c7a17Sopenharmony_ci void CreateCamera(const string &cameraId, CameraStateCallback &callback, EventHandler &handler) override 1460a5c7a17Sopenharmony_ci { 1470a5c7a17Sopenharmony_ci auto p = cameraMapCache_.find(cameraId); 1480a5c7a17Sopenharmony_ci if (p == cameraMapCache_.end()) { 1490a5c7a17Sopenharmony_ci MEDIA_ERR_LOG("The cameraId %s is not available", cameraId.c_str()); 1500a5c7a17Sopenharmony_ci handler.Post([&callback, &cameraId] { callback.OnCreateFailed(cameraId, MEDIA_ERR); }); 1510a5c7a17Sopenharmony_ci return; 1520a5c7a17Sopenharmony_ci } 1530a5c7a17Sopenharmony_ci p->second->RegistCb(callback, handler); 1540a5c7a17Sopenharmony_ci cameraServiceClient_->CreateCamera(cameraId); 1550a5c7a17Sopenharmony_ci } 1560a5c7a17Sopenharmony_ciprivate: 1570a5c7a17Sopenharmony_ci CameraServiceClient *cameraServiceClient_; 1580a5c7a17Sopenharmony_ci map<string, CameraImpl *> cameraMapCache_; 1590a5c7a17Sopenharmony_ci list<pair<CameraDeviceCallback *, EventHandler *>> deviceCbList_; 1600a5c7a17Sopenharmony_ci 1610a5c7a17Sopenharmony_ci void InitCameraAbility(string &cameraId) 1620a5c7a17Sopenharmony_ci { 1630a5c7a17Sopenharmony_ci auto ability = cameraServiceClient_->GetCameraAbility(cameraId); 1640a5c7a17Sopenharmony_ci auto info = cameraServiceClient_->GetCameraInfo(cameraId); 1650a5c7a17Sopenharmony_ci CameraImpl *cam = new (nothrow) CameraImpl(cameraId, ability, info); 1660a5c7a17Sopenharmony_ci if (cam == nullptr) { 1670a5c7a17Sopenharmony_ci MEDIA_FATAL_LOG("New object failed."); 1680a5c7a17Sopenharmony_ci return; 1690a5c7a17Sopenharmony_ci } 1700a5c7a17Sopenharmony_ci cameraMapCache_[cameraId] = cam; 1710a5c7a17Sopenharmony_ci } 1720a5c7a17Sopenharmony_ci}; 1730a5c7a17Sopenharmony_ci 1740a5c7a17Sopenharmony_ciCameraManager *CameraManager::GetInstance() 1750a5c7a17Sopenharmony_ci{ 1760a5c7a17Sopenharmony_ci static CameraManagerImpl cameraManagerImpl; 1770a5c7a17Sopenharmony_ci return &cameraManagerImpl; 1780a5c7a17Sopenharmony_ci} 1790a5c7a17Sopenharmony_ci} // namespace Media 1800a5c7a17Sopenharmony_ci} // namespace OHOS 181