• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 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 #include "camera_service.h"
16 #include "hal_camera.h"
17 #include "media_log.h"
18 #include "codec_interface.h"
19 
20 using namespace std;
21 namespace OHOS {
22 namespace Media {
CameraService()23 CameraService::CameraService() {}
24 
~CameraService()25 CameraService::~CameraService()
26 {
27     int32_t ret = HalCameraDeinit();
28     if (ret != 0) {
29         MEDIA_ERR_LOG("HiCameraDeInit return failed ret(%d).", ret);
30     }
31 }
32 
GetInstance()33 CameraService *CameraService::GetInstance()
34 {
35     static CameraService instance;
36     return &instance;
37 }
38 
Initialize()39 void CameraService::Initialize()
40 {
41     int32_t ret = HalCameraInit();
42     if (ret != 0) {
43         MEDIA_ERR_LOG("HiCameraInit failed. ret(%d)", ret);
44     }
45 }
46 
GetCameraAbility(std::string & cameraId)47 CameraAbility *CameraService::GetCameraAbility(std::string &cameraId)
48 {
49     std::map<string, CameraAbility*>::iterator iter = deviceAbilityMap_.find(cameraId);
50     if (iter != deviceAbilityMap_.end()) {
51         return iter->second;
52     }
53     CameraAbility *ability = new (nothrow) CameraAbility;
54     if (ability == nullptr) {
55         return nullptr;
56     }
57     uint32_t streamCapNum;
58     StreamCap *streamCap = nullptr;
59     int32_t ret = HalCameraGetStreamCapNum(atoi(cameraId.c_str()), &streamCapNum);
60     streamCap = new StreamCap[streamCapNum];
61     for (int pos = 0; pos < streamCapNum; pos++) {
62         streamCap[pos].type = CAP_DESC_ENUM;
63     }
64     ret = HalCameraGetStreamCap(atoi(cameraId.c_str()), streamCap, streamCapNum);
65     list<CameraPicSize> range;
66     for (int pos = 0; pos < streamCapNum; pos++) {
67         CameraPicSize tmpSize = {.width = (uint32_t)streamCap[pos].u.formatEnum.width,
68             .height = (uint32_t)streamCap[pos].u.formatEnum.height};
69         range.emplace_back(tmpSize);
70     }
71     ability->SetParameterRange(CAM_FORMAT_YVU420, range);
72     ability->SetParameterRange(CAM_FORMAT_JPEG, range);
73     ability->SetParameterRange(CAM_FORMAT_H264, range);
74     ability->SetParameterRange(CAM_FORMAT_H265, range);
75     AbilityInfo cameraAbility = {};
76     HalCameraGetAbility(atoi(cameraId.c_str()), &cameraAbility);
77     list<int32_t> afModes;
78     for (int i = 0; i < cameraAbility.afModeNum; i++) {
79         afModes.emplace_back(cameraAbility.afModes[i]);
80     }
81     ability->SetParameterRange(CAM_AF_MODE, afModes);
82     list<int32_t> aeModes;
83     for (int i = 0; i < cameraAbility.aeModeNum; i++) {
84         aeModes.emplace_back(cameraAbility.aeModes[i]);
85     }
86     ability->SetParameterRange(CAM_AE_MODE, aeModes);
87     delete[] streamCap;
88     deviceAbilityMap_.insert(pair<string, CameraAbility*>(cameraId, ability));
89     return ability;
90 }
91 
GetCameraInfo(std::string & cameraId)92 CameraInfo *CameraService::GetCameraInfo(std::string &cameraId)
93 {
94     std::map<string, CameraInfo*>::iterator iter = deviceInfoMap_.find(cameraId);
95     if (iter != deviceInfoMap_.end()) {
96         return iter->second;
97     }
98     AbilityInfo deviceAbility;
99     int32_t ret = HalCameraGetAbility((uint32_t)std::atoi(cameraId.c_str()), &deviceAbility);
100     if (ret != MEDIA_OK) {
101         MEDIA_ERR_LOG("HalCameraGetAbility failed. ret(%d)", ret);
102         return nullptr;
103     }
104     CameraInfo *info = new (nothrow) CameraInfoImpl(deviceAbility.type, deviceAbility.orientation);
105     if (info == nullptr) {
106         return nullptr;
107     }
108     deviceInfoMap_.insert(pair<string, CameraInfo*>(cameraId, info));
109     return info;
110 }
111 
GetCameraDevice(std::string & cameraId)112 CameraDevice *CameraService::GetCameraDevice(std::string &cameraId)
113 {
114     std::map<string, CameraDevice*>::iterator iter = deviceMap_.find(cameraId);
115     if (iter != deviceMap_.end()) {
116         return iter->second;
117     }
118     return nullptr;
119 }
120 
GetCameraIdList()121 list<string> CameraService::GetCameraIdList()
122 {
123     uint8_t camNum = 0;
124     HalCameraGetDeviceNum(&camNum);
125     uint32_t *cameraList = new uint32_t[camNum];
126     HalCameraGetDeviceList(cameraList, camNum);
127     list<string> cameraStrList;
128     for (uint32_t pos = 0; pos < camNum; pos++) {
129         cameraStrList.push_back(to_string(cameraList[pos]));
130     }
131     delete[] cameraList;
132     return cameraStrList;
133 }
134 
GetCameraModeNum()135 uint8_t CameraService::GetCameraModeNum()
136 {
137     uint8_t num;
138     int32_t ret = HalCameraGetModeNum(&num);
139     if (ret == MEDIA_OK) {
140         return num;
141     }
142     return 0;
143 }
144 
CreateCamera(string cameraId)145 int32_t CameraService::CreateCamera(string cameraId)
146 {
147     int32_t ret = HalCameraDeviceOpen((uint32_t)std::atoi(cameraId.c_str()));
148     if (ret != 0) {
149         MEDIA_ERR_LOG("HalCameraDeviceOpen failed. ret(%d)", ret);
150         return CameraServiceCallback::CAMERA_STATUS_CREATE_FAILED;
151     }
152     CameraDevice *device = new (nothrow) CameraDevice((uint32_t)std::atoi(cameraId.c_str()));
153     if (device == nullptr) {
154         MEDIA_FATAL_LOG("New device object failed.");
155         return MEDIA_ERR;
156     }
157     if (device->Initialize() != MEDIA_OK) {
158         MEDIA_FATAL_LOG("device Initialize failed.");
159         delete device;
160         return MEDIA_ERR;
161     }
162     deviceMap_.insert(pair<string, CameraDevice*>(cameraId, device));
163     return CameraServiceCallback::CAMERA_STATUS_CREATED;
164 }
165 
CloseCamera(string cameraId)166 int32_t CameraService::CloseCamera(string cameraId)
167 {
168     CameraDevice *device = GetCameraDevice(cameraId);
169     if (device != NULL) {
170         device->StopLoopingCapture();
171         deviceMap_.erase(cameraId);
172     }
173     int32_t ret = HalCameraDeviceClose((uint32_t)std::atoi(cameraId.c_str()));
174     if (ret != 0) {
175         MEDIA_ERR_LOG("HalCameraDeviceClose failed. ret(%d)", ret);
176     }
177     return CameraServiceCallback::CAMERA_STATUS_CLOSE;
178 }
179 
SetCameraMode(uint8_t modeIndex)180 int32_t CameraService::SetCameraMode(uint8_t modeIndex)
181 {
182     CodecDeinit();
183     int32_t ret = HalCameraSetMode(modeIndex);
184     CodecInit();
185     return ret;
186 }
187 } // namespace Media
188 } // namespace OHOS