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
16 #include "camera_server.h"
17 #include <cstdio>
18 #include <list>
19 #include <string>
20 #include "camera_device.h"
21 #include "camera_service.h"
22 #include "camera_type.h"
23 #include "media_log.h"
24 #include "meta_data.h"
25 #include "surface.h"
26 #include "surface_impl.h"
27 #include "rpc_errno.h"
28
29 using namespace std;
30 namespace OHOS {
31 namespace Media {
GetInstance()32 CameraServer *CameraServer::GetInstance()
33 {
34 static CameraServer server;
35 return &server;
36 }
37
CameraServerRequestHandle(int funcId,void * origin,IpcIo * req,IpcIo * reply)38 void CameraServer::CameraServerRequestHandle(int funcId, void *origin, IpcIo *req, IpcIo *reply)
39 {
40 switch (funcId) {
41 case CAMERA_SERVER_GET_CAMERA_ABILITY:
42 CameraServer::GetInstance()->GetCameraAbility(req, reply);
43 break;
44 case CAMERA_SERVER_GET_CAMERA_INFO:
45 CameraServer::GetInstance()->GetCameraInfo(req, reply);
46 break;
47 case CAMERA_SERVER_GET_CAMERAIDLIST:
48 CameraServer::GetInstance()->GetCameraIdList(req, reply);
49 break;
50 case CAMERA_SERVER_CREATE_CAMERA:
51 CameraServer::GetInstance()->CreateCamera(req, reply);
52 break;
53 case CAMERA_SERVER_CLOSE_CAMERA:
54 CameraServer::GetInstance()->CloseCamera(req, reply);
55 break;
56 case CAMERA_SERVER_SET_CAMERA_CONFIG:
57 CameraServer::GetInstance()->SetCameraConfig(req, reply);
58 break;
59 case CAMERA_SERVER_TRIGGER_LOOPING_CAPTURE:
60 CameraServer::GetInstance()->TriggerLoopingCapture(req, reply);
61 break;
62 case CAMERA_SERVER_STOP_LOOPING_CAPTURE:
63 CameraServer::GetInstance()->StopLoopingCapture(req, reply);
64 break;
65 case CAMERA_SERVER_TRIGGER_SINGLE_CAPTURE:
66 CameraServer::GetInstance()->TriggerSingleCapture(req, reply);
67 break;
68 case CAMERA_SERVER_SET_CAMERA_CALLBACK:
69 CameraServer::GetInstance()->SetCameraCallback(req, reply);
70 break;
71 case CAMERA_SERVER_SET_CAMERA_MODE_NUM:
72 CameraServer::GetInstance()->SetCameraMode(req, reply);
73 break;
74 case CAMERA_SERVER_GET_CAMERA_MODE_NUM:
75 CameraServer::GetInstance()->GetCameraModeNum(req, reply);
76 break;
77 default:
78 MEDIA_ERR_LOG("code not support:%d!", funcId);
79 break;
80 }
81 }
InitCameraServer()82 void CameraServer::InitCameraServer()
83 {
84 CameraService *service = CameraService::GetInstance();
85 service->Initialize();
86 }
87
GetCameraAbility(IpcIo * req,IpcIo * reply)88 void CameraServer::GetCameraAbility(IpcIo *req, IpcIo *reply)
89 {
90 size_t sz;
91 string cameraId((const char*)(ReadString(req, &sz)));
92 CameraAbility *ability = CameraService::GetInstance()->GetCameraAbility(cameraId);
93 if (ability == nullptr) {
94 return;
95 }
96 list<CameraPicSize> supportSizeList = ability->GetSupportedSizes(CAM_FORMAT_YVU420);
97 uint32_t supportProperties = 0;
98 WriteUint32(reply, supportProperties);
99 uint32_t listSize = supportSizeList.size();
100 WriteUint32(reply, listSize);
101 for (auto supportSizeItem : supportSizeList) {
102 bool ret = WriteRawData(reply, &supportSizeItem, sizeof(CameraPicSize));
103 if (!ret) {
104 return;
105 }
106 }
107 // af
108 list<int32_t> afModeList = ability->GetSupportedAfModes();
109 uint32_t afListSize = afModeList.size();
110 WriteUint32(reply, afListSize);
111 for (auto supportAfMode : afModeList) {
112 WriteInt32(reply, supportAfMode);
113 }
114 // ae
115 list<int32_t> aeModeList = ability->GetSupportedAeModes();
116 uint32_t aeListSize = aeModeList.size();
117 WriteUint32(reply, aeListSize);
118 for (auto supportAeMode : aeModeList) {
119 WriteInt32(reply, supportAeMode);
120 }
121 }
122
GetCameraInfo(IpcIo * req,IpcIo * reply)123 void CameraServer::GetCameraInfo(IpcIo *req, IpcIo *reply)
124 {
125 size_t sz;
126 string cameraId((const char*)(ReadString(req, &sz)));
127 CameraInfo *info = CameraService::GetInstance()->GetCameraInfo(cameraId);
128 if (info == nullptr) {
129 return;
130 }
131 WriteInt32(reply, info->GetCameraType());
132 WriteInt32(reply, info->GetCameraFacingType());
133 }
134
GetCameraIdList(IpcIo * req,IpcIo * reply)135 void CameraServer::GetCameraIdList(IpcIo *req, IpcIo *reply)
136 {
137 list<string> cameraIdList = CameraService::GetInstance()->GetCameraIdList();
138 WriteUint32(reply, cameraIdList.size());
139 for (string cameraId : cameraIdList) {
140 WriteString(reply, cameraId.c_str());
141 }
142 }
143
GetCameraModeNum(IpcIo * req,IpcIo * reply)144 void CameraServer::GetCameraModeNum(IpcIo *req, IpcIo *reply)
145 {
146 uint8_t num = CameraService::GetInstance()->GetCameraModeNum();
147 WriteUint8(reply, num);
148 }
149
CreateCamera(IpcIo * req,IpcIo * reply)150 void CameraServer::CreateCamera(IpcIo *req, IpcIo *reply)
151 {
152 size_t sz;
153 string cameraId((const char*)(ReadString(req, &sz)));
154 int32_t cameraStatus = CameraService::GetInstance()->CreateCamera(cameraId);
155 SvcIdentity sid;
156 bool ret = ReadRemoteObject(req, &sid);
157 if (!ret) {
158 MEDIA_ERR_LOG("sid is null, failed.");
159 return;
160 }
161 OnCameraStatusChange(cameraStatus, &sid);
162 }
163
CloseCamera(IpcIo * req,IpcIo * reply)164 void CameraServer::CloseCamera(IpcIo *req, IpcIo *reply)
165 {
166 size_t sz;
167 string cameraId((const char*)(ReadString(req, &sz)));
168 int32_t cameraStatus = CameraService::GetInstance()->CloseCamera(cameraId);
169 SvcIdentity sid;
170 bool ret = ReadRemoteObject(req, &sid);
171 if (!ret) {
172 MEDIA_ERR_LOG("sid is null, failed.");
173 return;
174 }
175 OnCameraStatusChange(cameraStatus, &sid);
176 }
177
SetCameraConfig(IpcIo * req,IpcIo * reply)178 void CameraServer::SetCameraConfig(IpcIo *req, IpcIo *reply)
179 {
180 size_t sz;
181 string cameraId((const char*)(ReadString(req, &sz)));
182 CameraDevice *device_ = CameraService::GetInstance()->GetCameraDevice(cameraId);
183 int32_t setStatus = device_->SetCameraConfig();
184 WriteInt32(reply, setStatus);
185 OnCameraConfigured(setStatus);
186 }
187
SetCameraCallback(IpcIo * req,IpcIo * reply)188 void CameraServer::SetCameraCallback(IpcIo *req, IpcIo *reply)
189 {
190 SvcIdentity sid;
191 bool ret = ReadRemoteObject(req, &sid);
192 if (!ret) {
193 MEDIA_ERR_LOG("sid is null, failed.");
194 return;
195 }
196 sid_ = sid;
197 }
198
DeserializeFrameConfig(IpcIo & io)199 FrameConfig *DeserializeFrameConfig(IpcIo &io)
200 {
201 int32_t type;
202 ReadInt32(&io, &type);
203 auto fc = new FrameConfig(type);
204
205 uint32_t surfaceNum;
206 ReadUint32(&io, &surfaceNum);
207 for (uint32_t i = 0; i < surfaceNum; i++) {
208 Surface *surface = SurfaceImpl::GenericSurfaceByIpcIo(io);
209 if (surface == nullptr) {
210 MEDIA_ERR_LOG("Camera server receive null surface.");
211 delete fc;
212 return nullptr;
213 }
214 fc->AddSurface(*surface);
215 }
216
217 int32_t qfactor;
218 ReadInt32(&io, &qfactor);
219 if (qfactor >= 0) {
220 fc->SetParameter(PARAM_KEY_IMAGE_ENCODE_QFACTOR, qfactor);
221 }
222 int32_t streamFps = 0;
223 ReadInt32(&io, &streamFps);
224 fc->SetParameter(CAM_FRAME_FPS, streamFps);
225 int32_t invertMode = 0;
226 ReadInt32(&io, &invertMode);
227 fc->SetParameter(CAM_IMAGE_INVERT_MODE, invertMode);
228 CameraRect streamCrop;
229 ReadInt32(&io, &streamCrop.x);
230 ReadInt32(&io, &streamCrop.y);
231 ReadInt32(&io, &streamCrop.w);
232 ReadInt32(&io, &streamCrop.h);
233 fc->SetParameter(CAM_IMAGE_CROP_RECT, streamCrop);
234 int32_t streamFormat;
235 ReadInt32(&io, &streamFormat);
236 fc->SetParameter(CAM_IMAGE_FORMAT, streamFormat);
237 MEDIA_INFO_LOG("streamFormat is %d", streamFormat);
238
239 if (type != FRAME_CONFIG_RECORD) {
240 uint32_t len;
241 ReadUint32(&io, &len);
242 uint8_t *dataBuff = (uint8_t *)ReadBuffer(&io, len);
243 fc->SetVendorParameter(dataBuff, len);
244 }
245 return fc;
246 }
247
SetFrameConfig(IpcIo * req,IpcIo * reply)248 void CameraServer::SetFrameConfig(IpcIo *req, IpcIo *reply)
249 {
250 size_t sz;
251 ReadString(req, &sz);
252 int32_t streamId;
253 ReadInt32(req, &streamId);
254 MEDIA_ERR_LOG("SetFrameConfig streamId(%d).", streamId);
255 FrameConfig *fc = DeserializeFrameConfig(*req);
256 if (fc == nullptr) {
257 MEDIA_ERR_LOG("Deserialize frame config failed.");
258 return;
259 }
260 delete fc;
261 }
262
263
TriggerLoopingCapture(IpcIo * req,IpcIo * reply)264 void CameraServer::TriggerLoopingCapture(IpcIo *req, IpcIo *reply)
265 {
266 size_t sz;
267 string cameraId((const char*)(ReadString(req, &sz)));
268 CameraDevice *device_ = CameraService::GetInstance()->GetCameraDevice(cameraId);
269 FrameConfig *fc = DeserializeFrameConfig(*req);
270 if (fc == nullptr) {
271 MEDIA_ERR_LOG("Deserialize frame config failed.");
272 return;
273 }
274 uint32_t streamId = 0;
275 int32_t loopingCaptureStatus = device_->TriggerLoopingCapture(*fc, &streamId);
276 OnTriggerLoopingCaptureFinished(loopingCaptureStatus, streamId);
277 delete fc;
278 }
279
TriggerSingleCapture(IpcIo * req,IpcIo * reply)280 void CameraServer::TriggerSingleCapture(IpcIo *req, IpcIo *reply)
281 {
282 size_t sz;
283 string cameraId((const char *)(ReadString(req, &sz)));
284 CameraDevice *device_ = CameraService::GetInstance()->GetCameraDevice(cameraId);
285 FrameConfig *fc = DeserializeFrameConfig(*req);
286 if (fc == nullptr) {
287 MEDIA_ERR_LOG("Deserialize frame config failed.");
288 return;
289 }
290 uint32_t streamId = 0;
291 int32_t singleCaptureStatus = device_->TriggerSingleCapture(*fc, &streamId);
292 OnTriggerSingleCaptureFinished(singleCaptureStatus);
293 delete fc;
294 }
295
StopLoopingCapture(IpcIo * req,IpcIo * reply)296 void CameraServer::StopLoopingCapture(IpcIo *req, IpcIo *reply)
297 {
298 size_t sz;
299 string cameraId((const char *)(ReadString(req, &sz)));
300 CameraDevice *device_ = CameraService::GetInstance()->GetCameraDevice(cameraId);
301 if (device_ == nullptr) {
302 MEDIA_INFO_LOG("device_ is null in camera_server.cpp!");
303 return;
304 }
305
306 int32_t type;
307 ReadInt32(req, &type);
308 device_->StopLoopingCapture(type);
309 }
310
OnCameraStatusChange(int32_t ret,SvcIdentity * sid)311 void CameraServer::OnCameraStatusChange(int32_t ret, SvcIdentity *sid)
312 {
313 IpcIo io;
314 uint8_t tmpData[DEFAULT_IPC_SIZE];
315 IpcIoInit(&io, tmpData, DEFAULT_IPC_SIZE, 0);
316 WriteInt32(&io, ret);
317 MessageOption option;
318 MessageOptionInit(&option);
319 option.flags = TF_OP_ASYNC;
320 int32_t result = SendRequest(*sid, ON_CAMERA_STATUS_CHANGE, &io, nullptr, option, nullptr);
321 if (result != ERR_NONE) {
322 MEDIA_ERR_LOG("Create camera callback : on camera status change failed.");
323 }
324 }
325
OnTriggerSingleCaptureFinished(int32_t ret)326 void CameraServer::OnTriggerSingleCaptureFinished(int32_t ret)
327 {
328 IpcIo io;
329 uint8_t tmpData[DEFAULT_IPC_SIZE];
330 IpcIoInit(&io, tmpData, DEFAULT_IPC_SIZE, 0);
331 WriteInt32(&io, ret);
332 MessageOption option;
333 MessageOptionInit(&option);
334 option.flags = TF_OP_ASYNC;
335 int32_t result = SendRequest(sid_, ON_TRIGGER_SINGLE_CAPTURE_FINISHED, &io, nullptr, option, nullptr);
336 if (result != ERR_NONE) {
337 MEDIA_ERR_LOG("Trigger single capture callback : on trigger single capture frame finished failed.");
338 return;
339 }
340 }
341
OnTriggerLoopingCaptureFinished(int32_t ret,int32_t streamId)342 void CameraServer::OnTriggerLoopingCaptureFinished(int32_t ret, int32_t streamId)
343 {
344 IpcIo io;
345 uint8_t tmpData[DEFAULT_IPC_SIZE];
346 IpcIoInit(&io, tmpData, DEFAULT_IPC_SIZE, 0);
347 WriteInt32(&io, ret);
348 MessageOption option;
349 MessageOptionInit(&option);
350 option.flags = TF_OP_ASYNC;
351 int32_t result = SendRequest(sid_, ON_TRIGGER_LOOPING_CAPTURE_FINISHED, &io, nullptr, option, nullptr);
352 if (result != ERR_NONE) {
353 MEDIA_ERR_LOG("Trigger looping capture callback : on trigger looping capture finished failed.");
354 }
355 }
356
OnCameraConfigured(int32_t ret)357 void CameraServer::OnCameraConfigured(int32_t ret)
358 {
359 IpcIo io;
360 uint8_t tmpData[DEFAULT_IPC_SIZE];
361 IpcIoInit(&io, tmpData, DEFAULT_IPC_SIZE, 0);
362 WriteInt32(&io, ret);
363 MessageOption option;
364 MessageOptionInit(&option);
365 option.flags = TF_OP_ASYNC;
366 int32_t result = SendRequest(sid_, ON_CAMERA_CONFIGURED, &io, nullptr, option, nullptr);
367 if (result != ERR_NONE) {
368 MEDIA_ERR_LOG("Camera config callback : on trigger looping capture finished failed.");
369 }
370 }
371
SetCameraMode(IpcIo * req,IpcIo * reply)372 void CameraServer::SetCameraMode(IpcIo *req, IpcIo *reply)
373 {
374 uint8_t modeIndex;
375 ReadUint8(req, &modeIndex);
376 int32_t cameraStatus = CameraService::GetInstance()->SetCameraMode(modeIndex);
377 WriteInt32(reply, cameraStatus);
378 }
379 } // namespace Media
380 } // namespace OHOS